Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions SymCryptProvider/src/digests/p_scossl_digest_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,17 @@ SCOSSL_DIGEST_CTX *p_scossl_digest_dupctx(SCOSSL_DIGEST_CTX *ctx)
return copyCtx;
}

#ifdef OSSL_FUNC_DIGEST_COPYCTX
_Use_decl_annotations_
void p_scossl_digest_copy_ctx(SCOSSL_DIGEST_CTX *dstCtx, SCOSSL_DIGEST_CTX *srcCtx)
{
dstCtx->pHash = srcCtx->pHash;
dstCtx->xofLen = srcCtx->xofLen;

srcCtx->pHash->stateCopyFunc(srcCtx->pState, dstCtx->pState);
}
#endif

_Use_decl_annotations_
SCOSSL_STATUS p_scossl_digest_get_params(OSSL_PARAM params[], size_t size, size_t blocksize, UINT32 flags)
{
Expand Down
43 changes: 32 additions & 11 deletions SymCryptProvider/src/digests/p_scossl_digest_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ typedef struct

SCOSSL_DIGEST_CTX *p_scossl_digest_dupctx(_In_ SCOSSL_DIGEST_CTX *ctx);
void p_scossl_digest_freectx(_Inout_ SCOSSL_DIGEST_CTX *ctx);
#ifdef OSSL_FUNC_DIGEST_COPYCTX
void p_scossl_digest_copy_ctx(_Inout_ SCOSSL_DIGEST_CTX *dstCtx, _In_ SCOSSL_DIGEST_CTX *srcCtx);
#endif

SCOSSL_STATUS p_scossl_digest_update(_Inout_ SCOSSL_DIGEST_CTX *ctx,
_In_reads_bytes_(inl) const unsigned char *in, size_t inl);
Expand All @@ -33,7 +36,7 @@ SCOSSL_STATUS p_scossl_digest_digest(_In_ PCSYMCRYPT_HASH pHash,
SCOSSL_STATUS p_scossl_digest_get_params(_Inout_ OSSL_PARAM params[], size_t size, size_t blocksize, UINT32 flags);
const OSSL_PARAM *p_scossl_digest_gettable_params(ossl_unused void *ctx, ossl_unused void *provctx);

#define SCOSSL_DIGEST_FUNCTIONS_COMMON(alg, dispatch_name, flags) \
#define IMPLEMENT_SCOSSL_DIGEST_FUNCTIONS_COMMON(alg, dispatch_name, flags) \
static SCOSSL_DIGEST_CTX *p_scossl_##dispatch_name##_newctx(ossl_unused void *prov_ctx) \
{ \
SCOSSL_DIGEST_CTX *ctx = OPENSSL_malloc(sizeof(SCOSSL_DIGEST_CTX)); \
Expand Down Expand Up @@ -74,16 +77,34 @@ const OSSL_PARAM *p_scossl_digest_gettable_params(ossl_unused void *ctx, ossl_un
SymCryptHashResultSize(SymCrypt##alg##Algorithm), \
SymCryptHashInputBlockSize(SymCrypt##alg##Algorithm), \
flags); \
} \
\
const OSSL_DISPATCH p_scossl_##dispatch_name##_functions[] = { \
{OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))p_scossl_##dispatch_name##_newctx}, \
{OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))p_scossl_digest_freectx}, \
{OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))p_scossl_digest_dupctx}, \
{OSSL_FUNC_DIGEST_GET_PARAMS, (void (*)(void))p_scossl_##dispatch_name##_get_params}, \
{OSSL_FUNC_DIGEST_GETTABLE_PARAMS, (void (*)(void))p_scossl_digest_gettable_params}, \
{OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))p_scossl_digest_update}, \
{OSSL_FUNC_DIGEST_DIGEST, (void (*)(void))p_scossl_##dispatch_name##_digest},
}

#ifdef OSSL_FUNC_DIGEST_COPYCTX
#define SCOSSL_DIGEST_FUNCTIONS_COMMON(alg, dispatch_name, flags) \
IMPLEMENT_SCOSSL_DIGEST_FUNCTIONS_COMMON(alg, dispatch_name, flags) \
\
const OSSL_DISPATCH p_scossl_##dispatch_name##_functions[] = { \
{OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))p_scossl_##dispatch_name##_newctx}, \
{OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))p_scossl_digest_freectx}, \
{OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))p_scossl_digest_dupctx}, \
{OSSL_FUNC_DIGEST_COPYCTX, (void (*)(void))p_scossl_digest_copy_ctx}, \
{OSSL_FUNC_DIGEST_GET_PARAMS, (void (*)(void))p_scossl_##dispatch_name##_get_params}, \
{OSSL_FUNC_DIGEST_GETTABLE_PARAMS, (void (*)(void))p_scossl_digest_gettable_params}, \
{OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))p_scossl_digest_update}, \
{OSSL_FUNC_DIGEST_DIGEST, (void (*)(void))p_scossl_##dispatch_name##_digest},
#else
#define SCOSSL_DIGEST_FUNCTIONS_COMMON(alg, dispatch_name, flags) \
IMPLEMENT_SCOSSL_DIGEST_FUNCTIONS_COMMON(alg, dispatch_name, flags) \
\
const OSSL_DISPATCH p_scossl_##dispatch_name##_functions[] = { \
{OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))p_scossl_##dispatch_name##_newctx}, \
{OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))p_scossl_digest_freectx}, \
{OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))p_scossl_digest_dupctx}, \
{OSSL_FUNC_DIGEST_GET_PARAMS, (void (*)(void))p_scossl_##dispatch_name##_get_params}, \
{OSSL_FUNC_DIGEST_GETTABLE_PARAMS, (void (*)(void))p_scossl_digest_gettable_params}, \
{OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))p_scossl_digest_update}, \
{OSSL_FUNC_DIGEST_DIGEST, (void (*)(void))p_scossl_##dispatch_name##_digest},
#endif

#define SCOSSL_DIGEST_FUNCTIONS_END \
{0, NULL}};
Expand Down