From: Pauli Date: Wed, 30 Apr 2025 04:47:43 +0000 (+1000) Subject: chacha_poly: use TRIE based param name decoder X-Git-Tag: openssl-3.6.0-alpha1~761 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b87f4407c72bea7044ef86f6ef7a3eb9bd746606;p=thirdparty%2Fopenssl.git chacha_poly: use TRIE based param name decoder Converted to using a TRIE based param name decoder to improve performance. Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/27523) --- diff --git a/build.info b/build.info index aca3b90960d..cfa791266bb 100644 --- a/build.info +++ b/build.info @@ -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} -}] diff --git a/providers/implementations/ciphers/build.info b/providers/implementations/ciphers/build.info index 35b672c150b..281ff12b800 100644 --- a/providers/implementations/ciphers/build.info +++ b/providers/implementations/ciphers/build.info @@ -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 diff --git a/providers/implementations/ciphers/cipher_chacha20_poly1305.c b/providers/implementations/ciphers/cipher_chacha20_poly1305.c.in similarity index 64% rename from providers/implementations/ciphers/cipher_chacha20_poly1305.c rename to providers/implementations/ciphers/cipher_chacha20_poly1305.c.in index 7c050497780..2b59dfd4231 100644 --- a/providers/implementations/ciphers/cipher_chacha20_poly1305.c +++ b/providers/implementations/ciphers/cipher_chacha20_poly1305.c.in @@ -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 #include #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; }