in source/unix/opensslcrypto_ecc.c [84:122]
static int s_fill_in_public_key_info(
struct libcrypto_ecc_key *libcrypto_key_pair,
const EC_GROUP *group,
const EC_POINT *pub_key_point) {
BIGNUM *big_num_x = BN_new();
BIGNUM *big_num_y = BN_new();
int ret_val = AWS_OP_ERR;
if (EC_POINT_get_affine_coordinates_GFp(group, pub_key_point, big_num_x, big_num_y, NULL) != 1) {
aws_raise_error(AWS_ERROR_INVALID_STATE);
goto clean_up;
}
size_t x_coor_size = BN_num_bytes(big_num_x);
size_t y_coor_size = BN_num_bytes(big_num_y);
if (aws_byte_buf_init(&libcrypto_key_pair->key_pair.pub_x, libcrypto_key_pair->key_pair.allocator, x_coor_size)) {
goto clean_up;
}
if (aws_byte_buf_init(&libcrypto_key_pair->key_pair.pub_y, libcrypto_key_pair->key_pair.allocator, y_coor_size)) {
goto clean_up;
}
BN_bn2bin(big_num_x, libcrypto_key_pair->key_pair.pub_x.buffer);
BN_bn2bin(big_num_y, libcrypto_key_pair->key_pair.pub_y.buffer);
libcrypto_key_pair->key_pair.pub_x.len = x_coor_size;
libcrypto_key_pair->key_pair.pub_y.len = y_coor_size;
ret_val = AWS_OP_SUCCESS;
clean_up:
BN_free(big_num_x);
BN_free(big_num_y);
return ret_val;
}