Skip to content

Commit b58084d

Browse files
committed
FIXME: Test that all mechanisms can accept a Sequoia-PGP created signature
This fails with openpgp: openpgp: unsupported feature: public key type: 22 (EdDSA signature). Do we need to migrate to a fork? Signed-off-by: Miloslav Trmač <mitr@redhat.com>
1 parent c6ebc0e commit b58084d

File tree

3 files changed

+32
-4
lines changed

3 files changed

+32
-4
lines changed

signature/fixtures/sequoia.pub

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../simplesequoia/testdata/no-passphrase.pub
513 Bytes
Binary file not shown.

signature/mechanism_test.go

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)