static int default_cmm_generate_enc_materials()

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;
}