func()

in aws_signing_helper/cert_store_signer_darwin.go [312:367]


func (signer *DarwinCertStoreSigner) Sign(rand io.Reader, digest []byte, opts crypto.SignerOpts) ([]byte, error) {
	var hash []byte
	switch opts.HashFunc() {
	case crypto.SHA256:
		sum := sha256.Sum256(digest)
		hash = sum[:]
	case crypto.SHA384:
		sum := sha512.Sum384(digest)
		hash = sum[:]
	case crypto.SHA512:
		sum := sha512.Sum512(digest)
		hash = sum[:]
	default:
		return nil, ErrUnsupportedHash
	}

	keyRef, err := signer.getKeyRef()
	if err != nil {
		return nil, err
	}

	chash, err := bytesToCFData(hash)
	if err != nil {
		return nil, err
	}
	defer C.CFRelease(C.CFTypeRef(chash))

	cert, err := signer.Certificate()
	if err != nil {
		return nil, err
	}

	algo, err := getAlgo(cert, opts.HashFunc())
	if err != nil {
		return nil, err
	}

	// sign the digest
	var cfErrRef C.CFErrorRef
	cSig := C.SecKeyCreateSignature(keyRef, algo, chash, &cfErrRef)

	if err := cfErrorError(cfErrRef); err != nil {
		C.CFRelease(C.CFTypeRef(cfErrRef))

		return nil, err
	}

	if cSig == 0 {
		return nil, errors.New("nil signature from SecKeyCreateSignature")
	}
	defer C.CFRelease(C.CFTypeRef(cSig))

	sig := cfDataToBytes(cSig)

	return sig, nil
}