Skip to content

Commit e22c6fd

Browse files
authored
Merge pull request #227 from mtrmac/canonicalize-VerifyDockerManifestSignature
Canonicalize docker references in signature.VerifyDockerManifestSignature
2 parents d23efe9 + 73dfbc6 commit e22c6fd

3 files changed

Lines changed: 27 additions & 1 deletion

File tree

signature/docker.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package signature
55
import (
66
"fmt"
77

8+
"github.com/containers/image/docker/reference"
89
"github.com/containers/image/manifest"
910
"github.com/opencontainers/go-digest"
1011
)
@@ -24,6 +25,10 @@ func SignDockerManifest(m []byte, dockerReference string, mech SigningMechanism,
2425
// using mech.
2526
func VerifyDockerManifestSignature(unverifiedSignature, unverifiedManifest []byte,
2627
expectedDockerReference string, mech SigningMechanism, expectedKeyIdentity string) (*Signature, error) {
28+
expectedRef, err := reference.ParseNamed(expectedDockerReference)
29+
if err != nil {
30+
return nil, err
31+
}
2732
sig, err := verifyAndExtractSignature(mech, unverifiedSignature, signatureAcceptanceRules{
2833
validateKeyIdentity: func(keyIdentity string) error {
2934
if keyIdentity != expectedKeyIdentity {
@@ -32,7 +37,11 @@ func VerifyDockerManifestSignature(unverifiedSignature, unverifiedManifest []byt
3237
return nil
3338
},
3439
validateSignedDockerReference: func(signedDockerReference string) error {
35-
if signedDockerReference != expectedDockerReference {
40+
signedRef, err := reference.ParseNamed(signedDockerReference)
41+
if err != nil {
42+
return InvalidSignatureError{msg: fmt.Sprintf("Invalid docker reference %s in signature", signedDockerReference)}
43+
}
44+
if signedRef.String() != expectedRef.String() {
3645
return InvalidSignatureError{msg: fmt.Sprintf("Docker reference %s does not match %s",
3746
signedDockerReference, expectedDockerReference)}
3847
}

signature/docker_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,19 @@ func TestVerifyDockerManifestSignature(t *testing.T) {
5252
assert.Equal(t, TestImageSignatureReference, sig.DockerReference)
5353
assert.Equal(t, TestImageManifestDigest, sig.DockerManifestDigest)
5454

55+
// Verification using a different canonicalization of TestImageSignatureReference
56+
sig, err = VerifyDockerManifestSignature(signature, manifest, "docker.io/"+TestImageSignatureReference, mech, TestKeyFingerprint)
57+
require.NoError(t, err)
58+
assert.Equal(t, TestImageSignatureReference, sig.DockerReference)
59+
assert.Equal(t, TestImageManifestDigest, sig.DockerManifestDigest)
60+
5561
// For extra paranoia, test that we return nil data on error.
5662

63+
// Invalid docker reference on input
64+
sig, err = VerifyDockerManifestSignature(signature, manifest, "UPPERCASEISINVALID", mech, TestKeyFingerprint)
65+
assert.Error(t, err)
66+
assert.Nil(t, sig)
67+
5768
// Error computing Docker manifest
5869
invalidManifest, err := ioutil.ReadFile("fixtures/v2s1-invalid-signatures.manifest.json")
5970
require.NoError(t, err)
@@ -72,6 +83,12 @@ func TestVerifyDockerManifestSignature(t *testing.T) {
7283
assert.Error(t, err)
7384
assert.Nil(t, sig)
7485

86+
// Invalid reference in the signature
87+
invalidReferenceSignature, err := ioutil.ReadFile("fixtures/invalid-reference.signature")
88+
sig, err = VerifyDockerManifestSignature(invalidReferenceSignature, manifest, TestImageSignatureReference, mech, TestKeyFingerprint)
89+
assert.Error(t, err)
90+
assert.Nil(t, sig)
91+
7592
// Docker reference mismatch
7693
sig, err = VerifyDockerManifestSignature(signature, manifest, "example.com/doesnt/match", mech, TestKeyFingerprint)
7794
assert.Error(t, err)
422 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)