diff --git a/signature/docker.go b/signature/docker.go index b2126be656..901a225a29 100644 --- a/signature/docker.go +++ b/signature/docker.go @@ -5,6 +5,7 @@ package signature import ( "fmt" + "github.com/containers/image/docker/reference" "github.com/containers/image/manifest" "github.com/opencontainers/go-digest" ) @@ -24,6 +25,10 @@ func SignDockerManifest(m []byte, dockerReference string, mech SigningMechanism, // using mech. func VerifyDockerManifestSignature(unverifiedSignature, unverifiedManifest []byte, expectedDockerReference string, mech SigningMechanism, expectedKeyIdentity string) (*Signature, error) { + expectedRef, err := reference.ParseNamed(expectedDockerReference) + if err != nil { + return nil, err + } sig, err := verifyAndExtractSignature(mech, unverifiedSignature, signatureAcceptanceRules{ validateKeyIdentity: func(keyIdentity string) error { if keyIdentity != expectedKeyIdentity { @@ -32,7 +37,11 @@ func VerifyDockerManifestSignature(unverifiedSignature, unverifiedManifest []byt return nil }, validateSignedDockerReference: func(signedDockerReference string) error { - if signedDockerReference != expectedDockerReference { + signedRef, err := reference.ParseNamed(signedDockerReference) + if err != nil { + return InvalidSignatureError{msg: fmt.Sprintf("Invalid docker reference %s in signature", signedDockerReference)} + } + if signedRef.String() != expectedRef.String() { return InvalidSignatureError{msg: fmt.Sprintf("Docker reference %s does not match %s", signedDockerReference, expectedDockerReference)} } diff --git a/signature/docker_test.go b/signature/docker_test.go index 766fb0363d..6d2f0b3d71 100644 --- a/signature/docker_test.go +++ b/signature/docker_test.go @@ -52,8 +52,19 @@ func TestVerifyDockerManifestSignature(t *testing.T) { assert.Equal(t, TestImageSignatureReference, sig.DockerReference) assert.Equal(t, TestImageManifestDigest, sig.DockerManifestDigest) + // Verification using a different canonicalization of TestImageSignatureReference + sig, err = VerifyDockerManifestSignature(signature, manifest, "docker.io/"+TestImageSignatureReference, mech, TestKeyFingerprint) + require.NoError(t, err) + assert.Equal(t, TestImageSignatureReference, sig.DockerReference) + assert.Equal(t, TestImageManifestDigest, sig.DockerManifestDigest) + // For extra paranoia, test that we return nil data on error. + // Invalid docker reference on input + sig, err = VerifyDockerManifestSignature(signature, manifest, "UPPERCASEISINVALID", mech, TestKeyFingerprint) + assert.Error(t, err) + assert.Nil(t, sig) + // Error computing Docker manifest invalidManifest, err := ioutil.ReadFile("fixtures/v2s1-invalid-signatures.manifest.json") require.NoError(t, err) @@ -72,6 +83,12 @@ func TestVerifyDockerManifestSignature(t *testing.T) { assert.Error(t, err) assert.Nil(t, sig) + // Invalid reference in the signature + invalidReferenceSignature, err := ioutil.ReadFile("fixtures/invalid-reference.signature") + sig, err = VerifyDockerManifestSignature(invalidReferenceSignature, manifest, TestImageSignatureReference, mech, TestKeyFingerprint) + assert.Error(t, err) + assert.Nil(t, sig) + // Docker reference mismatch sig, err = VerifyDockerManifestSignature(signature, manifest, "example.com/doesnt/match", mech, TestKeyFingerprint) assert.Error(t, err) diff --git a/signature/fixtures/invalid-reference.signature b/signature/fixtures/invalid-reference.signature new file mode 100644 index 0000000000..0236598301 Binary files /dev/null and b/signature/fixtures/invalid-reference.signature differ