Path: blob/main/crypto/openssl/providers/implementations/include/prov/digestcommon.h
105418 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{ \35OSSL_FUNC_DIGEST_GETTABLE_PARAMS, \36(void (*)(void))ossl_digest_default_gettable_params \37}3839#define PROV_FUNC_DIGEST_FINAL(name, dgstsize, fin) \40static OSSL_FUNC_digest_final_fn name##_internal_final; \41static int name##_internal_final(void *ctx, unsigned char *out, size_t *outl, \42size_t outsz) \43{ \44if (ossl_prov_is_running() && outsz >= dgstsize && fin(out, ctx)) { \45*outl = dgstsize; \46return 1; \47} \48return 0; \49}5051#define PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_START( \52name, CTX, blksize, dgstsize, flags, upd, fin) \53static OSSL_FUNC_digest_newctx_fn name##_newctx; \54static OSSL_FUNC_digest_freectx_fn name##_freectx; \55static OSSL_FUNC_digest_dupctx_fn name##_dupctx; \56static void *name##_newctx(void *prov_ctx) \57{ \58CTX *ctx = ossl_prov_is_running() ? OPENSSL_zalloc(sizeof(*ctx)) : NULL; \59return ctx; \60} \61static void name##_freectx(void *vctx) \62{ \63CTX *ctx = (CTX *)vctx; \64OPENSSL_clear_free(ctx, sizeof(*ctx)); \65} \66static void *name##_dupctx(void *ctx) \67{ \68CTX *in = (CTX *)ctx; \69CTX *ret = ossl_prov_is_running() ? OPENSSL_malloc(sizeof(*ret)) : NULL; \70if (ret != NULL) \71*ret = *in; \72return ret; \73} \74static void name##_copyctx(void *voutctx, void *vinctx) \75{ \76CTX *outctx = (CTX *)voutctx; \77CTX *inctx = (CTX *)vinctx; \78*outctx = *inctx; \79} \80PROV_FUNC_DIGEST_FINAL(name, dgstsize, fin) \81PROV_FUNC_DIGEST_GET_PARAM(name, blksize, dgstsize, flags) \82const OSSL_DISPATCH ossl_##name##_functions[] = { \83{ OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))name##_newctx }, \84{ OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))upd }, \85{ OSSL_FUNC_DIGEST_FINAL, (void (*)(void))name##_internal_final }, \86{ OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))name##_freectx }, \87{ OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))name##_dupctx }, \88{ OSSL_FUNC_DIGEST_COPYCTX, (void (*)(void))name##_copyctx }, \89PROV_DISPATCH_FUNC_DIGEST_GET_PARAMS(name)9091#define PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END \92{ \930, NULL \94} \95} \96;9798#define IMPLEMENT_digest_functions( \99name, CTX, blksize, dgstsize, flags, init, upd, fin) \100static OSSL_FUNC_digest_init_fn name##_internal_init; \101static int name##_internal_init(void *ctx, \102ossl_unused const OSSL_PARAM params[]) \103{ \104return ossl_prov_is_running() && init(ctx); \105} \106PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_START(name, CTX, blksize, dgstsize, flags, \107upd, fin), \108{ OSSL_FUNC_DIGEST_INIT, (void (*)(void))name##_internal_init }, \109PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END110111#define IMPLEMENT_digest_functions_with_settable_ctx( \112name, CTX, blksize, dgstsize, flags, init, upd, fin, \113settable_ctx_params, set_ctx_params) \114static OSSL_FUNC_digest_init_fn name##_internal_init; \115static int name##_internal_init(void *ctx, const OSSL_PARAM params[]) \116{ \117return ossl_prov_is_running() \118&& init(ctx) \119&& set_ctx_params(ctx, params); \120} \121PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_START(name, CTX, blksize, dgstsize, flags, \122upd, fin), \123{ OSSL_FUNC_DIGEST_INIT, (void (*)(void))name##_internal_init }, \124{ OSSL_FUNC_DIGEST_SETTABLE_CTX_PARAMS, (void (*)(void))settable_ctx_params }, \125{ OSSL_FUNC_DIGEST_SET_CTX_PARAMS, (void (*)(void))set_ctx_params }, \126PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END127128const OSSL_PARAM *ossl_digest_default_gettable_params(void *provctx);129int ossl_digest_default_get_params(OSSL_PARAM params[], size_t blksz,130size_t paramsz, unsigned long flags);131132#ifdef __cplusplus133}134#endif135136#endif /* OSSL_PROVIDERS_DIGESTCOMMON_H */137138139