Skip to content

Commit 8e272e7

Browse files
committed
Only check that message signatures are newer than the key
Don't check that binding signatures are newer than the primary key that created them, as some old keys generated by previous versions of OpenPGP.js fail this check.
1 parent cfbd6f6 commit 8e272e7

File tree

4 files changed

+11
-17
lines changed

4 files changed

+11
-17
lines changed

openpgp/v2/keys.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -676,7 +676,7 @@ func (e *Entity) LatestValidDirectSignature(date time.Time, config *packet.Confi
676676
if sig.Valid == nil {
677677
err := e.PrimaryKey.VerifyDirectKeySignature(sig.Packet)
678678
if err == nil {
679-
err = checkSignatureDetails(e.PrimaryKey, sig.Packet, date, config)
679+
err = checkSignatureDetails(sig.Packet, date, config)
680680
}
681681
valid := err == nil
682682
sig.Valid = &valid

openpgp/v2/read.go

+7-13
Original file line numberDiff line numberDiff line change
@@ -732,19 +732,14 @@ func verifyDetachedSignatureReader(keyring KeyRing, signed, signature io.Reader,
732732
// It checks the following:
733733
// - Hash function should not be invalid according to
734734
// config.RejectHashAlgorithms.
735-
// - Verification key must be older than the signature creation time.
736735
// - Check signature notations.
737736
// - Signature is not expired (unless a zero time is passed to
738737
// explicitly ignore expiration).
739-
func checkSignatureDetails(pk *packet.PublicKey, signature *packet.Signature, now time.Time, config *packet.Config) error {
738+
func checkSignatureDetails(signature *packet.Signature, now time.Time, config *packet.Config) error {
740739
if config.RejectHashAlgorithm(signature.Hash) {
741740
return errors.SignatureError("insecure hash algorithm: " + signature.Hash.String())
742741
}
743742

744-
if pk.CreationTime.Unix() > signature.CreationTime.Unix() {
745-
return errors.ErrSignatureOlderThanKey
746-
}
747-
748743
for _, notation := range signature.Notations {
749744
if notation.IsCritical && !config.KnownNotation(notation.Name) {
750745
return errors.SignatureError("unknown critical notation: " + notation.Name)
@@ -762,30 +757,29 @@ func checkSignatureDetails(pk *packet.PublicKey, signature *packet.Signature, no
762757
// signature and all relevant binding signatures.
763758
// In addition, the message signature hash algorithm is checked against
764759
// config.RejectMessageHashAlgorithms.
760+
// Finally, the signature must be newer than the verification key.
765761
func checkMessageSignatureDetails(verifiedKey *Key, signature *packet.Signature, config *packet.Config) error {
766762
if config.RejectMessageHashAlgorithm(signature.Hash) {
767763
return errors.SignatureError("insecure message hash algorithm: " + signature.Hash.String())
768764
}
769765

766+
if signature.CreationTime.Unix() < verifiedKey.PublicKey.CreationTime.Unix() {
767+
return errors.ErrSignatureOlderThanKey
768+
}
769+
770770
sigsToCheck := []*packet.Signature{signature, verifiedKey.PrimarySelfSignature}
771771
if !verifiedKey.IsPrimary() {
772772
sigsToCheck = append(sigsToCheck, verifiedKey.SelfSignature, verifiedKey.SelfSignature.EmbeddedSignature)
773773
}
774774
var errs []error
775775
for _, sig := range sigsToCheck {
776-
var pk *packet.PublicKey
777-
if sig == verifiedKey.PrimarySelfSignature || sig == verifiedKey.SelfSignature {
778-
pk = verifiedKey.Entity.PrimaryKey
779-
} else {
780-
pk = verifiedKey.PublicKey
781-
}
782776
var time time.Time
783777
if sig == signature {
784778
time = config.Now()
785779
} else {
786780
time = signature.CreationTime
787781
}
788-
if err := checkSignatureDetails(pk, sig, time, config); err != nil {
782+
if err := checkSignatureDetails(sig, time, config); err != nil {
789783
errs = append(errs, err)
790784
}
791785
}

openpgp/v2/subkeys.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ func (s *Subkey) LatestValidBindingSignature(date time.Time, config *packet.Conf
187187
if sig.Valid == nil {
188188
err := s.Primary.PrimaryKey.VerifyKeySignature(s.PublicKey, sig.Packet)
189189
if err == nil {
190-
err = checkSignatureDetails(s.Primary.PrimaryKey, sig.Packet, date, config)
190+
err = checkSignatureDetails(sig.Packet, date, config)
191191
}
192192
valid := err == nil
193193
sig.Valid = &valid

openpgp/v2/user.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ func (i *Identity) Revoked(selfCertification *packet.Signature, date time.Time,
121121
// Verify revocation signature (not verified yet).
122122
err := i.Primary.PrimaryKey.VerifyUserIdSignature(i.Name, i.Primary.PrimaryKey, revocation.Packet)
123123
if err == nil {
124-
err = checkSignatureDetails(i.Primary.PrimaryKey, revocation.Packet, date, config)
124+
err = checkSignatureDetails(revocation.Packet, date, config)
125125
}
126126
valid := err == nil
127127
revocation.Valid = &valid
@@ -206,7 +206,7 @@ func (i *Identity) LatestValidSelfCertification(date time.Time, config *packet.C
206206
// Verify revocation signature (not verified yet).
207207
err = i.Primary.PrimaryKey.VerifyUserIdSignature(i.Name, i.Primary.PrimaryKey, sig.Packet)
208208
if err == nil {
209-
err = checkSignatureDetails(i.Primary.PrimaryKey, sig.Packet, date, config)
209+
err = checkSignatureDetails(sig.Packet, date, config)
210210
}
211211
valid := err == nil
212212
sig.Valid = &valid

0 commit comments

Comments
 (0)