1414#include <openssl/params.h>
1515#include <openssl/err.h>
1616#include <openssl/proverr.h>
17+ #include "internal/numbers.h"
1718#include "internal/sha3.h"
1819#include "prov/digestcommon.h"
1920#include "prov/implementations.h"
@@ -112,6 +113,10 @@ static int keccak_final(void *vctx, unsigned char *out, size_t *outl,
112113
113114 if (!ossl_prov_is_running ())
114115 return 0 ;
116+ if (ctx -> md_size == SIZE_MAX ) {
117+ ERR_raise (ERR_LIB_PROV , PROV_R_INVALID_DIGEST_LENGTH );
118+ return 0 ;
119+ }
115120 if (outlen > 0 )
116121 ret = ctx -> meth .final (ctx , out , ctx -> md_size );
117122
@@ -474,7 +479,7 @@ static void *name##_newctx(void *provctx) \
474479 return ctx; \
475480}
476481
477- #define SHAKE_newctx (typ , uname , name , bitlen , pad ) \
482+ #define SHAKE_newctx (typ , uname , name , bitlen , mdlen , pad ) \
478483static OSSL_FUNC_digest_newctx_fn name##_newctx; \
479484static void *name##_newctx(void *provctx) \
480485{ \
@@ -483,7 +488,9 @@ static void *name##_newctx(void *provctx) \
483488 \
484489 if (ctx == NULL) \
485490 return NULL; \
486- ossl_sha3_init(ctx, pad, bitlen); \
491+ ossl_keccak_init(ctx, pad, bitlen, mdlen); \
492+ if (mdlen == 0) \
493+ ctx->md_size = SIZE_MAX; \
487494 SHAKE_SET_MD(uname, typ) \
488495 return ctx; \
489496}
@@ -497,7 +504,7 @@ static void *uname##_newctx(void *provctx) \
497504 \
498505 if (ctx == NULL) \
499506 return NULL; \
500- ossl_keccak_kmac_init (ctx, pad, bitlen); \
507+ ossl_keccak_init (ctx, pad, bitlen, 2 * bitlen); \
501508 KMAC_SET_MD(bitlen) \
502509 return ctx; \
503510}
@@ -585,10 +592,12 @@ static int shake_set_ctx_params(void *vctx, const OSSL_PARAM params[])
585592 SHA3_FLAGS)
586593
587594#define IMPLEMENT_SHAKE_functions (bitlen ) \
588- SHAKE_newctx(shake, SHAKE_##bitlen, shake_##bitlen, bitlen, '\x1f') \
595+ SHAKE_newctx(shake, SHAKE_##bitlen, shake_##bitlen, bitlen, \
596+ 0 /* no default md length */ , '\x1f ') \
589597 PROV_FUNC_SHAKE_DIGEST(shake_##bitlen, bitlen, \
590- SHA3_BLOCKSIZE(bitlen), SHA3_MDSIZE(bitlen), \
598+ SHA3_BLOCKSIZE(bitlen), 0, \
591599 SHAKE_FLAGS)
600+
592601#define IMPLEMENT_KMAC_functions (bitlen ) \
593602 KMAC_newctx(keccak_kmac_##bitlen, bitlen, '\x04') \
594603 PROV_FUNC_SHAKE_DIGEST(keccak_kmac_##bitlen, bitlen, \
0 commit comments