Skip to content

Commit 855de79

Browse files
authored
Add digest context copy function (#158)
* Support new digest copy context function * Only compile new functions where supported
1 parent e453f08 commit 855de79

2 files changed

Lines changed: 43 additions & 11 deletions

File tree

SymCryptProvider/src/digests/p_scossl_digest_common.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,17 @@ SCOSSL_DIGEST_CTX *p_scossl_digest_dupctx(SCOSSL_DIGEST_CTX *ctx)
5757
return copyCtx;
5858
}
5959

60+
#ifdef OSSL_FUNC_DIGEST_COPYCTX
61+
_Use_decl_annotations_
62+
void p_scossl_digest_copy_ctx(SCOSSL_DIGEST_CTX *dstCtx, SCOSSL_DIGEST_CTX *srcCtx)
63+
{
64+
dstCtx->pHash = srcCtx->pHash;
65+
dstCtx->xofLen = srcCtx->xofLen;
66+
67+
srcCtx->pHash->stateCopyFunc(srcCtx->pState, dstCtx->pState);
68+
}
69+
#endif
70+
6071
_Use_decl_annotations_
6172
SCOSSL_STATUS p_scossl_digest_get_params(OSSL_PARAM params[], size_t size, size_t blocksize, UINT32 flags)
6273
{

SymCryptProvider/src/digests/p_scossl_digest_common.h

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ typedef struct
2323

2424
SCOSSL_DIGEST_CTX *p_scossl_digest_dupctx(_In_ SCOSSL_DIGEST_CTX *ctx);
2525
void p_scossl_digest_freectx(_Inout_ SCOSSL_DIGEST_CTX *ctx);
26+
#ifdef OSSL_FUNC_DIGEST_COPYCTX
27+
void p_scossl_digest_copy_ctx(_Inout_ SCOSSL_DIGEST_CTX *dstCtx, _In_ SCOSSL_DIGEST_CTX *srcCtx);
28+
#endif
2629

2730
SCOSSL_STATUS p_scossl_digest_update(_Inout_ SCOSSL_DIGEST_CTX *ctx,
2831
_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,
3336
SCOSSL_STATUS p_scossl_digest_get_params(_Inout_ OSSL_PARAM params[], size_t size, size_t blocksize, UINT32 flags);
3437
const OSSL_PARAM *p_scossl_digest_gettable_params(ossl_unused void *ctx, ossl_unused void *provctx);
3538

36-
#define SCOSSL_DIGEST_FUNCTIONS_COMMON(alg, dispatch_name, flags) \
39+
#define IMPLEMENT_SCOSSL_DIGEST_FUNCTIONS_COMMON(alg, dispatch_name, flags) \
3740
static SCOSSL_DIGEST_CTX *p_scossl_##dispatch_name##_newctx(ossl_unused void *prov_ctx) \
3841
{ \
3942
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
7477
SymCryptHashResultSize(SymCrypt##alg##Algorithm), \
7578
SymCryptHashInputBlockSize(SymCrypt##alg##Algorithm), \
7679
flags); \
77-
} \
78-
\
79-
const OSSL_DISPATCH p_scossl_##dispatch_name##_functions[] = { \
80-
{OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))p_scossl_##dispatch_name##_newctx}, \
81-
{OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))p_scossl_digest_freectx}, \
82-
{OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))p_scossl_digest_dupctx}, \
83-
{OSSL_FUNC_DIGEST_GET_PARAMS, (void (*)(void))p_scossl_##dispatch_name##_get_params}, \
84-
{OSSL_FUNC_DIGEST_GETTABLE_PARAMS, (void (*)(void))p_scossl_digest_gettable_params}, \
85-
{OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))p_scossl_digest_update}, \
86-
{OSSL_FUNC_DIGEST_DIGEST, (void (*)(void))p_scossl_##dispatch_name##_digest},
80+
}
81+
82+
#ifdef OSSL_FUNC_DIGEST_COPYCTX
83+
#define SCOSSL_DIGEST_FUNCTIONS_COMMON(alg, dispatch_name, flags) \
84+
IMPLEMENT_SCOSSL_DIGEST_FUNCTIONS_COMMON(alg, dispatch_name, flags) \
85+
\
86+
const OSSL_DISPATCH p_scossl_##dispatch_name##_functions[] = { \
87+
{OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))p_scossl_##dispatch_name##_newctx}, \
88+
{OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))p_scossl_digest_freectx}, \
89+
{OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))p_scossl_digest_dupctx}, \
90+
{OSSL_FUNC_DIGEST_COPYCTX, (void (*)(void))p_scossl_digest_copy_ctx}, \
91+
{OSSL_FUNC_DIGEST_GET_PARAMS, (void (*)(void))p_scossl_##dispatch_name##_get_params}, \
92+
{OSSL_FUNC_DIGEST_GETTABLE_PARAMS, (void (*)(void))p_scossl_digest_gettable_params}, \
93+
{OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))p_scossl_digest_update}, \
94+
{OSSL_FUNC_DIGEST_DIGEST, (void (*)(void))p_scossl_##dispatch_name##_digest},
95+
#else
96+
#define SCOSSL_DIGEST_FUNCTIONS_COMMON(alg, dispatch_name, flags) \
97+
IMPLEMENT_SCOSSL_DIGEST_FUNCTIONS_COMMON(alg, dispatch_name, flags) \
98+
\
99+
const OSSL_DISPATCH p_scossl_##dispatch_name##_functions[] = { \
100+
{OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))p_scossl_##dispatch_name##_newctx}, \
101+
{OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))p_scossl_digest_freectx}, \
102+
{OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))p_scossl_digest_dupctx}, \
103+
{OSSL_FUNC_DIGEST_GET_PARAMS, (void (*)(void))p_scossl_##dispatch_name##_get_params}, \
104+
{OSSL_FUNC_DIGEST_GETTABLE_PARAMS, (void (*)(void))p_scossl_digest_gettable_params}, \
105+
{OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))p_scossl_digest_update}, \
106+
{OSSL_FUNC_DIGEST_DIGEST, (void (*)(void))p_scossl_##dispatch_name##_digest},
107+
#endif
87108

88109
#define SCOSSL_DIGEST_FUNCTIONS_END \
89110
{0, NULL}};

0 commit comments

Comments
 (0)