in source/darwin/securityframework_ecc.c [28:63]
static int s_sign_message(
const struct aws_ecc_key_pair *key_pair,
const struct aws_byte_cursor *message,
struct aws_byte_buf *signature_output) {
struct commoncrypto_ecc_key_pair *cc_key = key_pair->impl;
if (!cc_key->priv_key_ref) {
return aws_raise_error(AWS_ERROR_CAL_MISSING_REQUIRED_KEY_COMPONENT);
}
CFDataRef hash_ref = CFDataCreateWithBytesNoCopy(NULL, message->ptr, message->len, kCFAllocatorNull);
AWS_FATAL_ASSERT(hash_ref && "No allocations should have happened here, this function shouldn't be able to fail.");
CFErrorRef error = NULL;
CFDataRef signature =
SecKeyCreateSignature(cc_key->priv_key_ref, kSecKeyAlgorithmECDSASignatureDigestX962, hash_ref, &error);
if (error) {
CFRelease(hash_ref);
return aws_raise_error(AWS_ERROR_SYS_CALL_FAILURE);
}
struct aws_byte_cursor to_write =
aws_byte_cursor_from_array(CFDataGetBytePtr(signature), CFDataGetLength(signature));
if (aws_byte_buf_append(signature_output, &to_write)) {
CFRelease(signature);
CFRelease(hash_ref);
return aws_raise_error(AWS_ERROR_SHORT_BUFFER);
}
CFRelease(signature);
CFRelease(hash_ref);
return AWS_OP_SUCCESS;
}