Skip to content

Commit 6be57aa

Browse files
valeriosettinashif
authored andcommitted
net: sockets_tls: add support for TLS 1.3
Enables TLS 1.3 sockets based on Mbed TLS. Signed-off-by: Valerio Setti <[email protected]>
1 parent 33931cf commit 6be57aa

File tree

5 files changed

+94
-25
lines changed

5 files changed

+94
-25
lines changed

doc/releases/release-notes-4.0.rst

+12
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,18 @@ Libraries / Subsystems
329329
secure random sources when :kconfig:option:`CONFIG_MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG`
330330
is also enabled. This is only meant to be used for test purposes, not in production.
331331
(:github:`76408`)
332+
* The Kconfig symbol :kconfig:option:`CONFIG_MBEDTLS_TLS_VERSION_1_3` was added to
333+
enable TLS 1.3 support from Mbed TLS. When this is enabled the following
334+
new Kconfig symbols can also be enabled:
335+
336+
* :kconfig:option:`CONFIG_MBEDTLS_TLS_SESSION_TICKETS` to enable session tickets
337+
(RFC 5077);
338+
* :kconfig:option:`CONFIG_MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED`
339+
for TLS 1.3 PSK key exchange mode;
340+
* :kconfig:option:`CONFIG_MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED`
341+
for TLS 1.3 ephemeral key exchange mode;
342+
* :kconfig:option:`CONFIG_MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED`
343+
for TLS 1.3 PSK ephemeral key exchange mode.
332344

333345
* CMSIS-NN
334346

include/zephyr/net/net_ip.h

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ enum net_ip_protocol_secure {
7878
IPPROTO_TLS_1_0 = 256, /**< TLS 1.0 protocol */
7979
IPPROTO_TLS_1_1 = 257, /**< TLS 1.1 protocol */
8080
IPPROTO_TLS_1_2 = 258, /**< TLS 1.2 protocol */
81+
IPPROTO_TLS_1_3 = 259, /**< TLS 1.3 protocol */
8182
IPPROTO_DTLS_1_0 = 272, /**< DTLS 1.0 protocol */
8283
IPPROTO_DTLS_1_2 = 273, /**< DTLS 1.2 protocol */
8384
};

modules/mbedtls/Kconfig.tls-generic

+31-13
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,24 @@ if MBEDTLS_TLS_VERSION_1_2
1919
config MBEDTLS_DTLS
2020
bool "Support for DTLS"
2121

22+
endif # MBEDTLS_TLS_VERSION_1_2
23+
24+
config MBEDTLS_TLS_VERSION_1_3
25+
bool "Support for TLS 1.3"
26+
27+
if MBEDTLS_TLS_VERSION_1_3
28+
29+
config MBEDTLS_TLS_SESSION_TICKETS
30+
bool "Support for RFC 5077 session tickets in TLS 1.3"
31+
32+
endif # MBEDTLS_TLS_VERSION_1_3
33+
34+
if MBEDTLS_TLS_VERSION_1_2 || MBEDTLS_TLS_VERSION_1_3
35+
2236
config MBEDTLS_SSL_ALPN
2337
bool "Support for setting the supported Application Layer Protocols"
2438

25-
endif
39+
endif # MBEDTLS_TLS_VERSION_1_2 || MBEDTLS_TLS_VERSION_1_3
2640

2741
endmenu # TLS
2842

@@ -57,21 +71,12 @@ config MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED
5771
config MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED
5872
bool "RSA-PSK based ciphersuite modes"
5973

60-
config MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED
61-
bool
62-
default y
63-
depends on \
64-
MBEDTLS_KEY_EXCHANGE_PSK_ENABLED || \
65-
MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED || \
66-
MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED || \
67-
MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED
68-
6974
config MBEDTLS_PSK_MAX_LEN
7075
int "Max size of TLS pre-shared keys"
7176
default 32
72-
depends on MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED
7377
help
74-
Max size of TLS pre-shared keys, in bytes.
78+
Max size of TLS pre-shared keys, in bytes. It has no effect if no
79+
PSK key exchange is used.
7580

7681
config MBEDTLS_KEY_EXCHANGE_RSA_ENABLED
7782
bool "RSA-only based ciphersuite modes"
@@ -91,7 +96,7 @@ config MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
9196

9297
config MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
9398
bool "ECDHE-ECDSA based ciphersuite modes"
94-
depends on MBEDTLS_ECDH_C && MBEDTLS_ECDSA_C
99+
depends on MBEDTLS_ECDH_C && MBEDTLS_ECDSA_C || (PSA_WANT_ALG_ECDH && PSA_WANT_ALG_ECDSA)
95100

96101
config MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
97102
bool "ECDH-ECDSA based ciphersuite modes"
@@ -108,6 +113,19 @@ config MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
108113
bool "ECJPAKE based ciphersuite modes"
109114
depends on MBEDTLS_ECJPAKE_C
110115

116+
if MBEDTLS_TLS_VERSION_1_3
117+
118+
config MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED
119+
bool "TLS 1.3 PSK key exchange mode"
120+
121+
config MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED
122+
bool "TLS 1.3 ephemeral key exchange mode"
123+
124+
config MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED
125+
bool "TLS 1.3 PSK ephemeral key exchange mode"
126+
127+
endif # MBEDTLS_TLS_VERSION_1_3
128+
111129
config MBEDTLS_HKDF_C
112130
bool "HMAC-based Extract-and-Expand Key Derivation Function"
113131

modules/mbedtls/configs/config-tls-generic.h

+42-9
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,32 @@
5757
#define MBEDTLS_SSL_PROTO_TLS1_2
5858
#endif
5959

60-
#if defined(CONFIG_MBEDTLS_TLS_VERSION_1_2)
60+
#if defined(CONFIG_MBEDTLS_TLS_VERSION_1_3)
61+
#define MBEDTLS_SSL_PROTO_TLS1_3
62+
#define MBEDTLS_SSL_KEEP_PEER_CERTIFICATE
63+
#define MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE
64+
#endif
6165

62-
/* Modules required for TLS */
66+
#if defined(CONFIG_MBEDTLS_TLS_VERSION_1_2) || \
67+
defined(CONFIG_MBEDTLS_TLS_VERSION_1_3)
68+
69+
/* Common modules required for TLS 1.2 and 1.3 */
6370
#define MBEDTLS_SSL_TLS_C
6471
#define MBEDTLS_SSL_SRV_C
6572
#define MBEDTLS_SSL_CLI_C
73+
74+
/* This is not supported by Mbed TLS in TLS 1.3 mode
75+
* (see modules/crypto/mbedtls/docs/architecture/tls13-support.md).
76+
*/
77+
#if !defined(CONFIG_MBEDTLS_TLS_VERSION_1_3)
6678
#define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
79+
#endif
6780

81+
#endif /* CONFIG_MBEDTLS_TLS_VERSION_1_2 || CONFIG_MBEDTLS_TLS_VERSION_1_3 */
82+
83+
#if defined(CONFIG_MBEDTLS_TLS_SESSION_TICKETS)
84+
#define MBEDTLS_SSL_SESSION_TICKETS
85+
#define MBEDTLS_SSL_TICKET_C
6886
#endif
6987

7088
#if defined(CONFIG_MBEDTLS_DTLS)
@@ -128,6 +146,20 @@
128146
#define MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
129147
#endif
130148

149+
#if defined(CONFIG_MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED)
150+
#define MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED
151+
#define MBEDTLS_SSL_EARLY_DATA
152+
#endif
153+
154+
#if defined(CONFIG_MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
155+
#define MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED
156+
#endif
157+
158+
#if defined(CONFIG_MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED)
159+
#define MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED
160+
#define MBEDTLS_SSL_EARLY_DATA
161+
#endif
162+
131163
#if defined(CONFIG_MBEDTLS_HKDF_C)
132164
#define MBEDTLS_HKDF_C
133165
#endif
@@ -353,12 +385,13 @@
353385
#endif
354386

355387
#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \
356-
defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
357-
defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
358-
defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
359-
defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
360-
defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) || \
361-
defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED)
388+
defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
389+
defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
390+
defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
391+
defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
392+
defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) || \
393+
defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
394+
defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
362395
#define MBEDTLS_X509_CRT_PARSE_C
363396
#endif
364397

@@ -423,7 +456,7 @@
423456
#endif
424457

425458
#if defined(CONFIG_MBEDTLS_SERVER_NAME_INDICATION) && \
426-
defined(MBEDTLS_X509_CRT_PARSE_C)
459+
defined(MBEDTLS_X509_CRT_PARSE_C)
427460
#define MBEDTLS_SSL_SERVER_NAME_INDICATION
428461
#endif
429462

subsys/net/lib/sockets/sockets_tls.c

+8-3
Original file line numberDiff line numberDiff line change
@@ -1056,7 +1056,7 @@ static int tls_set_psk(struct tls_context *tls,
10561056
struct tls_credential *psk,
10571057
struct tls_credential *psk_id)
10581058
{
1059-
#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
1059+
#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
10601060
int err = mbedtls_ssl_conf_psk(&tls->config,
10611061
psk->buf, psk->len,
10621062
(const unsigned char *)psk_id->buf,
@@ -1421,6 +1421,10 @@ static int tls_mbedtls_init(struct tls_context *context, bool is_server)
14211421
}
14221422
#endif
14231423

1424+
#if defined(MBEDTLS_SSL_EARLY_DATA)
1425+
mbedtls_ssl_conf_early_data(&context->config, MBEDTLS_SSL_EARLY_DATA_ENABLED);
1426+
#endif
1427+
14241428
ret = mbedtls_ssl_setup(&context->ssl,
14251429
&context->config);
14261430
if (ret != 0) {
@@ -2034,7 +2038,7 @@ static int protocol_check(int family, int type, int *proto)
20342038
return -EAFNOSUPPORT;
20352039
}
20362040

2037-
if (*proto >= IPPROTO_TLS_1_0 && *proto <= IPPROTO_TLS_1_2) {
2041+
if (*proto >= IPPROTO_TLS_1_0 && *proto <= IPPROTO_TLS_1_3) {
20382042
if (type != SOCK_STREAM) {
20392043
return -EPROTOTYPE;
20402044
}
@@ -2600,7 +2604,8 @@ static ssize_t recv_tls(struct tls_context *ctx, void *buf,
26002604
if (ret == MBEDTLS_ERR_SSL_WANT_READ ||
26012605
ret == MBEDTLS_ERR_SSL_WANT_WRITE ||
26022606
ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS ||
2603-
ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) {
2607+
ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS ||
2608+
ret == MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET) {
26042609
int timeout_ms;
26052610

26062611
if (!is_block) {

0 commit comments

Comments
 (0)