func verifySignature()

in server/signedcontainer/verify.go [108:158]


func verifySignature(imageDigest string, sig *ImageSignature) (*VerifiedSignature, error) {
	if sig == nil {
		return nil, errors.New("container image signature is nil")
	}

	payload, err := unmarshalAndValidate(sig.Payload)
	if err != nil {
		return nil, fmt.Errorf("failed to unmarshal payload: %v", err)
	}

	publicKey, err := payload.publicKey()
	if err != nil {
		return nil, err
	}

	sigAlg, err := payload.sigAlg()
	if err != nil {
		return nil, err
	}

	if payload.Critical.Image.DockerManifestDigest != imageDigest {
		return nil, errors.New("payload docker manifest digest does not match the running workload image digest")
	}

	// Create a public keyset handle from the given PEM-encoded public key and signing algorithm.
	publicKeysetHandle, err := createPublicKeysetHandle(publicKey, sigAlg)
	if err != nil {
		return nil, fmt.Errorf("failed to read public keyset: %v", err)
	}

	// Retrieve the Verifier primitive from publicKeysetHandle.
	verifier, err := tinksig.NewVerifier(publicKeysetHandle)
	if err != nil {
		return nil, fmt.Errorf("failed to create Tink signature verifier: %v", err)
	}

	if err = verifier.Verify(sig.Signature, sig.Payload); err != nil {
		return nil, fmt.Errorf("failed to verify signature: %v", err)
	}

	keyID, err := computeKeyID(publicKey)
	if err != nil {
		return nil, fmt.Errorf("failed to compute keyID: %v", err)
	}

	return &VerifiedSignature{
		KeyID:     keyID,
		Signature: encoding.EncodeToString(sig.Signature),
		Alg:       sigAlg.string(),
	}, nil
}