int aws_cryptosdk_sig_verify_start()

in source/cipher_openssl.c [739:803]


int aws_cryptosdk_sig_verify_start(
    struct aws_cryptosdk_sig_ctx **pctx,
    struct aws_allocator *alloc,
    const struct aws_string *pub_key,
    const struct aws_cryptosdk_alg_properties *props) {
    AWS_PRECONDITION(aws_string_is_valid(pub_key));
    AWS_PRECONDITION(aws_cryptosdk_alg_properties_is_valid(props));

    *pctx = NULL;

    if (!props->impl->curve_name) {
        AWS_POSTCONDITION(!*pctx);
        AWS_POSTCONDITION(aws_string_is_valid(pub_key));
        return AWS_OP_SUCCESS;
    }

    struct aws_cryptosdk_sig_ctx *ctx = aws_mem_acquire(alloc, sizeof(*ctx));

    if (!ctx) {
        goto oom;
    }

    *ctx = (struct aws_cryptosdk_sig_ctx){
        .alloc = alloc, .props = props, .keypair = NULL, .pkey = NULL, .is_sign = false
    };

    if (load_pubkey(&ctx->keypair, props, pub_key)) {
        goto rethrow;
    }

    if (!(ctx->pkey = EVP_PKEY_new())) {
        goto oom;
    }

    if (!EVP_PKEY_set1_EC_KEY(ctx->pkey, ctx->keypair)) {
        goto oom;
    }

    if (!(ctx->ctx = EVP_MD_CTX_new())) {
        goto oom;
    }

    if (!(EVP_DigestVerifyInit(ctx->ctx, NULL, props->impl->sig_md_ctor(), NULL, ctx->pkey))) {
        aws_raise_error(AWS_CRYPTOSDK_ERR_CRYPTO_UNKNOWN);
        goto rethrow;
    }

    *pctx = ctx;

    AWS_POSTCONDITION(aws_cryptosdk_sig_ctx_is_valid(*pctx));
    AWS_POSTCONDITION(!(*pctx)->is_sign);
    AWS_POSTCONDITION(aws_string_is_valid(pub_key));
    return AWS_OP_SUCCESS;

oom:
    aws_raise_error(AWS_ERROR_OOM);
rethrow:
    if (ctx) {
        aws_cryptosdk_sig_abort(ctx);
    }

    AWS_POSTCONDITION(!*pctx);
    AWS_POSTCONDITION(aws_string_is_valid(pub_key));
    return AWS_OP_ERR;
}