Skip to content

Commit 2732e09

Browse files
authored
Merge pull request #275 from ProtonMail/only-check-msg-sig-newer-than-key
Only check that message signatures are newer than the key
2 parents cfbd6f6 + 8e272e7 commit 2732e09

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)