in source/default_cmm.c [35:98]
static int default_cmm_generate_enc_materials(
struct aws_cryptosdk_cmm *cmm,
struct aws_cryptosdk_enc_materials **output,
struct aws_cryptosdk_enc_request *request) {
AWS_PRECONDITION(aws_cryptosdk_default_cmm_is_valid(cmm));
AWS_PRECONDITION(output != NULL);
AWS_PRECONDITION(aws_cryptosdk_enc_request_is_valid(request));
struct aws_cryptosdk_enc_materials *enc_mat = NULL;
struct default_cmm *self = (struct default_cmm *)cmm;
struct aws_hash_element *pElement = NULL;
*output = NULL;
aws_hash_table_find(request->enc_ctx, EC_PUBLIC_KEY_FIELD, &pElement);
if (pElement) {
return aws_raise_error(AWS_CRYPTOSDK_ERR_RESERVED_NAME);
}
if (!request->requested_alg) {
if (!self->default_alg_is_set) {
if (aws_cryptosdk_commitment_policy_encrypt_must_include_commitment(request->commitment_policy)) {
request->requested_alg = DEFAULT_ALG_KEY_COMMITTING;
} else {
request->requested_alg = DEFAULT_ALG_NON_KEY_COMMITTING;
}
} else {
request->requested_alg = self->default_alg;
}
}
const struct aws_cryptosdk_alg_properties *props = aws_cryptosdk_alg_props(request->requested_alg);
if (!props) goto err;
enc_mat = aws_cryptosdk_enc_materials_new(request->alloc, request->requested_alg);
if (!enc_mat) goto err;
if (props->signature_len) {
struct aws_string *pubkey = NULL;
if (aws_cryptosdk_sig_sign_start_keygen(&enc_mat->signctx, request->alloc, &pubkey, props)) {
goto err;
}
if (aws_hash_table_put(request->enc_ctx, EC_PUBLIC_KEY_FIELD, pubkey, NULL)) {
aws_string_destroy(pubkey);
goto err;
}
}
if (aws_cryptosdk_keyring_on_encrypt(
self->kr,
request->alloc,
&enc_mat->unencrypted_data_key,
&enc_mat->keyring_trace,
&enc_mat->encrypted_data_keys,
request->enc_ctx,
request->requested_alg))
goto err;
*output = enc_mat;
return AWS_OP_SUCCESS;
err:
aws_cryptosdk_enc_materials_destroy(enc_mat);
return AWS_OP_ERR;
}