func TestPRSignedByIsSignatureAuthorAccepted(t *testing.T) { ktGPG := SBKeyTypeGPGKeys prm := NewPRMMatchExact() testImage := dirImageMock(t, "fixtures/dir-img-valid", "testing/manifest:latest") defer testImage.Close() testImageSig, err := ioutil.ReadFile("fixtures/dir-img-valid/signature-1") require.NoError(t, err) // Successful validation, with KeyData and KeyPath pr, err := NewPRSignedByKeyPath(ktGPG, "fixtures/public-key.gpg", prm) require.NoError(t, err) sar, parsedSig, err := pr.isSignatureAuthorAccepted(testImage, testImageSig) assertSARAccepted(t, sar, parsedSig, err, Signature{ DockerManifestDigest: TestImageManifestDigest, DockerReference: "testing/manifest:latest", }) keyData, err := ioutil.ReadFile("fixtures/public-key.gpg") require.NoError(t, err) pr, err = NewPRSignedByKeyData(ktGPG, keyData, prm) require.NoError(t, err) sar, parsedSig, err = pr.isSignatureAuthorAccepted(testImage, testImageSig) assertSARAccepted(t, sar, parsedSig, err, Signature{ DockerManifestDigest: TestImageManifestDigest, DockerReference: "testing/manifest:latest", }) // Unimplemented and invalid KeyType values for _, keyType := range []sbKeyType{SBKeyTypeSignedByGPGKeys, SBKeyTypeX509Certificates, SBKeyTypeSignedByX509CAs, sbKeyType("This is invalid"), } { // Do not use NewPRSignedByKeyData, because it would reject invalid values. pr := &prSignedBy{ KeyType: keyType, KeyData: []byte("abc"), SignedIdentity: prm, } // Pass nil pointers to, kind of, test that the return value does not depend on the parameters. sar, parsedSig, err := pr.isSignatureAuthorAccepted(nil, nil) assertSARRejected(t, sar, parsedSig, err) } // Both KeyPath and KeyData set. Do not use NewPRSignedBy*, because it would reject this. prSB := &prSignedBy{ KeyType: ktGPG, KeyPath: "/foo/bar", KeyData: []byte("abc"), SignedIdentity: prm, } // Pass nil pointers to, kind of, test that the return value does not depend on the parameters. sar, parsedSig, err = prSB.isSignatureAuthorAccepted(nil, nil) assertSARRejected(t, sar, parsedSig, err) // Invalid KeyPath pr, err = NewPRSignedByKeyPath(ktGPG, "/this/does/not/exist", prm) require.NoError(t, err) // Pass nil pointers to, kind of, test that the return value does not depend on the parameters. sar, parsedSig, err = pr.isSignatureAuthorAccepted(nil, nil) assertSARRejected(t, sar, parsedSig, err) // Errors initializing the temporary GPG directory and mechanism are not obviously easy to reach. // KeyData has no public keys. pr, err = NewPRSignedByKeyData(ktGPG, []byte{}, prm) require.NoError(t, err) // Pass nil pointers to, kind of, test that the return value does not depend on the parameters. sar, parsedSig, err = pr.isSignatureAuthorAccepted(nil, nil) assertSARRejectedPolicyRequirement(t, sar, parsedSig, err) // A signature which does not GPG verify pr, err = NewPRSignedByKeyPath(ktGPG, "fixtures/public-key.gpg", prm) require.NoError(t, err) // Pass a nil pointer to, kind of, test that the return value does not depend on the image parmater.. sar, parsedSig, err = pr.isSignatureAuthorAccepted(nil, []byte("invalid signature")) assertSARRejected(t, sar, parsedSig, err) // A valid signature using an unknown key. // (This is (currently?) rejected through the "mech.Verify fails" path, not the "!identityFound" path, // because we use a temporary directory and only import the trusted keys.) pr, err = NewPRSignedByKeyPath(ktGPG, "fixtures/public-key.gpg", prm) require.NoError(t, err) sig, err := ioutil.ReadFile("fixtures/unknown-key.signature") require.NoError(t, err) // Pass a nil pointer to, kind of, test that the return value does not depend on the image parmater.. sar, parsedSig, err = pr.isSignatureAuthorAccepted(nil, sig) assertSARRejected(t, sar, parsedSig, err) // A valid signature of an invalid JSON. pr, err = NewPRSignedByKeyPath(ktGPG, "fixtures/public-key.gpg", prm) require.NoError(t, err) sig, err = ioutil.ReadFile("fixtures/invalid-blob.signature") require.NoError(t, err) // Pass a nil pointer to, kind of, test that the return value does not depend on the image parmater.. sar, parsedSig, err = pr.isSignatureAuthorAccepted(nil, sig) assertSARRejected(t, sar, parsedSig, err) assert.IsType(t, InvalidSignatureError{}, err) // A valid signature with a rejected identity. nonmatchingPRM, err := NewPRMExactReference("this/doesnt:match") require.NoError(t, err) pr, err = NewPRSignedByKeyPath(ktGPG, "fixtures/public-key.gpg", nonmatchingPRM) require.NoError(t, err) sar, parsedSig, err = pr.isSignatureAuthorAccepted(testImage, testImageSig) assertSARRejectedPolicyRequirement(t, sar, parsedSig, err) // Error reading image manifest image := dirImageMock(t, "fixtures/dir-img-no-manifest", "testing/manifest:latest") defer image.Close() sig, err = ioutil.ReadFile("fixtures/dir-img-no-manifest/signature-1") require.NoError(t, err) pr, err = NewPRSignedByKeyPath(ktGPG, "fixtures/public-key.gpg", prm) require.NoError(t, err) sar, parsedSig, err = pr.isSignatureAuthorAccepted(image, sig) assertSARRejected(t, sar, parsedSig, err) // Error computing manifest digest image = dirImageMock(t, "fixtures/dir-img-manifest-digest-error", "testing/manifest:latest") defer image.Close() sig, err = ioutil.ReadFile("fixtures/dir-img-manifest-digest-error/signature-1") require.NoError(t, err) pr, err = NewPRSignedByKeyPath(ktGPG, "fixtures/public-key.gpg", prm) require.NoError(t, err) sar, parsedSig, err = pr.isSignatureAuthorAccepted(image, sig) assertSARRejected(t, sar, parsedSig, err) // A valid signature with a non-matching manifest image = dirImageMock(t, "fixtures/dir-img-modified-manifest", "testing/manifest:latest") defer image.Close() sig, err = ioutil.ReadFile("fixtures/dir-img-modified-manifest/signature-1") require.NoError(t, err) pr, err = NewPRSignedByKeyPath(ktGPG, "fixtures/public-key.gpg", prm) require.NoError(t, err) sar, parsedSig, err = pr.isSignatureAuthorAccepted(image, sig) assertSARRejectedPolicyRequirement(t, sar, parsedSig, err) }
func TestPRSignedByIsRunningImageAllowed(t *testing.T) { ktGPG := SBKeyTypeGPGKeys prm := NewPRMMatchExact() // A simple success case: single valid signature. image := dirImageMock(t, "fixtures/dir-img-valid", "testing/manifest:latest") defer image.Close() pr, err := NewPRSignedByKeyPath(ktGPG, "fixtures/public-key.gpg", prm) require.NoError(t, err) allowed, err := pr.isRunningImageAllowed(image) assertRunningAllowed(t, allowed, err) // Error reading signatures invalidSigDir := createInvalidSigDir(t) defer os.RemoveAll(invalidSigDir) image = dirImageMock(t, invalidSigDir, "testing/manifest:latest") defer image.Close() pr, err = NewPRSignedByKeyPath(ktGPG, "fixtures/public-key.gpg", prm) require.NoError(t, err) allowed, err = pr.isRunningImageAllowed(image) assertRunningRejected(t, allowed, err) // No signatures image = dirImageMock(t, "fixtures/dir-img-unsigned", "testing/manifest:latest") defer image.Close() pr, err = NewPRSignedByKeyPath(ktGPG, "fixtures/public-key.gpg", prm) require.NoError(t, err) allowed, err = pr.isRunningImageAllowed(image) assertRunningRejectedPolicyRequirement(t, allowed, err) // 1 invalid signature: use dir-img-valid, but a non-matching Docker reference image = dirImageMock(t, "fixtures/dir-img-valid", "testing/manifest:notlatest") defer image.Close() pr, err = NewPRSignedByKeyPath(ktGPG, "fixtures/public-key.gpg", prm) require.NoError(t, err) allowed, err = pr.isRunningImageAllowed(image) assertRunningRejectedPolicyRequirement(t, allowed, err) // 2 valid signatures image = dirImageMock(t, "fixtures/dir-img-valid-2", "testing/manifest:latest") defer image.Close() pr, err = NewPRSignedByKeyPath(ktGPG, "fixtures/public-key.gpg", prm) require.NoError(t, err) allowed, err = pr.isRunningImageAllowed(image) assertRunningAllowed(t, allowed, err) // One invalid, one valid signature (in this order) image = dirImageMock(t, "fixtures/dir-img-mixed", "testing/manifest:latest") defer image.Close() pr, err = NewPRSignedByKeyPath(ktGPG, "fixtures/public-key.gpg", prm) require.NoError(t, err) allowed, err = pr.isRunningImageAllowed(image) assertRunningAllowed(t, allowed, err) // 2 invalid signatures: use dir-img-valid-2, but a non-matching Docker reference image = dirImageMock(t, "fixtures/dir-img-valid-2", "testing/manifest:notlatest") defer image.Close() pr, err = NewPRSignedByKeyPath(ktGPG, "fixtures/public-key.gpg", prm) require.NoError(t, err) allowed, err = pr.isRunningImageAllowed(image) assertRunningRejectedPolicyRequirement(t, allowed, err) }