cleanup provider digests
[openssl.git] / providers / common / digests / sha3_prov.c
index 17b15b7ca22f86e20d12adac7c550c3c077b4393..0563d0cfc196a3dbf204fcd59b08167aefe1b47f 100644 (file)
@@ -7,14 +7,16 @@
  * https://www.openssl.org/source/license.html
  */
 
-#include <openssl/core_names.h>
 #include <string.h>
+#include <openssl/core_names.h>
 #include <openssl/crypto.h>
 #include <openssl/evp.h>
 #include <openssl/params.h>
+#include <openssl/err.h>
 #include "internal/sha3.h"
-#include "internal/core_mkdigest.h"
+#include "internal/digestcommon.h"
 #include "internal/provider_algs.h"
+#include "internal/providercommonerr.h"
 
 /*
  * Forward declaration of any unique methods implemented here. This is not strictly
@@ -168,88 +170,64 @@ static PROV_SHA3_METHOD shake_s390x_md =
     s390x_shake_final
 };
 
-# define SHA3_SET_MD(uname, typ) \
-    if (S390_SHA3_CAPABLE(uname)) { \
-        ctx->pad = S390X_##uname; \
-        ctx->meth = typ##_s390x_md; \
-    } else { \
-        ctx->meth = sha3_generic_md; \
+# define SHA3_SET_MD(uname, typ)                                               \
+    if (S390_SHA3_CAPABLE(uname)) {                                            \
+        ctx->pad = S390X_##uname;                                              \
+        ctx->meth = typ##_s390x_md;                                            \
+    } else {                                                                   \
+        ctx->meth = sha3_generic_md;                                           \
     }
 #else
 # define SHA3_SET_MD(uname, typ) ctx->meth = sha3_generic_md;
 #endif /* S390_SHA3 */
 
-#define SHA3_newctx(typ, uname, name, bitlen, pad) \
-static OSSL_OP_digest_newctx_fn name##_newctx; \
-static void *name##_newctx(void *provctx) \
-{ \
-    KECCAK1600_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx)); \
- \
-    if (ctx == NULL) \
-        return NULL; \
-    sha3_init(ctx, pad, bitlen); \
-    SHA3_SET_MD(uname, typ) \
-    return ctx; \
+#define SHA3_newctx(typ, uname, name, bitlen, pad)                             \
+static OSSL_OP_digest_newctx_fn name##_newctx;                                 \
+static void *name##_newctx(void *provctx)                                      \
+{                                                                              \
+    KECCAK1600_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx));                        \
                                                                              \
+    if (ctx == NULL)                                                           \
+        return NULL;                                                           \
+    sha3_init(ctx, pad, bitlen);                                               \
+    SHA3_SET_MD(uname, typ)                                                    \
+    return ctx;                                                                \
 }
 
-#define KMAC_newctx(uname, bitlen, pad) \
-static OSSL_OP_digest_newctx_fn uname##_newctx; \
-static void *uname##_newctx(void *provctx) \
-{ \
-    KECCAK1600_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx)); \
- \
-    if (ctx == NULL) \
-        return NULL; \
-    keccak_kmac_init(ctx, pad, bitlen); \
-    ctx->meth = sha3_generic_md; \
-    return ctx; \
+#define KMAC_newctx(uname, bitlen, pad)                                        \
+static OSSL_OP_digest_newctx_fn uname##_newctx;                                \
+static void *uname##_newctx(void *provctx)                                     \
+{                                                                              \
+    KECCAK1600_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx));                        \
                                                                              \
+    if (ctx == NULL)                                                           \
+        return NULL;                                                           \
+    keccak_kmac_init(ctx, pad, bitlen);                                        \
+    ctx->meth = sha3_generic_md;                                               \
+    return ctx;                                                                \
 }
 
-#define OSSL_FUNC_SHA3_DIGEST(name, bitlen, blksize, dgstsize, flags,   \
-                              stparamtypes, stparams)                   \
-static OSSL_OP_digest_get_params_fn name##_get_params;                  \
-static OSSL_OP_digest_gettable_params_fn name##_gettable_params;        \
-static const OSSL_PARAM known_##name##_gettable_params[] = {            \
-    {OSSL_DIGEST_PARAM_BLOCK_SIZE, OSSL_PARAM_INTEGER,                  \
-     NULL, sizeof(int), 0},                                             \
-    {OSSL_DIGEST_PARAM_SIZE, OSSL_PARAM_INTEGER, NULL, sizeof(int), 0}, \
-    {OSSL_DIGEST_PARAM_FLAGS, OSSL_PARAM_INTEGER,                       \
-     NULL, sizeof(unsigned long), 0},                                   \
-    OSSL_PARAM_END                                                      \
-};                                                                      \
-static const OSSL_PARAM *name##_gettable_params(void)                   \
-{                                                                       \
-    return known_##name##_gettable_params;                              \
-}                                                                       \
-static int name##_get_params(OSSL_PARAM params[])                       \
-{                                                                       \
-    OSSL_PARAM *p = NULL;                                               \
-                                                                        \
-    p = OSSL_PARAM_locate(params, OSSL_DIGEST_PARAM_BLOCK_SIZE);        \
-    if (p != NULL && !OSSL_PARAM_set_int(p, (blksize)))                 \
-        return 0;                                                       \
-    p = OSSL_PARAM_locate(params, OSSL_DIGEST_PARAM_SIZE);              \
-    if (p != NULL && !OSSL_PARAM_set_int(p, (dgstsize)))                \
-        return 0;                                                       \
-    p = OSSL_PARAM_locate(params, OSSL_DIGEST_PARAM_FLAGS);             \
-    if (p != NULL && !OSSL_PARAM_set_ulong(p, (flags)))                 \
-        return 0;                                                       \
-    return 1;                                                           \
-}                                                                       \
-const OSSL_DISPATCH 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 },       \
-    { OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))keccak_dupctx },         \
-    { OSSL_FUNC_DIGEST_GET_PARAMS, (void (*)(void))name##_get_params }, \
-    { OSSL_FUNC_DIGEST_GETTABLE_PARAMS,                                 \
-      (void (*)(void))name##_gettable_params },                         \
-    { OSSL_FUNC_DIGEST_SET_CTX_PARAMS, (void (*)(void))stparams },      \
-    { OSSL_FUNC_DIGEST_SETTABLE_CTX_PARAMS,                             \
-      (void (*)(void))stparamtypes },                                   \
-OSSL_FUNC_DIGEST_CONSTRUCT_END
+#define PROV_FUNC_SHA3_DIGEST_COMMON(name, bitlen, blksize, dgstsize, flags)   \
+PROV_FUNC_DIGEST_GET_PARAM(name, blksize, dgstsize, flags)                     \
+const OSSL_DISPATCH 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 },              \
+    { OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))keccak_dupctx },                \
+    PROV_DISPATCH_FUNC_DIGEST_GET_PARAMS(name)
+
+#define PROV_FUNC_SHA3_DIGEST(name, bitlen, blksize, dgstsize, flags)          \
+    PROV_FUNC_SHA3_DIGEST_COMMON(name, bitlen, blksize, dgstsize, flags),      \
+    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_SET_CTX_PARAMS, (void (*)(void))shake_set_ctx_params }, \
+    { OSSL_FUNC_DIGEST_SETTABLE_CTX_PARAMS,                                    \
+     (void (*)(void))shake_settable_ctx_params },                              \
+    PROV_DISPATCH_FUNC_DIGEST_CONSTRUCT_END
 
 static void keccak_freectx(void *vctx)
 {
@@ -271,7 +249,6 @@ static const OSSL_PARAM known_shake_settable_ctx_params[] = {
     {OSSL_DIGEST_PARAM_SSL3_MS, OSSL_PARAM_OCTET_STRING, NULL, 0, 0},
     OSSL_PARAM_END
 };
-
 static const OSSL_PARAM *shake_settable_ctx_params(void)
 {
     return known_shake_settable_ctx_params;
@@ -284,37 +261,45 @@ static int shake_set_ctx_params(void *vctx, const OSSL_PARAM params[])
 
     if (ctx != NULL && params != NULL) {
         p = OSSL_PARAM_locate_const(params, OSSL_DIGEST_PARAM_XOFLEN);
-        if (p != NULL && !OSSL_PARAM_get_size_t(p, &ctx->md_size))
+        if (p != NULL && !OSSL_PARAM_get_size_t(p, &ctx->md_size)) {
+            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
             return 0;
+        }
         return 1;
     }
     return 0; /* Null Parameter */
 }
 
-#define SHA3(bitlen) \
-    SHA3_newctx(sha3, SHA3_##bitlen, sha3_##bitlen, bitlen, '\x06') \
-    OSSL_FUNC_SHA3_DIGEST(sha3_##bitlen, bitlen, \
-                          SHA3_BLOCKSIZE(bitlen), SHA3_MDSIZE(bitlen), \
-                          EVP_MD_FLAG_DIGALGID_ABSENT, NULL, NULL)
-
-#define SHAKE(bitlen) \
-    SHA3_newctx(shake, SHAKE_##bitlen, shake_##bitlen, bitlen, '\x1f') \
-    OSSL_FUNC_SHA3_DIGEST(shake_##bitlen, bitlen, \
-                          SHA3_BLOCKSIZE(bitlen), SHA3_MDSIZE(bitlen), \
-                          EVP_MD_FLAG_XOF, \
-                          shake_settable_ctx_params, shake_set_ctx_params)
-#define KMAC(bitlen) \
-    KMAC_newctx(keccak_kmac_##bitlen, bitlen, '\x04') \
-    OSSL_FUNC_SHA3_DIGEST(keccak_kmac_##bitlen, bitlen, \
-                          SHA3_BLOCKSIZE(bitlen), KMAC_MDSIZE(bitlen), \
-                          EVP_MD_FLAG_XOF, \
-                          shake_settable_ctx_params, shake_set_ctx_params)
-
-SHA3(224)
-SHA3(256)
-SHA3(384)
-SHA3(512)
-SHAKE(128)
-SHAKE(256)
-KMAC(128)
-KMAC(256)
+#define IMPLEMENT_SHA3_functions(bitlen)                                       \
+    SHA3_newctx(sha3, SHA3_##bitlen, sha3_##bitlen, bitlen, '\x06')            \
+    PROV_FUNC_SHA3_DIGEST(sha3_##bitlen, bitlen,                               \
+                          SHA3_BLOCKSIZE(bitlen), SHA3_MDSIZE(bitlen),         \
+                          EVP_MD_FLAG_DIGALGID_ABSENT)
+
+#define IMPLEMENT_SHAKE_functions(bitlen)                                      \
+    SHA3_newctx(shake, SHAKE_##bitlen, shake_##bitlen, bitlen, '\x1f')         \
+    PROV_FUNC_SHAKE_DIGEST(shake_##bitlen, bitlen,                             \
+                          SHA3_BLOCKSIZE(bitlen), SHA3_MDSIZE(bitlen),         \
+                          EVP_MD_FLAG_XOF)
+#define IMPLEMENT_KMAC_functions(bitlen)                                       \
+    KMAC_newctx(keccak_kmac_##bitlen, bitlen, '\x04')                          \
+    PROV_FUNC_SHAKE_DIGEST(keccak_kmac_##bitlen, bitlen,                       \
+                           SHA3_BLOCKSIZE(bitlen), KMAC_MDSIZE(bitlen),        \
+                           EVP_MD_FLAG_XOF)
+
+/* sha3_224_functions */
+IMPLEMENT_SHA3_functions(224)
+/* sha3_256_functions */
+IMPLEMENT_SHA3_functions(256)
+/* sha3_384_functions */
+IMPLEMENT_SHA3_functions(384)
+/* sha3_512_functions */
+IMPLEMENT_SHA3_functions(512)
+/* shake_128_functions */
+IMPLEMENT_SHAKE_functions(128)
+/* shake_256_functions */
+IMPLEMENT_SHAKE_functions(256)
+/* keccak_kmac_128_functions */
+IMPLEMENT_KMAC_functions(128)
+/* keccak_kmac_256_functions */
+IMPLEMENT_KMAC_functions(256)