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