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