Skip to content

Commit b77643d

Browse files
wusslerlubux
authored andcommitted
Resign keys and relax flag requirements
1 parent 8186276 commit b77643d

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

openpgp/forwarding.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ func (e *Entity) NewForwardingEntity(
3333
now := config.Now()
3434
i := e.PrimaryIdentity()
3535
if e.PrimaryKey.KeyExpired(i.SelfSignature, now) || // primary key has expired
36-
i.SelfSignature == nil || // user ID has no self-signature
3736
i.SelfSignature.SigExpired(now) || // user ID self-signature has expired
3837
e.Revoked(now) || // primary key has been revoked
3938
i.Revoked(now) { // user ID has been revoked
@@ -70,8 +69,7 @@ func (e *Entity) NewForwardingEntity(
7069
// Handle all forwarder subkeys
7170
for _, forwarderSubKey := range e.Subkeys {
7271
// Filter flags
73-
if !forwarderSubKey.Sig.FlagsValid || forwarderSubKey.Sig.FlagCertify || forwarderSubKey.Sig.FlagSign ||
74-
forwarderSubKey.Sig.FlagAuthenticate || forwarderSubKey.Sig.FlagGroupKey {
72+
if !forwarderSubKey.PublicKey.PubKeyAlgo.CanEncrypt() {
7573
continue
7674
}
7775

@@ -152,6 +150,12 @@ func (e *Entity) NewForwardingEntity(
152150
// 0x40 - This key may be used for forwarded communications.
153151
forwardeeSubKey.Sig.FlagForward = true
154152

153+
// Re-sign subkey binding signature
154+
err = forwardeeSubKey.Sig.SignKey(forwardeeSubKey.PublicKey, forwardeeKey.PrivateKey, config)
155+
if err != nil {
156+
return nil, nil, err
157+
}
158+
155159
// Append each valid instance to the list
156160
instances = append(instances, instance)
157161
}

openpgp/forwarding_test.go

+22
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ func TestForwardingFull(t *testing.T) {
8383
t.Fatal(err)
8484
}
8585

86+
charlesEntity = serializeAndParseForwardeeKey(t, charlesEntity)
87+
8688
if len(instances) != 1 {
8789
t.Fatalf("invalid number of instances, expected 1 got %d", len(instances))
8890
}
@@ -147,6 +149,8 @@ func TestForwardingFull(t *testing.T) {
147149
t.Fatal(err)
148150
}
149151

152+
danielEntity = serializeAndParseForwardeeKey(t, danielEntity)
153+
150154
secondTransformed := transformTestMessage(t, transformed, secondForwardInstances[0])
151155

152156
// Decrypt forwarded message for Charles
@@ -203,3 +207,21 @@ Loop:
203207

204208
return transformed
205209
}
210+
211+
func serializeAndParseForwardeeKey(t *testing.T, key *Entity) *Entity {
212+
serializedEntity := bytes.NewBuffer(nil)
213+
err := key.SerializePrivateWithoutSigning(serializedEntity, nil)
214+
if err != nil {
215+
t.Fatalf("Error in serializing forwardee key: %s", err)
216+
}
217+
el, err := ReadKeyRing(serializedEntity)
218+
if err != nil {
219+
t.Fatalf("Error in reading forwardee key: %s", err)
220+
}
221+
222+
if len(el) != 1 {
223+
t.Fatalf("Wrong number of entities in parsing, expected 1, got %d", len(el))
224+
}
225+
226+
return el[0]
227+
}

0 commit comments

Comments
 (0)