From 85031f0caf26d485ccbb732ee28eb5b6e44340af Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Thu, 10 Oct 2024 15:45:08 +0200 Subject: [PATCH] jwt: remove TinyCrypt usage As part of TinyCrypt deprecation process (#79566) this commit removes usage of this library from the JWT subsystem and its related tests. Signed-off-by: Valerio Setti --- doc/releases/migration-guide-4.0.rst | 15 +++-- subsys/jwt/CMakeLists.txt | 1 - subsys/jwt/Kconfig | 67 +++++------------------ subsys/jwt/jwt_legacy_ecdsa.c | 82 ---------------------------- tests/subsys/jwt/testcase.yaml | 13 +---- 5 files changed, 28 insertions(+), 150 deletions(-) delete mode 100644 subsys/jwt/jwt_legacy_ecdsa.c diff --git a/doc/releases/migration-guide-4.0.rst b/doc/releases/migration-guide-4.0.rst index 5d0cd4ce81760d0..f0e3fb9d88a9ed9 100644 --- a/doc/releases/migration-guide-4.0.rst +++ b/doc/releases/migration-guide-4.0.rst @@ -540,10 +540,17 @@ JWT (JSON Web Token) ==================== * By default, the signature is now computed through PSA Crypto API for both RSA and ECDSA. - The newly-added :kconfig:option:`CONFIG_JWT_USE_LEGACY` can be used to switch - back to previous libraries (TinyCrypt for ECDSA and Mbed TLS for RSA). - The conversion to the PSA Crypto API is being done in preparation for the - deprecation of TinyCrypt. (:github:`78243` and :github:`43712`) + (:github:`78243`). The conversion to the PSA Crypto API is part of the adoption + of a standard interface for crypto operations (:github:`43712`). Moreover, + following the deprecation of the TinyCrypt library (:github:`79566`) usage + of TinyCrypt was removed from the JWT subsystem (:github:`79653`). + +* The following new symbols were added to allow specifying both the signature + algorithm and crypto library: + + * :kconfig:option:`JWT_SIGN_RSA_PSA` (default) RSA signature using PSA Crypto APIs; + * :kconfig:option:`JWT_SIGN_RSA_LEGACY`RSA signature using Mbed TLS; + * :kconfig:option:`JWT_SIGN_ECDSA_PSA` ECDSA signature using PSA Crypto APIs. Architectures ************* diff --git a/subsys/jwt/CMakeLists.txt b/subsys/jwt/CMakeLists.txt index 82c65f11f414c1f..5467b6ffc9711a0 100644 --- a/subsys/jwt/CMakeLists.txt +++ b/subsys/jwt/CMakeLists.txt @@ -3,7 +3,6 @@ zephyr_library() zephyr_library_sources(jwt.c) -zephyr_library_sources_ifdef(CONFIG_JWT_SIGN_ECDSA_LEGACY jwt_legacy_ecdsa.c) zephyr_library_sources_ifdef(CONFIG_JWT_SIGN_RSA_LEGACY jwt_legacy_rsa.c) zephyr_library_sources_ifdef(CONFIG_JWT_USE_PSA jwt_psa.c) diff --git a/subsys/jwt/Kconfig b/subsys/jwt/Kconfig index 651fe46cbf57fa3..67a1fb4a240f0a5 100644 --- a/subsys/jwt/Kconfig +++ b/subsys/jwt/Kconfig @@ -12,69 +12,30 @@ if JWT choice prompt "JWT signature algorithm" - default JWT_SIGN_RSA + default JWT_SIGN_RSA_PSA help Select which algorithm to use for signing JWT tokens. -config JWT_SIGN_RSA - bool "Use RSA signature (RS-256)" - -config JWT_SIGN_ECDSA - bool "Use ECDSA signature (ES-256)" - -endchoice - -choice - default JWT_USE_PSA - prompt "Select crypto library to be used" - -config JWT_USE_PSA - bool "PSA crypto API library" - select MBEDTLS if !BUILD_WITH_TFM - select MBEDTLS_PSA_CRYPTO_C if !BUILD_WITH_TFM - -config JWT_USE_LEGACY - bool "Legacy library: TinyCrypt for ECDSA, Mbed TLS for RSA" +config JWT_SIGN_RSA_LEGACY + bool "Use RSA signature (RS-256). Use Mbed TLS as crypto library." + depends on CSPRNG_ENABLED + select MBEDTLS + select MBEDTLS_KEY_EXCHANGE_RSA_ENABLED -endchoice +config JWT_SIGN_RSA_PSA + bool "Use RSA signature (RS-256). Use PSA Crypto APIs." + select PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY + select PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_IMPORT + select PSA_WANT_ALG_RSA_PKCS1V15_SIGN + select PSA_WANT_ALG_SHA_256 -# Prompless Kconfigs to effectively select which algorithm and library will be used -# to sign the JWT. User's selections on the above choices will determine which -# element will be picked here. config JWT_SIGN_ECDSA_PSA - bool - default y - depends on JWT_SIGN_ECDSA && JWT_USE_PSA + bool "Use ECDSA signature (ES-256). Use PSA Crypto APIs." select PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_IMPORT select PSA_WANT_ALG_ECDSA select PSA_WANT_ECC_SECP_R1_256 select PSA_WANT_ALG_SHA_256 -config JWT_SIGN_ECDSA_LEGACY - bool - default y - depends on JWT_SIGN_ECDSA && JWT_USE_LEGACY - select TINYCRYPT - select TINYCRYPT_SHA256 - select TINYCRYPT_ECC_DSA - select TINYCRYPT_CTR_PRNG - select TINYCRYPT_AES - -config JWT_SIGN_RSA_PSA - bool - default y - depends on JWT_SIGN_RSA && JWT_USE_PSA - select PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY - select PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_IMPORT - select PSA_WANT_ALG_RSA_PKCS1V15_SIGN - select PSA_WANT_ALG_SHA_256 - -config JWT_SIGN_RSA_LEGACY - bool - default y - depends on JWT_SIGN_RSA && JWT_USE_LEGACY - depends on CSPRNG_ENABLED - select MBEDTLS - select MBEDTLS_KEY_EXCHANGE_RSA_ENABLED +endchoice endif # JWT diff --git a/subsys/jwt/jwt_legacy_ecdsa.c b/subsys/jwt/jwt_legacy_ecdsa.c deleted file mode 100644 index d8368280270d0b1..000000000000000 --- a/subsys/jwt/jwt_legacy_ecdsa.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2024 BayLibre SAS - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -#include "jwt.h" - -static TCCtrPrng_t prng_state; -static bool prng_init; - -static const char personalize[] = "zephyr:drivers/jwt/jwt.c"; - -static int setup_prng(void) -{ - if (prng_init) { - return 0; - } - prng_init = true; - - uint8_t entropy[TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE]; - - sys_rand_get(entropy, sizeof(entropy)); - - int res = tc_ctr_prng_init(&prng_state, (const uint8_t *)&entropy, sizeof(entropy), - personalize, sizeof(personalize)); - - return res == TC_CRYPTO_SUCCESS ? 0 : -EINVAL; -} - -/* This function is declared in - * modules/crypto/tinycrypt/lib/include/tinycrypt/ecc_platform_specific.h. - * - * TinyCrypt expects this function to be implemented somewhere when using the - * ECC module. - */ -int default_CSPRNG(uint8_t *dest, unsigned int size) -{ - int res = tc_ctr_prng_generate(&prng_state, NULL, 0, dest, size); - return res; -} - -int jwt_sign_impl(struct jwt_builder *builder, const unsigned char *der_key, size_t der_key_len, - unsigned char *sig, size_t sig_size) -{ - struct tc_sha256_state_struct ctx; - uint8_t hash[32]; - int res; - - ARG_UNUSED(sig_size); - - tc_sha256_init(&ctx); - tc_sha256_update(&ctx, builder->base, builder->buf - builder->base); - tc_sha256_final(hash, &ctx); - - res = setup_prng(); - - if (res != 0) { - return res; - } - - /* Note that tinycrypt only supports P-256. */ - res = uECC_sign(der_key, hash, sizeof(hash), sig, &curve_secp256r1); - if (res != TC_CRYPTO_SUCCESS) { - return -EINVAL; - } - - return 0; -} diff --git a/tests/subsys/jwt/testcase.yaml b/tests/subsys/jwt/testcase.yaml index 6606780a9f1b29d..f439e9aea9e1cea 100644 --- a/tests/subsys/jwt/testcase.yaml +++ b/tests/subsys/jwt/testcase.yaml @@ -9,24 +9,17 @@ common: extra_configs: - CONFIG_TEST_RANDOM_GENERATOR=y tests: - libraries.encoding.jwt.ecdsa.legacy: - extra_configs: - - CONFIG_JWT_SIGN_ECDSA=y - - CONFIG_JWT_USE_LEGACY=y libraries.encoding.jwt.ecdsa.psa: extra_configs: - - CONFIG_JWT_SIGN_ECDSA=y - - CONFIG_JWT_USE_PSA=y + - CONFIG_JWT_SIGN_ECDSA_PSA=y - CONFIG_MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG=y - CONFIG_MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG_ALLOW_NON_CSPRNG=y libraries.encoding.jwt.rsa.legacy: filter: CSPRNG_ENABLED extra_configs: - - CONFIG_JWT_SIGN_RSA=y - - CONFIG_JWT_USE_LEGACY=y + - CONFIG_JWT_SIGN_RSA_LEGACY=y libraries.encoding.jwt.rsa.psa: extra_configs: - - CONFIG_JWT_SIGN_RSA=y - - CONFIG_JWT_USE_PSA=y + - CONFIG_JWT_SIGN_RSA_PSA=y - CONFIG_MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG=y - CONFIG_MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG_ALLOW_NON_CSPRNG=y