xref: /optee_os/lib/libmbedtls/mbedtls/library/ssl_tls13_client.c (revision 32b3180828fa15a49ccc86ecb4be9d274c140c89)
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