Path: blob/main/crypto/openssl/providers/implementations/include/prov/digestcommon.h
48534 views
/*1* Copyright 2019-2021 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#ifndef OSSL_PROVIDERS_DIGESTCOMMON_H10# define OSSL_PROVIDERS_DIGESTCOMMON_H1112# include <openssl/core_dispatch.h>13# include <openssl/core_names.h>14# include <openssl/params.h>15# include "prov/providercommon.h"1617/* Internal flags that can be queried */18#define PROV_DIGEST_FLAG_XOF 0x000119#define PROV_DIGEST_FLAG_ALGID_ABSENT 0x00022021# ifdef __cplusplus22extern "C" {23# endif2425#define PROV_FUNC_DIGEST_GET_PARAM(name, blksize, dgstsize, flags) \26static OSSL_FUNC_digest_get_params_fn name##_get_params; \27static int name##_get_params(OSSL_PARAM params[]) \28{ \29return ossl_digest_default_get_params(params, blksize, dgstsize, flags); \30}3132#define PROV_DISPATCH_FUNC_DIGEST_GET_PARAMS(name) \33{ OSSL_FUNC_DIGEST_GET_PARAMS, (void (*)(void))name##_get_params }, \34{ OSSL_FUNC_DIGEST_GETTABLE_PARAMS, \35(void (*)(void))ossl_digest_default_gettable_params }3637# define PROV_FUNC_DIGEST_FINAL(name, dgstsize, fin) \38static OSSL_FUNC_digest_final_fn name##_internal_final; \39static int name##_internal_final(void *ctx, unsigned char *out, size_t *outl, \40size_t outsz) \41{ \42if (ossl_prov_is_running() && outsz >= dgstsize && fin(out, ctx)) { \43*outl = dgstsize; \44return 1; \45} \46return 0; \47}4849# define PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_START( \50name, CTX, blksize, dgstsize, flags, upd, fin) \51static OSSL_FUNC_digest_newctx_fn name##_newctx; \52static OSSL_FUNC_digest_freectx_fn name##_freectx; \53static OSSL_FUNC_digest_dupctx_fn name##_dupctx; \54static void *name##_newctx(void *prov_ctx) \55{ \56CTX *ctx = ossl_prov_is_running() ? OPENSSL_zalloc(sizeof(*ctx)) : NULL; \57return ctx; \58} \59static void name##_freectx(void *vctx) \60{ \61CTX *ctx = (CTX *)vctx; \62OPENSSL_clear_free(ctx, sizeof(*ctx)); \63} \64static void *name##_dupctx(void *ctx) \65{ \66CTX *in = (CTX *)ctx; \67CTX *ret = ossl_prov_is_running() ? OPENSSL_malloc(sizeof(*ret)) : NULL; \68if (ret != NULL) \69*ret = *in; \70return ret; \71} \72static void name##_copyctx(void *voutctx, void *vinctx) \73{ \74CTX *outctx = (CTX *)voutctx; \75CTX *inctx = (CTX *)vinctx; \76*outctx = *inctx; \77} \78PROV_FUNC_DIGEST_FINAL(name, dgstsize, fin) \79PROV_FUNC_DIGEST_GET_PARAM(name, blksize, dgstsize, flags) \80const OSSL_DISPATCH ossl_##name##_functions[] = { \81{ OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))name##_newctx }, \82{ OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))upd }, \83{ OSSL_FUNC_DIGEST_FINAL, (void (*)(void))name##_internal_final }, \84{ OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))name##_freectx }, \85{ OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))name##_dupctx }, \86{ OSSL_FUNC_DIGEST_COPYCTX, (void (*)(void))name##_copyctx }, \87PROV_DISPATCH_FUNC_DIGEST_GET_PARAMS(name)8889# define PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END \90{ 0, NULL } \91};9293# define IMPLEMENT_digest_functions( \94name, CTX, blksize, dgstsize, flags, init, upd, fin) \95static OSSL_FUNC_digest_init_fn name##_internal_init; \96static int name##_internal_init(void *ctx, \97ossl_unused const OSSL_PARAM params[]) \98{ \99return ossl_prov_is_running() && init(ctx); \100} \101PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_START(name, CTX, blksize, dgstsize, flags, \102upd, fin), \103{ OSSL_FUNC_DIGEST_INIT, (void (*)(void))name##_internal_init }, \104PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END105106# define IMPLEMENT_digest_functions_with_settable_ctx( \107name, CTX, blksize, dgstsize, flags, init, upd, fin, \108settable_ctx_params, set_ctx_params) \109static OSSL_FUNC_digest_init_fn name##_internal_init; \110static int name##_internal_init(void *ctx, const OSSL_PARAM params[]) \111{ \112return ossl_prov_is_running() \113&& init(ctx) \114&& set_ctx_params(ctx, params); \115} \116PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_START(name, CTX, blksize, dgstsize, flags, \117upd, fin), \118{ OSSL_FUNC_DIGEST_INIT, (void (*)(void))name##_internal_init }, \119{ OSSL_FUNC_DIGEST_SETTABLE_CTX_PARAMS, (void (*)(void))settable_ctx_params }, \120{ OSSL_FUNC_DIGEST_SET_CTX_PARAMS, (void (*)(void))set_ctx_params }, \121PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END122123124const OSSL_PARAM *ossl_digest_default_gettable_params(void *provctx);125int ossl_digest_default_get_params(OSSL_PARAM params[], size_t blksz,126size_t paramsz, unsigned long flags);127128# ifdef __cplusplus129}130# endif131132#endif /* OSSL_PROVIDERS_DIGESTCOMMON_H */133134135