]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
hmacdrbg_kdf: convert to generated OSSL_PARAM parser
authorPauli <ppzgs1@gmail.com>
Wed, 2 Jul 2025 07:19:43 +0000 (17:19 +1000)
committerTomas Mraz <tomas@openssl.org>
Thu, 31 Jul 2025 18:21:25 +0000 (20:21 +0200)
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/27923)

providers/implementations/kdfs/hmacdrbg_kdf.c.in

index 9ed214c3da468c82a701ff4e8f824fd11dfe8ac1..effadd01291d201bf1bc552c4042f25d2092d289 100644 (file)
@@ -6,6 +6,9 @@
  * in the file LICENSE in the source distribution or at
  * https://www.openssl.org/source/license.html
  */
+{-
+use OpenSSL::paramnames qw(produce_param_decoder);
+-}
 
 #include <stdlib.h>
 #include <string.h>
@@ -14,6 +17,7 @@
 #include <openssl/kdf.h>
 #include <openssl/proverr.h>
 #include <openssl/core_names.h>
+#include "internal/common.h"
 #include "prov/providercommon.h"
 #include "prov/implementations.h"
 #include "prov/hmac_drbg.h"
@@ -136,27 +140,34 @@ static int hmac_drbg_kdf_derive(void *vctx, unsigned char *out, size_t outlen,
     return ossl_drbg_hmac_generate(drbg, out, outlen, NULL, 0);
 }
 
+{- produce_param_decoder('hmac_drbg_kdf_get_ctx_params',
+                         (['KDF_PARAM_MAC',    'mac',    'utf8_string'],
+                          ['KDF_PARAM_DIGEST', 'digest', 'utf8_string'],
+                         )); -}
+
 static int hmac_drbg_kdf_get_ctx_params(void *vctx, OSSL_PARAM params[])
 {
     KDF_HMAC_DRBG *hmac = (KDF_HMAC_DRBG *)vctx;
     PROV_DRBG_HMAC *drbg = &hmac->base;
     const char *name;
     const EVP_MD *md;
-    OSSL_PARAM *p;
+    struct hmac_drbg_kdf_get_ctx_params_st p;
+
+    if (hmac == NULL || !hmac_drbg_kdf_get_ctx_params_decoder(params, &p))
+        return 0;
 
-    p = OSSL_PARAM_locate(params, OSSL_KDF_PARAM_MAC);
-    if (p != NULL) {
+    if (p.mac != NULL) {
         if (drbg->ctx == NULL)
             return 0;
         name = EVP_MAC_get0_name(EVP_MAC_CTX_get0_mac(drbg->ctx));
-        if (!OSSL_PARAM_set_utf8_string(p, name))
+        if (!OSSL_PARAM_set_utf8_string(p.mac, name))
             return 0;
     }
 
-    p = OSSL_PARAM_locate(params, OSSL_KDF_PARAM_DIGEST);
-    if (p != NULL) {
+    if (p.digest != NULL) {
         md = ossl_prov_digest_md(&drbg->digest);
-        if (md == NULL || !OSSL_PARAM_set_utf8_string(p, EVP_MD_get0_name(md)))
+        if (md == NULL
+                || !OSSL_PARAM_set_utf8_string(p.digest, EVP_MD_get0_name(md)))
             return 0;
     }
     return 1;
@@ -165,14 +176,17 @@ static int hmac_drbg_kdf_get_ctx_params(void *vctx, OSSL_PARAM params[])
 static const OSSL_PARAM *hmac_drbg_kdf_gettable_ctx_params(
     ossl_unused void *vctx, ossl_unused void *p_ctx)
 {
-    static const OSSL_PARAM known_gettable_ctx_params[] = {
-        OSSL_PARAM_utf8_string(OSSL_KDF_PARAM_MAC, NULL, 0),
-        OSSL_PARAM_utf8_string(OSSL_KDF_PARAM_DIGEST, NULL, 0),
-        OSSL_PARAM_END
-    };
-    return known_gettable_ctx_params;
+    return hmac_drbg_kdf_get_ctx_params_list;
 }
 
+{- produce_param_decoder('hmac_drbg_kdf_set_ctx_params',
+                         (['KDF_PARAM_PROPERTIES',       'propq',  'utf8_string'],
+                          ['ALG_PARAM_ENGINE',           'engine', 'utf8_string'],
+                          ['KDF_PARAM_DIGEST',           'digest', 'utf8_string'],
+                          ['KDF_PARAM_HMACDRBG_ENTROPY', 'ent',    'octet_string'],
+                          ['KDF_PARAM_HMACDRBG_NONCE',   'nonce',  'octet_string'],
+                         )); -}
+
 static int hmac_drbg_kdf_set_ctx_params(void *vctx,
                                         const OSSL_PARAM params[])
 {
@@ -180,17 +194,16 @@ static int hmac_drbg_kdf_set_ctx_params(void *vctx,
     PROV_DRBG_HMAC *drbg = &hmac->base;
     OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(hmac->provctx);
     const EVP_MD *md;
-    const OSSL_PARAM *p;
+    struct hmac_drbg_kdf_set_ctx_params_st p;
     void *ptr = NULL;
     size_t size = 0;
     int md_size;
 
-    if (ossl_param_is_empty(params))
-        return 1;
+    if (hmac == NULL || !hmac_drbg_kdf_set_ctx_params_decoder(params, &p))
+        return 0;
 
-    p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_HMACDRBG_ENTROPY);
-    if (p != NULL) {
-        if (!OSSL_PARAM_get_octet_string(p, &ptr, 0, &size))
+    if (p.ent != NULL) {
+        if (!OSSL_PARAM_get_octet_string(p.ent, &ptr, 0, &size))
             return 0;
         OPENSSL_free(hmac->entropy);
         hmac->entropy = ptr;
@@ -199,9 +212,8 @@ static int hmac_drbg_kdf_set_ctx_params(void *vctx,
         ptr = NULL;
     }
 
-    p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_HMACDRBG_NONCE);
-    if (p != NULL) {
-        if (!OSSL_PARAM_get_octet_string(p, &ptr, 0, &size))
+    if (p.nonce != NULL) {
+        if (!OSSL_PARAM_get_octet_string(p.nonce, &ptr, 0, &size))
             return 0;
         OPENSSL_free(hmac->nonce);
         hmac->nonce = ptr;
@@ -209,9 +221,9 @@ static int hmac_drbg_kdf_set_ctx_params(void *vctx,
         hmac->init = 0;
     }
 
-    p = OSSL_PARAM_locate_const(params, OSSL_ALG_PARAM_DIGEST);
-    if (p != NULL) {
-        if (!ossl_prov_digest_load_from_params(&drbg->digest, params, libctx))
+    if (p.digest != NULL) {
+        if (!ossl_prov_digest_load(&drbg->digest, p.digest,
+                                   p.propq, p.engine, libctx))
             return 0;
 
         /* Confirm digest is allowed. Allow all digests that are not XOF */
@@ -226,8 +238,9 @@ static int hmac_drbg_kdf_set_ctx_params(void *vctx,
                 return 0;
             drbg->blocklen = (size_t)md_size;
         }
-        return ossl_prov_macctx_load_from_params(&drbg->ctx, params,
-                                                 "HMAC", NULL, NULL, libctx);
+        if (!ossl_prov_macctx_load(&drbg->ctx, NULL, NULL, p.digest, p.propq,
+                                   p.engine, "HMAC", NULL, NULL, libctx))
+            return 0;
     }
     return 1;
 }
@@ -235,14 +248,7 @@ static int hmac_drbg_kdf_set_ctx_params(void *vctx,
 static const OSSL_PARAM *hmac_drbg_kdf_settable_ctx_params(
     ossl_unused void *vctx, ossl_unused void *p_ctx)
 {
-    static const OSSL_PARAM known_settable_ctx_params[] = {
-        OSSL_PARAM_octet_string(OSSL_KDF_PARAM_HMACDRBG_ENTROPY, NULL, 0),
-        OSSL_PARAM_octet_string(OSSL_KDF_PARAM_HMACDRBG_NONCE, NULL, 0),
-        OSSL_PARAM_utf8_string(OSSL_KDF_PARAM_DIGEST, NULL, 0),
-        OSSL_PARAM_utf8_string(OSSL_KDF_PARAM_PROPERTIES, NULL, 0),
-        OSSL_PARAM_END
-    };
-    return known_settable_ctx_params;
+    return hmac_drbg_kdf_set_ctx_params_list;
 }
 
 const OSSL_DISPATCH ossl_kdf_hmac_drbg_functions[] = {