Coverage Report

Created: 2026-05-24 07:14

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