net: sockets_tls: add support for TLS 1.3

Enables TLS 1.3 sockets based on Mbed TLS.

Signed-off-by: Valerio Setti <vsetti@baylibre.com>
This commit is contained in:
Valerio Setti 2024-08-26 15:43:07 +02:00 committed by Anas Nashif
parent 33931cf8e1
commit 6be57aaedf
5 changed files with 95 additions and 26 deletions

View file

@ -329,6 +329,18 @@ Libraries / Subsystems
secure random sources when :kconfig:option:`CONFIG_MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG`
is also enabled. This is only meant to be used for test purposes, not in production.
(:github:`76408`)
* The Kconfig symbol :kconfig:option:`CONFIG_MBEDTLS_TLS_VERSION_1_3` was added to
enable TLS 1.3 support from Mbed TLS. When this is enabled the following
new Kconfig symbols can also be enabled:
* :kconfig:option:`CONFIG_MBEDTLS_TLS_SESSION_TICKETS` to enable session tickets
(RFC 5077);
* :kconfig:option:`CONFIG_MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED`
for TLS 1.3 PSK key exchange mode;
* :kconfig:option:`CONFIG_MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED`
for TLS 1.3 ephemeral key exchange mode;
* :kconfig:option:`CONFIG_MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED`
for TLS 1.3 PSK ephemeral key exchange mode.
* CMSIS-NN

View file

@ -78,6 +78,7 @@ enum net_ip_protocol_secure {
IPPROTO_TLS_1_0 = 256, /**< TLS 1.0 protocol */
IPPROTO_TLS_1_1 = 257, /**< TLS 1.1 protocol */
IPPROTO_TLS_1_2 = 258, /**< TLS 1.2 protocol */
IPPROTO_TLS_1_3 = 259, /**< TLS 1.3 protocol */
IPPROTO_DTLS_1_0 = 272, /**< DTLS 1.0 protocol */
IPPROTO_DTLS_1_2 = 273, /**< DTLS 1.2 protocol */
};

View file

@ -19,10 +19,24 @@ if MBEDTLS_TLS_VERSION_1_2
config MBEDTLS_DTLS
bool "Support for DTLS"
endif # MBEDTLS_TLS_VERSION_1_2
config MBEDTLS_TLS_VERSION_1_3
bool "Support for TLS 1.3"
if MBEDTLS_TLS_VERSION_1_3
config MBEDTLS_TLS_SESSION_TICKETS
bool "Support for RFC 5077 session tickets in TLS 1.3"
endif # MBEDTLS_TLS_VERSION_1_3
if MBEDTLS_TLS_VERSION_1_2 || MBEDTLS_TLS_VERSION_1_3
config MBEDTLS_SSL_ALPN
bool "Support for setting the supported Application Layer Protocols"
endif
endif # MBEDTLS_TLS_VERSION_1_2 || MBEDTLS_TLS_VERSION_1_3
endmenu # TLS
@ -57,21 +71,12 @@ config MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED
config MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED
bool "RSA-PSK based ciphersuite modes"
config MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED
bool
default y
depends on \
MBEDTLS_KEY_EXCHANGE_PSK_ENABLED || \
MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED || \
MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED || \
MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED
config MBEDTLS_PSK_MAX_LEN
int "Max size of TLS pre-shared keys"
default 32
depends on MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED
help
Max size of TLS pre-shared keys, in bytes.
Max size of TLS pre-shared keys, in bytes. It has no effect if no
PSK key exchange is used.
config MBEDTLS_KEY_EXCHANGE_RSA_ENABLED
bool "RSA-only based ciphersuite modes"
@ -91,7 +96,7 @@ config MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
config MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
bool "ECDHE-ECDSA based ciphersuite modes"
depends on MBEDTLS_ECDH_C && MBEDTLS_ECDSA_C
depends on MBEDTLS_ECDH_C && MBEDTLS_ECDSA_C || (PSA_WANT_ALG_ECDH && PSA_WANT_ALG_ECDSA)
config MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
bool "ECDH-ECDSA based ciphersuite modes"
@ -108,6 +113,19 @@ config MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
bool "ECJPAKE based ciphersuite modes"
depends on MBEDTLS_ECJPAKE_C
if MBEDTLS_TLS_VERSION_1_3
config MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED
bool "TLS 1.3 PSK key exchange mode"
config MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED
bool "TLS 1.3 ephemeral key exchange mode"
config MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED
bool "TLS 1.3 PSK ephemeral key exchange mode"
endif # MBEDTLS_TLS_VERSION_1_3
config MBEDTLS_HKDF_C
bool "HMAC-based Extract-and-Expand Key Derivation Function"

View file

@ -57,14 +57,32 @@
#define MBEDTLS_SSL_PROTO_TLS1_2
#endif
#if defined(CONFIG_MBEDTLS_TLS_VERSION_1_2)
#if defined(CONFIG_MBEDTLS_TLS_VERSION_1_3)
#define MBEDTLS_SSL_PROTO_TLS1_3
#define MBEDTLS_SSL_KEEP_PEER_CERTIFICATE
#define MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE
#endif
/* Modules required for TLS */
#if defined(CONFIG_MBEDTLS_TLS_VERSION_1_2) || \
defined(CONFIG_MBEDTLS_TLS_VERSION_1_3)
/* Common modules required for TLS 1.2 and 1.3 */
#define MBEDTLS_SSL_TLS_C
#define MBEDTLS_SSL_SRV_C
#define MBEDTLS_SSL_CLI_C
#define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
/* This is not supported by Mbed TLS in TLS 1.3 mode
* (see modules/crypto/mbedtls/docs/architecture/tls13-support.md).
*/
#if !defined(CONFIG_MBEDTLS_TLS_VERSION_1_3)
#define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
#endif
#endif /* CONFIG_MBEDTLS_TLS_VERSION_1_2 || CONFIG_MBEDTLS_TLS_VERSION_1_3 */
#if defined(CONFIG_MBEDTLS_TLS_SESSION_TICKETS)
#define MBEDTLS_SSL_SESSION_TICKETS
#define MBEDTLS_SSL_TICKET_C
#endif
#if defined(CONFIG_MBEDTLS_DTLS)
@ -128,6 +146,20 @@
#define MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
#endif
#if defined(CONFIG_MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED)
#define MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED
#define MBEDTLS_SSL_EARLY_DATA
#endif
#if defined(CONFIG_MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
#define MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED
#endif
#if defined(CONFIG_MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED)
#define MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED
#define MBEDTLS_SSL_EARLY_DATA
#endif
#if defined(CONFIG_MBEDTLS_HKDF_C)
#define MBEDTLS_HKDF_C
#endif
@ -353,12 +385,13 @@
#endif
#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \
defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) || \
defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED)
defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) || \
defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
#define MBEDTLS_X509_CRT_PARSE_C
#endif
@ -423,7 +456,7 @@
#endif
#if defined(CONFIG_MBEDTLS_SERVER_NAME_INDICATION) && \
defined(MBEDTLS_X509_CRT_PARSE_C)
defined(MBEDTLS_X509_CRT_PARSE_C)
#define MBEDTLS_SSL_SERVER_NAME_INDICATION
#endif

View file

@ -1056,7 +1056,7 @@ static int tls_set_psk(struct tls_context *tls,
struct tls_credential *psk,
struct tls_credential *psk_id)
{
#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
int err = mbedtls_ssl_conf_psk(&tls->config,
psk->buf, psk->len,
(const unsigned char *)psk_id->buf,
@ -1421,6 +1421,10 @@ static int tls_mbedtls_init(struct tls_context *context, bool is_server)
}
#endif
#if defined(MBEDTLS_SSL_EARLY_DATA)
mbedtls_ssl_conf_early_data(&context->config, MBEDTLS_SSL_EARLY_DATA_ENABLED);
#endif
ret = mbedtls_ssl_setup(&context->ssl,
&context->config);
if (ret != 0) {
@ -2034,7 +2038,7 @@ static int protocol_check(int family, int type, int *proto)
return -EAFNOSUPPORT;
}
if (*proto >= IPPROTO_TLS_1_0 && *proto <= IPPROTO_TLS_1_2) {
if (*proto >= IPPROTO_TLS_1_0 && *proto <= IPPROTO_TLS_1_3) {
if (type != SOCK_STREAM) {
return -EPROTOTYPE;
}
@ -2600,7 +2604,8 @@ static ssize_t recv_tls(struct tls_context *ctx, void *buf,
if (ret == MBEDTLS_ERR_SSL_WANT_READ ||
ret == MBEDTLS_ERR_SSL_WANT_WRITE ||
ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS ||
ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) {
ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS ||
ret == MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET) {
int timeout_ms;
if (!is_block) {