Skip to content

Commit

Permalink
jwt: remove TinyCrypt usage
Browse files Browse the repository at this point in the history
As part of TinyCrypt deprecation process (zephyrproject-rtos#79566) this commit
removes usage of this library from the JWT subsystem and its
related tests.

Signed-off-by: Valerio Setti <[email protected]>
  • Loading branch information
valeriosetti committed Oct 30, 2024
1 parent 6b09d44 commit 5cefd04
Show file tree
Hide file tree
Showing 9 changed files with 54 additions and 164 deletions.
20 changes: 15 additions & 5 deletions doc/releases/migration-guide-4.0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -551,11 +551,21 @@ Shell
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`)
* By default, the signature is now computed using the PSA Crypto API for both RSA and ECDSA
(: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:`CONFIG_JWT_SIGN_RSA_PSA` (default) RSA signature using the PSA Crypto API;
* :kconfig:option:`CONFIG_JWT_SIGN_RSA_LEGACY` RSA signature using Mbed TLS;
* :kconfig:option:`CONFIG_JWT_SIGN_ECDSA_PSA` ECDSA signature using the PSA Crypto API.

They replace the previously-existing Kconfigs ``CONFIG_JWT_SIGN_RSA`` and
``CONFIG_JWT_SIGN_ECDSA``. (:github:`79653`)

Architectures
*************
12 changes: 7 additions & 5 deletions doc/releases/release-notes-4.0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -464,12 +464,14 @@ Libraries / Subsystems

* JWT (JSON Web Token)

* The following new Kconfigs were added to specify which library to use for the
signature:
* The following new symbols were added to allow specifying both the signature
algorithm and crypto library:

* :kconfig:option:`CONFIG_JWT_USE_PSA` (default) use the PSA Crypto API;
* :kconfig:option:`CONFIG_JWT_USE_LEGACY` use legacy libraries, i.e. TinyCrypt
for ECDSA and Mbed TLS for RSA.
* :kconfig:option:`CONFIG_JWT_SIGN_RSA_PSA` (default) RSA signature using the PSA Crypto API;
* :kconfig:option:`CONFIG_JWT_SIGN_RSA_LEGACY` RSA signature using Mbed TLS;
* :kconfig:option:`CONFIG_JWT_SIGN_ECDSA_PSA` ECDSA signature using the PSA Crypto API.

(:github:`79653`)

HALs
****
Expand Down
6 changes: 4 additions & 2 deletions subsys/jwt/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
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)

if (CONFIG_JWT_SIGN_RSA_PSA OR CONFIG_JWT_SIGN_ECDSA_PSA)
zephyr_library_sources(jwt_psa.c)
endif()

zephyr_library_link_libraries_ifdef(CONFIG_MBEDTLS mbedTLS)
67 changes: 16 additions & 51 deletions subsys/jwt/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -12,69 +12,34 @@ 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_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

config JWT_USE_PSA
bool "PSA crypto API library"
config JWT_SIGN_RSA_PSA
bool "Use RSA signature (RS-256). Use PSA Crypto API."
select MBEDTLS if !BUILD_WITH_TFM
select MBEDTLS_PSA_CRYPTO_C if !BUILD_WITH_TFM
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_USE_LEGACY
bool "Legacy library: TinyCrypt for ECDSA, Mbed TLS for RSA"

endchoice

# 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 API."
select MBEDTLS if !BUILD_WITH_TFM
select MBEDTLS_PSA_CRYPTO_C if !BUILD_WITH_TFM
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
8 changes: 4 additions & 4 deletions subsys/jwt/jwt.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@

#include "jwt.h"

#if defined(CONFIG_JWT_SIGN_RSA)
#if defined(CONFIG_JWT_SIGN_RSA_PSA) || defined(JWT_SIGN_RSA_LEGACY)
#define JWT_SIGNATURE_LEN 256
#else /* CONFIG_JWT_SIGN_ECDSA */
#else /* CONFIG_JWT_SIGN_ECDSA_PSA */
#define JWT_SIGNATURE_LEN 64
#endif

Expand Down Expand Up @@ -143,10 +143,10 @@ static int jwt_add_header(struct jwt_builder *builder)
* Use https://www.base64encode.org/ for update
*/
const char jwt_header[] =
#ifdef CONFIG_JWT_SIGN_RSA
#if defined(CONFIG_JWT_SIGN_RSA_PSA) || defined(CONFIG_JWT_SIGN_RSA_LEGACY)
/* {"alg":"RS256","typ":"JWT"} */
"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9";
#else /* CONFIG_JWT_SIGN_ECDSA */
#else /* CONFIG_JWT_SIGN_ECDSA_PSA */
/* {"alg":"ES256","typ":"JWT"} */
"eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9";
#endif
Expand Down
82 changes: 0 additions & 82 deletions subsys/jwt/jwt_legacy_ecdsa.c

This file was deleted.

6 changes: 3 additions & 3 deletions subsys/jwt/jwt_psa.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ int jwt_sign_impl(struct jwt_builder *builder, const unsigned char *der_key, siz
psa_algorithm_t alg;
int ret;

#if defined(CONFIG_JWT_SIGN_ECDSA)
#if defined(CONFIG_JWT_SIGN_ECDSA_PSA)
psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1));
psa_set_key_algorithm(&attr, PSA_ALG_ECDSA(PSA_ALG_SHA_256));
alg = PSA_ALG_ECDSA(PSA_ALG_SHA_256);
#else /* CONFIG_JWT_SIGN_RSA */
#else
psa_set_key_type(&attr, PSA_KEY_TYPE_RSA_KEY_PAIR);
psa_set_key_algorithm(&attr, PSA_ALG_RSA_PKCS1V15_SIGN(PSA_ALG_SHA_256));
alg = PSA_ALG_RSA_PKCS1V15_SIGN(PSA_ALG_SHA_256);
#endif /* CONFIG_JWT_SIGN_ECDSA || CONFIG_JWT_SIGN_RSA */
#endif
psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_SIGN_MESSAGE);

status = psa_import_key(&attr, der_key, der_key_len, &key_id);
Expand Down
4 changes: 2 additions & 2 deletions tests/subsys/jwt/src/jwt-test-private.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
*
*/

#if defined(CONFIG_JWT_SIGN_RSA)
#if defined(CONFIG_JWT_SIGN_RSA_PSA) || defined(CONFIG_JWT_SIGN_RSA_LEGACY)

/* To generate the key in the correct format use the following command:
* $ openssl genrsa 2048 | openssl rsa -outform DER | xxd -i
Expand Down Expand Up @@ -113,7 +113,7 @@ unsigned char jwt_test_private_der[] = {
0x05, 0xfd, 0x71, 0xb0, 0x3e
};

#else /* CONFIG_JWT_SIGN_ECDSA */
#else /* CONFIG_JWT_SIGN_ECDSA_PSA */

/* Here's how to generate the key in the correct format:
* - generate the key using OpenSSL:
Expand Down
13 changes: 3 additions & 10 deletions tests/subsys/jwt/testcase.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 5cefd04

Please sign in to comment.