Path: blob/main/crypto/openssl/providers/implementations/digests/blake2_prov.c
48383 views
/*1* Copyright 2019-2023 The OpenSSL Project Authors. All Rights Reserved.2*3* Licensed under the Apache License 2.0 (the "License"). You may not use4* this file except in compliance with the License. You can obtain a copy5* in the file LICENSE in the source distribution or at6* https://www.openssl.org/source/license.html7*/89#include <openssl/crypto.h>10#include <openssl/core_names.h>11#include <openssl/proverr.h>12#include <openssl/err.h>13#include "prov/blake2.h"14#include "prov/digestcommon.h"15#include "prov/implementations.h"1617#define IMPLEMENT_BLAKE_functions(variant, VARIANT, variantsize) \18static const OSSL_PARAM known_blake##variant##_ctx_params[] = { \19{OSSL_DIGEST_PARAM_SIZE, OSSL_PARAM_UNSIGNED_INTEGER, NULL, 0, 0}, \20OSSL_PARAM_END \21}; \22\23const OSSL_PARAM *ossl_blake##variant##_gettable_ctx_params(ossl_unused void *ctx, \24ossl_unused void *pctx) \25{ \26return known_blake##variant##_ctx_params; \27} \28\29const OSSL_PARAM *ossl_blake##variant##_settable_ctx_params(ossl_unused void *ctx, \30ossl_unused void *pctx) \31{ \32return known_blake##variant##_ctx_params; \33} \34\35int ossl_blake##variant##_get_ctx_params(void *vctx, OSSL_PARAM params[]) \36{ \37struct blake##variant##_md_data_st *mdctx = vctx; \38OSSL_PARAM *p; \39\40BLAKE##VARIANT##_CTX *ctx = &mdctx->ctx; \41\42if (ctx == NULL) \43return 0; \44if (ossl_param_is_empty(params)) \45return 1; \46\47p = OSSL_PARAM_locate(params, OSSL_DIGEST_PARAM_SIZE); \48if (p != NULL \49&& !OSSL_PARAM_set_uint(p, (unsigned int)mdctx->params.digest_length)) { \50ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER); \51return 0; \52} \53\54return 1; \55} \56\57int ossl_blake##variant##_set_ctx_params(void *vctx, const OSSL_PARAM params[]) \58{ \59size_t size; \60struct blake##variant##_md_data_st *mdctx = vctx; \61const OSSL_PARAM *p; \62\63BLAKE##VARIANT##_CTX *ctx = &mdctx->ctx; \64\65if (ctx == NULL) \66return 0; \67if (ossl_param_is_empty(params)) \68return 1; \69\70p = OSSL_PARAM_locate_const(params, OSSL_DIGEST_PARAM_SIZE); \71if (p != NULL) { \72if (!OSSL_PARAM_get_size_t(p, &size)) { \73ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); \74return 0; \75} \76if (size < 1 || size > BLAKE##VARIANT##_OUTBYTES) { \77ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DIGEST_SIZE); \78return 0; \79} \80ossl_blake##variant##_param_set_digest_length(&mdctx->params, (uint8_t)size); \81} \82\83return 1; \84} \85\86static int ossl_blake##variantsize##_init(void *ctx) \87{ \88struct blake##variant##_md_data_st *mdctx = ctx; \89uint8_t digest_length = mdctx->params.digest_length; \90\91ossl_blake##variant##_param_init(&mdctx->params); \92if (digest_length != 0) \93mdctx->params.digest_length = digest_length; \94return ossl_blake##variant##_init(&mdctx->ctx, &mdctx->params); \95} \96\97static OSSL_FUNC_digest_init_fn blake##variantsize##_internal_init; \98static OSSL_FUNC_digest_newctx_fn blake##variantsize##_newctx; \99static OSSL_FUNC_digest_freectx_fn blake##variantsize##_freectx; \100static OSSL_FUNC_digest_dupctx_fn blake##variantsize##_dupctx; \101static OSSL_FUNC_digest_final_fn blake##variantsize##_internal_final; \102static OSSL_FUNC_digest_get_params_fn blake##variantsize##_get_params; \103\104static int blake##variantsize##_internal_init(void *ctx, const OSSL_PARAM params[]) \105{ \106return ossl_prov_is_running() && ossl_blake##variant##_set_ctx_params(ctx, params) \107&& ossl_blake##variantsize##_init(ctx); \108} \109\110static void *blake##variantsize##_newctx(void *prov_ctx) \111{ \112struct blake##variant##_md_data_st *ctx; \113\114ctx = ossl_prov_is_running() ? OPENSSL_zalloc(sizeof(*ctx)) : NULL; \115return ctx; \116} \117\118static void blake##variantsize##_freectx(void *vctx) \119{ \120struct blake##variant##_md_data_st *ctx; \121\122ctx = (struct blake##variant##_md_data_st *)vctx; \123OPENSSL_clear_free(ctx, sizeof(*ctx)); \124} \125\126static void *blake##variantsize##_dupctx(void *ctx) \127{ \128struct blake##variant##_md_data_st *in, *ret; \129\130in = (struct blake##variant##_md_data_st *)ctx; \131ret = ossl_prov_is_running()? OPENSSL_malloc(sizeof(*ret)) : NULL; \132if (ret != NULL) \133*ret = *in; \134return ret; \135} \136\137static void blake##variantsize##_copyctx(void *voutctx, void *vinctx) \138{ \139struct blake##variant##_md_data_st *inctx, *outctx; \140\141outctx = (struct blake##variant##_md_data_st *)voutctx; \142inctx = (struct blake##variant##_md_data_st *)vinctx; \143*outctx = *inctx; \144} \145\146static int blake##variantsize##_internal_final(void *ctx, unsigned char *out, \147size_t *outl, size_t outsz) \148{ \149struct blake##variant##_md_data_st *b_ctx; \150\151b_ctx = (struct blake##variant##_md_data_st *)ctx; \152\153if (!ossl_prov_is_running()) \154return 0; \155\156*outl = b_ctx->ctx.outlen; \157\158if (outsz == 0) \159return 1; \160\161if (outsz < *outl) { \162ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DIGEST_SIZE); \163return 0; \164} \165\166return ossl_blake##variant##_final(out, ctx); \167} \168\169static int blake##variantsize##_get_params(OSSL_PARAM params[]) \170{ \171return ossl_digest_default_get_params(params, BLAKE##VARIANT##_BLOCKBYTES, BLAKE##VARIANT##_OUTBYTES, 0); \172} \173\174const OSSL_DISPATCH ossl_blake##variantsize##_functions[] = { \175{OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))blake##variantsize##_newctx}, \176{OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))ossl_blake##variant##_update}, \177{OSSL_FUNC_DIGEST_FINAL, (void (*)(void))blake##variantsize##_internal_final}, \178{OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))blake##variantsize##_freectx}, \179{OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))blake##variantsize##_dupctx}, \180{OSSL_FUNC_DIGEST_COPYCTX, (void (*)(void))blake##variantsize##_copyctx}, \181{OSSL_FUNC_DIGEST_GET_PARAMS, (void (*)(void))blake##variantsize##_get_params}, \182{OSSL_FUNC_DIGEST_GETTABLE_PARAMS, \183(void (*)(void))ossl_digest_default_gettable_params}, \184{OSSL_FUNC_DIGEST_INIT, (void (*)(void))blake##variantsize##_internal_init}, \185{OSSL_FUNC_DIGEST_GETTABLE_CTX_PARAMS, \186(void (*)(void))ossl_blake##variant##_gettable_ctx_params}, \187{OSSL_FUNC_DIGEST_SETTABLE_CTX_PARAMS, \188(void (*)(void))ossl_blake##variant##_settable_ctx_params}, \189{OSSL_FUNC_DIGEST_GET_CTX_PARAMS, \190(void (*)(void))ossl_blake##variant##_get_ctx_params}, \191{OSSL_FUNC_DIGEST_SET_CTX_PARAMS, \192(void (*)(void))ossl_blake##variant##_set_ctx_params}, \193{0, NULL} \194};195196IMPLEMENT_BLAKE_functions(2s, 2S, 2s256)197IMPLEMENT_BLAKE_functions(2b, 2B, 2b512)198199200