@@ -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.
765761func 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 }
0 commit comments