]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
prov: support param argument to digest init calls
authorPauli <ppzgs1@gmail.com>
Tue, 2 Mar 2021 12:42:41 +0000 (22:42 +1000)
committerPauli <ppzgs1@gmail.com>
Thu, 11 Mar 2021 22:27:11 +0000 (08:27 +1000)
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/14383)

providers/implementations/digests/blake2_prov.c
providers/implementations/digests/sha3_prov.c
providers/implementations/include/prov/digestcommon.h

index 74ff44e6b72fdcd4e294b3dfc7941137524876c7..25342eedb83213954cff1b277304c2dee2efb80a 100644 (file)
@@ -12,9 +12,6 @@
 #include "prov/digestcommon.h"
 #include "prov/implementations.h"
 
-OSSL_FUNC_digest_init_fn ossl_blake2s256_init;
-OSSL_FUNC_digest_init_fn ossl_blake2b512_init;
-
 int ossl_blake2s256_init(void *ctx)
 {
     BLAKE2S_PARAM P;
index c8c5df41edd856b6bdeba6b0bfda6e934ffeb3a9..0db6f86be85bf86f1c5c0f6edb69db5f5cfe5813 100644 (file)
@@ -28,6 +28,7 @@
  * of the functions in the dispatch table are correct.
  */
 static OSSL_FUNC_digest_init_fn keccak_init;
+static OSSL_FUNC_digest_init_fn keccak_init_params;
 static OSSL_FUNC_digest_update_fn keccak_update;
 static OSSL_FUNC_digest_final_fn keccak_final;
 static OSSL_FUNC_digest_freectx_fn keccak_freectx;
@@ -49,7 +50,7 @@ static sha3_final_fn generic_sha3_final;
 
 #endif
 
-static int keccak_init(void *vctx)
+static int keccak_init(void *vctx, ossl_unused const OSSL_PARAM params[])
 {
     if (!ossl_prov_is_running())
         return 0;
@@ -58,6 +59,12 @@ static int keccak_init(void *vctx)
     return 1;
 }
 
+static int keccak_init_params(void *vctx, const OSSL_PARAM params[])
+{
+    return keccak_init(vctx, NULL)
+            && shake_set_ctx_params(vctx, params);
+}
+
 static int keccak_update(void *vctx, const unsigned char *inp, size_t len)
 {
     KECCAK1600_CTX *ctx = vctx;
@@ -225,7 +232,6 @@ static void *uname##_newctx(void *provctx)                                     \
 PROV_FUNC_DIGEST_GET_PARAM(name, blksize, dgstsize, flags)                     \
 const OSSL_DISPATCH ossl_##name##_functions[] = {                              \
     { OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))name##_newctx },                \
-    { OSSL_FUNC_DIGEST_INIT, (void (*)(void))keccak_init },                    \
     { OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))keccak_update },                \
     { OSSL_FUNC_DIGEST_FINAL, (void (*)(void))keccak_final },                  \
     { OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))keccak_freectx },              \
@@ -234,10 +240,12 @@ const OSSL_DISPATCH ossl_##name##_functions[] = {                              \
 
 #define PROV_FUNC_SHA3_DIGEST(name, bitlen, blksize, dgstsize, flags)          \
     PROV_FUNC_SHA3_DIGEST_COMMON(name, bitlen, blksize, dgstsize, flags),      \
+    { OSSL_FUNC_DIGEST_INIT, (void (*)(void))keccak_init },                    \
     PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END
 
 #define PROV_FUNC_SHAKE_DIGEST(name, bitlen, blksize, dgstsize, flags)         \
     PROV_FUNC_SHA3_DIGEST_COMMON(name, bitlen, blksize, dgstsize, flags),      \
+    { OSSL_FUNC_DIGEST_INIT, (void (*)(void))keccak_init_params },             \
     { OSSL_FUNC_DIGEST_SET_CTX_PARAMS, (void (*)(void))shake_set_ctx_params }, \
     { OSSL_FUNC_DIGEST_SETTABLE_CTX_PARAMS,                                    \
      (void (*)(void))shake_settable_ctx_params },                              \
index 638fe3d4a445fcfc3f830ef96eb2664039ee3df1..b0ed83648dfcd26b36b2a1a73142f6329fea0684 100644 (file)
@@ -36,7 +36,7 @@ static int name##_get_params(OSSL_PARAM params[])                              \
   (void (*)(void))ossl_digest_default_gettable_params }
 
 # define PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_START(                            \
-    name, CTX, blksize, dgstsize, flags, init, upd, fin)                       \
+    name, CTX, blksize, dgstsize, flags, upd, fin)                             \
 static OSSL_FUNC_digest_newctx_fn name##_newctx;                               \
 static OSSL_FUNC_digest_freectx_fn name##_freectx;                             \
 static OSSL_FUNC_digest_dupctx_fn name##_dupctx;                               \
@@ -58,11 +58,6 @@ static void *name##_dupctx(void *ctx)                                          \
         *ret = *in;                                                            \
     return ret;                                                                \
 }                                                                              \
-static OSSL_FUNC_digest_init_fn name##_internal_init;                          \
-static int name##_internal_init(void *ctx)                                     \
-{                                                                              \
-    return ossl_prov_is_running() ? init(ctx) : 0;                             \
-}                                                                              \
 static OSSL_FUNC_digest_final_fn name##_internal_final;                        \
 static int name##_internal_final(void *ctx, unsigned char *out, size_t *outl,  \
                                  size_t outsz)                                 \
@@ -76,7 +71,6 @@ static int name##_internal_final(void *ctx, unsigned char *out, size_t *outl,  \
 PROV_FUNC_DIGEST_GET_PARAM(name, blksize, dgstsize, flags)                     \
 const OSSL_DISPATCH ossl_##name##_functions[] = {                              \
     { OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))name##_newctx },                \
-    { OSSL_FUNC_DIGEST_INIT, (void (*)(void))name##_internal_init },           \
     { OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))upd },                          \
     { OSSL_FUNC_DIGEST_FINAL, (void (*)(void))name##_internal_final },         \
     { OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))name##_freectx },              \
@@ -89,17 +83,32 @@ const OSSL_DISPATCH ossl_##name##_functions[] = {                              \
 
 # define IMPLEMENT_digest_functions(                                           \
     name, CTX, blksize, dgstsize, flags, init, upd, fin)                       \
+static OSSL_FUNC_digest_init_fn name##_internal_init;                          \
+static int name##_internal_init(void *ctx,                                     \
+                                ossl_unused const OSSL_PARAM params[])         \
+{                                                                              \
+    return ossl_prov_is_running() && init(ctx);                                \
+}                                                                              \
 PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_START(name, CTX, blksize, dgstsize, flags, \
-                                          init, upd, fin),                     \
+                                          upd, fin),                           \
+    { OSSL_FUNC_DIGEST_INIT, (void (*)(void))name##_internal_init },           \
 PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END
 
 # define IMPLEMENT_digest_functions_with_settable_ctx(                         \
     name, CTX, blksize, dgstsize, flags, init, upd, fin,                       \
     settable_ctx_params, set_ctx_params)                                       \
+static OSSL_FUNC_digest_init_fn name##_internal_init;                          \
+static int name##_internal_init(void *ctx, const OSSL_PARAM params[])          \
+{                                                                              \
+    return ossl_prov_is_running()                                              \
+           && init(ctx)                                                        \
+           && set_ctx_params(ctx, params);                                     \
+}                                                                              \
 PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_START(name, CTX, blksize, dgstsize, flags, \
-                                          init, upd, fin),                     \
-{ OSSL_FUNC_DIGEST_SETTABLE_CTX_PARAMS, (void (*)(void))settable_ctx_params }, \
-{ OSSL_FUNC_DIGEST_SET_CTX_PARAMS, (void (*)(void))set_ctx_params },           \
+                                          upd, fin),                           \
+    { OSSL_FUNC_DIGEST_INIT, (void (*)(void))name##_internal_init },           \
+    { OSSL_FUNC_DIGEST_SETTABLE_CTX_PARAMS, (void (*)(void))settable_ctx_params }, \
+    { OSSL_FUNC_DIGEST_SET_CTX_PARAMS, (void (*)(void))set_ctx_params },       \
 PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END