diff options
Diffstat (limited to 'providers/implementations/digests/blake2_prov.c')
-rw-r--r-- | providers/implementations/digests/blake2_prov.c | 85 |
1 files changed, 78 insertions, 7 deletions
diff --git a/providers/implementations/digests/blake2_prov.c b/providers/implementations/digests/blake2_prov.c index 25342eedb8..aa6ddace39 100644 --- a/providers/implementations/digests/blake2_prov.c +++ b/providers/implementations/digests/blake2_prov.c @@ -22,10 +22,10 @@ int ossl_blake2s256_init(void *ctx) int ossl_blake2b512_init(void *ctx) { - BLAKE2B_PARAM P; + struct blake2b_md_data_st *mdctx = ctx; - ossl_blake2b_param_init(&P); - return ossl_blake2b_init((BLAKE2B_CTX *)ctx, &P); + ossl_blake2b_param_init(&mdctx->params); + return ossl_blake2b_init(&mdctx->ctx, &mdctx->params); } /* ossl_blake2s256_functions */ @@ -35,7 +35,78 @@ IMPLEMENT_digest_functions(blake2s256, BLAKE2S_CTX, ossl_blake2s_final) /* ossl_blake2b512_functions */ -IMPLEMENT_digest_functions(blake2b512, BLAKE2B_CTX, - BLAKE2B_BLOCKBYTES, BLAKE2B_DIGEST_LENGTH, 0, - ossl_blake2b512_init, ossl_blake2b_update, - ossl_blake2b_final) + +static OSSL_FUNC_digest_init_fn blake2b512_internal_init; +static OSSL_FUNC_digest_newctx_fn blake2b512_newctx; +static OSSL_FUNC_digest_freectx_fn blake2b512_freectx; +static OSSL_FUNC_digest_dupctx_fn blake2b512_dupctx; +static OSSL_FUNC_digest_final_fn blake2b512_internal_final; +static OSSL_FUNC_digest_get_params_fn blake2b512_get_params; + +static int blake2b512_internal_init(void *ctx, const OSSL_PARAM params[]) +{ + return ossl_prov_is_running() && ossl_blake2b_set_ctx_params(ctx, params) + && ossl_blake2b512_init(ctx); +} + +static void *blake2b512_newctx(void *prov_ctx) +{ + struct blake2b_md_data_st *ctx; + + ctx = ossl_prov_is_running() ? OPENSSL_zalloc(sizeof(*ctx)) : NULL; + return ctx; +} + +static void blake2b512_freectx(void *vctx) +{ + struct blake2b_md_data_st *ctx; + + ctx = (struct blake2b_md_data_st *)vctx; + OPENSSL_clear_free(ctx, sizeof(*ctx)); +} + +static void *blake2b512_dupctx(void *ctx) +{ + struct blake2b_md_data_st *in, *ret; + + in = (struct blake2b_md_data_st *)ctx; + ret = ossl_prov_is_running()? OPENSSL_malloc(sizeof(*ret)) : NULL; + if (ret != NULL) + *ret = *in; + return ret; +} + +static int blake2b512_internal_final(void *ctx, unsigned char *out, + size_t *outl, size_t outsz) +{ + struct blake2b_md_data_st *b_ctx; + + b_ctx = (struct blake2b_md_data_st *)ctx; + *outl = b_ctx->ctx.outlen; + + if (!ossl_prov_is_running()) + return 0; + + return (outsz > 0) ? ossl_blake2b_final(out, ctx) : 1; +} + +static int blake2b512_get_params(OSSL_PARAM params[]) +{ + return ossl_digest_default_get_params(params, BLAKE2B_BLOCKBYTES, 64, 0); +} + +const OSSL_DISPATCH ossl_blake2b512_functions[] = + { {OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))blake2b512_newctx}, + {OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))ossl_blake2b_update}, + {OSSL_FUNC_DIGEST_FINAL, (void (*)(void))blake2b512_internal_final}, + {OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))blake2b512_freectx}, + {OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))blake2b512_dupctx}, + {OSSL_FUNC_DIGEST_GET_PARAMS, (void (*)(void))blake2b512_get_params}, + {OSSL_FUNC_DIGEST_GETTABLE_PARAMS, + (void (*)(void))ossl_digest_default_gettable_params}, + {OSSL_FUNC_DIGEST_INIT, (void (*)(void))blake2b512_internal_init}, + {OSSL_FUNC_DIGEST_SETTABLE_CTX_PARAMS, + (void (*)(void))ossl_blake2b_settable_ctx_params}, + {OSSL_FUNC_DIGEST_SET_CTX_PARAMS, + (void (*)(void))ossl_blake2b_set_ctx_params}, {0, NULL} }; + |