Coverage Report

Created: 2025-12-04 06:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl36/ssl/statem/extensions_srvr.c
Line
Count
Source
1
/*
2
 * Copyright 2016-2025 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License").  You may not use
5
 * this file except in compliance with the License.  You can obtain a copy
6
 * in the file LICENSE in the source distribution or at
7
 * https://www.openssl.org/source/license.html
8
 */
9
10
#include <openssl/ocsp.h>
11
#include "../ssl_local.h"
12
#include "statem_local.h"
13
#include "internal/cryptlib.h"
14
#include "internal/ssl_unwrap.h"
15
16
0
#define COOKIE_STATE_FORMAT_VERSION     1
17
18
/*
19
 * 2 bytes for packet length, 2 bytes for format version, 2 bytes for
20
 * protocol version, 2 bytes for group id, 2 bytes for cipher id, 1 byte for
21
 * key_share present flag, 8 bytes for timestamp, 2 bytes for the hashlen,
22
 * EVP_MAX_MD_SIZE for transcript hash, 1 byte for app cookie length, app cookie
23
 * length bytes, SHA256_DIGEST_LENGTH bytes for the HMAC of the whole thing.
24
 */
25
0
#define MAX_COOKIE_SIZE (2 + 2 + 2 + 2 + 2 + 1 + 8 + 2 + EVP_MAX_MD_SIZE + 1 \
26
0
                         + SSL_COOKIE_LENGTH + SHA256_DIGEST_LENGTH)
27
28
/*
29
 * Message header + 2 bytes for protocol version + number of random bytes +
30
 * + 1 byte for legacy session id length + number of bytes in legacy session id
31
 * + 2 bytes for ciphersuite + 1 byte for legacy compression
32
 * + 2 bytes for extension block length + 6 bytes for key_share extension
33
 * + 4 bytes for cookie extension header + the number of bytes in the cookie
34
 */
35
#define MAX_HRR_SIZE    (SSL3_HM_HEADER_LENGTH + 2 + SSL3_RANDOM_SIZE + 1 \
36
                         + SSL_MAX_SSL_SESSION_ID_LENGTH + 2 + 1 + 2 + 6 + 4 \
37
                         + MAX_COOKIE_SIZE)
38
39
/*
40
 * Parse the client's renegotiation binding and abort if it's not right
41
 */
42
int tls_parse_ctos_renegotiate(SSL_CONNECTION *s, PACKET *pkt,
43
                               unsigned int context,
44
                               X509 *x, size_t chainidx)
45
4.71k
{
46
4.71k
    unsigned int ilen;
47
4.71k
    const unsigned char *data;
48
4.71k
    int ok;
49
50
    /* Parse the length byte */
51
4.71k
    if (!PACKET_get_1(pkt, &ilen)
52
4.70k
        || !PACKET_get_bytes(pkt, &data, ilen)) {
53
40
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_RENEGOTIATION_ENCODING_ERR);
54
40
        return 0;
55
40
    }
56
57
    /* Check that the extension matches */
58
4.67k
    if (ilen != s->s3.previous_client_finished_len) {
59
18
        SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_R_RENEGOTIATION_MISMATCH);
60
18
        return 0;
61
18
    }
62
63
4.65k
    ok = memcmp(data, s->s3.previous_client_finished,
64
4.65k
                    s->s3.previous_client_finished_len);
65
4.65k
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
66
4.65k
    if (ok) {
67
0
        if ((data[0] ^ s->s3.previous_client_finished[0]) != 0xFF) {
68
0
            ok = 0;
69
0
        }
70
0
    }
71
4.65k
#endif
72
4.65k
    if (ok) {
73
0
        SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_R_RENEGOTIATION_MISMATCH);
74
0
        return 0;
75
0
    }
76
77
4.65k
    s->s3.send_connection_binding = 1;
78
79
4.65k
    return 1;
80
4.65k
}
81
82
/*-
83
 * The servername extension is treated as follows:
84
 *
85
 * - Only the hostname type is supported with a maximum length of 255.
86
 * - The servername is rejected if too long or if it contains zeros,
87
 *   in which case an fatal alert is generated.
88
 * - The servername field is maintained together with the session cache.
89
 * - When a session is resumed, the servername call back invoked in order
90
 *   to allow the application to position itself to the right context.
91
 * - The servername is acknowledged if it is new for a session or when
92
 *   it is identical to a previously used for the same session.
93
 *   Applications can control the behaviour.  They can at any time
94
 *   set a 'desirable' servername for a new SSL object. This can be the
95
 *   case for example with HTTPS when a Host: header field is received and
96
 *   a renegotiation is requested. In this case, a possible servername
97
 *   presented in the new client hello is only acknowledged if it matches
98
 *   the value of the Host: field.
99
 * - Applications must  use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
100
 *   if they provide for changing an explicit servername context for the
101
 *   session, i.e. when the session has been established with a servername
102
 *   extension.
103
 * - On session reconnect, the servername extension may be absent.
104
 */
105
int tls_parse_ctos_server_name(SSL_CONNECTION *s, PACKET *pkt,
106
                               unsigned int context, X509 *x, size_t chainidx)
107
8.93k
{
108
8.93k
    unsigned int servname_type;
109
8.93k
    PACKET sni, hostname;
110
111
8.93k
    if (!PACKET_as_length_prefixed_2(pkt, &sni)
112
        /* ServerNameList must be at least 1 byte long. */
113
8.73k
        || PACKET_remaining(&sni) == 0) {
114
222
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
115
222
        return 0;
116
222
    }
117
118
    /*
119
     * Although the intent was for server_name to be extensible, RFC 4366
120
     * was not clear about it; and so OpenSSL among other implementations,
121
     * always and only allows a 'host_name' name types.
122
     * RFC 6066 corrected the mistake but adding new name types
123
     * is nevertheless no longer feasible, so act as if no other
124
     * SNI types can exist, to simplify parsing.
125
     *
126
     * Also note that the RFC permits only one SNI value per type,
127
     * i.e., we can only have a single hostname.
128
     */
129
8.71k
    if (!PACKET_get_1(&sni, &servname_type)
130
8.71k
        || servname_type != TLSEXT_NAMETYPE_host_name
131
8.68k
        || !PACKET_as_length_prefixed_2(&sni, &hostname)) {
132
197
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
133
197
        return 0;
134
197
    }
135
136
    /*
137
     * In TLSv1.2 and below the SNI is associated with the session. In TLSv1.3
138
     * we always use the SNI value from the handshake.
139
     */
140
8.51k
    if (!s->hit || SSL_CONNECTION_IS_TLS13(s)) {
141
8.50k
        if (PACKET_remaining(&hostname) > TLSEXT_MAXLEN_host_name) {
142
7
            SSLfatal(s, SSL_AD_UNRECOGNIZED_NAME, SSL_R_BAD_EXTENSION);
143
7
            return 0;
144
7
        }
145
146
8.49k
        if (PACKET_contains_zero_byte(&hostname)) {
147
24
            SSLfatal(s, SSL_AD_UNRECOGNIZED_NAME, SSL_R_BAD_EXTENSION);
148
24
            return 0;
149
24
        }
150
151
        /*
152
         * Store the requested SNI in the SSL as temporary storage.
153
         * If we accept it, it will get stored in the SSL_SESSION as well.
154
         */
155
8.47k
        OPENSSL_free(s->ext.hostname);
156
8.47k
        s->ext.hostname = NULL;
157
8.47k
        if (!PACKET_strndup(&hostname, &s->ext.hostname)) {
158
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
159
0
            return 0;
160
0
        }
161
162
8.47k
        s->servername_done = 1;
163
8.47k
    } else {
164
        /*
165
         * In TLSv1.2 and below we should check if the SNI is consistent between
166
         * the initial handshake and the resumption. In TLSv1.3 SNI is not
167
         * associated with the session.
168
         */
169
15
        s->servername_done = (s->session->ext.hostname != NULL)
170
7
            && PACKET_equal(&hostname, s->session->ext.hostname,
171
7
                            strlen(s->session->ext.hostname));
172
15
    }
173
174
8.48k
    return 1;
175
8.51k
}
176
177
int tls_parse_ctos_maxfragmentlen(SSL_CONNECTION *s, PACKET *pkt,
178
                                  unsigned int context,
179
                                  X509 *x, size_t chainidx)
180
1.28k
{
181
1.28k
    unsigned int value;
182
183
1.28k
    if (PACKET_remaining(pkt) != 1 || !PACKET_get_1(pkt, &value)) {
184
126
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
185
126
        return 0;
186
126
    }
187
188
    /* Received |value| should be a valid max-fragment-length code. */
189
1.15k
    if (!IS_MAX_FRAGMENT_LENGTH_EXT_VALID(value)) {
190
64
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
191
64
                 SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH);
192
64
        return 0;
193
64
    }
194
195
    /*
196
     * When doing a full handshake or a renegotiation max_fragment_len_mode will
197
     * be TLSEXT_max_fragment_length_UNSPECIFIED
198
     *
199
     * In case of a resumption max_fragment_len_mode will be one of
200
     *      TLSEXT_max_fragment_length_DISABLED, TLSEXT_max_fragment_length_512,
201
     *      TLSEXT_max_fragment_length_1024, TLSEXT_max_fragment_length_2048.
202
     *      TLSEXT_max_fragment_length_4096
203
     *
204
     * RFC 6066: The negotiated length applies for the duration of the session
205
     * including session resumptions.
206
     *
207
     * So we only set the value in case it is unspecified.
208
     */
209
1.09k
    if (s->session->ext.max_fragment_len_mode == TLSEXT_max_fragment_length_UNSPECIFIED)
210
        /*
211
         * Store it in session, so it'll become binding for us
212
         * and we'll include it in a next Server Hello.
213
         */
214
1.08k
        s->session->ext.max_fragment_len_mode = value;
215
216
1.09k
    return 1;
217
1.15k
}
218
219
#ifndef OPENSSL_NO_SRP
220
int tls_parse_ctos_srp(SSL_CONNECTION *s, PACKET *pkt, unsigned int context,
221
                       X509 *x, size_t chainidx)
222
150
{
223
150
    PACKET srp_I;
224
225
150
    if (!PACKET_as_length_prefixed_1(pkt, &srp_I)
226
96
            || PACKET_contains_zero_byte(&srp_I)) {
227
96
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
228
96
        return 0;
229
96
    }
230
231
54
    if (!PACKET_strndup(&srp_I, &s->srp_ctx.login)) {
232
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
233
0
        return 0;
234
0
    }
235
236
54
    return 1;
237
54
}
238
#endif
239
240
int tls_parse_ctos_ec_pt_formats(SSL_CONNECTION *s, PACKET *pkt,
241
                                 unsigned int context,
242
                                 X509 *x, size_t chainidx)
243
6.70k
{
244
6.70k
    PACKET ec_point_format_list;
245
246
6.70k
    if (!PACKET_as_length_prefixed_1(pkt, &ec_point_format_list)
247
6.57k
        || PACKET_remaining(&ec_point_format_list) == 0) {
248
150
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
249
150
        return 0;
250
150
    }
251
252
6.55k
    if (!s->hit) {
253
6.38k
        if (!PACKET_memdup(&ec_point_format_list,
254
6.38k
                           &s->ext.peer_ecpointformats,
255
6.38k
                           &s->ext.peer_ecpointformats_len)) {
256
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
257
0
            return 0;
258
0
        }
259
6.38k
    }
260
261
6.55k
    return 1;
262
6.55k
}
263
264
int tls_parse_ctos_session_ticket(SSL_CONNECTION *s, PACKET *pkt,
265
                                  unsigned int context,
266
                                  X509 *x, size_t chainidx)
267
6.12k
{
268
6.12k
    if (s->ext.session_ticket_cb &&
269
0
            !s->ext.session_ticket_cb(SSL_CONNECTION_GET_USER_SSL(s),
270
0
                                      PACKET_data(pkt), (int)PACKET_remaining(pkt),
271
0
                                      s->ext.session_ticket_cb_arg)) {
272
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
273
0
        return 0;
274
0
    }
275
276
6.12k
    return 1;
277
6.12k
}
278
279
int tls_parse_ctos_sig_algs_cert(SSL_CONNECTION *s, PACKET *pkt,
280
                                 ossl_unused unsigned int context,
281
                                 ossl_unused X509 *x,
282
                                 ossl_unused size_t chainidx)
283
1.25k
{
284
1.25k
    PACKET supported_sig_algs;
285
286
1.25k
    if (!PACKET_as_length_prefixed_2(pkt, &supported_sig_algs)
287
1.07k
            || PACKET_remaining(&supported_sig_algs) == 0) {
288
191
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
289
191
        return 0;
290
191
    }
291
292
    /*
293
     * We use this routine on both clients and servers, and when clients
294
     * get asked for PHA we need to always save the sigalgs regardless
295
     * of whether it was a resumption or not.
296
     */
297
1.06k
    if ((!s->server || (s->server && !s->hit))
298
1.05k
            && !tls1_save_sigalgs(s, &supported_sig_algs, 1)) {
299
20
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
300
20
        return 0;
301
20
    }
302
303
1.04k
    return 1;
304
1.06k
}
305
306
int tls_parse_ctos_sig_algs(SSL_CONNECTION *s, PACKET *pkt,
307
                            unsigned int context, X509 *x, size_t chainidx)
308
10.3k
{
309
10.3k
    PACKET supported_sig_algs;
310
311
10.3k
    if (!PACKET_as_length_prefixed_2(pkt, &supported_sig_algs)
312
10.0k
            || PACKET_remaining(&supported_sig_algs) == 0) {
313
239
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
314
239
        return 0;
315
239
    }
316
317
    /*
318
     * We use this routine on both clients and servers, and when clients
319
     * get asked for PHA we need to always save the sigalgs regardless
320
     * of whether it was a resumption or not.
321
     */
322
10.0k
    if ((!s->server || (s->server && !s->hit))
323
9.92k
            && !tls1_save_sigalgs(s, &supported_sig_algs, 0)) {
324
20
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
325
20
        return 0;
326
20
    }
327
328
10.0k
    return 1;
329
10.0k
}
330
331
#ifndef OPENSSL_NO_OCSP
332
int tls_parse_ctos_status_request(SSL_CONNECTION *s, PACKET *pkt,
333
                                  unsigned int context,
334
                                  X509 *x, size_t chainidx)
335
6.83k
{
336
6.83k
    PACKET responder_id_list, exts;
337
338
    /* We ignore this in a resumption handshake */
339
6.83k
    if (s->hit)
340
46
        return 1;
341
342
    /* Not defined if we get one of these in a client Certificate */
343
6.78k
    if (x != NULL)
344
0
        return 1;
345
346
6.78k
    if (!PACKET_get_1(pkt, (unsigned int *)&s->ext.status_type)) {
347
21
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
348
21
        return 0;
349
21
    }
350
351
6.76k
    if (s->ext.status_type != TLSEXT_STATUSTYPE_ocsp) {
352
        /*
353
         * We don't know what to do with any other type so ignore it.
354
         */
355
308
        s->ext.status_type = TLSEXT_STATUSTYPE_nothing;
356
308
        return 1;
357
308
    }
358
359
6.45k
    if (!PACKET_get_length_prefixed_2 (pkt, &responder_id_list)) {
360
104
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
361
104
        return 0;
362
104
    }
363
364
    /*
365
     * We remove any OCSP_RESPIDs from a previous handshake
366
     * to prevent unbounded memory growth - CVE-2016-6304
367
     */
368
6.35k
    sk_OCSP_RESPID_pop_free(s->ext.ocsp.ids, OCSP_RESPID_free);
369
6.35k
    if (PACKET_remaining(&responder_id_list) > 0) {
370
3.53k
        s->ext.ocsp.ids = sk_OCSP_RESPID_new_null();
371
3.53k
        if (s->ext.ocsp.ids == NULL) {
372
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_CRYPTO_LIB);
373
0
            return 0;
374
0
        }
375
3.53k
    } else {
376
2.81k
        s->ext.ocsp.ids = NULL;
377
2.81k
    }
378
379
6.47k
    while (PACKET_remaining(&responder_id_list) > 0) {
380
3.64k
        OCSP_RESPID *id;
381
3.64k
        PACKET responder_id;
382
3.64k
        const unsigned char *id_data;
383
384
3.64k
        if (!PACKET_get_length_prefixed_2(&responder_id_list, &responder_id)
385
3.52k
                || PACKET_remaining(&responder_id) == 0) {
386
128
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
387
128
            return 0;
388
128
        }
389
390
3.51k
        id_data = PACKET_data(&responder_id);
391
3.51k
        id = d2i_OCSP_RESPID(NULL, &id_data,
392
3.51k
                             (int)PACKET_remaining(&responder_id));
393
3.51k
        if (id == NULL) {
394
3.31k
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
395
3.31k
            return 0;
396
3.31k
        }
397
398
200
        if (id_data != PACKET_end(&responder_id)) {
399
83
            OCSP_RESPID_free(id);
400
83
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
401
402
83
            return 0;
403
83
        }
404
405
117
        if (!sk_OCSP_RESPID_push(s->ext.ocsp.ids, id)) {
406
0
            OCSP_RESPID_free(id);
407
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
408
409
0
            return 0;
410
0
        }
411
117
    }
412
413
    /* Read in request_extensions */
414
2.83k
    if (!PACKET_as_length_prefixed_2(pkt, &exts)) {
415
97
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
416
97
        return 0;
417
97
    }
418
419
2.73k
    if (PACKET_remaining(&exts) > 0) {
420
792
        const unsigned char *ext_data = PACKET_data(&exts);
421
422
792
        sk_X509_EXTENSION_pop_free(s->ext.ocsp.exts,
423
792
                                   X509_EXTENSION_free);
424
792
        s->ext.ocsp.exts =
425
792
            d2i_X509_EXTENSIONS(NULL, &ext_data, (int)PACKET_remaining(&exts));
426
792
        if (s->ext.ocsp.exts == NULL || ext_data != PACKET_end(&exts)) {
427
784
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
428
784
            return 0;
429
784
        }
430
792
    }
431
432
1.95k
    return 1;
433
2.73k
}
434
#endif
435
436
#ifndef OPENSSL_NO_NEXTPROTONEG
437
int tls_parse_ctos_npn(SSL_CONNECTION *s, PACKET *pkt, unsigned int context,
438
                       X509 *x, size_t chainidx)
439
16
{
440
    /*
441
     * We shouldn't accept this extension on a
442
     * renegotiation.
443
     */
444
16
    if (SSL_IS_FIRST_HANDSHAKE(s))
445
16
        s->s3.npn_seen = 1;
446
447
16
    return 1;
448
16
}
449
#endif
450
451
/*
452
 * Save the ALPN extension in a ClientHello.|pkt| holds the contents of the ALPN
453
 * extension, not including type and length. Returns: 1 on success, 0 on error.
454
 */
455
int tls_parse_ctos_alpn(SSL_CONNECTION *s, PACKET *pkt, unsigned int context,
456
                        X509 *x, size_t chainidx)
457
510
{
458
510
    PACKET protocol_list, save_protocol_list, protocol;
459
460
510
    if (!SSL_IS_FIRST_HANDSHAKE(s))
461
0
        return 1;
462
463
510
    if (!PACKET_as_length_prefixed_2(pkt, &protocol_list)
464
356
        || PACKET_remaining(&protocol_list) < 2) {
465
165
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
466
165
        return 0;
467
165
    }
468
469
345
    save_protocol_list = protocol_list;
470
2.84k
    do {
471
        /* Protocol names can't be empty. */
472
2.84k
        if (!PACKET_get_length_prefixed_1(&protocol_list, &protocol)
473
2.76k
                || PACKET_remaining(&protocol) == 0) {
474
117
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
475
117
            return 0;
476
117
        }
477
2.84k
    } while (PACKET_remaining(&protocol_list) != 0);
478
479
228
    OPENSSL_free(s->s3.alpn_proposed);
480
228
    s->s3.alpn_proposed = NULL;
481
228
    s->s3.alpn_proposed_len = 0;
482
228
    if (!PACKET_memdup(&save_protocol_list,
483
228
                       &s->s3.alpn_proposed, &s->s3.alpn_proposed_len)) {
484
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
485
0
        return 0;
486
0
    }
487
488
228
    return 1;
489
228
}
490
491
#ifndef OPENSSL_NO_SRTP
492
int tls_parse_ctos_use_srtp(SSL_CONNECTION *s, PACKET *pkt,
493
                            unsigned int context, X509 *x, size_t chainidx)
494
942
{
495
942
    STACK_OF(SRTP_PROTECTION_PROFILE) *srvr;
496
942
    unsigned int ct, mki_len, id;
497
942
    int i, srtp_pref;
498
942
    PACKET subpkt;
499
942
    SSL *ssl = SSL_CONNECTION_GET_SSL(s);
500
501
    /* Ignore this if we have no SRTP profiles */
502
942
    if (SSL_get_srtp_profiles(ssl) == NULL)
503
942
        return 1;
504
505
    /* Pull off the length of the cipher suite list  and check it is even */
506
0
    if (!PACKET_get_net_2(pkt, &ct) || (ct & 1) != 0
507
0
            || !PACKET_get_sub_packet(pkt, &subpkt, ct)) {
508
0
        SSLfatal(s, SSL_AD_DECODE_ERROR,
509
0
               SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
510
0
        return 0;
511
0
    }
512
513
0
    srvr = SSL_get_srtp_profiles(ssl);
514
0
    s->srtp_profile = NULL;
515
    /* Search all profiles for a match initially */
516
0
    srtp_pref = sk_SRTP_PROTECTION_PROFILE_num(srvr);
517
518
0
    while (PACKET_remaining(&subpkt)) {
519
0
        if (!PACKET_get_net_2(&subpkt, &id)) {
520
0
            SSLfatal(s, SSL_AD_DECODE_ERROR,
521
0
                     SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
522
0
            return 0;
523
0
        }
524
525
        /*
526
         * Only look for match in profiles of higher preference than
527
         * current match.
528
         * If no profiles have been have been configured then this
529
         * does nothing.
530
         */
531
0
        for (i = 0; i < srtp_pref; i++) {
532
0
            SRTP_PROTECTION_PROFILE *sprof =
533
0
                sk_SRTP_PROTECTION_PROFILE_value(srvr, i);
534
535
0
            if (sprof->id == id) {
536
0
                s->srtp_profile = sprof;
537
0
                srtp_pref = i;
538
0
                break;
539
0
            }
540
0
        }
541
0
    }
542
543
    /* Now extract the MKI value as a sanity check, but discard it for now */
544
0
    if (!PACKET_get_1(pkt, &mki_len)) {
545
0
        SSLfatal(s, SSL_AD_DECODE_ERROR,
546
0
                 SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
547
0
        return 0;
548
0
    }
549
550
0
    if (!PACKET_forward(pkt, mki_len)
551
0
        || PACKET_remaining(pkt)) {
552
0
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_SRTP_MKI_VALUE);
553
0
        return 0;
554
0
    }
555
556
0
    return 1;
557
0
}
558
#endif
559
560
int tls_parse_ctos_etm(SSL_CONNECTION *s, PACKET *pkt, unsigned int context,
561
                       X509 *x, size_t chainidx)
562
2.09k
{
563
2.09k
    if (!(s->options & SSL_OP_NO_ENCRYPT_THEN_MAC))
564
2.09k
        s->ext.use_etm = 1;
565
566
2.09k
    return 1;
567
2.09k
}
568
569
/*
570
 * Process a psk_kex_modes extension received in the ClientHello. |pkt| contains
571
 * the raw PACKET data for the extension. Returns 1 on success or 0 on failure.
572
 */
573
int tls_parse_ctos_psk_kex_modes(SSL_CONNECTION *s, PACKET *pkt,
574
                                 unsigned int context,
575
                                 X509 *x, size_t chainidx)
576
1.33k
{
577
1.33k
#ifndef OPENSSL_NO_TLS1_3
578
1.33k
    PACKET psk_kex_modes;
579
1.33k
    unsigned int mode;
580
581
1.33k
    if (!PACKET_as_length_prefixed_1(pkt, &psk_kex_modes)
582
1.30k
            || PACKET_remaining(&psk_kex_modes) == 0) {
583
40
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
584
40
        return 0;
585
40
    }
586
587
8.52k
    while (PACKET_get_1(&psk_kex_modes, &mode)) {
588
7.22k
        if (mode == TLSEXT_KEX_MODE_KE_DHE)
589
1.93k
            s->ext.psk_kex_mode |= TLSEXT_KEX_MODE_FLAG_KE_DHE;
590
5.28k
        else if (mode == TLSEXT_KEX_MODE_KE
591
1.74k
                && (s->options & SSL_OP_ALLOW_NO_DHE_KEX) != 0)
592
0
            s->ext.psk_kex_mode |= TLSEXT_KEX_MODE_FLAG_KE;
593
7.22k
    }
594
595
1.29k
    if (((s->ext.psk_kex_mode & TLSEXT_KEX_MODE_FLAG_KE) != 0)
596
0
            && (s->options & SSL_OP_PREFER_NO_DHE_KEX) != 0) {
597
598
        /*
599
         * If NO_DHE is supported and preferred, then we only remember this
600
         * mode. DHE PSK will not be used for sure, because in any case where
601
         * it would be supported (i.e. if a key share is present), NO_DHE would
602
         * be supported as well. As the latter is preferred it would be
603
         * chosen. By removing DHE PSK here, we don't have to deal with the
604
         * SSL_OP_PREFER_NO_DHE_KEX option in any other place.
605
         */
606
0
        s->ext.psk_kex_mode = TLSEXT_KEX_MODE_FLAG_KE;
607
0
    }
608
609
1.29k
#endif
610
611
1.29k
    return 1;
612
1.33k
}
613
614
/*
615
 * Use function tls_parse_ctos_key_share with helper functions extract_keyshares,
616
 * check_overlap and tls_accept_ksgroup to parse the key_share extension(s)
617
 * received in the ClientHello and to select the group used of the key exchange
618
 */
619
620
#ifndef OPENSSL_NO_TLS1_3
621
/*
622
 * Accept a key share group by setting the related variables in s->s3 and
623
 * by generating a pubkey for this group
624
 */
625
static int tls_accept_ksgroup(SSL_CONNECTION *s, uint16_t ksgroup, PACKET *encoded_pubkey)
626
1.50k
{
627
    /* Accept the key share group */
628
1.50k
    s->s3.group_id = ksgroup;
629
1.50k
    s->s3.group_id_candidate = ksgroup;
630
    /* Cache the selected group ID in the SSL_SESSION */
631
1.50k
    s->session->kex_group = ksgroup;
632
1.50k
    if ((s->s3.peer_tmp = ssl_generate_param_group(s, ksgroup)) == NULL) {
633
0
        SSLfatal(s,
634
0
                 SSL_AD_INTERNAL_ERROR,
635
0
                 SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS);
636
0
        return 0;
637
0
    }
638
1.50k
    if (tls13_set_encoded_pub_key(s->s3.peer_tmp,
639
1.50k
                                  PACKET_data(encoded_pubkey),
640
1.50k
                                  PACKET_remaining(encoded_pubkey)) <= 0) {
641
36
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_BAD_ECPOINT);
642
36
        return 0;
643
36
    }
644
1.46k
    return 1;
645
1.50k
}
646
647
2.02k
# define GROUPLIST_INCREMENT 32 /* Memory allocation chunk size (nominally 64 Bytes chunks) */
648
649
typedef enum KS_EXTRACTION_RESULT {
650
    EXTRACTION_FAILURE,
651
    EXTRACTION_SUCCESS,
652
    EXTRACTION_SUCCESS_HRR
653
} KS_EXTRACTION_RESULT;
654
655
static KS_EXTRACTION_RESULT extract_keyshares(SSL_CONNECTION *s, PACKET *key_share_list,
656
                                              const uint16_t *clntgroups, size_t clnt_num_groups,
657
                                              const uint16_t *srvrgroups, size_t srvr_num_groups,
658
                                              uint16_t **keyshares_arr, PACKET **encoded_pubkey_arr,
659
                                              size_t *keyshares_cnt, size_t *keyshares_max)
660
1.98k
{
661
1.98k
    PACKET encoded_pubkey;
662
1.98k
    size_t key_share_pos = 0;
663
1.98k
    size_t previous_key_share_pos = 0;
664
1.98k
    unsigned int group_id = 0;
665
666
    /* Prepare memory to hold the extracted key share groups and related pubkeys */
667
1.98k
    *keyshares_arr = OPENSSL_malloc_array(*keyshares_max,
668
1.98k
                                          sizeof(**keyshares_arr));
669
1.98k
    if (*keyshares_arr == NULL) {
670
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
671
0
        goto failure;
672
0
    }
673
1.98k
    *encoded_pubkey_arr = OPENSSL_malloc_array(*keyshares_max,
674
1.98k
                                               sizeof(**encoded_pubkey_arr));
675
1.98k
    if (*encoded_pubkey_arr == NULL) {
676
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
677
0
        goto failure;
678
0
    }
679
680
3.98k
    while (PACKET_remaining(key_share_list) > 0) {
681
        /* Get the group_id for the current share and its encoded_pubkey */
682
2.18k
        if (!PACKET_get_net_2(key_share_list, &group_id)
683
2.18k
                || !PACKET_get_length_prefixed_2(key_share_list, &encoded_pubkey)
684
2.13k
                || PACKET_remaining(&encoded_pubkey) == 0) {
685
58
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_LENGTH_MISMATCH);
686
58
            goto failure;
687
58
        }
688
689
        /*
690
         * If we sent an HRR then the key_share sent back MUST be for the group
691
         * we requested, and must be the only key_share sent.
692
         */
693
2.12k
        if (s->s3.group_id != 0
694
104
                && (group_id != s->s3.group_id
695
77
                    || PACKET_remaining(key_share_list) != 0)) {
696
30
            SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_BAD_KEY_SHARE);
697
30
            goto failure;
698
30
        }
699
700
        /*
701
         * Check if this share is in supported_groups sent from client
702
         * RFC 8446 also mandates that clients send keyshares in the same
703
         * order as listed in the supported groups extension, but its not
704
         * required that the server check that, and some clients violate this
705
         * so instead of failing the connection when that occurs, log a trace
706
         * message indicating the client discrepancy.
707
         */
708
2.09k
        if (!check_in_list(s, group_id, clntgroups, clnt_num_groups, 0, &key_share_pos)) {
709
29
            SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_BAD_KEY_SHARE);
710
29
            goto failure;
711
29
        }
712
713
2.07k
        if (key_share_pos < previous_key_share_pos)
714
2.07k
            OSSL_TRACE1(TLS, "key share group id %d is out of RFC 8446 order\n", group_id);
715
716
2.07k
        previous_key_share_pos = key_share_pos;
717
718
2.07k
        if (s->s3.group_id != 0) {
719
            /*
720
             * We have sent a HRR, and the key share we got back is
721
             * the one we expected and is the only key share and is
722
             * in the list of supported_groups (checked
723
             * above already), hence we accept this key share group
724
             */
725
74
            if (!tls_accept_ksgroup(s, s->s3.group_id, &encoded_pubkey))
726
3
                goto failure; /* SSLfatal already called */
727
            /* We have selected a key share group via HRR, hence we're done here */
728
71
            return EXTRACTION_SUCCESS_HRR;
729
74
        }
730
731
        /*
732
         * We tolerate but ignore a group id that we don't think is
733
         * suitable for TLSv1.3 or which is not supported by the server
734
         */
735
1.99k
        if (!check_in_list(s, group_id, srvrgroups, srvr_num_groups, 1, NULL)
736
1.48k
                || !tls_group_allowed(s, group_id, SSL_SECOP_CURVE_SUPPORTED)
737
1.48k
                || !tls_valid_group(s, group_id, TLS1_3_VERSION, TLS1_3_VERSION,
738
1.48k
                                    0, NULL)) {
739
            /* Share not suitable or not supported, check next share */
740
515
            continue;
741
515
        }
742
743
        /* Memorize this key share group ID and its encoded point */
744
1.48k
        (*keyshares_arr)[*keyshares_cnt] = group_id;
745
1.48k
        (*encoded_pubkey_arr)[(*keyshares_cnt)++] = encoded_pubkey;
746
747
        /*
748
         * Memory management (remark: While limiting the client to only allow
749
         * a maximum of OPENSSL_CLIENT_MAX_KEY_SHARES to be sent, the server can
750
         * handle any number of key shares)
751
         */
752
1.48k
        if (*keyshares_cnt == *keyshares_max) {
753
0
            PACKET *tmp_pkt;
754
0
            uint16_t *tmp =
755
0
                OPENSSL_realloc_array(*keyshares_arr,
756
0
                                      *keyshares_max + GROUPLIST_INCREMENT,
757
0
                                      sizeof(**keyshares_arr));
758
759
0
            if (tmp == NULL) {
760
0
                SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
761
0
                goto failure;
762
0
            }
763
764
0
            *keyshares_arr = tmp;
765
0
            tmp_pkt =
766
0
                OPENSSL_realloc_array(*encoded_pubkey_arr,
767
0
                                      *keyshares_max + GROUPLIST_INCREMENT,
768
0
                                      sizeof(**encoded_pubkey_arr));
769
0
            if (tmp_pkt == NULL) {
770
0
                SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
771
0
                goto failure;
772
0
            }
773
774
0
            *encoded_pubkey_arr = tmp_pkt;
775
0
            *keyshares_max += GROUPLIST_INCREMENT;
776
0
        }
777
778
1.48k
    }
779
780
1.79k
    return EXTRACTION_SUCCESS;
781
782
120
failure:
783
    /* Fatal error -> free any allocated memory and return 0 */
784
120
    OPENSSL_free(*keyshares_arr);
785
120
    OPENSSL_free(*encoded_pubkey_arr);
786
120
    return EXTRACTION_FAILURE;
787
1.98k
}
788
#endif
789
790
/*
791
 * For each group in the priority list of groups, check if that group is
792
 * also present in the secondary list; if so, select the first overlap and
793
 * assign to selected_group and also set the related index in the candidate group list,
794
 * or set selected_group to 0 if no overlap
795
 */
796
#ifndef OPENSSL_NO_TLS1_3
797
static void check_overlap(SSL_CONNECTION *s,
798
                          const uint16_t *prio_groups, size_t prio_num_groups,
799
                          const uint16_t *candidate_groups, size_t candidate_num_groups,
800
                          int *prio_group_idx, int *candidate_group_idx,
801
                          uint16_t *selected_group)
802
6.48k
{
803
6.48k
    uint16_t current_group;
804
6.48k
    size_t group_idx = prio_num_groups;
805
6.48k
    size_t new_group_idx = 0;
806
807
6.48k
    *candidate_group_idx = 0;
808
6.48k
    *prio_group_idx = 0;
809
6.48k
    *selected_group = 0;
810
811
16.3k
    for (current_group = 0; current_group < candidate_num_groups; current_group++) {
812
9.86k
        if (!check_in_list(s, candidate_groups[current_group], prio_groups,
813
9.86k
                           prio_num_groups, 1, &new_group_idx)
814
1.86k
            || !tls_group_allowed(s, candidate_groups[current_group],
815
1.86k
                                  SSL_SECOP_CURVE_SUPPORTED)
816
1.86k
            || !tls_valid_group(s, candidate_groups[current_group], TLS1_3_VERSION,
817
1.86k
                                TLS1_3_VERSION, 0, NULL))
818
            /* No overlap or group not suitable, check next group */
819
7.99k
            continue;
820
821
        /*
822
         * is the found new_group_idx earlier in the priority list than
823
         * initial or last group_idx?
824
         */
825
1.86k
        if (new_group_idx < group_idx) {
826
1.79k
            group_idx = new_group_idx;
827
1.79k
            *candidate_group_idx = current_group;
828
1.79k
            *prio_group_idx = (int)group_idx;
829
1.79k
            *selected_group = prio_groups[group_idx];
830
1.79k
        }
831
1.86k
    }
832
6.48k
}
833
#endif
834
835
int tls_parse_ctos_key_share(SSL_CONNECTION *s, PACKET *pkt,
836
                             unsigned int context, X509 *x, size_t chainidx)
837
2.02k
{
838
2.02k
#ifndef OPENSSL_NO_TLS1_3
839
2.02k
    PACKET key_share_list;
840
2.02k
    const uint16_t *clntgroups, *srvrgroups;
841
2.02k
    const size_t *srvrtuples;
842
2.02k
    uint16_t *first_group_in_tuple;
843
2.02k
    size_t clnt_num_groups, srvr_num_groups, srvr_num_tuples;
844
2.02k
    PACKET *encoded_pubkey_arr = NULL;
845
2.02k
    uint16_t *keyshares_arr = NULL;
846
2.02k
    size_t keyshares_cnt = 0;
847
2.02k
    size_t keyshares_max = GROUPLIST_INCREMENT;
848
    /* We conservatively assume that we did not find a suitable group */
849
2.02k
    uint16_t group_id_candidate = 0;
850
2.02k
    KS_EXTRACTION_RESULT ks_extraction_result;
851
2.02k
    size_t current_tuple;
852
2.02k
    int ret = 0;
853
854
2.02k
    s->s3.group_id_candidate = 0;
855
2.02k
    if (s->hit && (s->ext.psk_kex_mode & TLSEXT_KEX_MODE_FLAG_KE_DHE) == 0)
856
0
        return 1;
857
858
    /* Sanity check */
859
2.02k
    if (s->s3.peer_tmp != NULL) {
860
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
861
0
        return 0;
862
0
    }
863
864
2.02k
    if (!PACKET_as_length_prefixed_2(pkt, &key_share_list)) {
865
35
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_LENGTH_MISMATCH);
866
35
        return 0;
867
35
    }
868
869
    /* Get list of server supported groups and the group tuples */
870
1.99k
    tls1_get_supported_groups(s, &srvrgroups, &srvr_num_groups);
871
1.99k
    tls1_get_group_tuples(s, &srvrtuples, &srvr_num_tuples);
872
    /* Get the clients list of supported groups. */
873
1.99k
    tls1_get_peer_groups(s, &clntgroups, &clnt_num_groups);
874
875
1.99k
    if (clnt_num_groups == 0) {
876
        /*
877
         * This can only happen if the supported_groups extension was not sent,
878
         * because we verify that the length is non-zero when we process that
879
         * extension.
880
         */
881
5
        SSLfatal(s, SSL_AD_MISSING_EXTENSION,
882
5
                 SSL_R_MISSING_SUPPORTED_GROUPS_EXTENSION);
883
5
        return 0;
884
5
    }
885
886
1.98k
    if (s->s3.group_id != 0 && PACKET_remaining(&key_share_list) == 0) {
887
        /*
888
         * If we set a group_id already, then we must have sent an HRR
889
         * requesting a new key_share. If we haven't got one then that is an
890
         * error
891
         */
892
3
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_BAD_KEY_SHARE);
893
3
        return 0;
894
3
    }
895
896
    /* We parse the key share extension and memorize the entries (after some checks) */
897
1.98k
    ks_extraction_result = extract_keyshares(s,
898
1.98k
                                             &key_share_list,
899
1.98k
                                             clntgroups, clnt_num_groups,
900
1.98k
                                             srvrgroups, srvr_num_groups,
901
1.98k
                                             &keyshares_arr, &encoded_pubkey_arr,
902
1.98k
                                             &keyshares_cnt, &keyshares_max);
903
904
1.98k
    if (ks_extraction_result == EXTRACTION_FAILURE) /* Fatal error during tests */
905
120
        return 0; /* Memory already freed and SSLfatal already called */
906
1.86k
    if (ks_extraction_result == EXTRACTION_SUCCESS_HRR) /* Successful HRR */
907
71
        goto end;
908
909
    /*
910
     * We now have the folowing lists available to make a decision for
911
     * which group the server should use for key exchange :
912
     * From client: clntgroups[clnt_num_groups],
913
     *              keyshares_arr[keyshares_cnt], encoded_pubkey_arr[keyshares_cnt]
914
     * From server: srvrgroups[srvr_num_groups], srvrtuples[srvr_num_tuples]
915
     *
916
     * Group selection algorithm:
917
     *    For all tuples do:
918
     *      key share group(s) overlapping with current tuple?
919
     *         --> Yes: accept group_id for SH
920
     *        --> No: is any of the client supported_groups overlapping with current tuple?
921
     *            --> Yes: memorize group_id for HRR, break
922
     *             --> No: continue to check next tuple
923
     *
924
     * Remark: Selection priority different for client- or server-preference
925
     */
926
1.79k
    first_group_in_tuple = (uint16_t *)srvrgroups;
927
3.96k
    for (current_tuple = 0; current_tuple < srvr_num_tuples; current_tuple++) {
928
3.95k
        size_t number_of_groups_in_tuple = srvrtuples[current_tuple];
929
3.95k
        int prio_group_idx = 0, candidate_group_idx = 0;
930
931
        /* Server or client preference ? */
932
3.95k
        if (s->options & SSL_OP_SERVER_PREFERENCE) {
933
            /* Server preference */
934
            /* Is there overlap with a key share group?  */
935
0
            check_overlap(s,
936
0
                          first_group_in_tuple, number_of_groups_in_tuple,
937
0
                          keyshares_arr, keyshares_cnt,
938
0
                          &prio_group_idx, &candidate_group_idx,
939
0
                          &group_id_candidate);
940
0
            if (group_id_candidate > 0) { /* Overlap found -> accept the key share group */
941
0
                if (!tls_accept_ksgroup(s, group_id_candidate,
942
0
                                        &encoded_pubkey_arr[candidate_group_idx]))
943
0
                    goto err; /* SSLfatal already called */
944
                /* We have all info for a SH, hence we're done here */
945
0
                goto end;
946
0
            } else {
947
                /*
948
                 * There's no overlap with a key share, but is there at least a client
949
                 * supported_group overlapping with the current tuple?
950
                 */
951
0
                check_overlap(s,
952
0
                              first_group_in_tuple, number_of_groups_in_tuple,
953
0
                              clntgroups, clnt_num_groups,
954
0
                              &prio_group_idx, &candidate_group_idx,
955
0
                              &group_id_candidate);
956
0
                if (group_id_candidate > 0) {
957
                    /*
958
                     * We did not have a key share overlap, but at least the supported
959
                     * groups overlap hence we can stop searching
960
                     * (and report group_id_candidate 'upward' for HRR)
961
                     */
962
0
                    s->s3.group_id_candidate = group_id_candidate;
963
0
                    goto end;
964
0
                } else {
965
                    /*
966
                     * Neither key share nor supported_groups overlap current
967
                     * tuple, hence we try the next tuple
968
                     */
969
0
                    first_group_in_tuple = &first_group_in_tuple[number_of_groups_in_tuple];
970
0
                    continue;
971
0
                }
972
0
            }
973
974
3.95k
        } else { /* We have client preference */
975
3.95k
            check_overlap(s,
976
3.95k
                          keyshares_arr, keyshares_cnt,
977
3.95k
                          first_group_in_tuple, number_of_groups_in_tuple,
978
3.95k
                          &prio_group_idx, &candidate_group_idx,
979
3.95k
                          &group_id_candidate);
980
3.95k
            if (group_id_candidate > 0) {
981
1.42k
                if (!tls_accept_ksgroup(s, group_id_candidate, &encoded_pubkey_arr[prio_group_idx]))
982
33
                    goto err;
983
1.39k
                goto end;
984
2.52k
            } else {
985
2.52k
                check_overlap(s,
986
2.52k
                              clntgroups, clnt_num_groups,
987
2.52k
                              first_group_in_tuple, number_of_groups_in_tuple,
988
2.52k
                              &prio_group_idx, &candidate_group_idx,
989
2.52k
                              &group_id_candidate);
990
2.52k
                if (group_id_candidate > 0) {
991
361
                    s->s3.group_id_candidate = group_id_candidate;
992
361
                    goto end;
993
2.16k
                } else {
994
2.16k
                    first_group_in_tuple = &first_group_in_tuple[number_of_groups_in_tuple];
995
2.16k
                    continue;
996
2.16k
                }
997
2.52k
            }
998
3.95k
        }
999
3.95k
    }
1000
1001
1.83k
end:
1002
1.83k
    ret = 1;
1003
1004
1.86k
err:
1005
1.86k
    OPENSSL_free(keyshares_arr);
1006
1.86k
    OPENSSL_free(encoded_pubkey_arr);
1007
1.86k
    return ret;
1008
1009
0
#endif
1010
1011
0
    return 1;
1012
1.83k
}
1013
1014
int tls_parse_ctos_cookie(SSL_CONNECTION *s, PACKET *pkt, unsigned int context,
1015
                          X509 *x, size_t chainidx)
1016
99
{
1017
99
#ifndef OPENSSL_NO_TLS1_3
1018
99
    unsigned int format, version, key_share, group_id;
1019
99
    EVP_MD_CTX *hctx;
1020
99
    EVP_PKEY *pkey;
1021
99
    PACKET cookie, raw, chhash, appcookie;
1022
99
    WPACKET hrrpkt;
1023
99
    const unsigned char *data, *mdin, *ciphdata;
1024
99
    unsigned char hmac[SHA256_DIGEST_LENGTH];
1025
99
    unsigned char hrr[MAX_HRR_SIZE];
1026
99
    size_t rawlen, hmaclen, hrrlen, ciphlen;
1027
99
    uint64_t tm, now;
1028
99
    SSL *ssl = SSL_CONNECTION_GET_SSL(s);
1029
99
    SSL_CTX *sctx = SSL_CONNECTION_GET_CTX(s);
1030
1031
    /* Ignore any cookie if we're not set up to verify it */
1032
99
    if (sctx->verify_stateless_cookie_cb == NULL
1033
0
            || (s->s3.flags & TLS1_FLAGS_STATELESS) == 0)
1034
99
        return 1;
1035
1036
0
    if (!PACKET_as_length_prefixed_2(pkt, &cookie)) {
1037
0
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_LENGTH_MISMATCH);
1038
0
        return 0;
1039
0
    }
1040
1041
0
    raw = cookie;
1042
0
    data = PACKET_data(&raw);
1043
0
    rawlen = PACKET_remaining(&raw);
1044
0
    if (rawlen < SHA256_DIGEST_LENGTH
1045
0
            || !PACKET_forward(&raw, rawlen - SHA256_DIGEST_LENGTH)) {
1046
0
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_LENGTH_MISMATCH);
1047
0
        return 0;
1048
0
    }
1049
0
    mdin = PACKET_data(&raw);
1050
1051
    /* Verify the HMAC of the cookie */
1052
0
    hctx = EVP_MD_CTX_create();
1053
0
    pkey = EVP_PKEY_new_raw_private_key_ex(sctx->libctx, "HMAC",
1054
0
                                           sctx->propq,
1055
0
                                           s->session_ctx->ext.cookie_hmac_key,
1056
0
                                           sizeof(s->session_ctx->ext.cookie_hmac_key));
1057
0
    if (hctx == NULL || pkey == NULL) {
1058
0
        EVP_MD_CTX_free(hctx);
1059
0
        EVP_PKEY_free(pkey);
1060
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_EVP_LIB);
1061
0
        return 0;
1062
0
    }
1063
1064
0
    hmaclen = SHA256_DIGEST_LENGTH;
1065
0
    if (EVP_DigestSignInit_ex(hctx, NULL, "SHA2-256", sctx->libctx,
1066
0
                              sctx->propq, pkey, NULL) <= 0
1067
0
            || EVP_DigestSign(hctx, hmac, &hmaclen, data,
1068
0
                              rawlen - SHA256_DIGEST_LENGTH) <= 0
1069
0
            || hmaclen != SHA256_DIGEST_LENGTH) {
1070
0
        EVP_MD_CTX_free(hctx);
1071
0
        EVP_PKEY_free(pkey);
1072
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1073
0
        return 0;
1074
0
    }
1075
1076
0
    EVP_MD_CTX_free(hctx);
1077
0
    EVP_PKEY_free(pkey);
1078
1079
0
    if (CRYPTO_memcmp(hmac, mdin, SHA256_DIGEST_LENGTH) != 0) {
1080
0
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_COOKIE_MISMATCH);
1081
0
        return 0;
1082
0
    }
1083
1084
0
    if (!PACKET_get_net_2(&cookie, &format)) {
1085
0
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_LENGTH_MISMATCH);
1086
0
        return 0;
1087
0
    }
1088
    /* Check the cookie format is something we recognise. Ignore it if not */
1089
0
    if (format != COOKIE_STATE_FORMAT_VERSION)
1090
0
        return 1;
1091
1092
    /*
1093
     * The rest of these checks really shouldn't fail since we have verified the
1094
     * HMAC above.
1095
     */
1096
1097
    /* Check the version number is sane */
1098
0
    if (!PACKET_get_net_2(&cookie, &version)) {
1099
0
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_LENGTH_MISMATCH);
1100
0
        return 0;
1101
0
    }
1102
0
    if (version != TLS1_3_VERSION) {
1103
0
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
1104
0
                 SSL_R_BAD_PROTOCOL_VERSION_NUMBER);
1105
0
        return 0;
1106
0
    }
1107
1108
0
    if (!PACKET_get_net_2(&cookie, &group_id)) {
1109
0
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_LENGTH_MISMATCH);
1110
0
        return 0;
1111
0
    }
1112
1113
0
    ciphdata = PACKET_data(&cookie);
1114
0
    if (!PACKET_forward(&cookie, 2)) {
1115
0
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_LENGTH_MISMATCH);
1116
0
        return 0;
1117
0
    }
1118
0
    if (group_id != s->s3.group_id
1119
0
            || s->s3.tmp.new_cipher
1120
0
               != ssl_get_cipher_by_char(s, ciphdata, 0)) {
1121
        /*
1122
         * We chose a different cipher or group id this time around to what is
1123
         * in the cookie. Something must have changed.
1124
         */
1125
0
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_BAD_CIPHER);
1126
0
        return 0;
1127
0
    }
1128
1129
0
    if (!PACKET_get_1(&cookie, &key_share)
1130
0
            || !PACKET_get_net_8(&cookie, &tm)
1131
0
            || !PACKET_get_length_prefixed_2(&cookie, &chhash)
1132
0
            || !PACKET_get_length_prefixed_1(&cookie, &appcookie)
1133
0
            || PACKET_remaining(&cookie) != SHA256_DIGEST_LENGTH) {
1134
0
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_LENGTH_MISMATCH);
1135
0
        return 0;
1136
0
    }
1137
1138
    /* We tolerate a cookie age of up to 10 minutes (= 60 * 10 seconds) */
1139
0
    now = time(NULL);
1140
0
    if (tm > now || (now - tm) > 600) {
1141
        /* Cookie is stale. Ignore it */
1142
0
        return 1;
1143
0
    }
1144
1145
    /* Verify the app cookie */
1146
0
    if (sctx->verify_stateless_cookie_cb(SSL_CONNECTION_GET_USER_SSL(s),
1147
0
                                         PACKET_data(&appcookie),
1148
0
                                         PACKET_remaining(&appcookie)) == 0) {
1149
0
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_COOKIE_MISMATCH);
1150
0
        return 0;
1151
0
    }
1152
1153
    /*
1154
     * Reconstruct the HRR that we would have sent in response to the original
1155
     * ClientHello so we can add it to the transcript hash.
1156
     * Note: This won't work with custom HRR extensions
1157
     */
1158
0
    if (!WPACKET_init_static_len(&hrrpkt, hrr, sizeof(hrr), 0)) {
1159
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1160
0
        return 0;
1161
0
    }
1162
0
    if (!WPACKET_put_bytes_u8(&hrrpkt, SSL3_MT_SERVER_HELLO)
1163
0
            || !WPACKET_start_sub_packet_u24(&hrrpkt)
1164
0
            || !WPACKET_put_bytes_u16(&hrrpkt, TLS1_2_VERSION)
1165
0
            || !WPACKET_memcpy(&hrrpkt, hrrrandom, SSL3_RANDOM_SIZE)
1166
0
            || !WPACKET_sub_memcpy_u8(&hrrpkt, s->tmp_session_id,
1167
0
                                      s->tmp_session_id_len)
1168
0
            || !ssl->method->put_cipher_by_char(s->s3.tmp.new_cipher, &hrrpkt,
1169
0
                                                &ciphlen)
1170
0
            || !WPACKET_put_bytes_u8(&hrrpkt, 0)
1171
0
            || !WPACKET_start_sub_packet_u16(&hrrpkt)) {
1172
0
        WPACKET_cleanup(&hrrpkt);
1173
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1174
0
        return 0;
1175
0
    }
1176
0
    if (!WPACKET_put_bytes_u16(&hrrpkt, TLSEXT_TYPE_supported_versions)
1177
0
            || !WPACKET_start_sub_packet_u16(&hrrpkt)
1178
0
            || !WPACKET_put_bytes_u16(&hrrpkt, s->version)
1179
0
            || !WPACKET_close(&hrrpkt)) {
1180
0
        WPACKET_cleanup(&hrrpkt);
1181
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1182
0
        return 0;
1183
0
    }
1184
0
    if (key_share) {
1185
0
        if (!WPACKET_put_bytes_u16(&hrrpkt, TLSEXT_TYPE_key_share)
1186
0
                || !WPACKET_start_sub_packet_u16(&hrrpkt)
1187
0
                || !WPACKET_put_bytes_u16(&hrrpkt, s->s3.group_id)
1188
0
                || !WPACKET_close(&hrrpkt)) {
1189
0
            WPACKET_cleanup(&hrrpkt);
1190
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1191
0
            return 0;
1192
0
        }
1193
0
    }
1194
0
    if (!WPACKET_put_bytes_u16(&hrrpkt, TLSEXT_TYPE_cookie)
1195
0
            || !WPACKET_start_sub_packet_u16(&hrrpkt)
1196
0
            || !WPACKET_sub_memcpy_u16(&hrrpkt, data, rawlen)
1197
0
            || !WPACKET_close(&hrrpkt) /* cookie extension */
1198
0
            || !WPACKET_close(&hrrpkt) /* extension block */
1199
0
            || !WPACKET_close(&hrrpkt) /* message */
1200
0
            || !WPACKET_get_total_written(&hrrpkt, &hrrlen)
1201
0
            || !WPACKET_finish(&hrrpkt)) {
1202
0
        WPACKET_cleanup(&hrrpkt);
1203
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1204
0
        return 0;
1205
0
    }
1206
1207
    /* Reconstruct the transcript hash */
1208
0
    if (!create_synthetic_message_hash(s, PACKET_data(&chhash),
1209
0
                                       PACKET_remaining(&chhash), hrr,
1210
0
                                       hrrlen)) {
1211
        /* SSLfatal() already called */
1212
0
        return 0;
1213
0
    }
1214
1215
    /* Act as if this ClientHello came after a HelloRetryRequest */
1216
0
    s->hello_retry_request = SSL_HRR_PENDING;
1217
1218
0
    s->ext.cookieok = 1;
1219
0
#endif
1220
1221
0
    return 1;
1222
0
}
1223
1224
int tls_parse_ctos_supported_groups(SSL_CONNECTION *s, PACKET *pkt,
1225
                                    unsigned int context,
1226
                                    X509 *x, size_t chainidx)
1227
20.1k
{
1228
20.1k
    PACKET supported_groups_list;
1229
1230
    /* Each group is 2 bytes and we must have at least 1. */
1231
20.1k
    if (!PACKET_as_length_prefixed_2(pkt, &supported_groups_list)
1232
19.8k
            || PACKET_remaining(&supported_groups_list) == 0
1233
19.8k
            || (PACKET_remaining(&supported_groups_list) % 2) != 0) {
1234
267
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
1235
267
        return 0;
1236
267
    }
1237
1238
19.8k
    if (!s->hit || SSL_CONNECTION_IS_TLS13(s)) {
1239
19.7k
        OPENSSL_free(s->ext.peer_supportedgroups);
1240
19.7k
        s->ext.peer_supportedgroups = NULL;
1241
19.7k
        s->ext.peer_supportedgroups_len = 0;
1242
19.7k
        if (!tls1_save_u16(&supported_groups_list,
1243
19.7k
                           &s->ext.peer_supportedgroups,
1244
19.7k
                           &s->ext.peer_supportedgroups_len)) {
1245
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1246
0
            return 0;
1247
0
        }
1248
19.7k
    }
1249
1250
19.8k
    return 1;
1251
19.8k
}
1252
1253
int tls_parse_ctos_ems(SSL_CONNECTION *s, PACKET *pkt, unsigned int context,
1254
                       X509 *x, size_t chainidx)
1255
4.89k
{
1256
    /* The extension must always be empty */
1257
4.89k
    if (PACKET_remaining(pkt) != 0) {
1258
14
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
1259
14
        return 0;
1260
14
    }
1261
1262
4.88k
    if (s->options & SSL_OP_NO_EXTENDED_MASTER_SECRET)
1263
0
        return 1;
1264
1265
4.88k
    s->s3.flags |= TLS1_FLAGS_RECEIVED_EXTMS;
1266
1267
4.88k
    return 1;
1268
4.88k
}
1269
1270
1271
int tls_parse_ctos_early_data(SSL_CONNECTION *s, PACKET *pkt, unsigned int context,
1272
                              X509 *x, size_t chainidx)
1273
2.96k
{
1274
2.96k
    if (PACKET_remaining(pkt) != 0) {
1275
10
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
1276
10
        return 0;
1277
10
    }
1278
1279
2.95k
    if (s->hello_retry_request != SSL_HRR_NONE) {
1280
17
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_BAD_EXTENSION);
1281
17
        return 0;
1282
17
    }
1283
1284
2.93k
    return 1;
1285
2.95k
}
1286
1287
static SSL_TICKET_STATUS tls_get_stateful_ticket(SSL_CONNECTION *s, PACKET *tick,
1288
                                                 SSL_SESSION **sess)
1289
0
{
1290
0
    SSL_SESSION *tmpsess = NULL;
1291
1292
0
    s->ext.ticket_expected = 1;
1293
1294
0
    switch (PACKET_remaining(tick)) {
1295
0
        case 0:
1296
0
            return SSL_TICKET_EMPTY;
1297
1298
0
        case SSL_MAX_SSL_SESSION_ID_LENGTH:
1299
0
            break;
1300
1301
0
        default:
1302
0
            return SSL_TICKET_NO_DECRYPT;
1303
0
    }
1304
1305
0
    tmpsess = lookup_sess_in_cache(s, PACKET_data(tick),
1306
0
                                   SSL_MAX_SSL_SESSION_ID_LENGTH);
1307
1308
0
    if (tmpsess == NULL)
1309
0
        return SSL_TICKET_NO_DECRYPT;
1310
1311
0
    *sess = tmpsess;
1312
0
    return SSL_TICKET_SUCCESS;
1313
0
}
1314
1315
int tls_parse_ctos_psk(SSL_CONNECTION *s, PACKET *pkt, unsigned int context,
1316
                       X509 *x, size_t chainidx)
1317
487
{
1318
487
    PACKET identities, binders, binder;
1319
487
    size_t binderoffset;
1320
487
    int hashsize;
1321
487
    SSL_SESSION *sess = NULL;
1322
487
    unsigned int id, i, ext = 0;
1323
487
    const EVP_MD *md = NULL;
1324
487
    SSL_CTX *sctx = SSL_CONNECTION_GET_CTX(s);
1325
487
    SSL *ussl = SSL_CONNECTION_GET_USER_SSL(s);
1326
1327
    /*
1328
     * If we have no PSK kex mode that we recognise then we can't resume so
1329
     * ignore this extension
1330
     */
1331
487
    if ((s->ext.psk_kex_mode
1332
487
            & (TLSEXT_KEX_MODE_FLAG_KE | TLSEXT_KEX_MODE_FLAG_KE_DHE)) == 0)
1333
14
        return 1;
1334
1335
473
    if (!PACKET_get_length_prefixed_2(pkt, &identities)) {
1336
21
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
1337
21
        return 0;
1338
21
    }
1339
1340
452
    s->ext.ticket_expected = 0;
1341
877
    for (id = 0; PACKET_remaining(&identities) != 0; id++) {
1342
662
        PACKET identity;
1343
662
        unsigned long ticket_agel;
1344
662
        size_t idlen;
1345
1346
662
        if (!PACKET_get_length_prefixed_2(&identities, &identity)
1347
588
                || !PACKET_get_net_4(&identities, &ticket_agel)) {
1348
80
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
1349
80
            return 0;
1350
80
        }
1351
1352
582
        idlen = PACKET_remaining(&identity);
1353
582
        if (s->psk_find_session_cb != NULL
1354
0
                && !s->psk_find_session_cb(ussl, PACKET_data(&identity), idlen,
1355
0
                                           &sess)) {
1356
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_BAD_EXTENSION);
1357
0
            return 0;
1358
0
        }
1359
1360
582
#ifndef OPENSSL_NO_PSK
1361
582
        if (sess == NULL
1362
582
                && s->psk_server_callback != NULL
1363
0
                && idlen <= PSK_MAX_IDENTITY_LEN) {
1364
0
            char *pskid = NULL;
1365
0
            unsigned char pskdata[PSK_MAX_PSK_LEN];
1366
0
            unsigned int pskdatalen;
1367
1368
0
            if (!PACKET_strndup(&identity, &pskid)) {
1369
0
                SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1370
0
                return 0;
1371
0
            }
1372
0
            pskdatalen = s->psk_server_callback(ussl, pskid, pskdata,
1373
0
                                                sizeof(pskdata));
1374
0
            OPENSSL_free(pskid);
1375
0
            if (pskdatalen > PSK_MAX_PSK_LEN) {
1376
0
                SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1377
0
                return 0;
1378
0
            } else if (pskdatalen > 0) {
1379
0
                const SSL_CIPHER *cipher;
1380
0
                const unsigned char tls13_aes128gcmsha256_id[] = { 0x13, 0x01 };
1381
1382
                /*
1383
                 * We found a PSK using an old style callback. We don't know
1384
                 * the digest so we default to SHA256 as per the TLSv1.3 spec
1385
                 */
1386
0
                cipher = SSL_CIPHER_find(SSL_CONNECTION_GET_SSL(s),
1387
0
                                         tls13_aes128gcmsha256_id);
1388
0
                if (cipher == NULL) {
1389
0
                    OPENSSL_cleanse(pskdata, pskdatalen);
1390
0
                    SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1391
0
                    return 0;
1392
0
                }
1393
1394
0
                sess = SSL_SESSION_new();
1395
0
                if (sess == NULL
1396
0
                        || !SSL_SESSION_set1_master_key(sess, pskdata,
1397
0
                                                        pskdatalen)
1398
0
                        || !SSL_SESSION_set_cipher(sess, cipher)
1399
0
                        || !SSL_SESSION_set_protocol_version(sess,
1400
0
                                                             TLS1_3_VERSION)) {
1401
0
                    OPENSSL_cleanse(pskdata, pskdatalen);
1402
0
                    SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1403
0
                    goto err;
1404
0
                }
1405
0
                OPENSSL_cleanse(pskdata, pskdatalen);
1406
0
            }
1407
0
        }
1408
582
#endif /* OPENSSL_NO_PSK */
1409
1410
582
        if (sess != NULL) {
1411
            /* We found a PSK */
1412
0
            SSL_SESSION *sesstmp = ssl_session_dup(sess, 0);
1413
1414
0
            if (sesstmp == NULL) {
1415
0
                SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1416
0
                goto err;
1417
0
            }
1418
0
            SSL_SESSION_free(sess);
1419
0
            sess = sesstmp;
1420
1421
            /*
1422
             * We've just been told to use this session for this context so
1423
             * make sure the sid_ctx matches up.
1424
             */
1425
0
            memcpy(sess->sid_ctx, s->sid_ctx, s->sid_ctx_length);
1426
0
            sess->sid_ctx_length = s->sid_ctx_length;
1427
0
            ext = 1;
1428
0
            if (id == 0)
1429
0
                s->ext.early_data_ok = 1;
1430
0
            s->ext.ticket_expected = 1;
1431
582
        } else {
1432
582
            OSSL_TIME t, age, expire;
1433
582
            int ret;
1434
1435
            /*
1436
             * If we are using anti-replay protection then we behave as if
1437
             * SSL_OP_NO_TICKET is set - we are caching tickets anyway so there
1438
             * is no point in using full stateless tickets.
1439
             */
1440
582
            if ((s->options & SSL_OP_NO_TICKET) != 0
1441
582
                    || (s->max_early_data > 0
1442
0
                        && (s->options & SSL_OP_NO_ANTI_REPLAY) == 0))
1443
0
                ret = tls_get_stateful_ticket(s, &identity, &sess);
1444
582
            else
1445
582
                ret = tls_decrypt_ticket(s, PACKET_data(&identity),
1446
582
                                         PACKET_remaining(&identity), NULL, 0,
1447
582
                                         &sess);
1448
1449
582
            if (ret == SSL_TICKET_EMPTY) {
1450
19
                SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
1451
19
                return 0;
1452
19
            }
1453
1454
563
            if (ret == SSL_TICKET_FATAL_ERR_MALLOC
1455
563
                    || ret == SSL_TICKET_FATAL_ERR_OTHER) {
1456
0
                SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1457
0
                return 0;
1458
0
            }
1459
563
            if (ret == SSL_TICKET_NONE || ret == SSL_TICKET_NO_DECRYPT)
1460
303
                continue;
1461
1462
            /* Check for replay */
1463
260
            if (s->max_early_data > 0
1464
0
                    && (s->options & SSL_OP_NO_ANTI_REPLAY) == 0
1465
0
                    && !SSL_CTX_remove_session(s->session_ctx, sess)) {
1466
0
                SSL_SESSION_free(sess);
1467
0
                sess = NULL;
1468
0
                continue;
1469
0
            }
1470
1471
260
            age = ossl_time_subtract(ossl_ms2time(ticket_agel),
1472
260
                                     ossl_ms2time(sess->ext.tick_age_add));
1473
260
            t = ossl_time_subtract(ossl_time_now(), sess->time);
1474
1475
            /*
1476
             * Although internally we use OSS_TIME which has ns granularity,
1477
             * when SSL_SESSION structures are serialised/deserialised we use
1478
             * second granularity for the sess->time field. Therefore it could
1479
             * appear that the client's ticket age is longer than ours (our
1480
             * ticket age calculation should always be slightly longer than the
1481
             * client's due to the network latency). Therefore we add 1000ms to
1482
             * our age calculation to adjust for rounding errors.
1483
             */
1484
260
            expire = ossl_time_add(t, ossl_ms2time(1000));
1485
1486
260
            if (id == 0
1487
259
                    && ossl_time_compare(sess->timeout, t) >= 0
1488
176
                    && ossl_time_compare(age, expire) <= 0
1489
80
                    && ossl_time_compare(ossl_time_add(age, TICKET_AGE_ALLOWANCE),
1490
80
                                         expire) >= 0) {
1491
                /*
1492
                 * Ticket age is within tolerance and not expired. We allow it
1493
                 * for early data
1494
                 */
1495
63
                s->ext.early_data_ok = 1;
1496
63
            }
1497
260
        }
1498
1499
260
        md = ssl_md(sctx, sess->cipher->algorithm2);
1500
260
        if (md == NULL) {
1501
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1502
0
            goto err;
1503
0
        }
1504
260
        if (!EVP_MD_is_a(md,
1505
260
                EVP_MD_get0_name(ssl_md(sctx,
1506
260
                                        s->s3.tmp.new_cipher->algorithm2)))) {
1507
            /* The ciphersuite is not compatible with this session. */
1508
122
            SSL_SESSION_free(sess);
1509
122
            sess = NULL;
1510
122
            s->ext.early_data_ok = 0;
1511
122
            s->ext.ticket_expected = 0;
1512
122
            continue;
1513
122
        }
1514
138
        break;
1515
260
    }
1516
1517
353
    if (sess == NULL)
1518
215
        return 1;
1519
1520
138
    binderoffset = PACKET_data(pkt) - (const unsigned char *)s->init_buf->data;
1521
138
    hashsize = EVP_MD_get_size(md);
1522
138
    if (hashsize <= 0)
1523
0
        goto err;
1524
1525
138
    if (!PACKET_get_length_prefixed_2(pkt, &binders)) {
1526
61
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
1527
61
        goto err;
1528
61
    }
1529
1530
131
    for (i = 0; i <= id; i++) {
1531
77
        if (!PACKET_get_length_prefixed_1(&binders, &binder)) {
1532
23
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
1533
23
            goto err;
1534
23
        }
1535
77
    }
1536
1537
54
    if (PACKET_remaining(&binder) != (size_t)hashsize) {
1538
19
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
1539
19
        goto err;
1540
19
    }
1541
35
    if (tls_psk_do_binder(s, md, (const unsigned char *)s->init_buf->data,
1542
35
                          binderoffset, PACKET_data(&binder), NULL, sess, 0,
1543
35
                          ext) != 1) {
1544
        /* SSLfatal() already called */
1545
30
        goto err;
1546
30
    }
1547
1548
5
    s->ext.tick_identity = id;
1549
1550
5
    SSL_SESSION_free(s->session);
1551
5
    s->session = sess;
1552
5
    return 1;
1553
133
err:
1554
133
    SSL_SESSION_free(sess);
1555
133
    return 0;
1556
35
}
1557
1558
int tls_parse_ctos_post_handshake_auth(SSL_CONNECTION *s, PACKET *pkt,
1559
                                       ossl_unused unsigned int context,
1560
                                       ossl_unused X509 *x,
1561
                                       ossl_unused size_t chainidx)
1562
198
{
1563
198
    if (PACKET_remaining(pkt) != 0) {
1564
16
        SSLfatal(s, SSL_AD_DECODE_ERROR,
1565
16
                 SSL_R_POST_HANDSHAKE_AUTH_ENCODING_ERR);
1566
16
        return 0;
1567
16
    }
1568
1569
182
    s->post_handshake_auth = SSL_PHA_EXT_RECEIVED;
1570
1571
182
    return 1;
1572
198
}
1573
1574
/*
1575
 * Add the server's renegotiation binding
1576
 */
1577
EXT_RETURN tls_construct_stoc_renegotiate(SSL_CONNECTION *s, WPACKET *pkt,
1578
                                          unsigned int context, X509 *x,
1579
                                          size_t chainidx)
1580
25.0k
{
1581
25.0k
    if (!s->s3.send_connection_binding)
1582
17.5k
        return EXT_RETURN_NOT_SENT;
1583
1584
    /* Still add this even if SSL_OP_NO_RENEGOTIATION is set */
1585
7.48k
    if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_renegotiate)
1586
7.48k
            || !WPACKET_start_sub_packet_u16(pkt)
1587
7.48k
            || !WPACKET_start_sub_packet_u8(pkt)
1588
7.48k
            || !WPACKET_memcpy(pkt, s->s3.previous_client_finished,
1589
7.48k
                               s->s3.previous_client_finished_len)
1590
7.48k
            || !WPACKET_memcpy(pkt, s->s3.previous_server_finished,
1591
7.48k
                               s->s3.previous_server_finished_len)
1592
7.48k
            || !WPACKET_close(pkt)
1593
7.48k
            || !WPACKET_close(pkt)) {
1594
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1595
0
        return EXT_RETURN_FAIL;
1596
0
    }
1597
1598
7.48k
    return EXT_RETURN_SENT;
1599
7.48k
}
1600
1601
EXT_RETURN tls_construct_stoc_server_name(SSL_CONNECTION *s, WPACKET *pkt,
1602
                                          unsigned int context, X509 *x,
1603
                                          size_t chainidx)
1604
28.3k
{
1605
28.3k
    if (s->servername_done != 1)
1606
28.3k
        return EXT_RETURN_NOT_SENT;
1607
1608
    /*
1609
     * Prior to TLSv1.3 we ignore any SNI in the current handshake if resuming.
1610
     * We just use the servername from the initial handshake.
1611
     */
1612
0
    if (s->hit && !SSL_CONNECTION_IS_TLS13(s))
1613
0
        return EXT_RETURN_NOT_SENT;
1614
1615
0
    if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_server_name)
1616
0
            || !WPACKET_put_bytes_u16(pkt, 0)) {
1617
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1618
0
        return EXT_RETURN_FAIL;
1619
0
    }
1620
1621
0
    return EXT_RETURN_SENT;
1622
0
}
1623
1624
/* Add/include the server's max fragment len extension into ServerHello */
1625
EXT_RETURN tls_construct_stoc_maxfragmentlen(SSL_CONNECTION *s, WPACKET *pkt,
1626
                                             unsigned int context, X509 *x,
1627
                                             size_t chainidx)
1628
28.3k
{
1629
28.3k
    if (!USE_MAX_FRAGMENT_LENGTH_EXT(s->session))
1630
27.2k
        return EXT_RETURN_NOT_SENT;
1631
1632
    /*-
1633
     * 4 bytes for this extension type and extension length
1634
     * 1 byte for the Max Fragment Length code value.
1635
     */
1636
1.01k
    if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_max_fragment_length)
1637
1.01k
        || !WPACKET_start_sub_packet_u16(pkt)
1638
1.01k
        || !WPACKET_put_bytes_u8(pkt, s->session->ext.max_fragment_len_mode)
1639
1.01k
        || !WPACKET_close(pkt)) {
1640
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1641
0
        return EXT_RETURN_FAIL;
1642
0
    }
1643
1644
1.01k
    return EXT_RETURN_SENT;
1645
1.01k
}
1646
1647
EXT_RETURN tls_construct_stoc_ec_pt_formats(SSL_CONNECTION *s, WPACKET *pkt,
1648
                                            unsigned int context, X509 *x,
1649
                                            size_t chainidx)
1650
25.0k
{
1651
25.0k
    unsigned long alg_k = s->s3.tmp.new_cipher->algorithm_mkey;
1652
25.0k
    unsigned long alg_a = s->s3.tmp.new_cipher->algorithm_auth;
1653
25.0k
    int using_ecc = ((alg_k & SSL_kECDHE) || (alg_a & SSL_aECDSA))
1654
12.2k
                    && (s->ext.peer_ecpointformats != NULL);
1655
25.0k
    const unsigned char *plist;
1656
25.0k
    size_t plistlen;
1657
1658
25.0k
    if (!using_ecc)
1659
21.2k
        return EXT_RETURN_NOT_SENT;
1660
1661
3.81k
    tls1_get_formatlist(s, &plist, &plistlen);
1662
3.81k
    if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_ec_point_formats)
1663
3.81k
            || !WPACKET_start_sub_packet_u16(pkt)
1664
3.81k
            || !WPACKET_sub_memcpy_u8(pkt, plist, plistlen)
1665
3.81k
            || !WPACKET_close(pkt)) {
1666
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1667
0
        return EXT_RETURN_FAIL;
1668
0
    }
1669
1670
3.81k
    return EXT_RETURN_SENT;
1671
3.81k
}
1672
1673
EXT_RETURN tls_construct_stoc_supported_groups(SSL_CONNECTION *s, WPACKET *pkt,
1674
                                               unsigned int context, X509 *x,
1675
                                               size_t chainidx)
1676
28.3k
{
1677
28.3k
    const uint16_t *groups;
1678
28.3k
    size_t numgroups, i, first = 1;
1679
28.3k
    int version;
1680
1681
    /* s->s3.group_id is non zero if we accepted a key_share */
1682
28.3k
    if (s->s3.group_id == 0)
1683
25.0k
        return EXT_RETURN_NOT_SENT;
1684
1685
    /* Get our list of supported groups */
1686
3.23k
    tls1_get_supported_groups(s, &groups, &numgroups);
1687
3.23k
    if (numgroups == 0) {
1688
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1689
0
        return EXT_RETURN_FAIL;
1690
0
    }
1691
1692
    /* Copy group ID if supported */
1693
3.23k
    version = SSL_version(SSL_CONNECTION_GET_SSL(s));
1694
14.8k
    for (i = 0; i < numgroups; i++) {
1695
13.3k
        uint16_t group = groups[i];
1696
1697
13.3k
        if (tls_valid_group(s, group, version, version, 0, NULL)
1698
13.3k
                && tls_group_allowed(s, group, SSL_SECOP_CURVE_SUPPORTED)) {
1699
13.3k
            if (first) {
1700
                /*
1701
                 * Check if the client is already using our preferred group. If
1702
                 * so we don't need to add this extension
1703
                 */
1704
3.23k
                if (s->s3.group_id == group)
1705
1.79k
                    return EXT_RETURN_NOT_SENT;
1706
1707
                /* Add extension header */
1708
1.43k
                if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_groups)
1709
                           /* Sub-packet for supported_groups extension */
1710
1.43k
                        || !WPACKET_start_sub_packet_u16(pkt)
1711
1.43k
                        || !WPACKET_start_sub_packet_u16(pkt)) {
1712
0
                    SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1713
0
                    return EXT_RETURN_FAIL;
1714
0
                }
1715
1716
1.43k
                first = 0;
1717
1.43k
            }
1718
11.5k
            if (!WPACKET_put_bytes_u16(pkt, group)) {
1719
0
                    SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1720
0
                    return EXT_RETURN_FAIL;
1721
0
                }
1722
11.5k
        }
1723
13.3k
    }
1724
1725
1.43k
    if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) {
1726
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1727
0
        return EXT_RETURN_FAIL;
1728
0
    }
1729
1730
1.43k
    return EXT_RETURN_SENT;
1731
1.43k
}
1732
1733
EXT_RETURN tls_construct_stoc_session_ticket(SSL_CONNECTION *s, WPACKET *pkt,
1734
                                             unsigned int context, X509 *x,
1735
                                             size_t chainidx)
1736
25.0k
{
1737
25.0k
    if (!s->ext.ticket_expected || !tls_use_ticket(s)) {
1738
19.8k
        s->ext.ticket_expected = 0;
1739
19.8k
        return EXT_RETURN_NOT_SENT;
1740
19.8k
    }
1741
1742
5.20k
    if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_session_ticket)
1743
5.20k
            || !WPACKET_put_bytes_u16(pkt, 0)) {
1744
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1745
0
        return EXT_RETURN_FAIL;
1746
0
    }
1747
1748
5.20k
    return EXT_RETURN_SENT;
1749
5.20k
}
1750
1751
#ifndef OPENSSL_NO_OCSP
1752
EXT_RETURN tls_construct_stoc_status_request(SSL_CONNECTION *s, WPACKET *pkt,
1753
                                             unsigned int context, X509 *x,
1754
                                             size_t chainidx)
1755
8.36k
{
1756
8.36k
    OCSP_RESPONSE *resp;
1757
1758
    /* We don't currently support this extension inside a CertificateRequest */
1759
8.36k
    if (context == SSL_EXT_TLS1_3_CERTIFICATE_REQUEST)
1760
0
        return EXT_RETURN_NOT_SENT;
1761
1762
8.36k
    if (!s->ext.status_expected)
1763
8.36k
        return EXT_RETURN_NOT_SENT;
1764
1765
    /* Try to retrieve OCSP response for the actual certificate */
1766
0
    resp = ossl_get_ocsp_response(s, (int)chainidx);
1767
1768
    /* If no OCSP response was found the extension is not sent */
1769
0
    if (resp == NULL)
1770
0
        return EXT_RETURN_NOT_SENT;
1771
1772
0
    if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_status_request)
1773
0
            || !WPACKET_start_sub_packet_u16(pkt)) {
1774
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1775
0
        return EXT_RETURN_FAIL;
1776
0
    }
1777
1778
    /*
1779
     * In TLSv1.3 we include the certificate status itself. In <= TLSv1.2 we
1780
     * send back an empty extension, with the certificate status appearing as a
1781
     * separate message
1782
     */
1783
0
    if (SSL_CONNECTION_IS_TLS13(s)
1784
0
        && !tls_construct_cert_status_body(s, resp, pkt)) {
1785
        /* SSLfatal() already called */
1786
0
        return EXT_RETURN_FAIL;
1787
0
    }
1788
0
    if (!WPACKET_close(pkt)) {
1789
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1790
0
        return EXT_RETURN_FAIL;
1791
0
    }
1792
1793
0
    return EXT_RETURN_SENT;
1794
0
}
1795
#endif
1796
1797
#ifndef OPENSSL_NO_NEXTPROTONEG
1798
EXT_RETURN tls_construct_stoc_next_proto_neg(SSL_CONNECTION *s, WPACKET *pkt,
1799
                                             unsigned int context, X509 *x,
1800
                                             size_t chainidx)
1801
25.0k
{
1802
25.0k
    const unsigned char *npa;
1803
25.0k
    unsigned int npalen;
1804
25.0k
    int ret;
1805
25.0k
    int npn_seen = s->s3.npn_seen;
1806
25.0k
    SSL_CTX *sctx = SSL_CONNECTION_GET_CTX(s);
1807
1808
25.0k
    s->s3.npn_seen = 0;
1809
25.0k
    if (!npn_seen || sctx->ext.npn_advertised_cb == NULL)
1810
25.0k
        return EXT_RETURN_NOT_SENT;
1811
1812
0
    ret = sctx->ext.npn_advertised_cb(SSL_CONNECTION_GET_USER_SSL(s), &npa,
1813
0
                                      &npalen, sctx->ext.npn_advertised_cb_arg);
1814
0
    if (ret == SSL_TLSEXT_ERR_OK) {
1815
0
        if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_next_proto_neg)
1816
0
                || !WPACKET_sub_memcpy_u16(pkt, npa, npalen)) {
1817
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1818
0
            return EXT_RETURN_FAIL;
1819
0
        }
1820
0
        s->s3.npn_seen = 1;
1821
0
        return EXT_RETURN_SENT;
1822
0
    }
1823
1824
0
    return EXT_RETURN_NOT_SENT;
1825
0
}
1826
#endif
1827
1828
EXT_RETURN tls_construct_stoc_alpn(SSL_CONNECTION *s, WPACKET *pkt, unsigned int context,
1829
                                   X509 *x, size_t chainidx)
1830
28.3k
{
1831
28.3k
    if (s->s3.alpn_selected == NULL)
1832
28.3k
        return EXT_RETURN_NOT_SENT;
1833
1834
0
    if (!WPACKET_put_bytes_u16(pkt,
1835
0
                TLSEXT_TYPE_application_layer_protocol_negotiation)
1836
0
            || !WPACKET_start_sub_packet_u16(pkt)
1837
0
            || !WPACKET_start_sub_packet_u16(pkt)
1838
0
            || !WPACKET_sub_memcpy_u8(pkt, s->s3.alpn_selected,
1839
0
                                      s->s3.alpn_selected_len)
1840
0
            || !WPACKET_close(pkt)
1841
0
            || !WPACKET_close(pkt)) {
1842
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1843
0
        return EXT_RETURN_FAIL;
1844
0
    }
1845
1846
0
    return EXT_RETURN_SENT;
1847
0
}
1848
1849
#ifndef OPENSSL_NO_SRTP
1850
EXT_RETURN tls_construct_stoc_use_srtp(SSL_CONNECTION *s, WPACKET *pkt,
1851
                                       unsigned int context, X509 *x,
1852
                                       size_t chainidx)
1853
28.3k
{
1854
28.3k
    if (s->srtp_profile == NULL)
1855
28.3k
        return EXT_RETURN_NOT_SENT;
1856
1857
0
    if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_use_srtp)
1858
0
            || !WPACKET_start_sub_packet_u16(pkt)
1859
0
            || !WPACKET_put_bytes_u16(pkt, 2)
1860
0
            || !WPACKET_put_bytes_u16(pkt, s->srtp_profile->id)
1861
0
            || !WPACKET_put_bytes_u8(pkt, 0)
1862
0
            || !WPACKET_close(pkt)) {
1863
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1864
0
        return EXT_RETURN_FAIL;
1865
0
    }
1866
1867
0
    return EXT_RETURN_SENT;
1868
0
}
1869
#endif
1870
1871
EXT_RETURN tls_construct_stoc_etm(SSL_CONNECTION *s, WPACKET *pkt,
1872
                                  unsigned int context,
1873
                                  X509 *x, size_t chainidx)
1874
25.0k
{
1875
25.0k
    if (!s->ext.use_etm)
1876
23.3k
        return EXT_RETURN_NOT_SENT;
1877
1878
    /*
1879
     * Don't use encrypt_then_mac if AEAD or RC4 might want to disable
1880
     * for other cases too.
1881
     */
1882
1.72k
    if (s->s3.tmp.new_cipher->algorithm_mac == SSL_AEAD
1883
1.39k
        || s->s3.tmp.new_cipher->algorithm_enc == SSL_RC4
1884
1.39k
        || s->s3.tmp.new_cipher->algorithm_enc == SSL_eGOST2814789CNT
1885
1.39k
        || s->s3.tmp.new_cipher->algorithm_enc == SSL_eGOST2814789CNT12
1886
1.39k
        || s->s3.tmp.new_cipher->algorithm_enc == SSL_MAGMA
1887
1.39k
        || s->s3.tmp.new_cipher->algorithm_enc == SSL_KUZNYECHIK) {
1888
333
        s->ext.use_etm = 0;
1889
333
        return EXT_RETURN_NOT_SENT;
1890
333
    }
1891
1892
1.39k
    if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_encrypt_then_mac)
1893
1.39k
            || !WPACKET_put_bytes_u16(pkt, 0)) {
1894
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1895
0
        return EXT_RETURN_FAIL;
1896
0
    }
1897
1898
1.39k
    return EXT_RETURN_SENT;
1899
1.39k
}
1900
1901
EXT_RETURN tls_construct_stoc_ems(SSL_CONNECTION *s, WPACKET *pkt,
1902
                                  unsigned int context,
1903
                                  X509 *x, size_t chainidx)
1904
25.0k
{
1905
25.0k
    if ((s->s3.flags & TLS1_FLAGS_RECEIVED_EXTMS) == 0)
1906
20.8k
        return EXT_RETURN_NOT_SENT;
1907
1908
4.17k
    if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_extended_master_secret)
1909
4.17k
            || !WPACKET_put_bytes_u16(pkt, 0)) {
1910
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1911
0
        return EXT_RETURN_FAIL;
1912
0
    }
1913
1914
4.17k
    return EXT_RETURN_SENT;
1915
4.17k
}
1916
1917
EXT_RETURN tls_construct_stoc_supported_versions(SSL_CONNECTION *s, WPACKET *pkt,
1918
                                                 unsigned int context, X509 *x,
1919
                                                 size_t chainidx)
1920
4.06k
{
1921
4.06k
    if (!ossl_assert(SSL_CONNECTION_IS_TLS13(s))) {
1922
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1923
0
        return EXT_RETURN_FAIL;
1924
0
    }
1925
1926
4.06k
    if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_versions)
1927
4.06k
            || !WPACKET_start_sub_packet_u16(pkt)
1928
4.06k
            || !WPACKET_put_bytes_u16(pkt, s->version)
1929
4.06k
            || !WPACKET_close(pkt)) {
1930
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1931
0
        return EXT_RETURN_FAIL;
1932
0
    }
1933
1934
4.06k
    return EXT_RETURN_SENT;
1935
4.06k
}
1936
1937
EXT_RETURN tls_construct_stoc_key_share(SSL_CONNECTION *s, WPACKET *pkt,
1938
                                        unsigned int context, X509 *x,
1939
                                        size_t chainidx)
1940
4.06k
{
1941
4.06k
#ifndef OPENSSL_NO_TLS1_3
1942
4.06k
    unsigned char *encoded_pubkey;
1943
4.06k
    size_t encoded_pubkey_len = 0;
1944
4.06k
    EVP_PKEY *ckey = s->s3.peer_tmp, *skey = NULL;
1945
4.06k
    const TLS_GROUP_INFO *ginf = NULL;
1946
1947
4.06k
    if (s->hello_retry_request == SSL_HRR_PENDING) {
1948
807
        if (ckey != NULL) {
1949
            /* Original key_share was acceptable so don't ask for another one */
1950
0
            return EXT_RETURN_NOT_SENT;
1951
0
        }
1952
807
        if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_key_share)
1953
807
                || !WPACKET_start_sub_packet_u16(pkt)
1954
807
                || !WPACKET_put_bytes_u16(pkt, s->s3.group_id)
1955
807
                || !WPACKET_close(pkt)) {
1956
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1957
0
            return EXT_RETURN_FAIL;
1958
0
        }
1959
1960
807
        return EXT_RETURN_SENT;
1961
807
    }
1962
1963
3.25k
    if (ckey == NULL) {
1964
        /* No key_share received from client - must be resuming */
1965
0
        if (!s->hit || !tls13_generate_handshake_secret(s, NULL, 0)) {
1966
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1967
0
            return EXT_RETURN_FAIL;
1968
0
        }
1969
0
        return EXT_RETURN_NOT_SENT;
1970
0
    }
1971
1972
3.25k
    if (s->hit && (s->ext.psk_kex_mode & TLSEXT_KEX_MODE_FLAG_KE_DHE) == 0) {
1973
        /*
1974
         * PSK ('hit') and explicitly not doing DHE. If the client sent the
1975
         * DHE option, we take it by default, except if non-DHE would be
1976
         * preferred by config, but this case would have been handled in
1977
         * tls_parse_ctos_psk_kex_modes().
1978
         */
1979
0
        return EXT_RETURN_NOT_SENT;
1980
0
    }
1981
1982
3.25k
    if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_key_share)
1983
3.25k
            || !WPACKET_start_sub_packet_u16(pkt)
1984
3.25k
            || !WPACKET_put_bytes_u16(pkt, s->s3.group_id)) {
1985
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1986
0
        return EXT_RETURN_FAIL;
1987
0
    }
1988
1989
3.25k
    if ((ginf = tls1_group_id_lookup(SSL_CONNECTION_GET_CTX(s),
1990
3.25k
                                     s->s3.group_id)) == NULL) {
1991
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
1992
0
        return EXT_RETURN_FAIL;
1993
0
    }
1994
1995
3.25k
    if (!ginf->is_kem) {
1996
        /* Regular KEX */
1997
3.24k
        skey = ssl_generate_pkey(s, ckey);
1998
3.24k
        if (skey == NULL) {
1999
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_SSL_LIB);
2000
0
            return EXT_RETURN_FAIL;
2001
0
        }
2002
2003
        /* Generate encoding of server key */
2004
3.24k
        encoded_pubkey_len = EVP_PKEY_get1_encoded_public_key(skey, &encoded_pubkey);
2005
3.24k
        if (encoded_pubkey_len == 0) {
2006
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_EC_LIB);
2007
0
            EVP_PKEY_free(skey);
2008
0
            return EXT_RETURN_FAIL;
2009
0
        }
2010
2011
3.24k
        if (!WPACKET_sub_memcpy_u16(pkt, encoded_pubkey, encoded_pubkey_len)
2012
3.24k
                || !WPACKET_close(pkt)) {
2013
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
2014
0
            EVP_PKEY_free(skey);
2015
0
            OPENSSL_free(encoded_pubkey);
2016
0
            return EXT_RETURN_FAIL;
2017
0
        }
2018
3.24k
        OPENSSL_free(encoded_pubkey);
2019
2020
        /*
2021
         * This causes the crypto state to be updated based on the derived keys
2022
         */
2023
3.24k
        s->s3.tmp.pkey = skey;
2024
3.24k
        if (ssl_derive(s, skey, ckey, 1) == 0) {
2025
            /* SSLfatal() already called */
2026
22
            return EXT_RETURN_FAIL;
2027
22
        }
2028
3.24k
    } else {
2029
        /* KEM mode */
2030
16
        unsigned char *ct = NULL;
2031
16
        size_t ctlen = 0;
2032
2033
        /*
2034
         * This does not update the crypto state.
2035
         *
2036
         * The generated pms is stored in `s->s3.tmp.pms` to be later used via
2037
         * ssl_gensecret().
2038
         */
2039
16
        if (ssl_encapsulate(s, ckey, &ct, &ctlen, 0) == 0) {
2040
            /* SSLfatal() already called */
2041
6
            return EXT_RETURN_FAIL;
2042
6
        }
2043
2044
10
        if (ctlen == 0) {
2045
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
2046
0
            OPENSSL_free(ct);
2047
0
            return EXT_RETURN_FAIL;
2048
0
        }
2049
2050
10
        if (!WPACKET_sub_memcpy_u16(pkt, ct, ctlen)
2051
10
                || !WPACKET_close(pkt)) {
2052
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
2053
0
            OPENSSL_free(ct);
2054
0
            return EXT_RETURN_FAIL;
2055
0
        }
2056
10
        OPENSSL_free(ct);
2057
2058
        /*
2059
         * This causes the crypto state to be updated based on the generated pms
2060
         */
2061
10
        if (ssl_gensecret(s, s->s3.tmp.pms, s->s3.tmp.pmslen) == 0) {
2062
            /* SSLfatal() already called */
2063
0
            return EXT_RETURN_FAIL;
2064
0
        }
2065
10
    }
2066
3.23k
    s->s3.did_kex = 1;
2067
3.23k
    return EXT_RETURN_SENT;
2068
#else
2069
    return EXT_RETURN_FAIL;
2070
#endif
2071
3.25k
}
2072
2073
EXT_RETURN tls_construct_stoc_cookie(SSL_CONNECTION *s, WPACKET *pkt,
2074
                                     unsigned int context,
2075
                                     X509 *x, size_t chainidx)
2076
807
{
2077
807
#ifndef OPENSSL_NO_TLS1_3
2078
807
    unsigned char *hashval1, *hashval2, *appcookie1, *appcookie2, *cookie;
2079
807
    unsigned char *hmac, *hmac2;
2080
807
    size_t startlen, ciphlen, totcookielen, hashlen, hmaclen, appcookielen;
2081
807
    EVP_MD_CTX *hctx;
2082
807
    EVP_PKEY *pkey;
2083
807
    int ret = EXT_RETURN_FAIL;
2084
807
    SSL_CTX *sctx = SSL_CONNECTION_GET_CTX(s);
2085
807
    SSL *ssl = SSL_CONNECTION_GET_SSL(s);
2086
807
    SSL *ussl = SSL_CONNECTION_GET_USER_SSL(s);
2087
2088
807
    if ((s->s3.flags & TLS1_FLAGS_STATELESS) == 0)
2089
807
        return EXT_RETURN_NOT_SENT;
2090
2091
0
    if (sctx->gen_stateless_cookie_cb == NULL) {
2092
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_NO_COOKIE_CALLBACK_SET);
2093
0
        return EXT_RETURN_FAIL;
2094
0
    }
2095
2096
0
    if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_cookie)
2097
0
            || !WPACKET_start_sub_packet_u16(pkt)
2098
0
            || !WPACKET_start_sub_packet_u16(pkt)
2099
0
            || !WPACKET_get_total_written(pkt, &startlen)
2100
0
            || !WPACKET_reserve_bytes(pkt, MAX_COOKIE_SIZE, &cookie)
2101
0
            || !WPACKET_put_bytes_u16(pkt, COOKIE_STATE_FORMAT_VERSION)
2102
0
            || !WPACKET_put_bytes_u16(pkt, TLS1_3_VERSION)
2103
0
            || !WPACKET_put_bytes_u16(pkt, s->s3.group_id)
2104
0
            || !ssl->method->put_cipher_by_char(s->s3.tmp.new_cipher, pkt,
2105
0
                                                &ciphlen)
2106
               /* Is there a key_share extension present in this HRR? */
2107
0
            || !WPACKET_put_bytes_u8(pkt, s->s3.peer_tmp == NULL)
2108
0
            || !WPACKET_put_bytes_u64(pkt, time(NULL))
2109
0
            || !WPACKET_start_sub_packet_u16(pkt)
2110
0
            || !WPACKET_reserve_bytes(pkt, EVP_MAX_MD_SIZE, &hashval1)) {
2111
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
2112
0
        return EXT_RETURN_FAIL;
2113
0
    }
2114
2115
    /*
2116
     * Get the hash of the initial ClientHello. ssl_handshake_hash() operates
2117
     * on raw buffers, so we first reserve sufficient bytes (above) and then
2118
     * subsequently allocate them (below)
2119
     */
2120
0
    if (!ssl3_digest_cached_records(s, 0)
2121
0
            || !ssl_handshake_hash(s, hashval1, EVP_MAX_MD_SIZE, &hashlen)) {
2122
        /* SSLfatal() already called */
2123
0
        return EXT_RETURN_FAIL;
2124
0
    }
2125
2126
0
    if (!WPACKET_allocate_bytes(pkt, hashlen, &hashval2)
2127
0
            || !ossl_assert(hashval1 == hashval2)
2128
0
            || !WPACKET_close(pkt)
2129
0
            || !WPACKET_start_sub_packet_u8(pkt)
2130
0
            || !WPACKET_reserve_bytes(pkt, SSL_COOKIE_LENGTH, &appcookie1)) {
2131
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
2132
0
        return EXT_RETURN_FAIL;
2133
0
    }
2134
2135
    /* Generate the application cookie */
2136
0
    if (sctx->gen_stateless_cookie_cb(ussl, appcookie1,
2137
0
                                      &appcookielen) == 0) {
2138
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_COOKIE_GEN_CALLBACK_FAILURE);
2139
0
        return EXT_RETURN_FAIL;
2140
0
    }
2141
2142
0
    if (!WPACKET_allocate_bytes(pkt, appcookielen, &appcookie2)
2143
0
            || !ossl_assert(appcookie1 == appcookie2)
2144
0
            || !WPACKET_close(pkt)
2145
0
            || !WPACKET_get_total_written(pkt, &totcookielen)
2146
0
            || !WPACKET_reserve_bytes(pkt, SHA256_DIGEST_LENGTH, &hmac)) {
2147
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
2148
0
        return EXT_RETURN_FAIL;
2149
0
    }
2150
0
    hmaclen = SHA256_DIGEST_LENGTH;
2151
2152
0
    totcookielen -= startlen;
2153
0
    if (!ossl_assert(totcookielen <= MAX_COOKIE_SIZE - SHA256_DIGEST_LENGTH)) {
2154
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
2155
0
        return EXT_RETURN_FAIL;
2156
0
    }
2157
2158
    /* HMAC the cookie */
2159
0
    hctx = EVP_MD_CTX_create();
2160
0
    pkey = EVP_PKEY_new_raw_private_key_ex(sctx->libctx, "HMAC",
2161
0
                                           sctx->propq,
2162
0
                                           s->session_ctx->ext.cookie_hmac_key,
2163
0
                                           sizeof(s->session_ctx->ext.cookie_hmac_key));
2164
0
    if (hctx == NULL || pkey == NULL) {
2165
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_EVP_LIB);
2166
0
        goto err;
2167
0
    }
2168
2169
0
    if (EVP_DigestSignInit_ex(hctx, NULL, "SHA2-256", sctx->libctx,
2170
0
                              sctx->propq, pkey, NULL) <= 0
2171
0
            || EVP_DigestSign(hctx, hmac, &hmaclen, cookie,
2172
0
                              totcookielen) <= 0) {
2173
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
2174
0
        goto err;
2175
0
    }
2176
2177
0
    if (!ossl_assert(totcookielen + hmaclen <= MAX_COOKIE_SIZE)) {
2178
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
2179
0
        goto err;
2180
0
    }
2181
2182
0
    if (!WPACKET_allocate_bytes(pkt, hmaclen, &hmac2)
2183
0
            || !ossl_assert(hmac == hmac2)
2184
0
            || !ossl_assert(cookie == hmac - totcookielen)
2185
0
            || !WPACKET_close(pkt)
2186
0
            || !WPACKET_close(pkt)) {
2187
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
2188
0
        goto err;
2189
0
    }
2190
2191
0
    ret = EXT_RETURN_SENT;
2192
2193
0
 err:
2194
0
    EVP_MD_CTX_free(hctx);
2195
0
    EVP_PKEY_free(pkey);
2196
0
    return ret;
2197
#else
2198
    return EXT_RETURN_FAIL;
2199
#endif
2200
0
}
2201
2202
EXT_RETURN tls_construct_stoc_cryptopro_bug(SSL_CONNECTION *s, WPACKET *pkt,
2203
                                            unsigned int context, X509 *x,
2204
                                            size_t chainidx)
2205
25.0k
{
2206
25.0k
    const unsigned char cryptopro_ext[36] = {
2207
25.0k
        0xfd, 0xe8,         /* 65000 */
2208
25.0k
        0x00, 0x20,         /* 32 bytes length */
2209
25.0k
        0x30, 0x1e, 0x30, 0x08, 0x06, 0x06, 0x2a, 0x85,
2210
25.0k
        0x03, 0x02, 0x02, 0x09, 0x30, 0x08, 0x06, 0x06,
2211
25.0k
        0x2a, 0x85, 0x03, 0x02, 0x02, 0x16, 0x30, 0x08,
2212
25.0k
        0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x17
2213
25.0k
    };
2214
2215
25.0k
    if (((s->s3.tmp.new_cipher->id & 0xFFFF) != 0x80
2216
25.0k
         && (s->s3.tmp.new_cipher->id & 0xFFFF) != 0x81)
2217
0
            || (SSL_get_options(SSL_CONNECTION_GET_SSL(s))
2218
0
                & SSL_OP_CRYPTOPRO_TLSEXT_BUG) == 0)
2219
25.0k
        return EXT_RETURN_NOT_SENT;
2220
2221
0
    if (!WPACKET_memcpy(pkt, cryptopro_ext, sizeof(cryptopro_ext))) {
2222
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
2223
0
        return EXT_RETURN_FAIL;
2224
0
    }
2225
2226
0
    return EXT_RETURN_SENT;
2227
0
}
2228
2229
EXT_RETURN tls_construct_stoc_early_data(SSL_CONNECTION *s, WPACKET *pkt,
2230
                                         unsigned int context, X509 *x,
2231
                                         size_t chainidx)
2232
3.23k
{
2233
3.23k
    if (context == SSL_EXT_TLS1_3_NEW_SESSION_TICKET) {
2234
0
        if (s->max_early_data == 0)
2235
0
            return EXT_RETURN_NOT_SENT;
2236
2237
0
        if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_early_data)
2238
0
                || !WPACKET_start_sub_packet_u16(pkt)
2239
0
                || !WPACKET_put_bytes_u32(pkt, s->max_early_data)
2240
0
                || !WPACKET_close(pkt)) {
2241
0
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
2242
0
            return EXT_RETURN_FAIL;
2243
0
        }
2244
2245
0
        return EXT_RETURN_SENT;
2246
0
    }
2247
2248
3.23k
    if (s->ext.early_data != SSL_EARLY_DATA_ACCEPTED)
2249
3.23k
        return EXT_RETURN_NOT_SENT;
2250
2251
0
    if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_early_data)
2252
0
            || !WPACKET_start_sub_packet_u16(pkt)
2253
0
            || !WPACKET_close(pkt)) {
2254
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
2255
0
        return EXT_RETURN_FAIL;
2256
0
    }
2257
2258
0
    return EXT_RETURN_SENT;
2259
0
}
2260
2261
EXT_RETURN tls_construct_stoc_psk(SSL_CONNECTION *s, WPACKET *pkt,
2262
                                  unsigned int context,
2263
                                  X509 *x, size_t chainidx)
2264
3.23k
{
2265
3.23k
    if (!s->hit)
2266
3.23k
        return EXT_RETURN_NOT_SENT;
2267
2268
0
    if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_psk)
2269
0
            || !WPACKET_start_sub_packet_u16(pkt)
2270
0
            || !WPACKET_put_bytes_u16(pkt, s->ext.tick_identity)
2271
0
            || !WPACKET_close(pkt)) {
2272
0
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
2273
0
        return EXT_RETURN_FAIL;
2274
0
    }
2275
2276
0
    return EXT_RETURN_SENT;
2277
0
}
2278
2279
EXT_RETURN tls_construct_stoc_client_cert_type(SSL_CONNECTION *sc, WPACKET *pkt,
2280
                                               unsigned int context,
2281
                                               X509 *x, size_t chainidx)
2282
25.8k
{
2283
25.8k
    if (sc->ext.client_cert_type_ctos == OSSL_CERT_TYPE_CTOS_ERROR
2284
0
        && (send_certificate_request(sc)
2285
0
            || sc->post_handshake_auth == SSL_PHA_EXT_RECEIVED)) {
2286
        /* Did not receive an acceptable cert type - and doing client auth */
2287
0
        SSLfatal(sc, SSL_AD_UNSUPPORTED_CERTIFICATE, SSL_R_BAD_EXTENSION);
2288
0
        return EXT_RETURN_FAIL;
2289
0
    }
2290
2291
25.8k
    if (sc->ext.client_cert_type == TLSEXT_cert_type_x509) {
2292
25.8k
        sc->ext.client_cert_type_ctos = OSSL_CERT_TYPE_CTOS_NONE;
2293
25.8k
        return EXT_RETURN_NOT_SENT;
2294
25.8k
    }
2295
2296
    /*
2297
     * Note: only supposed to send this if we are going to do a cert request,
2298
     * but TLSv1.3 could do a PHA request if the client supports it
2299
     */
2300
0
    if ((!send_certificate_request(sc) && sc->post_handshake_auth != SSL_PHA_EXT_RECEIVED)
2301
0
            || sc->ext.client_cert_type_ctos != OSSL_CERT_TYPE_CTOS_GOOD
2302
0
            || sc->client_cert_type == NULL) {
2303
        /* if we don't send it, reset to TLSEXT_cert_type_x509 */
2304
0
        sc->ext.client_cert_type_ctos = OSSL_CERT_TYPE_CTOS_NONE;
2305
0
        sc->ext.client_cert_type = TLSEXT_cert_type_x509;
2306
0
        return EXT_RETURN_NOT_SENT;
2307
0
    }
2308
2309
0
    if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_client_cert_type)
2310
0
            || !WPACKET_start_sub_packet_u16(pkt)
2311
0
            || !WPACKET_put_bytes_u8(pkt, sc->ext.client_cert_type)
2312
0
            || !WPACKET_close(pkt)) {
2313
0
        SSLfatal(sc, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
2314
0
        return EXT_RETURN_FAIL;
2315
0
    }
2316
0
    return EXT_RETURN_SENT;
2317
0
}
2318
2319
/* One of |pref|, |other| is configured and the values are sanitized */
2320
static int reconcile_cert_type(const unsigned char *pref, size_t pref_len,
2321
                               const unsigned char *other, size_t other_len,
2322
                               uint8_t *chosen_cert_type)
2323
0
{
2324
0
    size_t i;
2325
2326
0
    for (i = 0; i < pref_len; i++) {
2327
0
        if (memchr(other, pref[i], other_len) != NULL) {
2328
0
            *chosen_cert_type = pref[i];
2329
0
            return OSSL_CERT_TYPE_CTOS_GOOD;
2330
0
        }
2331
0
    }
2332
0
    return OSSL_CERT_TYPE_CTOS_ERROR;
2333
0
}
2334
2335
int tls_parse_ctos_client_cert_type(SSL_CONNECTION *sc, PACKET *pkt,
2336
                                    unsigned int context,
2337
                                    X509 *x, size_t chainidx)
2338
285
{
2339
285
    PACKET supported_cert_types;
2340
285
    const unsigned char *data;
2341
285
    size_t len;
2342
2343
    /* Ignore the extension */
2344
285
    if (sc->client_cert_type == NULL) {
2345
285
        sc->ext.client_cert_type_ctos = OSSL_CERT_TYPE_CTOS_NONE;
2346
285
        sc->ext.client_cert_type = TLSEXT_cert_type_x509;
2347
285
        return 1;
2348
285
    }
2349
2350
0
    if (!PACKET_as_length_prefixed_1(pkt, &supported_cert_types)) {
2351
0
        sc->ext.client_cert_type_ctos = OSSL_CERT_TYPE_CTOS_ERROR;
2352
0
        SSLfatal(sc, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
2353
0
        return 0;
2354
0
    }
2355
0
    if ((len = PACKET_remaining(&supported_cert_types)) == 0) {
2356
0
        sc->ext.client_cert_type_ctos = OSSL_CERT_TYPE_CTOS_ERROR;
2357
0
        SSLfatal(sc, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
2358
0
        return 0;
2359
0
    }
2360
0
    if (!PACKET_get_bytes(&supported_cert_types, &data, len)) {
2361
0
        sc->ext.client_cert_type_ctos = OSSL_CERT_TYPE_CTOS_ERROR;
2362
0
        SSLfatal(sc, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
2363
0
        return 0;
2364
0
    }
2365
    /* client_cert_type: client (peer) has priority */
2366
0
    sc->ext.client_cert_type_ctos = reconcile_cert_type(data, len,
2367
0
                                                        sc->client_cert_type, sc->client_cert_type_len,
2368
0
                                                        &sc->ext.client_cert_type);
2369
2370
    /* Ignore the error until sending - so we can check cert auth*/
2371
0
    return 1;
2372
0
}
2373
2374
EXT_RETURN tls_construct_stoc_server_cert_type(SSL_CONNECTION *sc, WPACKET *pkt,
2375
                                               unsigned int context,
2376
                                               X509 *x, size_t chainidx)
2377
25.8k
{
2378
25.8k
    if (sc->ext.server_cert_type == TLSEXT_cert_type_x509) {
2379
25.8k
        sc->ext.server_cert_type_ctos = OSSL_CERT_TYPE_CTOS_NONE;
2380
25.8k
        return EXT_RETURN_NOT_SENT;
2381
25.8k
    }
2382
0
    if (sc->ext.server_cert_type_ctos != OSSL_CERT_TYPE_CTOS_GOOD
2383
0
            || sc->server_cert_type == NULL) {
2384
        /* if we don't send it, reset to TLSEXT_cert_type_x509 */
2385
0
        sc->ext.server_cert_type_ctos = OSSL_CERT_TYPE_CTOS_NONE;
2386
0
        sc->ext.server_cert_type = TLSEXT_cert_type_x509;
2387
0
        return EXT_RETURN_NOT_SENT;
2388
0
    }
2389
2390
0
    if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_server_cert_type)
2391
0
            || !WPACKET_start_sub_packet_u16(pkt)
2392
0
            || !WPACKET_put_bytes_u8(pkt, sc->ext.server_cert_type)
2393
0
            || !WPACKET_close(pkt)) {
2394
0
        SSLfatal(sc, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
2395
0
        return EXT_RETURN_FAIL;
2396
0
    }
2397
0
    return EXT_RETURN_SENT;
2398
0
}
2399
2400
int tls_parse_ctos_server_cert_type(SSL_CONNECTION *sc, PACKET *pkt,
2401
                                    unsigned int context,
2402
                                    X509 *x, size_t chainidx)
2403
478
{
2404
478
    PACKET supported_cert_types;
2405
478
    const unsigned char *data;
2406
478
    size_t len;
2407
2408
    /* Ignore the extension */
2409
478
    if (sc->server_cert_type == NULL) {
2410
478
        sc->ext.server_cert_type_ctos = OSSL_CERT_TYPE_CTOS_NONE;
2411
478
        sc->ext.server_cert_type = TLSEXT_cert_type_x509;
2412
478
        return 1;
2413
478
    }
2414
2415
0
    if (!PACKET_as_length_prefixed_1(pkt, &supported_cert_types)) {
2416
0
        SSLfatal(sc, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
2417
0
        return 0;
2418
0
    }
2419
2420
0
    if ((len = PACKET_remaining(&supported_cert_types)) == 0) {
2421
0
        SSLfatal(sc, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
2422
0
        return 0;
2423
0
    }
2424
0
    if (!PACKET_get_bytes(&supported_cert_types, &data, len)) {
2425
0
        SSLfatal(sc, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
2426
0
        return 0;
2427
0
    }
2428
    /* server_cert_type: server (this) has priority */
2429
0
    sc->ext.server_cert_type_ctos = reconcile_cert_type(sc->server_cert_type, sc->server_cert_type_len,
2430
0
                                                        data, len,
2431
0
                                                        &sc->ext.server_cert_type);
2432
0
    if (sc->ext.server_cert_type_ctos == OSSL_CERT_TYPE_CTOS_GOOD)
2433
0
        return 1;
2434
2435
    /* Did not receive an acceptable cert type */
2436
0
    SSLfatal(sc, SSL_AD_UNSUPPORTED_CERTIFICATE, SSL_R_BAD_EXTENSION);
2437
0
    return 0;
2438
0
}