xref: /optee_os/lib/libmbedtls/mbedtls/library/ssl_client.c (revision b0563631928755fe864b97785160fb3088e9efdc)
132b31808SJens Wiklander /*
232b31808SJens Wiklander  *  TLS 1.2 and 1.3 client-side functions
332b31808SJens Wiklander  *
432b31808SJens Wiklander  *  Copyright The Mbed TLS Contributors
5*b0563631STom Van Eyck  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
632b31808SJens Wiklander  */
732b31808SJens Wiklander 
832b31808SJens Wiklander #include "common.h"
932b31808SJens Wiklander 
1032b31808SJens Wiklander #if defined(MBEDTLS_SSL_CLI_C)
1132b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3) || defined(MBEDTLS_SSL_PROTO_TLS1_2)
1232b31808SJens Wiklander 
1332b31808SJens Wiklander #include <string.h>
1432b31808SJens Wiklander 
15*b0563631STom Van Eyck #include "debug_internal.h"
1632b31808SJens Wiklander #include "mbedtls/error.h"
1732b31808SJens Wiklander #include "mbedtls/platform.h"
1832b31808SJens Wiklander 
1932b31808SJens Wiklander #include "ssl_client.h"
2032b31808SJens Wiklander #include "ssl_misc.h"
2132b31808SJens Wiklander #include "ssl_tls13_keys.h"
2232b31808SJens Wiklander #include "ssl_debug_helpers.h"
2332b31808SJens Wiklander 
2432b31808SJens Wiklander #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2532b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
2632b31808SJens Wiklander static int ssl_write_hostname_ext(mbedtls_ssl_context *ssl,
2732b31808SJens Wiklander                                   unsigned char *buf,
2832b31808SJens Wiklander                                   const unsigned char *end,
2932b31808SJens Wiklander                                   size_t *olen)
3032b31808SJens Wiklander {
3132b31808SJens Wiklander     unsigned char *p = buf;
3232b31808SJens Wiklander     size_t hostname_len;
3332b31808SJens Wiklander 
3432b31808SJens Wiklander     *olen = 0;
3532b31808SJens Wiklander 
3632b31808SJens Wiklander     if (ssl->hostname == NULL) {
3732b31808SJens Wiklander         return 0;
3832b31808SJens Wiklander     }
3932b31808SJens Wiklander 
4032b31808SJens Wiklander     MBEDTLS_SSL_DEBUG_MSG(3,
4132b31808SJens Wiklander                           ("client hello, adding server name extension: %s",
4232b31808SJens Wiklander                            ssl->hostname));
4332b31808SJens Wiklander 
4432b31808SJens Wiklander     hostname_len = strlen(ssl->hostname);
4532b31808SJens Wiklander 
4632b31808SJens Wiklander     MBEDTLS_SSL_CHK_BUF_PTR(p, end, hostname_len + 9);
4732b31808SJens Wiklander 
4832b31808SJens Wiklander     /*
4932b31808SJens Wiklander      * Sect. 3, RFC 6066 (TLS Extensions Definitions)
5032b31808SJens Wiklander      *
5132b31808SJens Wiklander      * In order to provide any of the server names, clients MAY include an
5232b31808SJens Wiklander      * extension of type "server_name" in the (extended) client hello. The
5332b31808SJens Wiklander      * "extension_data" field of this extension SHALL contain
5432b31808SJens Wiklander      * "ServerNameList" where:
5532b31808SJens Wiklander      *
5632b31808SJens Wiklander      * struct {
5732b31808SJens Wiklander      *     NameType name_type;
5832b31808SJens Wiklander      *     select (name_type) {
5932b31808SJens Wiklander      *         case host_name: HostName;
6032b31808SJens Wiklander      *     } name;
6132b31808SJens Wiklander      * } ServerName;
6232b31808SJens Wiklander      *
6332b31808SJens Wiklander      * enum {
6432b31808SJens Wiklander      *     host_name(0), (255)
6532b31808SJens Wiklander      * } NameType;
6632b31808SJens Wiklander      *
6732b31808SJens Wiklander      * opaque HostName<1..2^16-1>;
6832b31808SJens Wiklander      *
6932b31808SJens Wiklander      * struct {
7032b31808SJens Wiklander      *     ServerName server_name_list<1..2^16-1>
7132b31808SJens Wiklander      * } ServerNameList;
7232b31808SJens Wiklander      *
7332b31808SJens Wiklander      */
7432b31808SJens Wiklander     MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SERVERNAME, p, 0);
7532b31808SJens Wiklander     p += 2;
7632b31808SJens Wiklander 
7732b31808SJens Wiklander     MBEDTLS_PUT_UINT16_BE(hostname_len + 5, p, 0);
7832b31808SJens Wiklander     p += 2;
7932b31808SJens Wiklander 
8032b31808SJens Wiklander     MBEDTLS_PUT_UINT16_BE(hostname_len + 3, p, 0);
8132b31808SJens Wiklander     p += 2;
8232b31808SJens Wiklander 
8332b31808SJens Wiklander     *p++ = MBEDTLS_BYTE_0(MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME);
8432b31808SJens Wiklander 
8532b31808SJens Wiklander     MBEDTLS_PUT_UINT16_BE(hostname_len, p, 0);
8632b31808SJens Wiklander     p += 2;
8732b31808SJens Wiklander 
8832b31808SJens Wiklander     memcpy(p, ssl->hostname, hostname_len);
8932b31808SJens Wiklander 
9032b31808SJens Wiklander     *olen = hostname_len + 9;
9132b31808SJens Wiklander 
9232b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
9332b31808SJens Wiklander     mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_SERVERNAME);
9432b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
9532b31808SJens Wiklander     return 0;
9632b31808SJens Wiklander }
9732b31808SJens Wiklander #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
9832b31808SJens Wiklander 
9932b31808SJens Wiklander #if defined(MBEDTLS_SSL_ALPN)
10032b31808SJens Wiklander /*
10132b31808SJens Wiklander  * ssl_write_alpn_ext()
10232b31808SJens Wiklander  *
10332b31808SJens Wiklander  * Structure of the application_layer_protocol_negotiation extension in
10432b31808SJens Wiklander  * ClientHello:
10532b31808SJens Wiklander  *
10632b31808SJens Wiklander  * opaque ProtocolName<1..2^8-1>;
10732b31808SJens Wiklander  *
10832b31808SJens Wiklander  * struct {
10932b31808SJens Wiklander  *     ProtocolName protocol_name_list<2..2^16-1>
11032b31808SJens Wiklander  * } ProtocolNameList;
11132b31808SJens Wiklander  *
11232b31808SJens Wiklander  */
11332b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
11432b31808SJens Wiklander static int ssl_write_alpn_ext(mbedtls_ssl_context *ssl,
11532b31808SJens Wiklander                               unsigned char *buf,
11632b31808SJens Wiklander                               const unsigned char *end,
11732b31808SJens Wiklander                               size_t *out_len)
11832b31808SJens Wiklander {
11932b31808SJens Wiklander     unsigned char *p = buf;
12032b31808SJens Wiklander 
12132b31808SJens Wiklander     *out_len = 0;
12232b31808SJens Wiklander 
12332b31808SJens Wiklander     if (ssl->conf->alpn_list == NULL) {
12432b31808SJens Wiklander         return 0;
12532b31808SJens Wiklander     }
12632b31808SJens Wiklander 
12732b31808SJens Wiklander     MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding alpn extension"));
12832b31808SJens Wiklander 
12932b31808SJens Wiklander 
13032b31808SJens Wiklander     /* Check we have enough space for the extension type (2 bytes), the
13132b31808SJens Wiklander      * extension length (2 bytes) and the protocol_name_list length (2 bytes).
13232b31808SJens Wiklander      */
13332b31808SJens Wiklander     MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6);
13432b31808SJens Wiklander     MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ALPN, p, 0);
13532b31808SJens Wiklander     /* Skip writing extension and list length for now */
13632b31808SJens Wiklander     p += 6;
13732b31808SJens Wiklander 
13832b31808SJens Wiklander     /*
13932b31808SJens Wiklander      * opaque ProtocolName<1..2^8-1>;
14032b31808SJens Wiklander      *
14132b31808SJens Wiklander      * struct {
14232b31808SJens Wiklander      *     ProtocolName protocol_name_list<2..2^16-1>
14332b31808SJens Wiklander      * } ProtocolNameList;
14432b31808SJens Wiklander      */
14532b31808SJens Wiklander     for (const char **cur = ssl->conf->alpn_list; *cur != NULL; cur++) {
14632b31808SJens Wiklander         /*
14732b31808SJens Wiklander          * mbedtls_ssl_conf_set_alpn_protocols() checked that the length of
14832b31808SJens Wiklander          * protocol names is less than 255.
14932b31808SJens Wiklander          */
15032b31808SJens Wiklander         size_t protocol_name_len = strlen(*cur);
15132b31808SJens Wiklander 
15232b31808SJens Wiklander         MBEDTLS_SSL_CHK_BUF_PTR(p, end, 1 + protocol_name_len);
15332b31808SJens Wiklander         *p++ = (unsigned char) protocol_name_len;
15432b31808SJens Wiklander         memcpy(p, *cur, protocol_name_len);
15532b31808SJens Wiklander         p += protocol_name_len;
15632b31808SJens Wiklander     }
15732b31808SJens Wiklander 
158*b0563631STom Van Eyck     *out_len = (size_t) (p - buf);
15932b31808SJens Wiklander 
16032b31808SJens Wiklander     /* List length = *out_len - 2 (ext_type) - 2 (ext_len) - 2 (list_len) */
16132b31808SJens Wiklander     MBEDTLS_PUT_UINT16_BE(*out_len - 6, buf, 4);
16232b31808SJens Wiklander 
16332b31808SJens Wiklander     /* Extension length = *out_len - 2 (ext_type) - 2 (ext_len) */
16432b31808SJens Wiklander     MBEDTLS_PUT_UINT16_BE(*out_len - 4, buf, 2);
16532b31808SJens Wiklander 
16632b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
16732b31808SJens Wiklander     mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_ALPN);
16832b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
16932b31808SJens Wiklander     return 0;
17032b31808SJens Wiklander }
17132b31808SJens Wiklander #endif /* MBEDTLS_SSL_ALPN */
17232b31808SJens Wiklander 
173*b0563631STom Van Eyck #if defined(MBEDTLS_SSL_TLS1_2_SOME_ECC) || \
174*b0563631STom Van Eyck     defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
17532b31808SJens Wiklander /*
17632b31808SJens Wiklander  * Function for writing a supported groups (TLS 1.3) or supported elliptic
17732b31808SJens Wiklander  * curves (TLS 1.2) extension.
17832b31808SJens Wiklander  *
17932b31808SJens Wiklander  * The "extension_data" field of a supported groups extension contains a
18032b31808SJens Wiklander  * "NamedGroupList" value (TLS 1.3 RFC8446):
18132b31808SJens Wiklander  *      enum {
18232b31808SJens Wiklander  *          secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019),
18332b31808SJens Wiklander  *          x25519(0x001D), x448(0x001E),
18432b31808SJens Wiklander  *          ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102),
18532b31808SJens Wiklander  *          ffdhe6144(0x0103), ffdhe8192(0x0104),
18632b31808SJens Wiklander  *          ffdhe_private_use(0x01FC..0x01FF),
18732b31808SJens Wiklander  *          ecdhe_private_use(0xFE00..0xFEFF),
18832b31808SJens Wiklander  *          (0xFFFF)
18932b31808SJens Wiklander  *      } NamedGroup;
19032b31808SJens Wiklander  *      struct {
19132b31808SJens Wiklander  *          NamedGroup named_group_list<2..2^16-1>;
19232b31808SJens Wiklander  *      } NamedGroupList;
19332b31808SJens Wiklander  *
19432b31808SJens Wiklander  * The "extension_data" field of a supported elliptic curves extension contains
19532b31808SJens Wiklander  * a "NamedCurveList" value (TLS 1.2 RFC 8422):
19632b31808SJens Wiklander  * enum {
19732b31808SJens Wiklander  *      deprecated(1..22),
19832b31808SJens Wiklander  *      secp256r1 (23), secp384r1 (24), secp521r1 (25),
19932b31808SJens Wiklander  *      x25519(29), x448(30),
20032b31808SJens Wiklander  *      reserved (0xFE00..0xFEFF),
20132b31808SJens Wiklander  *      deprecated(0xFF01..0xFF02),
20232b31808SJens Wiklander  *      (0xFFFF)
20332b31808SJens Wiklander  *  } NamedCurve;
20432b31808SJens Wiklander  * struct {
20532b31808SJens Wiklander  *      NamedCurve named_curve_list<2..2^16-1>
20632b31808SJens Wiklander  *  } NamedCurveList;
20732b31808SJens Wiklander  *
20832b31808SJens Wiklander  * The TLS 1.3 supported groups extension was defined to be a compatible
20932b31808SJens Wiklander  * generalization of the TLS 1.2 supported elliptic curves extension. They both
21032b31808SJens Wiklander  * share the same extension identifier.
21132b31808SJens Wiklander  *
21232b31808SJens Wiklander  */
213*b0563631STom Van Eyck #define SSL_WRITE_SUPPORTED_GROUPS_EXT_TLS1_2_FLAG 1
214*b0563631STom Van Eyck #define SSL_WRITE_SUPPORTED_GROUPS_EXT_TLS1_3_FLAG 2
215*b0563631STom Van Eyck 
21632b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
21732b31808SJens Wiklander static int ssl_write_supported_groups_ext(mbedtls_ssl_context *ssl,
21832b31808SJens Wiklander                                           unsigned char *buf,
21932b31808SJens Wiklander                                           const unsigned char *end,
220*b0563631STom Van Eyck                                           int flags,
22132b31808SJens Wiklander                                           size_t *out_len)
22232b31808SJens Wiklander {
22332b31808SJens Wiklander     unsigned char *p = buf;
22432b31808SJens Wiklander     unsigned char *named_group_list; /* Start of named_group_list */
22532b31808SJens Wiklander     size_t named_group_list_len;     /* Length of named_group_list */
22632b31808SJens Wiklander     const uint16_t *group_list = mbedtls_ssl_get_groups(ssl);
22732b31808SJens Wiklander 
22832b31808SJens Wiklander     *out_len = 0;
22932b31808SJens Wiklander 
23032b31808SJens Wiklander     MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding supported_groups extension"));
23132b31808SJens Wiklander 
23232b31808SJens Wiklander     /* Check if we have space for header and length fields:
23332b31808SJens Wiklander      * - extension_type            (2 bytes)
23432b31808SJens Wiklander      * - extension_data_length     (2 bytes)
23532b31808SJens Wiklander      * - named_group_list_length   (2 bytes)
23632b31808SJens Wiklander      */
23732b31808SJens Wiklander     MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6);
23832b31808SJens Wiklander     p += 6;
23932b31808SJens Wiklander 
24032b31808SJens Wiklander     named_group_list = p;
24132b31808SJens Wiklander 
24232b31808SJens Wiklander     if (group_list == NULL) {
24332b31808SJens Wiklander         return MBEDTLS_ERR_SSL_BAD_CONFIG;
24432b31808SJens Wiklander     }
24532b31808SJens Wiklander 
24632b31808SJens Wiklander     for (; *group_list != 0; group_list++) {
247*b0563631STom Van Eyck         int propose_group = 0;
24832b31808SJens Wiklander 
249*b0563631STom Van Eyck         MBEDTLS_SSL_DEBUG_MSG(3, ("got supported group(%04x)", *group_list));
250*b0563631STom Van Eyck 
251*b0563631STom Van Eyck #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
252*b0563631STom Van Eyck         if (flags & SSL_WRITE_SUPPORTED_GROUPS_EXT_TLS1_3_FLAG) {
253*b0563631STom Van Eyck #if defined(PSA_WANT_ALG_ECDH)
254*b0563631STom Van Eyck             if (mbedtls_ssl_tls13_named_group_is_ecdhe(*group_list) &&
255*b0563631STom Van Eyck                 (mbedtls_ssl_get_ecp_group_id_from_tls_id(*group_list) !=
256*b0563631STom Van Eyck                  MBEDTLS_ECP_DP_NONE)) {
257*b0563631STom Van Eyck                 propose_group = 1;
25832b31808SJens Wiklander             }
259*b0563631STom Van Eyck #endif
260*b0563631STom Van Eyck #if defined(PSA_WANT_ALG_FFDH)
261*b0563631STom Van Eyck             if (mbedtls_ssl_tls13_named_group_is_ffdh(*group_list)) {
262*b0563631STom Van Eyck                 propose_group = 1;
263*b0563631STom Van Eyck             }
264*b0563631STom Van Eyck #endif
265*b0563631STom Van Eyck         }
266*b0563631STom Van Eyck #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */
267*b0563631STom Van Eyck 
268*b0563631STom Van Eyck #if defined(MBEDTLS_SSL_TLS1_2_SOME_ECC)
269*b0563631STom Van Eyck         if ((flags & SSL_WRITE_SUPPORTED_GROUPS_EXT_TLS1_2_FLAG) &&
270*b0563631STom Van Eyck             mbedtls_ssl_tls12_named_group_is_ecdhe(*group_list) &&
271*b0563631STom Van Eyck             (mbedtls_ssl_get_ecp_group_id_from_tls_id(*group_list) !=
272*b0563631STom Van Eyck              MBEDTLS_ECP_DP_NONE)) {
273*b0563631STom Van Eyck             propose_group = 1;
274*b0563631STom Van Eyck         }
275*b0563631STom Van Eyck #endif /* MBEDTLS_SSL_TLS1_2_SOME_ECC */
276*b0563631STom Van Eyck 
277*b0563631STom Van Eyck         if (propose_group) {
27832b31808SJens Wiklander             MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
27932b31808SJens Wiklander             MBEDTLS_PUT_UINT16_BE(*group_list, p, 0);
28032b31808SJens Wiklander             p += 2;
28132b31808SJens Wiklander             MBEDTLS_SSL_DEBUG_MSG(3, ("NamedGroup: %s ( %x )",
282*b0563631STom Van Eyck                                       mbedtls_ssl_named_group_to_str(*group_list),
28332b31808SJens Wiklander                                       *group_list));
28432b31808SJens Wiklander         }
28532b31808SJens Wiklander     }
28632b31808SJens Wiklander 
28732b31808SJens Wiklander     /* Length of named_group_list */
288*b0563631STom Van Eyck     named_group_list_len = (size_t) (p - named_group_list);
28932b31808SJens Wiklander     if (named_group_list_len == 0) {
29032b31808SJens Wiklander         MBEDTLS_SSL_DEBUG_MSG(1, ("No group available."));
29132b31808SJens Wiklander         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
29232b31808SJens Wiklander     }
29332b31808SJens Wiklander 
29432b31808SJens Wiklander     /* Write extension_type */
29532b31808SJens Wiklander     MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_GROUPS, buf, 0);
29632b31808SJens Wiklander     /* Write extension_data_length */
29732b31808SJens Wiklander     MBEDTLS_PUT_UINT16_BE(named_group_list_len + 2, buf, 2);
29832b31808SJens Wiklander     /* Write length of named_group_list */
29932b31808SJens Wiklander     MBEDTLS_PUT_UINT16_BE(named_group_list_len, buf, 4);
30032b31808SJens Wiklander 
30132b31808SJens Wiklander     MBEDTLS_SSL_DEBUG_BUF(3, "Supported groups extension",
30232b31808SJens Wiklander                           buf + 4, named_group_list_len + 2);
30332b31808SJens Wiklander 
304*b0563631STom Van Eyck     *out_len = (size_t) (p - buf);
30532b31808SJens Wiklander 
30632b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
30732b31808SJens Wiklander     mbedtls_ssl_tls13_set_hs_sent_ext_mask(
30832b31808SJens Wiklander         ssl, MBEDTLS_TLS_EXT_SUPPORTED_GROUPS);
30932b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
31032b31808SJens Wiklander 
31132b31808SJens Wiklander     return 0;
31232b31808SJens Wiklander }
313*b0563631STom Van Eyck #endif /* MBEDTLS_SSL_TLS1_2_SOME_ECC ||
314*b0563631STom Van Eyck           MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */
31532b31808SJens Wiklander 
31632b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
31732b31808SJens Wiklander static int ssl_write_client_hello_cipher_suites(
31832b31808SJens Wiklander     mbedtls_ssl_context *ssl,
31932b31808SJens Wiklander     unsigned char *buf,
32032b31808SJens Wiklander     unsigned char *end,
32132b31808SJens Wiklander     int *tls12_uses_ec,
32232b31808SJens Wiklander     size_t *out_len)
32332b31808SJens Wiklander {
32432b31808SJens Wiklander     unsigned char *p = buf;
32532b31808SJens Wiklander     const int *ciphersuite_list;
32632b31808SJens Wiklander     unsigned char *cipher_suites; /* Start of the cipher_suites list */
32732b31808SJens Wiklander     size_t cipher_suites_len;
32832b31808SJens Wiklander 
32932b31808SJens Wiklander     *tls12_uses_ec = 0;
33032b31808SJens Wiklander     *out_len = 0;
33132b31808SJens Wiklander 
33232b31808SJens Wiklander     /*
33332b31808SJens Wiklander      * Ciphersuite list
33432b31808SJens Wiklander      *
33532b31808SJens Wiklander      * This is a list of the symmetric cipher options supported by
33632b31808SJens Wiklander      * the client, specifically the record protection algorithm
33732b31808SJens Wiklander      * ( including secret key length ) and a hash to be used with
33832b31808SJens Wiklander      * HKDF, in descending order of client preference.
33932b31808SJens Wiklander      */
34032b31808SJens Wiklander     ciphersuite_list = ssl->conf->ciphersuite_list;
34132b31808SJens Wiklander 
34232b31808SJens Wiklander     /* Check there is space for the cipher suite list length (2 bytes). */
34332b31808SJens Wiklander     MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
34432b31808SJens Wiklander     p += 2;
34532b31808SJens Wiklander 
34632b31808SJens Wiklander     /* Write cipher_suites
34732b31808SJens Wiklander      * CipherSuite cipher_suites<2..2^16-2>;
34832b31808SJens Wiklander      */
34932b31808SJens Wiklander     cipher_suites = p;
35032b31808SJens Wiklander     for (size_t i = 0; ciphersuite_list[i] != 0; i++) {
35132b31808SJens Wiklander         int cipher_suite = ciphersuite_list[i];
35232b31808SJens Wiklander         const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
35332b31808SJens Wiklander 
35432b31808SJens Wiklander         ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(cipher_suite);
35532b31808SJens Wiklander 
35632b31808SJens Wiklander         if (mbedtls_ssl_validate_ciphersuite(ssl, ciphersuite_info,
35732b31808SJens Wiklander                                              ssl->handshake->min_tls_version,
35832b31808SJens Wiklander                                              ssl->tls_version) != 0) {
35932b31808SJens Wiklander             continue;
36032b31808SJens Wiklander         }
36132b31808SJens Wiklander 
36232b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
363*b0563631STom Van Eyck         (defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
364*b0563631STom Van Eyck         defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
36532b31808SJens Wiklander         defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED))
36632b31808SJens Wiklander         *tls12_uses_ec |= mbedtls_ssl_ciphersuite_uses_ec(ciphersuite_info);
36732b31808SJens Wiklander #endif
36832b31808SJens Wiklander 
36932b31808SJens Wiklander         MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, add ciphersuite: %04x, %s",
37032b31808SJens Wiklander                                   (unsigned int) cipher_suite,
37132b31808SJens Wiklander                                   ciphersuite_info->name));
37232b31808SJens Wiklander 
37332b31808SJens Wiklander         /* Check there is space for the cipher suite identifier (2 bytes). */
37432b31808SJens Wiklander         MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
37532b31808SJens Wiklander         MBEDTLS_PUT_UINT16_BE(cipher_suite, p, 0);
37632b31808SJens Wiklander         p += 2;
37732b31808SJens Wiklander     }
37832b31808SJens Wiklander 
37932b31808SJens Wiklander     /*
38032b31808SJens Wiklander      * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
38132b31808SJens Wiklander      */
38232b31808SJens Wiklander     int renegotiating = 0;
38332b31808SJens Wiklander #if defined(MBEDTLS_SSL_RENEGOTIATION)
38432b31808SJens Wiklander     renegotiating = (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE);
38532b31808SJens Wiklander #endif
38632b31808SJens Wiklander     if (!renegotiating) {
38732b31808SJens Wiklander         MBEDTLS_SSL_DEBUG_MSG(3, ("adding EMPTY_RENEGOTIATION_INFO_SCSV"));
38832b31808SJens Wiklander         MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
38932b31808SJens Wiklander         MBEDTLS_PUT_UINT16_BE(MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO, p, 0);
39032b31808SJens Wiklander         p += 2;
39132b31808SJens Wiklander     }
39232b31808SJens Wiklander 
39332b31808SJens Wiklander     /* Write the cipher_suites length in number of bytes */
394*b0563631STom Van Eyck     cipher_suites_len = (size_t) (p - cipher_suites);
39532b31808SJens Wiklander     MBEDTLS_PUT_UINT16_BE(cipher_suites_len, buf, 0);
39632b31808SJens Wiklander     MBEDTLS_SSL_DEBUG_MSG(3,
39732b31808SJens Wiklander                           ("client hello, got %" MBEDTLS_PRINTF_SIZET " cipher suites",
39832b31808SJens Wiklander                            cipher_suites_len/2));
39932b31808SJens Wiklander 
40032b31808SJens Wiklander     /* Output the total length of cipher_suites field. */
401*b0563631STom Van Eyck     *out_len = (size_t) (p - buf);
40232b31808SJens Wiklander 
40332b31808SJens Wiklander     return 0;
40432b31808SJens Wiklander }
40532b31808SJens Wiklander 
40632b31808SJens Wiklander /*
40732b31808SJens Wiklander  * Structure of the TLS 1.3 ClientHello message:
40832b31808SJens Wiklander  *
40932b31808SJens Wiklander  *    struct {
41032b31808SJens Wiklander  *        ProtocolVersion legacy_version = 0x0303;    // TLS v1.2
41132b31808SJens Wiklander  *        Random random;
41232b31808SJens Wiklander  *        opaque legacy_session_id<0..32>;
41332b31808SJens Wiklander  *        CipherSuite cipher_suites<2..2^16-2>;
41432b31808SJens Wiklander  *        opaque legacy_compression_methods<1..2^8-1>;
41532b31808SJens Wiklander  *        Extension extensions<8..2^16-1>;
41632b31808SJens Wiklander  *    } ClientHello;
41732b31808SJens Wiklander  *
41832b31808SJens Wiklander  * Structure of the (D)TLS 1.2 ClientHello message:
41932b31808SJens Wiklander  *
42032b31808SJens Wiklander  * struct {
42132b31808SJens Wiklander  *     ProtocolVersion client_version;
42232b31808SJens Wiklander  *     Random random;
42332b31808SJens Wiklander  *     SessionID session_id;
42432b31808SJens Wiklander  *     opaque cookie<0..2^8-1>; // DTLS 1.2 ONLY
42532b31808SJens Wiklander  *     CipherSuite cipher_suites<2..2^16-2>;
42632b31808SJens Wiklander  *     CompressionMethod compression_methods<1..2^8-1>;
42732b31808SJens Wiklander  *     select (extensions_present) {
42832b31808SJens Wiklander  *         case false:
42932b31808SJens Wiklander  *             struct {};
43032b31808SJens Wiklander  *         case true:
43132b31808SJens Wiklander  *             Extension extensions<0..2^16-1>;
43232b31808SJens Wiklander  *     };
43332b31808SJens Wiklander  * } ClientHello;
43432b31808SJens Wiklander  */
43532b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
43632b31808SJens Wiklander static int ssl_write_client_hello_body(mbedtls_ssl_context *ssl,
43732b31808SJens Wiklander                                        unsigned char *buf,
43832b31808SJens Wiklander                                        unsigned char *end,
43932b31808SJens Wiklander                                        size_t *out_len,
44032b31808SJens Wiklander                                        size_t *binders_len)
44132b31808SJens Wiklander {
44232b31808SJens Wiklander     int ret;
44332b31808SJens Wiklander     mbedtls_ssl_handshake_params *handshake = ssl->handshake;
44432b31808SJens Wiklander     unsigned char *p = buf;
44532b31808SJens Wiklander     unsigned char *p_extensions_len; /* Pointer to extensions length */
44632b31808SJens Wiklander     size_t output_len;               /* Length of buffer used by function */
44732b31808SJens Wiklander     size_t extensions_len;           /* Length of the list of extensions*/
44832b31808SJens Wiklander     int tls12_uses_ec = 0;
44932b31808SJens Wiklander 
45032b31808SJens Wiklander     *out_len = 0;
45132b31808SJens Wiklander     *binders_len = 0;
45232b31808SJens Wiklander 
45332b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
45432b31808SJens Wiklander     unsigned char propose_tls12 =
45532b31808SJens Wiklander         (handshake->min_tls_version <= MBEDTLS_SSL_VERSION_TLS1_2)
45632b31808SJens Wiklander         &&
45732b31808SJens Wiklander         (MBEDTLS_SSL_VERSION_TLS1_2 <= ssl->tls_version);
45832b31808SJens Wiklander #endif
45932b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
46032b31808SJens Wiklander     unsigned char propose_tls13 =
46132b31808SJens Wiklander         (handshake->min_tls_version <= MBEDTLS_SSL_VERSION_TLS1_3)
46232b31808SJens Wiklander         &&
46332b31808SJens Wiklander         (MBEDTLS_SSL_VERSION_TLS1_3 <= ssl->tls_version);
46432b31808SJens Wiklander #endif
46532b31808SJens Wiklander 
46632b31808SJens Wiklander     /*
46732b31808SJens Wiklander      * Write client_version (TLS 1.2) or legacy_version (TLS 1.3)
46832b31808SJens Wiklander      *
46932b31808SJens Wiklander      * In all cases this is the TLS 1.2 version.
47032b31808SJens Wiklander      */
47132b31808SJens Wiklander     MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
47232b31808SJens Wiklander     mbedtls_ssl_write_version(p, ssl->conf->transport,
47332b31808SJens Wiklander                               MBEDTLS_SSL_VERSION_TLS1_2);
47432b31808SJens Wiklander     p += 2;
47532b31808SJens Wiklander 
47632b31808SJens Wiklander     /* ...
47732b31808SJens Wiklander      * Random random;
47832b31808SJens Wiklander      * ...
47932b31808SJens Wiklander      *
48032b31808SJens Wiklander      * The random bytes have been prepared by ssl_prepare_client_hello() into
48132b31808SJens Wiklander      * the handshake->randbytes buffer and are copied here into the output
48232b31808SJens Wiklander      * buffer.
48332b31808SJens Wiklander      */
48432b31808SJens Wiklander     MBEDTLS_SSL_CHK_BUF_PTR(p, end, MBEDTLS_CLIENT_HELLO_RANDOM_LEN);
48532b31808SJens Wiklander     memcpy(p, handshake->randbytes, MBEDTLS_CLIENT_HELLO_RANDOM_LEN);
48632b31808SJens Wiklander     MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes",
48732b31808SJens Wiklander                           p, MBEDTLS_CLIENT_HELLO_RANDOM_LEN);
48832b31808SJens Wiklander     p += MBEDTLS_CLIENT_HELLO_RANDOM_LEN;
48932b31808SJens Wiklander 
49032b31808SJens Wiklander     /* TLS 1.2:
49132b31808SJens Wiklander      * ...
49232b31808SJens Wiklander      * SessionID session_id;
49332b31808SJens Wiklander      * ...
49432b31808SJens Wiklander      * with
49532b31808SJens Wiklander      * opaque SessionID<0..32>;
49632b31808SJens Wiklander      *
49732b31808SJens Wiklander      * TLS 1.3:
49832b31808SJens Wiklander      * ...
49932b31808SJens Wiklander      * opaque legacy_session_id<0..32>;
50032b31808SJens Wiklander      * ...
50132b31808SJens Wiklander      *
50232b31808SJens Wiklander      * The (legacy) session identifier bytes have been prepared by
50332b31808SJens Wiklander      * ssl_prepare_client_hello() into the ssl->session_negotiate->id buffer
50432b31808SJens Wiklander      * and are copied here into the output buffer.
50532b31808SJens Wiklander      */
50632b31808SJens Wiklander     MBEDTLS_SSL_CHK_BUF_PTR(p, end, ssl->session_negotiate->id_len + 1);
50732b31808SJens Wiklander     *p++ = (unsigned char) ssl->session_negotiate->id_len;
50832b31808SJens Wiklander     memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
50932b31808SJens Wiklander     p += ssl->session_negotiate->id_len;
51032b31808SJens Wiklander 
51132b31808SJens Wiklander     MBEDTLS_SSL_DEBUG_BUF(3, "session id", ssl->session_negotiate->id,
51232b31808SJens Wiklander                           ssl->session_negotiate->id_len);
51332b31808SJens Wiklander 
51432b31808SJens Wiklander     /* DTLS 1.2 ONLY
51532b31808SJens Wiklander      * ...
51632b31808SJens Wiklander      * opaque cookie<0..2^8-1>;
51732b31808SJens Wiklander      * ...
51832b31808SJens Wiklander      */
51932b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_SSL_PROTO_DTLS)
52032b31808SJens Wiklander     if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
52132b31808SJens Wiklander #if !defined(MBEDTLS_SSL_PROTO_TLS1_3)
52232b31808SJens Wiklander         uint8_t cookie_len = 0;
52332b31808SJens Wiklander #else
52432b31808SJens Wiklander         uint16_t cookie_len = 0;
52532b31808SJens Wiklander #endif /* !MBEDTLS_SSL_PROTO_TLS1_3 */
52632b31808SJens Wiklander 
52732b31808SJens Wiklander         if (handshake->cookie != NULL) {
52832b31808SJens Wiklander             MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
52932b31808SJens Wiklander                                   handshake->cookie,
53032b31808SJens Wiklander                                   handshake->cookie_len);
53132b31808SJens Wiklander             cookie_len = handshake->cookie_len;
53232b31808SJens Wiklander         }
53332b31808SJens Wiklander 
53432b31808SJens Wiklander         MBEDTLS_SSL_CHK_BUF_PTR(p, end, cookie_len + 1);
53532b31808SJens Wiklander         *p++ = (unsigned char) cookie_len;
53632b31808SJens Wiklander         if (cookie_len > 0) {
53732b31808SJens Wiklander             memcpy(p, handshake->cookie, cookie_len);
53832b31808SJens Wiklander             p += cookie_len;
53932b31808SJens Wiklander         }
54032b31808SJens Wiklander     }
54132b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_SSL_PROTO_DTLS */
54232b31808SJens Wiklander 
54332b31808SJens Wiklander     /* Write cipher_suites */
54432b31808SJens Wiklander     ret = ssl_write_client_hello_cipher_suites(ssl, p, end,
54532b31808SJens Wiklander                                                &tls12_uses_ec,
54632b31808SJens Wiklander                                                &output_len);
54732b31808SJens Wiklander     if (ret != 0) {
54832b31808SJens Wiklander         return ret;
54932b31808SJens Wiklander     }
55032b31808SJens Wiklander     p += output_len;
55132b31808SJens Wiklander 
55232b31808SJens Wiklander     /* Write legacy_compression_methods (TLS 1.3) or
55332b31808SJens Wiklander      * compression_methods (TLS 1.2)
55432b31808SJens Wiklander      *
55532b31808SJens Wiklander      * For every TLS 1.3 ClientHello, this vector MUST contain exactly
55632b31808SJens Wiklander      * one byte set to zero, which corresponds to the 'null' compression
55732b31808SJens Wiklander      * method in prior versions of TLS.
55832b31808SJens Wiklander      *
55932b31808SJens Wiklander      * For TLS 1.2 ClientHello, for security reasons we do not support
56032b31808SJens Wiklander      * compression anymore, thus also just the 'null' compression method.
56132b31808SJens Wiklander      */
56232b31808SJens Wiklander     MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
56332b31808SJens Wiklander     *p++ = 1;
56432b31808SJens Wiklander     *p++ = MBEDTLS_SSL_COMPRESS_NULL;
56532b31808SJens Wiklander 
56632b31808SJens Wiklander     /* Write extensions */
56732b31808SJens Wiklander 
56832b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
56932b31808SJens Wiklander     /* Keeping track of the included extensions */
57032b31808SJens Wiklander     handshake->sent_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
57132b31808SJens Wiklander #endif
57232b31808SJens Wiklander 
57332b31808SJens Wiklander     /* First write extensions, then the total length */
57432b31808SJens Wiklander     MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
57532b31808SJens Wiklander     p_extensions_len = p;
57632b31808SJens Wiklander     p += 2;
57732b31808SJens Wiklander 
57832b31808SJens Wiklander #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
57932b31808SJens Wiklander     /* Write server name extension */
58032b31808SJens Wiklander     ret = ssl_write_hostname_ext(ssl, p, end, &output_len);
58132b31808SJens Wiklander     if (ret != 0) {
58232b31808SJens Wiklander         return ret;
58332b31808SJens Wiklander     }
58432b31808SJens Wiklander     p += output_len;
58532b31808SJens Wiklander #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
58632b31808SJens Wiklander 
58732b31808SJens Wiklander #if defined(MBEDTLS_SSL_ALPN)
58832b31808SJens Wiklander     ret = ssl_write_alpn_ext(ssl, p, end, &output_len);
58932b31808SJens Wiklander     if (ret != 0) {
59032b31808SJens Wiklander         return ret;
59132b31808SJens Wiklander     }
59232b31808SJens Wiklander     p += output_len;
59332b31808SJens Wiklander #endif /* MBEDTLS_SSL_ALPN */
59432b31808SJens Wiklander 
59532b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
59632b31808SJens Wiklander     if (propose_tls13) {
59732b31808SJens Wiklander         ret = mbedtls_ssl_tls13_write_client_hello_exts(ssl, p, end,
59832b31808SJens Wiklander                                                         &output_len);
59932b31808SJens Wiklander         if (ret != 0) {
60032b31808SJens Wiklander             return ret;
60132b31808SJens Wiklander         }
60232b31808SJens Wiklander         p += output_len;
60332b31808SJens Wiklander     }
60432b31808SJens Wiklander #endif
60532b31808SJens Wiklander 
606*b0563631STom Van Eyck #if defined(MBEDTLS_SSL_TLS1_2_SOME_ECC) || \
607*b0563631STom Van Eyck     defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
608*b0563631STom Van Eyck     {
609*b0563631STom Van Eyck         int ssl_write_supported_groups_ext_flags = 0;
610*b0563631STom Van Eyck 
611*b0563631STom Van Eyck #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
612*b0563631STom Van Eyck         if (propose_tls13 && mbedtls_ssl_conf_tls13_is_some_ephemeral_enabled(ssl)) {
613*b0563631STom Van Eyck             ssl_write_supported_groups_ext_flags |=
614*b0563631STom Van Eyck                 SSL_WRITE_SUPPORTED_GROUPS_EXT_TLS1_3_FLAG;
615*b0563631STom Van Eyck         }
61632b31808SJens Wiklander #endif
617*b0563631STom Van Eyck #if defined(MBEDTLS_SSL_TLS1_2_SOME_ECC)
618*b0563631STom Van Eyck         if (propose_tls12 && tls12_uses_ec) {
619*b0563631STom Van Eyck             ssl_write_supported_groups_ext_flags |=
620*b0563631STom Van Eyck                 SSL_WRITE_SUPPORTED_GROUPS_EXT_TLS1_2_FLAG;
621*b0563631STom Van Eyck         }
62232b31808SJens Wiklander #endif
623*b0563631STom Van Eyck         if (ssl_write_supported_groups_ext_flags != 0) {
624*b0563631STom Van Eyck             ret = ssl_write_supported_groups_ext(ssl, p, end,
625*b0563631STom Van Eyck                                                  ssl_write_supported_groups_ext_flags,
626*b0563631STom Van Eyck                                                  &output_len);
62732b31808SJens Wiklander             if (ret != 0) {
62832b31808SJens Wiklander                 return ret;
62932b31808SJens Wiklander             }
63032b31808SJens Wiklander             p += output_len;
63132b31808SJens Wiklander         }
632*b0563631STom Van Eyck     }
633*b0563631STom Van Eyck #endif /* MBEDTLS_SSL_TLS1_2_SOME_ECC ||
634*b0563631STom Van Eyck           MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */
63532b31808SJens Wiklander 
63632b31808SJens Wiklander #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
637*b0563631STom Van Eyck     int write_sig_alg_ext = 0;
63832b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
639*b0563631STom Van Eyck     write_sig_alg_ext = write_sig_alg_ext ||
640*b0563631STom Van Eyck                         (propose_tls13 && mbedtls_ssl_conf_tls13_is_ephemeral_enabled(ssl));
64132b31808SJens Wiklander #endif
64232b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
643*b0563631STom Van Eyck     write_sig_alg_ext = write_sig_alg_ext || propose_tls12;
64432b31808SJens Wiklander #endif
645*b0563631STom Van Eyck 
646*b0563631STom Van Eyck     if (write_sig_alg_ext) {
64732b31808SJens Wiklander         ret = mbedtls_ssl_write_sig_alg_ext(ssl, p, end, &output_len);
64832b31808SJens Wiklander         if (ret != 0) {
64932b31808SJens Wiklander             return ret;
65032b31808SJens Wiklander         }
65132b31808SJens Wiklander         p += output_len;
65232b31808SJens Wiklander     }
65332b31808SJens Wiklander #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
65432b31808SJens Wiklander 
65532b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
65632b31808SJens Wiklander     if (propose_tls12) {
65732b31808SJens Wiklander         ret = mbedtls_ssl_tls12_write_client_hello_exts(ssl, p, end,
65832b31808SJens Wiklander                                                         tls12_uses_ec,
65932b31808SJens Wiklander                                                         &output_len);
66032b31808SJens Wiklander         if (ret != 0) {
66132b31808SJens Wiklander             return ret;
66232b31808SJens Wiklander         }
66332b31808SJens Wiklander         p += output_len;
66432b31808SJens Wiklander     }
66532b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
66632b31808SJens Wiklander 
66732b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
66832b31808SJens Wiklander     /* The "pre_shared_key" extension (RFC 8446 Section 4.2.11)
66932b31808SJens Wiklander      * MUST be the last extension in the ClientHello.
67032b31808SJens Wiklander      */
671*b0563631STom Van Eyck     if (propose_tls13 && mbedtls_ssl_conf_tls13_is_some_psk_enabled(ssl)) {
67232b31808SJens Wiklander         ret = mbedtls_ssl_tls13_write_identities_of_pre_shared_key_ext(
67332b31808SJens Wiklander             ssl, p, end, &output_len, binders_len);
67432b31808SJens Wiklander         if (ret != 0) {
67532b31808SJens Wiklander             return ret;
67632b31808SJens Wiklander         }
67732b31808SJens Wiklander         p += output_len;
67832b31808SJens Wiklander     }
67932b31808SJens Wiklander #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */
68032b31808SJens Wiklander 
68132b31808SJens Wiklander     /* Write the length of the list of extensions. */
682*b0563631STom Van Eyck     extensions_len = (size_t) (p - p_extensions_len) - 2;
68332b31808SJens Wiklander 
68432b31808SJens Wiklander     if (extensions_len == 0) {
68532b31808SJens Wiklander         p = p_extensions_len;
68632b31808SJens Wiklander     } else {
68732b31808SJens Wiklander         MBEDTLS_PUT_UINT16_BE(extensions_len, p_extensions_len, 0);
68832b31808SJens Wiklander         MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, total extension length: %" \
68932b31808SJens Wiklander                                   MBEDTLS_PRINTF_SIZET, extensions_len));
69032b31808SJens Wiklander         MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions",
69132b31808SJens Wiklander                               p_extensions_len, extensions_len);
69232b31808SJens Wiklander     }
69332b31808SJens Wiklander 
694*b0563631STom Van Eyck     *out_len = (size_t) (p - buf);
69532b31808SJens Wiklander     return 0;
69632b31808SJens Wiklander }
69732b31808SJens Wiklander 
69832b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
69932b31808SJens Wiklander static int ssl_generate_random(mbedtls_ssl_context *ssl)
70032b31808SJens Wiklander {
70132b31808SJens Wiklander     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
70232b31808SJens Wiklander     unsigned char *randbytes = ssl->handshake->randbytes;
70332b31808SJens Wiklander     size_t gmt_unix_time_len = 0;
70432b31808SJens Wiklander 
70532b31808SJens Wiklander     /*
70632b31808SJens Wiklander      * Generate the random bytes
70732b31808SJens Wiklander      *
70832b31808SJens Wiklander      * TLS 1.2 case:
70932b31808SJens Wiklander      * struct {
71032b31808SJens Wiklander      *     uint32 gmt_unix_time;
71132b31808SJens Wiklander      *     opaque random_bytes[28];
71232b31808SJens Wiklander      * } Random;
71332b31808SJens Wiklander      *
71432b31808SJens Wiklander      * TLS 1.3 case:
71532b31808SJens Wiklander      * opaque Random[32];
71632b31808SJens Wiklander      */
71732b31808SJens Wiklander     if (ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_2) {
71832b31808SJens Wiklander #if defined(MBEDTLS_HAVE_TIME)
71932b31808SJens Wiklander         mbedtls_time_t gmt_unix_time = mbedtls_time(NULL);
72032b31808SJens Wiklander         MBEDTLS_PUT_UINT32_BE(gmt_unix_time, randbytes, 0);
72132b31808SJens Wiklander         gmt_unix_time_len = 4;
72232b31808SJens Wiklander 
72332b31808SJens Wiklander         MBEDTLS_SSL_DEBUG_MSG(3,
72432b31808SJens Wiklander                               ("client hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
72532b31808SJens Wiklander                                (long long) gmt_unix_time));
72632b31808SJens Wiklander #endif /* MBEDTLS_HAVE_TIME */
72732b31808SJens Wiklander     }
72832b31808SJens Wiklander 
72932b31808SJens Wiklander     ret = ssl->conf->f_rng(ssl->conf->p_rng,
73032b31808SJens Wiklander                            randbytes + gmt_unix_time_len,
73132b31808SJens Wiklander                            MBEDTLS_CLIENT_HELLO_RANDOM_LEN - gmt_unix_time_len);
73232b31808SJens Wiklander     return ret;
73332b31808SJens Wiklander }
73432b31808SJens Wiklander 
73532b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
73632b31808SJens Wiklander static int ssl_prepare_client_hello(mbedtls_ssl_context *ssl)
73732b31808SJens Wiklander {
73832b31808SJens Wiklander     int ret;
73932b31808SJens Wiklander     size_t session_id_len;
74032b31808SJens Wiklander     mbedtls_ssl_session *session_negotiate = ssl->session_negotiate;
74132b31808SJens Wiklander 
74232b31808SJens Wiklander     if (session_negotiate == NULL) {
74332b31808SJens Wiklander         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
74432b31808SJens Wiklander     }
74532b31808SJens Wiklander 
74632b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3) && \
74732b31808SJens Wiklander     defined(MBEDTLS_SSL_SESSION_TICKETS) && \
74832b31808SJens Wiklander     defined(MBEDTLS_HAVE_TIME)
74932b31808SJens Wiklander 
75032b31808SJens Wiklander     /* Check if a tls13 ticket has been configured. */
75132b31808SJens Wiklander     if (ssl->handshake->resume != 0 &&
75232b31808SJens Wiklander         session_negotiate->tls_version == MBEDTLS_SSL_VERSION_TLS1_3 &&
75332b31808SJens Wiklander         session_negotiate->ticket != NULL) {
754*b0563631STom Van Eyck         mbedtls_ms_time_t now = mbedtls_ms_time();
755*b0563631STom Van Eyck         mbedtls_ms_time_t age = now - session_negotiate->ticket_reception_time;
756*b0563631STom Van Eyck         if (age < 0 ||
757*b0563631STom Van Eyck             age > (mbedtls_ms_time_t) session_negotiate->ticket_lifetime * 1000) {
75832b31808SJens Wiklander             /* Without valid ticket, disable session resumption.*/
75932b31808SJens Wiklander             MBEDTLS_SSL_DEBUG_MSG(
76032b31808SJens Wiklander                 3, ("Ticket expired, disable session resumption"));
76132b31808SJens Wiklander             ssl->handshake->resume = 0;
76232b31808SJens Wiklander         }
76332b31808SJens Wiklander     }
76432b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_3 &&
76532b31808SJens Wiklander           MBEDTLS_SSL_SESSION_TICKETS &&
76632b31808SJens Wiklander           MBEDTLS_HAVE_TIME */
76732b31808SJens Wiklander 
76832b31808SJens Wiklander     /* Bet on the highest configured version if we are not in a TLS 1.2
76932b31808SJens Wiklander      * renegotiation or session resumption.
77032b31808SJens Wiklander      */
77132b31808SJens Wiklander #if defined(MBEDTLS_SSL_RENEGOTIATION)
77232b31808SJens Wiklander     if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
77332b31808SJens Wiklander         ssl->handshake->min_tls_version = ssl->tls_version;
77432b31808SJens Wiklander     } else
77532b31808SJens Wiklander #endif
77632b31808SJens Wiklander     {
77732b31808SJens Wiklander         if (ssl->handshake->resume) {
77832b31808SJens Wiklander             ssl->tls_version = session_negotiate->tls_version;
77932b31808SJens Wiklander             ssl->handshake->min_tls_version = ssl->tls_version;
78032b31808SJens Wiklander         } else {
78132b31808SJens Wiklander             ssl->handshake->min_tls_version = ssl->conf->min_tls_version;
78232b31808SJens Wiklander         }
78332b31808SJens Wiklander     }
78432b31808SJens Wiklander 
78532b31808SJens Wiklander     /*
78632b31808SJens Wiklander      * Generate the random bytes, except when responding to a verify request
78732b31808SJens Wiklander      * where we MUST reuse the previously generated random bytes
78832b31808SJens Wiklander      * (RFC 6347 4.2.1).
78932b31808SJens Wiklander      */
79032b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_DTLS)
79132b31808SJens Wiklander     if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
79232b31808SJens Wiklander         (ssl->handshake->cookie == NULL))
79332b31808SJens Wiklander #endif
79432b31808SJens Wiklander     {
795*b0563631STom Van Eyck #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
796*b0563631STom Van Eyck         if (!ssl->handshake->hello_retry_request_flag)
797*b0563631STom Van Eyck #endif
798*b0563631STom Van Eyck         {
79932b31808SJens Wiklander             ret = ssl_generate_random(ssl);
80032b31808SJens Wiklander             if (ret != 0) {
80132b31808SJens Wiklander                 MBEDTLS_SSL_DEBUG_RET(1, "Random bytes generation failed", ret);
80232b31808SJens Wiklander                 return ret;
80332b31808SJens Wiklander             }
80432b31808SJens Wiklander         }
805*b0563631STom Van Eyck     }
80632b31808SJens Wiklander 
80732b31808SJens Wiklander     /*
80832b31808SJens Wiklander      * Prepare session identifier. At that point, the length of the session
80932b31808SJens Wiklander      * identifier in the SSL context `ssl->session_negotiate->id_len` is equal
81032b31808SJens Wiklander      * to zero, except in the case of a TLS 1.2 session renegotiation or
81132b31808SJens Wiklander      * session resumption.
81232b31808SJens Wiklander      */
81332b31808SJens Wiklander     session_id_len = session_negotiate->id_len;
81432b31808SJens Wiklander 
81532b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
81632b31808SJens Wiklander     if (ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_2) {
81732b31808SJens Wiklander         if (session_id_len < 16 || session_id_len > 32 ||
81832b31808SJens Wiklander #if defined(MBEDTLS_SSL_RENEGOTIATION)
81932b31808SJens Wiklander             ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
82032b31808SJens Wiklander #endif
82132b31808SJens Wiklander             ssl->handshake->resume == 0) {
82232b31808SJens Wiklander             session_id_len = 0;
82332b31808SJens Wiklander         }
82432b31808SJens Wiklander 
82532b31808SJens Wiklander #if defined(MBEDTLS_SSL_SESSION_TICKETS)
82632b31808SJens Wiklander         /*
82732b31808SJens Wiklander          * RFC 5077 section 3.4: "When presenting a ticket, the client MAY
82832b31808SJens Wiklander          * generate and include a Session ID in the TLS ClientHello."
82932b31808SJens Wiklander          */
83032b31808SJens Wiklander         int renegotiating = 0;
83132b31808SJens Wiklander #if defined(MBEDTLS_SSL_RENEGOTIATION)
83232b31808SJens Wiklander         if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
83332b31808SJens Wiklander             renegotiating = 1;
83432b31808SJens Wiklander         }
83532b31808SJens Wiklander #endif
83632b31808SJens Wiklander         if (!renegotiating) {
83732b31808SJens Wiklander             if ((session_negotiate->ticket != NULL) &&
83832b31808SJens Wiklander                 (session_negotiate->ticket_len != 0)) {
83932b31808SJens Wiklander                 session_id_len = 32;
84032b31808SJens Wiklander             }
84132b31808SJens Wiklander         }
84232b31808SJens Wiklander #endif /* MBEDTLS_SSL_SESSION_TICKETS */
84332b31808SJens Wiklander     }
84432b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
84532b31808SJens Wiklander 
84632b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
84732b31808SJens Wiklander     if (ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
84832b31808SJens Wiklander         /*
84932b31808SJens Wiklander          * Create a legacy session identifier for the purpose of middlebox
85032b31808SJens Wiklander          * compatibility only if one has not been created already, which is
85132b31808SJens Wiklander          * the case if we are here for the TLS 1.3 second ClientHello.
85232b31808SJens Wiklander          *
85332b31808SJens Wiklander          * Versions of TLS before TLS 1.3 supported a "session resumption"
85432b31808SJens Wiklander          * feature which has been merged with pre-shared keys in TLS 1.3
85532b31808SJens Wiklander          * version. A client which has a cached session ID set by a pre-TLS 1.3
85632b31808SJens Wiklander          * server SHOULD set this field to that value. In compatibility mode,
85732b31808SJens Wiklander          * this field MUST be non-empty, so a client not offering a pre-TLS 1.3
85832b31808SJens Wiklander          * session MUST generate a new 32-byte value. This value need not be
85932b31808SJens Wiklander          * random but SHOULD be unpredictable to avoid implementations fixating
86032b31808SJens Wiklander          * on a specific value (also known as ossification). Otherwise, it MUST
86132b31808SJens Wiklander          * be set as a zero-length vector ( i.e., a zero-valued single byte
86232b31808SJens Wiklander          * length field ).
86332b31808SJens Wiklander          */
86432b31808SJens Wiklander         session_id_len = 32;
86532b31808SJens Wiklander     }
86632b31808SJens Wiklander #endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
86732b31808SJens Wiklander 
86832b31808SJens Wiklander     if (session_id_len != session_negotiate->id_len) {
86932b31808SJens Wiklander         session_negotiate->id_len = session_id_len;
87032b31808SJens Wiklander         if (session_id_len > 0) {
87132b31808SJens Wiklander             ret = ssl->conf->f_rng(ssl->conf->p_rng,
87232b31808SJens Wiklander                                    session_negotiate->id,
87332b31808SJens Wiklander                                    session_id_len);
87432b31808SJens Wiklander             if (ret != 0) {
87532b31808SJens Wiklander                 MBEDTLS_SSL_DEBUG_RET(1, "creating session id failed", ret);
87632b31808SJens Wiklander                 return ret;
87732b31808SJens Wiklander             }
87832b31808SJens Wiklander         }
87932b31808SJens Wiklander     }
88032b31808SJens Wiklander 
88132b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3) && \
88232b31808SJens Wiklander     defined(MBEDTLS_SSL_SESSION_TICKETS) && \
88332b31808SJens Wiklander     defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
88432b31808SJens Wiklander     if (ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_3  &&
88532b31808SJens Wiklander         ssl->handshake->resume) {
88632b31808SJens Wiklander         int hostname_mismatch = ssl->hostname != NULL ||
88732b31808SJens Wiklander                                 session_negotiate->hostname != NULL;
88832b31808SJens Wiklander         if (ssl->hostname != NULL && session_negotiate->hostname != NULL) {
88932b31808SJens Wiklander             hostname_mismatch = strcmp(
89032b31808SJens Wiklander                 ssl->hostname, session_negotiate->hostname) != 0;
89132b31808SJens Wiklander         }
89232b31808SJens Wiklander 
89332b31808SJens Wiklander         if (hostname_mismatch) {
89432b31808SJens Wiklander             MBEDTLS_SSL_DEBUG_MSG(
89532b31808SJens Wiklander                 1, ("Hostname mismatch the session ticket, "
89632b31808SJens Wiklander                     "disable session resumption."));
89732b31808SJens Wiklander             return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
89832b31808SJens Wiklander         }
89932b31808SJens Wiklander     } else {
90032b31808SJens Wiklander         return mbedtls_ssl_session_set_hostname(session_negotiate,
90132b31808SJens Wiklander                                                 ssl->hostname);
90232b31808SJens Wiklander     }
90332b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_3 &&
90432b31808SJens Wiklander           MBEDTLS_SSL_SESSION_TICKETS &&
90532b31808SJens Wiklander           MBEDTLS_SSL_SERVER_NAME_INDICATION */
90632b31808SJens Wiklander 
90732b31808SJens Wiklander     return 0;
90832b31808SJens Wiklander }
90932b31808SJens Wiklander /*
91032b31808SJens Wiklander  * Write ClientHello handshake message.
91132b31808SJens Wiklander  * Handler for MBEDTLS_SSL_CLIENT_HELLO
91232b31808SJens Wiklander  */
91332b31808SJens Wiklander int mbedtls_ssl_write_client_hello(mbedtls_ssl_context *ssl)
91432b31808SJens Wiklander {
91532b31808SJens Wiklander     int ret = 0;
91632b31808SJens Wiklander     unsigned char *buf;
91732b31808SJens Wiklander     size_t buf_len, msg_len, binders_len;
91832b31808SJens Wiklander 
91932b31808SJens Wiklander     MBEDTLS_SSL_DEBUG_MSG(2, ("=> write client hello"));
92032b31808SJens Wiklander 
92132b31808SJens Wiklander     MBEDTLS_SSL_PROC_CHK(ssl_prepare_client_hello(ssl));
92232b31808SJens Wiklander 
92332b31808SJens Wiklander     MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(
92432b31808SJens Wiklander                              ssl, MBEDTLS_SSL_HS_CLIENT_HELLO,
92532b31808SJens Wiklander                              &buf, &buf_len));
92632b31808SJens Wiklander 
92732b31808SJens Wiklander     MBEDTLS_SSL_PROC_CHK(ssl_write_client_hello_body(ssl, buf,
92832b31808SJens Wiklander                                                      buf + buf_len,
92932b31808SJens Wiklander                                                      &msg_len,
93032b31808SJens Wiklander                                                      &binders_len));
93132b31808SJens Wiklander 
93232b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_SSL_PROTO_DTLS)
93332b31808SJens Wiklander     if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
93432b31808SJens Wiklander         ssl->out_msglen = msg_len + 4;
93532b31808SJens Wiklander         mbedtls_ssl_send_flight_completed(ssl);
93632b31808SJens Wiklander 
93732b31808SJens Wiklander         /*
93832b31808SJens Wiklander          * The two functions below may try to send data on the network and
93932b31808SJens Wiklander          * can return with the MBEDTLS_ERR_SSL_WANT_READ error code when they
94032b31808SJens Wiklander          * fail to do so and the transmission has to be retried later. In that
94132b31808SJens Wiklander          * case as in fatal error cases, we return immediately. But we must have
94232b31808SJens Wiklander          * set the handshake state to the next state at that point to ensure
94332b31808SJens Wiklander          * that we will not write and send again a ClientHello when we
94432b31808SJens Wiklander          * eventually succeed in sending the pending data.
94532b31808SJens Wiklander          */
94632b31808SJens Wiklander         mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_HELLO);
94732b31808SJens Wiklander 
94832b31808SJens Wiklander         if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
94932b31808SJens Wiklander             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
95032b31808SJens Wiklander             return ret;
95132b31808SJens Wiklander         }
95232b31808SJens Wiklander 
95332b31808SJens Wiklander         if ((ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
95432b31808SJens Wiklander             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
95532b31808SJens Wiklander             return ret;
95632b31808SJens Wiklander         }
95732b31808SJens Wiklander     } else
95832b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_SSL_PROTO_DTLS */
95932b31808SJens Wiklander     {
96032b31808SJens Wiklander 
96132b31808SJens Wiklander         ret = mbedtls_ssl_add_hs_hdr_to_checksum(ssl,
96232b31808SJens Wiklander                                                  MBEDTLS_SSL_HS_CLIENT_HELLO,
96332b31808SJens Wiklander                                                  msg_len);
96432b31808SJens Wiklander         if (ret != 0) {
96532b31808SJens Wiklander             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_add_hs_hdr_to_checksum", ret);
96632b31808SJens Wiklander             return ret;
96732b31808SJens Wiklander         }
96832b31808SJens Wiklander         ret = ssl->handshake->update_checksum(ssl, buf, msg_len - binders_len);
96932b31808SJens Wiklander         if (ret != 0) {
97032b31808SJens Wiklander             MBEDTLS_SSL_DEBUG_RET(1, "update_checksum", ret);
97132b31808SJens Wiklander             return ret;
97232b31808SJens Wiklander         }
97332b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
97432b31808SJens Wiklander         if (binders_len > 0) {
97532b31808SJens Wiklander             MBEDTLS_SSL_PROC_CHK(
97632b31808SJens Wiklander                 mbedtls_ssl_tls13_write_binders_of_pre_shared_key_ext(
97732b31808SJens Wiklander                     ssl, buf + msg_len - binders_len, buf + msg_len));
97832b31808SJens Wiklander             ret = ssl->handshake->update_checksum(ssl, buf + msg_len - binders_len,
97932b31808SJens Wiklander                                                   binders_len);
98032b31808SJens Wiklander             if (ret != 0) {
98132b31808SJens Wiklander                 MBEDTLS_SSL_DEBUG_RET(1, "update_checksum", ret);
98232b31808SJens Wiklander                 return ret;
98332b31808SJens Wiklander             }
98432b31808SJens Wiklander         }
98532b31808SJens Wiklander #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */
98632b31808SJens Wiklander 
98732b31808SJens Wiklander         MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(ssl,
98832b31808SJens Wiklander                                                               buf_len,
98932b31808SJens Wiklander                                                               msg_len));
99032b31808SJens Wiklander 
99132b31808SJens Wiklander         /*
99232b31808SJens Wiklander          * Set next state. Note that if TLS 1.3 is proposed, this may be
99332b31808SJens Wiklander          * overwritten by mbedtls_ssl_tls13_finalize_client_hello().
99432b31808SJens Wiklander          */
99532b31808SJens Wiklander         mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_HELLO);
99632b31808SJens Wiklander 
99732b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
99832b31808SJens Wiklander         if (ssl->handshake->min_tls_version <=  MBEDTLS_SSL_VERSION_TLS1_3 &&
99932b31808SJens Wiklander             MBEDTLS_SSL_VERSION_TLS1_3 <= ssl->tls_version) {
100032b31808SJens Wiklander             ret = mbedtls_ssl_tls13_finalize_client_hello(ssl);
100132b31808SJens Wiklander         }
100232b31808SJens Wiklander #endif
100332b31808SJens Wiklander     }
100432b31808SJens Wiklander 
1005*b0563631STom Van Eyck #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1006*b0563631STom Van Eyck     MBEDTLS_SSL_PRINT_EXTS(
1007*b0563631STom Van Eyck         3, MBEDTLS_SSL_HS_CLIENT_HELLO, ssl->handshake->sent_extensions);
1008*b0563631STom Van Eyck #endif
1009*b0563631STom Van Eyck 
101032b31808SJens Wiklander cleanup:
101132b31808SJens Wiklander 
101232b31808SJens Wiklander     MBEDTLS_SSL_DEBUG_MSG(2, ("<= write client hello"));
101332b31808SJens Wiklander     return ret;
101432b31808SJens Wiklander }
101532b31808SJens Wiklander 
101632b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_3 || MBEDTLS_SSL_PROTO_TLS1_2 */
101732b31808SJens Wiklander #endif /* MBEDTLS_SSL_CLI_C */
1018