From 5efbe0309346eb40fb5f3c9fb6ad8f8d67b908bd Mon Sep 17 00:00:00 2001 From: Maxwell Moyer-McKee Date: Wed, 14 Jan 2026 00:34:22 +0000 Subject: [PATCH 1/2] Support new digest copy context function --- SymCryptProvider/src/digests/p_scossl_digest_common.c | 10 ++++++++++ SymCryptProvider/src/digests/p_scossl_digest_common.h | 2 ++ 2 files changed, 12 insertions(+) diff --git a/SymCryptProvider/src/digests/p_scossl_digest_common.c b/SymCryptProvider/src/digests/p_scossl_digest_common.c index 346c7392..0971282a 100644 --- a/SymCryptProvider/src/digests/p_scossl_digest_common.c +++ b/SymCryptProvider/src/digests/p_scossl_digest_common.c @@ -57,6 +57,16 @@ SCOSSL_DIGEST_CTX *p_scossl_digest_dupctx(SCOSSL_DIGEST_CTX *ctx) return 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); +} + + _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 e88696d4..f82935dc 100644 --- a/SymCryptProvider/src/digests/p_scossl_digest_common.h +++ b/SymCryptProvider/src/digests/p_scossl_digest_common.h @@ -22,6 +22,7 @@ typedef struct } SCOSSL_DIGEST_CTX; SCOSSL_DIGEST_CTX *p_scossl_digest_dupctx(_In_ SCOSSL_DIGEST_CTX *ctx); +void p_scossl_digest_copy_ctx(_Inout_ SCOSSL_DIGEST_CTX *dstCtx, _In_ SCOSSL_DIGEST_CTX *srcCtx); void p_scossl_digest_freectx(_Inout_ SCOSSL_DIGEST_CTX *ctx); SCOSSL_STATUS p_scossl_digest_update(_Inout_ SCOSSL_DIGEST_CTX *ctx, @@ -80,6 +81,7 @@ const OSSL_PARAM *p_scossl_digest_gettable_params(ossl_unused void *ctx, ossl_un {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}, \ From 178e534895b73bdbee615c770d4564cec70cb385 Mon Sep 17 00:00:00 2001 From: Maxwell Moyer-McKee Date: Mon, 26 Jan 2026 23:27:17 +0000 Subject: [PATCH 2/2] Only compile new functions where supported --- .../src/digests/p_scossl_digest_common.c | 3 +- .../src/digests/p_scossl_digest_common.h | 45 +++++++++++++------ 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/SymCryptProvider/src/digests/p_scossl_digest_common.c b/SymCryptProvider/src/digests/p_scossl_digest_common.c index 0971282a..53a8fdd7 100644 --- a/SymCryptProvider/src/digests/p_scossl_digest_common.c +++ b/SymCryptProvider/src/digests/p_scossl_digest_common.c @@ -57,6 +57,7 @@ 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) { @@ -65,7 +66,7 @@ void p_scossl_digest_copy_ctx(SCOSSL_DIGEST_CTX *dstCtx, SCOSSL_DIGEST_CTX *srcC 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 f82935dc..f0b1545b 100644 --- a/SymCryptProvider/src/digests/p_scossl_digest_common.h +++ b/SymCryptProvider/src/digests/p_scossl_digest_common.h @@ -22,8 +22,10 @@ typedef struct } SCOSSL_DIGEST_CTX; SCOSSL_DIGEST_CTX *p_scossl_digest_dupctx(_In_ SCOSSL_DIGEST_CTX *ctx); -void p_scossl_digest_copy_ctx(_Inout_ SCOSSL_DIGEST_CTX *dstCtx, _In_ SCOSSL_DIGEST_CTX *srcCtx); 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); @@ -34,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)); \ @@ -75,17 +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_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}, + } + +#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}};