@@ -264,18 +264,39 @@ func TestGPGSigningMechanismVerify(t *testing.T) {
264264 }
265265 assert .Equal (t , TestKeyFingerprintPrimaryWithSubkey , signingFingerprint , variant )
266266 }
267+ // Successful verification of a signature created using a Sequoia-PGP key with the default parameters / composition.
268+ sequoiaPubKey , err := os .ReadFile ("./fixtures/sequoia.pub" )
269+ require .NoError (t , err )
270+ // FIXME: Just use testGPGHomeDirectory? And then we could reuse the subkey check above.
271+ mech2 , sequoiaIdentities , err := NewEphemeralGPGSigningMechanism (sequoiaPubKey )
272+ require .NoError (t , err )
273+ defer mech2 .Close ()
274+ assert .Equal (t , []string {"50DDE898DF4E48755C8C2B7AF6F908B6FA48A229" }, sequoiaIdentities )
275+ signature , err := os .ReadFile ("./fixtures/sequoia.signature" )
276+ require .NoError (t , err )
277+ content , signingFingerprint , err := mech2 .Verify (signature )
278+ require .NoError (t , err )
279+ if ! slices .Contains (sequoiaIdentities , signingFingerprint ) {
280+ if withLookup , ok := mech2 .(signingMechanismWithVerificationIdentityLookup ); ok {
281+ primaryKey , err := withLookup .keyIdentityForVerificationKeyIdentity (signingFingerprint )
282+ require .NoError (t , err )
283+ signingFingerprint = primaryKey
284+ }
285+ }
286+ assert .Contains (t , sequoiaIdentities , signingFingerprint ) // This matches the requirement in prSignedBy.isSignatureAuthorAccepted
287+ assert .Equal (t , []byte (`{"critical":{"identity":{"docker-reference":"example.com/testing/manifest:notlatest"},"image":{"docker-manifest-digest":"sha256:20bf21ed457b390829cdbeec8795a7bea1626991fda603e0d01b4e7f60427e55"},"type":"atomic container signature"},"optional":{"creator":"atomic 5.37.0-dev","timestamp":1753112968}}` ), content )
267288
268289 // For extra paranoia, test that we return nil data on error.
269290
270291 // Completely invalid signature.
271- content , signingFingerprint , err : = mech .Verify ([]byte {})
292+ content , signingFingerprint , err = mech .Verify ([]byte {})
272293 assertSigningError (t , content , signingFingerprint , err )
273294
274295 content , signingFingerprint , err = mech .Verify ([]byte ("invalid signature" ))
275296 assertSigningError (t , content , signingFingerprint , err )
276297
277298 // Literal packet, not a signature
278- signature , err : = os .ReadFile ("./fixtures/unsigned-literal.signature" ) // Not fixtureVariants, the “literal data” packet does not have V3/V4 versions.
299+ signature , err = os .ReadFile ("./fixtures/unsigned-literal.signature" ) // Not fixtureVariants, the “literal data” packet does not have V3/V4 versions.
279300 require .NoError (t , err )
280301 content , signingFingerprint , err = mech .Verify (signature )
281302 assertSigningError (t , content , signingFingerprint , err )
@@ -373,6 +394,12 @@ func TestGPGSigningMechanismUntrustedSignatureContents(t *testing.T) {
373394 assert .Equal (t , []byte ("This is not JSON\n " ), content , version )
374395 assert .Equal (t , TestKeyShortID , shortKeyID , version )
375396 }
397+ signature , err := os .ReadFile ("./fixtures/sequoia.signature" )
398+ require .NoError (t , err )
399+ content , shortKeyID , err := mech .UntrustedSignatureContents (signature )
400+ require .NoError (t , err )
401+ assert .Equal (t , []byte (`{"critical":{"identity":{"docker-reference":"example.com/testing/manifest:notlatest"},"image":{"docker-manifest-digest":"sha256:20bf21ed457b390829cdbeec8795a7bea1626991fda603e0d01b4e7f60427e55"},"type":"atomic container signature"},"optional":{"creator":"atomic 5.37.0-dev","timestamp":1753112968}}` ), content )
402+ assert .Equal (t , "7ADD16BD41D829B6" , shortKeyID ) // This is a subkey ID, we don’t generally have the primary public key so we can’t map it even if we wanted to.
376403
377404 // Completely invalid signature.
378405 _ , _ , err = mech .UntrustedSignatureContents ([]byte {})
@@ -382,7 +409,7 @@ func TestGPGSigningMechanismUntrustedSignatureContents(t *testing.T) {
382409 assert .Error (t , err )
383410
384411 // Literal packet, not a signature
385- signature , err : = os .ReadFile ("./fixtures/unsigned-literal.signature" ) // Not fixtureVariants, the “literal data” packet does not have V3/V4 versions.
412+ signature , err = os .ReadFile ("./fixtures/unsigned-literal.signature" ) // Not fixtureVariants, the “literal data” packet does not have V3/V4 versions.
386413 require .NoError (t , err )
387414 _ , _ , err = mech .UntrustedSignatureContents (signature )
388415 assert .Error (t , err )
@@ -396,7 +423,7 @@ func TestGPGSigningMechanismUntrustedSignatureContents(t *testing.T) {
396423 // Expired signature
397424 signature , err = os .ReadFile ("./fixtures/expired.signature" ) // Not fixtureVariants, V3 signature packets don’t support expiration.
398425 require .NoError (t , err )
399- content , shortKeyID , err : = mech .UntrustedSignatureContents (signature )
426+ content , shortKeyID , err = mech .UntrustedSignatureContents (signature )
400427 require .NoError (t , err )
401428 assert .Equal (t , []byte ("This signature is expired.\n " ), content )
402429 assert .Equal (t , TestKeyShortID , shortKeyID )
0 commit comments