1a8e1175bSopenharmony_ci/* 2a8e1175bSopenharmony_ci * TLS 1.2 and 1.3 client-side functions 3a8e1175bSopenharmony_ci * 4a8e1175bSopenharmony_ci * Copyright The Mbed TLS Contributors 5a8e1175bSopenharmony_ci * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 6a8e1175bSopenharmony_ci */ 7a8e1175bSopenharmony_ci 8a8e1175bSopenharmony_ci#include "common.h" 9a8e1175bSopenharmony_ci 10a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_CLI_C) 11a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) || defined(MBEDTLS_SSL_PROTO_TLS1_2) 12a8e1175bSopenharmony_ci 13a8e1175bSopenharmony_ci#include <string.h> 14a8e1175bSopenharmony_ci 15a8e1175bSopenharmony_ci#include "debug_internal.h" 16a8e1175bSopenharmony_ci#include "mbedtls/error.h" 17a8e1175bSopenharmony_ci#include "mbedtls/platform.h" 18a8e1175bSopenharmony_ci 19a8e1175bSopenharmony_ci#include "ssl_client.h" 20a8e1175bSopenharmony_ci#include "ssl_misc.h" 21a8e1175bSopenharmony_ci#include "ssl_tls13_keys.h" 22a8e1175bSopenharmony_ci#include "ssl_debug_helpers.h" 23a8e1175bSopenharmony_ci 24a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) 25a8e1175bSopenharmony_ciMBEDTLS_CHECK_RETURN_CRITICAL 26a8e1175bSopenharmony_cistatic int ssl_write_hostname_ext(mbedtls_ssl_context *ssl, 27a8e1175bSopenharmony_ci unsigned char *buf, 28a8e1175bSopenharmony_ci const unsigned char *end, 29a8e1175bSopenharmony_ci size_t *olen) 30a8e1175bSopenharmony_ci{ 31a8e1175bSopenharmony_ci unsigned char *p = buf; 32a8e1175bSopenharmony_ci size_t hostname_len; 33a8e1175bSopenharmony_ci 34a8e1175bSopenharmony_ci *olen = 0; 35a8e1175bSopenharmony_ci 36a8e1175bSopenharmony_ci if (ssl->hostname == NULL) { 37a8e1175bSopenharmony_ci return 0; 38a8e1175bSopenharmony_ci } 39a8e1175bSopenharmony_ci 40a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_MSG(3, 41a8e1175bSopenharmony_ci ("client hello, adding server name extension: %s", 42a8e1175bSopenharmony_ci ssl->hostname)); 43a8e1175bSopenharmony_ci 44a8e1175bSopenharmony_ci hostname_len = strlen(ssl->hostname); 45a8e1175bSopenharmony_ci 46a8e1175bSopenharmony_ci MBEDTLS_SSL_CHK_BUF_PTR(p, end, hostname_len + 9); 47a8e1175bSopenharmony_ci 48a8e1175bSopenharmony_ci /* 49a8e1175bSopenharmony_ci * Sect. 3, RFC 6066 (TLS Extensions Definitions) 50a8e1175bSopenharmony_ci * 51a8e1175bSopenharmony_ci * In order to provide any of the server names, clients MAY include an 52a8e1175bSopenharmony_ci * extension of type "server_name" in the (extended) client hello. The 53a8e1175bSopenharmony_ci * "extension_data" field of this extension SHALL contain 54a8e1175bSopenharmony_ci * "ServerNameList" where: 55a8e1175bSopenharmony_ci * 56a8e1175bSopenharmony_ci * struct { 57a8e1175bSopenharmony_ci * NameType name_type; 58a8e1175bSopenharmony_ci * select (name_type) { 59a8e1175bSopenharmony_ci * case host_name: HostName; 60a8e1175bSopenharmony_ci * } name; 61a8e1175bSopenharmony_ci * } ServerName; 62a8e1175bSopenharmony_ci * 63a8e1175bSopenharmony_ci * enum { 64a8e1175bSopenharmony_ci * host_name(0), (255) 65a8e1175bSopenharmony_ci * } NameType; 66a8e1175bSopenharmony_ci * 67a8e1175bSopenharmony_ci * opaque HostName<1..2^16-1>; 68a8e1175bSopenharmony_ci * 69a8e1175bSopenharmony_ci * struct { 70a8e1175bSopenharmony_ci * ServerName server_name_list<1..2^16-1> 71a8e1175bSopenharmony_ci * } ServerNameList; 72a8e1175bSopenharmony_ci * 73a8e1175bSopenharmony_ci */ 74a8e1175bSopenharmony_ci MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SERVERNAME, p, 0); 75a8e1175bSopenharmony_ci p += 2; 76a8e1175bSopenharmony_ci 77a8e1175bSopenharmony_ci MBEDTLS_PUT_UINT16_BE(hostname_len + 5, p, 0); 78a8e1175bSopenharmony_ci p += 2; 79a8e1175bSopenharmony_ci 80a8e1175bSopenharmony_ci MBEDTLS_PUT_UINT16_BE(hostname_len + 3, p, 0); 81a8e1175bSopenharmony_ci p += 2; 82a8e1175bSopenharmony_ci 83a8e1175bSopenharmony_ci *p++ = MBEDTLS_BYTE_0(MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME); 84a8e1175bSopenharmony_ci 85a8e1175bSopenharmony_ci MBEDTLS_PUT_UINT16_BE(hostname_len, p, 0); 86a8e1175bSopenharmony_ci p += 2; 87a8e1175bSopenharmony_ci 88a8e1175bSopenharmony_ci memcpy(p, ssl->hostname, hostname_len); 89a8e1175bSopenharmony_ci 90a8e1175bSopenharmony_ci *olen = hostname_len + 9; 91a8e1175bSopenharmony_ci 92a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 93a8e1175bSopenharmony_ci mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_SERVERNAME); 94a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */ 95a8e1175bSopenharmony_ci return 0; 96a8e1175bSopenharmony_ci} 97a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ 98a8e1175bSopenharmony_ci 99a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_ALPN) 100a8e1175bSopenharmony_ci/* 101a8e1175bSopenharmony_ci * ssl_write_alpn_ext() 102a8e1175bSopenharmony_ci * 103a8e1175bSopenharmony_ci * Structure of the application_layer_protocol_negotiation extension in 104a8e1175bSopenharmony_ci * ClientHello: 105a8e1175bSopenharmony_ci * 106a8e1175bSopenharmony_ci * opaque ProtocolName<1..2^8-1>; 107a8e1175bSopenharmony_ci * 108a8e1175bSopenharmony_ci * struct { 109a8e1175bSopenharmony_ci * ProtocolName protocol_name_list<2..2^16-1> 110a8e1175bSopenharmony_ci * } ProtocolNameList; 111a8e1175bSopenharmony_ci * 112a8e1175bSopenharmony_ci */ 113a8e1175bSopenharmony_ciMBEDTLS_CHECK_RETURN_CRITICAL 114a8e1175bSopenharmony_cistatic int ssl_write_alpn_ext(mbedtls_ssl_context *ssl, 115a8e1175bSopenharmony_ci unsigned char *buf, 116a8e1175bSopenharmony_ci const unsigned char *end, 117a8e1175bSopenharmony_ci size_t *out_len) 118a8e1175bSopenharmony_ci{ 119a8e1175bSopenharmony_ci unsigned char *p = buf; 120a8e1175bSopenharmony_ci 121a8e1175bSopenharmony_ci *out_len = 0; 122a8e1175bSopenharmony_ci 123a8e1175bSopenharmony_ci if (ssl->conf->alpn_list == NULL) { 124a8e1175bSopenharmony_ci return 0; 125a8e1175bSopenharmony_ci } 126a8e1175bSopenharmony_ci 127a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding alpn extension")); 128a8e1175bSopenharmony_ci 129a8e1175bSopenharmony_ci 130a8e1175bSopenharmony_ci /* Check we have enough space for the extension type (2 bytes), the 131a8e1175bSopenharmony_ci * extension length (2 bytes) and the protocol_name_list length (2 bytes). 132a8e1175bSopenharmony_ci */ 133a8e1175bSopenharmony_ci MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6); 134a8e1175bSopenharmony_ci MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ALPN, p, 0); 135a8e1175bSopenharmony_ci /* Skip writing extension and list length for now */ 136a8e1175bSopenharmony_ci p += 6; 137a8e1175bSopenharmony_ci 138a8e1175bSopenharmony_ci /* 139a8e1175bSopenharmony_ci * opaque ProtocolName<1..2^8-1>; 140a8e1175bSopenharmony_ci * 141a8e1175bSopenharmony_ci * struct { 142a8e1175bSopenharmony_ci * ProtocolName protocol_name_list<2..2^16-1> 143a8e1175bSopenharmony_ci * } ProtocolNameList; 144a8e1175bSopenharmony_ci */ 145a8e1175bSopenharmony_ci for (const char **cur = ssl->conf->alpn_list; *cur != NULL; cur++) { 146a8e1175bSopenharmony_ci /* 147a8e1175bSopenharmony_ci * mbedtls_ssl_conf_set_alpn_protocols() checked that the length of 148a8e1175bSopenharmony_ci * protocol names is less than 255. 149a8e1175bSopenharmony_ci */ 150a8e1175bSopenharmony_ci size_t protocol_name_len = strlen(*cur); 151a8e1175bSopenharmony_ci 152a8e1175bSopenharmony_ci MBEDTLS_SSL_CHK_BUF_PTR(p, end, 1 + protocol_name_len); 153a8e1175bSopenharmony_ci *p++ = (unsigned char) protocol_name_len; 154a8e1175bSopenharmony_ci memcpy(p, *cur, protocol_name_len); 155a8e1175bSopenharmony_ci p += protocol_name_len; 156a8e1175bSopenharmony_ci } 157a8e1175bSopenharmony_ci 158a8e1175bSopenharmony_ci *out_len = (size_t) (p - buf); 159a8e1175bSopenharmony_ci 160a8e1175bSopenharmony_ci /* List length = *out_len - 2 (ext_type) - 2 (ext_len) - 2 (list_len) */ 161a8e1175bSopenharmony_ci MBEDTLS_PUT_UINT16_BE(*out_len - 6, buf, 4); 162a8e1175bSopenharmony_ci 163a8e1175bSopenharmony_ci /* Extension length = *out_len - 2 (ext_type) - 2 (ext_len) */ 164a8e1175bSopenharmony_ci MBEDTLS_PUT_UINT16_BE(*out_len - 4, buf, 2); 165a8e1175bSopenharmony_ci 166a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 167a8e1175bSopenharmony_ci mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_ALPN); 168a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */ 169a8e1175bSopenharmony_ci return 0; 170a8e1175bSopenharmony_ci} 171a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_ALPN */ 172a8e1175bSopenharmony_ci 173a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_TLS1_2_SOME_ECC) || \ 174a8e1175bSopenharmony_ci defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED) 175a8e1175bSopenharmony_ci/* 176a8e1175bSopenharmony_ci * Function for writing a supported groups (TLS 1.3) or supported elliptic 177a8e1175bSopenharmony_ci * curves (TLS 1.2) extension. 178a8e1175bSopenharmony_ci * 179a8e1175bSopenharmony_ci * The "extension_data" field of a supported groups extension contains a 180a8e1175bSopenharmony_ci * "NamedGroupList" value (TLS 1.3 RFC8446): 181a8e1175bSopenharmony_ci * enum { 182a8e1175bSopenharmony_ci * secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019), 183a8e1175bSopenharmony_ci * x25519(0x001D), x448(0x001E), 184a8e1175bSopenharmony_ci * ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102), 185a8e1175bSopenharmony_ci * ffdhe6144(0x0103), ffdhe8192(0x0104), 186a8e1175bSopenharmony_ci * ffdhe_private_use(0x01FC..0x01FF), 187a8e1175bSopenharmony_ci * ecdhe_private_use(0xFE00..0xFEFF), 188a8e1175bSopenharmony_ci * (0xFFFF) 189a8e1175bSopenharmony_ci * } NamedGroup; 190a8e1175bSopenharmony_ci * struct { 191a8e1175bSopenharmony_ci * NamedGroup named_group_list<2..2^16-1>; 192a8e1175bSopenharmony_ci * } NamedGroupList; 193a8e1175bSopenharmony_ci * 194a8e1175bSopenharmony_ci * The "extension_data" field of a supported elliptic curves extension contains 195a8e1175bSopenharmony_ci * a "NamedCurveList" value (TLS 1.2 RFC 8422): 196a8e1175bSopenharmony_ci * enum { 197a8e1175bSopenharmony_ci * deprecated(1..22), 198a8e1175bSopenharmony_ci * secp256r1 (23), secp384r1 (24), secp521r1 (25), 199a8e1175bSopenharmony_ci * x25519(29), x448(30), 200a8e1175bSopenharmony_ci * reserved (0xFE00..0xFEFF), 201a8e1175bSopenharmony_ci * deprecated(0xFF01..0xFF02), 202a8e1175bSopenharmony_ci * (0xFFFF) 203a8e1175bSopenharmony_ci * } NamedCurve; 204a8e1175bSopenharmony_ci * struct { 205a8e1175bSopenharmony_ci * NamedCurve named_curve_list<2..2^16-1> 206a8e1175bSopenharmony_ci * } NamedCurveList; 207a8e1175bSopenharmony_ci * 208a8e1175bSopenharmony_ci * The TLS 1.3 supported groups extension was defined to be a compatible 209a8e1175bSopenharmony_ci * generalization of the TLS 1.2 supported elliptic curves extension. They both 210a8e1175bSopenharmony_ci * share the same extension identifier. 211a8e1175bSopenharmony_ci * 212a8e1175bSopenharmony_ci */ 213a8e1175bSopenharmony_ci#define SSL_WRITE_SUPPORTED_GROUPS_EXT_TLS1_2_FLAG 1 214a8e1175bSopenharmony_ci#define SSL_WRITE_SUPPORTED_GROUPS_EXT_TLS1_3_FLAG 2 215a8e1175bSopenharmony_ci 216a8e1175bSopenharmony_ciMBEDTLS_CHECK_RETURN_CRITICAL 217a8e1175bSopenharmony_cistatic int ssl_write_supported_groups_ext(mbedtls_ssl_context *ssl, 218a8e1175bSopenharmony_ci unsigned char *buf, 219a8e1175bSopenharmony_ci const unsigned char *end, 220a8e1175bSopenharmony_ci int flags, 221a8e1175bSopenharmony_ci size_t *out_len) 222a8e1175bSopenharmony_ci{ 223a8e1175bSopenharmony_ci unsigned char *p = buf; 224a8e1175bSopenharmony_ci unsigned char *named_group_list; /* Start of named_group_list */ 225a8e1175bSopenharmony_ci size_t named_group_list_len; /* Length of named_group_list */ 226a8e1175bSopenharmony_ci const uint16_t *group_list = mbedtls_ssl_get_groups(ssl); 227a8e1175bSopenharmony_ci 228a8e1175bSopenharmony_ci *out_len = 0; 229a8e1175bSopenharmony_ci 230a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding supported_groups extension")); 231a8e1175bSopenharmony_ci 232a8e1175bSopenharmony_ci /* Check if we have space for header and length fields: 233a8e1175bSopenharmony_ci * - extension_type (2 bytes) 234a8e1175bSopenharmony_ci * - extension_data_length (2 bytes) 235a8e1175bSopenharmony_ci * - named_group_list_length (2 bytes) 236a8e1175bSopenharmony_ci */ 237a8e1175bSopenharmony_ci MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6); 238a8e1175bSopenharmony_ci p += 6; 239a8e1175bSopenharmony_ci 240a8e1175bSopenharmony_ci named_group_list = p; 241a8e1175bSopenharmony_ci 242a8e1175bSopenharmony_ci if (group_list == NULL) { 243a8e1175bSopenharmony_ci return MBEDTLS_ERR_SSL_BAD_CONFIG; 244a8e1175bSopenharmony_ci } 245a8e1175bSopenharmony_ci 246a8e1175bSopenharmony_ci for (; *group_list != 0; group_list++) { 247a8e1175bSopenharmony_ci int propose_group = 0; 248a8e1175bSopenharmony_ci 249a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_MSG(3, ("got supported group(%04x)", *group_list)); 250a8e1175bSopenharmony_ci 251a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED) 252a8e1175bSopenharmony_ci if (flags & SSL_WRITE_SUPPORTED_GROUPS_EXT_TLS1_3_FLAG) { 253a8e1175bSopenharmony_ci#if defined(PSA_WANT_ALG_ECDH) 254a8e1175bSopenharmony_ci if (mbedtls_ssl_tls13_named_group_is_ecdhe(*group_list) && 255a8e1175bSopenharmony_ci (mbedtls_ssl_get_ecp_group_id_from_tls_id(*group_list) != 256a8e1175bSopenharmony_ci MBEDTLS_ECP_DP_NONE)) { 257a8e1175bSopenharmony_ci propose_group = 1; 258a8e1175bSopenharmony_ci } 259a8e1175bSopenharmony_ci#endif 260a8e1175bSopenharmony_ci#if defined(PSA_WANT_ALG_FFDH) 261a8e1175bSopenharmony_ci if (mbedtls_ssl_tls13_named_group_is_ffdh(*group_list)) { 262a8e1175bSopenharmony_ci propose_group = 1; 263a8e1175bSopenharmony_ci } 264a8e1175bSopenharmony_ci#endif 265a8e1175bSopenharmony_ci } 266a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */ 267a8e1175bSopenharmony_ci 268a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_TLS1_2_SOME_ECC) 269a8e1175bSopenharmony_ci if ((flags & SSL_WRITE_SUPPORTED_GROUPS_EXT_TLS1_2_FLAG) && 270a8e1175bSopenharmony_ci mbedtls_ssl_tls12_named_group_is_ecdhe(*group_list) && 271a8e1175bSopenharmony_ci (mbedtls_ssl_get_ecp_group_id_from_tls_id(*group_list) != 272a8e1175bSopenharmony_ci MBEDTLS_ECP_DP_NONE)) { 273a8e1175bSopenharmony_ci propose_group = 1; 274a8e1175bSopenharmony_ci } 275a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_TLS1_2_SOME_ECC */ 276a8e1175bSopenharmony_ci 277a8e1175bSopenharmony_ci if (propose_group) { 278a8e1175bSopenharmony_ci MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2); 279a8e1175bSopenharmony_ci MBEDTLS_PUT_UINT16_BE(*group_list, p, 0); 280a8e1175bSopenharmony_ci p += 2; 281a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_MSG(3, ("NamedGroup: %s ( %x )", 282a8e1175bSopenharmony_ci mbedtls_ssl_named_group_to_str(*group_list), 283a8e1175bSopenharmony_ci *group_list)); 284a8e1175bSopenharmony_ci } 285a8e1175bSopenharmony_ci } 286a8e1175bSopenharmony_ci 287a8e1175bSopenharmony_ci /* Length of named_group_list */ 288a8e1175bSopenharmony_ci named_group_list_len = (size_t) (p - named_group_list); 289a8e1175bSopenharmony_ci if (named_group_list_len == 0) { 290a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_MSG(1, ("No group available.")); 291a8e1175bSopenharmony_ci return MBEDTLS_ERR_SSL_INTERNAL_ERROR; 292a8e1175bSopenharmony_ci } 293a8e1175bSopenharmony_ci 294a8e1175bSopenharmony_ci /* Write extension_type */ 295a8e1175bSopenharmony_ci MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_GROUPS, buf, 0); 296a8e1175bSopenharmony_ci /* Write extension_data_length */ 297a8e1175bSopenharmony_ci MBEDTLS_PUT_UINT16_BE(named_group_list_len + 2, buf, 2); 298a8e1175bSopenharmony_ci /* Write length of named_group_list */ 299a8e1175bSopenharmony_ci MBEDTLS_PUT_UINT16_BE(named_group_list_len, buf, 4); 300a8e1175bSopenharmony_ci 301a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_BUF(3, "Supported groups extension", 302a8e1175bSopenharmony_ci buf + 4, named_group_list_len + 2); 303a8e1175bSopenharmony_ci 304a8e1175bSopenharmony_ci *out_len = (size_t) (p - buf); 305a8e1175bSopenharmony_ci 306a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 307a8e1175bSopenharmony_ci mbedtls_ssl_tls13_set_hs_sent_ext_mask( 308a8e1175bSopenharmony_ci ssl, MBEDTLS_TLS_EXT_SUPPORTED_GROUPS); 309a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */ 310a8e1175bSopenharmony_ci 311a8e1175bSopenharmony_ci return 0; 312a8e1175bSopenharmony_ci} 313a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_TLS1_2_SOME_ECC || 314a8e1175bSopenharmony_ci MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */ 315a8e1175bSopenharmony_ci 316a8e1175bSopenharmony_ciMBEDTLS_CHECK_RETURN_CRITICAL 317a8e1175bSopenharmony_cistatic int ssl_write_client_hello_cipher_suites( 318a8e1175bSopenharmony_ci mbedtls_ssl_context *ssl, 319a8e1175bSopenharmony_ci unsigned char *buf, 320a8e1175bSopenharmony_ci unsigned char *end, 321a8e1175bSopenharmony_ci int *tls12_uses_ec, 322a8e1175bSopenharmony_ci size_t *out_len) 323a8e1175bSopenharmony_ci{ 324a8e1175bSopenharmony_ci unsigned char *p = buf; 325a8e1175bSopenharmony_ci const int *ciphersuite_list; 326a8e1175bSopenharmony_ci unsigned char *cipher_suites; /* Start of the cipher_suites list */ 327a8e1175bSopenharmony_ci size_t cipher_suites_len; 328a8e1175bSopenharmony_ci 329a8e1175bSopenharmony_ci *tls12_uses_ec = 0; 330a8e1175bSopenharmony_ci *out_len = 0; 331a8e1175bSopenharmony_ci 332a8e1175bSopenharmony_ci /* 333a8e1175bSopenharmony_ci * Ciphersuite list 334a8e1175bSopenharmony_ci * 335a8e1175bSopenharmony_ci * This is a list of the symmetric cipher options supported by 336a8e1175bSopenharmony_ci * the client, specifically the record protection algorithm 337a8e1175bSopenharmony_ci * ( including secret key length ) and a hash to be used with 338a8e1175bSopenharmony_ci * HKDF, in descending order of client preference. 339a8e1175bSopenharmony_ci */ 340a8e1175bSopenharmony_ci ciphersuite_list = ssl->conf->ciphersuite_list; 341a8e1175bSopenharmony_ci 342a8e1175bSopenharmony_ci /* Check there is space for the cipher suite list length (2 bytes). */ 343a8e1175bSopenharmony_ci MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2); 344a8e1175bSopenharmony_ci p += 2; 345a8e1175bSopenharmony_ci 346a8e1175bSopenharmony_ci /* Write cipher_suites 347a8e1175bSopenharmony_ci * CipherSuite cipher_suites<2..2^16-2>; 348a8e1175bSopenharmony_ci */ 349a8e1175bSopenharmony_ci cipher_suites = p; 350a8e1175bSopenharmony_ci for (size_t i = 0; ciphersuite_list[i] != 0; i++) { 351a8e1175bSopenharmony_ci int cipher_suite = ciphersuite_list[i]; 352a8e1175bSopenharmony_ci const mbedtls_ssl_ciphersuite_t *ciphersuite_info; 353a8e1175bSopenharmony_ci 354a8e1175bSopenharmony_ci ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(cipher_suite); 355a8e1175bSopenharmony_ci 356a8e1175bSopenharmony_ci if (mbedtls_ssl_validate_ciphersuite(ssl, ciphersuite_info, 357a8e1175bSopenharmony_ci ssl->handshake->min_tls_version, 358a8e1175bSopenharmony_ci ssl->tls_version) != 0) { 359a8e1175bSopenharmony_ci continue; 360a8e1175bSopenharmony_ci } 361a8e1175bSopenharmony_ci 362a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ 363a8e1175bSopenharmony_ci (defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \ 364a8e1175bSopenharmony_ci defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \ 365a8e1175bSopenharmony_ci defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)) 366a8e1175bSopenharmony_ci *tls12_uses_ec |= mbedtls_ssl_ciphersuite_uses_ec(ciphersuite_info); 367a8e1175bSopenharmony_ci#endif 368a8e1175bSopenharmony_ci 369a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, add ciphersuite: %04x, %s", 370a8e1175bSopenharmony_ci (unsigned int) cipher_suite, 371a8e1175bSopenharmony_ci ciphersuite_info->name)); 372a8e1175bSopenharmony_ci 373a8e1175bSopenharmony_ci /* Check there is space for the cipher suite identifier (2 bytes). */ 374a8e1175bSopenharmony_ci MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2); 375a8e1175bSopenharmony_ci MBEDTLS_PUT_UINT16_BE(cipher_suite, p, 0); 376a8e1175bSopenharmony_ci p += 2; 377a8e1175bSopenharmony_ci } 378a8e1175bSopenharmony_ci 379a8e1175bSopenharmony_ci /* 380a8e1175bSopenharmony_ci * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV 381a8e1175bSopenharmony_ci */ 382a8e1175bSopenharmony_ci int renegotiating = 0; 383a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_RENEGOTIATION) 384a8e1175bSopenharmony_ci renegotiating = (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE); 385a8e1175bSopenharmony_ci#endif 386a8e1175bSopenharmony_ci if (!renegotiating) { 387a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_MSG(3, ("adding EMPTY_RENEGOTIATION_INFO_SCSV")); 388a8e1175bSopenharmony_ci MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2); 389a8e1175bSopenharmony_ci MBEDTLS_PUT_UINT16_BE(MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO, p, 0); 390a8e1175bSopenharmony_ci p += 2; 391a8e1175bSopenharmony_ci } 392a8e1175bSopenharmony_ci 393a8e1175bSopenharmony_ci /* Write the cipher_suites length in number of bytes */ 394a8e1175bSopenharmony_ci cipher_suites_len = (size_t) (p - cipher_suites); 395a8e1175bSopenharmony_ci MBEDTLS_PUT_UINT16_BE(cipher_suites_len, buf, 0); 396a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_MSG(3, 397a8e1175bSopenharmony_ci ("client hello, got %" MBEDTLS_PRINTF_SIZET " cipher suites", 398a8e1175bSopenharmony_ci cipher_suites_len/2)); 399a8e1175bSopenharmony_ci 400a8e1175bSopenharmony_ci /* Output the total length of cipher_suites field. */ 401a8e1175bSopenharmony_ci *out_len = (size_t) (p - buf); 402a8e1175bSopenharmony_ci 403a8e1175bSopenharmony_ci return 0; 404a8e1175bSopenharmony_ci} 405a8e1175bSopenharmony_ci 406a8e1175bSopenharmony_ci/* 407a8e1175bSopenharmony_ci * Structure of the TLS 1.3 ClientHello message: 408a8e1175bSopenharmony_ci * 409a8e1175bSopenharmony_ci * struct { 410a8e1175bSopenharmony_ci * ProtocolVersion legacy_version = 0x0303; // TLS v1.2 411a8e1175bSopenharmony_ci * Random random; 412a8e1175bSopenharmony_ci * opaque legacy_session_id<0..32>; 413a8e1175bSopenharmony_ci * CipherSuite cipher_suites<2..2^16-2>; 414a8e1175bSopenharmony_ci * opaque legacy_compression_methods<1..2^8-1>; 415a8e1175bSopenharmony_ci * Extension extensions<8..2^16-1>; 416a8e1175bSopenharmony_ci * } ClientHello; 417a8e1175bSopenharmony_ci * 418a8e1175bSopenharmony_ci * Structure of the (D)TLS 1.2 ClientHello message: 419a8e1175bSopenharmony_ci * 420a8e1175bSopenharmony_ci * struct { 421a8e1175bSopenharmony_ci * ProtocolVersion client_version; 422a8e1175bSopenharmony_ci * Random random; 423a8e1175bSopenharmony_ci * SessionID session_id; 424a8e1175bSopenharmony_ci * opaque cookie<0..2^8-1>; // DTLS 1.2 ONLY 425a8e1175bSopenharmony_ci * CipherSuite cipher_suites<2..2^16-2>; 426a8e1175bSopenharmony_ci * CompressionMethod compression_methods<1..2^8-1>; 427a8e1175bSopenharmony_ci * select (extensions_present) { 428a8e1175bSopenharmony_ci * case false: 429a8e1175bSopenharmony_ci * struct {}; 430a8e1175bSopenharmony_ci * case true: 431a8e1175bSopenharmony_ci * Extension extensions<0..2^16-1>; 432a8e1175bSopenharmony_ci * }; 433a8e1175bSopenharmony_ci * } ClientHello; 434a8e1175bSopenharmony_ci */ 435a8e1175bSopenharmony_ciMBEDTLS_CHECK_RETURN_CRITICAL 436a8e1175bSopenharmony_cistatic int ssl_write_client_hello_body(mbedtls_ssl_context *ssl, 437a8e1175bSopenharmony_ci unsigned char *buf, 438a8e1175bSopenharmony_ci unsigned char *end, 439a8e1175bSopenharmony_ci size_t *out_len, 440a8e1175bSopenharmony_ci size_t *binders_len) 441a8e1175bSopenharmony_ci{ 442a8e1175bSopenharmony_ci int ret; 443a8e1175bSopenharmony_ci mbedtls_ssl_handshake_params *handshake = ssl->handshake; 444a8e1175bSopenharmony_ci unsigned char *p = buf; 445a8e1175bSopenharmony_ci unsigned char *p_extensions_len; /* Pointer to extensions length */ 446a8e1175bSopenharmony_ci size_t output_len; /* Length of buffer used by function */ 447a8e1175bSopenharmony_ci size_t extensions_len; /* Length of the list of extensions*/ 448a8e1175bSopenharmony_ci int tls12_uses_ec = 0; 449a8e1175bSopenharmony_ci 450a8e1175bSopenharmony_ci *out_len = 0; 451a8e1175bSopenharmony_ci *binders_len = 0; 452a8e1175bSopenharmony_ci 453a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_2) 454a8e1175bSopenharmony_ci unsigned char propose_tls12 = 455a8e1175bSopenharmony_ci (handshake->min_tls_version <= MBEDTLS_SSL_VERSION_TLS1_2) 456a8e1175bSopenharmony_ci && 457a8e1175bSopenharmony_ci (MBEDTLS_SSL_VERSION_TLS1_2 <= ssl->tls_version); 458a8e1175bSopenharmony_ci#endif 459a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 460a8e1175bSopenharmony_ci unsigned char propose_tls13 = 461a8e1175bSopenharmony_ci (handshake->min_tls_version <= MBEDTLS_SSL_VERSION_TLS1_3) 462a8e1175bSopenharmony_ci && 463a8e1175bSopenharmony_ci (MBEDTLS_SSL_VERSION_TLS1_3 <= ssl->tls_version); 464a8e1175bSopenharmony_ci#endif 465a8e1175bSopenharmony_ci 466a8e1175bSopenharmony_ci /* 467a8e1175bSopenharmony_ci * Write client_version (TLS 1.2) or legacy_version (TLS 1.3) 468a8e1175bSopenharmony_ci * 469a8e1175bSopenharmony_ci * In all cases this is the TLS 1.2 version. 470a8e1175bSopenharmony_ci */ 471a8e1175bSopenharmony_ci MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2); 472a8e1175bSopenharmony_ci mbedtls_ssl_write_version(p, ssl->conf->transport, 473a8e1175bSopenharmony_ci MBEDTLS_SSL_VERSION_TLS1_2); 474a8e1175bSopenharmony_ci p += 2; 475a8e1175bSopenharmony_ci 476a8e1175bSopenharmony_ci /* ... 477a8e1175bSopenharmony_ci * Random random; 478a8e1175bSopenharmony_ci * ... 479a8e1175bSopenharmony_ci * 480a8e1175bSopenharmony_ci * The random bytes have been prepared by ssl_prepare_client_hello() into 481a8e1175bSopenharmony_ci * the handshake->randbytes buffer and are copied here into the output 482a8e1175bSopenharmony_ci * buffer. 483a8e1175bSopenharmony_ci */ 484a8e1175bSopenharmony_ci MBEDTLS_SSL_CHK_BUF_PTR(p, end, MBEDTLS_CLIENT_HELLO_RANDOM_LEN); 485a8e1175bSopenharmony_ci memcpy(p, handshake->randbytes, MBEDTLS_CLIENT_HELLO_RANDOM_LEN); 486a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", 487a8e1175bSopenharmony_ci p, MBEDTLS_CLIENT_HELLO_RANDOM_LEN); 488a8e1175bSopenharmony_ci p += MBEDTLS_CLIENT_HELLO_RANDOM_LEN; 489a8e1175bSopenharmony_ci 490a8e1175bSopenharmony_ci /* TLS 1.2: 491a8e1175bSopenharmony_ci * ... 492a8e1175bSopenharmony_ci * SessionID session_id; 493a8e1175bSopenharmony_ci * ... 494a8e1175bSopenharmony_ci * with 495a8e1175bSopenharmony_ci * opaque SessionID<0..32>; 496a8e1175bSopenharmony_ci * 497a8e1175bSopenharmony_ci * TLS 1.3: 498a8e1175bSopenharmony_ci * ... 499a8e1175bSopenharmony_ci * opaque legacy_session_id<0..32>; 500a8e1175bSopenharmony_ci * ... 501a8e1175bSopenharmony_ci * 502a8e1175bSopenharmony_ci * The (legacy) session identifier bytes have been prepared by 503a8e1175bSopenharmony_ci * ssl_prepare_client_hello() into the ssl->session_negotiate->id buffer 504a8e1175bSopenharmony_ci * and are copied here into the output buffer. 505a8e1175bSopenharmony_ci */ 506a8e1175bSopenharmony_ci MBEDTLS_SSL_CHK_BUF_PTR(p, end, ssl->session_negotiate->id_len + 1); 507a8e1175bSopenharmony_ci *p++ = (unsigned char) ssl->session_negotiate->id_len; 508a8e1175bSopenharmony_ci memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len); 509a8e1175bSopenharmony_ci p += ssl->session_negotiate->id_len; 510a8e1175bSopenharmony_ci 511a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_BUF(3, "session id", ssl->session_negotiate->id, 512a8e1175bSopenharmony_ci ssl->session_negotiate->id_len); 513a8e1175bSopenharmony_ci 514a8e1175bSopenharmony_ci /* DTLS 1.2 ONLY 515a8e1175bSopenharmony_ci * ... 516a8e1175bSopenharmony_ci * opaque cookie<0..2^8-1>; 517a8e1175bSopenharmony_ci * ... 518a8e1175bSopenharmony_ci */ 519a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_SSL_PROTO_DTLS) 520a8e1175bSopenharmony_ci if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { 521a8e1175bSopenharmony_ci#if !defined(MBEDTLS_SSL_PROTO_TLS1_3) 522a8e1175bSopenharmony_ci uint8_t cookie_len = 0; 523a8e1175bSopenharmony_ci#else 524a8e1175bSopenharmony_ci uint16_t cookie_len = 0; 525a8e1175bSopenharmony_ci#endif /* !MBEDTLS_SSL_PROTO_TLS1_3 */ 526a8e1175bSopenharmony_ci 527a8e1175bSopenharmony_ci if (handshake->cookie != NULL) { 528a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie", 529a8e1175bSopenharmony_ci handshake->cookie, 530a8e1175bSopenharmony_ci handshake->cookie_len); 531a8e1175bSopenharmony_ci cookie_len = handshake->cookie_len; 532a8e1175bSopenharmony_ci } 533a8e1175bSopenharmony_ci 534a8e1175bSopenharmony_ci MBEDTLS_SSL_CHK_BUF_PTR(p, end, cookie_len + 1); 535a8e1175bSopenharmony_ci *p++ = (unsigned char) cookie_len; 536a8e1175bSopenharmony_ci if (cookie_len > 0) { 537a8e1175bSopenharmony_ci memcpy(p, handshake->cookie, cookie_len); 538a8e1175bSopenharmony_ci p += cookie_len; 539a8e1175bSopenharmony_ci } 540a8e1175bSopenharmony_ci } 541a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_SSL_PROTO_DTLS */ 542a8e1175bSopenharmony_ci 543a8e1175bSopenharmony_ci /* Write cipher_suites */ 544a8e1175bSopenharmony_ci ret = ssl_write_client_hello_cipher_suites(ssl, p, end, 545a8e1175bSopenharmony_ci &tls12_uses_ec, 546a8e1175bSopenharmony_ci &output_len); 547a8e1175bSopenharmony_ci if (ret != 0) { 548a8e1175bSopenharmony_ci return ret; 549a8e1175bSopenharmony_ci } 550a8e1175bSopenharmony_ci p += output_len; 551a8e1175bSopenharmony_ci 552a8e1175bSopenharmony_ci /* Write legacy_compression_methods (TLS 1.3) or 553a8e1175bSopenharmony_ci * compression_methods (TLS 1.2) 554a8e1175bSopenharmony_ci * 555a8e1175bSopenharmony_ci * For every TLS 1.3 ClientHello, this vector MUST contain exactly 556a8e1175bSopenharmony_ci * one byte set to zero, which corresponds to the 'null' compression 557a8e1175bSopenharmony_ci * method in prior versions of TLS. 558a8e1175bSopenharmony_ci * 559a8e1175bSopenharmony_ci * For TLS 1.2 ClientHello, for security reasons we do not support 560a8e1175bSopenharmony_ci * compression anymore, thus also just the 'null' compression method. 561a8e1175bSopenharmony_ci */ 562a8e1175bSopenharmony_ci MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2); 563a8e1175bSopenharmony_ci *p++ = 1; 564a8e1175bSopenharmony_ci *p++ = MBEDTLS_SSL_COMPRESS_NULL; 565a8e1175bSopenharmony_ci 566a8e1175bSopenharmony_ci /* Write extensions */ 567a8e1175bSopenharmony_ci 568a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 569a8e1175bSopenharmony_ci /* Keeping track of the included extensions */ 570a8e1175bSopenharmony_ci handshake->sent_extensions = MBEDTLS_SSL_EXT_MASK_NONE; 571a8e1175bSopenharmony_ci#endif 572a8e1175bSopenharmony_ci 573a8e1175bSopenharmony_ci /* First write extensions, then the total length */ 574a8e1175bSopenharmony_ci MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2); 575a8e1175bSopenharmony_ci p_extensions_len = p; 576a8e1175bSopenharmony_ci p += 2; 577a8e1175bSopenharmony_ci 578a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) 579a8e1175bSopenharmony_ci /* Write server name extension */ 580a8e1175bSopenharmony_ci ret = ssl_write_hostname_ext(ssl, p, end, &output_len); 581a8e1175bSopenharmony_ci if (ret != 0) { 582a8e1175bSopenharmony_ci return ret; 583a8e1175bSopenharmony_ci } 584a8e1175bSopenharmony_ci p += output_len; 585a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ 586a8e1175bSopenharmony_ci 587a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_ALPN) 588a8e1175bSopenharmony_ci ret = ssl_write_alpn_ext(ssl, p, end, &output_len); 589a8e1175bSopenharmony_ci if (ret != 0) { 590a8e1175bSopenharmony_ci return ret; 591a8e1175bSopenharmony_ci } 592a8e1175bSopenharmony_ci p += output_len; 593a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_ALPN */ 594a8e1175bSopenharmony_ci 595a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 596a8e1175bSopenharmony_ci if (propose_tls13) { 597a8e1175bSopenharmony_ci ret = mbedtls_ssl_tls13_write_client_hello_exts(ssl, p, end, 598a8e1175bSopenharmony_ci &output_len); 599a8e1175bSopenharmony_ci if (ret != 0) { 600a8e1175bSopenharmony_ci return ret; 601a8e1175bSopenharmony_ci } 602a8e1175bSopenharmony_ci p += output_len; 603a8e1175bSopenharmony_ci } 604a8e1175bSopenharmony_ci#endif 605a8e1175bSopenharmony_ci 606a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_TLS1_2_SOME_ECC) || \ 607a8e1175bSopenharmony_ci defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED) 608a8e1175bSopenharmony_ci { 609a8e1175bSopenharmony_ci int ssl_write_supported_groups_ext_flags = 0; 610a8e1175bSopenharmony_ci 611a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED) 612a8e1175bSopenharmony_ci if (propose_tls13 && mbedtls_ssl_conf_tls13_is_some_ephemeral_enabled(ssl)) { 613a8e1175bSopenharmony_ci ssl_write_supported_groups_ext_flags |= 614a8e1175bSopenharmony_ci SSL_WRITE_SUPPORTED_GROUPS_EXT_TLS1_3_FLAG; 615a8e1175bSopenharmony_ci } 616a8e1175bSopenharmony_ci#endif 617a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_TLS1_2_SOME_ECC) 618a8e1175bSopenharmony_ci if (propose_tls12 && tls12_uses_ec) { 619a8e1175bSopenharmony_ci ssl_write_supported_groups_ext_flags |= 620a8e1175bSopenharmony_ci SSL_WRITE_SUPPORTED_GROUPS_EXT_TLS1_2_FLAG; 621a8e1175bSopenharmony_ci } 622a8e1175bSopenharmony_ci#endif 623a8e1175bSopenharmony_ci if (ssl_write_supported_groups_ext_flags != 0) { 624a8e1175bSopenharmony_ci ret = ssl_write_supported_groups_ext(ssl, p, end, 625a8e1175bSopenharmony_ci ssl_write_supported_groups_ext_flags, 626a8e1175bSopenharmony_ci &output_len); 627a8e1175bSopenharmony_ci if (ret != 0) { 628a8e1175bSopenharmony_ci return ret; 629a8e1175bSopenharmony_ci } 630a8e1175bSopenharmony_ci p += output_len; 631a8e1175bSopenharmony_ci } 632a8e1175bSopenharmony_ci } 633a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_TLS1_2_SOME_ECC || 634a8e1175bSopenharmony_ci MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */ 635a8e1175bSopenharmony_ci 636a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED) 637a8e1175bSopenharmony_ci int write_sig_alg_ext = 0; 638a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 639a8e1175bSopenharmony_ci write_sig_alg_ext = write_sig_alg_ext || 640a8e1175bSopenharmony_ci (propose_tls13 && mbedtls_ssl_conf_tls13_is_ephemeral_enabled(ssl)); 641a8e1175bSopenharmony_ci#endif 642a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_2) 643a8e1175bSopenharmony_ci write_sig_alg_ext = write_sig_alg_ext || propose_tls12; 644a8e1175bSopenharmony_ci#endif 645a8e1175bSopenharmony_ci 646a8e1175bSopenharmony_ci if (write_sig_alg_ext) { 647a8e1175bSopenharmony_ci ret = mbedtls_ssl_write_sig_alg_ext(ssl, p, end, &output_len); 648a8e1175bSopenharmony_ci if (ret != 0) { 649a8e1175bSopenharmony_ci return ret; 650a8e1175bSopenharmony_ci } 651a8e1175bSopenharmony_ci p += output_len; 652a8e1175bSopenharmony_ci } 653a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */ 654a8e1175bSopenharmony_ci 655a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_2) 656a8e1175bSopenharmony_ci if (propose_tls12) { 657a8e1175bSopenharmony_ci ret = mbedtls_ssl_tls12_write_client_hello_exts(ssl, p, end, 658a8e1175bSopenharmony_ci tls12_uses_ec, 659a8e1175bSopenharmony_ci &output_len); 660a8e1175bSopenharmony_ci if (ret != 0) { 661a8e1175bSopenharmony_ci return ret; 662a8e1175bSopenharmony_ci } 663a8e1175bSopenharmony_ci p += output_len; 664a8e1175bSopenharmony_ci } 665a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 666a8e1175bSopenharmony_ci 667a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED) 668a8e1175bSopenharmony_ci /* The "pre_shared_key" extension (RFC 8446 Section 4.2.11) 669a8e1175bSopenharmony_ci * MUST be the last extension in the ClientHello. 670a8e1175bSopenharmony_ci */ 671a8e1175bSopenharmony_ci if (propose_tls13 && mbedtls_ssl_conf_tls13_is_some_psk_enabled(ssl)) { 672a8e1175bSopenharmony_ci ret = mbedtls_ssl_tls13_write_identities_of_pre_shared_key_ext( 673a8e1175bSopenharmony_ci ssl, p, end, &output_len, binders_len); 674a8e1175bSopenharmony_ci if (ret != 0) { 675a8e1175bSopenharmony_ci return ret; 676a8e1175bSopenharmony_ci } 677a8e1175bSopenharmony_ci p += output_len; 678a8e1175bSopenharmony_ci } 679a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */ 680a8e1175bSopenharmony_ci 681a8e1175bSopenharmony_ci /* Write the length of the list of extensions. */ 682a8e1175bSopenharmony_ci extensions_len = (size_t) (p - p_extensions_len) - 2; 683a8e1175bSopenharmony_ci 684a8e1175bSopenharmony_ci if (extensions_len == 0) { 685a8e1175bSopenharmony_ci p = p_extensions_len; 686a8e1175bSopenharmony_ci } else { 687a8e1175bSopenharmony_ci MBEDTLS_PUT_UINT16_BE(extensions_len, p_extensions_len, 0); 688a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, total extension length: %" \ 689a8e1175bSopenharmony_ci MBEDTLS_PRINTF_SIZET, extensions_len)); 690a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", 691a8e1175bSopenharmony_ci p_extensions_len, extensions_len); 692a8e1175bSopenharmony_ci } 693a8e1175bSopenharmony_ci 694a8e1175bSopenharmony_ci *out_len = (size_t) (p - buf); 695a8e1175bSopenharmony_ci return 0; 696a8e1175bSopenharmony_ci} 697a8e1175bSopenharmony_ci 698a8e1175bSopenharmony_ciMBEDTLS_CHECK_RETURN_CRITICAL 699a8e1175bSopenharmony_cistatic int ssl_generate_random(mbedtls_ssl_context *ssl) 700a8e1175bSopenharmony_ci{ 701a8e1175bSopenharmony_ci int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 702a8e1175bSopenharmony_ci unsigned char *randbytes = ssl->handshake->randbytes; 703a8e1175bSopenharmony_ci size_t gmt_unix_time_len = 0; 704a8e1175bSopenharmony_ci 705a8e1175bSopenharmony_ci /* 706a8e1175bSopenharmony_ci * Generate the random bytes 707a8e1175bSopenharmony_ci * 708a8e1175bSopenharmony_ci * TLS 1.2 case: 709a8e1175bSopenharmony_ci * struct { 710a8e1175bSopenharmony_ci * uint32 gmt_unix_time; 711a8e1175bSopenharmony_ci * opaque random_bytes[28]; 712a8e1175bSopenharmony_ci * } Random; 713a8e1175bSopenharmony_ci * 714a8e1175bSopenharmony_ci * TLS 1.3 case: 715a8e1175bSopenharmony_ci * opaque Random[32]; 716a8e1175bSopenharmony_ci */ 717a8e1175bSopenharmony_ci if (ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_2) { 718a8e1175bSopenharmony_ci#if defined(MBEDTLS_HAVE_TIME) 719a8e1175bSopenharmony_ci mbedtls_time_t gmt_unix_time = mbedtls_time(NULL); 720a8e1175bSopenharmony_ci MBEDTLS_PUT_UINT32_BE(gmt_unix_time, randbytes, 0); 721a8e1175bSopenharmony_ci gmt_unix_time_len = 4; 722a8e1175bSopenharmony_ci 723a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_MSG(3, 724a8e1175bSopenharmony_ci ("client hello, current time: %" MBEDTLS_PRINTF_LONGLONG, 725a8e1175bSopenharmony_ci (long long) gmt_unix_time)); 726a8e1175bSopenharmony_ci#endif /* MBEDTLS_HAVE_TIME */ 727a8e1175bSopenharmony_ci } 728a8e1175bSopenharmony_ci 729a8e1175bSopenharmony_ci ret = ssl->conf->f_rng(ssl->conf->p_rng, 730a8e1175bSopenharmony_ci randbytes + gmt_unix_time_len, 731a8e1175bSopenharmony_ci MBEDTLS_CLIENT_HELLO_RANDOM_LEN - gmt_unix_time_len); 732a8e1175bSopenharmony_ci return ret; 733a8e1175bSopenharmony_ci} 734a8e1175bSopenharmony_ci 735a8e1175bSopenharmony_ciMBEDTLS_CHECK_RETURN_CRITICAL 736a8e1175bSopenharmony_cistatic int ssl_prepare_client_hello(mbedtls_ssl_context *ssl) 737a8e1175bSopenharmony_ci{ 738a8e1175bSopenharmony_ci int ret; 739a8e1175bSopenharmony_ci size_t session_id_len; 740a8e1175bSopenharmony_ci mbedtls_ssl_session *session_negotiate = ssl->session_negotiate; 741a8e1175bSopenharmony_ci 742a8e1175bSopenharmony_ci if (session_negotiate == NULL) { 743a8e1175bSopenharmony_ci return MBEDTLS_ERR_SSL_INTERNAL_ERROR; 744a8e1175bSopenharmony_ci } 745a8e1175bSopenharmony_ci 746a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) && \ 747a8e1175bSopenharmony_ci defined(MBEDTLS_SSL_SESSION_TICKETS) && \ 748a8e1175bSopenharmony_ci defined(MBEDTLS_HAVE_TIME) 749a8e1175bSopenharmony_ci 750a8e1175bSopenharmony_ci /* Check if a tls13 ticket has been configured. */ 751a8e1175bSopenharmony_ci if (ssl->handshake->resume != 0 && 752a8e1175bSopenharmony_ci session_negotiate->tls_version == MBEDTLS_SSL_VERSION_TLS1_3 && 753a8e1175bSopenharmony_ci session_negotiate->ticket != NULL) { 754a8e1175bSopenharmony_ci mbedtls_ms_time_t now = mbedtls_ms_time(); 755a8e1175bSopenharmony_ci mbedtls_ms_time_t age = now - session_negotiate->ticket_reception_time; 756a8e1175bSopenharmony_ci if (age < 0 || 757a8e1175bSopenharmony_ci age > (mbedtls_ms_time_t) session_negotiate->ticket_lifetime * 1000) { 758a8e1175bSopenharmony_ci /* Without valid ticket, disable session resumption.*/ 759a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_MSG( 760a8e1175bSopenharmony_ci 3, ("Ticket expired, disable session resumption")); 761a8e1175bSopenharmony_ci ssl->handshake->resume = 0; 762a8e1175bSopenharmony_ci } 763a8e1175bSopenharmony_ci } 764a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_3 && 765a8e1175bSopenharmony_ci MBEDTLS_SSL_SESSION_TICKETS && 766a8e1175bSopenharmony_ci MBEDTLS_HAVE_TIME */ 767a8e1175bSopenharmony_ci 768a8e1175bSopenharmony_ci /* Bet on the highest configured version if we are not in a TLS 1.2 769a8e1175bSopenharmony_ci * renegotiation or session resumption. 770a8e1175bSopenharmony_ci */ 771a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_RENEGOTIATION) 772a8e1175bSopenharmony_ci if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) { 773a8e1175bSopenharmony_ci ssl->handshake->min_tls_version = ssl->tls_version; 774a8e1175bSopenharmony_ci } else 775a8e1175bSopenharmony_ci#endif 776a8e1175bSopenharmony_ci { 777a8e1175bSopenharmony_ci if (ssl->handshake->resume) { 778a8e1175bSopenharmony_ci ssl->tls_version = session_negotiate->tls_version; 779a8e1175bSopenharmony_ci ssl->handshake->min_tls_version = ssl->tls_version; 780a8e1175bSopenharmony_ci } else { 781a8e1175bSopenharmony_ci ssl->handshake->min_tls_version = ssl->conf->min_tls_version; 782a8e1175bSopenharmony_ci } 783a8e1175bSopenharmony_ci } 784a8e1175bSopenharmony_ci 785a8e1175bSopenharmony_ci /* 786a8e1175bSopenharmony_ci * Generate the random bytes, except when responding to a verify request 787a8e1175bSopenharmony_ci * where we MUST reuse the previously generated random bytes 788a8e1175bSopenharmony_ci * (RFC 6347 4.2.1). 789a8e1175bSopenharmony_ci */ 790a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_DTLS) 791a8e1175bSopenharmony_ci if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) || 792a8e1175bSopenharmony_ci (ssl->handshake->cookie == NULL)) 793a8e1175bSopenharmony_ci#endif 794a8e1175bSopenharmony_ci { 795a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 796a8e1175bSopenharmony_ci if (!ssl->handshake->hello_retry_request_flag) 797a8e1175bSopenharmony_ci#endif 798a8e1175bSopenharmony_ci { 799a8e1175bSopenharmony_ci ret = ssl_generate_random(ssl); 800a8e1175bSopenharmony_ci if (ret != 0) { 801a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_RET(1, "Random bytes generation failed", ret); 802a8e1175bSopenharmony_ci return ret; 803a8e1175bSopenharmony_ci } 804a8e1175bSopenharmony_ci } 805a8e1175bSopenharmony_ci } 806a8e1175bSopenharmony_ci 807a8e1175bSopenharmony_ci /* 808a8e1175bSopenharmony_ci * Prepare session identifier. At that point, the length of the session 809a8e1175bSopenharmony_ci * identifier in the SSL context `ssl->session_negotiate->id_len` is equal 810a8e1175bSopenharmony_ci * to zero, except in the case of a TLS 1.2 session renegotiation or 811a8e1175bSopenharmony_ci * session resumption. 812a8e1175bSopenharmony_ci */ 813a8e1175bSopenharmony_ci session_id_len = session_negotiate->id_len; 814a8e1175bSopenharmony_ci 815a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_2) 816a8e1175bSopenharmony_ci if (ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_2) { 817a8e1175bSopenharmony_ci if (session_id_len < 16 || session_id_len > 32 || 818a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_RENEGOTIATION) 819a8e1175bSopenharmony_ci ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE || 820a8e1175bSopenharmony_ci#endif 821a8e1175bSopenharmony_ci ssl->handshake->resume == 0) { 822a8e1175bSopenharmony_ci session_id_len = 0; 823a8e1175bSopenharmony_ci } 824a8e1175bSopenharmony_ci 825a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_SESSION_TICKETS) 826a8e1175bSopenharmony_ci /* 827a8e1175bSopenharmony_ci * RFC 5077 section 3.4: "When presenting a ticket, the client MAY 828a8e1175bSopenharmony_ci * generate and include a Session ID in the TLS ClientHello." 829a8e1175bSopenharmony_ci */ 830a8e1175bSopenharmony_ci int renegotiating = 0; 831a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_RENEGOTIATION) 832a8e1175bSopenharmony_ci if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) { 833a8e1175bSopenharmony_ci renegotiating = 1; 834a8e1175bSopenharmony_ci } 835a8e1175bSopenharmony_ci#endif 836a8e1175bSopenharmony_ci if (!renegotiating) { 837a8e1175bSopenharmony_ci if ((session_negotiate->ticket != NULL) && 838a8e1175bSopenharmony_ci (session_negotiate->ticket_len != 0)) { 839a8e1175bSopenharmony_ci session_id_len = 32; 840a8e1175bSopenharmony_ci } 841a8e1175bSopenharmony_ci } 842a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_SESSION_TICKETS */ 843a8e1175bSopenharmony_ci } 844a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 845a8e1175bSopenharmony_ci 846a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE) 847a8e1175bSopenharmony_ci if (ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) { 848a8e1175bSopenharmony_ci /* 849a8e1175bSopenharmony_ci * Create a legacy session identifier for the purpose of middlebox 850a8e1175bSopenharmony_ci * compatibility only if one has not been created already, which is 851a8e1175bSopenharmony_ci * the case if we are here for the TLS 1.3 second ClientHello. 852a8e1175bSopenharmony_ci * 853a8e1175bSopenharmony_ci * Versions of TLS before TLS 1.3 supported a "session resumption" 854a8e1175bSopenharmony_ci * feature which has been merged with pre-shared keys in TLS 1.3 855a8e1175bSopenharmony_ci * version. A client which has a cached session ID set by a pre-TLS 1.3 856a8e1175bSopenharmony_ci * server SHOULD set this field to that value. In compatibility mode, 857a8e1175bSopenharmony_ci * this field MUST be non-empty, so a client not offering a pre-TLS 1.3 858a8e1175bSopenharmony_ci * session MUST generate a new 32-byte value. This value need not be 859a8e1175bSopenharmony_ci * random but SHOULD be unpredictable to avoid implementations fixating 860a8e1175bSopenharmony_ci * on a specific value (also known as ossification). Otherwise, it MUST 861a8e1175bSopenharmony_ci * be set as a zero-length vector ( i.e., a zero-valued single byte 862a8e1175bSopenharmony_ci * length field ). 863a8e1175bSopenharmony_ci */ 864a8e1175bSopenharmony_ci session_id_len = 32; 865a8e1175bSopenharmony_ci } 866a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */ 867a8e1175bSopenharmony_ci 868a8e1175bSopenharmony_ci if (session_id_len != session_negotiate->id_len) { 869a8e1175bSopenharmony_ci session_negotiate->id_len = session_id_len; 870a8e1175bSopenharmony_ci if (session_id_len > 0) { 871a8e1175bSopenharmony_ci ret = ssl->conf->f_rng(ssl->conf->p_rng, 872a8e1175bSopenharmony_ci session_negotiate->id, 873a8e1175bSopenharmony_ci session_id_len); 874a8e1175bSopenharmony_ci if (ret != 0) { 875a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_RET(1, "creating session id failed", ret); 876a8e1175bSopenharmony_ci return ret; 877a8e1175bSopenharmony_ci } 878a8e1175bSopenharmony_ci } 879a8e1175bSopenharmony_ci } 880a8e1175bSopenharmony_ci 881a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) && \ 882a8e1175bSopenharmony_ci defined(MBEDTLS_SSL_SESSION_TICKETS) && \ 883a8e1175bSopenharmony_ci defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) 884a8e1175bSopenharmony_ci if (ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_3 && 885a8e1175bSopenharmony_ci ssl->handshake->resume) { 886a8e1175bSopenharmony_ci int hostname_mismatch = ssl->hostname != NULL || 887a8e1175bSopenharmony_ci session_negotiate->hostname != NULL; 888a8e1175bSopenharmony_ci if (ssl->hostname != NULL && session_negotiate->hostname != NULL) { 889a8e1175bSopenharmony_ci hostname_mismatch = strcmp( 890a8e1175bSopenharmony_ci ssl->hostname, session_negotiate->hostname) != 0; 891a8e1175bSopenharmony_ci } 892a8e1175bSopenharmony_ci 893a8e1175bSopenharmony_ci if (hostname_mismatch) { 894a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_MSG( 895a8e1175bSopenharmony_ci 1, ("Hostname mismatch the session ticket, " 896a8e1175bSopenharmony_ci "disable session resumption.")); 897a8e1175bSopenharmony_ci return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; 898a8e1175bSopenharmony_ci } 899a8e1175bSopenharmony_ci } else { 900a8e1175bSopenharmony_ci return mbedtls_ssl_session_set_hostname(session_negotiate, 901a8e1175bSopenharmony_ci ssl->hostname); 902a8e1175bSopenharmony_ci } 903a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_3 && 904a8e1175bSopenharmony_ci MBEDTLS_SSL_SESSION_TICKETS && 905a8e1175bSopenharmony_ci MBEDTLS_SSL_SERVER_NAME_INDICATION */ 906a8e1175bSopenharmony_ci 907a8e1175bSopenharmony_ci return 0; 908a8e1175bSopenharmony_ci} 909a8e1175bSopenharmony_ci/* 910a8e1175bSopenharmony_ci * Write ClientHello handshake message. 911a8e1175bSopenharmony_ci * Handler for MBEDTLS_SSL_CLIENT_HELLO 912a8e1175bSopenharmony_ci */ 913a8e1175bSopenharmony_ciint mbedtls_ssl_write_client_hello(mbedtls_ssl_context *ssl) 914a8e1175bSopenharmony_ci{ 915a8e1175bSopenharmony_ci int ret = 0; 916a8e1175bSopenharmony_ci unsigned char *buf; 917a8e1175bSopenharmony_ci size_t buf_len, msg_len, binders_len; 918a8e1175bSopenharmony_ci 919a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_MSG(2, ("=> write client hello")); 920a8e1175bSopenharmony_ci 921a8e1175bSopenharmony_ci MBEDTLS_SSL_PROC_CHK(ssl_prepare_client_hello(ssl)); 922a8e1175bSopenharmony_ci 923a8e1175bSopenharmony_ci MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg( 924a8e1175bSopenharmony_ci ssl, MBEDTLS_SSL_HS_CLIENT_HELLO, 925a8e1175bSopenharmony_ci &buf, &buf_len)); 926a8e1175bSopenharmony_ci 927a8e1175bSopenharmony_ci MBEDTLS_SSL_PROC_CHK(ssl_write_client_hello_body(ssl, buf, 928a8e1175bSopenharmony_ci buf + buf_len, 929a8e1175bSopenharmony_ci &msg_len, 930a8e1175bSopenharmony_ci &binders_len)); 931a8e1175bSopenharmony_ci 932a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_SSL_PROTO_DTLS) 933a8e1175bSopenharmony_ci if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) { 934a8e1175bSopenharmony_ci ssl->out_msglen = msg_len + 4; 935a8e1175bSopenharmony_ci mbedtls_ssl_send_flight_completed(ssl); 936a8e1175bSopenharmony_ci 937a8e1175bSopenharmony_ci /* 938a8e1175bSopenharmony_ci * The two functions below may try to send data on the network and 939a8e1175bSopenharmony_ci * can return with the MBEDTLS_ERR_SSL_WANT_READ error code when they 940a8e1175bSopenharmony_ci * fail to do so and the transmission has to be retried later. In that 941a8e1175bSopenharmony_ci * case as in fatal error cases, we return immediately. But we must have 942a8e1175bSopenharmony_ci * set the handshake state to the next state at that point to ensure 943a8e1175bSopenharmony_ci * that we will not write and send again a ClientHello when we 944a8e1175bSopenharmony_ci * eventually succeed in sending the pending data. 945a8e1175bSopenharmony_ci */ 946a8e1175bSopenharmony_ci mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_HELLO); 947a8e1175bSopenharmony_ci 948a8e1175bSopenharmony_ci if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) { 949a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret); 950a8e1175bSopenharmony_ci return ret; 951a8e1175bSopenharmony_ci } 952a8e1175bSopenharmony_ci 953a8e1175bSopenharmony_ci if ((ret = mbedtls_ssl_flight_transmit(ssl)) != 0) { 954a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret); 955a8e1175bSopenharmony_ci return ret; 956a8e1175bSopenharmony_ci } 957a8e1175bSopenharmony_ci } else 958a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_SSL_PROTO_DTLS */ 959a8e1175bSopenharmony_ci { 960a8e1175bSopenharmony_ci 961a8e1175bSopenharmony_ci ret = mbedtls_ssl_add_hs_hdr_to_checksum(ssl, 962a8e1175bSopenharmony_ci MBEDTLS_SSL_HS_CLIENT_HELLO, 963a8e1175bSopenharmony_ci msg_len); 964a8e1175bSopenharmony_ci if (ret != 0) { 965a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_add_hs_hdr_to_checksum", ret); 966a8e1175bSopenharmony_ci return ret; 967a8e1175bSopenharmony_ci } 968a8e1175bSopenharmony_ci ret = ssl->handshake->update_checksum(ssl, buf, msg_len - binders_len); 969a8e1175bSopenharmony_ci if (ret != 0) { 970a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_RET(1, "update_checksum", ret); 971a8e1175bSopenharmony_ci return ret; 972a8e1175bSopenharmony_ci } 973a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED) 974a8e1175bSopenharmony_ci if (binders_len > 0) { 975a8e1175bSopenharmony_ci MBEDTLS_SSL_PROC_CHK( 976a8e1175bSopenharmony_ci mbedtls_ssl_tls13_write_binders_of_pre_shared_key_ext( 977a8e1175bSopenharmony_ci ssl, buf + msg_len - binders_len, buf + msg_len)); 978a8e1175bSopenharmony_ci ret = ssl->handshake->update_checksum(ssl, buf + msg_len - binders_len, 979a8e1175bSopenharmony_ci binders_len); 980a8e1175bSopenharmony_ci if (ret != 0) { 981a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_RET(1, "update_checksum", ret); 982a8e1175bSopenharmony_ci return ret; 983a8e1175bSopenharmony_ci } 984a8e1175bSopenharmony_ci } 985a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */ 986a8e1175bSopenharmony_ci 987a8e1175bSopenharmony_ci MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(ssl, 988a8e1175bSopenharmony_ci buf_len, 989a8e1175bSopenharmony_ci msg_len)); 990a8e1175bSopenharmony_ci 991a8e1175bSopenharmony_ci /* 992a8e1175bSopenharmony_ci * Set next state. Note that if TLS 1.3 is proposed, this may be 993a8e1175bSopenharmony_ci * overwritten by mbedtls_ssl_tls13_finalize_client_hello(). 994a8e1175bSopenharmony_ci */ 995a8e1175bSopenharmony_ci mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_HELLO); 996a8e1175bSopenharmony_ci 997a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 998a8e1175bSopenharmony_ci if (ssl->handshake->min_tls_version <= MBEDTLS_SSL_VERSION_TLS1_3 && 999a8e1175bSopenharmony_ci MBEDTLS_SSL_VERSION_TLS1_3 <= ssl->tls_version) { 1000a8e1175bSopenharmony_ci ret = mbedtls_ssl_tls13_finalize_client_hello(ssl); 1001a8e1175bSopenharmony_ci } 1002a8e1175bSopenharmony_ci#endif 1003a8e1175bSopenharmony_ci } 1004a8e1175bSopenharmony_ci 1005a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3) 1006a8e1175bSopenharmony_ci MBEDTLS_SSL_PRINT_EXTS( 1007a8e1175bSopenharmony_ci 3, MBEDTLS_SSL_HS_CLIENT_HELLO, ssl->handshake->sent_extensions); 1008a8e1175bSopenharmony_ci#endif 1009a8e1175bSopenharmony_ci 1010a8e1175bSopenharmony_cicleanup: 1011a8e1175bSopenharmony_ci 1012a8e1175bSopenharmony_ci MBEDTLS_SSL_DEBUG_MSG(2, ("<= write client hello")); 1013a8e1175bSopenharmony_ci return ret; 1014a8e1175bSopenharmony_ci} 1015a8e1175bSopenharmony_ci 1016a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_3 || MBEDTLS_SSL_PROTO_TLS1_2 */ 1017a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_CLI_C */ 1018