1/*
2 *  TLS 1.3 server-side functions
3 *
4 *  Copyright The Mbed TLS Contributors
5 *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6 */
7
8#include "common.h"
9
10#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
11
12#include "debug_internal.h"
13#include "mbedtls/error.h"
14#include "mbedtls/platform.h"
15#include "mbedtls/constant_time.h"
16#include "mbedtls/oid.h"
17#include "mbedtls/psa_util.h"
18
19#include "ssl_misc.h"
20#include "ssl_tls13_keys.h"
21#include "ssl_debug_helpers.h"
22
23
24static const mbedtls_ssl_ciphersuite_t *ssl_tls13_validate_peer_ciphersuite(
25    mbedtls_ssl_context *ssl,
26    unsigned int cipher_suite)
27{
28    const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
29    if (!mbedtls_ssl_tls13_cipher_suite_is_offered(ssl, cipher_suite)) {
30        return NULL;
31    }
32
33    ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(cipher_suite);
34    if ((mbedtls_ssl_validate_ciphersuite(ssl, ciphersuite_info,
35                                          ssl->tls_version,
36                                          ssl->tls_version) != 0)) {
37        return NULL;
38    }
39    return ciphersuite_info;
40}
41
42static void ssl_tls13_select_ciphersuite(
43    mbedtls_ssl_context *ssl,
44    const unsigned char *cipher_suites,
45    const unsigned char *cipher_suites_end,
46    int psk_ciphersuite_id,
47    psa_algorithm_t psk_hash_alg,
48    const mbedtls_ssl_ciphersuite_t **selected_ciphersuite_info)
49{
50    *selected_ciphersuite_info = NULL;
51
52    /*
53     * In a compliant ClientHello the byte-length of the list of ciphersuites
54     * is even and this function relies on this fact. This should have been
55     * checked in the main ClientHello parsing function. Double check here.
56     */
57    if ((cipher_suites_end - cipher_suites) & 1) {
58        return;
59    }
60
61    for (const unsigned char *p = cipher_suites;
62         p < cipher_suites_end; p += 2) {
63        /*
64         * "cipher_suites_end - p is even" is an invariant of the loop. As
65         * cipher_suites_end - p > 0, we have cipher_suites_end - p >= 2 and it
66         * is thus safe to read two bytes.
67         */
68        uint16_t id = MBEDTLS_GET_UINT16_BE(p, 0);
69
70        const mbedtls_ssl_ciphersuite_t *info =
71            ssl_tls13_validate_peer_ciphersuite(ssl, id);
72        if (info == NULL) {
73            continue;
74        }
75
76        /*
77         * If a valid PSK ciphersuite identifier has been passed in, we want
78         * an exact match.
79         */
80        if (psk_ciphersuite_id != 0) {
81            if (id != psk_ciphersuite_id) {
82                continue;
83            }
84        } else if (psk_hash_alg != PSA_ALG_NONE) {
85            if (mbedtls_md_psa_alg_from_type((mbedtls_md_type_t) info->mac) !=
86                psk_hash_alg) {
87                continue;
88            }
89        }
90
91        *selected_ciphersuite_info = info;
92        return;
93    }
94
95    MBEDTLS_SSL_DEBUG_MSG(2, ("No matched ciphersuite, psk_ciphersuite_id=%x, psk_hash_alg=%x",
96                              (unsigned) psk_ciphersuite_id, psk_hash_alg));
97}
98
99#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
100/* From RFC 8446:
101 *
102 *   enum { psk_ke(0), psk_dhe_ke(1), (255) } PskKeyExchangeMode;
103 *   struct {
104 *       PskKeyExchangeMode ke_modes<1..255>;
105 *   } PskKeyExchangeModes;
106 */
107MBEDTLS_CHECK_RETURN_CRITICAL
108static int ssl_tls13_parse_key_exchange_modes_ext(mbedtls_ssl_context *ssl,
109                                                  const unsigned char *buf,
110                                                  const unsigned char *end)
111{
112    const unsigned char *p = buf;
113    size_t ke_modes_len;
114    int ke_modes = 0;
115
116    /* Read ke_modes length (1 Byte) */
117    MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 1);
118    ke_modes_len = *p++;
119    /* Currently, there are only two PSK modes, so even without looking
120     * at the content, something's wrong if the list has more than 2 items. */
121    if (ke_modes_len > 2) {
122        MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
123                                     MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
124        return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
125    }
126
127    MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, ke_modes_len);
128
129    while (ke_modes_len-- != 0) {
130        switch (*p++) {
131            case MBEDTLS_SSL_TLS1_3_PSK_MODE_PURE:
132                ke_modes |= MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK;
133                MBEDTLS_SSL_DEBUG_MSG(3, ("Found PSK KEX MODE"));
134                break;
135            case MBEDTLS_SSL_TLS1_3_PSK_MODE_ECDHE:
136                ke_modes |= MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL;
137                MBEDTLS_SSL_DEBUG_MSG(3, ("Found PSK_EPHEMERAL KEX MODE"));
138                break;
139            default:
140                MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
141                                             MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
142                return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
143        }
144    }
145
146    ssl->handshake->tls13_kex_modes = ke_modes;
147    return 0;
148}
149
150/*
151 * Non-error return values of
152 * ssl_tls13_offered_psks_check_identity_match_ticket() and
153 * ssl_tls13_offered_psks_check_identity_match(). They are positive to
154 * not collide with error codes that are negative. Zero
155 * (SSL_TLS1_3_PSK_IDENTITY_MATCH) in case of success as it may be propagated
156 * up by the callers of this function as a generic success condition.
157 *
158 * The return value SSL_TLS1_3_PSK_IDENTITY_MATCH_BUT_PSK_NOT_USABLE means
159 * that the pre-shared-key identity matches that of a ticket or an externally-
160 * provisioned pre-shared-key. We have thus been able to retrieve the
161 * attributes of the pre-shared-key but at least one of them does not meet
162 * some criteria and the pre-shared-key cannot be used. For example, a ticket
163 * is expired or its version is not TLS 1.3. Note eventually that the return
164 * value SSL_TLS1_3_PSK_IDENTITY_MATCH_BUT_PSK_NOT_USABLE does not have
165 * anything to do with binder check. A binder check is done only when a
166 * suitable pre-shared-key has been selected and only for that selected
167 * pre-shared-key: if the binder check fails, we fail the handshake and we do
168 * not try to find another pre-shared-key for which the binder check would
169 * succeed as recommended by the specification.
170 */
171#define SSL_TLS1_3_PSK_IDENTITY_DOES_NOT_MATCH 2
172#define SSL_TLS1_3_PSK_IDENTITY_MATCH_BUT_PSK_NOT_USABLE 1
173#define SSL_TLS1_3_PSK_IDENTITY_MATCH 0
174
175#if defined(MBEDTLS_SSL_SESSION_TICKETS)
176MBEDTLS_CHECK_RETURN_CRITICAL
177static int ssl_tls13_key_exchange_is_psk_available(mbedtls_ssl_context *ssl);
178MBEDTLS_CHECK_RETURN_CRITICAL
179static int ssl_tls13_key_exchange_is_psk_ephemeral_available(mbedtls_ssl_context *ssl);
180
181MBEDTLS_CHECK_RETURN_CRITICAL
182static int ssl_tls13_offered_psks_check_identity_match_ticket(
183    mbedtls_ssl_context *ssl,
184    const unsigned char *identity,
185    size_t identity_len,
186    uint32_t obfuscated_ticket_age,
187    mbedtls_ssl_session *session)
188{
189    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
190    unsigned char *ticket_buffer;
191#if defined(MBEDTLS_HAVE_TIME)
192    mbedtls_ms_time_t now;
193    mbedtls_ms_time_t server_age;
194    uint32_t client_age;
195    mbedtls_ms_time_t age_diff;
196#endif
197
198    ((void) obfuscated_ticket_age);
199
200    MBEDTLS_SSL_DEBUG_MSG(2, ("=> check_identity_match_ticket"));
201
202    /* Ticket parser is not configured, Skip */
203    if (ssl->conf->f_ticket_parse == NULL || identity_len == 0) {
204        return SSL_TLS1_3_PSK_IDENTITY_DOES_NOT_MATCH;
205    }
206
207    /* We create a copy of the encrypted ticket since the ticket parsing
208     * function is allowed to use its input buffer as an output buffer
209     * (in-place decryption). We do, however, need the original buffer for
210     * computing the PSK binder value.
211     */
212    ticket_buffer = mbedtls_calloc(1, identity_len);
213    if (ticket_buffer == NULL) {
214        return MBEDTLS_ERR_SSL_ALLOC_FAILED;
215    }
216    memcpy(ticket_buffer, identity, identity_len);
217
218    ret = ssl->conf->f_ticket_parse(ssl->conf->p_ticket,
219                                    session,
220                                    ticket_buffer, identity_len);
221    switch (ret) {
222        case 0:
223            ret = SSL_TLS1_3_PSK_IDENTITY_MATCH;
224            break;
225
226        case MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED:
227            MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is expired"));
228            ret = SSL_TLS1_3_PSK_IDENTITY_MATCH_BUT_PSK_NOT_USABLE;
229            break;
230
231        case MBEDTLS_ERR_SSL_INVALID_MAC:
232            MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is not authentic"));
233            ret = SSL_TLS1_3_PSK_IDENTITY_DOES_NOT_MATCH;
234            break;
235
236        default:
237            MBEDTLS_SSL_DEBUG_RET(1, "ticket_parse", ret);
238            ret = SSL_TLS1_3_PSK_IDENTITY_DOES_NOT_MATCH;
239    }
240
241    /* We delete the temporary buffer */
242    mbedtls_free(ticket_buffer);
243
244    if (ret != SSL_TLS1_3_PSK_IDENTITY_MATCH) {
245        goto exit;
246    }
247
248    /*
249     * The identity matches that of a ticket. Now check that it has suitable
250     * attributes and bet it will not be the case.
251     */
252    ret = SSL_TLS1_3_PSK_IDENTITY_MATCH_BUT_PSK_NOT_USABLE;
253
254    if (session->tls_version != MBEDTLS_SSL_VERSION_TLS1_3) {
255        MBEDTLS_SSL_DEBUG_MSG(3, ("Ticket TLS version is not 1.3."));
256        goto exit;
257    }
258
259#if defined(MBEDTLS_HAVE_TIME)
260    now = mbedtls_ms_time();
261
262    if (now < session->ticket_creation_time) {
263        MBEDTLS_SSL_DEBUG_MSG(
264            3, ("Invalid ticket creation time ( now = %" MBEDTLS_PRINTF_MS_TIME
265                ", creation_time = %" MBEDTLS_PRINTF_MS_TIME " )",
266                now, session->ticket_creation_time));
267        goto exit;
268    }
269
270    server_age = now - session->ticket_creation_time;
271
272    /* RFC 8446 section 4.6.1
273     *
274     * Servers MUST NOT use any value greater than 604800 seconds (7 days).
275     *
276     * RFC 8446 section 4.2.11.1
277     *
278     * Clients MUST NOT attempt to use tickets which have ages greater than
279     * the "ticket_lifetime" value which was provided with the ticket.
280     *
281     */
282    if (server_age > MBEDTLS_SSL_TLS1_3_MAX_ALLOWED_TICKET_LIFETIME * 1000) {
283        MBEDTLS_SSL_DEBUG_MSG(
284            3, ("Ticket age exceeds limitation ticket_age = %" MBEDTLS_PRINTF_MS_TIME,
285                server_age));
286        goto exit;
287    }
288
289    /* RFC 8446 section 4.2.10
290     *
291     * For PSKs provisioned via NewSessionTicket, a server MUST validate that
292     * the ticket age for the selected PSK identity (computed by subtracting
293     * ticket_age_add from PskIdentity.obfuscated_ticket_age modulo 2^32) is
294     * within a small tolerance of the time since the ticket was issued.
295     *
296     * NOTE: The typical accuracy of an RTC crystal is ��100 to ��20 parts per
297     *       million (360 to 72 milliseconds per hour). Default tolerance
298     *       window is 6s, thus in the worst case clients and servers must
299     *       sync up their system time every 6000/360/2~=8 hours.
300     */
301    client_age = obfuscated_ticket_age - session->ticket_age_add;
302    age_diff = server_age - (mbedtls_ms_time_t) client_age;
303    if (age_diff < -MBEDTLS_SSL_TLS1_3_TICKET_AGE_TOLERANCE ||
304        age_diff > MBEDTLS_SSL_TLS1_3_TICKET_AGE_TOLERANCE) {
305        MBEDTLS_SSL_DEBUG_MSG(
306            3, ("Ticket age outside tolerance window ( diff = %"
307                MBEDTLS_PRINTF_MS_TIME ")",
308                age_diff));
309        goto exit;
310    }
311#endif /* MBEDTLS_HAVE_TIME */
312
313    /*
314     * All good, we have found a suitable ticket.
315     */
316    ret = SSL_TLS1_3_PSK_IDENTITY_MATCH;
317
318exit:
319    if (ret != SSL_TLS1_3_PSK_IDENTITY_MATCH) {
320        mbedtls_ssl_session_free(session);
321    }
322
323    MBEDTLS_SSL_DEBUG_MSG(2, ("<= check_identity_match_ticket"));
324    return ret;
325}
326#endif /* MBEDTLS_SSL_SESSION_TICKETS */
327
328MBEDTLS_CHECK_RETURN_CRITICAL
329static int ssl_tls13_offered_psks_check_identity_match(
330    mbedtls_ssl_context *ssl,
331    const unsigned char *identity,
332    size_t identity_len,
333    uint32_t obfuscated_ticket_age,
334    int *psk_type,
335    mbedtls_ssl_session *session)
336{
337    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
338
339    ((void) session);
340    ((void) obfuscated_ticket_age);
341    *psk_type = MBEDTLS_SSL_TLS1_3_PSK_EXTERNAL;
342
343    MBEDTLS_SSL_DEBUG_BUF(4, "identity", identity, identity_len);
344
345#if defined(MBEDTLS_SSL_SESSION_TICKETS)
346    ret = ssl_tls13_offered_psks_check_identity_match_ticket(
347        ssl, identity, identity_len, obfuscated_ticket_age, session);
348    if (ret == SSL_TLS1_3_PSK_IDENTITY_MATCH) {
349        *psk_type = MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION;
350        ret = mbedtls_ssl_set_hs_psk(ssl,
351                                     session->resumption_key,
352                                     session->resumption_key_len);
353        if (ret != 0) {
354            MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_set_hs_psk", ret);
355            return ret;
356        }
357
358        MBEDTLS_SSL_DEBUG_BUF(4, "Ticket-resumed PSK:",
359                              session->resumption_key,
360                              session->resumption_key_len);
361        MBEDTLS_SSL_DEBUG_MSG(4, ("ticket: obfuscated_ticket_age: %u",
362                                  (unsigned) obfuscated_ticket_age));
363        return SSL_TLS1_3_PSK_IDENTITY_MATCH;
364    } else if (ret == SSL_TLS1_3_PSK_IDENTITY_MATCH_BUT_PSK_NOT_USABLE) {
365        return SSL_TLS1_3_PSK_IDENTITY_MATCH_BUT_PSK_NOT_USABLE;
366    }
367#endif /* MBEDTLS_SSL_SESSION_TICKETS */
368
369    /* Check identity with external configured function */
370    if (ssl->conf->f_psk != NULL) {
371        if (ssl->conf->f_psk(
372                ssl->conf->p_psk, ssl, identity, identity_len) == 0) {
373            return SSL_TLS1_3_PSK_IDENTITY_MATCH;
374        }
375        return SSL_TLS1_3_PSK_IDENTITY_DOES_NOT_MATCH;
376    }
377
378    MBEDTLS_SSL_DEBUG_BUF(5, "identity", identity, identity_len);
379    /* Check identity with pre-configured psk */
380    if (ssl->conf->psk_identity != NULL &&
381        identity_len == ssl->conf->psk_identity_len &&
382        mbedtls_ct_memcmp(ssl->conf->psk_identity,
383                          identity, identity_len) == 0) {
384        ret = mbedtls_ssl_set_hs_psk(ssl, ssl->conf->psk, ssl->conf->psk_len);
385        if (ret != 0) {
386            MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_set_hs_psk", ret);
387            return ret;
388        }
389        return SSL_TLS1_3_PSK_IDENTITY_MATCH;
390    }
391
392    return SSL_TLS1_3_PSK_IDENTITY_DOES_NOT_MATCH;
393}
394
395/*
396 * Non-error return values of ssl_tls13_offered_psks_check_binder_match().
397 * They are positive to not collide with error codes that are negative. Zero
398 * (SSL_TLS1_3_BINDER_MATCH) in case of success as it may be propagated up
399 * by the callers of this function as a generic success condition.
400 */
401#define SSL_TLS1_3_BINDER_DOES_NOT_MATCH 1
402#define SSL_TLS1_3_BINDER_MATCH 0
403MBEDTLS_CHECK_RETURN_CRITICAL
404static int ssl_tls13_offered_psks_check_binder_match(
405    mbedtls_ssl_context *ssl,
406    const unsigned char *binder, size_t binder_len,
407    int psk_type, psa_algorithm_t psk_hash_alg)
408{
409    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
410
411    unsigned char transcript[PSA_HASH_MAX_SIZE];
412    size_t transcript_len;
413    unsigned char *psk;
414    size_t psk_len;
415    unsigned char server_computed_binder[PSA_HASH_MAX_SIZE];
416
417    if (binder_len != PSA_HASH_LENGTH(psk_hash_alg)) {
418        return SSL_TLS1_3_BINDER_DOES_NOT_MATCH;
419    }
420
421    /* Get current state of handshake transcript. */
422    ret = mbedtls_ssl_get_handshake_transcript(
423        ssl, mbedtls_md_type_from_psa_alg(psk_hash_alg),
424        transcript, sizeof(transcript), &transcript_len);
425    if (ret != 0) {
426        return ret;
427    }
428
429    ret = mbedtls_ssl_tls13_export_handshake_psk(ssl, &psk, &psk_len);
430    if (ret != 0) {
431        return ret;
432    }
433
434    ret = mbedtls_ssl_tls13_create_psk_binder(ssl, psk_hash_alg,
435                                              psk, psk_len, psk_type,
436                                              transcript,
437                                              server_computed_binder);
438#if defined(MBEDTLS_USE_PSA_CRYPTO)
439    mbedtls_free((void *) psk);
440#endif
441    if (ret != 0) {
442        MBEDTLS_SSL_DEBUG_MSG(1, ("PSK binder calculation failed."));
443        return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
444    }
445
446    MBEDTLS_SSL_DEBUG_BUF(3, "psk binder ( computed ): ",
447                          server_computed_binder, transcript_len);
448    MBEDTLS_SSL_DEBUG_BUF(3, "psk binder ( received ): ", binder, binder_len);
449
450    if (mbedtls_ct_memcmp(server_computed_binder,
451                          binder,
452                          PSA_HASH_LENGTH(psk_hash_alg)) == 0) {
453        return SSL_TLS1_3_BINDER_MATCH;
454    }
455
456    mbedtls_platform_zeroize(server_computed_binder,
457                             sizeof(server_computed_binder));
458    return SSL_TLS1_3_BINDER_DOES_NOT_MATCH;
459}
460
461#if defined(MBEDTLS_SSL_SESSION_TICKETS)
462MBEDTLS_CHECK_RETURN_CRITICAL
463static int ssl_tls13_session_copy_ticket(mbedtls_ssl_session *dst,
464                                         const mbedtls_ssl_session *src)
465{
466    dst->ticket_age_add = src->ticket_age_add;
467    dst->ticket_flags = src->ticket_flags;
468    dst->resumption_key_len = src->resumption_key_len;
469    if (src->resumption_key_len == 0) {
470        return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
471    }
472    memcpy(dst->resumption_key, src->resumption_key, src->resumption_key_len);
473
474#if defined(MBEDTLS_SSL_EARLY_DATA)
475    dst->max_early_data_size = src->max_early_data_size;
476
477#if defined(MBEDTLS_SSL_ALPN)
478    int ret = mbedtls_ssl_session_set_ticket_alpn(dst, src->ticket_alpn);
479    if (ret != 0) {
480        return ret;
481    }
482#endif /* MBEDTLS_SSL_ALPN */
483#endif /* MBEDTLS_SSL_EARLY_DATA*/
484
485    return 0;
486}
487#endif /* MBEDTLS_SSL_SESSION_TICKETS */
488
489struct psk_attributes {
490    int type;
491    int key_exchange_mode;
492    const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
493};
494#define PSK_ATTRIBUTES_INIT { 0, 0, NULL }
495
496/* Parser for pre_shared_key extension in client hello
497 *    struct {
498 *        opaque identity<1..2^16-1>;
499 *        uint32 obfuscated_ticket_age;
500 *    } PskIdentity;
501 *
502 *    opaque PskBinderEntry<32..255>;
503 *
504 *    struct {
505 *        PskIdentity identities<7..2^16-1>;
506 *        PskBinderEntry binders<33..2^16-1>;
507 *    } OfferedPsks;
508 *
509 *    struct {
510 *        select (Handshake.msg_type) {
511 *            case client_hello: OfferedPsks;
512 *            ....
513 *        };
514 *    } PreSharedKeyExtension;
515 */
516MBEDTLS_CHECK_RETURN_CRITICAL
517static int ssl_tls13_parse_pre_shared_key_ext(
518    mbedtls_ssl_context *ssl,
519    const unsigned char *pre_shared_key_ext,
520    const unsigned char *pre_shared_key_ext_end,
521    const unsigned char *ciphersuites,
522    const unsigned char *ciphersuites_end,
523    struct psk_attributes *psk)
524{
525    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
526    const unsigned char *identities = pre_shared_key_ext;
527    const unsigned char *p_identity_len;
528    size_t identities_len;
529    const unsigned char *identities_end;
530    const unsigned char *binders;
531    const unsigned char *p_binder_len;
532    size_t binders_len;
533    const unsigned char *binders_end;
534    int matched_identity = -1;
535    int identity_id = -1;
536
537    MBEDTLS_SSL_DEBUG_BUF(3, "pre_shared_key extension",
538                          pre_shared_key_ext,
539                          pre_shared_key_ext_end - pre_shared_key_ext);
540
541    /* identities_len       2 bytes
542     * identities_data   >= 7 bytes
543     */
544    MBEDTLS_SSL_CHK_BUF_READ_PTR(identities, pre_shared_key_ext_end, 7 + 2);
545    identities_len = MBEDTLS_GET_UINT16_BE(identities, 0);
546    p_identity_len = identities + 2;
547    MBEDTLS_SSL_CHK_BUF_READ_PTR(p_identity_len, pre_shared_key_ext_end,
548                                 identities_len);
549    identities_end = p_identity_len + identities_len;
550
551    /* binders_len     2  bytes
552     * binders      >= 33 bytes
553     */
554    binders = identities_end;
555    MBEDTLS_SSL_CHK_BUF_READ_PTR(binders, pre_shared_key_ext_end, 33 + 2);
556    binders_len = MBEDTLS_GET_UINT16_BE(binders, 0);
557    p_binder_len = binders + 2;
558    MBEDTLS_SSL_CHK_BUF_READ_PTR(p_binder_len, pre_shared_key_ext_end, binders_len);
559    binders_end = p_binder_len + binders_len;
560
561    ret = ssl->handshake->update_checksum(ssl, pre_shared_key_ext,
562                                          identities_end - pre_shared_key_ext);
563    if (0 != ret) {
564        MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
565        return ret;
566    }
567
568    while (p_identity_len < identities_end && p_binder_len < binders_end) {
569        const unsigned char *identity;
570        size_t identity_len;
571        uint32_t obfuscated_ticket_age;
572        const unsigned char *binder;
573        size_t binder_len;
574        int psk_ciphersuite_id;
575        psa_algorithm_t psk_hash_alg;
576        int allowed_key_exchange_modes;
577
578#if defined(MBEDTLS_SSL_SESSION_TICKETS)
579        mbedtls_ssl_session session;
580        mbedtls_ssl_session_init(&session);
581#endif
582
583        MBEDTLS_SSL_CHK_BUF_READ_PTR(p_identity_len, identities_end, 2 + 1 + 4);
584        identity_len = MBEDTLS_GET_UINT16_BE(p_identity_len, 0);
585        identity = p_identity_len + 2;
586        MBEDTLS_SSL_CHK_BUF_READ_PTR(identity, identities_end, identity_len + 4);
587        obfuscated_ticket_age = MBEDTLS_GET_UINT32_BE(identity, identity_len);
588        p_identity_len += identity_len + 6;
589
590        MBEDTLS_SSL_CHK_BUF_READ_PTR(p_binder_len, binders_end, 1 + 32);
591        binder_len = *p_binder_len;
592        binder = p_binder_len + 1;
593        MBEDTLS_SSL_CHK_BUF_READ_PTR(binder, binders_end, binder_len);
594        p_binder_len += binder_len + 1;
595
596        identity_id++;
597        if (matched_identity != -1) {
598            continue;
599        }
600
601        ret = ssl_tls13_offered_psks_check_identity_match(
602            ssl, identity, identity_len, obfuscated_ticket_age,
603            &psk->type, &session);
604        if (ret != SSL_TLS1_3_PSK_IDENTITY_MATCH) {
605            continue;
606        }
607
608        MBEDTLS_SSL_DEBUG_MSG(4, ("found matched identity"));
609
610        switch (psk->type) {
611            case MBEDTLS_SSL_TLS1_3_PSK_EXTERNAL:
612                psk_ciphersuite_id = 0;
613                psk_hash_alg = PSA_ALG_SHA_256;
614                allowed_key_exchange_modes =
615                    MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ALL;
616                break;
617#if defined(MBEDTLS_SSL_SESSION_TICKETS)
618            case MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION:
619                psk_ciphersuite_id = session.ciphersuite;
620                psk_hash_alg = PSA_ALG_NONE;
621                ssl->session_negotiate->ticket_flags = session.ticket_flags;
622                allowed_key_exchange_modes =
623                    session.ticket_flags &
624                    MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ALL;
625                break;
626#endif
627            default:
628                return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
629        }
630
631        psk->key_exchange_mode = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_NONE;
632
633        if ((allowed_key_exchange_modes &
634             MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL) &&
635            ssl_tls13_key_exchange_is_psk_ephemeral_available(ssl)) {
636            psk->key_exchange_mode = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL;
637        } else if ((allowed_key_exchange_modes &
638                    MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK) &&
639                   ssl_tls13_key_exchange_is_psk_available(ssl)) {
640            psk->key_exchange_mode = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK;
641        }
642
643        if (psk->key_exchange_mode == MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_NONE) {
644            MBEDTLS_SSL_DEBUG_MSG(3, ("No suitable PSK key exchange mode"));
645            continue;
646        }
647
648        ssl_tls13_select_ciphersuite(ssl, ciphersuites, ciphersuites_end,
649                                     psk_ciphersuite_id, psk_hash_alg,
650                                     &psk->ciphersuite_info);
651
652        if (psk->ciphersuite_info == NULL) {
653#if defined(MBEDTLS_SSL_SESSION_TICKETS)
654            mbedtls_ssl_session_free(&session);
655#endif
656            /*
657             * We consider finding a ciphersuite suitable for the PSK as part
658             * of the validation of its binder. Thus if we do not find one, we
659             * abort the handshake with a decrypt_error alert.
660             */
661            MBEDTLS_SSL_PEND_FATAL_ALERT(
662                MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
663                MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
664            return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
665        }
666
667        ret = ssl_tls13_offered_psks_check_binder_match(
668            ssl, binder, binder_len, psk->type,
669            mbedtls_md_psa_alg_from_type((mbedtls_md_type_t) psk->ciphersuite_info->mac));
670        if (ret != SSL_TLS1_3_BINDER_MATCH) {
671            /* For security reasons, the handshake should be aborted when we
672             * fail to validate a binder value. See RFC 8446 section 4.2.11.2
673             * and appendix E.6. */
674#if defined(MBEDTLS_SSL_SESSION_TICKETS)
675            mbedtls_ssl_session_free(&session);
676#endif
677            MBEDTLS_SSL_DEBUG_MSG(3, ("Invalid binder."));
678            MBEDTLS_SSL_DEBUG_RET(
679                1, "ssl_tls13_offered_psks_check_binder_match", ret);
680            MBEDTLS_SSL_PEND_FATAL_ALERT(
681                MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
682                MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
683            return ret;
684        }
685
686        matched_identity = identity_id;
687
688#if defined(MBEDTLS_SSL_SESSION_TICKETS)
689        if (psk->type == MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION) {
690            ret = ssl_tls13_session_copy_ticket(ssl->session_negotiate,
691                                                &session);
692            mbedtls_ssl_session_free(&session);
693            if (ret != 0) {
694                return ret;
695            }
696        }
697#endif /* MBEDTLS_SSL_SESSION_TICKETS */
698    }
699
700    if (p_identity_len != identities_end || p_binder_len != binders_end) {
701        MBEDTLS_SSL_DEBUG_MSG(3, ("pre_shared_key extension decode error"));
702        MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
703                                     MBEDTLS_ERR_SSL_DECODE_ERROR);
704        return MBEDTLS_ERR_SSL_DECODE_ERROR;
705    }
706
707    /* Update the handshake transcript with the binder list. */
708    ret = ssl->handshake->update_checksum(
709        ssl, identities_end, (size_t) (binders_end - identities_end));
710    if (0 != ret) {
711        MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
712        return ret;
713    }
714    if (matched_identity == -1) {
715        MBEDTLS_SSL_DEBUG_MSG(3, ("No usable PSK or ticket."));
716        return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
717    }
718
719    ssl->handshake->selected_identity = (uint16_t) matched_identity;
720    MBEDTLS_SSL_DEBUG_MSG(3, ("Pre shared key found"));
721
722    return 0;
723}
724
725/*
726 * struct {
727 *   select ( Handshake.msg_type ) {
728 *      ....
729 *      case server_hello:
730 *          uint16 selected_identity;
731 *   }
732 * } PreSharedKeyExtension;
733 */
734static int ssl_tls13_write_server_pre_shared_key_ext(mbedtls_ssl_context *ssl,
735                                                     unsigned char *buf,
736                                                     unsigned char *end,
737                                                     size_t *olen)
738{
739    unsigned char *p = (unsigned char *) buf;
740
741    *olen = 0;
742
743    int not_using_psk = 0;
744#if defined(MBEDTLS_USE_PSA_CRYPTO)
745    not_using_psk = (mbedtls_svc_key_id_is_null(ssl->handshake->psk_opaque));
746#else
747    not_using_psk = (ssl->handshake->psk == NULL);
748#endif
749    if (not_using_psk) {
750        /* We shouldn't have called this extension writer unless we've
751         * chosen to use a PSK. */
752        return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
753    }
754
755    MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding pre_shared_key extension"));
756    MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6);
757
758    MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_PRE_SHARED_KEY, p, 0);
759    MBEDTLS_PUT_UINT16_BE(2, p, 2);
760
761    MBEDTLS_PUT_UINT16_BE(ssl->handshake->selected_identity, p, 4);
762
763    *olen = 6;
764
765    MBEDTLS_SSL_DEBUG_MSG(4, ("sent selected_identity: %u",
766                              ssl->handshake->selected_identity));
767
768    mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_PRE_SHARED_KEY);
769
770    return 0;
771}
772
773#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */
774
775/* From RFC 8446:
776 *   struct {
777 *          ProtocolVersion versions<2..254>;
778 *   } SupportedVersions;
779 */
780MBEDTLS_CHECK_RETURN_CRITICAL
781static int ssl_tls13_parse_supported_versions_ext(mbedtls_ssl_context *ssl,
782                                                  const unsigned char *buf,
783                                                  const unsigned char *end)
784{
785    const unsigned char *p = buf;
786    size_t versions_len;
787    const unsigned char *versions_end;
788    uint16_t tls_version;
789    int found_supported_version = 0;
790
791    MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 1);
792    versions_len = p[0];
793    p += 1;
794
795    MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, versions_len);
796    versions_end = p + versions_len;
797    while (p < versions_end) {
798        MBEDTLS_SSL_CHK_BUF_READ_PTR(p, versions_end, 2);
799        tls_version = mbedtls_ssl_read_version(p, ssl->conf->transport);
800        p += 2;
801
802        if (MBEDTLS_SSL_VERSION_TLS1_3 == tls_version) {
803            found_supported_version = 1;
804            break;
805        }
806
807        if ((MBEDTLS_SSL_VERSION_TLS1_2 == tls_version) &&
808            mbedtls_ssl_conf_is_tls12_enabled(ssl->conf)) {
809            found_supported_version = 1;
810            break;
811        }
812    }
813
814    if (!found_supported_version) {
815        MBEDTLS_SSL_DEBUG_MSG(1, ("No supported version found."));
816
817        MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION,
818                                     MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION);
819        return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
820    }
821
822    MBEDTLS_SSL_DEBUG_MSG(1, ("Negotiated version: [%04x]",
823                              (unsigned int) tls_version));
824
825    return (int) tls_version;
826}
827
828#if defined(PSA_WANT_ALG_ECDH) || defined(PSA_WANT_ALG_FFDH)
829/*
830 *
831 * From RFC 8446:
832 *   enum {
833 *       ... (0xFFFF)
834 *   } NamedGroup;
835 *   struct {
836 *       NamedGroup named_group_list<2..2^16-1>;
837 *   } NamedGroupList;
838 */
839MBEDTLS_CHECK_RETURN_CRITICAL
840static int ssl_tls13_parse_supported_groups_ext(mbedtls_ssl_context *ssl,
841                                                const unsigned char *buf,
842                                                const unsigned char *end)
843{
844    const unsigned char *p = buf;
845    size_t named_group_list_len;
846    const unsigned char *named_group_list_end;
847
848    MBEDTLS_SSL_DEBUG_BUF(3, "supported_groups extension", p, end - buf);
849    MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
850    named_group_list_len = MBEDTLS_GET_UINT16_BE(p, 0);
851    p += 2;
852    MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, named_group_list_len);
853    named_group_list_end = p + named_group_list_len;
854    ssl->handshake->hrr_selected_group = 0;
855
856    while (p < named_group_list_end) {
857        uint16_t named_group;
858        MBEDTLS_SSL_CHK_BUF_READ_PTR(p, named_group_list_end, 2);
859        named_group = MBEDTLS_GET_UINT16_BE(p, 0);
860        p += 2;
861
862        MBEDTLS_SSL_DEBUG_MSG(2,
863                              ("got named group: %s(%04x)",
864                               mbedtls_ssl_named_group_to_str(named_group),
865                               named_group));
866
867        if (!mbedtls_ssl_named_group_is_offered(ssl, named_group) ||
868            !mbedtls_ssl_named_group_is_supported(named_group) ||
869            ssl->handshake->hrr_selected_group != 0) {
870            continue;
871        }
872
873        MBEDTLS_SSL_DEBUG_MSG(2,
874                              ("add named group %s(%04x) into received list.",
875                               mbedtls_ssl_named_group_to_str(named_group),
876                               named_group));
877
878        ssl->handshake->hrr_selected_group = named_group;
879    }
880
881    return 0;
882
883}
884#endif /* PSA_WANT_ALG_ECDH || PSA_WANT_ALG_FFDH */
885
886#define SSL_TLS1_3_PARSE_KEY_SHARES_EXT_NO_MATCH 1
887
888#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
889/*
890 *  ssl_tls13_parse_key_shares_ext() verifies whether the information in the
891 *  extension is correct and stores the first acceptable key share and its
892 *  associated group.
893 *
894 *  Possible return values are:
895 *  - 0: Successful processing of the client provided key share extension.
896 *  - SSL_TLS1_3_PARSE_KEY_SHARES_EXT_NO_MATCH: The key shares provided by
897 *    the client does not match a group supported by the server. A
898 *    HelloRetryRequest will be needed.
899 *  - A negative value for fatal errors.
900 */
901MBEDTLS_CHECK_RETURN_CRITICAL
902static int ssl_tls13_parse_key_shares_ext(mbedtls_ssl_context *ssl,
903                                          const unsigned char *buf,
904                                          const unsigned char *end)
905{
906    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
907    unsigned char const *p = buf;
908    unsigned char const *client_shares_end;
909    size_t client_shares_len;
910
911    /* From RFC 8446:
912     *
913     * struct {
914     *     KeyShareEntry client_shares<0..2^16-1>;
915     * } KeyShareClientHello;
916     *
917     */
918
919    MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
920    client_shares_len = MBEDTLS_GET_UINT16_BE(p, 0);
921    p += 2;
922    MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, client_shares_len);
923
924    ssl->handshake->offered_group_id = 0;
925    client_shares_end = p + client_shares_len;
926
927    /* We try to find a suitable key share entry and copy it to the
928     * handshake context. Later, we have to find out whether we can do
929     * something with the provided key share or whether we have to
930     * dismiss it and send a HelloRetryRequest message.
931     */
932
933    while (p < client_shares_end) {
934        uint16_t group;
935        size_t key_exchange_len;
936        const unsigned char *key_exchange;
937
938        /*
939         * struct {
940         *    NamedGroup group;
941         *    opaque key_exchange<1..2^16-1>;
942         * } KeyShareEntry;
943         */
944        MBEDTLS_SSL_CHK_BUF_READ_PTR(p, client_shares_end, 4);
945        group = MBEDTLS_GET_UINT16_BE(p, 0);
946        key_exchange_len = MBEDTLS_GET_UINT16_BE(p, 2);
947        p += 4;
948        key_exchange = p;
949        MBEDTLS_SSL_CHK_BUF_READ_PTR(p, client_shares_end, key_exchange_len);
950        p += key_exchange_len;
951
952        /* Continue parsing even if we have already found a match,
953         * for input validation purposes.
954         */
955        if (!mbedtls_ssl_named_group_is_offered(ssl, group) ||
956            !mbedtls_ssl_named_group_is_supported(group) ||
957            ssl->handshake->offered_group_id != 0) {
958            continue;
959        }
960
961        /*
962         * ECDHE and FFDHE groups are supported
963         */
964        if (mbedtls_ssl_tls13_named_group_is_ecdhe(group) ||
965            mbedtls_ssl_tls13_named_group_is_ffdh(group)) {
966            MBEDTLS_SSL_DEBUG_MSG(2, ("ECDH/FFDH group: %s (%04x)",
967                                      mbedtls_ssl_named_group_to_str(group),
968                                      group));
969            ret = mbedtls_ssl_tls13_read_public_xxdhe_share(
970                ssl, key_exchange - 2, key_exchange_len + 2);
971            if (ret != 0) {
972                return ret;
973            }
974
975        } else {
976            MBEDTLS_SSL_DEBUG_MSG(4, ("Unrecognized NamedGroup %u",
977                                      (unsigned) group));
978            continue;
979        }
980
981        ssl->handshake->offered_group_id = group;
982    }
983
984
985    if (ssl->handshake->offered_group_id == 0) {
986        MBEDTLS_SSL_DEBUG_MSG(1, ("no matching key share"));
987        return SSL_TLS1_3_PARSE_KEY_SHARES_EXT_NO_MATCH;
988    }
989    return 0;
990}
991#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */
992
993MBEDTLS_CHECK_RETURN_CRITICAL
994static int ssl_tls13_client_hello_has_exts(mbedtls_ssl_context *ssl,
995                                           int exts_mask)
996{
997    int masked = ssl->handshake->received_extensions & exts_mask;
998    return masked == exts_mask;
999}
1000
1001#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
1002MBEDTLS_CHECK_RETURN_CRITICAL
1003static int ssl_tls13_client_hello_has_exts_for_ephemeral_key_exchange(
1004    mbedtls_ssl_context *ssl)
1005{
1006    return ssl_tls13_client_hello_has_exts(
1007        ssl,
1008        MBEDTLS_SSL_EXT_MASK(SUPPORTED_GROUPS) |
1009        MBEDTLS_SSL_EXT_MASK(KEY_SHARE)        |
1010        MBEDTLS_SSL_EXT_MASK(SIG_ALG));
1011}
1012#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
1013
1014#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED)
1015MBEDTLS_CHECK_RETURN_CRITICAL
1016static int ssl_tls13_client_hello_has_exts_for_psk_key_exchange(
1017    mbedtls_ssl_context *ssl)
1018{
1019    return ssl_tls13_client_hello_has_exts(
1020        ssl,
1021        MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY)          |
1022        MBEDTLS_SSL_EXT_MASK(PSK_KEY_EXCHANGE_MODES));
1023}
1024#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED */
1025
1026#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED)
1027MBEDTLS_CHECK_RETURN_CRITICAL
1028static int ssl_tls13_client_hello_has_exts_for_psk_ephemeral_key_exchange(
1029    mbedtls_ssl_context *ssl)
1030{
1031    return ssl_tls13_client_hello_has_exts(
1032        ssl,
1033        MBEDTLS_SSL_EXT_MASK(SUPPORTED_GROUPS)        |
1034        MBEDTLS_SSL_EXT_MASK(KEY_SHARE)               |
1035        MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY)          |
1036        MBEDTLS_SSL_EXT_MASK(PSK_KEY_EXCHANGE_MODES));
1037}
1038#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED */
1039
1040#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
1041MBEDTLS_CHECK_RETURN_CRITICAL
1042static int ssl_tls13_key_exchange_is_psk_available(mbedtls_ssl_context *ssl)
1043{
1044#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED)
1045    return mbedtls_ssl_conf_tls13_is_psk_enabled(ssl) &&
1046           mbedtls_ssl_tls13_is_psk_supported(ssl) &&
1047           ssl_tls13_client_hello_has_exts_for_psk_key_exchange(ssl);
1048#else
1049    ((void) ssl);
1050    return 0;
1051#endif
1052}
1053
1054MBEDTLS_CHECK_RETURN_CRITICAL
1055static int ssl_tls13_key_exchange_is_psk_ephemeral_available(mbedtls_ssl_context *ssl)
1056{
1057#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED)
1058    return mbedtls_ssl_conf_tls13_is_psk_ephemeral_enabled(ssl) &&
1059           mbedtls_ssl_tls13_is_psk_ephemeral_supported(ssl) &&
1060           ssl_tls13_client_hello_has_exts_for_psk_ephemeral_key_exchange(ssl);
1061#else
1062    ((void) ssl);
1063    return 0;
1064#endif
1065}
1066#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */
1067
1068MBEDTLS_CHECK_RETURN_CRITICAL
1069static int ssl_tls13_key_exchange_is_ephemeral_available(mbedtls_ssl_context *ssl)
1070{
1071#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
1072    return mbedtls_ssl_conf_tls13_is_ephemeral_enabled(ssl) &&
1073           ssl_tls13_client_hello_has_exts_for_ephemeral_key_exchange(ssl);
1074#else
1075    ((void) ssl);
1076    return 0;
1077#endif
1078}
1079
1080#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
1081    defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
1082
1083#if defined(MBEDTLS_USE_PSA_CRYPTO)
1084static psa_algorithm_t ssl_tls13_iana_sig_alg_to_psa_alg(uint16_t sig_alg)
1085{
1086    switch (sig_alg) {
1087        case MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256:
1088            return PSA_ALG_ECDSA(PSA_ALG_SHA_256);
1089        case MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384:
1090            return PSA_ALG_ECDSA(PSA_ALG_SHA_384);
1091        case MBEDTLS_TLS1_3_SIG_ECDSA_SECP521R1_SHA512:
1092            return PSA_ALG_ECDSA(PSA_ALG_SHA_512);
1093        case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256:
1094            return PSA_ALG_RSA_PSS(PSA_ALG_SHA_256);
1095        case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384:
1096            return PSA_ALG_RSA_PSS(PSA_ALG_SHA_384);
1097        case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512:
1098            return PSA_ALG_RSA_PSS(PSA_ALG_SHA_512);
1099        case MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA256:
1100            return PSA_ALG_RSA_PKCS1V15_SIGN(PSA_ALG_SHA_256);
1101        case MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA384:
1102            return PSA_ALG_RSA_PKCS1V15_SIGN(PSA_ALG_SHA_384);
1103        case MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA512:
1104            return PSA_ALG_RSA_PKCS1V15_SIGN(PSA_ALG_SHA_512);
1105        default:
1106            return PSA_ALG_NONE;
1107    }
1108}
1109#endif /* MBEDTLS_USE_PSA_CRYPTO */
1110
1111/*
1112 * Pick best ( private key, certificate chain ) pair based on the signature
1113 * algorithms supported by the client.
1114 */
1115MBEDTLS_CHECK_RETURN_CRITICAL
1116static int ssl_tls13_pick_key_cert(mbedtls_ssl_context *ssl)
1117{
1118    mbedtls_ssl_key_cert *key_cert, *key_cert_list;
1119    const uint16_t *sig_alg = ssl->handshake->received_sig_algs;
1120
1121#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1122    if (ssl->handshake->sni_key_cert != NULL) {
1123        key_cert_list = ssl->handshake->sni_key_cert;
1124    } else
1125#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
1126    key_cert_list = ssl->conf->key_cert;
1127
1128    if (key_cert_list == NULL) {
1129        MBEDTLS_SSL_DEBUG_MSG(3, ("server has no certificate"));
1130        return -1;
1131    }
1132
1133    for (; *sig_alg != MBEDTLS_TLS1_3_SIG_NONE; sig_alg++) {
1134        if (!mbedtls_ssl_sig_alg_is_offered(ssl, *sig_alg)) {
1135            continue;
1136        }
1137
1138        if (!mbedtls_ssl_tls13_sig_alg_for_cert_verify_is_supported(*sig_alg)) {
1139            continue;
1140        }
1141
1142        for (key_cert = key_cert_list; key_cert != NULL;
1143             key_cert = key_cert->next) {
1144#if defined(MBEDTLS_USE_PSA_CRYPTO)
1145            psa_algorithm_t psa_alg = PSA_ALG_NONE;
1146#endif /* MBEDTLS_USE_PSA_CRYPTO */
1147
1148            MBEDTLS_SSL_DEBUG_CRT(3, "certificate (chain) candidate",
1149                                  key_cert->cert);
1150
1151            /*
1152             * This avoids sending the client a cert it'll reject based on
1153             * keyUsage or other extensions.
1154             */
1155            if (mbedtls_x509_crt_check_key_usage(
1156                    key_cert->cert, MBEDTLS_X509_KU_DIGITAL_SIGNATURE) != 0 ||
1157                mbedtls_x509_crt_check_extended_key_usage(
1158                    key_cert->cert, MBEDTLS_OID_SERVER_AUTH,
1159                    MBEDTLS_OID_SIZE(MBEDTLS_OID_SERVER_AUTH)) != 0) {
1160                MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
1161                                          "(extended) key usage extension"));
1162                continue;
1163            }
1164
1165            MBEDTLS_SSL_DEBUG_MSG(3,
1166                                  ("ssl_tls13_pick_key_cert:"
1167                                   "check signature algorithm %s [%04x]",
1168                                   mbedtls_ssl_sig_alg_to_str(*sig_alg),
1169                                   *sig_alg));
1170#if defined(MBEDTLS_USE_PSA_CRYPTO)
1171            psa_alg = ssl_tls13_iana_sig_alg_to_psa_alg(*sig_alg);
1172#endif /* MBEDTLS_USE_PSA_CRYPTO */
1173
1174            if (mbedtls_ssl_tls13_check_sig_alg_cert_key_match(
1175                    *sig_alg, &key_cert->cert->pk)
1176#if defined(MBEDTLS_USE_PSA_CRYPTO)
1177                && psa_alg != PSA_ALG_NONE &&
1178                mbedtls_pk_can_do_ext(&key_cert->cert->pk, psa_alg,
1179                                      PSA_KEY_USAGE_SIGN_HASH) == 1
1180#endif /* MBEDTLS_USE_PSA_CRYPTO */
1181                ) {
1182                ssl->handshake->key_cert = key_cert;
1183                MBEDTLS_SSL_DEBUG_MSG(3,
1184                                      ("ssl_tls13_pick_key_cert:"
1185                                       "selected signature algorithm"
1186                                       " %s [%04x]",
1187                                       mbedtls_ssl_sig_alg_to_str(*sig_alg),
1188                                       *sig_alg));
1189                MBEDTLS_SSL_DEBUG_CRT(
1190                    3, "selected certificate (chain)",
1191                    ssl->handshake->key_cert->cert);
1192                return 0;
1193            }
1194        }
1195    }
1196
1197    MBEDTLS_SSL_DEBUG_MSG(2, ("ssl_tls13_pick_key_cert:"
1198                              "no suitable certificate found"));
1199    return -1;
1200}
1201#endif /* MBEDTLS_X509_CRT_PARSE_C &&
1202          MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
1203
1204/*
1205 *
1206 * STATE HANDLING: ClientHello
1207 *
1208 * There are three possible classes of outcomes when parsing the ClientHello:
1209 *
1210 * 1) The ClientHello was well-formed and matched the server's configuration.
1211 *
1212 *    In this case, the server progresses to sending its ServerHello.
1213 *
1214 * 2) The ClientHello was well-formed but didn't match the server's
1215 *    configuration.
1216 *
1217 *    For example, the client might not have offered a key share which
1218 *    the server supports, or the server might require a cookie.
1219 *
1220 *    In this case, the server sends a HelloRetryRequest.
1221 *
1222 * 3) The ClientHello was ill-formed
1223 *
1224 *    In this case, we abort the handshake.
1225 *
1226 */
1227
1228/*
1229 * Structure of this message:
1230 *
1231 * uint16 ProtocolVersion;
1232 * opaque Random[32];
1233 * uint8 CipherSuite[2];    // Cryptographic suite selector
1234 *
1235 * struct {
1236 *      ProtocolVersion legacy_version = 0x0303;    // TLS v1.2
1237 *      Random random;
1238 *      opaque legacy_session_id<0..32>;
1239 *      CipherSuite cipher_suites<2..2^16-2>;
1240 *      opaque legacy_compression_methods<1..2^8-1>;
1241 *      Extension extensions<8..2^16-1>;
1242 * } ClientHello;
1243 */
1244
1245#define SSL_CLIENT_HELLO_OK           0
1246#define SSL_CLIENT_HELLO_HRR_REQUIRED 1
1247#define SSL_CLIENT_HELLO_TLS1_2       2
1248
1249MBEDTLS_CHECK_RETURN_CRITICAL
1250static int ssl_tls13_parse_client_hello(mbedtls_ssl_context *ssl,
1251                                        const unsigned char *buf,
1252                                        const unsigned char *end)
1253{
1254    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1255    const unsigned char *p = buf;
1256    const unsigned char *random;
1257    size_t legacy_session_id_len;
1258    const unsigned char *legacy_session_id;
1259    size_t cipher_suites_len;
1260    const unsigned char *cipher_suites;
1261    const unsigned char *cipher_suites_end;
1262    size_t extensions_len;
1263    const unsigned char *extensions_end;
1264    const unsigned char *supported_versions_data;
1265    const unsigned char *supported_versions_data_end;
1266    mbedtls_ssl_handshake_params *handshake = ssl->handshake;
1267    int hrr_required = 0;
1268    int no_usable_share_for_key_agreement = 0;
1269
1270#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
1271    int got_psk = 0;
1272    struct psk_attributes psk = PSK_ATTRIBUTES_INIT;
1273    const unsigned char *pre_shared_key_ext = NULL;
1274    const unsigned char *pre_shared_key_ext_end = NULL;
1275#endif
1276
1277    /*
1278     * ClientHello layout:
1279     *     0  .   1   protocol version
1280     *     2  .  33   random bytes
1281     *    34  .  34   session id length ( 1 byte )
1282     *    35  . 34+x  session id
1283     *    ..  .  ..   ciphersuite list length ( 2 bytes )
1284     *    ..  .  ..   ciphersuite list
1285     *    ..  .  ..   compression alg. list length ( 1 byte )
1286     *    ..  .  ..   compression alg. list
1287     *    ..  .  ..   extensions length ( 2 bytes, optional )
1288     *    ..  .  ..   extensions ( optional )
1289     */
1290
1291    /*
1292     * Minimal length ( with everything empty and extensions omitted ) is
1293     * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1294     * read at least up to session id length without worrying.
1295     */
1296    MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 38);
1297
1298    /* ...
1299     * ProtocolVersion legacy_version = 0x0303; // TLS 1.2
1300     * ...
1301     * with ProtocolVersion defined as:
1302     * uint16 ProtocolVersion;
1303     */
1304    if (mbedtls_ssl_read_version(p, ssl->conf->transport) !=
1305        MBEDTLS_SSL_VERSION_TLS1_2) {
1306        MBEDTLS_SSL_DEBUG_MSG(1, ("Unsupported version of TLS."));
1307        MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION,
1308                                     MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION);
1309        return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
1310    }
1311    p += 2;
1312
1313    /* ...
1314     * Random random;
1315     * ...
1316     * with Random defined as:
1317     * opaque Random[32];
1318     */
1319    random = p;
1320    p += MBEDTLS_CLIENT_HELLO_RANDOM_LEN;
1321
1322    /* ...
1323     * opaque legacy_session_id<0..32>;
1324     * ...
1325     */
1326    legacy_session_id_len = *(p++);
1327    legacy_session_id = p;
1328
1329    /*
1330     * Check we have enough data for the legacy session identifier
1331     * and the ciphersuite list length.
1332     */
1333    MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, legacy_session_id_len + 2);
1334    p += legacy_session_id_len;
1335
1336    /* ...
1337     * CipherSuite cipher_suites<2..2^16-2>;
1338     * ...
1339     * with CipherSuite defined as:
1340     * uint8 CipherSuite[2];
1341     */
1342    cipher_suites_len = MBEDTLS_GET_UINT16_BE(p, 0);
1343    p += 2;
1344    cipher_suites = p;
1345
1346    /*
1347     * The length of the ciphersuite list has to be even.
1348     */
1349    if (cipher_suites_len & 1) {
1350        MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
1351                                     MBEDTLS_ERR_SSL_DECODE_ERROR);
1352        return MBEDTLS_ERR_SSL_DECODE_ERROR;
1353    }
1354
1355    /* Check we have enough data for the ciphersuite list, the legacy
1356     * compression methods and the length of the extensions.
1357     *
1358     * cipher_suites                cipher_suites_len bytes
1359     * legacy_compression_methods                   2 bytes
1360     * extensions_len                               2 bytes
1361     */
1362    MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, cipher_suites_len + 2 + 2);
1363    p += cipher_suites_len;
1364    cipher_suites_end = p;
1365
1366    /*
1367     * Search for the supported versions extension and parse it to determine
1368     * if the client supports TLS 1.3.
1369     */
1370    ret = mbedtls_ssl_tls13_is_supported_versions_ext_present_in_exts(
1371        ssl, p + 2, end,
1372        &supported_versions_data, &supported_versions_data_end);
1373    if (ret < 0) {
1374        MBEDTLS_SSL_DEBUG_RET(1,
1375                              ("mbedtls_ssl_tls13_is_supported_versions_ext_present_in_exts"), ret);
1376        return ret;
1377    }
1378
1379    if (ret == 0) {
1380        return SSL_CLIENT_HELLO_TLS1_2;
1381    }
1382
1383    if (ret == 1) {
1384        ret = ssl_tls13_parse_supported_versions_ext(ssl,
1385                                                     supported_versions_data,
1386                                                     supported_versions_data_end);
1387        if (ret < 0) {
1388            MBEDTLS_SSL_DEBUG_RET(1,
1389                                  ("ssl_tls13_parse_supported_versions_ext"), ret);
1390            return ret;
1391        }
1392
1393        /*
1394         * The supported versions extension was parsed successfully as the
1395         * value returned by ssl_tls13_parse_supported_versions_ext() is
1396         * positive. The return value is then equal to
1397         * MBEDTLS_SSL_VERSION_TLS1_2 or MBEDTLS_SSL_VERSION_TLS1_3, defining
1398         * the TLS version to negotiate.
1399         */
1400        if (MBEDTLS_SSL_VERSION_TLS1_2 == ret) {
1401            return SSL_CLIENT_HELLO_TLS1_2;
1402        }
1403    }
1404
1405    /*
1406     * We negotiate TLS 1.3.
1407     */
1408    ssl->tls_version = MBEDTLS_SSL_VERSION_TLS1_3;
1409    ssl->session_negotiate->tls_version = MBEDTLS_SSL_VERSION_TLS1_3;
1410    ssl->session_negotiate->endpoint = ssl->conf->endpoint;
1411
1412    /*
1413     * We are negotiating the version 1.3 of the protocol. Do what we have
1414     * postponed: copy of the client random bytes, copy of the legacy session
1415     * identifier and selection of the TLS 1.3 cipher suite.
1416     */
1417    MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes",
1418                          random, MBEDTLS_CLIENT_HELLO_RANDOM_LEN);
1419    memcpy(&handshake->randbytes[0], random, MBEDTLS_CLIENT_HELLO_RANDOM_LEN);
1420
1421    if (legacy_session_id_len > sizeof(ssl->session_negotiate->id)) {
1422        MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1423        return MBEDTLS_ERR_SSL_DECODE_ERROR;
1424    }
1425    ssl->session_negotiate->id_len = legacy_session_id_len;
1426    MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id",
1427                          legacy_session_id, legacy_session_id_len);
1428    memcpy(&ssl->session_negotiate->id[0],
1429           legacy_session_id, legacy_session_id_len);
1430
1431    /*
1432     * Search for a matching ciphersuite
1433     */
1434    MBEDTLS_SSL_DEBUG_BUF(3, "client hello, list of cipher suites",
1435                          cipher_suites, cipher_suites_len);
1436
1437    ssl_tls13_select_ciphersuite(ssl, cipher_suites, cipher_suites_end,
1438                                 0, PSA_ALG_NONE, &handshake->ciphersuite_info);
1439
1440    if (handshake->ciphersuite_info == NULL) {
1441        MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
1442                                     MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
1443        return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1444    }
1445    ssl->session_negotiate->ciphersuite = handshake->ciphersuite_info->id;
1446
1447    MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %04x - %s",
1448                              ((unsigned) handshake->ciphersuite_info->id),
1449                              handshake->ciphersuite_info->name));
1450
1451    /* ...
1452     * opaque legacy_compression_methods<1..2^8-1>;
1453     * ...
1454     */
1455    if (p[0] != 1 || p[1] != MBEDTLS_SSL_COMPRESS_NULL) {
1456        MBEDTLS_SSL_DEBUG_MSG(1, ("bad legacy compression method"));
1457        MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1458                                     MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1459        return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1460    }
1461    p += 2;
1462
1463    /* ...
1464     * Extension extensions<8..2^16-1>;
1465     * ...
1466     * with Extension defined as:
1467     * struct {
1468     *    ExtensionType extension_type;
1469     *    opaque extension_data<0..2^16-1>;
1470     * } Extension;
1471     */
1472    extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
1473    p += 2;
1474    MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len);
1475    extensions_end = p + extensions_len;
1476
1477    MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", p, extensions_len);
1478    handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
1479
1480    while (p < extensions_end) {
1481        unsigned int extension_type;
1482        size_t extension_data_len;
1483        const unsigned char *extension_data_end;
1484        uint32_t allowed_exts = MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_CH;
1485
1486        if (ssl->handshake->hello_retry_request_flag) {
1487            /* Do not accept early data extension in 2nd ClientHello */
1488            allowed_exts &= ~MBEDTLS_SSL_EXT_MASK(EARLY_DATA);
1489        }
1490
1491        /* RFC 8446, section 4.2.11
1492         *
1493         * The "pre_shared_key" extension MUST be the last extension in the
1494         * ClientHello (this facilitates implementation as described below).
1495         * Servers MUST check that it is the last extension and otherwise fail
1496         * the handshake with an "illegal_parameter" alert.
1497         */
1498        if (handshake->received_extensions & MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY)) {
1499            MBEDTLS_SSL_DEBUG_MSG(
1500                3, ("pre_shared_key is not last extension."));
1501            MBEDTLS_SSL_PEND_FATAL_ALERT(
1502                MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1503                MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1504            return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1505        }
1506
1507        MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4);
1508        extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
1509        extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
1510        p += 4;
1511
1512        MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len);
1513        extension_data_end = p + extension_data_len;
1514
1515        ret = mbedtls_ssl_tls13_check_received_extension(
1516            ssl, MBEDTLS_SSL_HS_CLIENT_HELLO, extension_type,
1517            allowed_exts);
1518        if (ret != 0) {
1519            return ret;
1520        }
1521
1522        switch (extension_type) {
1523#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1524            case MBEDTLS_TLS_EXT_SERVERNAME:
1525                MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1526                ret = mbedtls_ssl_parse_server_name_ext(ssl, p,
1527                                                        extension_data_end);
1528                if (ret != 0) {
1529                    MBEDTLS_SSL_DEBUG_RET(
1530                        1, "mbedtls_ssl_parse_servername_ext", ret);
1531                    return ret;
1532                }
1533                break;
1534#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
1535
1536#if defined(PSA_WANT_ALG_ECDH) || defined(PSA_WANT_ALG_FFDH)
1537            case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
1538                MBEDTLS_SSL_DEBUG_MSG(3, ("found supported group extension"));
1539
1540                /* Supported Groups Extension
1541                 *
1542                 * When sent by the client, the "supported_groups" extension
1543                 * indicates the named groups which the client supports,
1544                 * ordered from most preferred to least preferred.
1545                 */
1546                ret = ssl_tls13_parse_supported_groups_ext(
1547                    ssl, p, extension_data_end);
1548                if (ret != 0) {
1549                    MBEDTLS_SSL_DEBUG_RET(
1550                        1, "ssl_tls13_parse_supported_groups_ext", ret);
1551                    return ret;
1552                }
1553
1554                break;
1555#endif /* PSA_WANT_ALG_ECDH || PSA_WANT_ALG_FFDH*/
1556
1557#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
1558            case MBEDTLS_TLS_EXT_KEY_SHARE:
1559                MBEDTLS_SSL_DEBUG_MSG(3, ("found key share extension"));
1560
1561                /*
1562                 * Key Share Extension
1563                 *
1564                 * When sent by the client, the "key_share" extension
1565                 * contains the endpoint's cryptographic parameters for
1566                 * ECDHE/DHE key establishment methods.
1567                 */
1568                ret = ssl_tls13_parse_key_shares_ext(
1569                    ssl, p, extension_data_end);
1570                if (ret == SSL_TLS1_3_PARSE_KEY_SHARES_EXT_NO_MATCH) {
1571                    MBEDTLS_SSL_DEBUG_MSG(2, ("No usable share for key agreement."));
1572                    no_usable_share_for_key_agreement = 1;
1573                }
1574
1575                if (ret < 0) {
1576                    MBEDTLS_SSL_DEBUG_RET(
1577                        1, "ssl_tls13_parse_key_shares_ext", ret);
1578                    return ret;
1579                }
1580
1581                break;
1582#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */
1583
1584            case MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS:
1585                /* Already parsed */
1586                break;
1587
1588#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
1589            case MBEDTLS_TLS_EXT_PSK_KEY_EXCHANGE_MODES:
1590                MBEDTLS_SSL_DEBUG_MSG(
1591                    3, ("found psk key exchange modes extension"));
1592
1593                ret = ssl_tls13_parse_key_exchange_modes_ext(
1594                    ssl, p, extension_data_end);
1595                if (ret != 0) {
1596                    MBEDTLS_SSL_DEBUG_RET(
1597                        1, "ssl_tls13_parse_key_exchange_modes_ext", ret);
1598                    return ret;
1599                }
1600
1601                break;
1602#endif
1603
1604            case MBEDTLS_TLS_EXT_PRE_SHARED_KEY:
1605                MBEDTLS_SSL_DEBUG_MSG(3, ("found pre_shared_key extension"));
1606                if ((handshake->received_extensions &
1607                     MBEDTLS_SSL_EXT_MASK(PSK_KEY_EXCHANGE_MODES)) == 0) {
1608                    MBEDTLS_SSL_PEND_FATAL_ALERT(
1609                        MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1610                        MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1611                    return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1612                }
1613#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
1614                /* Delay processing of the PSK identity once we have
1615                 * found out which algorithms to use. We keep a pointer
1616                 * to the buffer and the size for later processing.
1617                 */
1618                pre_shared_key_ext = p;
1619                pre_shared_key_ext_end = extension_data_end;
1620#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */
1621                break;
1622
1623#if defined(MBEDTLS_SSL_ALPN)
1624            case MBEDTLS_TLS_EXT_ALPN:
1625                MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
1626
1627                ret = mbedtls_ssl_parse_alpn_ext(ssl, p, extension_data_end);
1628                if (ret != 0) {
1629                    MBEDTLS_SSL_DEBUG_RET(
1630                        1, ("mbedtls_ssl_parse_alpn_ext"), ret);
1631                    return ret;
1632                }
1633                break;
1634#endif /* MBEDTLS_SSL_ALPN */
1635
1636#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
1637            case MBEDTLS_TLS_EXT_SIG_ALG:
1638                MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
1639
1640                ret = mbedtls_ssl_parse_sig_alg_ext(
1641                    ssl, p, extension_data_end);
1642                if (ret != 0) {
1643                    MBEDTLS_SSL_DEBUG_RET(
1644                        1, "mbedtls_ssl_parse_sig_alg_ext", ret);
1645                    return ret;
1646                }
1647                break;
1648#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
1649
1650#if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT)
1651            case MBEDTLS_TLS_EXT_RECORD_SIZE_LIMIT:
1652                MBEDTLS_SSL_DEBUG_MSG(3, ("found record_size_limit extension"));
1653
1654                ret = mbedtls_ssl_tls13_parse_record_size_limit_ext(
1655                    ssl, p, extension_data_end);
1656                if (ret != 0) {
1657                    MBEDTLS_SSL_DEBUG_RET(
1658                        1, ("mbedtls_ssl_tls13_parse_record_size_limit_ext"), ret);
1659                    return ret;
1660                }
1661                break;
1662#endif /* MBEDTLS_SSL_RECORD_SIZE_LIMIT */
1663
1664            default:
1665                MBEDTLS_SSL_PRINT_EXT(
1666                    3, MBEDTLS_SSL_HS_CLIENT_HELLO,
1667                    extension_type, "( ignored )");
1668                break;
1669        }
1670
1671        p += extension_data_len;
1672    }
1673
1674    MBEDTLS_SSL_PRINT_EXTS(3, MBEDTLS_SSL_HS_CLIENT_HELLO,
1675                           handshake->received_extensions);
1676
1677    ret = mbedtls_ssl_add_hs_hdr_to_checksum(ssl,
1678                                             MBEDTLS_SSL_HS_CLIENT_HELLO,
1679                                             p - buf);
1680    if (0 != ret) {
1681        MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_add_hs_hdr_to_checksum"), ret);
1682        return ret;
1683    }
1684
1685#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
1686    /* Update checksum with either
1687     * - The entire content of the CH message, if no PSK extension is present
1688     * - The content up to but excluding the PSK extension, if present.
1689     * Always parse the pre-shared-key extension when present in the
1690     * ClientHello even if some pre-requisites for PSK key exchange modes are
1691     * not met. That way we always validate the syntax of the extension.
1692     */
1693    if (handshake->received_extensions & MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY)) {
1694        ret = handshake->update_checksum(ssl, buf,
1695                                         pre_shared_key_ext - buf);
1696        if (0 != ret) {
1697            MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
1698            return ret;
1699        }
1700        ret = ssl_tls13_parse_pre_shared_key_ext(ssl,
1701                                                 pre_shared_key_ext,
1702                                                 pre_shared_key_ext_end,
1703                                                 cipher_suites,
1704                                                 cipher_suites_end,
1705                                                 &psk);
1706        if (ret == 0) {
1707            got_psk = 1;
1708        } else if (ret != MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
1709            MBEDTLS_SSL_DEBUG_RET(
1710                1, "ssl_tls13_parse_pre_shared_key_ext", ret);
1711            return ret;
1712        }
1713    } else
1714#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */
1715    {
1716        ret = handshake->update_checksum(ssl, buf, p - buf);
1717        if (0 != ret) {
1718            MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
1719            return ret;
1720        }
1721    }
1722
1723    /*
1724     * Determine the key exchange algorithm to use.
1725     * There are three types of key exchanges supported in TLS 1.3:
1726     * - (EC)DH with ECDSA,
1727     * - (EC)DH with PSK,
1728     * - plain PSK.
1729     *
1730     * The PSK-based key exchanges may additionally be used with 0-RTT.
1731     *
1732     * Our built-in order of preference is
1733     *  1 ) (EC)DHE-PSK Mode ( psk_ephemeral )
1734     *  2 ) Certificate Mode ( ephemeral )
1735     *  3 ) Plain PSK Mode ( psk )
1736     */
1737#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
1738    if (got_psk && (psk.key_exchange_mode ==
1739                    MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL)) {
1740        handshake->key_exchange_mode =
1741            MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL;
1742        MBEDTLS_SSL_DEBUG_MSG(2, ("key exchange mode: psk_ephemeral"));
1743
1744    } else
1745#endif
1746    if (ssl_tls13_key_exchange_is_ephemeral_available(ssl)) {
1747        handshake->key_exchange_mode =
1748            MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL;
1749        MBEDTLS_SSL_DEBUG_MSG(2, ("key exchange mode: ephemeral"));
1750
1751    }
1752#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
1753    else if (got_psk && (psk.key_exchange_mode ==
1754                         MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK)) {
1755        handshake->key_exchange_mode = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK;
1756        MBEDTLS_SSL_DEBUG_MSG(2, ("key exchange mode: psk"));
1757    }
1758#endif
1759    else {
1760        MBEDTLS_SSL_DEBUG_MSG(
1761            1,
1762            ("ClientHello message misses mandatory extensions."));
1763        MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_MISSING_EXTENSION,
1764                                     MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1765        return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1766    }
1767
1768#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
1769    if (handshake->key_exchange_mode &
1770        MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ALL) {
1771        handshake->ciphersuite_info = psk.ciphersuite_info;
1772        ssl->session_negotiate->ciphersuite = psk.ciphersuite_info->id;
1773
1774        MBEDTLS_SSL_DEBUG_MSG(2, ("Select PSK ciphersuite: %04x - %s",
1775                                  ((unsigned) psk.ciphersuite_info->id),
1776                                  psk.ciphersuite_info->name));
1777
1778        if (psk.type == MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION) {
1779            handshake->resume = 1;
1780        }
1781    }
1782#endif
1783
1784    if (handshake->key_exchange_mode !=
1785        MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK) {
1786        hrr_required = (no_usable_share_for_key_agreement != 0);
1787    }
1788
1789    mbedtls_ssl_optimize_checksum(ssl, handshake->ciphersuite_info);
1790
1791    return hrr_required ? SSL_CLIENT_HELLO_HRR_REQUIRED : SSL_CLIENT_HELLO_OK;
1792}
1793
1794#if defined(MBEDTLS_SSL_EARLY_DATA)
1795static int ssl_tls13_check_early_data_requirements(mbedtls_ssl_context *ssl)
1796{
1797    mbedtls_ssl_handshake_params *handshake = ssl->handshake;
1798
1799    if (ssl->conf->early_data_enabled == MBEDTLS_SSL_EARLY_DATA_DISABLED) {
1800        MBEDTLS_SSL_DEBUG_MSG(
1801            1,
1802            ("EarlyData: rejected, feature disabled in server configuration."));
1803        return -1;
1804    }
1805
1806    if (!handshake->resume) {
1807        /* We currently support early data only in the case of PSKs established
1808           via a NewSessionTicket message thus in the case of a session
1809           resumption. */
1810        MBEDTLS_SSL_DEBUG_MSG(
1811            1, ("EarlyData: rejected, not a session resumption."));
1812        return -1;
1813    }
1814
1815    /* RFC 8446 4.2.10
1816     *
1817     * In order to accept early data, the server MUST have accepted a PSK cipher
1818     * suite and selected the first key offered in the client's "pre_shared_key"
1819     * extension. In addition, it MUST verify that the following values are the
1820     * same as those associated with the selected PSK:
1821     * - The TLS version number
1822     * - The selected cipher suite
1823     * - The selected ALPN [RFC7301] protocol, if any
1824     *
1825     * NOTE:
1826     *  - The TLS version number is checked in
1827     *    ssl_tls13_offered_psks_check_identity_match_ticket().
1828     */
1829
1830    if (handshake->selected_identity != 0) {
1831        MBEDTLS_SSL_DEBUG_MSG(
1832            1, ("EarlyData: rejected, the selected key in "
1833                "`pre_shared_key` is not the first one."));
1834        return -1;
1835    }
1836
1837    if (handshake->ciphersuite_info->id !=
1838        ssl->session_negotiate->ciphersuite) {
1839        MBEDTLS_SSL_DEBUG_MSG(
1840            1, ("EarlyData: rejected, the selected ciphersuite is not the one "
1841                "of the selected pre-shared key."));
1842        return -1;
1843
1844    }
1845
1846    if (!mbedtls_ssl_tls13_session_ticket_allow_early_data(ssl->session_negotiate)) {
1847        MBEDTLS_SSL_DEBUG_MSG(
1848            1,
1849            ("EarlyData: rejected, early_data not allowed in ticket "
1850             "permission bits."));
1851        return -1;
1852    }
1853
1854#if defined(MBEDTLS_SSL_ALPN)
1855    const char *alpn = mbedtls_ssl_get_alpn_protocol(ssl);
1856    size_t alpn_len;
1857
1858    if (alpn == NULL && ssl->session_negotiate->ticket_alpn == NULL) {
1859        return 0;
1860    }
1861
1862    if (alpn != NULL) {
1863        alpn_len = strlen(alpn);
1864    }
1865
1866    if (alpn == NULL ||
1867        ssl->session_negotiate->ticket_alpn == NULL ||
1868        alpn_len != strlen(ssl->session_negotiate->ticket_alpn) ||
1869        (memcmp(alpn, ssl->session_negotiate->ticket_alpn, alpn_len) != 0)) {
1870        MBEDTLS_SSL_DEBUG_MSG(1, ("EarlyData: rejected, the selected ALPN is different "
1871                                  "from the one associated with the pre-shared key."));
1872        return -1;
1873    }
1874#endif
1875
1876    return 0;
1877}
1878#endif /* MBEDTLS_SSL_EARLY_DATA */
1879
1880/* Update the handshake state machine */
1881
1882MBEDTLS_CHECK_RETURN_CRITICAL
1883static int ssl_tls13_postprocess_client_hello(mbedtls_ssl_context *ssl,
1884                                              int hrr_required)
1885{
1886    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1887
1888    /*
1889     * Server certificate selection
1890     */
1891    if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1892        MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1893        return ret;
1894    }
1895#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1896    ssl->handshake->sni_name = NULL;
1897    ssl->handshake->sni_name_len = 0;
1898#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
1899
1900    ret = mbedtls_ssl_tls13_key_schedule_stage_early(ssl);
1901    if (ret != 0) {
1902        MBEDTLS_SSL_DEBUG_RET(1,
1903                              "mbedtls_ssl_tls1_3_key_schedule_stage_early", ret);
1904        return ret;
1905    }
1906
1907#if defined(MBEDTLS_SSL_EARLY_DATA)
1908    if (ssl->handshake->received_extensions & MBEDTLS_SSL_EXT_MASK(EARLY_DATA)) {
1909        ssl->handshake->early_data_accepted =
1910            (!hrr_required) && (ssl_tls13_check_early_data_requirements(ssl) == 0);
1911
1912        if (ssl->handshake->early_data_accepted) {
1913            ret = mbedtls_ssl_tls13_compute_early_transform(ssl);
1914            if (ret != 0) {
1915                MBEDTLS_SSL_DEBUG_RET(
1916                    1, "mbedtls_ssl_tls13_compute_early_transform", ret);
1917                return ret;
1918            }
1919        } else {
1920            ssl->discard_early_data_record =
1921                hrr_required ?
1922                MBEDTLS_SSL_EARLY_DATA_DISCARD :
1923                MBEDTLS_SSL_EARLY_DATA_TRY_TO_DEPROTECT_AND_DISCARD;
1924        }
1925    }
1926#else
1927    ((void) hrr_required);
1928#endif /* MBEDTLS_SSL_EARLY_DATA */
1929
1930    return 0;
1931}
1932
1933/*
1934 * Main entry point from the state machine; orchestrates the otherfunctions.
1935 */
1936
1937MBEDTLS_CHECK_RETURN_CRITICAL
1938static int ssl_tls13_process_client_hello(mbedtls_ssl_context *ssl)
1939{
1940
1941    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1942    unsigned char *buf = NULL;
1943    size_t buflen = 0;
1944    int parse_client_hello_ret;
1945
1946    MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
1947
1948    MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
1949                             ssl, MBEDTLS_SSL_HS_CLIENT_HELLO,
1950                             &buf, &buflen));
1951
1952    MBEDTLS_SSL_PROC_CHK_NEG(ssl_tls13_parse_client_hello(ssl, buf,
1953                                                          buf + buflen));
1954    parse_client_hello_ret = ret; /* Store positive return value of
1955                                   * parse_client_hello,
1956                                   * as negative error codes are handled
1957                                   * by MBEDTLS_SSL_PROC_CHK_NEG. */
1958
1959    /*
1960     * Version 1.2 of the protocol has to be used for the handshake.
1961     * If TLS 1.2 is not supported, abort the handshake. Otherwise, set the
1962     * ssl->keep_current_message flag for the ClientHello to be kept and parsed
1963     * as a TLS 1.2 ClientHello. We also change ssl->tls_version to
1964     * MBEDTLS_SSL_VERSION_TLS1_2 thus from now on mbedtls_ssl_handshake_step()
1965     * will dispatch to the TLS 1.2 state machine.
1966     */
1967    if (SSL_CLIENT_HELLO_TLS1_2 == parse_client_hello_ret) {
1968        /* Check if server supports TLS 1.2 */
1969        if (!mbedtls_ssl_conf_is_tls12_enabled(ssl->conf)) {
1970            MBEDTLS_SSL_DEBUG_MSG(
1971                1, ("TLS 1.2 not supported."));
1972            MBEDTLS_SSL_PEND_FATAL_ALERT(
1973                MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION,
1974                MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION);
1975            return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
1976        }
1977        ssl->keep_current_message = 1;
1978        ssl->tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
1979        return 0;
1980    }
1981
1982    MBEDTLS_SSL_PROC_CHK(
1983        ssl_tls13_postprocess_client_hello(ssl, parse_client_hello_ret ==
1984                                           SSL_CLIENT_HELLO_HRR_REQUIRED));
1985
1986    if (SSL_CLIENT_HELLO_OK == parse_client_hello_ret) {
1987        mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_HELLO);
1988    } else {
1989        mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HELLO_RETRY_REQUEST);
1990    }
1991
1992cleanup:
1993
1994    MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
1995    return ret;
1996}
1997
1998/*
1999 * Handler for MBEDTLS_SSL_SERVER_HELLO
2000 */
2001MBEDTLS_CHECK_RETURN_CRITICAL
2002static int ssl_tls13_prepare_server_hello(mbedtls_ssl_context *ssl)
2003{
2004    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2005    unsigned char *server_randbytes =
2006        ssl->handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN;
2007
2008    if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, server_randbytes,
2009                                MBEDTLS_SERVER_HELLO_RANDOM_LEN)) != 0) {
2010        MBEDTLS_SSL_DEBUG_RET(1, "f_rng", ret);
2011        return ret;
2012    }
2013
2014    MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", server_randbytes,
2015                          MBEDTLS_SERVER_HELLO_RANDOM_LEN);
2016
2017#if defined(MBEDTLS_HAVE_TIME)
2018    ssl->session_negotiate->start = mbedtls_time(NULL);
2019#endif /* MBEDTLS_HAVE_TIME */
2020
2021    return ret;
2022}
2023
2024/*
2025 * ssl_tls13_write_server_hello_supported_versions_ext ():
2026 *
2027 * struct {
2028 *      ProtocolVersion selected_version;
2029 * } SupportedVersions;
2030 */
2031MBEDTLS_CHECK_RETURN_CRITICAL
2032static int ssl_tls13_write_server_hello_supported_versions_ext(
2033    mbedtls_ssl_context *ssl,
2034    unsigned char *buf,
2035    unsigned char *end,
2036    size_t *out_len)
2037{
2038    *out_len = 0;
2039
2040    MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, write selected version"));
2041
2042    /* Check if we have space to write the extension:
2043     * - extension_type         (2 bytes)
2044     * - extension_data_length  (2 bytes)
2045     * - selected_version       (2 bytes)
2046     */
2047    MBEDTLS_SSL_CHK_BUF_PTR(buf, end, 6);
2048
2049    MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS, buf, 0);
2050
2051    MBEDTLS_PUT_UINT16_BE(2, buf, 2);
2052
2053    mbedtls_ssl_write_version(buf + 4,
2054                              ssl->conf->transport,
2055                              ssl->tls_version);
2056
2057    MBEDTLS_SSL_DEBUG_MSG(3, ("supported version: [%04x]",
2058                              ssl->tls_version));
2059
2060    *out_len = 6;
2061
2062    mbedtls_ssl_tls13_set_hs_sent_ext_mask(
2063        ssl, MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS);
2064
2065    return 0;
2066}
2067
2068
2069
2070/* Generate and export a single key share. For hybrid KEMs, this can
2071 * be called multiple times with the different components of the hybrid. */
2072MBEDTLS_CHECK_RETURN_CRITICAL
2073static int ssl_tls13_generate_and_write_key_share(mbedtls_ssl_context *ssl,
2074                                                  uint16_t named_group,
2075                                                  unsigned char *buf,
2076                                                  unsigned char *end,
2077                                                  size_t *out_len)
2078{
2079    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2080
2081    *out_len = 0;
2082
2083#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
2084    if (mbedtls_ssl_tls13_named_group_is_ecdhe(named_group) ||
2085        mbedtls_ssl_tls13_named_group_is_ffdh(named_group)) {
2086        ret = mbedtls_ssl_tls13_generate_and_write_xxdh_key_exchange(
2087            ssl, named_group, buf, end, out_len);
2088        if (ret != 0) {
2089            MBEDTLS_SSL_DEBUG_RET(
2090                1, "mbedtls_ssl_tls13_generate_and_write_xxdh_key_exchange",
2091                ret);
2092            return ret;
2093        }
2094    } else
2095#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */
2096    if (0 /* Other kinds of KEMs */) {
2097    } else {
2098        ((void) ssl);
2099        ((void) named_group);
2100        ((void) buf);
2101        ((void) end);
2102        ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
2103    }
2104
2105    return ret;
2106}
2107
2108/*
2109 * ssl_tls13_write_key_share_ext
2110 *
2111 * Structure of key_share extension in ServerHello:
2112 *
2113 * struct {
2114 *     NamedGroup group;
2115 *     opaque key_exchange<1..2^16-1>;
2116 * } KeyShareEntry;
2117 * struct {
2118 *     KeyShareEntry server_share;
2119 * } KeyShareServerHello;
2120 */
2121MBEDTLS_CHECK_RETURN_CRITICAL
2122static int ssl_tls13_write_key_share_ext(mbedtls_ssl_context *ssl,
2123                                         unsigned char *buf,
2124                                         unsigned char *end,
2125                                         size_t *out_len)
2126{
2127    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2128    unsigned char *p = buf;
2129    uint16_t group = ssl->handshake->offered_group_id;
2130    unsigned char *server_share = buf + 4;
2131    size_t key_exchange_length;
2132
2133    *out_len = 0;
2134
2135    MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding key share extension"));
2136
2137    MBEDTLS_SSL_DEBUG_MSG(2, ("server hello, write selected_group: %s (%04x)",
2138                              mbedtls_ssl_named_group_to_str(group),
2139                              group));
2140
2141    /* Check if we have space for header and length fields:
2142     * - extension_type         (2 bytes)
2143     * - extension_data_length  (2 bytes)
2144     * - group                  (2 bytes)
2145     * - key_exchange_length    (2 bytes)
2146     */
2147    MBEDTLS_SSL_CHK_BUF_PTR(p, end, 8);
2148    MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_KEY_SHARE, p, 0);
2149    MBEDTLS_PUT_UINT16_BE(group, server_share, 0);
2150    p += 8;
2151
2152    /* When we introduce PQC-ECDHE hybrids, we'll want to call this
2153     * function multiple times. */
2154    ret = ssl_tls13_generate_and_write_key_share(
2155        ssl, group, server_share + 4, end, &key_exchange_length);
2156    if (ret != 0) {
2157        return ret;
2158    }
2159    p += key_exchange_length;
2160
2161    MBEDTLS_PUT_UINT16_BE(key_exchange_length, server_share + 2, 0);
2162
2163    MBEDTLS_PUT_UINT16_BE(p - server_share, buf, 2);
2164
2165    *out_len = p - buf;
2166
2167    mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_KEY_SHARE);
2168
2169    return 0;
2170}
2171
2172MBEDTLS_CHECK_RETURN_CRITICAL
2173static int ssl_tls13_write_hrr_key_share_ext(mbedtls_ssl_context *ssl,
2174                                             unsigned char *buf,
2175                                             unsigned char *end,
2176                                             size_t *out_len)
2177{
2178    uint16_t selected_group = ssl->handshake->hrr_selected_group;
2179    /* key_share Extension
2180     *
2181     *  struct {
2182     *    select (Handshake.msg_type) {
2183     *      ...
2184     *      case hello_retry_request:
2185     *          NamedGroup selected_group;
2186     *      ...
2187     *    };
2188     * } KeyShare;
2189     */
2190
2191    *out_len = 0;
2192
2193    /*
2194     * For a pure PSK key exchange, there is no group to agree upon. The purpose
2195     * of the HRR is then to transmit a cookie to force the client to demonstrate
2196     * reachability at their apparent network address (primarily useful for DTLS).
2197     */
2198    if (!mbedtls_ssl_tls13_key_exchange_mode_with_ephemeral(ssl)) {
2199        return 0;
2200    }
2201
2202    /* We should only send the key_share extension if the client's initial
2203     * key share was not acceptable. */
2204    if (ssl->handshake->offered_group_id != 0) {
2205        MBEDTLS_SSL_DEBUG_MSG(4, ("Skip key_share extension in HRR"));
2206        return 0;
2207    }
2208
2209    if (selected_group == 0) {
2210        MBEDTLS_SSL_DEBUG_MSG(1, ("no matching named group found"));
2211        return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2212    }
2213
2214    /* Check if we have enough space:
2215     * - extension_type         (2 bytes)
2216     * - extension_data_length  (2 bytes)
2217     * - selected_group         (2 bytes)
2218     */
2219    MBEDTLS_SSL_CHK_BUF_PTR(buf, end, 6);
2220
2221    MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_KEY_SHARE, buf, 0);
2222    MBEDTLS_PUT_UINT16_BE(2, buf, 2);
2223    MBEDTLS_PUT_UINT16_BE(selected_group, buf, 4);
2224
2225    MBEDTLS_SSL_DEBUG_MSG(3,
2226                          ("HRR selected_group: %s (%x)",
2227                           mbedtls_ssl_named_group_to_str(selected_group),
2228                           selected_group));
2229
2230    *out_len = 6;
2231
2232    mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_KEY_SHARE);
2233
2234    return 0;
2235}
2236
2237/*
2238 * Structure of ServerHello message:
2239 *
2240 *     struct {
2241 *        ProtocolVersion legacy_version = 0x0303;    // TLS v1.2
2242 *        Random random;
2243 *        opaque legacy_session_id_echo<0..32>;
2244 *        CipherSuite cipher_suite;
2245 *        uint8 legacy_compression_method = 0;
2246 *        Extension extensions<6..2^16-1>;
2247 *    } ServerHello;
2248 */
2249MBEDTLS_CHECK_RETURN_CRITICAL
2250static int ssl_tls13_write_server_hello_body(mbedtls_ssl_context *ssl,
2251                                             unsigned char *buf,
2252                                             unsigned char *end,
2253                                             size_t *out_len,
2254                                             int is_hrr)
2255{
2256    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2257    unsigned char *p = buf;
2258    unsigned char *p_extensions_len;
2259    size_t output_len;
2260
2261    *out_len = 0;
2262    ssl->handshake->sent_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
2263
2264    /* ...
2265     * ProtocolVersion legacy_version = 0x0303; // TLS 1.2
2266     * ...
2267     * with ProtocolVersion defined as:
2268     * uint16 ProtocolVersion;
2269     */
2270    MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
2271    MBEDTLS_PUT_UINT16_BE(0x0303, p, 0);
2272    p += 2;
2273
2274    /* ...
2275     * Random random;
2276     * ...
2277     * with Random defined as:
2278     * opaque Random[MBEDTLS_SERVER_HELLO_RANDOM_LEN];
2279     */
2280    MBEDTLS_SSL_CHK_BUF_PTR(p, end, MBEDTLS_SERVER_HELLO_RANDOM_LEN);
2281    if (is_hrr) {
2282        memcpy(p, mbedtls_ssl_tls13_hello_retry_request_magic,
2283               MBEDTLS_SERVER_HELLO_RANDOM_LEN);
2284    } else {
2285        memcpy(p, &ssl->handshake->randbytes[MBEDTLS_CLIENT_HELLO_RANDOM_LEN],
2286               MBEDTLS_SERVER_HELLO_RANDOM_LEN);
2287    }
2288    MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes",
2289                          p, MBEDTLS_SERVER_HELLO_RANDOM_LEN);
2290    p += MBEDTLS_SERVER_HELLO_RANDOM_LEN;
2291
2292    /* ...
2293     * opaque legacy_session_id_echo<0..32>;
2294     * ...
2295     */
2296    MBEDTLS_SSL_CHK_BUF_PTR(p, end, 1 + ssl->session_negotiate->id_len);
2297    *p++ = (unsigned char) ssl->session_negotiate->id_len;
2298    if (ssl->session_negotiate->id_len > 0) {
2299        memcpy(p, &ssl->session_negotiate->id[0],
2300               ssl->session_negotiate->id_len);
2301        p += ssl->session_negotiate->id_len;
2302
2303        MBEDTLS_SSL_DEBUG_BUF(3, "session id", ssl->session_negotiate->id,
2304                              ssl->session_negotiate->id_len);
2305    }
2306
2307    /* ...
2308     * CipherSuite cipher_suite;
2309     * ...
2310     * with CipherSuite defined as:
2311     * uint8 CipherSuite[2];
2312     */
2313    MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
2314    MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
2315    p += 2;
2316    MBEDTLS_SSL_DEBUG_MSG(3,
2317                          ("server hello, chosen ciphersuite: %s ( id=%d )",
2318                           mbedtls_ssl_get_ciphersuite_name(
2319                               ssl->session_negotiate->ciphersuite),
2320                           ssl->session_negotiate->ciphersuite));
2321
2322    /* ...
2323     * uint8 legacy_compression_method = 0;
2324     * ...
2325     */
2326    MBEDTLS_SSL_CHK_BUF_PTR(p, end, 1);
2327    *p++ = MBEDTLS_SSL_COMPRESS_NULL;
2328
2329    /* ...
2330     * Extension extensions<6..2^16-1>;
2331     * ...
2332     * struct {
2333     *      ExtensionType extension_type; (2 bytes)
2334     *      opaque extension_data<0..2^16-1>;
2335     * } Extension;
2336     */
2337    MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
2338    p_extensions_len = p;
2339    p += 2;
2340
2341    if ((ret = ssl_tls13_write_server_hello_supported_versions_ext(
2342             ssl, p, end, &output_len)) != 0) {
2343        MBEDTLS_SSL_DEBUG_RET(
2344            1, "ssl_tls13_write_server_hello_supported_versions_ext", ret);
2345        return ret;
2346    }
2347    p += output_len;
2348
2349    if (mbedtls_ssl_tls13_key_exchange_mode_with_ephemeral(ssl)) {
2350        if (is_hrr) {
2351            ret = ssl_tls13_write_hrr_key_share_ext(ssl, p, end, &output_len);
2352        } else {
2353            ret = ssl_tls13_write_key_share_ext(ssl, p, end, &output_len);
2354        }
2355        if (ret != 0) {
2356            return ret;
2357        }
2358        p += output_len;
2359    }
2360
2361#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
2362    if (!is_hrr && mbedtls_ssl_tls13_key_exchange_mode_with_psk(ssl)) {
2363        ret = ssl_tls13_write_server_pre_shared_key_ext(ssl, p, end, &output_len);
2364        if (ret != 0) {
2365            MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_write_server_pre_shared_key_ext",
2366                                  ret);
2367            return ret;
2368        }
2369        p += output_len;
2370    }
2371#endif
2372
2373    MBEDTLS_PUT_UINT16_BE(p - p_extensions_len - 2, p_extensions_len, 0);
2374
2375    MBEDTLS_SSL_DEBUG_BUF(4, "server hello extensions",
2376                          p_extensions_len, p - p_extensions_len);
2377
2378    *out_len = p - buf;
2379
2380    MBEDTLS_SSL_DEBUG_BUF(3, "server hello", buf, *out_len);
2381
2382    MBEDTLS_SSL_PRINT_EXTS(
2383        3, is_hrr ? MBEDTLS_SSL_TLS1_3_HS_HELLO_RETRY_REQUEST :
2384        MBEDTLS_SSL_HS_SERVER_HELLO,
2385        ssl->handshake->sent_extensions);
2386
2387    return ret;
2388}
2389
2390MBEDTLS_CHECK_RETURN_CRITICAL
2391static int ssl_tls13_finalize_server_hello(mbedtls_ssl_context *ssl)
2392{
2393    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2394    ret = mbedtls_ssl_tls13_compute_handshake_transform(ssl);
2395    if (ret != 0) {
2396        MBEDTLS_SSL_DEBUG_RET(1,
2397                              "mbedtls_ssl_tls13_compute_handshake_transform",
2398                              ret);
2399        return ret;
2400    }
2401
2402    return ret;
2403}
2404
2405MBEDTLS_CHECK_RETURN_CRITICAL
2406static int ssl_tls13_write_server_hello(mbedtls_ssl_context *ssl)
2407{
2408    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2409    unsigned char *buf;
2410    size_t buf_len, msg_len;
2411
2412    MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
2413
2414    MBEDTLS_SSL_PROC_CHK(ssl_tls13_prepare_server_hello(ssl));
2415
2416    MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(
2417                             ssl, MBEDTLS_SSL_HS_SERVER_HELLO, &buf, &buf_len));
2418
2419    MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_server_hello_body(ssl, buf,
2420                                                           buf + buf_len,
2421                                                           &msg_len,
2422                                                           0));
2423
2424    MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
2425                             ssl, MBEDTLS_SSL_HS_SERVER_HELLO, buf, msg_len));
2426
2427    MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
2428                             ssl, buf_len, msg_len));
2429
2430    MBEDTLS_SSL_PROC_CHK(ssl_tls13_finalize_server_hello(ssl));
2431
2432#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
2433    /* The server sends a dummy change_cipher_spec record immediately
2434     * after its first handshake message. This may either be after
2435     * a ServerHello or a HelloRetryRequest.
2436     */
2437    mbedtls_ssl_handshake_set_state(
2438        ssl, MBEDTLS_SSL_SERVER_CCS_AFTER_SERVER_HELLO);
2439#else
2440    mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS);
2441#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
2442
2443cleanup:
2444
2445    MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
2446    return ret;
2447}
2448
2449
2450/*
2451 * Handler for MBEDTLS_SSL_HELLO_RETRY_REQUEST
2452 */
2453MBEDTLS_CHECK_RETURN_CRITICAL
2454static int ssl_tls13_prepare_hello_retry_request(mbedtls_ssl_context *ssl)
2455{
2456    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2457    if (ssl->handshake->hello_retry_request_flag) {
2458        MBEDTLS_SSL_DEBUG_MSG(1, ("Too many HRRs"));
2459        MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
2460                                     MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
2461        return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2462    }
2463
2464    /*
2465     * Create stateless transcript hash for HRR
2466     */
2467    MBEDTLS_SSL_DEBUG_MSG(4, ("Reset transcript for HRR"));
2468    ret = mbedtls_ssl_reset_transcript_for_hrr(ssl);
2469    if (ret != 0) {
2470        MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_reset_transcript_for_hrr", ret);
2471        return ret;
2472    }
2473    mbedtls_ssl_session_reset_msg_layer(ssl, 0);
2474
2475    return 0;
2476}
2477
2478MBEDTLS_CHECK_RETURN_CRITICAL
2479static int ssl_tls13_write_hello_retry_request(mbedtls_ssl_context *ssl)
2480{
2481    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2482    unsigned char *buf;
2483    size_t buf_len, msg_len;
2484
2485    MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello retry request"));
2486
2487    MBEDTLS_SSL_PROC_CHK(ssl_tls13_prepare_hello_retry_request(ssl));
2488
2489    MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(
2490                             ssl, MBEDTLS_SSL_HS_SERVER_HELLO,
2491                             &buf, &buf_len));
2492
2493    MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_server_hello_body(ssl, buf,
2494                                                           buf + buf_len,
2495                                                           &msg_len,
2496                                                           1));
2497    MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
2498                             ssl, MBEDTLS_SSL_HS_SERVER_HELLO, buf, msg_len));
2499
2500
2501    MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(ssl, buf_len,
2502                                                          msg_len));
2503
2504    ssl->handshake->hello_retry_request_flag = 1;
2505
2506#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
2507    /* The server sends a dummy change_cipher_spec record immediately
2508     * after its first handshake message. This may either be after
2509     * a ServerHello or a HelloRetryRequest.
2510     */
2511    mbedtls_ssl_handshake_set_state(
2512        ssl, MBEDTLS_SSL_SERVER_CCS_AFTER_HELLO_RETRY_REQUEST);
2513#else
2514    mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO);
2515#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
2516
2517cleanup:
2518    MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello retry request"));
2519    return ret;
2520}
2521
2522/*
2523 * Handler for MBEDTLS_SSL_ENCRYPTED_EXTENSIONS
2524 */
2525
2526/*
2527 * struct {
2528 *    Extension extensions<0..2 ^ 16 - 1>;
2529 * } EncryptedExtensions;
2530 *
2531 */
2532MBEDTLS_CHECK_RETURN_CRITICAL
2533static int ssl_tls13_write_encrypted_extensions_body(mbedtls_ssl_context *ssl,
2534                                                     unsigned char *buf,
2535                                                     unsigned char *end,
2536                                                     size_t *out_len)
2537{
2538    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2539    unsigned char *p = buf;
2540    size_t extensions_len = 0;
2541    unsigned char *p_extensions_len;
2542    size_t output_len;
2543
2544    *out_len = 0;
2545
2546    MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
2547    p_extensions_len = p;
2548    p += 2;
2549
2550    ((void) ssl);
2551    ((void) ret);
2552    ((void) output_len);
2553
2554#if defined(MBEDTLS_SSL_ALPN)
2555    ret = mbedtls_ssl_write_alpn_ext(ssl, p, end, &output_len);
2556    if (ret != 0) {
2557        return ret;
2558    }
2559    p += output_len;
2560#endif /* MBEDTLS_SSL_ALPN */
2561
2562#if defined(MBEDTLS_SSL_EARLY_DATA)
2563    if (ssl->handshake->early_data_accepted) {
2564        ret = mbedtls_ssl_tls13_write_early_data_ext(
2565            ssl, 0, p, end, &output_len);
2566        if (ret != 0) {
2567            return ret;
2568        }
2569        p += output_len;
2570    }
2571#endif /* MBEDTLS_SSL_EARLY_DATA */
2572
2573#if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT)
2574    if (ssl->handshake->received_extensions & MBEDTLS_SSL_EXT_MASK(RECORD_SIZE_LIMIT)) {
2575        ret = mbedtls_ssl_tls13_write_record_size_limit_ext(
2576            ssl, p, end, &output_len);
2577        if (ret != 0) {
2578            return ret;
2579        }
2580        p += output_len;
2581    }
2582#endif
2583
2584    extensions_len = (p - p_extensions_len) - 2;
2585    MBEDTLS_PUT_UINT16_BE(extensions_len, p_extensions_len, 0);
2586
2587    *out_len = p - buf;
2588
2589    MBEDTLS_SSL_DEBUG_BUF(4, "encrypted extensions", buf, *out_len);
2590
2591    MBEDTLS_SSL_PRINT_EXTS(
2592        3, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS, ssl->handshake->sent_extensions);
2593
2594    return 0;
2595}
2596
2597MBEDTLS_CHECK_RETURN_CRITICAL
2598static int ssl_tls13_write_encrypted_extensions(mbedtls_ssl_context *ssl)
2599{
2600    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2601    unsigned char *buf;
2602    size_t buf_len, msg_len;
2603
2604    mbedtls_ssl_set_outbound_transform(ssl,
2605                                       ssl->handshake->transform_handshake);
2606    MBEDTLS_SSL_DEBUG_MSG(
2607        3, ("switching to handshake transform for outbound data"));
2608
2609    MBEDTLS_SSL_DEBUG_MSG(2, ("=> write encrypted extensions"));
2610
2611    MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(
2612                             ssl, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS,
2613                             &buf, &buf_len));
2614
2615    MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_encrypted_extensions_body(
2616                             ssl, buf, buf + buf_len, &msg_len));
2617
2618    MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
2619                             ssl, MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS,
2620                             buf, msg_len));
2621
2622    MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
2623                             ssl, buf_len, msg_len));
2624
2625#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
2626    if (mbedtls_ssl_tls13_key_exchange_mode_with_psk(ssl)) {
2627        mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_FINISHED);
2628    } else {
2629        mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CERTIFICATE_REQUEST);
2630    }
2631#else
2632    mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_FINISHED);
2633#endif
2634
2635cleanup:
2636
2637    MBEDTLS_SSL_DEBUG_MSG(2, ("<= write encrypted extensions"));
2638    return ret;
2639}
2640
2641#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
2642#define SSL_CERTIFICATE_REQUEST_SEND_REQUEST 0
2643#define SSL_CERTIFICATE_REQUEST_SKIP         1
2644/* Coordination:
2645 * Check whether a CertificateRequest message should be written.
2646 * Returns a negative code on failure, or
2647 * - SSL_CERTIFICATE_REQUEST_SEND_REQUEST
2648 * - SSL_CERTIFICATE_REQUEST_SKIP
2649 * indicating if the writing of the CertificateRequest
2650 * should be skipped or not.
2651 */
2652MBEDTLS_CHECK_RETURN_CRITICAL
2653static int ssl_tls13_certificate_request_coordinate(mbedtls_ssl_context *ssl)
2654{
2655    int authmode;
2656
2657#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2658    if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
2659        authmode = ssl->handshake->sni_authmode;
2660    } else
2661#endif
2662    authmode = ssl->conf->authmode;
2663
2664    if (authmode == MBEDTLS_SSL_VERIFY_NONE) {
2665        ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_SKIP_VERIFY;
2666        return SSL_CERTIFICATE_REQUEST_SKIP;
2667    }
2668
2669    ssl->handshake->certificate_request_sent = 1;
2670
2671    return SSL_CERTIFICATE_REQUEST_SEND_REQUEST;
2672}
2673
2674/*
2675 * struct {
2676 *   opaque certificate_request_context<0..2^8-1>;
2677 *   Extension extensions<2..2^16-1>;
2678 * } CertificateRequest;
2679 *
2680 */
2681MBEDTLS_CHECK_RETURN_CRITICAL
2682static int ssl_tls13_write_certificate_request_body(mbedtls_ssl_context *ssl,
2683                                                    unsigned char *buf,
2684                                                    const unsigned char *end,
2685                                                    size_t *out_len)
2686{
2687    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2688    unsigned char *p = buf;
2689    size_t output_len = 0;
2690    unsigned char *p_extensions_len;
2691
2692    *out_len = 0;
2693
2694    /* Check if we have enough space:
2695     * - certificate_request_context (1 byte)
2696     * - extensions length           (2 bytes)
2697     */
2698    MBEDTLS_SSL_CHK_BUF_PTR(p, end, 3);
2699
2700    /*
2701     * Write certificate_request_context
2702     */
2703    /*
2704     * We use a zero length context for the normal handshake
2705     * messages. For post-authentication handshake messages
2706     * this request context would be set to a non-zero value.
2707     */
2708    *p++ = 0x0;
2709
2710    /*
2711     * Write extensions
2712     */
2713    /* The extensions must contain the signature_algorithms. */
2714    p_extensions_len = p;
2715    p += 2;
2716    ret = mbedtls_ssl_write_sig_alg_ext(ssl, p, end, &output_len);
2717    if (ret != 0) {
2718        return ret;
2719    }
2720
2721    p += output_len;
2722    MBEDTLS_PUT_UINT16_BE(p - p_extensions_len - 2, p_extensions_len, 0);
2723
2724    *out_len = p - buf;
2725
2726    MBEDTLS_SSL_PRINT_EXTS(
2727        3, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST, ssl->handshake->sent_extensions);
2728
2729    return 0;
2730}
2731
2732MBEDTLS_CHECK_RETURN_CRITICAL
2733static int ssl_tls13_write_certificate_request(mbedtls_ssl_context *ssl)
2734{
2735    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2736
2737    MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
2738
2739    MBEDTLS_SSL_PROC_CHK_NEG(ssl_tls13_certificate_request_coordinate(ssl));
2740
2741    if (ret == SSL_CERTIFICATE_REQUEST_SEND_REQUEST) {
2742        unsigned char *buf;
2743        size_t buf_len, msg_len;
2744
2745        MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(
2746                                 ssl, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST,
2747                                 &buf, &buf_len));
2748
2749        MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_certificate_request_body(
2750                                 ssl, buf, buf + buf_len, &msg_len));
2751
2752        MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
2753                                 ssl, MBEDTLS_SSL_HS_CERTIFICATE_REQUEST,
2754                                 buf, msg_len));
2755
2756        MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
2757                                 ssl, buf_len, msg_len));
2758    } else if (ret == SSL_CERTIFICATE_REQUEST_SKIP) {
2759        MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2760        ret = 0;
2761    } else {
2762        MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2763        ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
2764        goto cleanup;
2765    }
2766
2767    mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_CERTIFICATE);
2768cleanup:
2769
2770    MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
2771    return ret;
2772}
2773
2774/*
2775 * Handler for MBEDTLS_SSL_SERVER_CERTIFICATE
2776 */
2777MBEDTLS_CHECK_RETURN_CRITICAL
2778static int ssl_tls13_write_server_certificate(mbedtls_ssl_context *ssl)
2779{
2780    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2781
2782#if defined(MBEDTLS_X509_CRT_PARSE_C)
2783    if ((ssl_tls13_pick_key_cert(ssl) != 0) ||
2784        mbedtls_ssl_own_cert(ssl) == NULL) {
2785        MBEDTLS_SSL_DEBUG_MSG(2, ("No certificate available."));
2786        MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
2787                                     MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
2788        return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2789    }
2790#endif /* MBEDTLS_X509_CRT_PARSE_C */
2791
2792    ret = mbedtls_ssl_tls13_write_certificate(ssl);
2793    if (ret != 0) {
2794        return ret;
2795    }
2796    mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CERTIFICATE_VERIFY);
2797    return 0;
2798}
2799
2800/*
2801 * Handler for MBEDTLS_SSL_CERTIFICATE_VERIFY
2802 */
2803MBEDTLS_CHECK_RETURN_CRITICAL
2804static int ssl_tls13_write_certificate_verify(mbedtls_ssl_context *ssl)
2805{
2806    int ret = mbedtls_ssl_tls13_write_certificate_verify(ssl);
2807    if (ret != 0) {
2808        return ret;
2809    }
2810    mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_SERVER_FINISHED);
2811    return 0;
2812}
2813#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
2814
2815/*
2816 * RFC 8446 section A.2
2817 *
2818 *                                | Send ServerHello
2819 *                                | K_send = handshake
2820 *                                | Send EncryptedExtensions
2821 *                                | [Send CertificateRequest]
2822 * Can send                       | [Send Certificate + CertificateVerify]
2823 * app data                       | Send Finished
2824 * after   -->                    | K_send = application
2825 * here                  +--------+--------+
2826 *              No 0-RTT |                 | 0-RTT
2827 *                       |                 |
2828 *   K_recv = handshake  |                 | K_recv = early data
2829 * [Skip decrypt errors] |    +------> WAIT_EOED -+
2830 *                       |    |       Recv |      | Recv EndOfEarlyData
2831 *                       |    | early data |      | K_recv = handshake
2832 *                       |    +------------+      |
2833 *                       |                        |
2834 *                       +> WAIT_FLIGHT2 <--------+
2835 *                                |
2836 *                       +--------+--------+
2837 *               No auth |                 | Client auth
2838 *                       |                 |
2839 *                       |                 v
2840 *                       |             WAIT_CERT
2841 *                       |        Recv |       | Recv Certificate
2842 *                       |       empty |       v
2843 *                       | Certificate |    WAIT_CV
2844 *                       |             |       | Recv
2845 *                       |             v       | CertificateVerify
2846 *                       +-> WAIT_FINISHED <---+
2847 *                                | Recv Finished
2848 *
2849 *
2850 * The following function handles the state changes after WAIT_FLIGHT2 in the
2851 * above diagram. We are not going to receive early data related messages
2852 * anymore, prepare to receive the first handshake message of the client
2853 * second flight.
2854 */
2855static void ssl_tls13_prepare_for_handshake_second_flight(
2856    mbedtls_ssl_context *ssl)
2857{
2858    if (ssl->handshake->certificate_request_sent) {
2859        mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE);
2860    } else {
2861        MBEDTLS_SSL_DEBUG_MSG(2, ("skip parse certificate"));
2862        MBEDTLS_SSL_DEBUG_MSG(2, ("skip parse certificate verify"));
2863
2864        mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_FINISHED);
2865    }
2866}
2867
2868/*
2869 * Handler for MBEDTLS_SSL_SERVER_FINISHED
2870 */
2871MBEDTLS_CHECK_RETURN_CRITICAL
2872static int ssl_tls13_write_server_finished(mbedtls_ssl_context *ssl)
2873{
2874    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2875
2876    ret = mbedtls_ssl_tls13_write_finished_message(ssl);
2877    if (ret != 0) {
2878        return ret;
2879    }
2880
2881    ret = mbedtls_ssl_tls13_compute_application_transform(ssl);
2882    if (ret != 0) {
2883        MBEDTLS_SSL_PEND_FATAL_ALERT(
2884            MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
2885            MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
2886        return ret;
2887    }
2888
2889#if defined(MBEDTLS_SSL_EARLY_DATA)
2890    if (ssl->handshake->early_data_accepted) {
2891        /* See RFC 8446 section A.2 for more information */
2892        MBEDTLS_SSL_DEBUG_MSG(
2893            1, ("Switch to early keys for inbound traffic. "
2894                "( K_recv = early data )"));
2895        mbedtls_ssl_set_inbound_transform(
2896            ssl, ssl->handshake->transform_earlydata);
2897        mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_END_OF_EARLY_DATA);
2898        return 0;
2899    }
2900#endif /* MBEDTLS_SSL_EARLY_DATA */
2901    MBEDTLS_SSL_DEBUG_MSG(
2902        1, ("Switch to handshake keys for inbound traffic "
2903            "( K_recv = handshake )"));
2904    mbedtls_ssl_set_inbound_transform(ssl, ssl->handshake->transform_handshake);
2905
2906    ssl_tls13_prepare_for_handshake_second_flight(ssl);
2907
2908    return 0;
2909}
2910
2911#if defined(MBEDTLS_SSL_EARLY_DATA)
2912/*
2913 * Handler for MBEDTLS_SSL_END_OF_EARLY_DATA
2914 */
2915#define SSL_GOT_END_OF_EARLY_DATA      0
2916#define SSL_GOT_EARLY_DATA             1
2917/* Coordination:
2918 * Deals with the ambiguity of not knowing if the next message is an
2919 * EndOfEarlyData message or an application message containing early data.
2920 * Returns a negative code on failure, or
2921 * - SSL_GOT_END_OF_EARLY_DATA
2922 * - SSL_GOT_EARLY_DATA
2923 * indicating which message is received.
2924 */
2925MBEDTLS_CHECK_RETURN_CRITICAL
2926static int ssl_tls13_end_of_early_data_coordinate(mbedtls_ssl_context *ssl)
2927{
2928    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2929
2930    if ((ret = mbedtls_ssl_read_record(ssl, 0)) != 0) {
2931        MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
2932        return ret;
2933    }
2934    ssl->keep_current_message = 1;
2935
2936    if (ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE        &&
2937        ssl->in_msg[0]  == MBEDTLS_SSL_HS_END_OF_EARLY_DATA) {
2938        MBEDTLS_SSL_DEBUG_MSG(3, ("Received an end_of_early_data message."));
2939        return SSL_GOT_END_OF_EARLY_DATA;
2940    }
2941
2942    if (ssl->in_msgtype == MBEDTLS_SSL_MSG_APPLICATION_DATA) {
2943        if (ssl->in_offt == NULL) {
2944            MBEDTLS_SSL_DEBUG_MSG(3, ("Received early data"));
2945            /* Set the reading pointer */
2946            ssl->in_offt = ssl->in_msg;
2947            ret = mbedtls_ssl_tls13_check_early_data_len(ssl, ssl->in_msglen);
2948            if (ret != 0) {
2949                return ret;
2950            }
2951        }
2952        return SSL_GOT_EARLY_DATA;
2953    }
2954
2955    MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE,
2956                                 MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE);
2957    return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
2958}
2959
2960MBEDTLS_CHECK_RETURN_CRITICAL
2961static int ssl_tls13_parse_end_of_early_data(mbedtls_ssl_context *ssl,
2962                                             const unsigned char *buf,
2963                                             const unsigned char *end)
2964{
2965    /* RFC 8446 section 4.5
2966     *
2967     * struct {} EndOfEarlyData;
2968     */
2969    if (buf != end) {
2970        MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
2971                                     MBEDTLS_ERR_SSL_DECODE_ERROR);
2972        return MBEDTLS_ERR_SSL_DECODE_ERROR;
2973    }
2974    return 0;
2975}
2976
2977/*
2978 * RFC 8446 section A.2
2979 *
2980 *                                | Send ServerHello
2981 *                                | K_send = handshake
2982 *                                | Send EncryptedExtensions
2983 *                                | [Send CertificateRequest]
2984 * Can send                       | [Send Certificate + CertificateVerify]
2985 * app data                       | Send Finished
2986 * after   -->                    | K_send = application
2987 * here                  +--------+--------+
2988 *              No 0-RTT |                 | 0-RTT
2989 *                       |                 |
2990 *   K_recv = handshake  |                 | K_recv = early data
2991 * [Skip decrypt errors] |    +------> WAIT_EOED -+
2992 *                       |    |       Recv |      | Recv EndOfEarlyData
2993 *                       |    | early data |      | K_recv = handshake
2994 *                       |    +------------+      |
2995 *                       |                        |
2996 *                       +> WAIT_FLIGHT2 <--------+
2997 *                                |
2998 *                       +--------+--------+
2999 *               No auth |                 | Client auth
3000 *                       |                 |
3001 *                       |                 v
3002 *                       |             WAIT_CERT
3003 *                       |        Recv |       | Recv Certificate
3004 *                       |       empty |       v
3005 *                       | Certificate |    WAIT_CV
3006 *                       |             |       | Recv
3007 *                       |             v       | CertificateVerify
3008 *                       +-> WAIT_FINISHED <---+
3009 *                                | Recv Finished
3010 *
3011 * The function handles actions and state changes from 0-RTT to WAIT_FLIGHT2 in
3012 * the above diagram.
3013 */
3014MBEDTLS_CHECK_RETURN_CRITICAL
3015static int ssl_tls13_process_end_of_early_data(mbedtls_ssl_context *ssl)
3016{
3017    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3018
3019    MBEDTLS_SSL_DEBUG_MSG(2, ("=> ssl_tls13_process_end_of_early_data"));
3020
3021    MBEDTLS_SSL_PROC_CHK_NEG(ssl_tls13_end_of_early_data_coordinate(ssl));
3022
3023    if (ret == SSL_GOT_END_OF_EARLY_DATA) {
3024        unsigned char *buf;
3025        size_t buf_len;
3026
3027        MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
3028                                 ssl, MBEDTLS_SSL_HS_END_OF_EARLY_DATA,
3029                                 &buf, &buf_len));
3030
3031        MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_end_of_early_data(
3032                                 ssl, buf, buf + buf_len));
3033
3034        MBEDTLS_SSL_DEBUG_MSG(
3035            1, ("Switch to handshake keys for inbound traffic"
3036                "( K_recv = handshake )"));
3037        mbedtls_ssl_set_inbound_transform(
3038            ssl, ssl->handshake->transform_handshake);
3039
3040        MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
3041                                 ssl, MBEDTLS_SSL_HS_END_OF_EARLY_DATA,
3042                                 buf, buf_len));
3043
3044        ssl_tls13_prepare_for_handshake_second_flight(ssl);
3045
3046    } else if (ret == SSL_GOT_EARLY_DATA) {
3047        ret = MBEDTLS_ERR_SSL_RECEIVED_EARLY_DATA;
3048        goto cleanup;
3049    } else {
3050        MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3051        ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
3052        goto cleanup;
3053    }
3054
3055cleanup:
3056    MBEDTLS_SSL_DEBUG_MSG(2, ("<= ssl_tls13_process_end_of_early_data"));
3057    return ret;
3058}
3059#endif /* MBEDTLS_SSL_EARLY_DATA */
3060
3061/*
3062 * Handler for MBEDTLS_SSL_CLIENT_FINISHED
3063 */
3064MBEDTLS_CHECK_RETURN_CRITICAL
3065static int ssl_tls13_process_client_finished(mbedtls_ssl_context *ssl)
3066{
3067    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3068
3069    ret = mbedtls_ssl_tls13_process_finished_message(ssl);
3070    if (ret != 0) {
3071        return ret;
3072    }
3073
3074    ret = mbedtls_ssl_tls13_compute_resumption_master_secret(ssl);
3075    if (ret != 0) {
3076        MBEDTLS_SSL_DEBUG_RET(
3077            1, "mbedtls_ssl_tls13_compute_resumption_master_secret", ret);
3078    }
3079
3080    mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_WRAPUP);
3081    return 0;
3082}
3083
3084/*
3085 * Handler for MBEDTLS_SSL_HANDSHAKE_WRAPUP
3086 */
3087MBEDTLS_CHECK_RETURN_CRITICAL
3088static int ssl_tls13_handshake_wrapup(mbedtls_ssl_context *ssl)
3089{
3090    MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
3091
3092    mbedtls_ssl_tls13_handshake_wrapup(ssl);
3093
3094#if defined(MBEDTLS_SSL_SESSION_TICKETS) && \
3095    defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
3096/* TODO: Remove the check of SOME_PSK_ENABLED since SESSION_TICKETS requires
3097 *       SOME_PSK_ENABLED to be enabled. Here is just to make CI happy. It is
3098 *       expected to be resolved with issue#6395.
3099 */
3100    /* Sent NewSessionTicket message only when client supports PSK */
3101    if (mbedtls_ssl_tls13_is_some_psk_supported(ssl)) {
3102        mbedtls_ssl_handshake_set_state(
3103            ssl, MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET);
3104    } else
3105#endif
3106    {
3107        mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_OVER);
3108    }
3109    return 0;
3110}
3111
3112/*
3113 * Handler for MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET
3114 */
3115#define SSL_NEW_SESSION_TICKET_SKIP  0
3116#define SSL_NEW_SESSION_TICKET_WRITE 1
3117MBEDTLS_CHECK_RETURN_CRITICAL
3118static int ssl_tls13_write_new_session_ticket_coordinate(mbedtls_ssl_context *ssl)
3119{
3120    /* Check whether the use of session tickets is enabled */
3121    if (ssl->conf->f_ticket_write == NULL) {
3122        MBEDTLS_SSL_DEBUG_MSG(2, ("NewSessionTicket: disabled,"
3123                                  " callback is not set"));
3124        return SSL_NEW_SESSION_TICKET_SKIP;
3125    }
3126    if (ssl->conf->new_session_tickets_count == 0) {
3127        MBEDTLS_SSL_DEBUG_MSG(2, ("NewSessionTicket: disabled,"
3128                                  " configured count is zero"));
3129        return SSL_NEW_SESSION_TICKET_SKIP;
3130    }
3131
3132    if (ssl->handshake->new_session_tickets_count == 0) {
3133        MBEDTLS_SSL_DEBUG_MSG(2, ("NewSessionTicket: all tickets have "
3134                                  "been sent."));
3135        return SSL_NEW_SESSION_TICKET_SKIP;
3136    }
3137
3138    return SSL_NEW_SESSION_TICKET_WRITE;
3139}
3140
3141#if defined(MBEDTLS_SSL_SESSION_TICKETS)
3142MBEDTLS_CHECK_RETURN_CRITICAL
3143static int ssl_tls13_prepare_new_session_ticket(mbedtls_ssl_context *ssl,
3144                                                unsigned char *ticket_nonce,
3145                                                size_t ticket_nonce_size)
3146{
3147    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3148    mbedtls_ssl_session *session = ssl->session;
3149    mbedtls_ssl_ciphersuite_t *ciphersuite_info;
3150    psa_algorithm_t psa_hash_alg;
3151    int hash_length;
3152
3153    MBEDTLS_SSL_DEBUG_MSG(2, ("=> prepare NewSessionTicket msg"));
3154
3155    /* Set ticket_flags depends on the advertised psk key exchange mode */
3156    mbedtls_ssl_tls13_session_clear_ticket_flags(
3157        session, MBEDTLS_SSL_TLS1_3_TICKET_FLAGS_MASK);
3158#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
3159    mbedtls_ssl_tls13_session_set_ticket_flags(
3160        session, ssl->handshake->tls13_kex_modes);
3161#endif
3162
3163#if defined(MBEDTLS_SSL_EARLY_DATA)
3164    if (ssl->conf->early_data_enabled == MBEDTLS_SSL_EARLY_DATA_ENABLED &&
3165        ssl->conf->max_early_data_size > 0) {
3166        mbedtls_ssl_tls13_session_set_ticket_flags(
3167            session, MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA);
3168        session->max_early_data_size = ssl->conf->max_early_data_size;
3169    }
3170#endif /* MBEDTLS_SSL_EARLY_DATA */
3171
3172    MBEDTLS_SSL_PRINT_TICKET_FLAGS(4, session->ticket_flags);
3173
3174#if defined(MBEDTLS_SSL_EARLY_DATA) && defined(MBEDTLS_SSL_ALPN)
3175    if (session->ticket_alpn == NULL) {
3176        ret = mbedtls_ssl_session_set_ticket_alpn(session, ssl->alpn_chosen);
3177        if (ret != 0) {
3178            return ret;
3179        }
3180    }
3181#endif
3182
3183    /* Generate ticket_age_add */
3184    if ((ret = ssl->conf->f_rng(ssl->conf->p_rng,
3185                                (unsigned char *) &session->ticket_age_add,
3186                                sizeof(session->ticket_age_add)) != 0)) {
3187        MBEDTLS_SSL_DEBUG_RET(1, "generate_ticket_age_add", ret);
3188        return ret;
3189    }
3190    MBEDTLS_SSL_DEBUG_MSG(3, ("ticket_age_add: %u",
3191                              (unsigned int) session->ticket_age_add));
3192
3193    /* Generate ticket_nonce */
3194    ret = ssl->conf->f_rng(ssl->conf->p_rng, ticket_nonce, ticket_nonce_size);
3195    if (ret != 0) {
3196        MBEDTLS_SSL_DEBUG_RET(1, "generate_ticket_nonce", ret);
3197        return ret;
3198    }
3199    MBEDTLS_SSL_DEBUG_BUF(3, "ticket_nonce:",
3200                          ticket_nonce, ticket_nonce_size);
3201
3202    ciphersuite_info =
3203        (mbedtls_ssl_ciphersuite_t *) ssl->handshake->ciphersuite_info;
3204    psa_hash_alg = mbedtls_md_psa_alg_from_type((mbedtls_md_type_t) ciphersuite_info->mac);
3205    hash_length = PSA_HASH_LENGTH(psa_hash_alg);
3206    if (hash_length == -1 ||
3207        (size_t) hash_length > sizeof(session->resumption_key)) {
3208        return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
3209    }
3210
3211    /* In this code the psk key length equals the length of the hash */
3212    session->resumption_key_len = hash_length;
3213    session->ciphersuite = ciphersuite_info->id;
3214
3215    /* Compute resumption key
3216     *
3217     *  HKDF-Expand-Label( resumption_master_secret,
3218     *                    "resumption", ticket_nonce, Hash.length )
3219     */
3220    ret = mbedtls_ssl_tls13_hkdf_expand_label(
3221        psa_hash_alg,
3222        session->app_secrets.resumption_master_secret,
3223        hash_length,
3224        MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(resumption),
3225        ticket_nonce,
3226        ticket_nonce_size,
3227        session->resumption_key,
3228        hash_length);
3229
3230    if (ret != 0) {
3231        MBEDTLS_SSL_DEBUG_RET(2,
3232                              "Creating the ticket-resumed PSK failed",
3233                              ret);
3234        return ret;
3235    }
3236    MBEDTLS_SSL_DEBUG_BUF(3, "Ticket-resumed PSK",
3237                          session->resumption_key,
3238                          session->resumption_key_len);
3239
3240    MBEDTLS_SSL_DEBUG_BUF(3, "resumption_master_secret",
3241                          session->app_secrets.resumption_master_secret,
3242                          hash_length);
3243
3244    return 0;
3245}
3246
3247/* This function creates a NewSessionTicket message in the following format:
3248 *
3249 * struct {
3250 *    uint32 ticket_lifetime;
3251 *    uint32 ticket_age_add;
3252 *    opaque ticket_nonce<0..255>;
3253 *    opaque ticket<1..2^16-1>;
3254 *    Extension extensions<0..2^16-2>;
3255 * } NewSessionTicket;
3256 *
3257 * The ticket inside the NewSessionTicket message is an encrypted container
3258 * carrying the necessary information so that the server is later able to
3259 * re-start the communication.
3260 *
3261 * The following fields are placed inside the ticket by the
3262 * f_ticket_write() function:
3263 *
3264 *  - creation time (ticket_creation_time)
3265 *  - flags (ticket_flags)
3266 *  - age add (ticket_age_add)
3267 *  - key (resumption_key)
3268 *  - key length (resumption_key_len)
3269 *  - ciphersuite (ciphersuite)
3270 *  - max_early_data_size (max_early_data_size)
3271 */
3272MBEDTLS_CHECK_RETURN_CRITICAL
3273static int ssl_tls13_write_new_session_ticket_body(mbedtls_ssl_context *ssl,
3274                                                   unsigned char *buf,
3275                                                   unsigned char *end,
3276                                                   size_t *out_len,
3277                                                   unsigned char *ticket_nonce,
3278                                                   size_t ticket_nonce_size)
3279{
3280    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3281    unsigned char *p = buf;
3282    mbedtls_ssl_session *session = ssl->session;
3283    size_t ticket_len;
3284    uint32_t ticket_lifetime;
3285    unsigned char *p_extensions_len;
3286
3287    *out_len = 0;
3288    MBEDTLS_SSL_DEBUG_MSG(2, ("=> write NewSessionTicket msg"));
3289
3290    /*
3291     *    ticket_lifetime   4 bytes
3292     *    ticket_age_add    4 bytes
3293     *    ticket_nonce      1 + ticket_nonce_size bytes
3294     *    ticket            >=2 bytes
3295     */
3296    MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4 + 4 + 1 + ticket_nonce_size + 2);
3297
3298    /* Generate ticket and ticket_lifetime */
3299#if defined(MBEDTLS_HAVE_TIME)
3300    session->ticket_creation_time = mbedtls_ms_time();
3301#endif
3302    ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
3303                                    session,
3304                                    p + 9 + ticket_nonce_size + 2,
3305                                    end,
3306                                    &ticket_len,
3307                                    &ticket_lifetime);
3308    if (ret != 0) {
3309        MBEDTLS_SSL_DEBUG_RET(1, "write_ticket", ret);
3310        return ret;
3311    }
3312
3313    /* RFC 8446 section 4.6.1
3314     *
3315     *  ticket_lifetime:  Indicates the lifetime in seconds as a 32-bit
3316     *     unsigned integer in network byte order from the time of ticket
3317     *     issuance.  Servers MUST NOT use any value greater than
3318     *     604800 seconds (7 days) ...
3319     */
3320    if (ticket_lifetime > MBEDTLS_SSL_TLS1_3_MAX_ALLOWED_TICKET_LIFETIME) {
3321        MBEDTLS_SSL_DEBUG_MSG(
3322            1, ("Ticket lifetime (%u) is greater than 7 days.",
3323                (unsigned int) ticket_lifetime));
3324        return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
3325    }
3326
3327    MBEDTLS_PUT_UINT32_BE(ticket_lifetime, p, 0);
3328    MBEDTLS_SSL_DEBUG_MSG(3, ("ticket_lifetime: %u",
3329                              (unsigned int) ticket_lifetime));
3330
3331    /* Write ticket_age_add */
3332    MBEDTLS_PUT_UINT32_BE(session->ticket_age_add, p, 4);
3333    MBEDTLS_SSL_DEBUG_MSG(3, ("ticket_age_add: %u",
3334                              (unsigned int) session->ticket_age_add));
3335
3336    /* Write ticket_nonce */
3337    p[8] = (unsigned char) ticket_nonce_size;
3338    if (ticket_nonce_size > 0) {
3339        memcpy(p + 9, ticket_nonce, ticket_nonce_size);
3340    }
3341    p += 9 + ticket_nonce_size;
3342
3343    /* Write ticket */
3344    MBEDTLS_PUT_UINT16_BE(ticket_len, p, 0);
3345    p += 2;
3346    MBEDTLS_SSL_DEBUG_BUF(4, "ticket", p, ticket_len);
3347    p += ticket_len;
3348
3349    /* Ticket Extensions
3350     *
3351     * Extension extensions<0..2^16-2>;
3352     */
3353    ssl->handshake->sent_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
3354
3355    MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
3356    p_extensions_len = p;
3357    p += 2;
3358
3359#if defined(MBEDTLS_SSL_EARLY_DATA)
3360    if (mbedtls_ssl_tls13_session_ticket_allow_early_data(session)) {
3361        size_t output_len;
3362
3363        if ((ret = mbedtls_ssl_tls13_write_early_data_ext(
3364                 ssl, 1, p, end, &output_len)) != 0) {
3365            MBEDTLS_SSL_DEBUG_RET(
3366                1, "mbedtls_ssl_tls13_write_early_data_ext", ret);
3367            return ret;
3368        }
3369        p += output_len;
3370    } else {
3371        MBEDTLS_SSL_DEBUG_MSG(
3372            4, ("early_data not allowed, "
3373                "skip early_data extension in NewSessionTicket"));
3374    }
3375
3376#endif /* MBEDTLS_SSL_EARLY_DATA */
3377
3378    MBEDTLS_PUT_UINT16_BE(p - p_extensions_len - 2, p_extensions_len, 0);
3379
3380    *out_len = p - buf;
3381    MBEDTLS_SSL_DEBUG_BUF(4, "ticket", buf, *out_len);
3382    MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
3383
3384    MBEDTLS_SSL_PRINT_EXTS(
3385        3, MBEDTLS_SSL_HS_NEW_SESSION_TICKET, ssl->handshake->sent_extensions);
3386
3387    return 0;
3388}
3389
3390/*
3391 * Handler for MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET
3392 */
3393static int ssl_tls13_write_new_session_ticket(mbedtls_ssl_context *ssl)
3394{
3395    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3396
3397    MBEDTLS_SSL_PROC_CHK_NEG(ssl_tls13_write_new_session_ticket_coordinate(ssl));
3398
3399    if (ret == SSL_NEW_SESSION_TICKET_WRITE) {
3400        unsigned char ticket_nonce[MBEDTLS_SSL_TLS1_3_TICKET_NONCE_LENGTH];
3401        unsigned char *buf;
3402        size_t buf_len, msg_len;
3403
3404        MBEDTLS_SSL_PROC_CHK(ssl_tls13_prepare_new_session_ticket(
3405                                 ssl, ticket_nonce, sizeof(ticket_nonce)));
3406
3407        MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(
3408                                 ssl, MBEDTLS_SSL_HS_NEW_SESSION_TICKET,
3409                                 &buf, &buf_len));
3410
3411        MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_new_session_ticket_body(
3412                                 ssl, buf, buf + buf_len, &msg_len,
3413                                 ticket_nonce, sizeof(ticket_nonce)));
3414
3415        MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
3416                                 ssl, buf_len, msg_len));
3417
3418        /* Limit session tickets count to one when resumption connection.
3419         *
3420         * See document of mbedtls_ssl_conf_new_session_tickets.
3421         */
3422        if (ssl->handshake->resume == 1) {
3423            ssl->handshake->new_session_tickets_count = 0;
3424        } else {
3425            ssl->handshake->new_session_tickets_count--;
3426        }
3427
3428        mbedtls_ssl_handshake_set_state(
3429            ssl, MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET_FLUSH);
3430    } else {
3431        mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_OVER);
3432    }
3433
3434cleanup:
3435
3436    return ret;
3437}
3438#endif /* MBEDTLS_SSL_SESSION_TICKETS */
3439
3440/*
3441 * TLS 1.3 State Machine -- server side
3442 */
3443int mbedtls_ssl_tls13_handshake_server_step(mbedtls_ssl_context *ssl)
3444{
3445    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3446
3447    if (ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL) {
3448        return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
3449    }
3450
3451    MBEDTLS_SSL_DEBUG_MSG(2, ("tls13 server state: %s(%d)",
3452                              mbedtls_ssl_states_str((mbedtls_ssl_states) ssl->state),
3453                              ssl->state));
3454
3455    switch (ssl->state) {
3456        /* start state */
3457        case MBEDTLS_SSL_HELLO_REQUEST:
3458            mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO);
3459            ret = 0;
3460            break;
3461
3462        case MBEDTLS_SSL_CLIENT_HELLO:
3463            ret = ssl_tls13_process_client_hello(ssl);
3464            if (ret != 0) {
3465                MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_process_client_hello", ret);
3466            }
3467            break;
3468
3469        case MBEDTLS_SSL_HELLO_RETRY_REQUEST:
3470            ret = ssl_tls13_write_hello_retry_request(ssl);
3471            if (ret != 0) {
3472                MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_write_hello_retry_request", ret);
3473                return ret;
3474            }
3475            break;
3476
3477        case MBEDTLS_SSL_SERVER_HELLO:
3478            ret = ssl_tls13_write_server_hello(ssl);
3479            break;
3480
3481        case MBEDTLS_SSL_ENCRYPTED_EXTENSIONS:
3482            ret = ssl_tls13_write_encrypted_extensions(ssl);
3483            if (ret != 0) {
3484                MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_write_encrypted_extensions", ret);
3485                return ret;
3486            }
3487            break;
3488
3489#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
3490        case MBEDTLS_SSL_CERTIFICATE_REQUEST:
3491            ret = ssl_tls13_write_certificate_request(ssl);
3492            break;
3493
3494        case MBEDTLS_SSL_SERVER_CERTIFICATE:
3495            ret = ssl_tls13_write_server_certificate(ssl);
3496            break;
3497
3498        case MBEDTLS_SSL_CERTIFICATE_VERIFY:
3499            ret = ssl_tls13_write_certificate_verify(ssl);
3500            break;
3501#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
3502
3503            /*
3504             * Injection of dummy-CCS's for middlebox compatibility
3505             */
3506#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
3507        case MBEDTLS_SSL_SERVER_CCS_AFTER_HELLO_RETRY_REQUEST:
3508            ret = mbedtls_ssl_tls13_write_change_cipher_spec(ssl);
3509            if (ret == 0) {
3510                mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_CLIENT_HELLO);
3511            }
3512            break;
3513
3514        case MBEDTLS_SSL_SERVER_CCS_AFTER_SERVER_HELLO:
3515            ret = mbedtls_ssl_tls13_write_change_cipher_spec(ssl);
3516            if (ret != 0) {
3517                break;
3518            }
3519            mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_ENCRYPTED_EXTENSIONS);
3520            break;
3521#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
3522
3523        case MBEDTLS_SSL_SERVER_FINISHED:
3524            ret = ssl_tls13_write_server_finished(ssl);
3525            break;
3526
3527#if defined(MBEDTLS_SSL_EARLY_DATA)
3528        case MBEDTLS_SSL_END_OF_EARLY_DATA:
3529            ret = ssl_tls13_process_end_of_early_data(ssl);
3530            break;
3531#endif /* MBEDTLS_SSL_EARLY_DATA */
3532
3533        case MBEDTLS_SSL_CLIENT_FINISHED:
3534            ret = ssl_tls13_process_client_finished(ssl);
3535            break;
3536
3537        case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
3538            ret = ssl_tls13_handshake_wrapup(ssl);
3539            break;
3540
3541#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
3542        case MBEDTLS_SSL_CLIENT_CERTIFICATE:
3543            ret = mbedtls_ssl_tls13_process_certificate(ssl);
3544            if (ret == 0) {
3545                if (ssl->session_negotiate->peer_cert != NULL) {
3546                    mbedtls_ssl_handshake_set_state(
3547                        ssl, MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY);
3548                } else {
3549                    MBEDTLS_SSL_DEBUG_MSG(2, ("skip parse certificate verify"));
3550                    mbedtls_ssl_handshake_set_state(
3551                        ssl, MBEDTLS_SSL_CLIENT_FINISHED);
3552                }
3553            }
3554            break;
3555
3556        case MBEDTLS_SSL_CLIENT_CERTIFICATE_VERIFY:
3557            ret = mbedtls_ssl_tls13_process_certificate_verify(ssl);
3558            if (ret == 0) {
3559                mbedtls_ssl_handshake_set_state(
3560                    ssl, MBEDTLS_SSL_CLIENT_FINISHED);
3561            }
3562            break;
3563#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
3564
3565#if defined(MBEDTLS_SSL_SESSION_TICKETS)
3566        case MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET:
3567            ret = ssl_tls13_write_new_session_ticket(ssl);
3568            if (ret != 0) {
3569                MBEDTLS_SSL_DEBUG_RET(1,
3570                                      "ssl_tls13_write_new_session_ticket ",
3571                                      ret);
3572            }
3573            break;
3574        case MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET_FLUSH:
3575            /* This state is necessary to do the flush of the New Session
3576             * Ticket message written in MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET
3577             * as part of ssl_prepare_handshake_step.
3578             */
3579            ret = 0;
3580
3581            if (ssl->handshake->new_session_tickets_count == 0) {
3582                mbedtls_ssl_handshake_set_state(ssl, MBEDTLS_SSL_HANDSHAKE_OVER);
3583            } else {
3584                mbedtls_ssl_handshake_set_state(
3585                    ssl, MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET);
3586            }
3587            break;
3588
3589#endif /* MBEDTLS_SSL_SESSION_TICKETS */
3590
3591        default:
3592            MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
3593            return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
3594    }
3595
3596    return ret;
3597}
3598
3599#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_3 */
3600