in source/kms.c [2914:2978]
int aws_kms_generate_random_blocking(
struct aws_nitro_enclaves_kms_client *client,
uint32_t number_of_bytes,
struct aws_byte_buf *plaintext /* TODO: err_reason */) {
AWS_PRECONDITION(client != NULL);
AWS_PRECONDITION(number_of_bytes > 0);
AWS_PRECONDITION(plaintext != NULL);
struct aws_string *response = NULL;
struct aws_string *request = NULL;
struct aws_kms_generate_random_response *response_structure = NULL;
struct aws_kms_generate_random_request *request_structure = NULL;
int rc = 0;
request_structure = aws_kms_generate_random_request_new(client->allocator);
if (request_structure == NULL) {
return AWS_OP_ERR;
}
request_structure->number_of_bytes = number_of_bytes;
request_structure->recipient = aws_recipient_new(client->allocator);
if (request_structure->recipient == NULL) {
goto err_clean;
}
rc = aws_attestation_request(
client->allocator, client->keypair, &request_structure->recipient->attestation_document);
if (rc != AWS_OP_SUCCESS) {
goto err_clean;
}
request_structure->recipient->key_encryption_algorithm = AWS_KEA_RSAES_OAEP_SHA_256;
request = aws_kms_generate_random_request_to_json(request_structure);
if (request == NULL) {
goto err_clean;
}
rc = s_aws_nitro_enclaves_kms_client_call_blocking(client, kms_target_generate_random, request, &response);
if (rc != 200) {
fprintf(stderr, "Got non-200 answer from KMS: %d\n", rc);
goto err_clean;
}
response_structure = aws_kms_generate_random_response_from_json(client->allocator, response);
if (response_structure == NULL) {
fprintf(stderr, "Could not read response from KMS: %d\n", rc);
goto err_clean;
}
rc = s_decrypt_ciphertext_for_recipient(
client->allocator, &response_structure->ciphertext_for_recipient, client->keypair, plaintext);
aws_kms_generate_random_request_destroy(request_structure);
aws_kms_generate_random_response_destroy(response_structure);
aws_string_destroy(request);
aws_string_destroy(response);
return rc;
err_clean:
aws_kms_generate_random_request_destroy(request_structure);
aws_kms_generate_random_response_destroy(response_structure);
aws_string_destroy(request);
aws_string_destroy(response);
return AWS_OP_ERR;
}