1*32b31808SJens Wiklander /* 2*32b31808SJens Wiklander * TLS 1.3 client-side functions 3*32b31808SJens Wiklander * 4*32b31808SJens Wiklander * Copyright The Mbed TLS Contributors 5*32b31808SJens Wiklander * SPDX-License-Identifier: Apache-2.0 6*32b31808SJens Wiklander * 7*32b31808SJens Wiklander * Licensed under the Apache License, Version 2.0 (the "License"); you may 8*32b31808SJens Wiklander * not use this file except in compliance with the License. 9*32b31808SJens Wiklander * You may obtain a copy of the License at 10*32b31808SJens Wiklander * 11*32b31808SJens Wiklander * http://www.apache.org/licenses/LICENSE-2.0 12*32b31808SJens Wiklander * 13*32b31808SJens Wiklander * Unless required by applicable law or agreed to in writing, software 14*32b31808SJens Wiklander * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 15*32b31808SJens Wiklander * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16*32b31808SJens Wiklander * See the License for the specific language governing permissions and 17*32b31808SJens Wiklander * limitations under the License. 18*32b31808SJens Wiklander * 19*32b31808SJens Wiklander * This file is part of mbed TLS ( https://tls.mbed.org ) 20*32b31808SJens Wiklander */ 21*32b31808SJens Wiklander 22*32b31808SJens Wiklander #include "common.h" 23*32b31808SJens Wiklander 24*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_CLI_C) && defined(MBEDTLS_SSL_PROTO_TLS1_3) 25*32b31808SJens Wiklander 26*32b31808SJens Wiklander #include <string.h> 27*32b31808SJens Wiklander 28*32b31808SJens Wiklander #include "mbedtls/debug.h" 29*32b31808SJens Wiklander #include "mbedtls/error.h" 30*32b31808SJens Wiklander #include "mbedtls/platform.h" 31*32b31808SJens Wiklander 32*32b31808SJens Wiklander #include "ssl_misc.h" 33*32b31808SJens Wiklander #include "ssl_client.h" 34*32b31808SJens Wiklander #include "ssl_tls13_keys.h" 35*32b31808SJens Wiklander #include "ssl_debug_helpers.h" 36*32b31808SJens Wiklander 37*32b31808SJens Wiklander #define PSA_TO_MBEDTLS_ERR(status) PSA_TO_MBEDTLS_ERR_LIST(status, \ 38*32b31808SJens Wiklander psa_to_ssl_errors, \ 39*32b31808SJens Wiklander psa_generic_status_to_mbedtls) 40*32b31808SJens Wiklander 41*32b31808SJens Wiklander /* Write extensions */ 42*32b31808SJens Wiklander 43*32b31808SJens Wiklander /* 44*32b31808SJens Wiklander * ssl_tls13_write_supported_versions_ext(): 45*32b31808SJens Wiklander * 46*32b31808SJens Wiklander * struct { 47*32b31808SJens Wiklander * ProtocolVersion versions<2..254>; 48*32b31808SJens Wiklander * } SupportedVersions; 49*32b31808SJens Wiklander */ 50*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 51*32b31808SJens Wiklander static int ssl_tls13_write_supported_versions_ext(mbedtls_ssl_context *ssl, 52*32b31808SJens Wiklander unsigned char *buf, 53*32b31808SJens Wiklander unsigned char *end, 54*32b31808SJens Wiklander size_t *out_len) 55*32b31808SJens Wiklander { 56*32b31808SJens Wiklander unsigned char *p = buf; 57*32b31808SJens Wiklander unsigned char versions_len = (ssl->handshake->min_tls_version <= 58*32b31808SJens Wiklander MBEDTLS_SSL_VERSION_TLS1_2) ? 4 : 2; 59*32b31808SJens Wiklander 60*32b31808SJens Wiklander *out_len = 0; 61*32b31808SJens Wiklander 62*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding supported versions extension")); 63*32b31808SJens Wiklander 64*32b31808SJens Wiklander /* Check if we have space to write the extension: 65*32b31808SJens Wiklander * - extension_type (2 bytes) 66*32b31808SJens Wiklander * - extension_data_length (2 bytes) 67*32b31808SJens Wiklander * - versions_length (1 byte ) 68*32b31808SJens Wiklander * - versions (2 or 4 bytes) 69*32b31808SJens Wiklander */ 70*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_PTR(p, end, 5 + versions_len); 71*32b31808SJens Wiklander 72*32b31808SJens Wiklander MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS, p, 0); 73*32b31808SJens Wiklander MBEDTLS_PUT_UINT16_BE(versions_len + 1, p, 2); 74*32b31808SJens Wiklander p += 4; 75*32b31808SJens Wiklander 76*32b31808SJens Wiklander /* Length of versions */ 77*32b31808SJens Wiklander *p++ = versions_len; 78*32b31808SJens Wiklander 79*32b31808SJens Wiklander /* Write values of supported versions. 80*32b31808SJens Wiklander * They are defined by the configuration. 81*32b31808SJens Wiklander * Currently, we advertise only TLS 1.3 or both TLS 1.3 and TLS 1.2. 82*32b31808SJens Wiklander */ 83*32b31808SJens Wiklander mbedtls_ssl_write_version(p, MBEDTLS_SSL_TRANSPORT_STREAM, 84*32b31808SJens Wiklander MBEDTLS_SSL_VERSION_TLS1_3); 85*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("supported version: [3:4]")); 86*32b31808SJens Wiklander 87*32b31808SJens Wiklander 88*32b31808SJens Wiklander if (ssl->handshake->min_tls_version <= MBEDTLS_SSL_VERSION_TLS1_2) { 89*32b31808SJens Wiklander mbedtls_ssl_write_version(p + 2, MBEDTLS_SSL_TRANSPORT_STREAM, 90*32b31808SJens Wiklander MBEDTLS_SSL_VERSION_TLS1_2); 91*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("supported version: [3:3]")); 92*32b31808SJens Wiklander } 93*32b31808SJens Wiklander 94*32b31808SJens Wiklander *out_len = 5 + versions_len; 95*32b31808SJens Wiklander 96*32b31808SJens Wiklander mbedtls_ssl_tls13_set_hs_sent_ext_mask( 97*32b31808SJens Wiklander ssl, MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS); 98*32b31808SJens Wiklander 99*32b31808SJens Wiklander return 0; 100*32b31808SJens Wiklander } 101*32b31808SJens Wiklander 102*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 103*32b31808SJens Wiklander static int ssl_tls13_parse_supported_versions_ext(mbedtls_ssl_context *ssl, 104*32b31808SJens Wiklander const unsigned char *buf, 105*32b31808SJens Wiklander const unsigned char *end) 106*32b31808SJens Wiklander { 107*32b31808SJens Wiklander ((void) ssl); 108*32b31808SJens Wiklander 109*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(buf, end, 2); 110*32b31808SJens Wiklander if (mbedtls_ssl_read_version(buf, ssl->conf->transport) != 111*32b31808SJens Wiklander MBEDTLS_SSL_VERSION_TLS1_3) { 112*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("unexpected version")); 113*32b31808SJens Wiklander 114*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER, 115*32b31808SJens Wiklander MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER); 116*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER; 117*32b31808SJens Wiklander } 118*32b31808SJens Wiklander 119*32b31808SJens Wiklander if (&buf[2] != end) { 120*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("supported_versions ext data length incorrect")); 121*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR, 122*32b31808SJens Wiklander MBEDTLS_ERR_SSL_DECODE_ERROR); 123*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_DECODE_ERROR; 124*32b31808SJens Wiklander } 125*32b31808SJens Wiklander 126*32b31808SJens Wiklander return 0; 127*32b31808SJens Wiklander } 128*32b31808SJens Wiklander 129*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_ALPN) 130*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 131*32b31808SJens Wiklander static int ssl_tls13_parse_alpn_ext(mbedtls_ssl_context *ssl, 132*32b31808SJens Wiklander const unsigned char *buf, size_t len) 133*32b31808SJens Wiklander { 134*32b31808SJens Wiklander const unsigned char *p = buf; 135*32b31808SJens Wiklander const unsigned char *end = buf + len; 136*32b31808SJens Wiklander size_t protocol_name_list_len, protocol_name_len; 137*32b31808SJens Wiklander const unsigned char *protocol_name_list_end; 138*32b31808SJens Wiklander 139*32b31808SJens Wiklander /* If we didn't send it, the server shouldn't send it */ 140*32b31808SJens Wiklander if (ssl->conf->alpn_list == NULL) { 141*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; 142*32b31808SJens Wiklander } 143*32b31808SJens Wiklander 144*32b31808SJens Wiklander /* 145*32b31808SJens Wiklander * opaque ProtocolName<1..2^8-1>; 146*32b31808SJens Wiklander * 147*32b31808SJens Wiklander * struct { 148*32b31808SJens Wiklander * ProtocolName protocol_name_list<2..2^16-1> 149*32b31808SJens Wiklander * } ProtocolNameList; 150*32b31808SJens Wiklander * 151*32b31808SJens Wiklander * the "ProtocolNameList" MUST contain exactly one "ProtocolName" 152*32b31808SJens Wiklander */ 153*32b31808SJens Wiklander 154*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2); 155*32b31808SJens Wiklander protocol_name_list_len = MBEDTLS_GET_UINT16_BE(p, 0); 156*32b31808SJens Wiklander p += 2; 157*32b31808SJens Wiklander 158*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, protocol_name_list_len); 159*32b31808SJens Wiklander protocol_name_list_end = p + protocol_name_list_len; 160*32b31808SJens Wiklander 161*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, protocol_name_list_end, 1); 162*32b31808SJens Wiklander protocol_name_len = *p++; 163*32b31808SJens Wiklander 164*32b31808SJens Wiklander /* Check that the server chosen protocol was in our list and save it */ 165*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, protocol_name_list_end, protocol_name_len); 166*32b31808SJens Wiklander for (const char **alpn = ssl->conf->alpn_list; *alpn != NULL; alpn++) { 167*32b31808SJens Wiklander if (protocol_name_len == strlen(*alpn) && 168*32b31808SJens Wiklander memcmp(p, *alpn, protocol_name_len) == 0) { 169*32b31808SJens Wiklander ssl->alpn_chosen = *alpn; 170*32b31808SJens Wiklander return 0; 171*32b31808SJens Wiklander } 172*32b31808SJens Wiklander } 173*32b31808SJens Wiklander 174*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; 175*32b31808SJens Wiklander } 176*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_ALPN */ 177*32b31808SJens Wiklander 178*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 179*32b31808SJens Wiklander static int ssl_tls13_reset_key_share(mbedtls_ssl_context *ssl) 180*32b31808SJens Wiklander { 181*32b31808SJens Wiklander uint16_t group_id = ssl->handshake->offered_group_id; 182*32b31808SJens Wiklander 183*32b31808SJens Wiklander if (group_id == 0) { 184*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_INTERNAL_ERROR; 185*32b31808SJens Wiklander } 186*32b31808SJens Wiklander 187*32b31808SJens Wiklander #if defined(MBEDTLS_ECDH_C) 188*32b31808SJens Wiklander if (mbedtls_ssl_tls13_named_group_is_ecdhe(group_id)) { 189*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 190*32b31808SJens Wiklander psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; 191*32b31808SJens Wiklander 192*32b31808SJens Wiklander /* Destroy generated private key. */ 193*32b31808SJens Wiklander status = psa_destroy_key(ssl->handshake->ecdh_psa_privkey); 194*32b31808SJens Wiklander if (status != PSA_SUCCESS) { 195*32b31808SJens Wiklander ret = PSA_TO_MBEDTLS_ERR(status); 196*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret); 197*32b31808SJens Wiklander return ret; 198*32b31808SJens Wiklander } 199*32b31808SJens Wiklander 200*32b31808SJens Wiklander ssl->handshake->ecdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT; 201*32b31808SJens Wiklander return 0; 202*32b31808SJens Wiklander } else 203*32b31808SJens Wiklander #endif /* MBEDTLS_ECDH_C */ 204*32b31808SJens Wiklander if (0 /* other KEMs? */) { 205*32b31808SJens Wiklander /* Do something */ 206*32b31808SJens Wiklander } 207*32b31808SJens Wiklander 208*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_INTERNAL_ERROR; 209*32b31808SJens Wiklander } 210*32b31808SJens Wiklander 211*32b31808SJens Wiklander /* 212*32b31808SJens Wiklander * Functions for writing key_share extension. 213*32b31808SJens Wiklander */ 214*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED) 215*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 216*32b31808SJens Wiklander static int ssl_tls13_get_default_group_id(mbedtls_ssl_context *ssl, 217*32b31808SJens Wiklander uint16_t *group_id) 218*32b31808SJens Wiklander { 219*32b31808SJens Wiklander int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; 220*32b31808SJens Wiklander 221*32b31808SJens Wiklander 222*32b31808SJens Wiklander #if defined(MBEDTLS_ECDH_C) 223*32b31808SJens Wiklander const uint16_t *group_list = mbedtls_ssl_get_groups(ssl); 224*32b31808SJens Wiklander /* Pick first available ECDHE group compatible with TLS 1.3 */ 225*32b31808SJens Wiklander if (group_list == NULL) { 226*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_BAD_CONFIG; 227*32b31808SJens Wiklander } 228*32b31808SJens Wiklander 229*32b31808SJens Wiklander for (; *group_list != 0; group_list++) { 230*32b31808SJens Wiklander if ((mbedtls_ssl_get_psa_curve_info_from_tls_id(*group_list, 231*32b31808SJens Wiklander NULL, NULL) == PSA_SUCCESS) && 232*32b31808SJens Wiklander mbedtls_ssl_tls13_named_group_is_ecdhe(*group_list)) { 233*32b31808SJens Wiklander *group_id = *group_list; 234*32b31808SJens Wiklander return 0; 235*32b31808SJens Wiklander } 236*32b31808SJens Wiklander } 237*32b31808SJens Wiklander #else 238*32b31808SJens Wiklander ((void) ssl); 239*32b31808SJens Wiklander ((void) group_id); 240*32b31808SJens Wiklander #endif /* MBEDTLS_ECDH_C */ 241*32b31808SJens Wiklander 242*32b31808SJens Wiklander /* 243*32b31808SJens Wiklander * Add DHE named groups here. 244*32b31808SJens Wiklander * Pick first available DHE group compatible with TLS 1.3 245*32b31808SJens Wiklander */ 246*32b31808SJens Wiklander 247*32b31808SJens Wiklander return ret; 248*32b31808SJens Wiklander } 249*32b31808SJens Wiklander 250*32b31808SJens Wiklander /* 251*32b31808SJens Wiklander * ssl_tls13_write_key_share_ext 252*32b31808SJens Wiklander * 253*32b31808SJens Wiklander * Structure of key_share extension in ClientHello: 254*32b31808SJens Wiklander * 255*32b31808SJens Wiklander * struct { 256*32b31808SJens Wiklander * NamedGroup group; 257*32b31808SJens Wiklander * opaque key_exchange<1..2^16-1>; 258*32b31808SJens Wiklander * } KeyShareEntry; 259*32b31808SJens Wiklander * struct { 260*32b31808SJens Wiklander * KeyShareEntry client_shares<0..2^16-1>; 261*32b31808SJens Wiklander * } KeyShareClientHello; 262*32b31808SJens Wiklander */ 263*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 264*32b31808SJens Wiklander static int ssl_tls13_write_key_share_ext(mbedtls_ssl_context *ssl, 265*32b31808SJens Wiklander unsigned char *buf, 266*32b31808SJens Wiklander unsigned char *end, 267*32b31808SJens Wiklander size_t *out_len) 268*32b31808SJens Wiklander { 269*32b31808SJens Wiklander unsigned char *p = buf; 270*32b31808SJens Wiklander unsigned char *client_shares; /* Start of client_shares */ 271*32b31808SJens Wiklander size_t client_shares_len; /* Length of client_shares */ 272*32b31808SJens Wiklander uint16_t group_id; 273*32b31808SJens Wiklander int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; 274*32b31808SJens Wiklander 275*32b31808SJens Wiklander *out_len = 0; 276*32b31808SJens Wiklander 277*32b31808SJens Wiklander /* Check if we have space for header and length fields: 278*32b31808SJens Wiklander * - extension_type (2 bytes) 279*32b31808SJens Wiklander * - extension_data_length (2 bytes) 280*32b31808SJens Wiklander * - client_shares_length (2 bytes) 281*32b31808SJens Wiklander */ 282*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6); 283*32b31808SJens Wiklander p += 6; 284*32b31808SJens Wiklander 285*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("client hello: adding key share extension")); 286*32b31808SJens Wiklander 287*32b31808SJens Wiklander /* HRR could already have requested something else. */ 288*32b31808SJens Wiklander group_id = ssl->handshake->offered_group_id; 289*32b31808SJens Wiklander if (!mbedtls_ssl_tls13_named_group_is_ecdhe(group_id) && 290*32b31808SJens Wiklander !mbedtls_ssl_tls13_named_group_is_dhe(group_id)) { 291*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(ssl_tls13_get_default_group_id(ssl, 292*32b31808SJens Wiklander &group_id)); 293*32b31808SJens Wiklander } 294*32b31808SJens Wiklander 295*32b31808SJens Wiklander /* 296*32b31808SJens Wiklander * Dispatch to type-specific key generation function. 297*32b31808SJens Wiklander * 298*32b31808SJens Wiklander * So far, we're only supporting ECDHE. With the introduction 299*32b31808SJens Wiklander * of PQC KEMs, we'll want to have multiple branches, one per 300*32b31808SJens Wiklander * type of KEM, and dispatch to the corresponding crypto. And 301*32b31808SJens Wiklander * only one key share entry is allowed. 302*32b31808SJens Wiklander */ 303*32b31808SJens Wiklander client_shares = p; 304*32b31808SJens Wiklander #if defined(MBEDTLS_ECDH_C) 305*32b31808SJens Wiklander if (mbedtls_ssl_tls13_named_group_is_ecdhe(group_id)) { 306*32b31808SJens Wiklander /* Pointer to group */ 307*32b31808SJens Wiklander unsigned char *group = p; 308*32b31808SJens Wiklander /* Length of key_exchange */ 309*32b31808SJens Wiklander size_t key_exchange_len = 0; 310*32b31808SJens Wiklander 311*32b31808SJens Wiklander /* Check there is space for header of KeyShareEntry 312*32b31808SJens Wiklander * - group (2 bytes) 313*32b31808SJens Wiklander * - key_exchange_length (2 bytes) 314*32b31808SJens Wiklander */ 315*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4); 316*32b31808SJens Wiklander p += 4; 317*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_generate_and_write_ecdh_key_exchange( 318*32b31808SJens Wiklander ssl, group_id, p, end, &key_exchange_len); 319*32b31808SJens Wiklander p += key_exchange_len; 320*32b31808SJens Wiklander if (ret != 0) { 321*32b31808SJens Wiklander return ret; 322*32b31808SJens Wiklander } 323*32b31808SJens Wiklander 324*32b31808SJens Wiklander /* Write group */ 325*32b31808SJens Wiklander MBEDTLS_PUT_UINT16_BE(group_id, group, 0); 326*32b31808SJens Wiklander /* Write key_exchange_length */ 327*32b31808SJens Wiklander MBEDTLS_PUT_UINT16_BE(key_exchange_len, group, 2); 328*32b31808SJens Wiklander } else 329*32b31808SJens Wiklander #endif /* MBEDTLS_ECDH_C */ 330*32b31808SJens Wiklander if (0 /* other KEMs? */) { 331*32b31808SJens Wiklander /* Do something */ 332*32b31808SJens Wiklander } else { 333*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_INTERNAL_ERROR; 334*32b31808SJens Wiklander } 335*32b31808SJens Wiklander 336*32b31808SJens Wiklander /* Length of client_shares */ 337*32b31808SJens Wiklander client_shares_len = p - client_shares; 338*32b31808SJens Wiklander if (client_shares_len == 0) { 339*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("No key share defined.")); 340*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_INTERNAL_ERROR; 341*32b31808SJens Wiklander } 342*32b31808SJens Wiklander /* Write extension_type */ 343*32b31808SJens Wiklander MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_KEY_SHARE, buf, 0); 344*32b31808SJens Wiklander /* Write extension_data_length */ 345*32b31808SJens Wiklander MBEDTLS_PUT_UINT16_BE(client_shares_len + 2, buf, 2); 346*32b31808SJens Wiklander /* Write client_shares_length */ 347*32b31808SJens Wiklander MBEDTLS_PUT_UINT16_BE(client_shares_len, buf, 4); 348*32b31808SJens Wiklander 349*32b31808SJens Wiklander /* Update offered_group_id field */ 350*32b31808SJens Wiklander ssl->handshake->offered_group_id = group_id; 351*32b31808SJens Wiklander 352*32b31808SJens Wiklander /* Output the total length of key_share extension. */ 353*32b31808SJens Wiklander *out_len = p - buf; 354*32b31808SJens Wiklander 355*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "client hello, key_share extension", buf, *out_len); 356*32b31808SJens Wiklander 357*32b31808SJens Wiklander mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_KEY_SHARE); 358*32b31808SJens Wiklander 359*32b31808SJens Wiklander cleanup: 360*32b31808SJens Wiklander 361*32b31808SJens Wiklander return ret; 362*32b31808SJens Wiklander } 363*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */ 364*32b31808SJens Wiklander 365*32b31808SJens Wiklander /* 366*32b31808SJens Wiklander * ssl_tls13_parse_hrr_key_share_ext() 367*32b31808SJens Wiklander * Parse key_share extension in Hello Retry Request 368*32b31808SJens Wiklander * 369*32b31808SJens Wiklander * struct { 370*32b31808SJens Wiklander * NamedGroup selected_group; 371*32b31808SJens Wiklander * } KeyShareHelloRetryRequest; 372*32b31808SJens Wiklander */ 373*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 374*32b31808SJens Wiklander static int ssl_tls13_parse_hrr_key_share_ext(mbedtls_ssl_context *ssl, 375*32b31808SJens Wiklander const unsigned char *buf, 376*32b31808SJens Wiklander const unsigned char *end) 377*32b31808SJens Wiklander { 378*32b31808SJens Wiklander #if defined(MBEDTLS_ECDH_C) 379*32b31808SJens Wiklander const unsigned char *p = buf; 380*32b31808SJens Wiklander int selected_group; 381*32b31808SJens Wiklander int found = 0; 382*32b31808SJens Wiklander 383*32b31808SJens Wiklander const uint16_t *group_list = mbedtls_ssl_get_groups(ssl); 384*32b31808SJens Wiklander if (group_list == NULL) { 385*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_BAD_CONFIG; 386*32b31808SJens Wiklander } 387*32b31808SJens Wiklander 388*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "key_share extension", p, end - buf); 389*32b31808SJens Wiklander 390*32b31808SJens Wiklander /* Read selected_group */ 391*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2); 392*32b31808SJens Wiklander selected_group = MBEDTLS_GET_UINT16_BE(p, 0); 393*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("selected_group ( %d )", selected_group)); 394*32b31808SJens Wiklander 395*32b31808SJens Wiklander /* Upon receipt of this extension in a HelloRetryRequest, the client 396*32b31808SJens Wiklander * MUST first verify that the selected_group field corresponds to a 397*32b31808SJens Wiklander * group which was provided in the "supported_groups" extension in the 398*32b31808SJens Wiklander * original ClientHello. 399*32b31808SJens Wiklander * The supported_group was based on the info in ssl->conf->group_list. 400*32b31808SJens Wiklander * 401*32b31808SJens Wiklander * If the server provided a key share that was not sent in the ClientHello 402*32b31808SJens Wiklander * then the client MUST abort the handshake with an "illegal_parameter" alert. 403*32b31808SJens Wiklander */ 404*32b31808SJens Wiklander for (; *group_list != 0; group_list++) { 405*32b31808SJens Wiklander if ((mbedtls_ssl_get_psa_curve_info_from_tls_id(*group_list, 406*32b31808SJens Wiklander NULL, NULL) == PSA_ERROR_NOT_SUPPORTED) || 407*32b31808SJens Wiklander *group_list != selected_group) { 408*32b31808SJens Wiklander continue; 409*32b31808SJens Wiklander } 410*32b31808SJens Wiklander 411*32b31808SJens Wiklander /* We found a match */ 412*32b31808SJens Wiklander found = 1; 413*32b31808SJens Wiklander break; 414*32b31808SJens Wiklander } 415*32b31808SJens Wiklander 416*32b31808SJens Wiklander /* Client MUST verify that the selected_group field does not 417*32b31808SJens Wiklander * correspond to a group which was provided in the "key_share" 418*32b31808SJens Wiklander * extension in the original ClientHello. If the server sent an 419*32b31808SJens Wiklander * HRR message with a key share already provided in the 420*32b31808SJens Wiklander * ClientHello then the client MUST abort the handshake with 421*32b31808SJens Wiklander * an "illegal_parameter" alert. 422*32b31808SJens Wiklander */ 423*32b31808SJens Wiklander if (found == 0 || selected_group == ssl->handshake->offered_group_id) { 424*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid key share in HRR")); 425*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT( 426*32b31808SJens Wiklander MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER, 427*32b31808SJens Wiklander MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER); 428*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER; 429*32b31808SJens Wiklander } 430*32b31808SJens Wiklander 431*32b31808SJens Wiklander /* Remember server's preference for next ClientHello */ 432*32b31808SJens Wiklander ssl->handshake->offered_group_id = selected_group; 433*32b31808SJens Wiklander 434*32b31808SJens Wiklander return 0; 435*32b31808SJens Wiklander #else 436*32b31808SJens Wiklander (void) ssl; 437*32b31808SJens Wiklander (void) buf; 438*32b31808SJens Wiklander (void) end; 439*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_BAD_CONFIG; 440*32b31808SJens Wiklander #endif 441*32b31808SJens Wiklander } 442*32b31808SJens Wiklander 443*32b31808SJens Wiklander /* 444*32b31808SJens Wiklander * ssl_tls13_parse_key_share_ext() 445*32b31808SJens Wiklander * Parse key_share extension in Server Hello 446*32b31808SJens Wiklander * 447*32b31808SJens Wiklander * struct { 448*32b31808SJens Wiklander * KeyShareEntry server_share; 449*32b31808SJens Wiklander * } KeyShareServerHello; 450*32b31808SJens Wiklander * struct { 451*32b31808SJens Wiklander * NamedGroup group; 452*32b31808SJens Wiklander * opaque key_exchange<1..2^16-1>; 453*32b31808SJens Wiklander * } KeyShareEntry; 454*32b31808SJens Wiklander */ 455*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 456*32b31808SJens Wiklander static int ssl_tls13_parse_key_share_ext(mbedtls_ssl_context *ssl, 457*32b31808SJens Wiklander const unsigned char *buf, 458*32b31808SJens Wiklander const unsigned char *end) 459*32b31808SJens Wiklander { 460*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 461*32b31808SJens Wiklander const unsigned char *p = buf; 462*32b31808SJens Wiklander uint16_t group, offered_group; 463*32b31808SJens Wiklander 464*32b31808SJens Wiklander /* ... 465*32b31808SJens Wiklander * NamedGroup group; (2 bytes) 466*32b31808SJens Wiklander * ... 467*32b31808SJens Wiklander */ 468*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2); 469*32b31808SJens Wiklander group = MBEDTLS_GET_UINT16_BE(p, 0); 470*32b31808SJens Wiklander p += 2; 471*32b31808SJens Wiklander 472*32b31808SJens Wiklander /* Check that the chosen group matches the one we offered. */ 473*32b31808SJens Wiklander offered_group = ssl->handshake->offered_group_id; 474*32b31808SJens Wiklander if (offered_group != group) { 475*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, 476*32b31808SJens Wiklander ("Invalid server key share, our group %u, their group %u", 477*32b31808SJens Wiklander (unsigned) offered_group, (unsigned) group)); 478*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE, 479*32b31808SJens Wiklander MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE); 480*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE; 481*32b31808SJens Wiklander } 482*32b31808SJens Wiklander 483*32b31808SJens Wiklander #if defined(MBEDTLS_ECDH_C) 484*32b31808SJens Wiklander if (mbedtls_ssl_tls13_named_group_is_ecdhe(group)) { 485*32b31808SJens Wiklander if (mbedtls_ssl_get_psa_curve_info_from_tls_id(group, NULL, NULL) 486*32b31808SJens Wiklander == PSA_ERROR_NOT_SUPPORTED) { 487*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid TLS curve group id")); 488*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_INTERNAL_ERROR; 489*32b31808SJens Wiklander } 490*32b31808SJens Wiklander 491*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, ("ECDH curve: %s", 492*32b31808SJens Wiklander mbedtls_ssl_get_curve_name_from_tls_id(group))); 493*32b31808SJens Wiklander 494*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_read_public_ecdhe_share(ssl, p, end - p); 495*32b31808SJens Wiklander if (ret != 0) { 496*32b31808SJens Wiklander return ret; 497*32b31808SJens Wiklander } 498*32b31808SJens Wiklander } else 499*32b31808SJens Wiklander #endif /* MBEDTLS_ECDH_C */ 500*32b31808SJens Wiklander if (0 /* other KEMs? */) { 501*32b31808SJens Wiklander /* Do something */ 502*32b31808SJens Wiklander } else { 503*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_INTERNAL_ERROR; 504*32b31808SJens Wiklander } 505*32b31808SJens Wiklander 506*32b31808SJens Wiklander return ret; 507*32b31808SJens Wiklander } 508*32b31808SJens Wiklander 509*32b31808SJens Wiklander /* 510*32b31808SJens Wiklander * ssl_tls13_parse_cookie_ext() 511*32b31808SJens Wiklander * Parse cookie extension in Hello Retry Request 512*32b31808SJens Wiklander * 513*32b31808SJens Wiklander * struct { 514*32b31808SJens Wiklander * opaque cookie<1..2^16-1>; 515*32b31808SJens Wiklander * } Cookie; 516*32b31808SJens Wiklander * 517*32b31808SJens Wiklander * When sending a HelloRetryRequest, the server MAY provide a "cookie" 518*32b31808SJens Wiklander * extension to the client (this is an exception to the usual rule that 519*32b31808SJens Wiklander * the only extensions that may be sent are those that appear in the 520*32b31808SJens Wiklander * ClientHello). When sending the new ClientHello, the client MUST copy 521*32b31808SJens Wiklander * the contents of the extension received in the HelloRetryRequest into 522*32b31808SJens Wiklander * a "cookie" extension in the new ClientHello. Clients MUST NOT use 523*32b31808SJens Wiklander * cookies in their initial ClientHello in subsequent connections. 524*32b31808SJens Wiklander */ 525*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 526*32b31808SJens Wiklander static int ssl_tls13_parse_cookie_ext(mbedtls_ssl_context *ssl, 527*32b31808SJens Wiklander const unsigned char *buf, 528*32b31808SJens Wiklander const unsigned char *end) 529*32b31808SJens Wiklander { 530*32b31808SJens Wiklander uint16_t cookie_len; 531*32b31808SJens Wiklander const unsigned char *p = buf; 532*32b31808SJens Wiklander mbedtls_ssl_handshake_params *handshake = ssl->handshake; 533*32b31808SJens Wiklander 534*32b31808SJens Wiklander /* Retrieve length field of cookie */ 535*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2); 536*32b31808SJens Wiklander cookie_len = MBEDTLS_GET_UINT16_BE(p, 0); 537*32b31808SJens Wiklander p += 2; 538*32b31808SJens Wiklander 539*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, cookie_len); 540*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "cookie extension", p, cookie_len); 541*32b31808SJens Wiklander 542*32b31808SJens Wiklander mbedtls_free(handshake->cookie); 543*32b31808SJens Wiklander handshake->cookie_len = 0; 544*32b31808SJens Wiklander handshake->cookie = mbedtls_calloc(1, cookie_len); 545*32b31808SJens Wiklander if (handshake->cookie == NULL) { 546*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, 547*32b31808SJens Wiklander ("alloc failed ( %ud bytes )", 548*32b31808SJens Wiklander cookie_len)); 549*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_ALLOC_FAILED; 550*32b31808SJens Wiklander } 551*32b31808SJens Wiklander 552*32b31808SJens Wiklander memcpy(handshake->cookie, p, cookie_len); 553*32b31808SJens Wiklander handshake->cookie_len = cookie_len; 554*32b31808SJens Wiklander 555*32b31808SJens Wiklander return 0; 556*32b31808SJens Wiklander } 557*32b31808SJens Wiklander 558*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 559*32b31808SJens Wiklander static int ssl_tls13_write_cookie_ext(mbedtls_ssl_context *ssl, 560*32b31808SJens Wiklander unsigned char *buf, 561*32b31808SJens Wiklander unsigned char *end, 562*32b31808SJens Wiklander size_t *out_len) 563*32b31808SJens Wiklander { 564*32b31808SJens Wiklander unsigned char *p = buf; 565*32b31808SJens Wiklander *out_len = 0; 566*32b31808SJens Wiklander mbedtls_ssl_handshake_params *handshake = ssl->handshake; 567*32b31808SJens Wiklander 568*32b31808SJens Wiklander if (handshake->cookie == NULL) { 569*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("no cookie to send; skip extension")); 570*32b31808SJens Wiklander return 0; 571*32b31808SJens Wiklander } 572*32b31808SJens Wiklander 573*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie", 574*32b31808SJens Wiklander handshake->cookie, 575*32b31808SJens Wiklander handshake->cookie_len); 576*32b31808SJens Wiklander 577*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_PTR(p, end, handshake->cookie_len + 6); 578*32b31808SJens Wiklander 579*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding cookie extension")); 580*32b31808SJens Wiklander 581*32b31808SJens Wiklander MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_COOKIE, p, 0); 582*32b31808SJens Wiklander MBEDTLS_PUT_UINT16_BE(handshake->cookie_len + 2, p, 2); 583*32b31808SJens Wiklander MBEDTLS_PUT_UINT16_BE(handshake->cookie_len, p, 4); 584*32b31808SJens Wiklander p += 6; 585*32b31808SJens Wiklander 586*32b31808SJens Wiklander /* Cookie */ 587*32b31808SJens Wiklander memcpy(p, handshake->cookie, handshake->cookie_len); 588*32b31808SJens Wiklander 589*32b31808SJens Wiklander *out_len = handshake->cookie_len + 6; 590*32b31808SJens Wiklander 591*32b31808SJens Wiklander mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_COOKIE); 592*32b31808SJens Wiklander 593*32b31808SJens Wiklander return 0; 594*32b31808SJens Wiklander } 595*32b31808SJens Wiklander 596*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED) 597*32b31808SJens Wiklander /* 598*32b31808SJens Wiklander * ssl_tls13_write_psk_key_exchange_modes_ext() structure: 599*32b31808SJens Wiklander * 600*32b31808SJens Wiklander * enum { psk_ke( 0 ), psk_dhe_ke( 1 ), ( 255 ) } PskKeyExchangeMode; 601*32b31808SJens Wiklander * 602*32b31808SJens Wiklander * struct { 603*32b31808SJens Wiklander * PskKeyExchangeMode ke_modes<1..255>; 604*32b31808SJens Wiklander * } PskKeyExchangeModes; 605*32b31808SJens Wiklander */ 606*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 607*32b31808SJens Wiklander static int ssl_tls13_write_psk_key_exchange_modes_ext(mbedtls_ssl_context *ssl, 608*32b31808SJens Wiklander unsigned char *buf, 609*32b31808SJens Wiklander unsigned char *end, 610*32b31808SJens Wiklander size_t *out_len) 611*32b31808SJens Wiklander { 612*32b31808SJens Wiklander unsigned char *p = buf; 613*32b31808SJens Wiklander int ke_modes_len = 0; 614*32b31808SJens Wiklander 615*32b31808SJens Wiklander ((void) ke_modes_len); 616*32b31808SJens Wiklander *out_len = 0; 617*32b31808SJens Wiklander 618*32b31808SJens Wiklander /* Skip writing extension if no PSK key exchange mode 619*32b31808SJens Wiklander * is enabled in the config. 620*32b31808SJens Wiklander */ 621*32b31808SJens Wiklander if (!mbedtls_ssl_conf_tls13_some_psk_enabled(ssl)) { 622*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("skip psk_key_exchange_modes extension")); 623*32b31808SJens Wiklander return 0; 624*32b31808SJens Wiklander } 625*32b31808SJens Wiklander 626*32b31808SJens Wiklander /* Require 7 bytes of data, otherwise fail, 627*32b31808SJens Wiklander * even if extension might be shorter. 628*32b31808SJens Wiklander */ 629*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_PTR(p, end, 7); 630*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG( 631*32b31808SJens Wiklander 3, ("client hello, adding psk_key_exchange_modes extension")); 632*32b31808SJens Wiklander 633*32b31808SJens Wiklander MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_PSK_KEY_EXCHANGE_MODES, p, 0); 634*32b31808SJens Wiklander 635*32b31808SJens Wiklander /* Skip extension length (2 bytes) and 636*32b31808SJens Wiklander * ke_modes length (1 byte) for now. 637*32b31808SJens Wiklander */ 638*32b31808SJens Wiklander p += 5; 639*32b31808SJens Wiklander 640*32b31808SJens Wiklander if (mbedtls_ssl_conf_tls13_psk_ephemeral_enabled(ssl)) { 641*32b31808SJens Wiklander *p++ = MBEDTLS_SSL_TLS1_3_PSK_MODE_ECDHE; 642*32b31808SJens Wiklander ke_modes_len++; 643*32b31808SJens Wiklander 644*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(4, ("Adding PSK-ECDHE key exchange mode")); 645*32b31808SJens Wiklander } 646*32b31808SJens Wiklander 647*32b31808SJens Wiklander if (mbedtls_ssl_conf_tls13_psk_enabled(ssl)) { 648*32b31808SJens Wiklander *p++ = MBEDTLS_SSL_TLS1_3_PSK_MODE_PURE; 649*32b31808SJens Wiklander ke_modes_len++; 650*32b31808SJens Wiklander 651*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(4, ("Adding pure PSK key exchange mode")); 652*32b31808SJens Wiklander } 653*32b31808SJens Wiklander 654*32b31808SJens Wiklander /* Now write the extension and ke_modes length */ 655*32b31808SJens Wiklander MBEDTLS_PUT_UINT16_BE(ke_modes_len + 1, buf, 2); 656*32b31808SJens Wiklander buf[4] = ke_modes_len; 657*32b31808SJens Wiklander 658*32b31808SJens Wiklander *out_len = p - buf; 659*32b31808SJens Wiklander 660*32b31808SJens Wiklander mbedtls_ssl_tls13_set_hs_sent_ext_mask( 661*32b31808SJens Wiklander ssl, MBEDTLS_TLS_EXT_PSK_KEY_EXCHANGE_MODES); 662*32b31808SJens Wiklander 663*32b31808SJens Wiklander return 0; 664*32b31808SJens Wiklander } 665*32b31808SJens Wiklander 666*32b31808SJens Wiklander static psa_algorithm_t ssl_tls13_get_ciphersuite_hash_alg(int ciphersuite) 667*32b31808SJens Wiklander { 668*32b31808SJens Wiklander const mbedtls_ssl_ciphersuite_t *ciphersuite_info = NULL; 669*32b31808SJens Wiklander ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(ciphersuite); 670*32b31808SJens Wiklander 671*32b31808SJens Wiklander if (ciphersuite_info != NULL) { 672*32b31808SJens Wiklander return mbedtls_psa_translate_md(ciphersuite_info->mac); 673*32b31808SJens Wiklander } 674*32b31808SJens Wiklander 675*32b31808SJens Wiklander return PSA_ALG_NONE; 676*32b31808SJens Wiklander } 677*32b31808SJens Wiklander 678*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_SESSION_TICKETS) 679*32b31808SJens Wiklander static int ssl_tls13_has_configured_ticket(mbedtls_ssl_context *ssl) 680*32b31808SJens Wiklander { 681*32b31808SJens Wiklander mbedtls_ssl_session *session = ssl->session_negotiate; 682*32b31808SJens Wiklander return ssl->handshake->resume && 683*32b31808SJens Wiklander session != NULL && session->ticket != NULL && 684*32b31808SJens Wiklander mbedtls_ssl_conf_tls13_check_kex_modes( 685*32b31808SJens Wiklander ssl, mbedtls_ssl_session_get_ticket_flags( 686*32b31808SJens Wiklander session, MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ALL)); 687*32b31808SJens Wiklander } 688*32b31808SJens Wiklander 689*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_EARLY_DATA) 690*32b31808SJens Wiklander static int ssl_tls13_early_data_has_valid_ticket(mbedtls_ssl_context *ssl) 691*32b31808SJens Wiklander { 692*32b31808SJens Wiklander mbedtls_ssl_session *session = ssl->session_negotiate; 693*32b31808SJens Wiklander return ssl->handshake->resume && 694*32b31808SJens Wiklander session->tls_version == MBEDTLS_SSL_VERSION_TLS1_3 && 695*32b31808SJens Wiklander (session->ticket_flags & 696*32b31808SJens Wiklander MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA) && 697*32b31808SJens Wiklander mbedtls_ssl_tls13_cipher_suite_is_offered( 698*32b31808SJens Wiklander ssl, session->ciphersuite); 699*32b31808SJens Wiklander } 700*32b31808SJens Wiklander #endif 701*32b31808SJens Wiklander 702*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 703*32b31808SJens Wiklander static int ssl_tls13_ticket_get_identity(mbedtls_ssl_context *ssl, 704*32b31808SJens Wiklander psa_algorithm_t *hash_alg, 705*32b31808SJens Wiklander const unsigned char **identity, 706*32b31808SJens Wiklander size_t *identity_len) 707*32b31808SJens Wiklander { 708*32b31808SJens Wiklander mbedtls_ssl_session *session = ssl->session_negotiate; 709*32b31808SJens Wiklander 710*32b31808SJens Wiklander if (!ssl_tls13_has_configured_ticket(ssl)) { 711*32b31808SJens Wiklander return -1; 712*32b31808SJens Wiklander } 713*32b31808SJens Wiklander 714*32b31808SJens Wiklander *hash_alg = ssl_tls13_get_ciphersuite_hash_alg(session->ciphersuite); 715*32b31808SJens Wiklander *identity = session->ticket; 716*32b31808SJens Wiklander *identity_len = session->ticket_len; 717*32b31808SJens Wiklander return 0; 718*32b31808SJens Wiklander } 719*32b31808SJens Wiklander 720*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 721*32b31808SJens Wiklander static int ssl_tls13_ticket_get_psk(mbedtls_ssl_context *ssl, 722*32b31808SJens Wiklander psa_algorithm_t *hash_alg, 723*32b31808SJens Wiklander const unsigned char **psk, 724*32b31808SJens Wiklander size_t *psk_len) 725*32b31808SJens Wiklander { 726*32b31808SJens Wiklander 727*32b31808SJens Wiklander mbedtls_ssl_session *session = ssl->session_negotiate; 728*32b31808SJens Wiklander 729*32b31808SJens Wiklander if (!ssl_tls13_has_configured_ticket(ssl)) { 730*32b31808SJens Wiklander return -1; 731*32b31808SJens Wiklander } 732*32b31808SJens Wiklander 733*32b31808SJens Wiklander *hash_alg = ssl_tls13_get_ciphersuite_hash_alg(session->ciphersuite); 734*32b31808SJens Wiklander *psk = session->resumption_key; 735*32b31808SJens Wiklander *psk_len = session->resumption_key_len; 736*32b31808SJens Wiklander 737*32b31808SJens Wiklander return 0; 738*32b31808SJens Wiklander } 739*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_SESSION_TICKETS */ 740*32b31808SJens Wiklander 741*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 742*32b31808SJens Wiklander static int ssl_tls13_psk_get_identity(mbedtls_ssl_context *ssl, 743*32b31808SJens Wiklander psa_algorithm_t *hash_alg, 744*32b31808SJens Wiklander const unsigned char **identity, 745*32b31808SJens Wiklander size_t *identity_len) 746*32b31808SJens Wiklander { 747*32b31808SJens Wiklander 748*32b31808SJens Wiklander if (!mbedtls_ssl_conf_has_static_psk(ssl->conf)) { 749*32b31808SJens Wiklander return -1; 750*32b31808SJens Wiklander } 751*32b31808SJens Wiklander 752*32b31808SJens Wiklander *hash_alg = PSA_ALG_SHA_256; 753*32b31808SJens Wiklander *identity = ssl->conf->psk_identity; 754*32b31808SJens Wiklander *identity_len = ssl->conf->psk_identity_len; 755*32b31808SJens Wiklander return 0; 756*32b31808SJens Wiklander } 757*32b31808SJens Wiklander 758*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 759*32b31808SJens Wiklander static int ssl_tls13_psk_get_psk(mbedtls_ssl_context *ssl, 760*32b31808SJens Wiklander psa_algorithm_t *hash_alg, 761*32b31808SJens Wiklander const unsigned char **psk, 762*32b31808SJens Wiklander size_t *psk_len) 763*32b31808SJens Wiklander { 764*32b31808SJens Wiklander 765*32b31808SJens Wiklander if (!mbedtls_ssl_conf_has_static_psk(ssl->conf)) { 766*32b31808SJens Wiklander return -1; 767*32b31808SJens Wiklander } 768*32b31808SJens Wiklander 769*32b31808SJens Wiklander *hash_alg = PSA_ALG_SHA_256; 770*32b31808SJens Wiklander *psk = ssl->conf->psk; 771*32b31808SJens Wiklander *psk_len = ssl->conf->psk_len; 772*32b31808SJens Wiklander return 0; 773*32b31808SJens Wiklander } 774*32b31808SJens Wiklander 775*32b31808SJens Wiklander static int ssl_tls13_get_configured_psk_count(mbedtls_ssl_context *ssl) 776*32b31808SJens Wiklander { 777*32b31808SJens Wiklander int configured_psk_count = 0; 778*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_SESSION_TICKETS) 779*32b31808SJens Wiklander if (ssl_tls13_has_configured_ticket(ssl)) { 780*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("Ticket is configured")); 781*32b31808SJens Wiklander configured_psk_count++; 782*32b31808SJens Wiklander } 783*32b31808SJens Wiklander #endif 784*32b31808SJens Wiklander if (mbedtls_ssl_conf_has_static_psk(ssl->conf)) { 785*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("PSK is configured")); 786*32b31808SJens Wiklander configured_psk_count++; 787*32b31808SJens Wiklander } 788*32b31808SJens Wiklander return configured_psk_count; 789*32b31808SJens Wiklander } 790*32b31808SJens Wiklander 791*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 792*32b31808SJens Wiklander static int ssl_tls13_write_identity(mbedtls_ssl_context *ssl, 793*32b31808SJens Wiklander unsigned char *buf, 794*32b31808SJens Wiklander unsigned char *end, 795*32b31808SJens Wiklander const unsigned char *identity, 796*32b31808SJens Wiklander size_t identity_len, 797*32b31808SJens Wiklander uint32_t obfuscated_ticket_age, 798*32b31808SJens Wiklander size_t *out_len) 799*32b31808SJens Wiklander { 800*32b31808SJens Wiklander ((void) ssl); 801*32b31808SJens Wiklander *out_len = 0; 802*32b31808SJens Wiklander 803*32b31808SJens Wiklander /* 804*32b31808SJens Wiklander * - identity_len (2 bytes) 805*32b31808SJens Wiklander * - identity (psk_identity_len bytes) 806*32b31808SJens Wiklander * - obfuscated_ticket_age (4 bytes) 807*32b31808SJens Wiklander */ 808*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_PTR(buf, end, 6 + identity_len); 809*32b31808SJens Wiklander 810*32b31808SJens Wiklander MBEDTLS_PUT_UINT16_BE(identity_len, buf, 0); 811*32b31808SJens Wiklander memcpy(buf + 2, identity, identity_len); 812*32b31808SJens Wiklander MBEDTLS_PUT_UINT32_BE(obfuscated_ticket_age, buf, 2 + identity_len); 813*32b31808SJens Wiklander 814*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(4, "write identity", buf, 6 + identity_len); 815*32b31808SJens Wiklander 816*32b31808SJens Wiklander *out_len = 6 + identity_len; 817*32b31808SJens Wiklander 818*32b31808SJens Wiklander return 0; 819*32b31808SJens Wiklander } 820*32b31808SJens Wiklander 821*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 822*32b31808SJens Wiklander static int ssl_tls13_write_binder(mbedtls_ssl_context *ssl, 823*32b31808SJens Wiklander unsigned char *buf, 824*32b31808SJens Wiklander unsigned char *end, 825*32b31808SJens Wiklander int psk_type, 826*32b31808SJens Wiklander psa_algorithm_t hash_alg, 827*32b31808SJens Wiklander const unsigned char *psk, 828*32b31808SJens Wiklander size_t psk_len, 829*32b31808SJens Wiklander size_t *out_len) 830*32b31808SJens Wiklander { 831*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 832*32b31808SJens Wiklander unsigned char binder_len; 833*32b31808SJens Wiklander unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE]; 834*32b31808SJens Wiklander size_t transcript_len = 0; 835*32b31808SJens Wiklander 836*32b31808SJens Wiklander *out_len = 0; 837*32b31808SJens Wiklander 838*32b31808SJens Wiklander binder_len = PSA_HASH_LENGTH(hash_alg); 839*32b31808SJens Wiklander 840*32b31808SJens Wiklander /* 841*32b31808SJens Wiklander * - binder_len (1 bytes) 842*32b31808SJens Wiklander * - binder (binder_len bytes) 843*32b31808SJens Wiklander */ 844*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_PTR(buf, end, 1 + binder_len); 845*32b31808SJens Wiklander 846*32b31808SJens Wiklander buf[0] = binder_len; 847*32b31808SJens Wiklander 848*32b31808SJens Wiklander /* Get current state of handshake transcript. */ 849*32b31808SJens Wiklander ret = mbedtls_ssl_get_handshake_transcript( 850*32b31808SJens Wiklander ssl, mbedtls_hash_info_md_from_psa(hash_alg), 851*32b31808SJens Wiklander transcript, sizeof(transcript), &transcript_len); 852*32b31808SJens Wiklander if (ret != 0) { 853*32b31808SJens Wiklander return ret; 854*32b31808SJens Wiklander } 855*32b31808SJens Wiklander 856*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_create_psk_binder(ssl, hash_alg, 857*32b31808SJens Wiklander psk, psk_len, psk_type, 858*32b31808SJens Wiklander transcript, buf + 1); 859*32b31808SJens Wiklander if (ret != 0) { 860*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_create_psk_binder", ret); 861*32b31808SJens Wiklander return ret; 862*32b31808SJens Wiklander } 863*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(4, "write binder", buf, 1 + binder_len); 864*32b31808SJens Wiklander 865*32b31808SJens Wiklander *out_len = 1 + binder_len; 866*32b31808SJens Wiklander 867*32b31808SJens Wiklander return 0; 868*32b31808SJens Wiklander } 869*32b31808SJens Wiklander 870*32b31808SJens Wiklander /* 871*32b31808SJens Wiklander * mbedtls_ssl_tls13_write_identities_of_pre_shared_key_ext() structure: 872*32b31808SJens Wiklander * 873*32b31808SJens Wiklander * struct { 874*32b31808SJens Wiklander * opaque identity<1..2^16-1>; 875*32b31808SJens Wiklander * uint32 obfuscated_ticket_age; 876*32b31808SJens Wiklander * } PskIdentity; 877*32b31808SJens Wiklander * 878*32b31808SJens Wiklander * opaque PskBinderEntry<32..255>; 879*32b31808SJens Wiklander * 880*32b31808SJens Wiklander * struct { 881*32b31808SJens Wiklander * PskIdentity identities<7..2^16-1>; 882*32b31808SJens Wiklander * PskBinderEntry binders<33..2^16-1>; 883*32b31808SJens Wiklander * } OfferedPsks; 884*32b31808SJens Wiklander * 885*32b31808SJens Wiklander * struct { 886*32b31808SJens Wiklander * select (Handshake.msg_type) { 887*32b31808SJens Wiklander * case client_hello: OfferedPsks; 888*32b31808SJens Wiklander * ... 889*32b31808SJens Wiklander * }; 890*32b31808SJens Wiklander * } PreSharedKeyExtension; 891*32b31808SJens Wiklander * 892*32b31808SJens Wiklander */ 893*32b31808SJens Wiklander int mbedtls_ssl_tls13_write_identities_of_pre_shared_key_ext( 894*32b31808SJens Wiklander mbedtls_ssl_context *ssl, unsigned char *buf, unsigned char *end, 895*32b31808SJens Wiklander size_t *out_len, size_t *binders_len) 896*32b31808SJens Wiklander { 897*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 898*32b31808SJens Wiklander int configured_psk_count = 0; 899*32b31808SJens Wiklander unsigned char *p = buf; 900*32b31808SJens Wiklander psa_algorithm_t hash_alg = PSA_ALG_NONE; 901*32b31808SJens Wiklander const unsigned char *identity; 902*32b31808SJens Wiklander size_t identity_len; 903*32b31808SJens Wiklander size_t l_binders_len = 0; 904*32b31808SJens Wiklander size_t output_len; 905*32b31808SJens Wiklander 906*32b31808SJens Wiklander *out_len = 0; 907*32b31808SJens Wiklander *binders_len = 0; 908*32b31808SJens Wiklander 909*32b31808SJens Wiklander /* Check if we have any PSKs to offer. If no, skip pre_shared_key */ 910*32b31808SJens Wiklander configured_psk_count = ssl_tls13_get_configured_psk_count(ssl); 911*32b31808SJens Wiklander if (configured_psk_count == 0) { 912*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("skip pre_shared_key extensions")); 913*32b31808SJens Wiklander return 0; 914*32b31808SJens Wiklander } 915*32b31808SJens Wiklander 916*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(4, ("Pre-configured PSK number = %d", 917*32b31808SJens Wiklander configured_psk_count)); 918*32b31808SJens Wiklander 919*32b31808SJens Wiklander /* Check if we have space to write the extension, binders included. 920*32b31808SJens Wiklander * - extension_type (2 bytes) 921*32b31808SJens Wiklander * - extension_data_len (2 bytes) 922*32b31808SJens Wiklander * - identities_len (2 bytes) 923*32b31808SJens Wiklander */ 924*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6); 925*32b31808SJens Wiklander p += 6; 926*32b31808SJens Wiklander 927*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_SESSION_TICKETS) 928*32b31808SJens Wiklander if (ssl_tls13_ticket_get_identity( 929*32b31808SJens Wiklander ssl, &hash_alg, &identity, &identity_len) == 0) { 930*32b31808SJens Wiklander #if defined(MBEDTLS_HAVE_TIME) 931*32b31808SJens Wiklander mbedtls_time_t now = mbedtls_time(NULL); 932*32b31808SJens Wiklander mbedtls_ssl_session *session = ssl->session_negotiate; 933*32b31808SJens Wiklander uint32_t obfuscated_ticket_age = 934*32b31808SJens Wiklander (uint32_t) (now - session->ticket_received); 935*32b31808SJens Wiklander 936*32b31808SJens Wiklander /* 937*32b31808SJens Wiklander * The ticket timestamp is in seconds but the ticket age is in 938*32b31808SJens Wiklander * milliseconds. If the ticket was received at the end of a second and 939*32b31808SJens Wiklander * re-used here just at the beginning of the next second, the computed 940*32b31808SJens Wiklander * age `now - session->ticket_received` is equal to 1s thus 1000 ms 941*32b31808SJens Wiklander * while the actual age could be just a few milliseconds or tens of 942*32b31808SJens Wiklander * milliseconds. If the server has more accurate ticket timestamps 943*32b31808SJens Wiklander * (typically timestamps in milliseconds), as part of the processing of 944*32b31808SJens Wiklander * the ClientHello, it may compute a ticket lifetime smaller than the 945*32b31808SJens Wiklander * one computed here and potentially reject the ticket. To avoid that, 946*32b31808SJens Wiklander * remove one second to the ticket age if possible. 947*32b31808SJens Wiklander */ 948*32b31808SJens Wiklander if (obfuscated_ticket_age > 0) { 949*32b31808SJens Wiklander obfuscated_ticket_age -= 1; 950*32b31808SJens Wiklander } 951*32b31808SJens Wiklander 952*32b31808SJens Wiklander obfuscated_ticket_age *= 1000; 953*32b31808SJens Wiklander obfuscated_ticket_age += session->ticket_age_add; 954*32b31808SJens Wiklander 955*32b31808SJens Wiklander ret = ssl_tls13_write_identity(ssl, p, end, 956*32b31808SJens Wiklander identity, identity_len, 957*32b31808SJens Wiklander obfuscated_ticket_age, 958*32b31808SJens Wiklander &output_len); 959*32b31808SJens Wiklander #else 960*32b31808SJens Wiklander ret = ssl_tls13_write_identity(ssl, p, end, identity, identity_len, 961*32b31808SJens Wiklander 0, &output_len); 962*32b31808SJens Wiklander #endif /* MBEDTLS_HAVE_TIME */ 963*32b31808SJens Wiklander if (ret != 0) { 964*32b31808SJens Wiklander return ret; 965*32b31808SJens Wiklander } 966*32b31808SJens Wiklander 967*32b31808SJens Wiklander p += output_len; 968*32b31808SJens Wiklander l_binders_len += 1 + PSA_HASH_LENGTH(hash_alg); 969*32b31808SJens Wiklander } 970*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_SESSION_TICKETS */ 971*32b31808SJens Wiklander 972*32b31808SJens Wiklander if (ssl_tls13_psk_get_identity( 973*32b31808SJens Wiklander ssl, &hash_alg, &identity, &identity_len) == 0) { 974*32b31808SJens Wiklander 975*32b31808SJens Wiklander ret = ssl_tls13_write_identity(ssl, p, end, identity, identity_len, 0, 976*32b31808SJens Wiklander &output_len); 977*32b31808SJens Wiklander if (ret != 0) { 978*32b31808SJens Wiklander return ret; 979*32b31808SJens Wiklander } 980*32b31808SJens Wiklander 981*32b31808SJens Wiklander p += output_len; 982*32b31808SJens Wiklander l_binders_len += 1 + PSA_HASH_LENGTH(hash_alg); 983*32b31808SJens Wiklander } 984*32b31808SJens Wiklander 985*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, 986*32b31808SJens Wiklander ("client hello, adding pre_shared_key extension, " 987*32b31808SJens Wiklander "omitting PSK binder list")); 988*32b31808SJens Wiklander 989*32b31808SJens Wiklander /* Take into account the two bytes for the length of the binders. */ 990*32b31808SJens Wiklander l_binders_len += 2; 991*32b31808SJens Wiklander /* Check if there is enough space for binders */ 992*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_PTR(p, end, l_binders_len); 993*32b31808SJens Wiklander 994*32b31808SJens Wiklander /* 995*32b31808SJens Wiklander * - extension_type (2 bytes) 996*32b31808SJens Wiklander * - extension_data_len (2 bytes) 997*32b31808SJens Wiklander * - identities_len (2 bytes) 998*32b31808SJens Wiklander */ 999*32b31808SJens Wiklander MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_PRE_SHARED_KEY, buf, 0); 1000*32b31808SJens Wiklander MBEDTLS_PUT_UINT16_BE(p - buf - 4 + l_binders_len, buf, 2); 1001*32b31808SJens Wiklander MBEDTLS_PUT_UINT16_BE(p - buf - 6, buf, 4); 1002*32b31808SJens Wiklander 1003*32b31808SJens Wiklander *out_len = (p - buf) + l_binders_len; 1004*32b31808SJens Wiklander *binders_len = l_binders_len; 1005*32b31808SJens Wiklander 1006*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "pre_shared_key identities", buf, p - buf); 1007*32b31808SJens Wiklander 1008*32b31808SJens Wiklander return 0; 1009*32b31808SJens Wiklander } 1010*32b31808SJens Wiklander 1011*32b31808SJens Wiklander int mbedtls_ssl_tls13_write_binders_of_pre_shared_key_ext( 1012*32b31808SJens Wiklander mbedtls_ssl_context *ssl, unsigned char *buf, unsigned char *end) 1013*32b31808SJens Wiklander { 1014*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 1015*32b31808SJens Wiklander unsigned char *p = buf; 1016*32b31808SJens Wiklander psa_algorithm_t hash_alg = PSA_ALG_NONE; 1017*32b31808SJens Wiklander const unsigned char *psk; 1018*32b31808SJens Wiklander size_t psk_len; 1019*32b31808SJens Wiklander size_t output_len; 1020*32b31808SJens Wiklander 1021*32b31808SJens Wiklander /* Check if we have space to write binders_len. 1022*32b31808SJens Wiklander * - binders_len (2 bytes) 1023*32b31808SJens Wiklander */ 1024*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2); 1025*32b31808SJens Wiklander p += 2; 1026*32b31808SJens Wiklander 1027*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_SESSION_TICKETS) 1028*32b31808SJens Wiklander if (ssl_tls13_ticket_get_psk(ssl, &hash_alg, &psk, &psk_len) == 0) { 1029*32b31808SJens Wiklander 1030*32b31808SJens Wiklander ret = ssl_tls13_write_binder(ssl, p, end, 1031*32b31808SJens Wiklander MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION, 1032*32b31808SJens Wiklander hash_alg, psk, psk_len, 1033*32b31808SJens Wiklander &output_len); 1034*32b31808SJens Wiklander if (ret != 0) { 1035*32b31808SJens Wiklander return ret; 1036*32b31808SJens Wiklander } 1037*32b31808SJens Wiklander p += output_len; 1038*32b31808SJens Wiklander } 1039*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_SESSION_TICKETS */ 1040*32b31808SJens Wiklander 1041*32b31808SJens Wiklander if (ssl_tls13_psk_get_psk(ssl, &hash_alg, &psk, &psk_len) == 0) { 1042*32b31808SJens Wiklander 1043*32b31808SJens Wiklander ret = ssl_tls13_write_binder(ssl, p, end, 1044*32b31808SJens Wiklander MBEDTLS_SSL_TLS1_3_PSK_EXTERNAL, 1045*32b31808SJens Wiklander hash_alg, psk, psk_len, 1046*32b31808SJens Wiklander &output_len); 1047*32b31808SJens Wiklander if (ret != 0) { 1048*32b31808SJens Wiklander return ret; 1049*32b31808SJens Wiklander } 1050*32b31808SJens Wiklander p += output_len; 1051*32b31808SJens Wiklander } 1052*32b31808SJens Wiklander 1053*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding PSK binder list.")); 1054*32b31808SJens Wiklander 1055*32b31808SJens Wiklander /* 1056*32b31808SJens Wiklander * - binders_len (2 bytes) 1057*32b31808SJens Wiklander */ 1058*32b31808SJens Wiklander MBEDTLS_PUT_UINT16_BE(p - buf - 2, buf, 0); 1059*32b31808SJens Wiklander 1060*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "pre_shared_key binders", buf, p - buf); 1061*32b31808SJens Wiklander 1062*32b31808SJens Wiklander mbedtls_ssl_tls13_set_hs_sent_ext_mask( 1063*32b31808SJens Wiklander ssl, MBEDTLS_TLS_EXT_PRE_SHARED_KEY); 1064*32b31808SJens Wiklander 1065*32b31808SJens Wiklander return 0; 1066*32b31808SJens Wiklander } 1067*32b31808SJens Wiklander 1068*32b31808SJens Wiklander /* 1069*32b31808SJens Wiklander * struct { 1070*32b31808SJens Wiklander * opaque identity<1..2^16-1>; 1071*32b31808SJens Wiklander * uint32 obfuscated_ticket_age; 1072*32b31808SJens Wiklander * } PskIdentity; 1073*32b31808SJens Wiklander * 1074*32b31808SJens Wiklander * opaque PskBinderEntry<32..255>; 1075*32b31808SJens Wiklander * 1076*32b31808SJens Wiklander * struct { 1077*32b31808SJens Wiklander * 1078*32b31808SJens Wiklander * select (Handshake.msg_type) { 1079*32b31808SJens Wiklander * ... 1080*32b31808SJens Wiklander * case server_hello: uint16 selected_identity; 1081*32b31808SJens Wiklander * }; 1082*32b31808SJens Wiklander * 1083*32b31808SJens Wiklander * } PreSharedKeyExtension; 1084*32b31808SJens Wiklander * 1085*32b31808SJens Wiklander */ 1086*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 1087*32b31808SJens Wiklander static int ssl_tls13_parse_server_pre_shared_key_ext(mbedtls_ssl_context *ssl, 1088*32b31808SJens Wiklander const unsigned char *buf, 1089*32b31808SJens Wiklander const unsigned char *end) 1090*32b31808SJens Wiklander { 1091*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 1092*32b31808SJens Wiklander int selected_identity; 1093*32b31808SJens Wiklander const unsigned char *psk; 1094*32b31808SJens Wiklander size_t psk_len; 1095*32b31808SJens Wiklander psa_algorithm_t hash_alg; 1096*32b31808SJens Wiklander 1097*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(buf, end, 2); 1098*32b31808SJens Wiklander selected_identity = MBEDTLS_GET_UINT16_BE(buf, 0); 1099*32b31808SJens Wiklander ssl->handshake->selected_identity = (uint16_t) selected_identity; 1100*32b31808SJens Wiklander 1101*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("selected_identity = %d", selected_identity)); 1102*32b31808SJens Wiklander 1103*32b31808SJens Wiklander if (selected_identity >= ssl_tls13_get_configured_psk_count(ssl)) { 1104*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid PSK identity.")); 1105*32b31808SJens Wiklander 1106*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER, 1107*32b31808SJens Wiklander MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER); 1108*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER; 1109*32b31808SJens Wiklander } 1110*32b31808SJens Wiklander 1111*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_SESSION_TICKETS) 1112*32b31808SJens Wiklander if (selected_identity == 0 && ssl_tls13_has_configured_ticket(ssl)) { 1113*32b31808SJens Wiklander ret = ssl_tls13_ticket_get_psk(ssl, &hash_alg, &psk, &psk_len); 1114*32b31808SJens Wiklander } else 1115*32b31808SJens Wiklander #endif 1116*32b31808SJens Wiklander if (mbedtls_ssl_conf_has_static_psk(ssl->conf)) { 1117*32b31808SJens Wiklander ret = ssl_tls13_psk_get_psk(ssl, &hash_alg, &psk, &psk_len); 1118*32b31808SJens Wiklander } else { 1119*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); 1120*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_INTERNAL_ERROR; 1121*32b31808SJens Wiklander } 1122*32b31808SJens Wiklander if (ret != 0) { 1123*32b31808SJens Wiklander return ret; 1124*32b31808SJens Wiklander } 1125*32b31808SJens Wiklander 1126*32b31808SJens Wiklander if (mbedtls_psa_translate_md(ssl->handshake->ciphersuite_info->mac) 1127*32b31808SJens Wiklander != hash_alg) { 1128*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG( 1129*32b31808SJens Wiklander 1, ("Invalid ciphersuite for external psk.")); 1130*32b31808SJens Wiklander 1131*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER, 1132*32b31808SJens Wiklander MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER); 1133*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER; 1134*32b31808SJens Wiklander } 1135*32b31808SJens Wiklander 1136*32b31808SJens Wiklander ret = mbedtls_ssl_set_hs_psk(ssl, psk, psk_len); 1137*32b31808SJens Wiklander if (ret != 0) { 1138*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_set_hs_psk", ret); 1139*32b31808SJens Wiklander return ret; 1140*32b31808SJens Wiklander } 1141*32b31808SJens Wiklander 1142*32b31808SJens Wiklander return 0; 1143*32b31808SJens Wiklander } 1144*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */ 1145*32b31808SJens Wiklander 1146*32b31808SJens Wiklander int mbedtls_ssl_tls13_write_client_hello_exts(mbedtls_ssl_context *ssl, 1147*32b31808SJens Wiklander unsigned char *buf, 1148*32b31808SJens Wiklander unsigned char *end, 1149*32b31808SJens Wiklander size_t *out_len) 1150*32b31808SJens Wiklander { 1151*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 1152*32b31808SJens Wiklander unsigned char *p = buf; 1153*32b31808SJens Wiklander size_t ext_len; 1154*32b31808SJens Wiklander 1155*32b31808SJens Wiklander *out_len = 0; 1156*32b31808SJens Wiklander 1157*32b31808SJens Wiklander /* Write supported_versions extension 1158*32b31808SJens Wiklander * 1159*32b31808SJens Wiklander * Supported Versions Extension is mandatory with TLS 1.3. 1160*32b31808SJens Wiklander */ 1161*32b31808SJens Wiklander ret = ssl_tls13_write_supported_versions_ext(ssl, p, end, &ext_len); 1162*32b31808SJens Wiklander if (ret != 0) { 1163*32b31808SJens Wiklander return ret; 1164*32b31808SJens Wiklander } 1165*32b31808SJens Wiklander p += ext_len; 1166*32b31808SJens Wiklander 1167*32b31808SJens Wiklander /* Echo the cookie if the server provided one in its preceding 1168*32b31808SJens Wiklander * HelloRetryRequest message. 1169*32b31808SJens Wiklander */ 1170*32b31808SJens Wiklander ret = ssl_tls13_write_cookie_ext(ssl, p, end, &ext_len); 1171*32b31808SJens Wiklander if (ret != 0) { 1172*32b31808SJens Wiklander return ret; 1173*32b31808SJens Wiklander } 1174*32b31808SJens Wiklander p += ext_len; 1175*32b31808SJens Wiklander 1176*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED) 1177*32b31808SJens Wiklander if (mbedtls_ssl_conf_tls13_some_ephemeral_enabled(ssl)) { 1178*32b31808SJens Wiklander ret = ssl_tls13_write_key_share_ext(ssl, p, end, &ext_len); 1179*32b31808SJens Wiklander if (ret != 0) { 1180*32b31808SJens Wiklander return ret; 1181*32b31808SJens Wiklander } 1182*32b31808SJens Wiklander p += ext_len; 1183*32b31808SJens Wiklander } 1184*32b31808SJens Wiklander #endif 1185*32b31808SJens Wiklander 1186*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_EARLY_DATA) 1187*32b31808SJens Wiklander if (mbedtls_ssl_conf_tls13_some_psk_enabled(ssl) && 1188*32b31808SJens Wiklander ssl_tls13_early_data_has_valid_ticket(ssl) && 1189*32b31808SJens Wiklander ssl->conf->early_data_enabled == MBEDTLS_SSL_EARLY_DATA_ENABLED) { 1190*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_write_early_data_ext(ssl, p, end, &ext_len); 1191*32b31808SJens Wiklander if (ret != 0) { 1192*32b31808SJens Wiklander return ret; 1193*32b31808SJens Wiklander } 1194*32b31808SJens Wiklander p += ext_len; 1195*32b31808SJens Wiklander 1196*32b31808SJens Wiklander /* Initializes the status to `rejected`. It will be updated to 1197*32b31808SJens Wiklander * `accepted` if the EncryptedExtension message contain an early data 1198*32b31808SJens Wiklander * indication extension. 1199*32b31808SJens Wiklander */ 1200*32b31808SJens Wiklander ssl->early_data_status = MBEDTLS_SSL_EARLY_DATA_STATUS_REJECTED; 1201*32b31808SJens Wiklander } else { 1202*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write early_data extension")); 1203*32b31808SJens Wiklander ssl->early_data_status = MBEDTLS_SSL_EARLY_DATA_STATUS_NOT_SENT; 1204*32b31808SJens Wiklander } 1205*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_EARLY_DATA */ 1206*32b31808SJens Wiklander 1207*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED) 1208*32b31808SJens Wiklander /* For PSK-based key exchange we need the pre_shared_key extension 1209*32b31808SJens Wiklander * and the psk_key_exchange_modes extension. 1210*32b31808SJens Wiklander * 1211*32b31808SJens Wiklander * The pre_shared_key extension MUST be the last extension in the 1212*32b31808SJens Wiklander * ClientHello. Servers MUST check that it is the last extension and 1213*32b31808SJens Wiklander * otherwise fail the handshake with an "illegal_parameter" alert. 1214*32b31808SJens Wiklander * 1215*32b31808SJens Wiklander * Add the psk_key_exchange_modes extension. 1216*32b31808SJens Wiklander */ 1217*32b31808SJens Wiklander ret = ssl_tls13_write_psk_key_exchange_modes_ext(ssl, p, end, &ext_len); 1218*32b31808SJens Wiklander if (ret != 0) { 1219*32b31808SJens Wiklander return ret; 1220*32b31808SJens Wiklander } 1221*32b31808SJens Wiklander p += ext_len; 1222*32b31808SJens Wiklander #endif 1223*32b31808SJens Wiklander 1224*32b31808SJens Wiklander *out_len = p - buf; 1225*32b31808SJens Wiklander 1226*32b31808SJens Wiklander return 0; 1227*32b31808SJens Wiklander } 1228*32b31808SJens Wiklander 1229*32b31808SJens Wiklander int mbedtls_ssl_tls13_finalize_client_hello(mbedtls_ssl_context *ssl) 1230*32b31808SJens Wiklander { 1231*32b31808SJens Wiklander ((void) ssl); 1232*32b31808SJens Wiklander 1233*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_EARLY_DATA) 1234*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 1235*32b31808SJens Wiklander psa_algorithm_t hash_alg = PSA_ALG_NONE; 1236*32b31808SJens Wiklander const unsigned char *psk; 1237*32b31808SJens Wiklander size_t psk_len; 1238*32b31808SJens Wiklander const mbedtls_ssl_ciphersuite_t *ciphersuite_info; 1239*32b31808SJens Wiklander 1240*32b31808SJens Wiklander if (ssl->early_data_status == MBEDTLS_SSL_EARLY_DATA_STATUS_REJECTED) { 1241*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE) 1242*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state( 1243*32b31808SJens Wiklander ssl, MBEDTLS_SSL_CLIENT_CCS_AFTER_CLIENT_HELLO); 1244*32b31808SJens Wiklander #endif 1245*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG( 1246*32b31808SJens Wiklander 1, ("Set hs psk for early data when writing the first psk")); 1247*32b31808SJens Wiklander 1248*32b31808SJens Wiklander ret = ssl_tls13_ticket_get_psk(ssl, &hash_alg, &psk, &psk_len); 1249*32b31808SJens Wiklander if (ret != 0) { 1250*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_RET( 1251*32b31808SJens Wiklander 1, "ssl_tls13_ticket_get_psk", ret); 1252*32b31808SJens Wiklander return ret; 1253*32b31808SJens Wiklander } 1254*32b31808SJens Wiklander 1255*32b31808SJens Wiklander ret = mbedtls_ssl_set_hs_psk(ssl, psk, psk_len); 1256*32b31808SJens Wiklander if (ret != 0) { 1257*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_set_hs_psk", ret); 1258*32b31808SJens Wiklander return ret; 1259*32b31808SJens Wiklander } 1260*32b31808SJens Wiklander 1261*32b31808SJens Wiklander /* 1262*32b31808SJens Wiklander * Early data are going to be encrypted using the ciphersuite 1263*32b31808SJens Wiklander * associated with the pre-shared key used for the handshake. 1264*32b31808SJens Wiklander * Note that if the server rejects early data, the handshake 1265*32b31808SJens Wiklander * based on the pre-shared key may complete successfully 1266*32b31808SJens Wiklander * with a selected ciphersuite different from the ciphersuite 1267*32b31808SJens Wiklander * associated with the pre-shared key. Only the hashes of the 1268*32b31808SJens Wiklander * two ciphersuites have to be the same. In that case, the 1269*32b31808SJens Wiklander * encrypted handshake data and application data are 1270*32b31808SJens Wiklander * encrypted using a different ciphersuite than the one used for 1271*32b31808SJens Wiklander * the rejected early data. 1272*32b31808SJens Wiklander */ 1273*32b31808SJens Wiklander ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( 1274*32b31808SJens Wiklander ssl->session_negotiate->ciphersuite); 1275*32b31808SJens Wiklander ssl->handshake->ciphersuite_info = ciphersuite_info; 1276*32b31808SJens Wiklander 1277*32b31808SJens Wiklander /* Enable psk and psk_ephemeral to make stage early happy */ 1278*32b31808SJens Wiklander ssl->handshake->key_exchange_mode = 1279*32b31808SJens Wiklander MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ALL; 1280*32b31808SJens Wiklander 1281*32b31808SJens Wiklander /* Start the TLS 1.3 key schedule: 1282*32b31808SJens Wiklander * Set the PSK and derive early secret. 1283*32b31808SJens Wiklander */ 1284*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_key_schedule_stage_early(ssl); 1285*32b31808SJens Wiklander if (ret != 0) { 1286*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_RET( 1287*32b31808SJens Wiklander 1, "mbedtls_ssl_tls13_key_schedule_stage_early", ret); 1288*32b31808SJens Wiklander return ret; 1289*32b31808SJens Wiklander } 1290*32b31808SJens Wiklander 1291*32b31808SJens Wiklander /* Derive early data key material */ 1292*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_compute_early_transform(ssl); 1293*32b31808SJens Wiklander if (ret != 0) { 1294*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_RET( 1295*32b31808SJens Wiklander 1, "mbedtls_ssl_tls13_compute_early_transform", ret); 1296*32b31808SJens Wiklander return ret; 1297*32b31808SJens Wiklander } 1298*32b31808SJens Wiklander 1299*32b31808SJens Wiklander } 1300*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_EARLY_DATA */ 1301*32b31808SJens Wiklander return 0; 1302*32b31808SJens Wiklander } 1303*32b31808SJens Wiklander /* 1304*32b31808SJens Wiklander * Functions for parsing and processing Server Hello 1305*32b31808SJens Wiklander */ 1306*32b31808SJens Wiklander 1307*32b31808SJens Wiklander /** 1308*32b31808SJens Wiklander * \brief Detect if the ServerHello contains a supported_versions extension 1309*32b31808SJens Wiklander * or not. 1310*32b31808SJens Wiklander * 1311*32b31808SJens Wiklander * \param[in] ssl SSL context 1312*32b31808SJens Wiklander * \param[in] buf Buffer containing the ServerHello message 1313*32b31808SJens Wiklander * \param[in] end End of the buffer containing the ServerHello message 1314*32b31808SJens Wiklander * 1315*32b31808SJens Wiklander * \return 0 if the ServerHello does not contain a supported_versions extension 1316*32b31808SJens Wiklander * \return 1 if the ServerHello contains a supported_versions extension 1317*32b31808SJens Wiklander * \return A negative value if an error occurred while parsing the ServerHello. 1318*32b31808SJens Wiklander */ 1319*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 1320*32b31808SJens Wiklander static int ssl_tls13_is_supported_versions_ext_present( 1321*32b31808SJens Wiklander mbedtls_ssl_context *ssl, 1322*32b31808SJens Wiklander const unsigned char *buf, 1323*32b31808SJens Wiklander const unsigned char *end) 1324*32b31808SJens Wiklander { 1325*32b31808SJens Wiklander const unsigned char *p = buf; 1326*32b31808SJens Wiklander size_t legacy_session_id_echo_len; 1327*32b31808SJens Wiklander size_t extensions_len; 1328*32b31808SJens Wiklander const unsigned char *extensions_end; 1329*32b31808SJens Wiklander 1330*32b31808SJens Wiklander /* 1331*32b31808SJens Wiklander * Check there is enough data to access the legacy_session_id_echo vector 1332*32b31808SJens Wiklander * length: 1333*32b31808SJens Wiklander * - legacy_version 2 bytes 1334*32b31808SJens Wiklander * - random MBEDTLS_SERVER_HELLO_RANDOM_LEN bytes 1335*32b31808SJens Wiklander * - legacy_session_id_echo length 1 byte 1336*32b31808SJens Wiklander */ 1337*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, MBEDTLS_SERVER_HELLO_RANDOM_LEN + 3); 1338*32b31808SJens Wiklander p += MBEDTLS_SERVER_HELLO_RANDOM_LEN + 2; 1339*32b31808SJens Wiklander legacy_session_id_echo_len = *p; 1340*32b31808SJens Wiklander 1341*32b31808SJens Wiklander /* 1342*32b31808SJens Wiklander * Jump to the extensions, jumping over: 1343*32b31808SJens Wiklander * - legacy_session_id_echo (legacy_session_id_echo_len + 1) bytes 1344*32b31808SJens Wiklander * - cipher_suite 2 bytes 1345*32b31808SJens Wiklander * - legacy_compression_method 1 byte 1346*32b31808SJens Wiklander */ 1347*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, legacy_session_id_echo_len + 4); 1348*32b31808SJens Wiklander p += legacy_session_id_echo_len + 4; 1349*32b31808SJens Wiklander 1350*32b31808SJens Wiklander /* Case of no extension */ 1351*32b31808SJens Wiklander if (p == end) { 1352*32b31808SJens Wiklander return 0; 1353*32b31808SJens Wiklander } 1354*32b31808SJens Wiklander 1355*32b31808SJens Wiklander /* ... 1356*32b31808SJens Wiklander * Extension extensions<6..2^16-1>; 1357*32b31808SJens Wiklander * ... 1358*32b31808SJens Wiklander * struct { 1359*32b31808SJens Wiklander * ExtensionType extension_type; (2 bytes) 1360*32b31808SJens Wiklander * opaque extension_data<0..2^16-1>; 1361*32b31808SJens Wiklander * } Extension; 1362*32b31808SJens Wiklander */ 1363*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2); 1364*32b31808SJens Wiklander extensions_len = MBEDTLS_GET_UINT16_BE(p, 0); 1365*32b31808SJens Wiklander p += 2; 1366*32b31808SJens Wiklander 1367*32b31808SJens Wiklander /* Check extensions do not go beyond the buffer of data. */ 1368*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len); 1369*32b31808SJens Wiklander extensions_end = p + extensions_len; 1370*32b31808SJens Wiklander 1371*32b31808SJens Wiklander while (p < extensions_end) { 1372*32b31808SJens Wiklander unsigned int extension_type; 1373*32b31808SJens Wiklander size_t extension_data_len; 1374*32b31808SJens Wiklander 1375*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4); 1376*32b31808SJens Wiklander extension_type = MBEDTLS_GET_UINT16_BE(p, 0); 1377*32b31808SJens Wiklander extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2); 1378*32b31808SJens Wiklander p += 4; 1379*32b31808SJens Wiklander 1380*32b31808SJens Wiklander if (extension_type == MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS) { 1381*32b31808SJens Wiklander return 1; 1382*32b31808SJens Wiklander } 1383*32b31808SJens Wiklander 1384*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len); 1385*32b31808SJens Wiklander p += extension_data_len; 1386*32b31808SJens Wiklander } 1387*32b31808SJens Wiklander 1388*32b31808SJens Wiklander return 0; 1389*32b31808SJens Wiklander } 1390*32b31808SJens Wiklander 1391*32b31808SJens Wiklander /* Returns a negative value on failure, and otherwise 1392*32b31808SJens Wiklander * - 1 if the last eight bytes of the ServerHello random bytes indicate that 1393*32b31808SJens Wiklander * the server is TLS 1.3 capable but negotiating TLS 1.2 or below. 1394*32b31808SJens Wiklander * - 0 otherwise 1395*32b31808SJens Wiklander */ 1396*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 1397*32b31808SJens Wiklander static int ssl_tls13_is_downgrade_negotiation(mbedtls_ssl_context *ssl, 1398*32b31808SJens Wiklander const unsigned char *buf, 1399*32b31808SJens Wiklander const unsigned char *end) 1400*32b31808SJens Wiklander { 1401*32b31808SJens Wiklander /* First seven bytes of the magic downgrade strings, see RFC 8446 4.1.3 */ 1402*32b31808SJens Wiklander static const unsigned char magic_downgrade_string[] = 1403*32b31808SJens Wiklander { 0x44, 0x4F, 0x57, 0x4E, 0x47, 0x52, 0x44 }; 1404*32b31808SJens Wiklander const unsigned char *last_eight_bytes_of_random; 1405*32b31808SJens Wiklander unsigned char last_byte_of_random; 1406*32b31808SJens Wiklander 1407*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(buf, end, MBEDTLS_SERVER_HELLO_RANDOM_LEN + 2); 1408*32b31808SJens Wiklander last_eight_bytes_of_random = buf + 2 + MBEDTLS_SERVER_HELLO_RANDOM_LEN - 8; 1409*32b31808SJens Wiklander 1410*32b31808SJens Wiklander if (memcmp(last_eight_bytes_of_random, 1411*32b31808SJens Wiklander magic_downgrade_string, 1412*32b31808SJens Wiklander sizeof(magic_downgrade_string)) == 0) { 1413*32b31808SJens Wiklander last_byte_of_random = last_eight_bytes_of_random[7]; 1414*32b31808SJens Wiklander return last_byte_of_random == 0 || 1415*32b31808SJens Wiklander last_byte_of_random == 1; 1416*32b31808SJens Wiklander } 1417*32b31808SJens Wiklander 1418*32b31808SJens Wiklander return 0; 1419*32b31808SJens Wiklander } 1420*32b31808SJens Wiklander 1421*32b31808SJens Wiklander /* Returns a negative value on failure, and otherwise 1422*32b31808SJens Wiklander * - SSL_SERVER_HELLO or 1423*32b31808SJens Wiklander * - SSL_SERVER_HELLO_HRR 1424*32b31808SJens Wiklander * to indicate which message is expected and to be parsed next. 1425*32b31808SJens Wiklander */ 1426*32b31808SJens Wiklander #define SSL_SERVER_HELLO 0 1427*32b31808SJens Wiklander #define SSL_SERVER_HELLO_HRR 1 1428*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 1429*32b31808SJens Wiklander static int ssl_server_hello_is_hrr(mbedtls_ssl_context *ssl, 1430*32b31808SJens Wiklander const unsigned char *buf, 1431*32b31808SJens Wiklander const unsigned char *end) 1432*32b31808SJens Wiklander { 1433*32b31808SJens Wiklander 1434*32b31808SJens Wiklander /* Check whether this message is a HelloRetryRequest ( HRR ) message. 1435*32b31808SJens Wiklander * 1436*32b31808SJens Wiklander * Server Hello and HRR are only distinguished by Random set to the 1437*32b31808SJens Wiklander * special value of the SHA-256 of "HelloRetryRequest". 1438*32b31808SJens Wiklander * 1439*32b31808SJens Wiklander * struct { 1440*32b31808SJens Wiklander * ProtocolVersion legacy_version = 0x0303; 1441*32b31808SJens Wiklander * Random random; 1442*32b31808SJens Wiklander * opaque legacy_session_id_echo<0..32>; 1443*32b31808SJens Wiklander * CipherSuite cipher_suite; 1444*32b31808SJens Wiklander * uint8 legacy_compression_method = 0; 1445*32b31808SJens Wiklander * Extension extensions<6..2^16-1>; 1446*32b31808SJens Wiklander * } ServerHello; 1447*32b31808SJens Wiklander * 1448*32b31808SJens Wiklander */ 1449*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(buf, end, 1450*32b31808SJens Wiklander 2 + sizeof(mbedtls_ssl_tls13_hello_retry_request_magic)); 1451*32b31808SJens Wiklander 1452*32b31808SJens Wiklander if (memcmp(buf + 2, mbedtls_ssl_tls13_hello_retry_request_magic, 1453*32b31808SJens Wiklander sizeof(mbedtls_ssl_tls13_hello_retry_request_magic)) == 0) { 1454*32b31808SJens Wiklander return SSL_SERVER_HELLO_HRR; 1455*32b31808SJens Wiklander } 1456*32b31808SJens Wiklander 1457*32b31808SJens Wiklander return SSL_SERVER_HELLO; 1458*32b31808SJens Wiklander } 1459*32b31808SJens Wiklander 1460*32b31808SJens Wiklander /* 1461*32b31808SJens Wiklander * Returns a negative value on failure, and otherwise 1462*32b31808SJens Wiklander * - SSL_SERVER_HELLO or 1463*32b31808SJens Wiklander * - SSL_SERVER_HELLO_HRR or 1464*32b31808SJens Wiklander * - SSL_SERVER_HELLO_TLS1_2 1465*32b31808SJens Wiklander */ 1466*32b31808SJens Wiklander #define SSL_SERVER_HELLO_TLS1_2 2 1467*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 1468*32b31808SJens Wiklander static int ssl_tls13_preprocess_server_hello(mbedtls_ssl_context *ssl, 1469*32b31808SJens Wiklander const unsigned char *buf, 1470*32b31808SJens Wiklander const unsigned char *end) 1471*32b31808SJens Wiklander { 1472*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 1473*32b31808SJens Wiklander mbedtls_ssl_handshake_params *handshake = ssl->handshake; 1474*32b31808SJens Wiklander 1475*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK_NEG(ssl_tls13_is_supported_versions_ext_present( 1476*32b31808SJens Wiklander ssl, buf, end)); 1477*32b31808SJens Wiklander 1478*32b31808SJens Wiklander if (ret == 0) { 1479*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK_NEG( 1480*32b31808SJens Wiklander ssl_tls13_is_downgrade_negotiation(ssl, buf, end)); 1481*32b31808SJens Wiklander 1482*32b31808SJens Wiklander /* If the server is negotiating TLS 1.2 or below and: 1483*32b31808SJens Wiklander * . we did not propose TLS 1.2 or 1484*32b31808SJens Wiklander * . the server responded it is TLS 1.3 capable but negotiating a lower 1485*32b31808SJens Wiklander * version of the protocol and thus we are under downgrade attack 1486*32b31808SJens Wiklander * abort the handshake with an "illegal parameter" alert. 1487*32b31808SJens Wiklander */ 1488*32b31808SJens Wiklander if (handshake->min_tls_version > MBEDTLS_SSL_VERSION_TLS1_2 || ret) { 1489*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER, 1490*32b31808SJens Wiklander MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER); 1491*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER; 1492*32b31808SJens Wiklander } 1493*32b31808SJens Wiklander 1494*32b31808SJens Wiklander ssl->keep_current_message = 1; 1495*32b31808SJens Wiklander ssl->tls_version = MBEDTLS_SSL_VERSION_TLS1_2; 1496*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(ssl, 1497*32b31808SJens Wiklander MBEDTLS_SSL_HS_SERVER_HELLO, 1498*32b31808SJens Wiklander buf, (size_t) (end - buf))); 1499*32b31808SJens Wiklander 1500*32b31808SJens Wiklander if (mbedtls_ssl_conf_tls13_some_ephemeral_enabled(ssl)) { 1501*32b31808SJens Wiklander ret = ssl_tls13_reset_key_share(ssl); 1502*32b31808SJens Wiklander if (ret != 0) { 1503*32b31808SJens Wiklander return ret; 1504*32b31808SJens Wiklander } 1505*32b31808SJens Wiklander } 1506*32b31808SJens Wiklander 1507*32b31808SJens Wiklander return SSL_SERVER_HELLO_TLS1_2; 1508*32b31808SJens Wiklander } 1509*32b31808SJens Wiklander 1510*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_SESSION_TICKETS) 1511*32b31808SJens Wiklander ssl->session_negotiate->endpoint = ssl->conf->endpoint; 1512*32b31808SJens Wiklander ssl->session_negotiate->tls_version = ssl->tls_version; 1513*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_SESSION_TICKETS */ 1514*32b31808SJens Wiklander 1515*32b31808SJens Wiklander handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE; 1516*32b31808SJens Wiklander 1517*32b31808SJens Wiklander ret = ssl_server_hello_is_hrr(ssl, buf, end); 1518*32b31808SJens Wiklander switch (ret) { 1519*32b31808SJens Wiklander case SSL_SERVER_HELLO: 1520*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, ("received ServerHello message")); 1521*32b31808SJens Wiklander break; 1522*32b31808SJens Wiklander case SSL_SERVER_HELLO_HRR: 1523*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, ("received HelloRetryRequest message")); 1524*32b31808SJens Wiklander /* If a client receives a second 1525*32b31808SJens Wiklander * HelloRetryRequest in the same connection (i.e., where the ClientHello 1526*32b31808SJens Wiklander * was itself in response to a HelloRetryRequest), it MUST abort the 1527*32b31808SJens Wiklander * handshake with an "unexpected_message" alert. 1528*32b31808SJens Wiklander */ 1529*32b31808SJens Wiklander if (handshake->hello_retry_request_count > 0) { 1530*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("Multiple HRRs received")); 1531*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE, 1532*32b31808SJens Wiklander MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE); 1533*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE; 1534*32b31808SJens Wiklander } 1535*32b31808SJens Wiklander /* 1536*32b31808SJens Wiklander * Clients must abort the handshake with an "illegal_parameter" 1537*32b31808SJens Wiklander * alert if the HelloRetryRequest would not result in any change 1538*32b31808SJens Wiklander * in the ClientHello. 1539*32b31808SJens Wiklander * In a PSK only key exchange that what we expect. 1540*32b31808SJens Wiklander */ 1541*32b31808SJens Wiklander if (!mbedtls_ssl_conf_tls13_some_ephemeral_enabled(ssl)) { 1542*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, 1543*32b31808SJens Wiklander ("Unexpected HRR in pure PSK key exchange.")); 1544*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT( 1545*32b31808SJens Wiklander MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER, 1546*32b31808SJens Wiklander MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER); 1547*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER; 1548*32b31808SJens Wiklander } 1549*32b31808SJens Wiklander 1550*32b31808SJens Wiklander handshake->hello_retry_request_count++; 1551*32b31808SJens Wiklander 1552*32b31808SJens Wiklander break; 1553*32b31808SJens Wiklander } 1554*32b31808SJens Wiklander 1555*32b31808SJens Wiklander cleanup: 1556*32b31808SJens Wiklander 1557*32b31808SJens Wiklander return ret; 1558*32b31808SJens Wiklander } 1559*32b31808SJens Wiklander 1560*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 1561*32b31808SJens Wiklander static int ssl_tls13_check_server_hello_session_id_echo(mbedtls_ssl_context *ssl, 1562*32b31808SJens Wiklander const unsigned char **buf, 1563*32b31808SJens Wiklander const unsigned char *end) 1564*32b31808SJens Wiklander { 1565*32b31808SJens Wiklander const unsigned char *p = *buf; 1566*32b31808SJens Wiklander size_t legacy_session_id_echo_len; 1567*32b31808SJens Wiklander 1568*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 1); 1569*32b31808SJens Wiklander legacy_session_id_echo_len = *p++; 1570*32b31808SJens Wiklander 1571*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, legacy_session_id_echo_len); 1572*32b31808SJens Wiklander 1573*32b31808SJens Wiklander /* legacy_session_id_echo */ 1574*32b31808SJens Wiklander if (ssl->session_negotiate->id_len != legacy_session_id_echo_len || 1575*32b31808SJens Wiklander memcmp(ssl->session_negotiate->id, p, legacy_session_id_echo_len) != 0) { 1576*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "Expected Session ID", 1577*32b31808SJens Wiklander ssl->session_negotiate->id, 1578*32b31808SJens Wiklander ssl->session_negotiate->id_len); 1579*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "Received Session ID", p, 1580*32b31808SJens Wiklander legacy_session_id_echo_len); 1581*32b31808SJens Wiklander 1582*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER, 1583*32b31808SJens Wiklander MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER); 1584*32b31808SJens Wiklander 1585*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER; 1586*32b31808SJens Wiklander } 1587*32b31808SJens Wiklander 1588*32b31808SJens Wiklander p += legacy_session_id_echo_len; 1589*32b31808SJens Wiklander *buf = p; 1590*32b31808SJens Wiklander 1591*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "Session ID", ssl->session_negotiate->id, 1592*32b31808SJens Wiklander ssl->session_negotiate->id_len); 1593*32b31808SJens Wiklander return 0; 1594*32b31808SJens Wiklander } 1595*32b31808SJens Wiklander 1596*32b31808SJens Wiklander /* Parse ServerHello message and configure context 1597*32b31808SJens Wiklander * 1598*32b31808SJens Wiklander * struct { 1599*32b31808SJens Wiklander * ProtocolVersion legacy_version = 0x0303; // TLS 1.2 1600*32b31808SJens Wiklander * Random random; 1601*32b31808SJens Wiklander * opaque legacy_session_id_echo<0..32>; 1602*32b31808SJens Wiklander * CipherSuite cipher_suite; 1603*32b31808SJens Wiklander * uint8 legacy_compression_method = 0; 1604*32b31808SJens Wiklander * Extension extensions<6..2^16-1>; 1605*32b31808SJens Wiklander * } ServerHello; 1606*32b31808SJens Wiklander */ 1607*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 1608*32b31808SJens Wiklander static int ssl_tls13_parse_server_hello(mbedtls_ssl_context *ssl, 1609*32b31808SJens Wiklander const unsigned char *buf, 1610*32b31808SJens Wiklander const unsigned char *end, 1611*32b31808SJens Wiklander int is_hrr) 1612*32b31808SJens Wiklander { 1613*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 1614*32b31808SJens Wiklander const unsigned char *p = buf; 1615*32b31808SJens Wiklander mbedtls_ssl_handshake_params *handshake = ssl->handshake; 1616*32b31808SJens Wiklander size_t extensions_len; 1617*32b31808SJens Wiklander const unsigned char *extensions_end; 1618*32b31808SJens Wiklander uint16_t cipher_suite; 1619*32b31808SJens Wiklander const mbedtls_ssl_ciphersuite_t *ciphersuite_info; 1620*32b31808SJens Wiklander int fatal_alert = 0; 1621*32b31808SJens Wiklander uint32_t allowed_extensions_mask; 1622*32b31808SJens Wiklander int hs_msg_type = is_hrr ? MBEDTLS_SSL_TLS1_3_HS_HELLO_RETRY_REQUEST : 1623*32b31808SJens Wiklander MBEDTLS_SSL_HS_SERVER_HELLO; 1624*32b31808SJens Wiklander 1625*32b31808SJens Wiklander /* 1626*32b31808SJens Wiklander * Check there is space for minimal fields 1627*32b31808SJens Wiklander * 1628*32b31808SJens Wiklander * - legacy_version ( 2 bytes) 1629*32b31808SJens Wiklander * - random (MBEDTLS_SERVER_HELLO_RANDOM_LEN bytes) 1630*32b31808SJens Wiklander * - legacy_session_id_echo ( 1 byte ), minimum size 1631*32b31808SJens Wiklander * - cipher_suite ( 2 bytes) 1632*32b31808SJens Wiklander * - legacy_compression_method ( 1 byte ) 1633*32b31808SJens Wiklander */ 1634*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, MBEDTLS_SERVER_HELLO_RANDOM_LEN + 6); 1635*32b31808SJens Wiklander 1636*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(4, "server hello", p, end - p); 1637*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "server hello, version", p, 2); 1638*32b31808SJens Wiklander 1639*32b31808SJens Wiklander /* ... 1640*32b31808SJens Wiklander * ProtocolVersion legacy_version = 0x0303; // TLS 1.2 1641*32b31808SJens Wiklander * ... 1642*32b31808SJens Wiklander * with ProtocolVersion defined as: 1643*32b31808SJens Wiklander * uint16 ProtocolVersion; 1644*32b31808SJens Wiklander */ 1645*32b31808SJens Wiklander if (mbedtls_ssl_read_version(p, ssl->conf->transport) != 1646*32b31808SJens Wiklander MBEDTLS_SSL_VERSION_TLS1_2) { 1647*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("Unsupported version of TLS.")); 1648*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION, 1649*32b31808SJens Wiklander MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION); 1650*32b31808SJens Wiklander ret = MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION; 1651*32b31808SJens Wiklander goto cleanup; 1652*32b31808SJens Wiklander } 1653*32b31808SJens Wiklander p += 2; 1654*32b31808SJens Wiklander 1655*32b31808SJens Wiklander /* ... 1656*32b31808SJens Wiklander * Random random; 1657*32b31808SJens Wiklander * ... 1658*32b31808SJens Wiklander * with Random defined as: 1659*32b31808SJens Wiklander * opaque Random[MBEDTLS_SERVER_HELLO_RANDOM_LEN]; 1660*32b31808SJens Wiklander */ 1661*32b31808SJens Wiklander if (!is_hrr) { 1662*32b31808SJens Wiklander memcpy(&handshake->randbytes[MBEDTLS_CLIENT_HELLO_RANDOM_LEN], p, 1663*32b31808SJens Wiklander MBEDTLS_SERVER_HELLO_RANDOM_LEN); 1664*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", 1665*32b31808SJens Wiklander p, MBEDTLS_SERVER_HELLO_RANDOM_LEN); 1666*32b31808SJens Wiklander } 1667*32b31808SJens Wiklander p += MBEDTLS_SERVER_HELLO_RANDOM_LEN; 1668*32b31808SJens Wiklander 1669*32b31808SJens Wiklander /* ... 1670*32b31808SJens Wiklander * opaque legacy_session_id_echo<0..32>; 1671*32b31808SJens Wiklander * ... 1672*32b31808SJens Wiklander */ 1673*32b31808SJens Wiklander if (ssl_tls13_check_server_hello_session_id_echo(ssl, &p, end) != 0) { 1674*32b31808SJens Wiklander fatal_alert = MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER; 1675*32b31808SJens Wiklander goto cleanup; 1676*32b31808SJens Wiklander } 1677*32b31808SJens Wiklander 1678*32b31808SJens Wiklander /* ... 1679*32b31808SJens Wiklander * CipherSuite cipher_suite; 1680*32b31808SJens Wiklander * ... 1681*32b31808SJens Wiklander * with CipherSuite defined as: 1682*32b31808SJens Wiklander * uint8 CipherSuite[2]; 1683*32b31808SJens Wiklander */ 1684*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2); 1685*32b31808SJens Wiklander cipher_suite = MBEDTLS_GET_UINT16_BE(p, 0); 1686*32b31808SJens Wiklander p += 2; 1687*32b31808SJens Wiklander 1688*32b31808SJens Wiklander 1689*32b31808SJens Wiklander ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(cipher_suite); 1690*32b31808SJens Wiklander /* 1691*32b31808SJens Wiklander * Check whether this ciphersuite is valid and offered. 1692*32b31808SJens Wiklander */ 1693*32b31808SJens Wiklander if ((mbedtls_ssl_validate_ciphersuite(ssl, ciphersuite_info, 1694*32b31808SJens Wiklander ssl->tls_version, 1695*32b31808SJens Wiklander ssl->tls_version) != 0) || 1696*32b31808SJens Wiklander !mbedtls_ssl_tls13_cipher_suite_is_offered(ssl, cipher_suite)) { 1697*32b31808SJens Wiklander fatal_alert = MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER; 1698*32b31808SJens Wiklander } 1699*32b31808SJens Wiklander /* 1700*32b31808SJens Wiklander * If we received an HRR before and that the proposed selected 1701*32b31808SJens Wiklander * ciphersuite in this server hello is not the same as the one 1702*32b31808SJens Wiklander * proposed in the HRR, we abort the handshake and send an 1703*32b31808SJens Wiklander * "illegal_parameter" alert. 1704*32b31808SJens Wiklander */ 1705*32b31808SJens Wiklander else if ((!is_hrr) && (handshake->hello_retry_request_count > 0) && 1706*32b31808SJens Wiklander (cipher_suite != ssl->session_negotiate->ciphersuite)) { 1707*32b31808SJens Wiklander fatal_alert = MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER; 1708*32b31808SJens Wiklander } 1709*32b31808SJens Wiklander 1710*32b31808SJens Wiklander if (fatal_alert == MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER) { 1711*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("invalid ciphersuite(%04x) parameter", 1712*32b31808SJens Wiklander cipher_suite)); 1713*32b31808SJens Wiklander goto cleanup; 1714*32b31808SJens Wiklander } 1715*32b31808SJens Wiklander 1716*32b31808SJens Wiklander /* Configure ciphersuites */ 1717*32b31808SJens Wiklander mbedtls_ssl_optimize_checksum(ssl, ciphersuite_info); 1718*32b31808SJens Wiklander 1719*32b31808SJens Wiklander handshake->ciphersuite_info = ciphersuite_info; 1720*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: ( %04x ) - %s", 1721*32b31808SJens Wiklander cipher_suite, ciphersuite_info->name)); 1722*32b31808SJens Wiklander 1723*32b31808SJens Wiklander #if defined(MBEDTLS_HAVE_TIME) 1724*32b31808SJens Wiklander ssl->session_negotiate->start = time(NULL); 1725*32b31808SJens Wiklander #endif /* MBEDTLS_HAVE_TIME */ 1726*32b31808SJens Wiklander 1727*32b31808SJens Wiklander /* ... 1728*32b31808SJens Wiklander * uint8 legacy_compression_method = 0; 1729*32b31808SJens Wiklander * ... 1730*32b31808SJens Wiklander */ 1731*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 1); 1732*32b31808SJens Wiklander if (p[0] != MBEDTLS_SSL_COMPRESS_NULL) { 1733*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("bad legacy compression method")); 1734*32b31808SJens Wiklander fatal_alert = MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER; 1735*32b31808SJens Wiklander goto cleanup; 1736*32b31808SJens Wiklander } 1737*32b31808SJens Wiklander p++; 1738*32b31808SJens Wiklander 1739*32b31808SJens Wiklander /* ... 1740*32b31808SJens Wiklander * Extension extensions<6..2^16-1>; 1741*32b31808SJens Wiklander * ... 1742*32b31808SJens Wiklander * struct { 1743*32b31808SJens Wiklander * ExtensionType extension_type; (2 bytes) 1744*32b31808SJens Wiklander * opaque extension_data<0..2^16-1>; 1745*32b31808SJens Wiklander * } Extension; 1746*32b31808SJens Wiklander */ 1747*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2); 1748*32b31808SJens Wiklander extensions_len = MBEDTLS_GET_UINT16_BE(p, 0); 1749*32b31808SJens Wiklander p += 2; 1750*32b31808SJens Wiklander 1751*32b31808SJens Wiklander /* Check extensions do not go beyond the buffer of data. */ 1752*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len); 1753*32b31808SJens Wiklander extensions_end = p + extensions_len; 1754*32b31808SJens Wiklander 1755*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "server hello extensions", p, extensions_len); 1756*32b31808SJens Wiklander 1757*32b31808SJens Wiklander handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE; 1758*32b31808SJens Wiklander allowed_extensions_mask = is_hrr ? 1759*32b31808SJens Wiklander MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_HRR : 1760*32b31808SJens Wiklander MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_SH; 1761*32b31808SJens Wiklander 1762*32b31808SJens Wiklander while (p < extensions_end) { 1763*32b31808SJens Wiklander unsigned int extension_type; 1764*32b31808SJens Wiklander size_t extension_data_len; 1765*32b31808SJens Wiklander const unsigned char *extension_data_end; 1766*32b31808SJens Wiklander 1767*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4); 1768*32b31808SJens Wiklander extension_type = MBEDTLS_GET_UINT16_BE(p, 0); 1769*32b31808SJens Wiklander extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2); 1770*32b31808SJens Wiklander p += 4; 1771*32b31808SJens Wiklander 1772*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len); 1773*32b31808SJens Wiklander extension_data_end = p + extension_data_len; 1774*32b31808SJens Wiklander 1775*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_check_received_extension( 1776*32b31808SJens Wiklander ssl, hs_msg_type, extension_type, allowed_extensions_mask); 1777*32b31808SJens Wiklander if (ret != 0) { 1778*32b31808SJens Wiklander return ret; 1779*32b31808SJens Wiklander } 1780*32b31808SJens Wiklander 1781*32b31808SJens Wiklander switch (extension_type) { 1782*32b31808SJens Wiklander case MBEDTLS_TLS_EXT_COOKIE: 1783*32b31808SJens Wiklander 1784*32b31808SJens Wiklander ret = ssl_tls13_parse_cookie_ext(ssl, 1785*32b31808SJens Wiklander p, extension_data_end); 1786*32b31808SJens Wiklander if (ret != 0) { 1787*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_RET(1, 1788*32b31808SJens Wiklander "ssl_tls13_parse_cookie_ext", 1789*32b31808SJens Wiklander ret); 1790*32b31808SJens Wiklander goto cleanup; 1791*32b31808SJens Wiklander } 1792*32b31808SJens Wiklander break; 1793*32b31808SJens Wiklander 1794*32b31808SJens Wiklander case MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS: 1795*32b31808SJens Wiklander ret = ssl_tls13_parse_supported_versions_ext(ssl, 1796*32b31808SJens Wiklander p, 1797*32b31808SJens Wiklander extension_data_end); 1798*32b31808SJens Wiklander if (ret != 0) { 1799*32b31808SJens Wiklander goto cleanup; 1800*32b31808SJens Wiklander } 1801*32b31808SJens Wiklander break; 1802*32b31808SJens Wiklander 1803*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED) 1804*32b31808SJens Wiklander case MBEDTLS_TLS_EXT_PRE_SHARED_KEY: 1805*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("found pre_shared_key extension")); 1806*32b31808SJens Wiklander 1807*32b31808SJens Wiklander if ((ret = ssl_tls13_parse_server_pre_shared_key_ext( 1808*32b31808SJens Wiklander ssl, p, extension_data_end)) != 0) { 1809*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_RET( 1810*32b31808SJens Wiklander 1, ("ssl_tls13_parse_server_pre_shared_key_ext"), ret); 1811*32b31808SJens Wiklander return ret; 1812*32b31808SJens Wiklander } 1813*32b31808SJens Wiklander break; 1814*32b31808SJens Wiklander #endif 1815*32b31808SJens Wiklander 1816*32b31808SJens Wiklander case MBEDTLS_TLS_EXT_KEY_SHARE: 1817*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("found key_shares extension")); 1818*32b31808SJens Wiklander if (!mbedtls_ssl_conf_tls13_some_ephemeral_enabled(ssl)) { 1819*32b31808SJens Wiklander fatal_alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT; 1820*32b31808SJens Wiklander goto cleanup; 1821*32b31808SJens Wiklander } 1822*32b31808SJens Wiklander 1823*32b31808SJens Wiklander if (is_hrr) { 1824*32b31808SJens Wiklander ret = ssl_tls13_parse_hrr_key_share_ext(ssl, 1825*32b31808SJens Wiklander p, extension_data_end); 1826*32b31808SJens Wiklander } else { 1827*32b31808SJens Wiklander ret = ssl_tls13_parse_key_share_ext(ssl, 1828*32b31808SJens Wiklander p, extension_data_end); 1829*32b31808SJens Wiklander } 1830*32b31808SJens Wiklander if (ret != 0) { 1831*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_RET(1, 1832*32b31808SJens Wiklander "ssl_tls13_parse_key_share_ext", 1833*32b31808SJens Wiklander ret); 1834*32b31808SJens Wiklander goto cleanup; 1835*32b31808SJens Wiklander } 1836*32b31808SJens Wiklander break; 1837*32b31808SJens Wiklander 1838*32b31808SJens Wiklander default: 1839*32b31808SJens Wiklander ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; 1840*32b31808SJens Wiklander goto cleanup; 1841*32b31808SJens Wiklander } 1842*32b31808SJens Wiklander 1843*32b31808SJens Wiklander p += extension_data_len; 1844*32b31808SJens Wiklander } 1845*32b31808SJens Wiklander 1846*32b31808SJens Wiklander MBEDTLS_SSL_PRINT_EXTS(3, hs_msg_type, handshake->received_extensions); 1847*32b31808SJens Wiklander 1848*32b31808SJens Wiklander cleanup: 1849*32b31808SJens Wiklander 1850*32b31808SJens Wiklander if (fatal_alert == MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT) { 1851*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT, 1852*32b31808SJens Wiklander MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION); 1853*32b31808SJens Wiklander ret = MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION; 1854*32b31808SJens Wiklander } else if (fatal_alert == MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER) { 1855*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER, 1856*32b31808SJens Wiklander MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER); 1857*32b31808SJens Wiklander ret = MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER; 1858*32b31808SJens Wiklander } 1859*32b31808SJens Wiklander return ret; 1860*32b31808SJens Wiklander } 1861*32b31808SJens Wiklander 1862*32b31808SJens Wiklander #if defined(MBEDTLS_DEBUG_C) 1863*32b31808SJens Wiklander static const char *ssl_tls13_get_kex_mode_str(int mode) 1864*32b31808SJens Wiklander { 1865*32b31808SJens Wiklander switch (mode) { 1866*32b31808SJens Wiklander case MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK: 1867*32b31808SJens Wiklander return "psk"; 1868*32b31808SJens Wiklander case MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL: 1869*32b31808SJens Wiklander return "ephemeral"; 1870*32b31808SJens Wiklander case MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL: 1871*32b31808SJens Wiklander return "psk_ephemeral"; 1872*32b31808SJens Wiklander default: 1873*32b31808SJens Wiklander return "unknown mode"; 1874*32b31808SJens Wiklander } 1875*32b31808SJens Wiklander } 1876*32b31808SJens Wiklander #endif /* MBEDTLS_DEBUG_C */ 1877*32b31808SJens Wiklander 1878*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 1879*32b31808SJens Wiklander static int ssl_tls13_postprocess_server_hello(mbedtls_ssl_context *ssl) 1880*32b31808SJens Wiklander { 1881*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 1882*32b31808SJens Wiklander mbedtls_ssl_handshake_params *handshake = ssl->handshake; 1883*32b31808SJens Wiklander 1884*32b31808SJens Wiklander /* Determine the key exchange mode: 1885*32b31808SJens Wiklander * 1) If both the pre_shared_key and key_share extensions were received 1886*32b31808SJens Wiklander * then the key exchange mode is PSK with EPHEMERAL. 1887*32b31808SJens Wiklander * 2) If only the pre_shared_key extension was received then the key 1888*32b31808SJens Wiklander * exchange mode is PSK-only. 1889*32b31808SJens Wiklander * 3) If only the key_share extension was received then the key 1890*32b31808SJens Wiklander * exchange mode is EPHEMERAL-only. 1891*32b31808SJens Wiklander */ 1892*32b31808SJens Wiklander switch (handshake->received_extensions & 1893*32b31808SJens Wiklander (MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY) | MBEDTLS_SSL_EXT_MASK(KEY_SHARE))) { 1894*32b31808SJens Wiklander /* Only the pre_shared_key extension was received */ 1895*32b31808SJens Wiklander case MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY): 1896*32b31808SJens Wiklander handshake->key_exchange_mode = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK; 1897*32b31808SJens Wiklander break; 1898*32b31808SJens Wiklander 1899*32b31808SJens Wiklander /* Only the key_share extension was received */ 1900*32b31808SJens Wiklander case MBEDTLS_SSL_EXT_MASK(KEY_SHARE): 1901*32b31808SJens Wiklander handshake->key_exchange_mode = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL; 1902*32b31808SJens Wiklander break; 1903*32b31808SJens Wiklander 1904*32b31808SJens Wiklander /* Both the pre_shared_key and key_share extensions were received */ 1905*32b31808SJens Wiklander case (MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY) | MBEDTLS_SSL_EXT_MASK(KEY_SHARE)): 1906*32b31808SJens Wiklander handshake->key_exchange_mode = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL; 1907*32b31808SJens Wiklander break; 1908*32b31808SJens Wiklander 1909*32b31808SJens Wiklander /* Neither pre_shared_key nor key_share extension was received */ 1910*32b31808SJens Wiklander default: 1911*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("Unknown key exchange.")); 1912*32b31808SJens Wiklander ret = MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE; 1913*32b31808SJens Wiklander goto cleanup; 1914*32b31808SJens Wiklander } 1915*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_EARLY_DATA) 1916*32b31808SJens Wiklander if (handshake->received_extensions & MBEDTLS_SSL_EXT_MASK(EARLY_DATA) && 1917*32b31808SJens Wiklander (handshake->selected_identity != 0 || 1918*32b31808SJens Wiklander handshake->ciphersuite_info->id != 1919*32b31808SJens Wiklander ssl->session_negotiate->ciphersuite)) { 1920*32b31808SJens Wiklander /* RFC8446 4.2.11 1921*32b31808SJens Wiklander * If the server supplies an "early_data" extension, the 1922*32b31808SJens Wiklander * client MUST verify that the server's selected_identity 1923*32b31808SJens Wiklander * is 0. If any other value is returned, the client MUST 1924*32b31808SJens Wiklander * abort the handshake with an "illegal_parameter" alert. 1925*32b31808SJens Wiklander * 1926*32b31808SJens Wiklander * RFC 8446 4.2.10 1927*32b31808SJens Wiklander * In order to accept early data, the server MUST have accepted a PSK 1928*32b31808SJens Wiklander * cipher suite and selected the first key offered in the client's 1929*32b31808SJens Wiklander * "pre_shared_key" extension. In addition, it MUST verify that the 1930*32b31808SJens Wiklander * following values are the same as those associated with the 1931*32b31808SJens Wiklander * selected PSK: 1932*32b31808SJens Wiklander * - The TLS version number 1933*32b31808SJens Wiklander * - The selected cipher suite 1934*32b31808SJens Wiklander * - The selected ALPN [RFC7301] protocol, if any 1935*32b31808SJens Wiklander * 1936*32b31808SJens Wiklander * We check here that when early data is involved the server 1937*32b31808SJens Wiklander * selected the cipher suite associated to the pre-shared key 1938*32b31808SJens Wiklander * as it must have. 1939*32b31808SJens Wiklander */ 1940*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER, 1941*32b31808SJens Wiklander MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER); 1942*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER; 1943*32b31808SJens Wiklander } 1944*32b31808SJens Wiklander #endif 1945*32b31808SJens Wiklander 1946*32b31808SJens Wiklander if (!mbedtls_ssl_conf_tls13_check_kex_modes( 1947*32b31808SJens Wiklander ssl, handshake->key_exchange_mode)) { 1948*32b31808SJens Wiklander ret = MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE; 1949*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, 1950*32b31808SJens Wiklander ("Key exchange mode(%s) is not supported.", 1951*32b31808SJens Wiklander ssl_tls13_get_kex_mode_str(handshake->key_exchange_mode))); 1952*32b31808SJens Wiklander goto cleanup; 1953*32b31808SJens Wiklander } 1954*32b31808SJens Wiklander 1955*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, 1956*32b31808SJens Wiklander ("Selected key exchange mode: %s", 1957*32b31808SJens Wiklander ssl_tls13_get_kex_mode_str(handshake->key_exchange_mode))); 1958*32b31808SJens Wiklander 1959*32b31808SJens Wiklander /* Start the TLS 1.3 key scheduling if not already done. 1960*32b31808SJens Wiklander * 1961*32b31808SJens Wiklander * If we proposed early data then we have already derived an 1962*32b31808SJens Wiklander * early secret using the selected PSK and its associated hash. 1963*32b31808SJens Wiklander * It means that if the negotiated key exchange mode is psk or 1964*32b31808SJens Wiklander * psk_ephemeral, we have already correctly computed the 1965*32b31808SJens Wiklander * early secret and thus we do not do it again. In all other 1966*32b31808SJens Wiklander * cases we compute it here. 1967*32b31808SJens Wiklander */ 1968*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_EARLY_DATA) 1969*32b31808SJens Wiklander if (ssl->early_data_status == MBEDTLS_SSL_EARLY_DATA_STATUS_NOT_SENT || 1970*32b31808SJens Wiklander handshake->key_exchange_mode == 1971*32b31808SJens Wiklander MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL) 1972*32b31808SJens Wiklander #endif 1973*32b31808SJens Wiklander { 1974*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_key_schedule_stage_early(ssl); 1975*32b31808SJens Wiklander if (ret != 0) { 1976*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_RET( 1977*32b31808SJens Wiklander 1, "mbedtls_ssl_tls13_key_schedule_stage_early", ret); 1978*32b31808SJens Wiklander goto cleanup; 1979*32b31808SJens Wiklander } 1980*32b31808SJens Wiklander } 1981*32b31808SJens Wiklander 1982*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_compute_handshake_transform(ssl); 1983*32b31808SJens Wiklander if (ret != 0) { 1984*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_RET(1, 1985*32b31808SJens Wiklander "mbedtls_ssl_tls13_compute_handshake_transform", 1986*32b31808SJens Wiklander ret); 1987*32b31808SJens Wiklander goto cleanup; 1988*32b31808SJens Wiklander } 1989*32b31808SJens Wiklander 1990*32b31808SJens Wiklander mbedtls_ssl_set_inbound_transform(ssl, handshake->transform_handshake); 1991*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("Switch to handshake keys for inbound traffic")); 1992*32b31808SJens Wiklander ssl->session_negotiate->ciphersuite = handshake->ciphersuite_info->id; 1993*32b31808SJens Wiklander ssl->session_in = ssl->session_negotiate; 1994*32b31808SJens Wiklander 1995*32b31808SJens Wiklander cleanup: 1996*32b31808SJens Wiklander if (ret != 0) { 1997*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT( 1998*32b31808SJens Wiklander MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE, 1999*32b31808SJens Wiklander MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE); 2000*32b31808SJens Wiklander } 2001*32b31808SJens Wiklander 2002*32b31808SJens Wiklander return ret; 2003*32b31808SJens Wiklander } 2004*32b31808SJens Wiklander 2005*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2006*32b31808SJens Wiklander static int ssl_tls13_postprocess_hrr(mbedtls_ssl_context *ssl) 2007*32b31808SJens Wiklander { 2008*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 2009*32b31808SJens Wiklander 2010*32b31808SJens Wiklander mbedtls_ssl_session_reset_msg_layer(ssl, 0); 2011*32b31808SJens Wiklander 2012*32b31808SJens Wiklander /* 2013*32b31808SJens Wiklander * We are going to re-generate a shared secret corresponding to the group 2014*32b31808SJens Wiklander * selected by the server, which is different from the group for which we 2015*32b31808SJens Wiklander * generated a shared secret in the first client hello. 2016*32b31808SJens Wiklander * Thus, reset the shared secret. 2017*32b31808SJens Wiklander */ 2018*32b31808SJens Wiklander ret = ssl_tls13_reset_key_share(ssl); 2019*32b31808SJens Wiklander if (ret != 0) { 2020*32b31808SJens Wiklander return ret; 2021*32b31808SJens Wiklander } 2022*32b31808SJens Wiklander 2023*32b31808SJens Wiklander ssl->session_negotiate->ciphersuite = ssl->handshake->ciphersuite_info->id; 2024*32b31808SJens Wiklander return 0; 2025*32b31808SJens Wiklander } 2026*32b31808SJens Wiklander 2027*32b31808SJens Wiklander /* 2028*32b31808SJens Wiklander * Wait and parse ServerHello handshake message. 2029*32b31808SJens Wiklander * Handler for MBEDTLS_SSL_SERVER_HELLO 2030*32b31808SJens Wiklander */ 2031*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2032*32b31808SJens Wiklander static int ssl_tls13_process_server_hello(mbedtls_ssl_context *ssl) 2033*32b31808SJens Wiklander { 2034*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 2035*32b31808SJens Wiklander unsigned char *buf = NULL; 2036*32b31808SJens Wiklander size_t buf_len = 0; 2037*32b31808SJens Wiklander int is_hrr = 0; 2038*32b31808SJens Wiklander 2039*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, ("=> %s", __func__)); 2040*32b31808SJens Wiklander 2041*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(ssl, 2042*32b31808SJens Wiklander MBEDTLS_SSL_HS_SERVER_HELLO, 2043*32b31808SJens Wiklander &buf, &buf_len)); 2044*32b31808SJens Wiklander 2045*32b31808SJens Wiklander ret = ssl_tls13_preprocess_server_hello(ssl, buf, buf + buf_len); 2046*32b31808SJens Wiklander if (ret < 0) { 2047*32b31808SJens Wiklander goto cleanup; 2048*32b31808SJens Wiklander } else { 2049*32b31808SJens Wiklander is_hrr = (ret == SSL_SERVER_HELLO_HRR); 2050*32b31808SJens Wiklander } 2051*32b31808SJens Wiklander 2052*32b31808SJens Wiklander if (ret == SSL_SERVER_HELLO_TLS1_2) { 2053*32b31808SJens Wiklander ret = 0; 2054*32b31808SJens Wiklander goto cleanup; 2055*32b31808SJens Wiklander } 2056*32b31808SJens Wiklander 2057*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_server_hello(ssl, buf, 2058*32b31808SJens Wiklander buf + buf_len, 2059*32b31808SJens Wiklander is_hrr)); 2060*32b31808SJens Wiklander if (is_hrr) { 2061*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_reset_transcript_for_hrr(ssl)); 2062*32b31808SJens Wiklander } 2063*32b31808SJens Wiklander 2064*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(ssl, 2065*32b31808SJens Wiklander MBEDTLS_SSL_HS_SERVER_HELLO, buf, 2066*32b31808SJens Wiklander buf_len)); 2067*32b31808SJens Wiklander 2068*32b31808SJens Wiklander if (is_hrr) { 2069*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(ssl_tls13_postprocess_hrr(ssl)); 2070*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE) 2071*32b31808SJens Wiklander /* If not offering early data, the client sends a dummy CCS record 2072*32b31808SJens Wiklander * immediately before its second flight. This may either be before 2073*32b31808SJens Wiklander * its second ClientHello or before its encrypted handshake flight. 2074*32b31808SJens Wiklander */ 2075*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, 2076*32b31808SJens Wiklander MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO); 2077*32b31808SJens Wiklander #else 2078*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO); 2079*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */ 2080*32b31808SJens Wiklander } else { 2081*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(ssl_tls13_postprocess_server_hello(ssl)); 2082*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS); 2083*32b31808SJens Wiklander } 2084*32b31808SJens Wiklander 2085*32b31808SJens Wiklander cleanup: 2086*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, ("<= %s ( %s )", __func__, 2087*32b31808SJens Wiklander is_hrr ? "HelloRetryRequest" : "ServerHello")); 2088*32b31808SJens Wiklander return ret; 2089*32b31808SJens Wiklander } 2090*32b31808SJens Wiklander 2091*32b31808SJens Wiklander /* 2092*32b31808SJens Wiklander * 2093*32b31808SJens Wiklander * Handler for MBEDTLS_SSL_ENCRYPTED_EXTENSIONS 2094*32b31808SJens Wiklander * 2095*32b31808SJens Wiklander * The EncryptedExtensions message contains any extensions which 2096*32b31808SJens Wiklander * should be protected, i.e., any which are not needed to establish 2097*32b31808SJens Wiklander * the cryptographic context. 2098*32b31808SJens Wiklander */ 2099*32b31808SJens Wiklander 2100*32b31808SJens Wiklander /* Parse EncryptedExtensions message 2101*32b31808SJens Wiklander * struct { 2102*32b31808SJens Wiklander * Extension extensions<0..2^16-1>; 2103*32b31808SJens Wiklander * } EncryptedExtensions; 2104*32b31808SJens Wiklander */ 2105*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2106*32b31808SJens Wiklander static int ssl_tls13_parse_encrypted_extensions(mbedtls_ssl_context *ssl, 2107*32b31808SJens Wiklander const unsigned char *buf, 2108*32b31808SJens Wiklander const unsigned char *end) 2109*32b31808SJens Wiklander { 2110*32b31808SJens Wiklander int ret = 0; 2111*32b31808SJens Wiklander size_t extensions_len; 2112*32b31808SJens Wiklander const unsigned char *p = buf; 2113*32b31808SJens Wiklander const unsigned char *extensions_end; 2114*32b31808SJens Wiklander mbedtls_ssl_handshake_params *handshake = ssl->handshake; 2115*32b31808SJens Wiklander 2116*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2); 2117*32b31808SJens Wiklander extensions_len = MBEDTLS_GET_UINT16_BE(p, 0); 2118*32b31808SJens Wiklander p += 2; 2119*32b31808SJens Wiklander 2120*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len); 2121*32b31808SJens Wiklander extensions_end = p + extensions_len; 2122*32b31808SJens Wiklander 2123*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "encrypted extensions", p, extensions_len); 2124*32b31808SJens Wiklander 2125*32b31808SJens Wiklander handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE; 2126*32b31808SJens Wiklander 2127*32b31808SJens Wiklander while (p < extensions_end) { 2128*32b31808SJens Wiklander unsigned int extension_type; 2129*32b31808SJens Wiklander size_t extension_data_len; 2130*32b31808SJens Wiklander 2131*32b31808SJens Wiklander /* 2132*32b31808SJens Wiklander * struct { 2133*32b31808SJens Wiklander * ExtensionType extension_type; (2 bytes) 2134*32b31808SJens Wiklander * opaque extension_data<0..2^16-1>; 2135*32b31808SJens Wiklander * } Extension; 2136*32b31808SJens Wiklander */ 2137*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4); 2138*32b31808SJens Wiklander extension_type = MBEDTLS_GET_UINT16_BE(p, 0); 2139*32b31808SJens Wiklander extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2); 2140*32b31808SJens Wiklander p += 4; 2141*32b31808SJens Wiklander 2142*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len); 2143*32b31808SJens Wiklander 2144*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_check_received_extension( 2145*32b31808SJens Wiklander ssl, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS, extension_type, 2146*32b31808SJens Wiklander MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_EE); 2147*32b31808SJens Wiklander if (ret != 0) { 2148*32b31808SJens Wiklander return ret; 2149*32b31808SJens Wiklander } 2150*32b31808SJens Wiklander 2151*32b31808SJens Wiklander switch (extension_type) { 2152*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_ALPN) 2153*32b31808SJens Wiklander case MBEDTLS_TLS_EXT_ALPN: 2154*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension")); 2155*32b31808SJens Wiklander 2156*32b31808SJens Wiklander if ((ret = ssl_tls13_parse_alpn_ext(ssl, p, (size_t) extension_data_len)) != 0) { 2157*32b31808SJens Wiklander return ret; 2158*32b31808SJens Wiklander } 2159*32b31808SJens Wiklander 2160*32b31808SJens Wiklander break; 2161*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_ALPN */ 2162*32b31808SJens Wiklander 2163*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_EARLY_DATA) 2164*32b31808SJens Wiklander case MBEDTLS_TLS_EXT_EARLY_DATA: 2165*32b31808SJens Wiklander 2166*32b31808SJens Wiklander if (extension_data_len != 0) { 2167*32b31808SJens Wiklander /* The message must be empty. */ 2168*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR, 2169*32b31808SJens Wiklander MBEDTLS_ERR_SSL_DECODE_ERROR); 2170*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_DECODE_ERROR; 2171*32b31808SJens Wiklander } 2172*32b31808SJens Wiklander 2173*32b31808SJens Wiklander break; 2174*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_EARLY_DATA */ 2175*32b31808SJens Wiklander 2176*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT) 2177*32b31808SJens Wiklander case MBEDTLS_TLS_EXT_RECORD_SIZE_LIMIT: 2178*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("found record_size_limit extension")); 2179*32b31808SJens Wiklander 2180*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_parse_record_size_limit_ext(ssl, p, p + extension_data_len); 2181*32b31808SJens Wiklander 2182*32b31808SJens Wiklander /* TODO: Return unconditionally here until we handle the record size limit correctly. 2183*32b31808SJens Wiklander * Once handled correctly, only return in case of errors. */ 2184*32b31808SJens Wiklander return ret; 2185*32b31808SJens Wiklander 2186*32b31808SJens Wiklander break; 2187*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_RECORD_SIZE_LIMIT */ 2188*32b31808SJens Wiklander 2189*32b31808SJens Wiklander default: 2190*32b31808SJens Wiklander MBEDTLS_SSL_PRINT_EXT( 2191*32b31808SJens Wiklander 3, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS, 2192*32b31808SJens Wiklander extension_type, "( ignored )"); 2193*32b31808SJens Wiklander break; 2194*32b31808SJens Wiklander } 2195*32b31808SJens Wiklander 2196*32b31808SJens Wiklander p += extension_data_len; 2197*32b31808SJens Wiklander } 2198*32b31808SJens Wiklander 2199*32b31808SJens Wiklander MBEDTLS_SSL_PRINT_EXTS(3, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS, 2200*32b31808SJens Wiklander handshake->received_extensions); 2201*32b31808SJens Wiklander 2202*32b31808SJens Wiklander /* Check that we consumed all the message. */ 2203*32b31808SJens Wiklander if (p != end) { 2204*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("EncryptedExtension lengths misaligned")); 2205*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR, 2206*32b31808SJens Wiklander MBEDTLS_ERR_SSL_DECODE_ERROR); 2207*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_DECODE_ERROR; 2208*32b31808SJens Wiklander } 2209*32b31808SJens Wiklander 2210*32b31808SJens Wiklander return ret; 2211*32b31808SJens Wiklander } 2212*32b31808SJens Wiklander 2213*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2214*32b31808SJens Wiklander static int ssl_tls13_process_encrypted_extensions(mbedtls_ssl_context *ssl) 2215*32b31808SJens Wiklander { 2216*32b31808SJens Wiklander int ret; 2217*32b31808SJens Wiklander unsigned char *buf; 2218*32b31808SJens Wiklander size_t buf_len; 2219*32b31808SJens Wiklander 2220*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse encrypted extensions")); 2221*32b31808SJens Wiklander 2222*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(ssl, 2223*32b31808SJens Wiklander MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS, 2224*32b31808SJens Wiklander &buf, &buf_len)); 2225*32b31808SJens Wiklander 2226*32b31808SJens Wiklander /* Process the message contents */ 2227*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK( 2228*32b31808SJens Wiklander ssl_tls13_parse_encrypted_extensions(ssl, buf, buf + buf_len)); 2229*32b31808SJens Wiklander 2230*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_EARLY_DATA) 2231*32b31808SJens Wiklander if (ssl->handshake->received_extensions & 2232*32b31808SJens Wiklander MBEDTLS_SSL_EXT_MASK(EARLY_DATA)) { 2233*32b31808SJens Wiklander ssl->early_data_status = MBEDTLS_SSL_EARLY_DATA_STATUS_ACCEPTED; 2234*32b31808SJens Wiklander } 2235*32b31808SJens Wiklander #endif 2236*32b31808SJens Wiklander 2237*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(ssl, 2238*32b31808SJens Wiklander MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS, 2239*32b31808SJens Wiklander buf, buf_len)); 2240*32b31808SJens Wiklander 2241*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED) 2242*32b31808SJens Wiklander if (mbedtls_ssl_tls13_key_exchange_mode_with_psk(ssl)) { 2243*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_FINISHED); 2244*32b31808SJens Wiklander } else { 2245*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CERTIFICATE_REQUEST); 2246*32b31808SJens Wiklander } 2247*32b31808SJens Wiklander #else 2248*32b31808SJens Wiklander ((void) ssl); 2249*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_FINISHED); 2250*32b31808SJens Wiklander #endif 2251*32b31808SJens Wiklander 2252*32b31808SJens Wiklander cleanup: 2253*32b31808SJens Wiklander 2254*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse encrypted extensions")); 2255*32b31808SJens Wiklander return ret; 2256*32b31808SJens Wiklander 2257*32b31808SJens Wiklander } 2258*32b31808SJens Wiklander 2259*32b31808SJens Wiklander /* 2260*32b31808SJens Wiklander * Handler for MBEDTLS_SSL_END_OF_EARLY_DATA 2261*32b31808SJens Wiklander * 2262*32b31808SJens Wiklander * RFC 8446 section 4.5 2263*32b31808SJens Wiklander * 2264*32b31808SJens Wiklander * struct {} EndOfEarlyData; 2265*32b31808SJens Wiklander * 2266*32b31808SJens Wiklander * If the server sent an "early_data" extension in EncryptedExtensions, the 2267*32b31808SJens Wiklander * client MUST send an EndOfEarlyData message after receiving the server 2268*32b31808SJens Wiklander * Finished. Otherwise, the client MUST NOT send an EndOfEarlyData message. 2269*32b31808SJens Wiklander */ 2270*32b31808SJens Wiklander 2271*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2272*32b31808SJens Wiklander static int ssl_tls13_write_end_of_early_data(mbedtls_ssl_context *ssl) 2273*32b31808SJens Wiklander { 2274*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 2275*32b31808SJens Wiklander unsigned char *buf = NULL; 2276*32b31808SJens Wiklander size_t buf_len; 2277*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, ("=> write EndOfEarlyData")); 2278*32b31808SJens Wiklander 2279*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg( 2280*32b31808SJens Wiklander ssl, MBEDTLS_SSL_HS_END_OF_EARLY_DATA, 2281*32b31808SJens Wiklander &buf, &buf_len)); 2282*32b31808SJens Wiklander 2283*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_hdr_to_checksum( 2284*32b31808SJens Wiklander ssl, MBEDTLS_SSL_HS_END_OF_EARLY_DATA, 0)); 2285*32b31808SJens Wiklander 2286*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK( 2287*32b31808SJens Wiklander mbedtls_ssl_finish_handshake_msg(ssl, buf_len, 0)); 2288*32b31808SJens Wiklander 2289*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE); 2290*32b31808SJens Wiklander 2291*32b31808SJens Wiklander cleanup: 2292*32b31808SJens Wiklander 2293*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, ("<= write EndOfEarlyData")); 2294*32b31808SJens Wiklander return ret; 2295*32b31808SJens Wiklander } 2296*32b31808SJens Wiklander 2297*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED) 2298*32b31808SJens Wiklander /* 2299*32b31808SJens Wiklander * STATE HANDLING: CertificateRequest 2300*32b31808SJens Wiklander * 2301*32b31808SJens Wiklander */ 2302*32b31808SJens Wiklander #define SSL_CERTIFICATE_REQUEST_EXPECT_REQUEST 0 2303*32b31808SJens Wiklander #define SSL_CERTIFICATE_REQUEST_SKIP 1 2304*32b31808SJens Wiklander /* Coordination: 2305*32b31808SJens Wiklander * Deals with the ambiguity of not knowing if a CertificateRequest 2306*32b31808SJens Wiklander * will be sent. Returns a negative code on failure, or 2307*32b31808SJens Wiklander * - SSL_CERTIFICATE_REQUEST_EXPECT_REQUEST 2308*32b31808SJens Wiklander * - SSL_CERTIFICATE_REQUEST_SKIP 2309*32b31808SJens Wiklander * indicating if a Certificate Request is expected or not. 2310*32b31808SJens Wiklander */ 2311*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2312*32b31808SJens Wiklander static int ssl_tls13_certificate_request_coordinate(mbedtls_ssl_context *ssl) 2313*32b31808SJens Wiklander { 2314*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 2315*32b31808SJens Wiklander 2316*32b31808SJens Wiklander if ((ret = mbedtls_ssl_read_record(ssl, 0)) != 0) { 2317*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret); 2318*32b31808SJens Wiklander return ret; 2319*32b31808SJens Wiklander } 2320*32b31808SJens Wiklander ssl->keep_current_message = 1; 2321*32b31808SJens Wiklander 2322*32b31808SJens Wiklander if ((ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE) && 2323*32b31808SJens Wiklander (ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST)) { 2324*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("got a certificate request")); 2325*32b31808SJens Wiklander return SSL_CERTIFICATE_REQUEST_EXPECT_REQUEST; 2326*32b31808SJens Wiklander } 2327*32b31808SJens Wiklander 2328*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, ("got no certificate request")); 2329*32b31808SJens Wiklander 2330*32b31808SJens Wiklander return SSL_CERTIFICATE_REQUEST_SKIP; 2331*32b31808SJens Wiklander } 2332*32b31808SJens Wiklander 2333*32b31808SJens Wiklander /* 2334*32b31808SJens Wiklander * ssl_tls13_parse_certificate_request() 2335*32b31808SJens Wiklander * Parse certificate request 2336*32b31808SJens Wiklander * struct { 2337*32b31808SJens Wiklander * opaque certificate_request_context<0..2^8-1>; 2338*32b31808SJens Wiklander * Extension extensions<2..2^16-1>; 2339*32b31808SJens Wiklander * } CertificateRequest; 2340*32b31808SJens Wiklander */ 2341*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2342*32b31808SJens Wiklander static int ssl_tls13_parse_certificate_request(mbedtls_ssl_context *ssl, 2343*32b31808SJens Wiklander const unsigned char *buf, 2344*32b31808SJens Wiklander const unsigned char *end) 2345*32b31808SJens Wiklander { 2346*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 2347*32b31808SJens Wiklander const unsigned char *p = buf; 2348*32b31808SJens Wiklander size_t certificate_request_context_len = 0; 2349*32b31808SJens Wiklander size_t extensions_len = 0; 2350*32b31808SJens Wiklander const unsigned char *extensions_end; 2351*32b31808SJens Wiklander mbedtls_ssl_handshake_params *handshake = ssl->handshake; 2352*32b31808SJens Wiklander 2353*32b31808SJens Wiklander /* ... 2354*32b31808SJens Wiklander * opaque certificate_request_context<0..2^8-1> 2355*32b31808SJens Wiklander * ... 2356*32b31808SJens Wiklander */ 2357*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 1); 2358*32b31808SJens Wiklander certificate_request_context_len = (size_t) p[0]; 2359*32b31808SJens Wiklander p += 1; 2360*32b31808SJens Wiklander 2361*32b31808SJens Wiklander if (certificate_request_context_len > 0) { 2362*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, certificate_request_context_len); 2363*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "Certificate Request Context", 2364*32b31808SJens Wiklander p, certificate_request_context_len); 2365*32b31808SJens Wiklander 2366*32b31808SJens Wiklander handshake->certificate_request_context = 2367*32b31808SJens Wiklander mbedtls_calloc(1, certificate_request_context_len); 2368*32b31808SJens Wiklander if (handshake->certificate_request_context == NULL) { 2369*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small")); 2370*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_ALLOC_FAILED; 2371*32b31808SJens Wiklander } 2372*32b31808SJens Wiklander memcpy(handshake->certificate_request_context, p, 2373*32b31808SJens Wiklander certificate_request_context_len); 2374*32b31808SJens Wiklander p += certificate_request_context_len; 2375*32b31808SJens Wiklander } 2376*32b31808SJens Wiklander 2377*32b31808SJens Wiklander /* ... 2378*32b31808SJens Wiklander * Extension extensions<2..2^16-1>; 2379*32b31808SJens Wiklander * ... 2380*32b31808SJens Wiklander */ 2381*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2); 2382*32b31808SJens Wiklander extensions_len = MBEDTLS_GET_UINT16_BE(p, 0); 2383*32b31808SJens Wiklander p += 2; 2384*32b31808SJens Wiklander 2385*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len); 2386*32b31808SJens Wiklander extensions_end = p + extensions_len; 2387*32b31808SJens Wiklander 2388*32b31808SJens Wiklander handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE; 2389*32b31808SJens Wiklander 2390*32b31808SJens Wiklander while (p < extensions_end) { 2391*32b31808SJens Wiklander unsigned int extension_type; 2392*32b31808SJens Wiklander size_t extension_data_len; 2393*32b31808SJens Wiklander 2394*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4); 2395*32b31808SJens Wiklander extension_type = MBEDTLS_GET_UINT16_BE(p, 0); 2396*32b31808SJens Wiklander extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2); 2397*32b31808SJens Wiklander p += 4; 2398*32b31808SJens Wiklander 2399*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len); 2400*32b31808SJens Wiklander 2401*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_check_received_extension( 2402*32b31808SJens Wiklander ssl, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST, extension_type, 2403*32b31808SJens Wiklander MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_CR); 2404*32b31808SJens Wiklander if (ret != 0) { 2405*32b31808SJens Wiklander return ret; 2406*32b31808SJens Wiklander } 2407*32b31808SJens Wiklander 2408*32b31808SJens Wiklander switch (extension_type) { 2409*32b31808SJens Wiklander case MBEDTLS_TLS_EXT_SIG_ALG: 2410*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, 2411*32b31808SJens Wiklander ("found signature algorithms extension")); 2412*32b31808SJens Wiklander ret = mbedtls_ssl_parse_sig_alg_ext(ssl, p, 2413*32b31808SJens Wiklander p + extension_data_len); 2414*32b31808SJens Wiklander if (ret != 0) { 2415*32b31808SJens Wiklander return ret; 2416*32b31808SJens Wiklander } 2417*32b31808SJens Wiklander 2418*32b31808SJens Wiklander break; 2419*32b31808SJens Wiklander 2420*32b31808SJens Wiklander default: 2421*32b31808SJens Wiklander MBEDTLS_SSL_PRINT_EXT( 2422*32b31808SJens Wiklander 3, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST, 2423*32b31808SJens Wiklander extension_type, "( ignored )"); 2424*32b31808SJens Wiklander break; 2425*32b31808SJens Wiklander } 2426*32b31808SJens Wiklander 2427*32b31808SJens Wiklander p += extension_data_len; 2428*32b31808SJens Wiklander } 2429*32b31808SJens Wiklander 2430*32b31808SJens Wiklander MBEDTLS_SSL_PRINT_EXTS(3, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST, 2431*32b31808SJens Wiklander handshake->received_extensions); 2432*32b31808SJens Wiklander 2433*32b31808SJens Wiklander /* Check that we consumed all the message. */ 2434*32b31808SJens Wiklander if (p != end) { 2435*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, 2436*32b31808SJens Wiklander ("CertificateRequest misaligned")); 2437*32b31808SJens Wiklander goto decode_error; 2438*32b31808SJens Wiklander } 2439*32b31808SJens Wiklander 2440*32b31808SJens Wiklander /* RFC 8446 section 4.3.2 2441*32b31808SJens Wiklander * 2442*32b31808SJens Wiklander * The "signature_algorithms" extension MUST be specified 2443*32b31808SJens Wiklander */ 2444*32b31808SJens Wiklander if ((handshake->received_extensions & MBEDTLS_SSL_EXT_MASK(SIG_ALG)) == 0) { 2445*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, 2446*32b31808SJens Wiklander ("no signature algorithms extension found")); 2447*32b31808SJens Wiklander goto decode_error; 2448*32b31808SJens Wiklander } 2449*32b31808SJens Wiklander 2450*32b31808SJens Wiklander ssl->handshake->client_auth = 1; 2451*32b31808SJens Wiklander return 0; 2452*32b31808SJens Wiklander 2453*32b31808SJens Wiklander decode_error: 2454*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR, 2455*32b31808SJens Wiklander MBEDTLS_ERR_SSL_DECODE_ERROR); 2456*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_DECODE_ERROR; 2457*32b31808SJens Wiklander } 2458*32b31808SJens Wiklander 2459*32b31808SJens Wiklander /* 2460*32b31808SJens Wiklander * Handler for MBEDTLS_SSL_CERTIFICATE_REQUEST 2461*32b31808SJens Wiklander */ 2462*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2463*32b31808SJens Wiklander static int ssl_tls13_process_certificate_request(mbedtls_ssl_context *ssl) 2464*32b31808SJens Wiklander { 2465*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 2466*32b31808SJens Wiklander 2467*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate request")); 2468*32b31808SJens Wiklander 2469*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK_NEG(ssl_tls13_certificate_request_coordinate(ssl)); 2470*32b31808SJens Wiklander 2471*32b31808SJens Wiklander if (ret == SSL_CERTIFICATE_REQUEST_EXPECT_REQUEST) { 2472*32b31808SJens Wiklander unsigned char *buf; 2473*32b31808SJens Wiklander size_t buf_len; 2474*32b31808SJens Wiklander 2475*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(ssl, 2476*32b31808SJens Wiklander MBEDTLS_SSL_HS_CERTIFICATE_REQUEST, 2477*32b31808SJens Wiklander &buf, &buf_len)); 2478*32b31808SJens Wiklander 2479*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_certificate_request(ssl, 2480*32b31808SJens Wiklander buf, buf + buf_len)); 2481*32b31808SJens Wiklander 2482*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(ssl, 2483*32b31808SJens Wiklander MBEDTLS_SSL_HS_CERTIFICATE_REQUEST, 2484*32b31808SJens Wiklander buf, buf_len)); 2485*32b31808SJens Wiklander } else if (ret == SSL_CERTIFICATE_REQUEST_SKIP) { 2486*32b31808SJens Wiklander ret = 0; 2487*32b31808SJens Wiklander } else { 2488*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); 2489*32b31808SJens Wiklander ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; 2490*32b31808SJens Wiklander goto cleanup; 2491*32b31808SJens Wiklander } 2492*32b31808SJens Wiklander 2493*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_CERTIFICATE); 2494*32b31808SJens Wiklander 2495*32b31808SJens Wiklander cleanup: 2496*32b31808SJens Wiklander 2497*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate request")); 2498*32b31808SJens Wiklander return ret; 2499*32b31808SJens Wiklander } 2500*32b31808SJens Wiklander 2501*32b31808SJens Wiklander /* 2502*32b31808SJens Wiklander * Handler for MBEDTLS_SSL_SERVER_CERTIFICATE 2503*32b31808SJens Wiklander */ 2504*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2505*32b31808SJens Wiklander static int ssl_tls13_process_server_certificate(mbedtls_ssl_context *ssl) 2506*32b31808SJens Wiklander { 2507*32b31808SJens Wiklander int ret; 2508*32b31808SJens Wiklander 2509*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_process_certificate(ssl); 2510*32b31808SJens Wiklander if (ret != 0) { 2511*32b31808SJens Wiklander return ret; 2512*32b31808SJens Wiklander } 2513*32b31808SJens Wiklander 2514*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CERTIFICATE_VERIFY); 2515*32b31808SJens Wiklander return 0; 2516*32b31808SJens Wiklander } 2517*32b31808SJens Wiklander 2518*32b31808SJens Wiklander /* 2519*32b31808SJens Wiklander * Handler for MBEDTLS_SSL_CERTIFICATE_VERIFY 2520*32b31808SJens Wiklander */ 2521*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2522*32b31808SJens Wiklander static int ssl_tls13_process_certificate_verify(mbedtls_ssl_context *ssl) 2523*32b31808SJens Wiklander { 2524*32b31808SJens Wiklander int ret; 2525*32b31808SJens Wiklander 2526*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_process_certificate_verify(ssl); 2527*32b31808SJens Wiklander if (ret != 0) { 2528*32b31808SJens Wiklander return ret; 2529*32b31808SJens Wiklander } 2530*32b31808SJens Wiklander 2531*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_FINISHED); 2532*32b31808SJens Wiklander return 0; 2533*32b31808SJens Wiklander } 2534*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */ 2535*32b31808SJens Wiklander 2536*32b31808SJens Wiklander /* 2537*32b31808SJens Wiklander * Handler for MBEDTLS_SSL_SERVER_FINISHED 2538*32b31808SJens Wiklander */ 2539*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2540*32b31808SJens Wiklander static int ssl_tls13_process_server_finished(mbedtls_ssl_context *ssl) 2541*32b31808SJens Wiklander { 2542*32b31808SJens Wiklander int ret; 2543*32b31808SJens Wiklander 2544*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_process_finished_message(ssl); 2545*32b31808SJens Wiklander if (ret != 0) { 2546*32b31808SJens Wiklander return ret; 2547*32b31808SJens Wiklander } 2548*32b31808SJens Wiklander 2549*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_compute_application_transform(ssl); 2550*32b31808SJens Wiklander if (ret != 0) { 2551*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT( 2552*32b31808SJens Wiklander MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE, 2553*32b31808SJens Wiklander MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE); 2554*32b31808SJens Wiklander return ret; 2555*32b31808SJens Wiklander } 2556*32b31808SJens Wiklander 2557*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_EARLY_DATA) 2558*32b31808SJens Wiklander if (ssl->early_data_status == MBEDTLS_SSL_EARLY_DATA_STATUS_ACCEPTED) { 2559*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_END_OF_EARLY_DATA); 2560*32b31808SJens Wiklander } else if (ssl->early_data_status == MBEDTLS_SSL_EARLY_DATA_STATUS_REJECTED) { 2561*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE); 2562*32b31808SJens Wiklander } else 2563*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_EARLY_DATA */ 2564*32b31808SJens Wiklander { 2565*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE) 2566*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state( 2567*32b31808SJens Wiklander ssl, MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED); 2568*32b31808SJens Wiklander #else 2569*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE); 2570*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */ 2571*32b31808SJens Wiklander } 2572*32b31808SJens Wiklander 2573*32b31808SJens Wiklander return 0; 2574*32b31808SJens Wiklander } 2575*32b31808SJens Wiklander 2576*32b31808SJens Wiklander /* 2577*32b31808SJens Wiklander * Handler for MBEDTLS_SSL_CLIENT_CERTIFICATE 2578*32b31808SJens Wiklander */ 2579*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2580*32b31808SJens Wiklander static int ssl_tls13_write_client_certificate(mbedtls_ssl_context *ssl) 2581*32b31808SJens Wiklander { 2582*32b31808SJens Wiklander int non_empty_certificate_msg = 0; 2583*32b31808SJens Wiklander 2584*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, 2585*32b31808SJens Wiklander ("Switch to handshake traffic keys for outbound traffic")); 2586*32b31808SJens Wiklander mbedtls_ssl_set_outbound_transform(ssl, ssl->handshake->transform_handshake); 2587*32b31808SJens Wiklander 2588*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED) 2589*32b31808SJens Wiklander if (ssl->handshake->client_auth) { 2590*32b31808SJens Wiklander int ret = mbedtls_ssl_tls13_write_certificate(ssl); 2591*32b31808SJens Wiklander if (ret != 0) { 2592*32b31808SJens Wiklander return ret; 2593*32b31808SJens Wiklander } 2594*32b31808SJens Wiklander 2595*32b31808SJens Wiklander if (mbedtls_ssl_own_cert(ssl) != NULL) { 2596*32b31808SJens Wiklander non_empty_certificate_msg = 1; 2597*32b31808SJens Wiklander } 2598*32b31808SJens Wiklander } else { 2599*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, ("skip write certificate")); 2600*32b31808SJens Wiklander } 2601*32b31808SJens Wiklander #endif 2602*32b31808SJens Wiklander 2603*32b31808SJens Wiklander if (non_empty_certificate_msg) { 2604*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, 2605*32b31808SJens Wiklander MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY); 2606*32b31808SJens Wiklander } else { 2607*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, ("skip write certificate verify")); 2608*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_FINISHED); 2609*32b31808SJens Wiklander } 2610*32b31808SJens Wiklander 2611*32b31808SJens Wiklander return 0; 2612*32b31808SJens Wiklander } 2613*32b31808SJens Wiklander 2614*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED) 2615*32b31808SJens Wiklander /* 2616*32b31808SJens Wiklander * Handler for MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY 2617*32b31808SJens Wiklander */ 2618*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2619*32b31808SJens Wiklander static int ssl_tls13_write_client_certificate_verify(mbedtls_ssl_context *ssl) 2620*32b31808SJens Wiklander { 2621*32b31808SJens Wiklander int ret = mbedtls_ssl_tls13_write_certificate_verify(ssl); 2622*32b31808SJens Wiklander 2623*32b31808SJens Wiklander if (ret == 0) { 2624*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_FINISHED); 2625*32b31808SJens Wiklander } 2626*32b31808SJens Wiklander 2627*32b31808SJens Wiklander return ret; 2628*32b31808SJens Wiklander } 2629*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */ 2630*32b31808SJens Wiklander 2631*32b31808SJens Wiklander /* 2632*32b31808SJens Wiklander * Handler for MBEDTLS_SSL_CLIENT_FINISHED 2633*32b31808SJens Wiklander */ 2634*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2635*32b31808SJens Wiklander static int ssl_tls13_write_client_finished(mbedtls_ssl_context *ssl) 2636*32b31808SJens Wiklander { 2637*32b31808SJens Wiklander int ret; 2638*32b31808SJens Wiklander 2639*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_write_finished_message(ssl); 2640*32b31808SJens Wiklander if (ret != 0) { 2641*32b31808SJens Wiklander return ret; 2642*32b31808SJens Wiklander } 2643*32b31808SJens Wiklander 2644*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_compute_resumption_master_secret(ssl); 2645*32b31808SJens Wiklander if (ret != 0) { 2646*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_RET(1, 2647*32b31808SJens Wiklander "mbedtls_ssl_tls13_compute_resumption_master_secret ", ret); 2648*32b31808SJens Wiklander return ret; 2649*32b31808SJens Wiklander } 2650*32b31808SJens Wiklander 2651*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_FLUSH_BUFFERS); 2652*32b31808SJens Wiklander return 0; 2653*32b31808SJens Wiklander } 2654*32b31808SJens Wiklander 2655*32b31808SJens Wiklander /* 2656*32b31808SJens Wiklander * Handler for MBEDTLS_SSL_FLUSH_BUFFERS 2657*32b31808SJens Wiklander */ 2658*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2659*32b31808SJens Wiklander static int ssl_tls13_flush_buffers(mbedtls_ssl_context *ssl) 2660*32b31808SJens Wiklander { 2661*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done")); 2662*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_WRAPUP); 2663*32b31808SJens Wiklander return 0; 2664*32b31808SJens Wiklander } 2665*32b31808SJens Wiklander 2666*32b31808SJens Wiklander /* 2667*32b31808SJens Wiklander * Handler for MBEDTLS_SSL_HANDSHAKE_WRAPUP 2668*32b31808SJens Wiklander */ 2669*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2670*32b31808SJens Wiklander static int ssl_tls13_handshake_wrapup(mbedtls_ssl_context *ssl) 2671*32b31808SJens Wiklander { 2672*32b31808SJens Wiklander 2673*32b31808SJens Wiklander mbedtls_ssl_tls13_handshake_wrapup(ssl); 2674*32b31808SJens Wiklander 2675*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_OVER); 2676*32b31808SJens Wiklander return 0; 2677*32b31808SJens Wiklander } 2678*32b31808SJens Wiklander 2679*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_SESSION_TICKETS) 2680*32b31808SJens Wiklander 2681*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2682*32b31808SJens Wiklander static int ssl_tls13_parse_new_session_ticket_exts(mbedtls_ssl_context *ssl, 2683*32b31808SJens Wiklander const unsigned char *buf, 2684*32b31808SJens Wiklander const unsigned char *end) 2685*32b31808SJens Wiklander { 2686*32b31808SJens Wiklander mbedtls_ssl_handshake_params *handshake = ssl->handshake; 2687*32b31808SJens Wiklander const unsigned char *p = buf; 2688*32b31808SJens Wiklander 2689*32b31808SJens Wiklander 2690*32b31808SJens Wiklander handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE; 2691*32b31808SJens Wiklander 2692*32b31808SJens Wiklander while (p < end) { 2693*32b31808SJens Wiklander unsigned int extension_type; 2694*32b31808SJens Wiklander size_t extension_data_len; 2695*32b31808SJens Wiklander int ret; 2696*32b31808SJens Wiklander 2697*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 4); 2698*32b31808SJens Wiklander extension_type = MBEDTLS_GET_UINT16_BE(p, 0); 2699*32b31808SJens Wiklander extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2); 2700*32b31808SJens Wiklander p += 4; 2701*32b31808SJens Wiklander 2702*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extension_data_len); 2703*32b31808SJens Wiklander 2704*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_check_received_extension( 2705*32b31808SJens Wiklander ssl, MBEDTLS_SSL_HS_NEW_SESSION_TICKET, extension_type, 2706*32b31808SJens Wiklander MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_NST); 2707*32b31808SJens Wiklander if (ret != 0) { 2708*32b31808SJens Wiklander return ret; 2709*32b31808SJens Wiklander } 2710*32b31808SJens Wiklander 2711*32b31808SJens Wiklander switch (extension_type) { 2712*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_EARLY_DATA) 2713*32b31808SJens Wiklander case MBEDTLS_TLS_EXT_EARLY_DATA: 2714*32b31808SJens Wiklander if (extension_data_len != 4) { 2715*32b31808SJens Wiklander MBEDTLS_SSL_PEND_FATAL_ALERT( 2716*32b31808SJens Wiklander MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR, 2717*32b31808SJens Wiklander MBEDTLS_ERR_SSL_DECODE_ERROR); 2718*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_DECODE_ERROR; 2719*32b31808SJens Wiklander } 2720*32b31808SJens Wiklander if (ssl->session != NULL) { 2721*32b31808SJens Wiklander ssl->session->ticket_flags |= 2722*32b31808SJens Wiklander MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA; 2723*32b31808SJens Wiklander } 2724*32b31808SJens Wiklander break; 2725*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_EARLY_DATA */ 2726*32b31808SJens Wiklander 2727*32b31808SJens Wiklander default: 2728*32b31808SJens Wiklander MBEDTLS_SSL_PRINT_EXT( 2729*32b31808SJens Wiklander 3, MBEDTLS_SSL_HS_NEW_SESSION_TICKET, 2730*32b31808SJens Wiklander extension_type, "( ignored )"); 2731*32b31808SJens Wiklander break; 2732*32b31808SJens Wiklander } 2733*32b31808SJens Wiklander 2734*32b31808SJens Wiklander p += extension_data_len; 2735*32b31808SJens Wiklander } 2736*32b31808SJens Wiklander 2737*32b31808SJens Wiklander MBEDTLS_SSL_PRINT_EXTS(3, MBEDTLS_SSL_HS_NEW_SESSION_TICKET, 2738*32b31808SJens Wiklander handshake->received_extensions); 2739*32b31808SJens Wiklander 2740*32b31808SJens Wiklander return 0; 2741*32b31808SJens Wiklander } 2742*32b31808SJens Wiklander 2743*32b31808SJens Wiklander /* 2744*32b31808SJens Wiklander * From RFC8446, page 74 2745*32b31808SJens Wiklander * 2746*32b31808SJens Wiklander * struct { 2747*32b31808SJens Wiklander * uint32 ticket_lifetime; 2748*32b31808SJens Wiklander * uint32 ticket_age_add; 2749*32b31808SJens Wiklander * opaque ticket_nonce<0..255>; 2750*32b31808SJens Wiklander * opaque ticket<1..2^16-1>; 2751*32b31808SJens Wiklander * Extension extensions<0..2^16-2>; 2752*32b31808SJens Wiklander * } NewSessionTicket; 2753*32b31808SJens Wiklander * 2754*32b31808SJens Wiklander */ 2755*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2756*32b31808SJens Wiklander static int ssl_tls13_parse_new_session_ticket(mbedtls_ssl_context *ssl, 2757*32b31808SJens Wiklander unsigned char *buf, 2758*32b31808SJens Wiklander unsigned char *end, 2759*32b31808SJens Wiklander unsigned char **ticket_nonce, 2760*32b31808SJens Wiklander size_t *ticket_nonce_len) 2761*32b31808SJens Wiklander { 2762*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 2763*32b31808SJens Wiklander unsigned char *p = buf; 2764*32b31808SJens Wiklander mbedtls_ssl_session *session = ssl->session; 2765*32b31808SJens Wiklander size_t ticket_len; 2766*32b31808SJens Wiklander unsigned char *ticket; 2767*32b31808SJens Wiklander size_t extensions_len; 2768*32b31808SJens Wiklander 2769*32b31808SJens Wiklander *ticket_nonce = NULL; 2770*32b31808SJens Wiklander *ticket_nonce_len = 0; 2771*32b31808SJens Wiklander /* 2772*32b31808SJens Wiklander * ticket_lifetime 4 bytes 2773*32b31808SJens Wiklander * ticket_age_add 4 bytes 2774*32b31808SJens Wiklander * ticket_nonce_len 1 byte 2775*32b31808SJens Wiklander */ 2776*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 9); 2777*32b31808SJens Wiklander 2778*32b31808SJens Wiklander session->ticket_lifetime = MBEDTLS_GET_UINT32_BE(p, 0); 2779*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, 2780*32b31808SJens Wiklander ("ticket_lifetime: %u", 2781*32b31808SJens Wiklander (unsigned int) session->ticket_lifetime)); 2782*32b31808SJens Wiklander 2783*32b31808SJens Wiklander session->ticket_age_add = MBEDTLS_GET_UINT32_BE(p, 4); 2784*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(3, 2785*32b31808SJens Wiklander ("ticket_age_add: %u", 2786*32b31808SJens Wiklander (unsigned int) session->ticket_age_add)); 2787*32b31808SJens Wiklander 2788*32b31808SJens Wiklander *ticket_nonce_len = p[8]; 2789*32b31808SJens Wiklander p += 9; 2790*32b31808SJens Wiklander 2791*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, *ticket_nonce_len); 2792*32b31808SJens Wiklander *ticket_nonce = p; 2793*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "ticket_nonce:", *ticket_nonce, *ticket_nonce_len); 2794*32b31808SJens Wiklander p += *ticket_nonce_len; 2795*32b31808SJens Wiklander 2796*32b31808SJens Wiklander /* Ticket */ 2797*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2); 2798*32b31808SJens Wiklander ticket_len = MBEDTLS_GET_UINT16_BE(p, 0); 2799*32b31808SJens Wiklander p += 2; 2800*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, ticket_len); 2801*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "received ticket", p, ticket_len); 2802*32b31808SJens Wiklander 2803*32b31808SJens Wiklander /* Check if we previously received a ticket already. */ 2804*32b31808SJens Wiklander if (session->ticket != NULL || session->ticket_len > 0) { 2805*32b31808SJens Wiklander mbedtls_free(session->ticket); 2806*32b31808SJens Wiklander session->ticket = NULL; 2807*32b31808SJens Wiklander session->ticket_len = 0; 2808*32b31808SJens Wiklander } 2809*32b31808SJens Wiklander 2810*32b31808SJens Wiklander if ((ticket = mbedtls_calloc(1, ticket_len)) == NULL) { 2811*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("ticket alloc failed")); 2812*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_ALLOC_FAILED; 2813*32b31808SJens Wiklander } 2814*32b31808SJens Wiklander memcpy(ticket, p, ticket_len); 2815*32b31808SJens Wiklander p += ticket_len; 2816*32b31808SJens Wiklander session->ticket = ticket; 2817*32b31808SJens Wiklander session->ticket_len = ticket_len; 2818*32b31808SJens Wiklander 2819*32b31808SJens Wiklander /* Clear all flags in ticket_flags */ 2820*32b31808SJens Wiklander mbedtls_ssl_session_clear_ticket_flags( 2821*32b31808SJens Wiklander session, MBEDTLS_SSL_TLS1_3_TICKET_FLAGS_MASK); 2822*32b31808SJens Wiklander 2823*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2); 2824*32b31808SJens Wiklander extensions_len = MBEDTLS_GET_UINT16_BE(p, 0); 2825*32b31808SJens Wiklander p += 2; 2826*32b31808SJens Wiklander MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len); 2827*32b31808SJens Wiklander 2828*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "ticket extension", p, extensions_len); 2829*32b31808SJens Wiklander 2830*32b31808SJens Wiklander ret = ssl_tls13_parse_new_session_ticket_exts(ssl, p, p + extensions_len); 2831*32b31808SJens Wiklander if (ret != 0) { 2832*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_RET(1, 2833*32b31808SJens Wiklander "ssl_tls13_parse_new_session_ticket_exts", 2834*32b31808SJens Wiklander ret); 2835*32b31808SJens Wiklander return ret; 2836*32b31808SJens Wiklander } 2837*32b31808SJens Wiklander 2838*32b31808SJens Wiklander /* session has been updated, allow export */ 2839*32b31808SJens Wiklander session->exported = 0; 2840*32b31808SJens Wiklander 2841*32b31808SJens Wiklander return 0; 2842*32b31808SJens Wiklander } 2843*32b31808SJens Wiklander 2844*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2845*32b31808SJens Wiklander static int ssl_tls13_postprocess_new_session_ticket(mbedtls_ssl_context *ssl, 2846*32b31808SJens Wiklander unsigned char *ticket_nonce, 2847*32b31808SJens Wiklander size_t ticket_nonce_len) 2848*32b31808SJens Wiklander { 2849*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 2850*32b31808SJens Wiklander mbedtls_ssl_session *session = ssl->session; 2851*32b31808SJens Wiklander const mbedtls_ssl_ciphersuite_t *ciphersuite_info; 2852*32b31808SJens Wiklander psa_algorithm_t psa_hash_alg; 2853*32b31808SJens Wiklander int hash_length; 2854*32b31808SJens Wiklander 2855*32b31808SJens Wiklander #if defined(MBEDTLS_HAVE_TIME) 2856*32b31808SJens Wiklander /* Store ticket creation time */ 2857*32b31808SJens Wiklander session->ticket_received = mbedtls_time(NULL); 2858*32b31808SJens Wiklander #endif 2859*32b31808SJens Wiklander 2860*32b31808SJens Wiklander ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(session->ciphersuite); 2861*32b31808SJens Wiklander if (ciphersuite_info == NULL) { 2862*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen")); 2863*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_INTERNAL_ERROR; 2864*32b31808SJens Wiklander } 2865*32b31808SJens Wiklander 2866*32b31808SJens Wiklander psa_hash_alg = mbedtls_psa_translate_md(ciphersuite_info->mac); 2867*32b31808SJens Wiklander hash_length = PSA_HASH_LENGTH(psa_hash_alg); 2868*32b31808SJens Wiklander if (hash_length == -1 || 2869*32b31808SJens Wiklander (size_t) hash_length > sizeof(session->resumption_key)) { 2870*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_INTERNAL_ERROR; 2871*32b31808SJens Wiklander } 2872*32b31808SJens Wiklander 2873*32b31808SJens Wiklander 2874*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "resumption_master_secret", 2875*32b31808SJens Wiklander session->app_secrets.resumption_master_secret, 2876*32b31808SJens Wiklander hash_length); 2877*32b31808SJens Wiklander 2878*32b31808SJens Wiklander /* Compute resumption key 2879*32b31808SJens Wiklander * 2880*32b31808SJens Wiklander * HKDF-Expand-Label( resumption_master_secret, 2881*32b31808SJens Wiklander * "resumption", ticket_nonce, Hash.length ) 2882*32b31808SJens Wiklander */ 2883*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_hkdf_expand_label( 2884*32b31808SJens Wiklander psa_hash_alg, 2885*32b31808SJens Wiklander session->app_secrets.resumption_master_secret, 2886*32b31808SJens Wiklander hash_length, 2887*32b31808SJens Wiklander MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(resumption), 2888*32b31808SJens Wiklander ticket_nonce, 2889*32b31808SJens Wiklander ticket_nonce_len, 2890*32b31808SJens Wiklander session->resumption_key, 2891*32b31808SJens Wiklander hash_length); 2892*32b31808SJens Wiklander 2893*32b31808SJens Wiklander if (ret != 0) { 2894*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_RET(2, 2895*32b31808SJens Wiklander "Creating the ticket-resumed PSK failed", 2896*32b31808SJens Wiklander ret); 2897*32b31808SJens Wiklander return ret; 2898*32b31808SJens Wiklander } 2899*32b31808SJens Wiklander 2900*32b31808SJens Wiklander session->resumption_key_len = hash_length; 2901*32b31808SJens Wiklander 2902*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_BUF(3, "Ticket-resumed PSK", 2903*32b31808SJens Wiklander session->resumption_key, 2904*32b31808SJens Wiklander session->resumption_key_len); 2905*32b31808SJens Wiklander 2906*32b31808SJens Wiklander /* Set ticket_flags depends on the selected key exchange modes */ 2907*32b31808SJens Wiklander mbedtls_ssl_session_set_ticket_flags( 2908*32b31808SJens Wiklander session, ssl->conf->tls13_kex_modes); 2909*32b31808SJens Wiklander MBEDTLS_SSL_PRINT_TICKET_FLAGS(4, session->ticket_flags); 2910*32b31808SJens Wiklander 2911*32b31808SJens Wiklander return 0; 2912*32b31808SJens Wiklander } 2913*32b31808SJens Wiklander 2914*32b31808SJens Wiklander /* 2915*32b31808SJens Wiklander * Handler for MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET 2916*32b31808SJens Wiklander */ 2917*32b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL 2918*32b31808SJens Wiklander static int ssl_tls13_process_new_session_ticket(mbedtls_ssl_context *ssl) 2919*32b31808SJens Wiklander { 2920*32b31808SJens Wiklander int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 2921*32b31808SJens Wiklander unsigned char *buf; 2922*32b31808SJens Wiklander size_t buf_len; 2923*32b31808SJens Wiklander unsigned char *ticket_nonce; 2924*32b31808SJens Wiklander size_t ticket_nonce_len; 2925*32b31808SJens Wiklander 2926*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse new session ticket")); 2927*32b31808SJens Wiklander 2928*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg( 2929*32b31808SJens Wiklander ssl, MBEDTLS_SSL_HS_NEW_SESSION_TICKET, 2930*32b31808SJens Wiklander &buf, &buf_len)); 2931*32b31808SJens Wiklander 2932*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_new_session_ticket( 2933*32b31808SJens Wiklander ssl, buf, buf + buf_len, 2934*32b31808SJens Wiklander &ticket_nonce, &ticket_nonce_len)); 2935*32b31808SJens Wiklander 2936*32b31808SJens Wiklander MBEDTLS_SSL_PROC_CHK(ssl_tls13_postprocess_new_session_ticket( 2937*32b31808SJens Wiklander ssl, ticket_nonce, ticket_nonce_len)); 2938*32b31808SJens Wiklander 2939*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_OVER); 2940*32b31808SJens Wiklander 2941*32b31808SJens Wiklander cleanup: 2942*32b31808SJens Wiklander 2943*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse new session ticket")); 2944*32b31808SJens Wiklander return ret; 2945*32b31808SJens Wiklander } 2946*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_SESSION_TICKETS */ 2947*32b31808SJens Wiklander 2948*32b31808SJens Wiklander int mbedtls_ssl_tls13_handshake_client_step(mbedtls_ssl_context *ssl) 2949*32b31808SJens Wiklander { 2950*32b31808SJens Wiklander int ret = 0; 2951*32b31808SJens Wiklander 2952*32b31808SJens Wiklander switch (ssl->state) { 2953*32b31808SJens Wiklander case MBEDTLS_SSL_HELLO_REQUEST: 2954*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO); 2955*32b31808SJens Wiklander break; 2956*32b31808SJens Wiklander 2957*32b31808SJens Wiklander case MBEDTLS_SSL_CLIENT_HELLO: 2958*32b31808SJens Wiklander ret = mbedtls_ssl_write_client_hello(ssl); 2959*32b31808SJens Wiklander break; 2960*32b31808SJens Wiklander 2961*32b31808SJens Wiklander case MBEDTLS_SSL_SERVER_HELLO: 2962*32b31808SJens Wiklander ret = ssl_tls13_process_server_hello(ssl); 2963*32b31808SJens Wiklander break; 2964*32b31808SJens Wiklander 2965*32b31808SJens Wiklander case MBEDTLS_SSL_ENCRYPTED_EXTENSIONS: 2966*32b31808SJens Wiklander ret = ssl_tls13_process_encrypted_extensions(ssl); 2967*32b31808SJens Wiklander break; 2968*32b31808SJens Wiklander 2969*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED) 2970*32b31808SJens Wiklander case MBEDTLS_SSL_CERTIFICATE_REQUEST: 2971*32b31808SJens Wiklander ret = ssl_tls13_process_certificate_request(ssl); 2972*32b31808SJens Wiklander break; 2973*32b31808SJens Wiklander 2974*32b31808SJens Wiklander case MBEDTLS_SSL_SERVER_CERTIFICATE: 2975*32b31808SJens Wiklander ret = ssl_tls13_process_server_certificate(ssl); 2976*32b31808SJens Wiklander break; 2977*32b31808SJens Wiklander 2978*32b31808SJens Wiklander case MBEDTLS_SSL_CERTIFICATE_VERIFY: 2979*32b31808SJens Wiklander ret = ssl_tls13_process_certificate_verify(ssl); 2980*32b31808SJens Wiklander break; 2981*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */ 2982*32b31808SJens Wiklander 2983*32b31808SJens Wiklander case MBEDTLS_SSL_SERVER_FINISHED: 2984*32b31808SJens Wiklander ret = ssl_tls13_process_server_finished(ssl); 2985*32b31808SJens Wiklander break; 2986*32b31808SJens Wiklander 2987*32b31808SJens Wiklander case MBEDTLS_SSL_END_OF_EARLY_DATA: 2988*32b31808SJens Wiklander ret = ssl_tls13_write_end_of_early_data(ssl); 2989*32b31808SJens Wiklander break; 2990*32b31808SJens Wiklander 2991*32b31808SJens Wiklander case MBEDTLS_SSL_CLIENT_CERTIFICATE: 2992*32b31808SJens Wiklander ret = ssl_tls13_write_client_certificate(ssl); 2993*32b31808SJens Wiklander break; 2994*32b31808SJens Wiklander 2995*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED) 2996*32b31808SJens Wiklander case MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY: 2997*32b31808SJens Wiklander ret = ssl_tls13_write_client_certificate_verify(ssl); 2998*32b31808SJens Wiklander break; 2999*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */ 3000*32b31808SJens Wiklander 3001*32b31808SJens Wiklander case MBEDTLS_SSL_CLIENT_FINISHED: 3002*32b31808SJens Wiklander ret = ssl_tls13_write_client_finished(ssl); 3003*32b31808SJens Wiklander break; 3004*32b31808SJens Wiklander 3005*32b31808SJens Wiklander case MBEDTLS_SSL_FLUSH_BUFFERS: 3006*32b31808SJens Wiklander ret = ssl_tls13_flush_buffers(ssl); 3007*32b31808SJens Wiklander break; 3008*32b31808SJens Wiklander 3009*32b31808SJens Wiklander case MBEDTLS_SSL_HANDSHAKE_WRAPUP: 3010*32b31808SJens Wiklander ret = ssl_tls13_handshake_wrapup(ssl); 3011*32b31808SJens Wiklander break; 3012*32b31808SJens Wiklander 3013*32b31808SJens Wiklander /* 3014*32b31808SJens Wiklander * Injection of dummy-CCS's for middlebox compatibility 3015*32b31808SJens Wiklander */ 3016*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE) 3017*32b31808SJens Wiklander case MBEDTLS_SSL_CLIENT_CCS_BEFORE_2ND_CLIENT_HELLO: 3018*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_write_change_cipher_spec(ssl); 3019*32b31808SJens Wiklander if (ret == 0) { 3020*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO); 3021*32b31808SJens Wiklander } 3022*32b31808SJens Wiklander break; 3023*32b31808SJens Wiklander 3024*32b31808SJens Wiklander case MBEDTLS_SSL_CLIENT_CCS_AFTER_SERVER_FINISHED: 3025*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_write_change_cipher_spec(ssl); 3026*32b31808SJens Wiklander if (ret == 0) { 3027*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE); 3028*32b31808SJens Wiklander } 3029*32b31808SJens Wiklander break; 3030*32b31808SJens Wiklander 3031*32b31808SJens Wiklander case MBEDTLS_SSL_CLIENT_CCS_AFTER_CLIENT_HELLO: 3032*32b31808SJens Wiklander ret = mbedtls_ssl_tls13_write_change_cipher_spec(ssl); 3033*32b31808SJens Wiklander if (ret == 0) { 3034*32b31808SJens Wiklander mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_HELLO); 3035*32b31808SJens Wiklander 3036*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_EARLY_DATA) 3037*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG( 3038*32b31808SJens Wiklander 1, ("Switch to early data keys for outbound traffic")); 3039*32b31808SJens Wiklander mbedtls_ssl_set_outbound_transform( 3040*32b31808SJens Wiklander ssl, ssl->handshake->transform_earlydata); 3041*32b31808SJens Wiklander #endif 3042*32b31808SJens Wiklander } 3043*32b31808SJens Wiklander break; 3044*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */ 3045*32b31808SJens Wiklander 3046*32b31808SJens Wiklander #if defined(MBEDTLS_SSL_SESSION_TICKETS) 3047*32b31808SJens Wiklander case MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET: 3048*32b31808SJens Wiklander ret = ssl_tls13_process_new_session_ticket(ssl); 3049*32b31808SJens Wiklander if (ret != 0) { 3050*32b31808SJens Wiklander break; 3051*32b31808SJens Wiklander } 3052*32b31808SJens Wiklander ret = MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET; 3053*32b31808SJens Wiklander break; 3054*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_SESSION_TICKETS */ 3055*32b31808SJens Wiklander 3056*32b31808SJens Wiklander default: 3057*32b31808SJens Wiklander MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state)); 3058*32b31808SJens Wiklander return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; 3059*32b31808SJens Wiklander } 3060*32b31808SJens Wiklander 3061*32b31808SJens Wiklander return ret; 3062*32b31808SJens Wiklander } 3063*32b31808SJens Wiklander 3064*32b31808SJens Wiklander #endif /* MBEDTLS_SSL_CLI_C && MBEDTLS_SSL_PROTO_TLS1_3 */ 3065