]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
chacha_poly: use TRIE based param name decoder
authorPauli <ppzgs1@gmail.com>
Wed, 30 Apr 2025 04:47:43 +0000 (14:47 +1000)
committerTomas Mraz <tomas@openssl.org>
Tue, 13 May 2025 15:23:12 +0000 (17:23 +0200)
Converted to using a TRIE based param name decoder to improve
performance.

Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/27523)

build.info
providers/implementations/ciphers/build.info
providers/implementations/ciphers/cipher_chacha20_poly1305.c.in [moved from providers/implementations/ciphers/cipher_chacha20_poly1305.c with 64% similarity]

index aca3b90960d3cfdd606bd7e8420091be6c6b1b42..cfa791266bb5bc52ae1050fcfe00bb69b38cfcaa 100644 (file)
@@ -49,7 +49,8 @@ DEPEND[]=include/openssl/asn1.h \
          include/openssl/x509_vfy.h \
          include/crypto/bn_conf.h include/crypto/dso_conf.h \
          include/internal/param_names.h \
-         providers/implementations/ciphers/ciphercommon.c
+         providers/implementations/ciphers/ciphercommon.c \
+         providers/implementations/ciphers/cipher_chacha20_poly1305.c
 
 GENERATE[include/openssl/asn1.h]=include/openssl/asn1.h.in
 GENERATE[include/openssl/asn1t.h]=include/openssl/asn1t.h.in
@@ -86,10 +87,13 @@ GENERATE[include/crypto/dso_conf.h]=include/crypto/dso_conf.h.in
 
 DEPEND[include/internal/param_names.h \
        providers/implementations/ciphers/ciphercommon.c \
+       providers/implementations/ciphers/cipher_chacha20_poly1305.c \
        include/openssl/core_names.h]=util/perl|OpenSSL/paramnames.pm
 GENERATE[include/internal/param_names.h]=include/internal/param_names.h.in
 GENERATE[providers/implementations/ciphers/ciphercommon.c]=\
     providers/implementations/ciphers/ciphercommon.c.in
+GENERATE[providers/implementations/ciphers/cipher_chacha20_poly1305.c]=\
+    providers/implementations/ciphers/cipher_chacha20_poly1305.c.in
 GENERATE[include/openssl/core_names.h]=include/openssl/core_names.h.in
 
 IF[{- defined $target{shared_defflag} -}]
index 35b672c150b2315bbebf5f8a2a38c15aec480f58..281ff12b800c729d2bb93a975b63bb5cf0bcc243 100644 (file)
@@ -91,6 +91,7 @@ SOURCE[$COMMON_GOAL]=\
         ciphercommon_ccm.c ciphercommon_ccm_hw.c
 
 INCLUDE[ciphercommon.o]=.
+INCLUDE[cipher_chacha20_poly1305.o]=.
 
 IF[{- !$disabled{des} -}]
   SOURCE[$TDES_1_GOAL]=cipher_tdes.c cipher_tdes_common.c cipher_tdes_hw.c
similarity index 64%
rename from providers/implementations/ciphers/cipher_chacha20_poly1305.c
rename to providers/implementations/ciphers/cipher_chacha20_poly1305.c.in
index 7c0504977809a839636bd43fa76a91b583d2b255..2b59dfd42319dda390e09e95b6be3954f126d9e5 100644 (file)
@@ -6,13 +6,18 @@
  * in the file LICENSE in the source distribution or at
  * https://www.openssl.org/source/license.html
  */
+{-
+use OpenSSL::paramnames qw(produce_decoder);
+-}
 
 /* Dispatch functions for chacha20_poly1305 cipher */
 
+#include <string.h>
 #include <openssl/proverr.h>
 #include "cipher_chacha20_poly1305.h"
 #include "prov/implementations.h"
 #include "prov/providercommon.h"
+#include "internal/param_names.h"
 
 #define CHACHA20_POLY1305_KEYLEN CHACHA_KEY_SIZE
 #define CHACHA20_POLY1305_BLKLEN 1
@@ -36,6 +41,8 @@ static OSSL_FUNC_cipher_settable_ctx_params_fn chacha20_poly1305_settable_ctx_pa
 #define chacha20_poly1305_gettable_params ossl_cipher_generic_gettable_params
 #define chacha20_poly1305_update chacha20_poly1305_cipher
 
+static int chacha20_poly1305_get_ctx_params_find_pidx(const char *);
+
 static void *chacha20_poly1305_newctx(void *provctx)
 {
     PROV_CHACHA20_POLY1305_CTX *ctx;
@@ -101,49 +108,68 @@ static int chacha20_poly1305_get_ctx_params(void *vctx, OSSL_PARAM params[])
     PROV_CHACHA20_POLY1305_CTX *ctx = (PROV_CHACHA20_POLY1305_CTX *)vctx;
     OSSL_PARAM *p;
 
-    p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_IVLEN);
-    if (p != NULL) {
-        if (!OSSL_PARAM_set_size_t(p, CHACHA20_POLY1305_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_POLY1305_KEYLEN)) {
-        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
-        return 0;
-    }
-    p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_AEAD_TAGLEN);
-    if (p != NULL && !OSSL_PARAM_set_size_t(p, ctx->tag_len)) {
-        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
-        return 0;
-    }
-    p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_AEAD_TLS1_AAD_PAD);
-    if (p != NULL && !OSSL_PARAM_set_size_t(p, ctx->tls_aad_pad_sz)) {
-        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
-        return 0;
-    }
+    for (p = params; p->key != NULL; p++)
+        switch (chacha20_poly1305_get_ctx_params_find_pidx(p->key)) {
+        default:
+            break;
 
-    p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_AEAD_TAG);
-    if (p != NULL) {
-        if (p->data_type != OSSL_PARAM_OCTET_STRING) {
-            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
-            return 0;
-        }
-        if (!ctx->base.enc) {
-            ERR_raise(ERR_LIB_PROV, PROV_R_TAG_NOT_SET);
-            return 0;
-        }
-        if (p->data_size == 0 || p->data_size > POLY1305_BLOCK_SIZE) {
-            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_TAG_LENGTH);
-            return 0;
-        }
-        memcpy(p->data, ctx->tag, p->data_size);
-    }
+        case PIDX_CIPHER_PARAM_IVLEN:
+            if (!OSSL_PARAM_set_size_t(p, CHACHA20_POLY1305_IVLEN)) {
+                ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
+                return 0;
+            }
+            break;
+
+        case PIDX_CIPHER_PARAM_KEYLEN:
+            if (!OSSL_PARAM_set_size_t(p, CHACHA20_POLY1305_KEYLEN)) {
+                ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
+                return 0;
+            }
+            break;
 
+        case PIDX_CIPHER_PARAM_AEAD_TAGLEN:
+            if (p != NULL && !OSSL_PARAM_set_size_t(p, ctx->tag_len)) {
+                ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
+                return 0;
+            }
+            break;
+
+        case PIDX_CIPHER_PARAM_AEAD_TLS1_AAD_PAD:
+            if (!OSSL_PARAM_set_size_t(p, ctx->tls_aad_pad_sz)) {
+                ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
+                return 0;
+            }
+            break;
+
+        case PIDX_CIPHER_PARAM_AEAD_TAG:
+            if (p->data_type != OSSL_PARAM_OCTET_STRING) {
+                ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
+                return 0;
+            }
+            if (!ctx->base.enc) {
+                ERR_raise(ERR_LIB_PROV, PROV_R_TAG_NOT_SET);
+                return 0;
+            }
+            if (p->data_size == 0 || p->data_size > POLY1305_BLOCK_SIZE) {
+                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_TAG_LENGTH);
+                return 0;
+            }
+            memcpy(p->data, ctx->tag, p->data_size);
+            break;
+        }
     return 1;
 }
 
+/* Machine generated by util/perl/OpenSSL/paramnames.pm */
+static {- produce_decoder('chacha20_poly1305_get_ctx_params_find_pidx',
+                   ('CIPHER_PARAM_KEYLEN',
+                    'CIPHER_PARAM_IVLEN',
+                    'CIPHER_PARAM_AEAD_TAGLEN',
+                    'CIPHER_PARAM_AEAD_TAG',
+                    'CIPHER_PARAM_AEAD_TLS1_AAD_PAD',
+                   )); -}
+/* End of machine generated */
+
 static const OSSL_PARAM chacha20_poly1305_known_gettable_ctx_params[] = {
     OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN, NULL),
     OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_IVLEN, NULL),
@@ -173,6 +199,16 @@ static const OSSL_PARAM *chacha20_poly1305_settable_ctx_params(
     return chacha20_poly1305_known_settable_ctx_params;
 }
 
+/* Machine generated by util/perl/OpenSSL/paramnames.pm */
+static {- produce_decoder('chacha20_poly1305_set_ctx_params_find_pidx',
+                   ('CIPHER_PARAM_KEYLEN',
+                    'CIPHER_PARAM_IVLEN',
+                    'CIPHER_PARAM_AEAD_TAG',
+                    'CIPHER_PARAM_AEAD_TLS1_AAD',
+                    'CIPHER_PARAM_AEAD_TLS1_IV_FIXED',
+                   )); -}
+/* End of machine generated */
+
 static int chacha20_poly1305_set_ctx_params(void *vctx,
                                             const OSSL_PARAM params[])
 {
@@ -185,74 +221,76 @@ static int chacha20_poly1305_set_ctx_params(void *vctx,
     if (ossl_param_is_empty(params))
         return 1;
 
-    p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_KEYLEN);
-    if (p != NULL) {
-        if (!OSSL_PARAM_get_size_t(p, &len)) {
-            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
-            return 0;
-        }
-        if (len != CHACHA20_POLY1305_KEYLEN) {
-            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
-            return 0;
-        }
-    }
-    p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_IVLEN);
-    if (p != NULL) {
-        if (!OSSL_PARAM_get_size_t(p, &len)) {
-            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
-            return 0;
-        }
-        if (len != CHACHA20_POLY1305_MAX_IVLEN) {
-            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
-            return 0;
-        }
-    }
+    for (p = params; p->key != NULL; p++)
+        switch (chacha20_poly1305_set_ctx_params_find_pidx(p->key)) {
+        default:
+            break;
 
-    p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_AEAD_TAG);
-    if (p != NULL) {
-        if (p->data_type != OSSL_PARAM_OCTET_STRING) {
-            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
-            return 0;
-        }
-        if (p->data_size == 0 || p->data_size > POLY1305_BLOCK_SIZE) {
-            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_TAG_LENGTH);
-            return 0;
-        }
-        if (p->data != NULL) {
-            if (ctx->base.enc) {
-                ERR_raise(ERR_LIB_PROV, PROV_R_TAG_NOT_NEEDED);
+        case PIDX_CIPHER_PARAM_KEYLEN:
+            if (!OSSL_PARAM_get_size_t(p, &len)) {
+                ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
                 return 0;
             }
-            memcpy(ctx->tag, p->data, p->data_size);
-        }
-        ctx->tag_len = p->data_size;
-    }
+            if (len != CHACHA20_POLY1305_KEYLEN) {
+                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
+                return 0;
+            }
+            break;
 
-    p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_AEAD_TLS1_AAD);
-    if (p != NULL) {
-        if (p->data_type != OSSL_PARAM_OCTET_STRING) {
-            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
-            return 0;
-        }
-        len = hw->tls_init(&ctx->base, p->data, p->data_size);
-        if (len == 0) {
-            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DATA);
-            return 0;
-        }
-        ctx->tls_aad_pad_sz = len;
-    }
+        case PIDX_CIPHER_PARAM_IVLEN:
+            if (!OSSL_PARAM_get_size_t(p, &len)) {
+                ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
+                return 0;
+            }
+            if (len != CHACHA20_POLY1305_MAX_IVLEN) {
+                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
+                return 0;
+            }
+            break;
 
-    p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_AEAD_TLS1_IV_FIXED);
-    if (p != NULL) {
-        if (p->data_type != OSSL_PARAM_OCTET_STRING) {
-            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
-            return 0;
-        }
-        if (hw->tls_iv_set_fixed(&ctx->base, p->data, p->data_size) == 0) {
-            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
-            return 0;
+        case PIDX_CIPHER_PARAM_AEAD_TAG:
+            if (p->data_type != OSSL_PARAM_OCTET_STRING) {
+                ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
+                return 0;
+            }
+            if (p->data_size == 0 || p->data_size > POLY1305_BLOCK_SIZE) {
+                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_TAG_LENGTH);
+                return 0;
+            }
+            if (p->data != NULL) {
+                if (ctx->base.enc) {
+                    ERR_raise(ERR_LIB_PROV, PROV_R_TAG_NOT_NEEDED);
+                    return 0;
+                }
+                memcpy(ctx->tag, p->data, p->data_size);
+            }
+            ctx->tag_len = p->data_size;
+            break;
+
+        case PIDX_CIPHER_PARAM_AEAD_TLS1_AAD:
+            if (p->data_type != OSSL_PARAM_OCTET_STRING) {
+                ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
+                return 0;
+            }
+            len = hw->tls_init(&ctx->base, p->data, p->data_size);
+            if (len == 0) {
+                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DATA);
+                return 0;
+            }
+            ctx->tls_aad_pad_sz = len;
+            break;
+
+        case PIDX_CIPHER_PARAM_AEAD_TLS1_IV_FIXED:
+            if (p->data_type != OSSL_PARAM_OCTET_STRING) {
+                ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
+                return 0;
+            }
+            if (hw->tls_iv_set_fixed(&ctx->base, p->data, p->data_size) == 0) {
+                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
+                return 0;
+            }
+            break;
         }
-    }
     return 1;
 }