]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
chacha20: convert to using genreated param name decoders
authorPauli <paul.dale@oracle.com>
Fri, 19 Sep 2025 01:25:19 +0000 (11:25 +1000)
committerTomas Mraz <tomas@openssl.org>
Wed, 1 Oct 2025 15:45:46 +0000 (17:45 +0200)
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/28616)

providers/implementations/ciphers/cipher_chacha20.c.in

index b5663384f3229a47c900cd898ef03f29ce383642..0e9a2d1109aa31ffaa76edd0687bc9d91ecd7397 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);
+-}
 
 /* Dispatch functions for chacha20 cipher */
 
@@ -100,29 +103,37 @@ static int chacha20_get_params(OSSL_PARAM params[])
                                           CHACHA20_IVLEN * 8);
 }
 
+{- produce_param_decoder('chacha20_get_ctx_params',
+                         (['OSSL_CIPHER_PARAM_KEYLEN',     'keylen', 'size_t'],
+                          ['OSSL_CIPHER_PARAM_IVLEN',      'ivlen',  'size_t'],
+                          ['OSSL_CIPHER_PARAM_UPDATED_IV', 'upd_iv', 'octet_string'],
+                         )); -}
+
 static int chacha20_get_ctx_params(void *vctx, OSSL_PARAM params[])
 {
     PROV_CHACHA20_CTX *ctx = (PROV_CHACHA20_CTX *)vctx;
     unsigned char ivbuf[CHACHA20_IVLEN];
-    OSSL_PARAM *p;
+    struct chacha20_get_ctx_params_st p;
+
+    if (ctx == NULL || !chacha20_get_ctx_params_decoder(params, &p))
+        return 0;
 
-    p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_IVLEN);
-    if (p != NULL && !OSSL_PARAM_set_size_t(p, CHACHA20_IVLEN)) {
+    if (p.ivlen != NULL && !OSSL_PARAM_set_size_t(p.ivlen, CHACHA20_IVLEN)) {
         ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
         return 0;
     }
-    p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_KEYLEN);
-    if (p != NULL && !OSSL_PARAM_set_size_t(p, CHACHA20_KEYLEN)) {
+
+    if (p.keylen != NULL && !OSSL_PARAM_set_size_t(p.keylen, CHACHA20_KEYLEN)) {
         ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
         return 0;
     }
-    p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_UPDATED_IV);
-    if (p != NULL) {
+
+    if (p.upd_iv != NULL) {
         CHACHA_U32TOU8(ivbuf, ctx->counter[0]);
         CHACHA_U32TOU8(ivbuf + 4, ctx->counter[1]);
         CHACHA_U32TOU8(ivbuf + 8, ctx->counter[2]);
         CHACHA_U32TOU8(ivbuf + 12, ctx->counter[3]);
-        if (!OSSL_PARAM_set_octet_string(p, ivbuf, CHACHA20_IVLEN)) {
+        if (!OSSL_PARAM_set_octet_string(p.upd_iv, ivbuf, CHACHA20_IVLEN)) {
             ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
             return 0;
         }
@@ -130,29 +141,28 @@ static int chacha20_get_ctx_params(void *vctx, OSSL_PARAM params[])
     return 1;
 }
 
-static const OSSL_PARAM chacha20_known_gettable_ctx_params[] = {
-    OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN, NULL),
-    OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_IVLEN, NULL),
-    OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_UPDATED_IV, NULL, 0),
-    OSSL_PARAM_END
-};
 const OSSL_PARAM *chacha20_gettable_ctx_params(ossl_unused void *cctx,
                                                ossl_unused void *provctx)
 {
-    return chacha20_known_gettable_ctx_params;
+    return chacha20_get_ctx_params_list;
 }
 
+{- produce_param_decoder('chacha20_set_ctx_params',
+                         (['OSSL_CIPHER_PARAM_KEYLEN', 'keylen', 'size_t'],
+                          ['OSSL_CIPHER_PARAM_IVLEN',  'ivlen',  'size_t'],
+                         )); -}
+
 static int chacha20_set_ctx_params(void *vctx, const OSSL_PARAM params[])
 {
-    const OSSL_PARAM *p;
+    PROV_CHACHA20_CTX *ctx = (PROV_CHACHA20_CTX *)vctx;
+    struct chacha20_set_ctx_params_st p;
     size_t len;
 
-    if (ossl_param_is_empty(params))
-        return 1;
+    if (ctx == NULL || !chacha20_set_ctx_params_decoder(params, &p))
+        return 0;
 
-    p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_KEYLEN);
-    if (p != NULL) {
-        if (!OSSL_PARAM_get_size_t(p, &len)) {
+    if (p.keylen != NULL) {
+        if (!OSSL_PARAM_get_size_t(p.keylen, &len)) {
             ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
             return 0;
         }
@@ -161,9 +171,9 @@ static int chacha20_set_ctx_params(void *vctx, const OSSL_PARAM params[])
             return 0;
         }
     }
-    p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_IVLEN);
-    if (p != NULL) {
-        if (!OSSL_PARAM_get_size_t(p, &len)) {
+
+    if (p.ivlen != NULL) {
+        if (!OSSL_PARAM_get_size_t(p.ivlen, &len)) {
             ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
             return 0;
         }
@@ -175,15 +185,10 @@ static int chacha20_set_ctx_params(void *vctx, const OSSL_PARAM params[])
     return 1;
 }
 
-static const OSSL_PARAM chacha20_known_settable_ctx_params[] = {
-    OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN, NULL),
-    OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_IVLEN, NULL),
-    OSSL_PARAM_END
-};
 const OSSL_PARAM *chacha20_settable_ctx_params(ossl_unused void *cctx,
                                                ossl_unused void *provctx)
 {
-    return chacha20_known_settable_ctx_params;
+    return chacha20_set_ctx_params_list;
 }
 
 int ossl_chacha20_einit(void *vctx, const unsigned char *key, size_t keylen,