diff --git a/SymCryptProvider/src/digests/p_scossl_digest_common.c b/SymCryptProvider/src/digests/p_scossl_digest_common.c index 346c739..53a8fdd 100644 --- a/SymCryptProvider/src/digests/p_scossl_digest_common.c +++ b/SymCryptProvider/src/digests/p_scossl_digest_common.c @@ -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) { diff --git a/SymCryptProvider/src/digests/p_scossl_digest_common.h b/SymCryptProvider/src/digests/p_scossl_digest_common.h index e88696d..f0b1545 100644 --- a/SymCryptProvider/src/digests/p_scossl_digest_common.h +++ b/SymCryptProvider/src/digests/p_scossl_digest_common.h @@ -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); @@ -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)); \ @@ -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}};