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