Can't use ECDHE_RSA w/o MBEDTLS_LEGACY_CRYPTO_C

To use ECDHE_RSA you need to enable the following Kconfig symbol:

Name: MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
Prompt: ECDHE RSA
Prompt: ECDHE-RSA based ciphersuite modes
Prompt: ECDHE-RSA based ciphersuite modes
Type: bool
Value: n

Direct dependencies (=n):
MBEDTLS_HAS_CIPHER_MODE_CIPHERSUITE_REQUIREMENTS(=y) && MBEDTLS_HAS_ECDH_CIPHERSUITE_REQUIREMENTS(=y) && MBEDTLS_HAS_RSA_CIPHERSUITE_REQUIREMENTS(=n) && MBEDTLS_TLS_LIBRARY(=y) && NRF_SECURITY(=y) (=n)
|| (MBEDTLS_PKCS1_V15(=n) || MBEDTLS_PKCS1_V21(=n)) && MBEDTLS_ECDH_C(=n) && !(NRF_SECURITY(=y) || NORDIC_SECURITY_BACKEND(=n)) && MBEDTLS_BUILTIN(=n) && MBEDTLS_CFG_FILE(=nrf-config.h) = "config-mbedtls.h" && MBEDTLS(=y) (=n)
|| (MBEDTLS_PKCS1_V15(=n) || MBEDTLS_PKCS1_V21(=n)) && MBEDTLS_ECDH_C(=n) && !(NRF_SECURITY(=y) || NORDIC_SECURITY_BACKEND(=n)) && MBEDTLS_BUILTIN(=n) && MBEDTLS_CFG_FILE(=nrf-config.h) = "config-mbedtls.h" && MBEDTLS(=y) && 0 (=n)

This symbol depends on MBEDTLS_HAS_RSA_CIPHERSUITE_REQUIREMENTS:

Name: MBEDTLS_HAS_RSA_CIPHERSUITE_REQUIREMENTS
Type: bool
Value: n

Direct dependencies (=n):
MBEDTLS_RSA_C(=n)
&& MBEDTLS_PKCS1_V15(=n)
&& MBEDTLS_TLS_LIBRARY(=y)
&& NRF_SECURITY(=y)

This symbol depends on MBEDTLS_RSA_C:

Name: MBEDTLS_RSA_C
Prompt: RSA - Rivest-Shamir-Adleman cryptosystem
Prompt: RSA base support
Prompt: RSA base support
Type: bool
Value: n

Help:

Enable RSA cryptosystem support.
MBEDTLS_RSA_C setting in mbed TLS config file.

Direct dependencies (=n):
OPENTHREAD(=n)
|| MBEDTLS_LEGACY_CRYPTO_C(=n) && NRF_SECURITY(=y) (=n)
|| MBEDTLS_BUILTIN(=n) && MBEDTLS_CFG_FILE(=nrf-config.h) = "config-mbedtls.h" && MBEDTLS(=y) (=n)
|| MBEDTLS_BUILTIN(=n) && MBEDTLS_CFG_FILE(=nrf-config.h) = "config-mbedtls.h" && MBEDTLS(=y) && 0 (=n)

Which depends on MBEDTLS_LEGACY_CRYPTO_C.

I saw a similar post created about this  nRF9160: Offloaded sockets can't use MBEDTLS_USE_PSA_CRYPTO with RSA Certificates 

However, this affects not only nRF91xx, but also nRF54Lx and potentially other device series.

Question: If I enable MBEDTLS_LEGACY_CRYPTO_C is it going to use it only for RSA (& won't use the PSA API) or for everything else too?

We can compare this with MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED:

Name: MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
Prompt: ECDHE ECDSA
Prompt: ECDHE-ECDSA based ciphersuite modes
Prompt: ECDHE-ECDSA based ciphersuite modes
Type: bool
Value: y

Direct dependencies (=y):
MBEDTLS_HAS_CIPHER_MODE_CIPHERSUITE_REQUIREMENTS(=y) && MBEDTLS_HAS_ECDH_CIPHERSUITE_REQUIREMENTS(=y) && MBEDTLS_HAS_ECDSA_CIPHERSUITE_REQUIREMENTS(=y) && MBEDTLS_TLS_LIBRARY(=y) && NRF_SECURITY(=y) (=y)
|| ((MBEDTLS_ECDH_C(=n) && MBEDTLS_ECDSA_C(=n)) || (PSA_WANT_ALG_ECDH(=y) && PSA_WANT_ALG_ECDSA(=y))) && !(NRF_SECURITY(=y) || NORDIC_SECURITY_BACKEND(=n)) && MBEDTLS_BUILTIN(=n) && MBEDTLS_CFG_FILE(=nrf-config.h) = "config-mbedtls.h" && MBEDTLS(=y) (=n)
|| ((MBEDTLS_ECDH_C(=n) && MBEDTLS_ECDSA_C(=n)) || (PSA_WANT_ALG_ECDH(=y) && PSA_WANT_ALG_ECDSA(=y))) && !(NRF_SECURITY(=y) || NORDIC_SECURITY_BACKEND(=n)) && MBEDTLS_BUILTIN(=n) && MBEDTLS_CFG_FILE(=nrf-config.h) = "config-mbedtls.h" && MBEDTLS(=y) && 0 (=n)

Name: MBEDTLS_HAS_ECDSA_CIPHERSUITE_REQUIREMENTS
Type: bool
Value: y

Direct dependencies (=y):
(MBEDTLS_ECP_C(=n) && MBEDTLS_ECDSA_C(=n) && MBEDTLS_SHA256_C(=n)) || (PSA_WANT_ALG_ECDSA(=y) && PSA_WANT_ALG_SHA_256(=y) && MBEDTLS_USE_PSA_CRYPTO(=y)) (=y)
&& MBEDTLS_TLS_LIBRARY(=y)
&& NRF_SECURITY(=y)

We can see it's possible to have a combination of options that enable this Kconfig symbol:

(PSA_WANT_ALG_ECDSA(=y) && PSA_WANT_ALG_SHA_256(=y) && MBEDTLS_USE_PSA_CRYPTO(=y)) (=y)

Parents
  • This is the configuration that worked for me:

    # Enable TLS credentials
    CONFIG_TLS_CREDENTIALS=y
    CONFIG_TLS_CREDENTIALS_BACKEND_VOLATILE=y
    
    # Cryptography (mbed TLS general)
    CONFIG_NRF_SECURITY=y
    CONFIG_MBEDTLS=y
    CONFIG_MBEDTLS_MD=y
    CONFIG_MBEDTLS_TLS_LIBRARY=y
    CONFIG_MBEDTLS_X509_LIBRARY=y
    CONFIG_MBEDTLS_ENABLE_HEAP=y
    CONFIG_MBEDTLS_HEAP_SIZE=49152
    
    # Cryptography (mbed TLS options)
    CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=n
    CONFIG_MBEDTLS_SSL_SERVER_NAME_INDICATION=y
    CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED=y
    CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED=y
    # CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=16384
    CONFIG_MBEDTLS_MPI_MAX_SIZE=512
    # @todo: This is required for 'CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED'.
    CONFIG_MBEDTLS_LEGACY_CRYPTO_C=y
    
    # PSA API (General)
    CONFIG_MBEDTLS_USE_PSA_CRYPTO=y
    CONFIG_MBEDTLS_PSA_CRYPTO_C=y
    
    # PSA API (Drivers)
    CONFIG_PSA_CRYPTO_DRIVER_CRACEN=y
    CONFIG_PSA_USE_CRACEN_KEY_MANAGEMENT_DRIVER=y
    CONFIG_PSA_USE_CRACEN_KEY_DERIVATION_DRIVER=y
    CONFIG_PSA_USE_CRACEN_MAC_DRIVER=y
    CONFIG_PSA_USE_CRACEN_CIPHER_DRIVER=y
    CONFIG_PSA_USE_CRACEN_KEY_AGREEMENT_DRIVER=y
    CONFIG_PSA_USE_CRACEN_AEAD_DRIVER=y
    CONFIG_PSA_USE_CRACEN_ASYMMETRIC_SIGNATURE_DRIVER=y
    CONFIG_PSA_USE_CRACEN_ASYMMETRIC_ENCRYPTION_DRIVER=y
    CONFIG_PSA_USE_CRACEN_HASH_DRIVER=y
    
    # PSA API (Key types)
    CONFIG_PSA_WANT_KEY_TYPE_AES=y
    CONFIG_PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_IMPORT=y
    CONFIG_PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_GENERATE=y
    CONFIG_PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_DERIVE=y
    CONFIG_PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY=y
    CONFIG_PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_IMPORT=y
    CONFIG_PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_GENERATE=y
    CONFIG_PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY=y
    CONFIG_PSA_WANT_KEY_TYPE_HMAC=y
    
    # PSA API (Algorithms)
    CONFIG_PSA_WANT_ALG_ECDH=y
    CONFIG_PSA_WANT_ALG_HMAC=y
    CONFIG_PSA_WANT_ALG_CCM=y
    CONFIG_PSA_WANT_ALG_GCM=y
    CONFIG_PSA_WANT_ALG_HKDF=y
    CONFIG_PSA_WANT_ALG_TLS12_PRF=y
    CONFIG_PSA_WANT_ALG_ECDSA=y
    CONFIG_PSA_WANT_ALG_RSA_PKCS1V15_SIGN=y
    
    # PSA API (Elliptic curves)
    CONFIG_PSA_WANT_ECC_SECP_R1_256=y
    CONFIG_PSA_WANT_ECC_SECP_R1_384=y
    
    # PSA API (Random)
    CONFIG_PSA_WANT_GENERATE_RANDOM=y
    CONFIG_PSA_WANT_ALG_CTR_DRBG=y
    
    # PSA API (Hash algorithms)
    CONFIG_PSA_WANT_ALG_SHA_256=y
    CONFIG_PSA_WANT_ALG_SHA_384=y
    
    # PSA API (Key sizes)
    CONFIG_PSA_WANT_AES_KEY_SIZE_128=y
    CONFIG_PSA_WANT_AES_KEY_SIZE_256=y
    CONFIG_PSA_WANT_RSA_KEY_SIZE_2048=y
    CONFIG_PSA_WANT_RSA_KEY_SIZE_3072=y
    CONFIG_PSA_WANT_RSA_KEY_SIZE_4096=y
    

Reply
  • This is the configuration that worked for me:

    # Enable TLS credentials
    CONFIG_TLS_CREDENTIALS=y
    CONFIG_TLS_CREDENTIALS_BACKEND_VOLATILE=y
    
    # Cryptography (mbed TLS general)
    CONFIG_NRF_SECURITY=y
    CONFIG_MBEDTLS=y
    CONFIG_MBEDTLS_MD=y
    CONFIG_MBEDTLS_TLS_LIBRARY=y
    CONFIG_MBEDTLS_X509_LIBRARY=y
    CONFIG_MBEDTLS_ENABLE_HEAP=y
    CONFIG_MBEDTLS_HEAP_SIZE=49152
    
    # Cryptography (mbed TLS options)
    CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=n
    CONFIG_MBEDTLS_SSL_SERVER_NAME_INDICATION=y
    CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED=y
    CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED=y
    # CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=16384
    CONFIG_MBEDTLS_MPI_MAX_SIZE=512
    # @todo: This is required for 'CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED'.
    CONFIG_MBEDTLS_LEGACY_CRYPTO_C=y
    
    # PSA API (General)
    CONFIG_MBEDTLS_USE_PSA_CRYPTO=y
    CONFIG_MBEDTLS_PSA_CRYPTO_C=y
    
    # PSA API (Drivers)
    CONFIG_PSA_CRYPTO_DRIVER_CRACEN=y
    CONFIG_PSA_USE_CRACEN_KEY_MANAGEMENT_DRIVER=y
    CONFIG_PSA_USE_CRACEN_KEY_DERIVATION_DRIVER=y
    CONFIG_PSA_USE_CRACEN_MAC_DRIVER=y
    CONFIG_PSA_USE_CRACEN_CIPHER_DRIVER=y
    CONFIG_PSA_USE_CRACEN_KEY_AGREEMENT_DRIVER=y
    CONFIG_PSA_USE_CRACEN_AEAD_DRIVER=y
    CONFIG_PSA_USE_CRACEN_ASYMMETRIC_SIGNATURE_DRIVER=y
    CONFIG_PSA_USE_CRACEN_ASYMMETRIC_ENCRYPTION_DRIVER=y
    CONFIG_PSA_USE_CRACEN_HASH_DRIVER=y
    
    # PSA API (Key types)
    CONFIG_PSA_WANT_KEY_TYPE_AES=y
    CONFIG_PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_IMPORT=y
    CONFIG_PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_GENERATE=y
    CONFIG_PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_DERIVE=y
    CONFIG_PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY=y
    CONFIG_PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_IMPORT=y
    CONFIG_PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_GENERATE=y
    CONFIG_PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY=y
    CONFIG_PSA_WANT_KEY_TYPE_HMAC=y
    
    # PSA API (Algorithms)
    CONFIG_PSA_WANT_ALG_ECDH=y
    CONFIG_PSA_WANT_ALG_HMAC=y
    CONFIG_PSA_WANT_ALG_CCM=y
    CONFIG_PSA_WANT_ALG_GCM=y
    CONFIG_PSA_WANT_ALG_HKDF=y
    CONFIG_PSA_WANT_ALG_TLS12_PRF=y
    CONFIG_PSA_WANT_ALG_ECDSA=y
    CONFIG_PSA_WANT_ALG_RSA_PKCS1V15_SIGN=y
    
    # PSA API (Elliptic curves)
    CONFIG_PSA_WANT_ECC_SECP_R1_256=y
    CONFIG_PSA_WANT_ECC_SECP_R1_384=y
    
    # PSA API (Random)
    CONFIG_PSA_WANT_GENERATE_RANDOM=y
    CONFIG_PSA_WANT_ALG_CTR_DRBG=y
    
    # PSA API (Hash algorithms)
    CONFIG_PSA_WANT_ALG_SHA_256=y
    CONFIG_PSA_WANT_ALG_SHA_384=y
    
    # PSA API (Key sizes)
    CONFIG_PSA_WANT_AES_KEY_SIZE_128=y
    CONFIG_PSA_WANT_AES_KEY_SIZE_256=y
    CONFIG_PSA_WANT_RSA_KEY_SIZE_2048=y
    CONFIG_PSA_WANT_RSA_KEY_SIZE_3072=y
    CONFIG_PSA_WANT_RSA_KEY_SIZE_4096=y
    

Children
No Data
Related