in source/crypto.c [427:480]
napi_value aws_napi_hmac_digest(napi_env env, napi_callback_info info) {
napi_value node_args[2];
size_t num_args = AWS_ARRAY_SIZE(node_args);
if (napi_get_cb_info(env, info, &num_args, node_args, NULL, NULL)) {
napi_throw_error(env, NULL, "Failed to retreive callback information");
return NULL;
}
if (num_args != AWS_ARRAY_SIZE(node_args)) {
napi_throw_error(env, NULL, "hmac_digest needs exactly 2 arguments");
return NULL;
}
struct aws_hmac *hmac = NULL;
if (napi_get_value_external(env, node_args[0], (void **)&hmac)) {
napi_throw_error(env, NULL, "Failed to extract hmac from first argument");
return NULL;
}
size_t digest_size = hmac->digest_size;
if (!aws_napi_is_null_or_undefined(env, node_args[1])) {
uint32_t truncate_to = 0;
if (napi_get_value_uint32(env, node_args[1], &truncate_to)) {
napi_throw_type_error(env, NULL, "truncate_to argument must be undefined or a positive number");
return NULL;
}
if (digest_size > truncate_to) {
digest_size = truncate_to;
}
}
napi_value arraybuffer;
void *data = NULL;
if (napi_create_arraybuffer(env, digest_size, &data, &arraybuffer)) {
napi_throw_error(env, NULL, "Failed to create output arraybuffer");
return NULL;
}
struct aws_byte_buf out_buf = aws_byte_buf_from_empty_array(data, digest_size);
if (aws_hmac_finalize(hmac, &out_buf, digest_size)) {
aws_napi_throw_last_error(env);
return NULL;
}
napi_value dataview;
if (napi_create_dataview(env, digest_size, arraybuffer, 0, &dataview)) {
napi_throw_error(env, NULL, "Failed to create output dataview");
return NULL;
}
return dataview;
}