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