]> git.ipfire.org Git - thirdparty/openssl.git/blame - ssl/statem/extensions_clnt.c
ssl: modify libssl so that it uses OSSL_TIME
[thirdparty/openssl.git] / ssl / statem / extensions_clnt.c
CommitLineData
6dd083fd 1/*
fecb3aae 2 * Copyright 2016-2022 The OpenSSL Project Authors. All Rights Reserved.
6dd083fd 3 *
2c18d164 4 * Licensed under the Apache License 2.0 (the "License"). You may not use
6dd083fd
MC
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
ab83e314 10#include <openssl/ocsp.h>
706457b7 11#include "../ssl_local.h"
67dc995e 12#include "internal/cryptlib.h"
706457b7 13#include "statem_local.h"
6dd083fd 14
38b051a1 15EXT_RETURN tls_construct_ctos_renegotiate(SSL_CONNECTION *s, WPACKET *pkt,
b186a592 16 unsigned int context, X509 *x,
f63a17d6 17 size_t chainidx)
ab83e314
MC
18{
19 /* Add RI if renegotiating */
20 if (!s->renegotiate)
b186a592 21 return EXT_RETURN_NOT_SENT;
ab83e314
MC
22
23 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_renegotiate)
24 || !WPACKET_start_sub_packet_u16(pkt)
555cbb32
TS
25 || !WPACKET_sub_memcpy_u8(pkt, s->s3.previous_client_finished,
26 s->s3.previous_client_finished_len)
ab83e314 27 || !WPACKET_close(pkt)) {
c48ffbcc 28 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 29 return EXT_RETURN_FAIL;
ab83e314
MC
30 }
31
b186a592 32 return EXT_RETURN_SENT;
ab83e314
MC
33}
34
38b051a1 35EXT_RETURN tls_construct_ctos_server_name(SSL_CONNECTION *s, WPACKET *pkt,
b186a592 36 unsigned int context, X509 *x,
f63a17d6 37 size_t chainidx)
ab83e314 38{
aff8c126 39 if (s->ext.hostname == NULL)
b186a592 40 return EXT_RETURN_NOT_SENT;
ab83e314
MC
41
42 /* Add TLS extension servername to the Client Hello message */
43 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_server_name)
44 /* Sub-packet for server_name extension */
45 || !WPACKET_start_sub_packet_u16(pkt)
46 /* Sub-packet for servername list (always 1 hostname)*/
47 || !WPACKET_start_sub_packet_u16(pkt)
48 || !WPACKET_put_bytes_u8(pkt, TLSEXT_NAMETYPE_host_name)
aff8c126
RS
49 || !WPACKET_sub_memcpy_u16(pkt, s->ext.hostname,
50 strlen(s->ext.hostname))
ab83e314
MC
51 || !WPACKET_close(pkt)
52 || !WPACKET_close(pkt)) {
c48ffbcc 53 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 54 return EXT_RETURN_FAIL;
ab83e314
MC
55 }
56
b186a592 57 return EXT_RETURN_SENT;
ab83e314
MC
58}
59
cf72c757 60/* Push a Max Fragment Len extension into ClientHello */
38b051a1 61EXT_RETURN tls_construct_ctos_maxfragmentlen(SSL_CONNECTION *s, WPACKET *pkt,
cf72c757 62 unsigned int context, X509 *x,
f63a17d6 63 size_t chainidx)
cf72c757
F
64{
65 if (s->ext.max_fragment_len_mode == TLSEXT_max_fragment_length_DISABLED)
66 return EXT_RETURN_NOT_SENT;
67
68 /* Add Max Fragment Length extension if client enabled it. */
69 /*-
70 * 4 bytes for this extension type and extension length
71 * 1 byte for the Max Fragment Length code value.
72 */
73 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_max_fragment_length)
74 /* Sub-packet for Max Fragment Length extension (1 byte) */
75 || !WPACKET_start_sub_packet_u16(pkt)
76 || !WPACKET_put_bytes_u8(pkt, s->ext.max_fragment_len_mode)
77 || !WPACKET_close(pkt)) {
c48ffbcc 78 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
cf72c757
F
79 return EXT_RETURN_FAIL;
80 }
81
82 return EXT_RETURN_SENT;
83}
84
ab83e314 85#ifndef OPENSSL_NO_SRP
38b051a1
TM
86EXT_RETURN tls_construct_ctos_srp(SSL_CONNECTION *s, WPACKET *pkt,
87 unsigned int context,
f63a17d6 88 X509 *x, size_t chainidx)
ab83e314
MC
89{
90 /* Add SRP username if there is one */
91 if (s->srp_ctx.login == NULL)
b186a592 92 return EXT_RETURN_NOT_SENT;
ab83e314
MC
93
94 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_srp)
95 /* Sub-packet for SRP extension */
96 || !WPACKET_start_sub_packet_u16(pkt)
97 || !WPACKET_start_sub_packet_u8(pkt)
98 /* login must not be zero...internal error if so */
99 || !WPACKET_set_flags(pkt, WPACKET_FLAGS_NON_ZERO_LENGTH)
100 || !WPACKET_memcpy(pkt, s->srp_ctx.login,
101 strlen(s->srp_ctx.login))
102 || !WPACKET_close(pkt)
103 || !WPACKET_close(pkt)) {
c48ffbcc 104 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 105 return EXT_RETURN_FAIL;
ab83e314
MC
106 }
107
b186a592 108 return EXT_RETURN_SENT;
ab83e314
MC
109}
110#endif
111
38b051a1 112static int use_ecc(SSL_CONNECTION *s, int min_version, int max_version)
ab83e314 113{
589b6227 114 int i, end, ret = 0;
ab83e314
MC
115 unsigned long alg_k, alg_a;
116 STACK_OF(SSL_CIPHER) *cipher_stack = NULL;
dbc6268f
MC
117 const uint16_t *pgroups = NULL;
118 size_t num_groups, j;
38b051a1 119 SSL *ssl = SSL_CONNECTION_GET_SSL(s);
ab83e314
MC
120
121 /* See if we support any ECC ciphersuites */
122 if (s->version == SSL3_VERSION)
123 return 0;
124
38b051a1 125 cipher_stack = SSL_get1_supported_ciphers(ssl);
1266eefd
MC
126 end = sk_SSL_CIPHER_num(cipher_stack);
127 for (i = 0; i < end; i++) {
ab83e314
MC
128 const SSL_CIPHER *c = sk_SSL_CIPHER_value(cipher_stack, i);
129
130 alg_k = c->algorithm_mkey;
131 alg_a = c->algorithm_auth;
132 if ((alg_k & (SSL_kECDHE | SSL_kECDHEPSK))
1266eefd 133 || (alg_a & SSL_aECDSA)
589b6227
MC
134 || c->min_tls >= TLS1_3_VERSION) {
135 ret = 1;
136 break;
137 }
ab83e314 138 }
589b6227 139 sk_SSL_CIPHER_free(cipher_stack);
dbc6268f
MC
140 if (!ret)
141 return 0;
142
143 /* Check we have at least one EC supported group */
144 tls1_get_supported_groups(s, &pgroups, &num_groups);
145 for (j = 0; j < num_groups; j++) {
146 uint16_t ctmp = pgroups[j];
147
8b1db5d3 148 if (tls_valid_group(s, ctmp, min_version, max_version, 1, NULL)
dbc6268f
MC
149 && tls_group_allowed(s, ctmp, SSL_SECOP_CURVE_SUPPORTED))
150 return 1;
151 }
152
153 return 0;
ab83e314
MC
154}
155
38b051a1 156EXT_RETURN tls_construct_ctos_ec_pt_formats(SSL_CONNECTION *s, WPACKET *pkt,
b186a592 157 unsigned int context, X509 *x,
f63a17d6 158 size_t chainidx)
ab83e314
MC
159{
160 const unsigned char *pformats;
161 size_t num_formats;
dbc6268f 162 int reason, min_version, max_version;
ab83e314 163
dbc6268f
MC
164 reason = ssl_get_min_max_version(s, &min_version, &max_version, NULL);
165 if (reason != 0) {
c48ffbcc 166 SSLfatal(s, SSL_AD_INTERNAL_ERROR, reason);
dbc6268f
MC
167 return EXT_RETURN_FAIL;
168 }
9d2d857f 169 if (!use_ecc(s, min_version, max_version))
b186a592 170 return EXT_RETURN_NOT_SENT;
ab83e314
MC
171
172 /* Add TLS extension ECPointFormats to the ClientHello message */
ab83e314
MC
173 tls1_get_formatlist(s, &pformats, &num_formats);
174
175 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_ec_point_formats)
176 /* Sub-packet for formats extension */
177 || !WPACKET_start_sub_packet_u16(pkt)
178 || !WPACKET_sub_memcpy_u8(pkt, pformats, num_formats)
179 || !WPACKET_close(pkt)) {
c48ffbcc 180 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 181 return EXT_RETURN_FAIL;
ab83e314
MC
182 }
183
b186a592 184 return EXT_RETURN_SENT;
ab83e314
MC
185}
186
38b051a1 187EXT_RETURN tls_construct_ctos_supported_groups(SSL_CONNECTION *s, WPACKET *pkt,
b186a592 188 unsigned int context, X509 *x,
f63a17d6 189 size_t chainidx)
ab83e314 190{
f48d826e 191 const uint16_t *pgroups = NULL;
8b1db5d3 192 size_t num_groups = 0, i, tls13added = 0, added = 0;
9aaecbfc 193 int min_version, max_version, reason;
ab83e314 194
9aaecbfc 195 reason = ssl_get_min_max_version(s, &min_version, &max_version, NULL);
196 if (reason != 0) {
c48ffbcc 197 SSLfatal(s, SSL_AD_INTERNAL_ERROR, reason);
9aaecbfc 198 return EXT_RETURN_FAIL;
199 }
200
8b1db5d3
MC
201 /*
202 * We only support EC groups in TLSv1.2 or below, and in DTLS. Therefore
203 * if we don't have EC support then we don't send this extension.
204 */
205 if (!use_ecc(s, min_version, max_version)
38b051a1 206 && (SSL_CONNECTION_IS_DTLS(s) || max_version < TLS1_3_VERSION))
dbc6268f 207 return EXT_RETURN_NOT_SENT;
dbc6268f 208
ab83e314
MC
209 /*
210 * Add TLS extension supported_groups to the ClientHello message
211 */
f48d826e 212 tls1_get_supported_groups(s, &pgroups, &num_groups);
ab83e314
MC
213
214 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_groups)
215 /* Sub-packet for supported_groups extension */
216 || !WPACKET_start_sub_packet_u16(pkt)
9aaecbfc 217 || !WPACKET_start_sub_packet_u16(pkt)
218 || !WPACKET_set_flags(pkt, WPACKET_FLAGS_NON_ZERO_LENGTH)) {
c48ffbcc 219 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 220 return EXT_RETURN_FAIL;
ab83e314 221 }
9aaecbfc 222 /* Copy group ID if supported */
f48d826e
DSH
223 for (i = 0; i < num_groups; i++) {
224 uint16_t ctmp = pgroups[i];
8b1db5d3 225 int okfortls13;
9e84a42d 226
8b1db5d3 227 if (tls_valid_group(s, ctmp, min_version, max_version, 0, &okfortls13)
dbc6268f 228 && tls_group_allowed(s, ctmp, SSL_SECOP_CURVE_SUPPORTED)) {
0a10825a
BE
229#ifndef OPENSSL_NO_TLS1_3
230 int ctmp13 = ssl_group_id_internal_to_tls13(ctmp);
231
232 if (ctmp13 != 0 && ctmp13 != ctmp
233 && max_version == TLS1_3_VERSION) {
234 if (!WPACKET_put_bytes_u16(pkt, ctmp13)) {
235 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
236 return EXT_RETURN_FAIL;
237 }
238 tls13added++;
239 added++;
240 if (min_version == TLS1_3_VERSION)
241 continue;
242 }
243#endif
9e84a42d 244 if (!WPACKET_put_bytes_u16(pkt, ctmp)) {
c48ffbcc 245 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
9aaecbfc 246 return EXT_RETURN_FAIL;
247 }
8b1db5d3
MC
248 if (okfortls13 && max_version == TLS1_3_VERSION)
249 tls13added++;
250 added++;
ab83e314
MC
251 }
252 }
253 if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) {
9afc6c54 254 if (added == 0)
8b1db5d3
MC
255 SSLfatal_data(s, SSL_AD_INTERNAL_ERROR, SSL_R_NO_SUITABLE_GROUPS,
256 "No groups enabled for max supported SSL/TLS version");
257 else
258 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 259 return EXT_RETURN_FAIL;
9afc6c54
MC
260 }
261
262 if (tls13added == 0 && max_version == TLS1_3_VERSION) {
263 SSLfatal_data(s, SSL_AD_INTERNAL_ERROR, SSL_R_NO_SUITABLE_GROUPS,
264 "No groups enabled for max supported SSL/TLS version");
265 return EXT_RETURN_FAIL;
ab83e314
MC
266 }
267
b186a592 268 return EXT_RETURN_SENT;
ab83e314 269}
ab83e314 270
38b051a1 271EXT_RETURN tls_construct_ctos_session_ticket(SSL_CONNECTION *s, WPACKET *pkt,
b186a592 272 unsigned int context, X509 *x,
f63a17d6 273 size_t chainidx)
ab83e314
MC
274{
275 size_t ticklen;
276
277 if (!tls_use_ticket(s))
b186a592 278 return EXT_RETURN_NOT_SENT;
ab83e314
MC
279
280 if (!s->new_session && s->session != NULL
08191294
MC
281 && s->session->ext.tick != NULL
282 && s->session->ssl_version != TLS1_3_VERSION) {
aff8c126
RS
283 ticklen = s->session->ext.ticklen;
284 } else if (s->session && s->ext.session_ticket != NULL
285 && s->ext.session_ticket->data != NULL) {
286 ticklen = s->ext.session_ticket->length;
287 s->session->ext.tick = OPENSSL_malloc(ticklen);
288 if (s->session->ext.tick == NULL) {
c48ffbcc 289 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 290 return EXT_RETURN_FAIL;
ab83e314 291 }
aff8c126
RS
292 memcpy(s->session->ext.tick,
293 s->ext.session_ticket->data, ticklen);
294 s->session->ext.ticklen = ticklen;
ab83e314
MC
295 } else {
296 ticklen = 0;
297 }
298
aff8c126
RS
299 if (ticklen == 0 && s->ext.session_ticket != NULL &&
300 s->ext.session_ticket->data == NULL)
b186a592 301 return EXT_RETURN_NOT_SENT;
ab83e314
MC
302
303 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_session_ticket)
aff8c126 304 || !WPACKET_sub_memcpy_u16(pkt, s->session->ext.tick, ticklen)) {
c48ffbcc 305 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 306 return EXT_RETURN_FAIL;
ab83e314
MC
307 }
308
b186a592 309 return EXT_RETURN_SENT;
ab83e314
MC
310}
311
38b051a1 312EXT_RETURN tls_construct_ctos_sig_algs(SSL_CONNECTION *s, WPACKET *pkt,
b186a592 313 unsigned int context, X509 *x,
f63a17d6 314 size_t chainidx)
ab83e314
MC
315{
316 size_t salglen;
98c792d1 317 const uint16_t *salg;
ab83e314
MC
318
319 if (!SSL_CLIENT_USE_SIGALGS(s))
b186a592 320 return EXT_RETURN_NOT_SENT;
ab83e314 321
a9669ddc 322 salglen = tls12_get_psigalgs(s, 1, &salg);
ab83e314
MC
323 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_signature_algorithms)
324 /* Sub-packet for sig-algs extension */
325 || !WPACKET_start_sub_packet_u16(pkt)
326 /* Sub-packet for the actual list */
327 || !WPACKET_start_sub_packet_u16(pkt)
328 || !tls12_copy_sigalgs(s, pkt, salg, salglen)
329 || !WPACKET_close(pkt)
330 || !WPACKET_close(pkt)) {
c48ffbcc 331 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 332 return EXT_RETURN_FAIL;
ab83e314
MC
333 }
334
b186a592 335 return EXT_RETURN_SENT;
ab83e314
MC
336}
337
338#ifndef OPENSSL_NO_OCSP
38b051a1 339EXT_RETURN tls_construct_ctos_status_request(SSL_CONNECTION *s, WPACKET *pkt,
b186a592 340 unsigned int context, X509 *x,
f63a17d6 341 size_t chainidx)
ab83e314
MC
342{
343 int i;
344
e96e0f8e
MC
345 /* This extension isn't defined for client Certificates */
346 if (x != NULL)
b186a592 347 return EXT_RETURN_NOT_SENT;
e96e0f8e 348
aff8c126 349 if (s->ext.status_type != TLSEXT_STATUSTYPE_ocsp)
b186a592 350 return EXT_RETURN_NOT_SENT;
ab83e314
MC
351
352 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_status_request)
353 /* Sub-packet for status request extension */
354 || !WPACKET_start_sub_packet_u16(pkt)
355 || !WPACKET_put_bytes_u8(pkt, TLSEXT_STATUSTYPE_ocsp)
356 /* Sub-packet for the ids */
357 || !WPACKET_start_sub_packet_u16(pkt)) {
c48ffbcc 358 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 359 return EXT_RETURN_FAIL;
ab83e314 360 }
aff8c126 361 for (i = 0; i < sk_OCSP_RESPID_num(s->ext.ocsp.ids); i++) {
ab83e314 362 unsigned char *idbytes;
aff8c126 363 OCSP_RESPID *id = sk_OCSP_RESPID_value(s->ext.ocsp.ids, i);
1266eefd 364 int idlen = i2d_OCSP_RESPID(id, NULL);
ab83e314 365
ab83e314
MC
366 if (idlen <= 0
367 /* Sub-packet for an individual id */
368 || !WPACKET_sub_allocate_bytes_u16(pkt, idlen, &idbytes)
369 || i2d_OCSP_RESPID(id, &idbytes) != idlen) {
c48ffbcc 370 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 371 return EXT_RETURN_FAIL;
ab83e314
MC
372 }
373 }
374 if (!WPACKET_close(pkt)
375 || !WPACKET_start_sub_packet_u16(pkt)) {
c48ffbcc 376 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 377 return EXT_RETURN_FAIL;
ab83e314 378 }
aff8c126 379 if (s->ext.ocsp.exts) {
ab83e314 380 unsigned char *extbytes;
aff8c126 381 int extlen = i2d_X509_EXTENSIONS(s->ext.ocsp.exts, NULL);
ab83e314
MC
382
383 if (extlen < 0) {
c48ffbcc 384 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 385 return EXT_RETURN_FAIL;
ab83e314
MC
386 }
387 if (!WPACKET_allocate_bytes(pkt, extlen, &extbytes)
aff8c126 388 || i2d_X509_EXTENSIONS(s->ext.ocsp.exts, &extbytes)
ab83e314 389 != extlen) {
c48ffbcc 390 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 391 return EXT_RETURN_FAIL;
ab83e314
MC
392 }
393 }
394 if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) {
c48ffbcc 395 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 396 return EXT_RETURN_FAIL;
ab83e314
MC
397 }
398
b186a592 399 return EXT_RETURN_SENT;
ab83e314
MC
400}
401#endif
402
403#ifndef OPENSSL_NO_NEXTPROTONEG
38b051a1
TM
404EXT_RETURN tls_construct_ctos_npn(SSL_CONNECTION *s, WPACKET *pkt,
405 unsigned int context,
f63a17d6 406 X509 *x, size_t chainidx)
ab83e314 407{
38b051a1
TM
408 if (SSL_CONNECTION_GET_CTX(s)->ext.npn_select_cb == NULL
409 || !SSL_IS_FIRST_HANDSHAKE(s))
b186a592 410 return EXT_RETURN_NOT_SENT;
ab83e314
MC
411
412 /*
413 * The client advertises an empty extension to indicate its support
414 * for Next Protocol Negotiation
415 */
416 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_next_proto_neg)
417 || !WPACKET_put_bytes_u16(pkt, 0)) {
c48ffbcc 418 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 419 return EXT_RETURN_FAIL;
ab83e314
MC
420 }
421
b186a592 422 return EXT_RETURN_SENT;
ab83e314
MC
423}
424#endif
425
38b051a1
TM
426EXT_RETURN tls_construct_ctos_alpn(SSL_CONNECTION *s, WPACKET *pkt,
427 unsigned int context,
f63a17d6 428 X509 *x, size_t chainidx)
ab83e314 429{
555cbb32 430 s->s3.alpn_sent = 0;
ab83e314 431
c7f47786 432 if (s->ext.alpn == NULL || !SSL_IS_FIRST_HANDSHAKE(s))
b186a592 433 return EXT_RETURN_NOT_SENT;
ab83e314
MC
434
435 if (!WPACKET_put_bytes_u16(pkt,
436 TLSEXT_TYPE_application_layer_protocol_negotiation)
437 /* Sub-packet ALPN extension */
438 || !WPACKET_start_sub_packet_u16(pkt)
aff8c126 439 || !WPACKET_sub_memcpy_u16(pkt, s->ext.alpn, s->ext.alpn_len)
ab83e314 440 || !WPACKET_close(pkt)) {
c48ffbcc 441 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 442 return EXT_RETURN_FAIL;
ab83e314 443 }
555cbb32 444 s->s3.alpn_sent = 1;
ab83e314 445
b186a592 446 return EXT_RETURN_SENT;
ab83e314
MC
447}
448
449
450#ifndef OPENSSL_NO_SRTP
38b051a1 451EXT_RETURN tls_construct_ctos_use_srtp(SSL_CONNECTION *s, WPACKET *pkt,
b186a592 452 unsigned int context, X509 *x,
f63a17d6 453 size_t chainidx)
ab83e314 454{
38b051a1
TM
455 SSL *ssl = SSL_CONNECTION_GET_SSL(s);
456 STACK_OF(SRTP_PROTECTION_PROFILE) *clnt = SSL_get_srtp_profiles(ssl);
1266eefd 457 int i, end;
ab83e314
MC
458
459 if (clnt == NULL)
b186a592 460 return EXT_RETURN_NOT_SENT;
ab83e314
MC
461
462 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_use_srtp)
463 /* Sub-packet for SRTP extension */
464 || !WPACKET_start_sub_packet_u16(pkt)
465 /* Sub-packet for the protection profile list */
466 || !WPACKET_start_sub_packet_u16(pkt)) {
c48ffbcc 467 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 468 return EXT_RETURN_FAIL;
ab83e314 469 }
1266eefd
MC
470
471 end = sk_SRTP_PROTECTION_PROFILE_num(clnt);
472 for (i = 0; i < end; i++) {
473 const SRTP_PROTECTION_PROFILE *prof =
474 sk_SRTP_PROTECTION_PROFILE_value(clnt, i);
475
ab83e314 476 if (prof == NULL || !WPACKET_put_bytes_u16(pkt, prof->id)) {
c48ffbcc 477 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 478 return EXT_RETURN_FAIL;
ab83e314
MC
479 }
480 }
481 if (!WPACKET_close(pkt)
482 /* Add an empty use_mki value */
483 || !WPACKET_put_bytes_u8(pkt, 0)
484 || !WPACKET_close(pkt)) {
c48ffbcc 485 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 486 return EXT_RETURN_FAIL;
ab83e314
MC
487 }
488
b186a592 489 return EXT_RETURN_SENT;
ab83e314
MC
490}
491#endif
492
38b051a1
TM
493EXT_RETURN tls_construct_ctos_etm(SSL_CONNECTION *s, WPACKET *pkt,
494 unsigned int context,
f63a17d6 495 X509 *x, size_t chainidx)
ab83e314
MC
496{
497 if (s->options & SSL_OP_NO_ENCRYPT_THEN_MAC)
b186a592 498 return EXT_RETURN_NOT_SENT;
ab83e314
MC
499
500 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_encrypt_then_mac)
501 || !WPACKET_put_bytes_u16(pkt, 0)) {
c48ffbcc 502 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 503 return EXT_RETURN_FAIL;
ab83e314
MC
504 }
505
b186a592 506 return EXT_RETURN_SENT;
ab83e314
MC
507}
508
509#ifndef OPENSSL_NO_CT
38b051a1
TM
510EXT_RETURN tls_construct_ctos_sct(SSL_CONNECTION *s, WPACKET *pkt,
511 unsigned int context,
f63a17d6 512 X509 *x, size_t chainidx)
ab83e314
MC
513{
514 if (s->ct_validation_callback == NULL)
b186a592 515 return EXT_RETURN_NOT_SENT;
ab83e314 516
e96e0f8e
MC
517 /* Not defined for client Certificates */
518 if (x != NULL)
b186a592 519 return EXT_RETURN_NOT_SENT;
e96e0f8e 520
ab83e314
MC
521 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_signed_certificate_timestamp)
522 || !WPACKET_put_bytes_u16(pkt, 0)) {
c48ffbcc 523 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 524 return EXT_RETURN_FAIL;
ab83e314
MC
525 }
526
b186a592 527 return EXT_RETURN_SENT;
ab83e314
MC
528}
529#endif
530
38b051a1
TM
531EXT_RETURN tls_construct_ctos_ems(SSL_CONNECTION *s, WPACKET *pkt,
532 unsigned int context,
f63a17d6 533 X509 *x, size_t chainidx)
ab83e314 534{
088dfa13
TS
535 if (s->options & SSL_OP_NO_EXTENDED_MASTER_SECRET)
536 return EXT_RETURN_NOT_SENT;
537
ab83e314
MC
538 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_extended_master_secret)
539 || !WPACKET_put_bytes_u16(pkt, 0)) {
c48ffbcc 540 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 541 return EXT_RETURN_FAIL;
ab83e314
MC
542 }
543
b186a592 544 return EXT_RETURN_SENT;
ab83e314
MC
545}
546
38b051a1 547EXT_RETURN tls_construct_ctos_supported_versions(SSL_CONNECTION *s, WPACKET *pkt,
b186a592 548 unsigned int context, X509 *x,
f63a17d6 549 size_t chainidx)
ab83e314
MC
550{
551 int currv, min_version, max_version, reason;
552
b5b993b2 553 reason = ssl_get_min_max_version(s, &min_version, &max_version, NULL);
88050dd1 554 if (reason != 0) {
c48ffbcc 555 SSLfatal(s, SSL_AD_INTERNAL_ERROR, reason);
88050dd1
MC
556 return EXT_RETURN_FAIL;
557 }
558
559 /*
560 * Don't include this if we can't negotiate TLSv1.3. We can do a straight
561 * comparison here because we will never be called in DTLS.
562 */
563 if (max_version < TLS1_3_VERSION)
564 return EXT_RETURN_NOT_SENT;
565
ab83e314
MC
566 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_versions)
567 || !WPACKET_start_sub_packet_u16(pkt)
568 || !WPACKET_start_sub_packet_u8(pkt)) {
c48ffbcc 569 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 570 return EXT_RETURN_FAIL;
ab83e314
MC
571 }
572
ab83e314 573 for (currv = max_version; currv >= min_version; currv--) {
35e742ec 574 if (!WPACKET_put_bytes_u16(pkt, currv)) {
c48ffbcc 575 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 576 return EXT_RETURN_FAIL;
ab83e314
MC
577 }
578 }
579 if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) {
c48ffbcc 580 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 581 return EXT_RETURN_FAIL;
ab83e314
MC
582 }
583
b186a592 584 return EXT_RETURN_SENT;
ab83e314
MC
585}
586
b2f7e8c0 587/*
e3c0d76b 588 * Construct a psk_kex_modes extension.
b2f7e8c0 589 */
38b051a1 590EXT_RETURN tls_construct_ctos_psk_kex_modes(SSL_CONNECTION *s, WPACKET *pkt,
b186a592 591 unsigned int context, X509 *x,
f63a17d6 592 size_t chainidx)
b2f7e8c0
MC
593{
594#ifndef OPENSSL_NO_TLS1_3
e3c0d76b
MC
595 int nodhe = s->options & SSL_OP_ALLOW_NO_DHE_KEX;
596
b2f7e8c0
MC
597 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_psk_kex_modes)
598 || !WPACKET_start_sub_packet_u16(pkt)
599 || !WPACKET_start_sub_packet_u8(pkt)
600 || !WPACKET_put_bytes_u8(pkt, TLSEXT_KEX_MODE_KE_DHE)
e3c0d76b 601 || (nodhe && !WPACKET_put_bytes_u8(pkt, TLSEXT_KEX_MODE_KE))
b2f7e8c0
MC
602 || !WPACKET_close(pkt)
603 || !WPACKET_close(pkt)) {
c48ffbcc 604 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 605 return EXT_RETURN_FAIL;
b2f7e8c0 606 }
b3ad72ce 607
e3c0d76b
MC
608 s->ext.psk_kex_mode = TLSEXT_KEX_MODE_FLAG_KE_DHE;
609 if (nodhe)
610 s->ext.psk_kex_mode |= TLSEXT_KEX_MODE_FLAG_KE;
b2f7e8c0
MC
611#endif
612
b186a592 613 return EXT_RETURN_SENT;
b2f7e8c0
MC
614}
615
3847d426 616#ifndef OPENSSL_NO_TLS1_3
38b051a1 617static int add_key_share(SSL_CONNECTION *s, WPACKET *pkt, unsigned int curve_id)
3847d426 618{
7b1ec1cf
MC
619 unsigned char *encoded_point = NULL;
620 EVP_PKEY *key_share_key = NULL;
3847d426
MC
621 size_t encodedlen;
622
555cbb32 623 if (s->s3.tmp.pkey != NULL) {
fc7129dc 624 if (!ossl_assert(s->hello_retry_request == SSL_HRR_PENDING)) {
c48ffbcc 625 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
d8028b20 626 return 0;
7b1ec1cf
MC
627 }
628 /*
629 * Could happen if we got an HRR that wasn't requesting a new key_share
630 */
555cbb32 631 key_share_key = s->s3.tmp.pkey;
7b1ec1cf 632 } else {
f63a17d6 633 key_share_key = ssl_generate_pkey_group(s, curve_id);
7b1ec1cf 634 if (key_share_key == NULL) {
f63a17d6 635 /* SSLfatal() already called */
d8028b20 636 return 0;
7b1ec1cf 637 }
3847d426
MC
638 }
639
640 /* Encode the public key. */
5ac8fb58
MC
641 encodedlen = EVP_PKEY_get1_encoded_public_key(key_share_key,
642 &encoded_point);
3847d426 643 if (encodedlen == 0) {
c48ffbcc 644 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_EC_LIB);
7b1ec1cf 645 goto err;
3847d426
MC
646 }
647
648 /* Create KeyShareEntry */
0a10825a 649 if (!WPACKET_put_bytes_u16(pkt, ssl_group_id_internal_to_tls13(curve_id))
2248dbeb 650 || !WPACKET_sub_memcpy_u16(pkt, encoded_point, encodedlen)) {
c48ffbcc 651 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
7b1ec1cf 652 goto err;
3847d426
MC
653 }
654
655 /*
407820c0 656 * When changing to send more than one key_share we're
3847d426
MC
657 * going to need to be able to save more than one EVP_PKEY. For now
658 * we reuse the existing tmp.pkey
659 */
555cbb32
TS
660 s->s3.tmp.pkey = key_share_key;
661 s->s3.group_id = curve_id;
2248dbeb 662 OPENSSL_free(encoded_point);
3847d426 663
d8028b20 664 return 1;
7b1ec1cf 665 err:
555cbb32 666 if (s->s3.tmp.pkey == NULL)
7b1ec1cf
MC
667 EVP_PKEY_free(key_share_key);
668 OPENSSL_free(encoded_point);
d8028b20 669 return 0;
3847d426
MC
670}
671#endif
672
38b051a1 673EXT_RETURN tls_construct_ctos_key_share(SSL_CONNECTION *s, WPACKET *pkt,
b186a592 674 unsigned int context, X509 *x,
f63a17d6 675 size_t chainidx)
ab83e314 676{
3cf96e88 677#ifndef OPENSSL_NO_TLS1_3
f48d826e
DSH
678 size_t i, num_groups = 0;
679 const uint16_t *pgroups = NULL;
9e84a42d 680 uint16_t curve_id = 0;
ab83e314
MC
681
682 /* key_share extension */
683 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_key_share)
684 /* Extension data sub-packet */
685 || !WPACKET_start_sub_packet_u16(pkt)
686 /* KeyShare list sub-packet */
687 || !WPACKET_start_sub_packet_u16(pkt)) {
c48ffbcc 688 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 689 return EXT_RETURN_FAIL;
ab83e314
MC
690 }
691
f48d826e 692 tls1_get_supported_groups(s, &pgroups, &num_groups);
ab83e314
MC
693
694 /*
407820c0
P
695 * Make the number of key_shares sent configurable. For
696 * now, we just send one
ab83e314 697 */
555cbb32
TS
698 if (s->s3.group_id != 0) {
699 curve_id = s->s3.group_id;
3847d426 700 } else {
f48d826e 701 for (i = 0; i < num_groups; i++) {
0a10825a
BE
702 if (ssl_group_id_internal_to_tls13(pgroups[i]) == 0)
703 continue;
ab83e314 704
dbc6268f 705 if (!tls_group_allowed(s, pgroups[i], SSL_SECOP_CURVE_SUPPORTED))
3847d426 706 continue;
ab83e314 707
f48d826e 708 curve_id = pgroups[i];
3847d426 709 break;
ab83e314 710 }
3847d426 711 }
ab83e314 712
3847d426 713 if (curve_id == 0) {
c48ffbcc 714 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_NO_SUITABLE_KEY_SHARE);
b186a592 715 return EXT_RETURN_FAIL;
ab83e314
MC
716 }
717
f63a17d6
MC
718 if (!add_key_share(s, pkt, curve_id)) {
719 /* SSLfatal() already called */
b186a592 720 return EXT_RETURN_FAIL;
f63a17d6 721 }
3847d426 722
ab83e314 723 if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) {
c48ffbcc 724 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 725 return EXT_RETURN_FAIL;
ab83e314 726 }
b186a592 727 return EXT_RETURN_SENT;
aa2ed504
TS
728#else
729 return EXT_RETURN_NOT_SENT;
730#endif
ab83e314
MC
731}
732
38b051a1
TM
733EXT_RETURN tls_construct_ctos_cookie(SSL_CONNECTION *s, WPACKET *pkt,
734 unsigned int context,
f63a17d6 735 X509 *x, size_t chainidx)
cfef5027 736{
b186a592 737 EXT_RETURN ret = EXT_RETURN_FAIL;
cfef5027
MC
738
739 /* Should only be set if we've had an HRR */
740 if (s->ext.tls13_cookie_len == 0)
b186a592 741 return EXT_RETURN_NOT_SENT;
cfef5027
MC
742
743 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_cookie)
744 /* Extension data sub-packet */
745 || !WPACKET_start_sub_packet_u16(pkt)
746 || !WPACKET_sub_memcpy_u16(pkt, s->ext.tls13_cookie,
747 s->ext.tls13_cookie_len)
748 || !WPACKET_close(pkt)) {
c48ffbcc 749 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
cfef5027
MC
750 goto end;
751 }
752
b186a592 753 ret = EXT_RETURN_SENT;
cfef5027
MC
754 end:
755 OPENSSL_free(s->ext.tls13_cookie);
febb0afa 756 s->ext.tls13_cookie = NULL;
cfef5027
MC
757 s->ext.tls13_cookie_len = 0;
758
759 return ret;
760}
761
38b051a1 762EXT_RETURN tls_construct_ctos_early_data(SSL_CONNECTION *s, WPACKET *pkt,
b186a592 763 unsigned int context, X509 *x,
f63a17d6 764 size_t chainidx)
38df5a45 765{
696de86f
PW
766#ifndef OPENSSL_NO_PSK
767 char identity[PSK_MAX_IDENTITY_LEN + 1];
768#endif /* OPENSSL_NO_PSK */
ccb76685 769 const unsigned char *id = NULL;
fff202e5 770 size_t idlen = 0;
add8d0e9 771 SSL_SESSION *psksess = NULL;
ffc5bbaa 772 SSL_SESSION *edsess = NULL;
add8d0e9 773 const EVP_MD *handmd = NULL;
38b051a1 774 SSL *ssl = SSL_CONNECTION_GET_SSL(s);
add8d0e9 775
fc7129dc 776 if (s->hello_retry_request == SSL_HRR_PENDING)
add8d0e9
MC
777 handmd = ssl_handshake_md(s);
778
779 if (s->psk_use_session_cb != NULL
38b051a1 780 && (!s->psk_use_session_cb(ssl, handmd, &id, &idlen, &psksess)
ffc5bbaa
MC
781 || (psksess != NULL
782 && psksess->ssl_version != TLS1_3_VERSION))) {
783 SSL_SESSION_free(psksess);
c48ffbcc 784 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_BAD_PSK);
add8d0e9
MC
785 return EXT_RETURN_FAIL;
786 }
787
c2b290c3 788#ifndef OPENSSL_NO_PSK
f3d40db1
MC
789 if (psksess == NULL && s->psk_client_callback != NULL) {
790 unsigned char psk[PSK_MAX_PSK_LEN];
791 size_t psklen = 0;
792
793 memset(identity, 0, sizeof(identity));
38b051a1
TM
794 psklen = s->psk_client_callback(ssl, NULL,
795 identity, sizeof(identity) - 1,
f3d40db1
MC
796 psk, sizeof(psk));
797
798 if (psklen > PSK_MAX_PSK_LEN) {
c48ffbcc 799 SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, ERR_R_INTERNAL_ERROR);
f3d40db1
MC
800 return EXT_RETURN_FAIL;
801 } else if (psklen > 0) {
802 const unsigned char tls13_aes128gcmsha256_id[] = { 0x13, 0x01 };
803 const SSL_CIPHER *cipher;
804
805 idlen = strlen(identity);
806 if (idlen > PSK_MAX_IDENTITY_LEN) {
c48ffbcc 807 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
f3d40db1
MC
808 return EXT_RETURN_FAIL;
809 }
810 id = (unsigned char *)identity;
811
812 /*
813 * We found a PSK using an old style callback. We don't know
814 * the digest so we default to SHA256 as per the TLSv1.3 spec
815 */
38b051a1 816 cipher = SSL_CIPHER_find(ssl, tls13_aes128gcmsha256_id);
f3d40db1 817 if (cipher == NULL) {
c48ffbcc 818 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
f3d40db1
MC
819 return EXT_RETURN_FAIL;
820 }
821
822 psksess = SSL_SESSION_new();
823 if (psksess == NULL
824 || !SSL_SESSION_set1_master_key(psksess, psk, psklen)
825 || !SSL_SESSION_set_cipher(psksess, cipher)
826 || !SSL_SESSION_set_protocol_version(psksess, TLS1_3_VERSION)) {
c48ffbcc 827 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
f3d40db1
MC
828 OPENSSL_cleanse(psk, psklen);
829 return EXT_RETURN_FAIL;
830 }
831 OPENSSL_cleanse(psk, psklen);
832 }
833 }
c2b290c3 834#endif /* OPENSSL_NO_PSK */
f3d40db1 835
add8d0e9
MC
836 SSL_SESSION_free(s->psksession);
837 s->psksession = psksess;
838 if (psksess != NULL) {
839 OPENSSL_free(s->psksession_id);
840 s->psksession_id = OPENSSL_memdup(id, idlen);
841 if (s->psksession_id == NULL) {
39a14059 842 s->psksession_id_len = 0;
c48ffbcc 843 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
add8d0e9
MC
844 return EXT_RETURN_FAIL;
845 }
846 s->psksession_id_len = idlen;
847 }
848
38df5a45 849 if (s->early_data_state != SSL_EARLY_DATA_CONNECTING
add8d0e9
MC
850 || (s->session->ext.max_early_data == 0
851 && (psksess == NULL || psksess->ext.max_early_data == 0))) {
38df5a45 852 s->max_early_data = 0;
b186a592 853 return EXT_RETURN_NOT_SENT;
38df5a45 854 }
ffc5bbaa
MC
855 edsess = s->session->ext.max_early_data != 0 ? s->session : psksess;
856 s->max_early_data = edsess->ext.max_early_data;
857
bfab12bb
MC
858 if (edsess->ext.hostname != NULL) {
859 if (s->ext.hostname == NULL
860 || (s->ext.hostname != NULL
861 && strcmp(s->ext.hostname, edsess->ext.hostname) != 0)) {
f63a17d6 862 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
f63a17d6 863 SSL_R_INCONSISTENT_EARLY_DATA_SNI);
bfab12bb
MC
864 return EXT_RETURN_FAIL;
865 }
ffc5bbaa
MC
866 }
867
868 if ((s->ext.alpn == NULL && edsess->ext.alpn_selected != NULL)) {
c48ffbcc 869 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_INCONSISTENT_EARLY_DATA_ALPN);
ffc5bbaa
MC
870 return EXT_RETURN_FAIL;
871 }
872
873 /*
874 * Verify that we are offering an ALPN protocol consistent with the early
875 * data.
876 */
877 if (edsess->ext.alpn_selected != NULL) {
878 PACKET prots, alpnpkt;
879 int found = 0;
880
881 if (!PACKET_buf_init(&prots, s->ext.alpn, s->ext.alpn_len)) {
c48ffbcc 882 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
ffc5bbaa
MC
883 return EXT_RETURN_FAIL;
884 }
885 while (PACKET_get_length_prefixed_1(&prots, &alpnpkt)) {
886 if (PACKET_equal(&alpnpkt, edsess->ext.alpn_selected,
887 edsess->ext.alpn_selected_len)) {
888 found = 1;
889 break;
890 }
891 }
892 if (!found) {
f63a17d6 893 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
f63a17d6 894 SSL_R_INCONSISTENT_EARLY_DATA_ALPN);
ffc5bbaa
MC
895 return EXT_RETURN_FAIL;
896 }
897 }
38df5a45
MC
898
899 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_early_data)
900 || !WPACKET_start_sub_packet_u16(pkt)
901 || !WPACKET_close(pkt)) {
c48ffbcc 902 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 903 return EXT_RETURN_FAIL;
38df5a45
MC
904 }
905
906 /*
907 * We set this to rejected here. Later, if the server acknowledges the
908 * extension, we set it to accepted.
909 */
910 s->ext.early_data = SSL_EARLY_DATA_REJECTED;
4be3a7c7 911 s->ext.early_data_ok = 1;
38df5a45 912
b186a592 913 return EXT_RETURN_SENT;
38df5a45
MC
914}
915
1266eefd
MC
916#define F5_WORKAROUND_MIN_MSG_LEN 0xff
917#define F5_WORKAROUND_MAX_MSG_LEN 0x200
918
d702ad12
MC
919/*
920 * PSK pre binder overhead =
921 * 2 bytes for TLSEXT_TYPE_psk
922 * 2 bytes for extension length
923 * 2 bytes for identities list length
924 * 2 bytes for identity length
925 * 4 bytes for obfuscated_ticket_age
926 * 2 bytes for binder list length
927 * 1 byte for binder length
928 * The above excludes the number of bytes for the identity itself and the
929 * subsequent binder bytes
930 */
931#define PSK_PRE_BINDER_OVERHEAD (2 + 2 + 2 + 2 + 4 + 2 + 1)
932
38b051a1 933EXT_RETURN tls_construct_ctos_padding(SSL_CONNECTION *s, WPACKET *pkt,
b186a592 934 unsigned int context, X509 *x,
f63a17d6 935 size_t chainidx)
ab83e314
MC
936{
937 unsigned char *padbytes;
938 size_t hlen;
939
940 if ((s->options & SSL_OP_TLSEXT_PADDING) == 0)
b186a592 941 return EXT_RETURN_NOT_SENT;
ab83e314
MC
942
943 /*
d702ad12
MC
944 * Add padding to workaround bugs in F5 terminators. See RFC7685.
945 * This code calculates the length of all extensions added so far but
946 * excludes the PSK extension (because that MUST be written last). Therefore
947 * this extension MUST always appear second to last.
ab83e314
MC
948 */
949 if (!WPACKET_get_total_written(pkt, &hlen)) {
c48ffbcc 950 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b186a592 951 return EXT_RETURN_FAIL;
ab83e314
MC
952 }
953
d702ad12
MC
954 /*
955 * If we're going to send a PSK then that will be written out after this
956 * extension, so we need to calculate how long it is going to be.
957 */
958 if (s->session->ssl_version == TLS1_3_VERSION
959 && s->session->ext.ticklen != 0
960 && s->session->cipher != NULL) {
38b051a1
TM
961 const EVP_MD *md = ssl_md(SSL_CONNECTION_GET_CTX(s),
962 s->session->cipher->algorithm2);
d702ad12
MC
963
964 if (md != NULL) {
965 /*
966 * Add the fixed PSK overhead, the identity length and the binder
967 * length.
968 */
969 hlen += PSK_PRE_BINDER_OVERHEAD + s->session->ext.ticklen
ed576acd 970 + EVP_MD_get_size(md);
d702ad12
MC
971 }
972 }
973
1266eefd 974 if (hlen > F5_WORKAROUND_MIN_MSG_LEN && hlen < F5_WORKAROUND_MAX_MSG_LEN) {
1ee4b98e 975 /* Calculate the amount of padding we need to add */
1266eefd
MC
976 hlen = F5_WORKAROUND_MAX_MSG_LEN - hlen;
977
978 /*
979 * Take off the size of extension header itself (2 bytes for type and
10ed1b72
TS
980 * 2 bytes for length bytes), but ensure that the extension is at least
981 * 1 byte long so as not to have an empty extension last (WebSphere 7.x,
982 * 8.x are intolerant of that condition)
1266eefd 983 */
3d85c7f4 984 if (hlen > 4)
ab83e314
MC
985 hlen -= 4;
986 else
10ed1b72 987 hlen = 1;
ab83e314
MC
988
989 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_padding)
990 || !WPACKET_sub_allocate_bytes_u16(pkt, hlen, &padbytes)) {
c48ffbcc 991 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
eb5fd03b 992 return EXT_RETURN_FAIL;
ab83e314
MC
993 }
994 memset(padbytes, 0, hlen);
995 }
996
b186a592 997 return EXT_RETURN_SENT;
ab83e314
MC
998}
999
ec15acb6
MC
1000/*
1001 * Construct the pre_shared_key extension
1002 */
38b051a1
TM
1003EXT_RETURN tls_construct_ctos_psk(SSL_CONNECTION *s, WPACKET *pkt,
1004 unsigned int context,
f63a17d6 1005 X509 *x, size_t chainidx)
ec15acb6
MC
1006{
1007#ifndef OPENSSL_NO_TLS1_3
e8a557dc 1008 uint32_t agesec, agems = 0;
add8d0e9 1009 size_t reshashsize = 0, pskhashsize = 0, binderoffset, msglen;
9368f865 1010 unsigned char *resbinder = NULL, *pskbinder = NULL, *msgstart = NULL;
15b1688a 1011 const EVP_MD *handmd = NULL, *mdres = NULL, *mdpsk = NULL;
9368f865 1012 int dores = 0;
38b051a1 1013 SSL_CTX *sctx = SSL_CONNECTION_GET_CTX(s);
f0131dc0 1014 OSSL_TIME t;
ec15acb6 1015
c96ce52c 1016 s->ext.tick_identity = 0;
ec15acb6 1017
d702ad12
MC
1018 /*
1019 * Note: At this stage of the code we only support adding a single
1020 * resumption PSK. If we add support for multiple PSKs then the length
1021 * calculations in the padding extension will need to be adjusted.
1022 */
1023
ec15acb6 1024 /*
08191294
MC
1025 * If this is an incompatible or new session then we have nothing to resume
1026 * so don't add this extension.
ec15acb6 1027 */
08191294 1028 if (s->session->ssl_version != TLS1_3_VERSION
add8d0e9 1029 || (s->session->ext.ticklen == 0 && s->psksession == NULL))
b186a592 1030 return EXT_RETURN_NOT_SENT;
ec15acb6 1031
fc7129dc 1032 if (s->hello_retry_request == SSL_HRR_PENDING)
9368f865
MC
1033 handmd = ssl_handshake_md(s);
1034
9368f865 1035 if (s->session->ext.ticklen != 0) {
72257204 1036 /* Get the digest associated with the ciphersuite in the session */
9368f865 1037 if (s->session->cipher == NULL) {
c48ffbcc 1038 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
635c8f77 1039 return EXT_RETURN_FAIL;
9368f865 1040 }
38b051a1 1041 mdres = ssl_md(sctx, s->session->cipher->algorithm2);
9368f865 1042 if (mdres == NULL) {
72257204
MC
1043 /*
1044 * Don't recognize this cipher so we can't use the session.
1045 * Ignore it
1046 */
9368f865
MC
1047 goto dopsksess;
1048 }
1049
fc7129dc 1050 if (s->hello_retry_request == SSL_HRR_PENDING && mdres != handmd) {
9368f865 1051 /*
72257204
MC
1052 * Selected ciphersuite hash does not match the hash for the session
1053 * so we can't use it.
9368f865
MC
1054 */
1055 goto dopsksess;
1056 }
1f5b44e9 1057
cf3e221b 1058 /*
9368f865 1059 * Technically the C standard just says time() returns a time_t and says
72257204
MC
1060 * nothing about the encoding of that type. In practice most
1061 * implementations follow POSIX which holds it as an integral type in
1062 * seconds since epoch. We've already made the assumption that we can do
1063 * this in multiple places in the code, so portability shouldn't be an
1064 * issue.
cf3e221b 1065 */
f0131dc0
P
1066 t = ossl_time_subtract(ossl_time_now(), s->session->time);
1067 agesec = (uint32_t)ossl_time2seconds(t);
7e70213f
MC
1068 /*
1069 * We calculate the age in seconds but the server may work in ms. Due to
1070 * rounding errors we could overestimate the age by up to 1s. It is
1071 * better to underestimate it. Otherwise, if the RTT is very short, when
1072 * the server calculates the age reported by the client it could be
1073 * bigger than the age calculated on the server - which should never
1074 * happen.
1075 */
1076 if (agesec > 0)
1077 agesec--;
cf3e221b 1078
9368f865
MC
1079 if (s->session->ext.tick_lifetime_hint < agesec) {
1080 /* Ticket is too old. Ignore it. */
1081 goto dopsksess;
1082 }
ec15acb6 1083
9368f865
MC
1084 /*
1085 * Calculate age in ms. We're just doing it to nearest second. Should be
1086 * good enough.
1087 */
1088 agems = agesec * (uint32_t)1000;
fc24f0bf 1089
9368f865
MC
1090 if (agesec != 0 && agems / (uint32_t)1000 != agesec) {
1091 /*
72257204
MC
1092 * Overflow. Shouldn't happen unless this is a *really* old session.
1093 * If so we just ignore it.
9368f865
MC
1094 */
1095 goto dopsksess;
1096 }
ec15acb6 1097
ec15acb6 1098 /*
72257204
MC
1099 * Obfuscate the age. Overflow here is fine, this addition is supposed
1100 * to be mod 2^32.
ec15acb6 1101 */
9368f865
MC
1102 agems += s->session->ext.tick_age_add;
1103
ed576acd 1104 reshashsize = EVP_MD_get_size(mdres);
c96ce52c 1105 s->ext.tick_identity++;
9368f865 1106 dores = 1;
ec15acb6
MC
1107 }
1108
9368f865 1109 dopsksess:
add8d0e9 1110 if (!dores && s->psksession == NULL)
9368f865 1111 return EXT_RETURN_NOT_SENT;
ec15acb6 1112
add8d0e9 1113 if (s->psksession != NULL) {
38b051a1 1114 mdpsk = ssl_md(sctx, s->psksession->cipher->algorithm2);
9368f865
MC
1115 if (mdpsk == NULL) {
1116 /*
1117 * Don't recognize this cipher so we can't use the session.
1118 * If this happens it's an application bug.
1119 */
c48ffbcc 1120 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_BAD_PSK);
635c8f77 1121 return EXT_RETURN_FAIL;
9368f865
MC
1122 }
1123
fc7129dc 1124 if (s->hello_retry_request == SSL_HRR_PENDING && mdpsk != handmd) {
9368f865
MC
1125 /*
1126 * Selected ciphersuite hash does not match the hash for the PSK
1127 * session. This is an application bug.
1128 */
c48ffbcc 1129 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_BAD_PSK);
635c8f77 1130 return EXT_RETURN_FAIL;
9368f865
MC
1131 }
1132
ed576acd 1133 pskhashsize = EVP_MD_get_size(mdpsk);
9368f865 1134 }
ec15acb6
MC
1135
1136 /* Create the extension, but skip over the binder for now */
1137 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_psk)
1138 || !WPACKET_start_sub_packet_u16(pkt)
9368f865 1139 || !WPACKET_start_sub_packet_u16(pkt)) {
c48ffbcc 1140 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
635c8f77 1141 return EXT_RETURN_FAIL;
9368f865
MC
1142 }
1143
1144 if (dores) {
1145 if (!WPACKET_sub_memcpy_u16(pkt, s->session->ext.tick,
1146 s->session->ext.ticklen)
1147 || !WPACKET_put_bytes_u32(pkt, agems)) {
c48ffbcc 1148 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
635c8f77 1149 return EXT_RETURN_FAIL;
9368f865
MC
1150 }
1151 }
1152
add8d0e9
MC
1153 if (s->psksession != NULL) {
1154 if (!WPACKET_sub_memcpy_u16(pkt, s->psksession_id,
1155 s->psksession_id_len)
9368f865 1156 || !WPACKET_put_bytes_u32(pkt, 0)) {
c48ffbcc 1157 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
635c8f77 1158 return EXT_RETURN_FAIL;
9368f865 1159 }
c96ce52c 1160 s->ext.tick_identity++;
9368f865
MC
1161 }
1162
1163 if (!WPACKET_close(pkt)
ec15acb6
MC
1164 || !WPACKET_get_total_written(pkt, &binderoffset)
1165 || !WPACKET_start_sub_packet_u16(pkt)
9368f865
MC
1166 || (dores
1167 && !WPACKET_sub_allocate_bytes_u8(pkt, reshashsize, &resbinder))
add8d0e9 1168 || (s->psksession != NULL
9368f865 1169 && !WPACKET_sub_allocate_bytes_u8(pkt, pskhashsize, &pskbinder))
ec15acb6
MC
1170 || !WPACKET_close(pkt)
1171 || !WPACKET_close(pkt)
1172 || !WPACKET_get_total_written(pkt, &msglen)
1173 /*
1174 * We need to fill in all the sub-packet lengths now so we can
1175 * calculate the HMAC of the message up to the binders
1176 */
1177 || !WPACKET_fill_lengths(pkt)) {
c48ffbcc 1178 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
635c8f77 1179 return EXT_RETURN_FAIL;
ec15acb6
MC
1180 }
1181
1182 msgstart = WPACKET_get_curr(pkt) - msglen;
1183
72257204
MC
1184 if (dores
1185 && tls_psk_do_binder(s, mdres, msgstart, binderoffset, NULL,
1186 resbinder, s->session, 1, 0) != 1) {
635c8f77
MC
1187 /* SSLfatal() already called */
1188 return EXT_RETURN_FAIL;
ec15acb6
MC
1189 }
1190
add8d0e9 1191 if (s->psksession != NULL
72257204 1192 && tls_psk_do_binder(s, mdpsk, msgstart, binderoffset, NULL,
add8d0e9 1193 pskbinder, s->psksession, 1, 1) != 1) {
635c8f77
MC
1194 /* SSLfatal() already called */
1195 return EXT_RETURN_FAIL;
9368f865
MC
1196 }
1197
635c8f77 1198 return EXT_RETURN_SENT;
ec15acb6 1199#else
89bc9cf6 1200 return EXT_RETURN_NOT_SENT;
ec15acb6
MC
1201#endif
1202}
1203
38b051a1 1204EXT_RETURN tls_construct_ctos_post_handshake_auth(SSL_CONNECTION *s, WPACKET *pkt,
a7e6a3d8
P
1205 ossl_unused unsigned int context,
1206 ossl_unused X509 *x,
1207 ossl_unused size_t chainidx)
9d75dce3
TS
1208{
1209#ifndef OPENSSL_NO_TLS1_3
32097b33
MC
1210 if (!s->pha_enabled)
1211 return EXT_RETURN_NOT_SENT;
9d75dce3
TS
1212
1213 /* construct extension - 0 length, no contents */
1214 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_post_handshake_auth)
1215 || !WPACKET_start_sub_packet_u16(pkt)
1216 || !WPACKET_close(pkt)) {
c48ffbcc 1217 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
9d75dce3
TS
1218 return EXT_RETURN_FAIL;
1219 }
1220
1221 s->post_handshake_auth = SSL_PHA_EXT_SENT;
1222
1223 return EXT_RETURN_SENT;
1224#else
1225 return EXT_RETURN_NOT_SENT;
1226#endif
1227}
1228
1229
6dd083fd
MC
1230/*
1231 * Parse the server's renegotiation binding and abort if it's not right
1232 */
38b051a1
TM
1233int tls_parse_stoc_renegotiate(SSL_CONNECTION *s, PACKET *pkt,
1234 unsigned int context,
f63a17d6 1235 X509 *x, size_t chainidx)
6dd083fd 1236{
555cbb32
TS
1237 size_t expected_len = s->s3.previous_client_finished_len
1238 + s->s3.previous_server_finished_len;
6dd083fd
MC
1239 size_t ilen;
1240 const unsigned char *data;
1241
1242 /* Check for logic errors */
b77f3ed1 1243 if (!ossl_assert(expected_len == 0
555cbb32 1244 || s->s3.previous_client_finished_len != 0)
b77f3ed1 1245 || !ossl_assert(expected_len == 0
555cbb32 1246 || s->s3.previous_server_finished_len != 0)) {
c48ffbcc 1247 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
b77f3ed1
MC
1248 return 0;
1249 }
6dd083fd
MC
1250
1251 /* Parse the length byte */
1252 if (!PACKET_get_1_len(pkt, &ilen)) {
c48ffbcc 1253 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_RENEGOTIATION_ENCODING_ERR);
6dd083fd
MC
1254 return 0;
1255 }
1256
1257 /* Consistency check */
1258 if (PACKET_remaining(pkt) != ilen) {
c48ffbcc 1259 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_RENEGOTIATION_ENCODING_ERR);
6dd083fd
MC
1260 return 0;
1261 }
1262
1263 /* Check that the extension matches */
1264 if (ilen != expected_len) {
c48ffbcc 1265 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_RENEGOTIATION_MISMATCH);
6dd083fd
MC
1266 return 0;
1267 }
1268
555cbb32
TS
1269 if (!PACKET_get_bytes(pkt, &data, s->s3.previous_client_finished_len)
1270 || memcmp(data, s->s3.previous_client_finished,
1271 s->s3.previous_client_finished_len) != 0) {
c48ffbcc 1272 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_RENEGOTIATION_MISMATCH);
6dd083fd
MC
1273 return 0;
1274 }
1275
555cbb32
TS
1276 if (!PACKET_get_bytes(pkt, &data, s->s3.previous_server_finished_len)
1277 || memcmp(data, s->s3.previous_server_finished,
1278 s->s3.previous_server_finished_len) != 0) {
c48ffbcc 1279 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_RENEGOTIATION_MISMATCH);
6dd083fd
MC
1280 return 0;
1281 }
555cbb32 1282 s->s3.send_connection_binding = 1;
6dd083fd
MC
1283
1284 return 1;
1285}
1286
cf72c757 1287/* Parse the server's max fragment len extension packet */
38b051a1
TM
1288int tls_parse_stoc_maxfragmentlen(SSL_CONNECTION *s, PACKET *pkt,
1289 unsigned int context,
f63a17d6 1290 X509 *x, size_t chainidx)
cf72c757
F
1291{
1292 unsigned int value;
1293
1294 if (PACKET_remaining(pkt) != 1 || !PACKET_get_1(pkt, &value)) {
c48ffbcc 1295 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
cf72c757
F
1296 return 0;
1297 }
1298
1299 /* |value| should contains a valid max-fragment-length code. */
1300 if (!IS_MAX_FRAGMENT_LENGTH_EXT_VALID(value)) {
f63a17d6 1301 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
f63a17d6 1302 SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH);
cf72c757
F
1303 return 0;
1304 }
1305
1306 /* Must be the same value as client-configured one who was sent to server */
1307 /*-
1308 * RFC 6066: if a client receives a maximum fragment length negotiation
1309 * response that differs from the length it requested, ...
1310 * It must abort with SSL_AD_ILLEGAL_PARAMETER alert
1311 */
1312 if (value != s->ext.max_fragment_len_mode) {
f63a17d6 1313 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
f63a17d6 1314 SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH);
cf72c757
F
1315 return 0;
1316 }
1317
1318 /*
1319 * Maximum Fragment Length Negotiation succeeded.
1320 * The negotiated Maximum Fragment Length is binding now.
1321 */
1322 s->session->ext.max_fragment_len_mode = value;
1323
1324 return 1;
1325}
1326
38b051a1
TM
1327int tls_parse_stoc_server_name(SSL_CONNECTION *s, PACKET *pkt,
1328 unsigned int context,
f63a17d6 1329 X509 *x, size_t chainidx)
6dd083fd 1330{
fb34a0f4 1331 if (s->ext.hostname == NULL) {
c48ffbcc 1332 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
fb34a0f4
MC
1333 return 0;
1334 }
1335
1336 if (PACKET_remaining(pkt) > 0) {
c48ffbcc 1337 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
6dd083fd
MC
1338 return 0;
1339 }
1340
1341 if (!s->hit) {
aff8c126 1342 if (s->session->ext.hostname != NULL) {
c48ffbcc 1343 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
6dd083fd
MC
1344 return 0;
1345 }
aff8c126
RS
1346 s->session->ext.hostname = OPENSSL_strdup(s->ext.hostname);
1347 if (s->session->ext.hostname == NULL) {
c48ffbcc 1348 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
6dd083fd
MC
1349 return 0;
1350 }
1351 }
1352
1353 return 1;
1354}
1355
38b051a1
TM
1356int tls_parse_stoc_ec_pt_formats(SSL_CONNECTION *s, PACKET *pkt,
1357 unsigned int context,
f63a17d6 1358 X509 *x, size_t chainidx)
6dd083fd 1359{
848a950b 1360 size_t ecpointformats_len;
6dd083fd
MC
1361 PACKET ecptformatlist;
1362
1363 if (!PACKET_as_length_prefixed_1(pkt, &ecptformatlist)) {
c48ffbcc 1364 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
6dd083fd
MC
1365 return 0;
1366 }
1367 if (!s->hit) {
aff8c126 1368 ecpointformats_len = PACKET_remaining(&ecptformatlist);
848a950b 1369 if (ecpointformats_len == 0) {
c48ffbcc 1370 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_LENGTH);
848a950b
MC
1371 return 0;
1372 }
6dd083fd 1373
cd0fb43c
MC
1374 s->ext.peer_ecpointformats_len = 0;
1375 OPENSSL_free(s->ext.peer_ecpointformats);
1376 s->ext.peer_ecpointformats = OPENSSL_malloc(ecpointformats_len);
1377 if (s->ext.peer_ecpointformats == NULL) {
39a14059 1378 s->ext.peer_ecpointformats_len = 0;
c48ffbcc 1379 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
6dd083fd
MC
1380 return 0;
1381 }
1382
cd0fb43c 1383 s->ext.peer_ecpointformats_len = ecpointformats_len;
6dd083fd
MC
1384
1385 if (!PACKET_copy_bytes(&ecptformatlist,
cd0fb43c 1386 s->ext.peer_ecpointformats,
aff8c126 1387 ecpointformats_len)) {
c48ffbcc 1388 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
6dd083fd
MC
1389 return 0;
1390 }
1391 }
1392
1393 return 1;
1394}
6dd083fd 1395
38b051a1
TM
1396int tls_parse_stoc_session_ticket(SSL_CONNECTION *s, PACKET *pkt,
1397 unsigned int context,
f63a17d6 1398 X509 *x, size_t chainidx)
6dd083fd 1399{
38b051a1
TM
1400 SSL *ssl = SSL_CONNECTION_GET_SSL(s);
1401
aff8c126 1402 if (s->ext.session_ticket_cb != NULL &&
38b051a1
TM
1403 !s->ext.session_ticket_cb(ssl, PACKET_data(pkt),
1404 PACKET_remaining(pkt),
1405 s->ext.session_ticket_cb_arg)) {
c48ffbcc 1406 SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_R_BAD_EXTENSION);
6dd083fd
MC
1407 return 0;
1408 }
1266eefd 1409
fb34a0f4 1410 if (!tls_use_ticket(s)) {
c48ffbcc 1411 SSLfatal(s, SSL_AD_UNSUPPORTED_EXTENSION, SSL_R_BAD_EXTENSION);
6dd083fd
MC
1412 return 0;
1413 }
fb34a0f4 1414 if (PACKET_remaining(pkt) > 0) {
c48ffbcc 1415 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
fb34a0f4
MC
1416 return 0;
1417 }
1266eefd 1418
aff8c126 1419 s->ext.ticket_expected = 1;
6dd083fd
MC
1420
1421 return 1;
1422}
1423
ab83e314 1424#ifndef OPENSSL_NO_OCSP
38b051a1
TM
1425int tls_parse_stoc_status_request(SSL_CONNECTION *s, PACKET *pkt,
1426 unsigned int context,
f63a17d6 1427 X509 *x, size_t chainidx)
6dd083fd 1428{
5de683d2
MC
1429 if (context == SSL_EXT_TLS1_3_CERTIFICATE_REQUEST) {
1430 /* We ignore this if the server sends a CertificateRequest */
5de683d2
MC
1431 return 1;
1432 }
1433
6dd083fd 1434 /*
f63e4288
MC
1435 * MUST only be sent if we've requested a status
1436 * request message. In TLS <= 1.2 it must also be empty.
6dd083fd 1437 */
fb34a0f4 1438 if (s->ext.status_type != TLSEXT_STATUSTYPE_ocsp) {
c48ffbcc 1439 SSLfatal(s, SSL_AD_UNSUPPORTED_EXTENSION, SSL_R_BAD_EXTENSION);
6dd083fd
MC
1440 return 0;
1441 }
38b051a1 1442 if (!SSL_CONNECTION_IS_TLS13(s) && PACKET_remaining(pkt) > 0) {
c48ffbcc 1443 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
fb34a0f4
MC
1444 return 0;
1445 }
f63e4288 1446
38b051a1 1447 if (SSL_CONNECTION_IS_TLS13(s)) {
f63e4288 1448 /* We only know how to handle this if it's for the first Certificate in
1ee4b98e 1449 * the chain. We ignore any other responses.
f63e4288 1450 */
8521ced6 1451 if (chainidx != 0)
f63e4288 1452 return 1;
f63a17d6
MC
1453
1454 /* SSLfatal() already called */
1455 return tls_process_cert_status_body(s, pkt);
f63e4288
MC
1456 }
1457
6dd083fd 1458 /* Set flag to expect CertificateStatus message */
aff8c126 1459 s->ext.status_expected = 1;
6dd083fd
MC
1460
1461 return 1;
1462}
ab83e314 1463#endif
6dd083fd
MC
1464
1465
1466#ifndef OPENSSL_NO_CT
38b051a1
TM
1467int tls_parse_stoc_sct(SSL_CONNECTION *s, PACKET *pkt, unsigned int context,
1468 X509 *x, size_t chainidx)
6dd083fd 1469{
5de683d2
MC
1470 if (context == SSL_EXT_TLS1_3_CERTIFICATE_REQUEST) {
1471 /* We ignore this if the server sends it in a CertificateRequest */
5de683d2
MC
1472 return 1;
1473 }
1474
6dd083fd
MC
1475 /*
1476 * Only take it if we asked for it - i.e if there is no CT validation
1477 * callback set, then a custom extension MAY be processing it, so we
1478 * need to let control continue to flow to that.
1479 */
1480 if (s->ct_validation_callback != NULL) {
1481 size_t size = PACKET_remaining(pkt);
1482
1483 /* Simply copy it off for later processing */
aff8c126
RS
1484 OPENSSL_free(s->ext.scts);
1485 s->ext.scts = NULL;
1266eefd 1486
3a63c0ed 1487 s->ext.scts_len = (uint16_t)size;
6dd083fd 1488 if (size > 0) {
aff8c126 1489 s->ext.scts = OPENSSL_malloc(size);
39a14059
MC
1490 if (s->ext.scts == NULL) {
1491 s->ext.scts_len = 0;
1492 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_MALLOC_FAILURE);
1493 return 0;
1494 }
1495 if (!PACKET_copy_bytes(pkt, s->ext.scts, size)) {
c48ffbcc 1496 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
6dd083fd
MC
1497 return 0;
1498 }
1499 }
1500 } else {
b186a592
MC
1501 ENDPOINT role = (context & SSL_EXT_TLS1_2_SERVER_HELLO) != 0
1502 ? ENDPOINT_CLIENT : ENDPOINT_BOTH;
1503
1504 /*
1505 * If we didn't ask for it then there must be a custom extension,
1506 * otherwise this is unsolicited.
1507 */
1508 if (custom_ext_find(&s->cert->custext, role,
1509 TLSEXT_TYPE_signed_certificate_timestamp,
1510 NULL) == NULL) {
c48ffbcc 1511 SSLfatal(s, TLS1_AD_UNSUPPORTED_EXTENSION, SSL_R_BAD_EXTENSION);
b186a592
MC
1512 return 0;
1513 }
1514
f63a17d6 1515 if (!custom_ext_parse(s, context,
43ae5eed
MC
1516 TLSEXT_TYPE_signed_certificate_timestamp,
1517 PACKET_data(pkt), PACKET_remaining(pkt),
f63a17d6
MC
1518 x, chainidx)) {
1519 /* SSLfatal already called */
6dd083fd 1520 return 0;
f63a17d6 1521 }
6dd083fd
MC
1522 }
1523
1524 return 1;
1525}
1526#endif
1527
1528
1529#ifndef OPENSSL_NO_NEXTPROTONEG
1530/*
1531 * ssl_next_proto_validate validates a Next Protocol Negotiation block. No
1532 * elements of zero length are allowed and the set of elements must exactly
1533 * fill the length of the block. Returns 1 on success or 0 on failure.
1534 */
38b051a1 1535static int ssl_next_proto_validate(SSL_CONNECTION *s, PACKET *pkt)
6dd083fd
MC
1536{
1537 PACKET tmp_protocol;
1538
1539 while (PACKET_remaining(pkt)) {
1540 if (!PACKET_get_length_prefixed_1(pkt, &tmp_protocol)
f63a17d6 1541 || PACKET_remaining(&tmp_protocol) == 0) {
c48ffbcc 1542 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
6dd083fd 1543 return 0;
f63a17d6 1544 }
6dd083fd
MC
1545 }
1546
1547 return 1;
1548}
1549
38b051a1
TM
1550int tls_parse_stoc_npn(SSL_CONNECTION *s, PACKET *pkt, unsigned int context,
1551 X509 *x, size_t chainidx)
6dd083fd
MC
1552{
1553 unsigned char *selected;
1554 unsigned char selected_len;
1555 PACKET tmppkt;
38b051a1 1556 SSL_CTX *sctx = SSL_CONNECTION_GET_CTX(s);
6dd083fd 1557
1266eefd 1558 /* Check if we are in a renegotiation. If so ignore this extension */
c7f47786 1559 if (!SSL_IS_FIRST_HANDSHAKE(s))
6dd083fd
MC
1560 return 1;
1561
1562 /* We must have requested it. */
38b051a1 1563 if (sctx->ext.npn_select_cb == NULL) {
c48ffbcc 1564 SSLfatal(s, SSL_AD_UNSUPPORTED_EXTENSION, SSL_R_BAD_EXTENSION);
6dd083fd
MC
1565 return 0;
1566 }
1266eefd 1567
6dd083fd
MC
1568 /* The data must be valid */
1569 tmppkt = *pkt;
f63a17d6
MC
1570 if (!ssl_next_proto_validate(s, &tmppkt)) {
1571 /* SSLfatal() already called */
6dd083fd
MC
1572 return 0;
1573 }
38b051a1
TM
1574 if (sctx->ext.npn_select_cb(SSL_CONNECTION_GET_SSL(s),
1575 &selected, &selected_len,
1576 PACKET_data(pkt), PACKET_remaining(pkt),
1577 sctx->ext.npn_select_cb_arg) !=
6dd083fd 1578 SSL_TLSEXT_ERR_OK) {
c48ffbcc 1579 SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_R_BAD_EXTENSION);
6dd083fd
MC
1580 return 0;
1581 }
1266eefd 1582
6dd083fd
MC
1583 /*
1584 * Could be non-NULL if server has sent multiple NPN extensions in
1585 * a single Serverhello
1586 */
aff8c126
RS
1587 OPENSSL_free(s->ext.npn);
1588 s->ext.npn = OPENSSL_malloc(selected_len);
1589 if (s->ext.npn == NULL) {
39a14059 1590 s->ext.npn_len = 0;
c48ffbcc 1591 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
6dd083fd
MC
1592 return 0;
1593 }
1594
aff8c126
RS
1595 memcpy(s->ext.npn, selected, selected_len);
1596 s->ext.npn_len = selected_len;
555cbb32 1597 s->s3.npn_seen = 1;
6dd083fd
MC
1598
1599 return 1;
1600}
1601#endif
1602
38b051a1
TM
1603int tls_parse_stoc_alpn(SSL_CONNECTION *s, PACKET *pkt, unsigned int context,
1604 X509 *x, size_t chainidx)
6dd083fd
MC
1605{
1606 size_t len;
1607
1608 /* We must have requested it. */
555cbb32 1609 if (!s->s3.alpn_sent) {
c48ffbcc 1610 SSLfatal(s, SSL_AD_UNSUPPORTED_EXTENSION, SSL_R_BAD_EXTENSION);
6dd083fd
MC
1611 return 0;
1612 }
1613 /*-
1614 * The extension data consists of:
1615 * uint16 list_length
1616 * uint8 proto_length;
1617 * uint8 proto[proto_length];
1618 */
1619 if (!PACKET_get_net_2_len(pkt, &len)
1620 || PACKET_remaining(pkt) != len || !PACKET_get_1_len(pkt, &len)
1621 || PACKET_remaining(pkt) != len) {
c48ffbcc 1622 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
6dd083fd
MC
1623 return 0;
1624 }
555cbb32
TS
1625 OPENSSL_free(s->s3.alpn_selected);
1626 s->s3.alpn_selected = OPENSSL_malloc(len);
1627 if (s->s3.alpn_selected == NULL) {
39a14059 1628 s->s3.alpn_selected_len = 0;
c48ffbcc 1629 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
6dd083fd
MC
1630 return 0;
1631 }
555cbb32 1632 if (!PACKET_copy_bytes(pkt, s->s3.alpn_selected, len)) {
c48ffbcc 1633 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
6dd083fd
MC
1634 return 0;
1635 }
555cbb32 1636 s->s3.alpn_selected_len = len;
6dd083fd 1637
0ef28021
MC
1638 if (s->session->ext.alpn_selected == NULL
1639 || s->session->ext.alpn_selected_len != len
555cbb32 1640 || memcmp(s->session->ext.alpn_selected, s->s3.alpn_selected, len)
0ef28021 1641 != 0) {
4be3a7c7
MC
1642 /* ALPN not consistent with the old session so cannot use early_data */
1643 s->ext.early_data_ok = 0;
1644 }
1645 if (!s->hit) {
9d5db9c9
MC
1646 /*
1647 * This is a new session and so alpn_selected should have been
1648 * initialised to NULL. We should update it with the selected ALPN.
1649 */
1650 if (!ossl_assert(s->session->ext.alpn_selected == NULL)) {
c48ffbcc 1651 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
9d5db9c9
MC
1652 return 0;
1653 }
4be3a7c7 1654 s->session->ext.alpn_selected =
555cbb32 1655 OPENSSL_memdup(s->s3.alpn_selected, s->s3.alpn_selected_len);
4be3a7c7 1656 if (s->session->ext.alpn_selected == NULL) {
39a14059 1657 s->session->ext.alpn_selected_len = 0;
c48ffbcc 1658 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
4be3a7c7
MC
1659 return 0;
1660 }
555cbb32 1661 s->session->ext.alpn_selected_len = s->s3.alpn_selected_len;
ae8d7d99
MC
1662 }
1663
6dd083fd
MC
1664 return 1;
1665}
1666
1667#ifndef OPENSSL_NO_SRTP
38b051a1
TM
1668int tls_parse_stoc_use_srtp(SSL_CONNECTION *s, PACKET *pkt,
1669 unsigned int context, X509 *x, size_t chainidx)
6dd083fd
MC
1670{
1671 unsigned int id, ct, mki;
1672 int i;
1673 STACK_OF(SRTP_PROTECTION_PROFILE) *clnt;
1674 SRTP_PROTECTION_PROFILE *prof;
1675
1266eefd
MC
1676 if (!PACKET_get_net_2(pkt, &ct) || ct != 2
1677 || !PACKET_get_net_2(pkt, &id)
1678 || !PACKET_get_1(pkt, &mki)
1679 || PACKET_remaining(pkt) != 0) {
c48ffbcc 1680 SSLfatal(s, SSL_AD_DECODE_ERROR,
f63a17d6 1681 SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
6dd083fd
MC
1682 return 0;
1683 }
1684
1685 if (mki != 0) {
1686 /* Must be no MKI, since we never offer one */
c48ffbcc 1687 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_BAD_SRTP_MKI_VALUE);
6dd083fd
MC
1688 return 0;
1689 }
1690
6dd083fd 1691 /* Throw an error if the server gave us an unsolicited extension */
38b051a1 1692 clnt = SSL_get_srtp_profiles(SSL_CONNECTION_GET_SSL(s));
6dd083fd 1693 if (clnt == NULL) {
c48ffbcc 1694 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_NO_SRTP_PROFILES);
6dd083fd
MC
1695 return 0;
1696 }
1697
1698 /*
1699 * Check to see if the server gave us something we support (and
1700 * presumably offered)
1701 */
1702 for (i = 0; i < sk_SRTP_PROTECTION_PROFILE_num(clnt); i++) {
1703 prof = sk_SRTP_PROTECTION_PROFILE_value(clnt, i);
1704
1705 if (prof->id == id) {
1706 s->srtp_profile = prof;
6dd083fd
MC
1707 return 1;
1708 }
1709 }
1710
c48ffbcc 1711 SSLfatal(s, SSL_AD_DECODE_ERROR,
f63a17d6 1712 SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
6dd083fd
MC
1713 return 0;
1714}
1715#endif
1716
38b051a1
TM
1717int tls_parse_stoc_etm(SSL_CONNECTION *s, PACKET *pkt, unsigned int context,
1718 X509 *x, size_t chainidx)
6dd083fd
MC
1719{
1720 /* Ignore if inappropriate ciphersuite */
1721 if (!(s->options & SSL_OP_NO_ENCRYPT_THEN_MAC)
555cbb32 1722 && s->s3.tmp.new_cipher->algorithm_mac != SSL_AEAD
d724da69
DB
1723 && s->s3.tmp.new_cipher->algorithm_enc != SSL_RC4
1724 && s->s3.tmp.new_cipher->algorithm_enc != SSL_eGOST2814789CNT
1725 && s->s3.tmp.new_cipher->algorithm_enc != SSL_eGOST2814789CNT12
1726 && s->s3.tmp.new_cipher->algorithm_enc != SSL_MAGMA
1727 && s->s3.tmp.new_cipher->algorithm_enc != SSL_KUZNYECHIK)
28a31a0a 1728 s->ext.use_etm = 1;
6dd083fd
MC
1729
1730 return 1;
1731}
1732
38b051a1
TM
1733int tls_parse_stoc_ems(SSL_CONNECTION *s, PACKET *pkt, unsigned int context,
1734 X509 *x, size_t chainidx)
6dd083fd 1735{
088dfa13
TS
1736 if (s->options & SSL_OP_NO_EXTENDED_MASTER_SECRET)
1737 return 1;
555cbb32 1738 s->s3.flags |= TLS1_FLAGS_RECEIVED_EXTMS;
6dd083fd
MC
1739 if (!s->hit)
1740 s->session->flags |= SSL_SESS_FLAG_EXTMS;
1741
1742 return 1;
1743}
1744
38b051a1
TM
1745int tls_parse_stoc_supported_versions(SSL_CONNECTION *s, PACKET *pkt,
1746 unsigned int context,
88050dd1
MC
1747 X509 *x, size_t chainidx)
1748{
1749 unsigned int version;
1750
1751 if (!PACKET_get_net_2(pkt, &version)
1752 || PACKET_remaining(pkt) != 0) {
c48ffbcc 1753 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_LENGTH_MISMATCH);
88050dd1
MC
1754 return 0;
1755 }
1756
27e462f1
MC
1757 /*
1758 * The only protocol version we support which is valid in this extension in
1759 * a ServerHello is TLSv1.3 therefore we shouldn't be getting anything else.
1760 */
1761 if (version != TLS1_3_VERSION) {
1762 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
27e462f1
MC
1763 SSL_R_BAD_PROTOCOL_VERSION_NUMBER);
1764 return 0;
1765 }
1766
426dfc9f 1767 /* We ignore this extension for HRRs except to sanity check it */
27e462f1 1768 if (context == SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST)
426dfc9f 1769 return 1;
426dfc9f 1770
88050dd1
MC
1771 /* We just set it here. We validate it in ssl_choose_client_version */
1772 s->version = version;
cffafb5f 1773 s->rlayer.rrlmethod->set_protocol_version(s->rlayer.rrl, version);
88050dd1
MC
1774
1775 return 1;
1776}
1777
38b051a1
TM
1778int tls_parse_stoc_key_share(SSL_CONNECTION *s, PACKET *pkt,
1779 unsigned int context, X509 *x,
f63a17d6 1780 size_t chainidx)
6dd083fd 1781{
3cf96e88 1782#ifndef OPENSSL_NO_TLS1_3
6dd083fd
MC
1783 unsigned int group_id;
1784 PACKET encoded_pt;
555cbb32 1785 EVP_PKEY *ckey = s->s3.tmp.pkey, *skey = NULL;
a011b586 1786 const TLS_GROUP_INFO *ginf = NULL;
6dd083fd
MC
1787
1788 /* Sanity check */
555cbb32 1789 if (ckey == NULL || s->s3.peer_tmp != NULL) {
c48ffbcc 1790 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
6dd083fd
MC
1791 return 0;
1792 }
1793
1794 if (!PACKET_get_net_2(pkt, &group_id)) {
c48ffbcc 1795 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_LENGTH_MISMATCH);
6dd083fd
MC
1796 return 0;
1797 }
1798
0a10825a 1799 group_id = ssl_group_id_tls13_to_internal(group_id);
fe874d27 1800 if ((context & SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST) != 0) {
f48d826e
DSH
1801 const uint16_t *pgroups = NULL;
1802 size_t i, num_groups;
3847d426
MC
1803
1804 if (PACKET_remaining(pkt) != 0) {
c48ffbcc 1805 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_LENGTH_MISMATCH);
3847d426
MC
1806 return 0;
1807 }
1808
1809 /*
1810 * It is an error if the HelloRetryRequest wants a key_share that we
1811 * already sent in the first ClientHello
1812 */
555cbb32 1813 if (group_id == s->s3.group_id) {
c48ffbcc 1814 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_BAD_KEY_SHARE);
3847d426
MC
1815 return 0;
1816 }
1817
1818 /* Validate the selected group is one we support */
f48d826e
DSH
1819 tls1_get_supported_groups(s, &pgroups, &num_groups);
1820 for (i = 0; i < num_groups; i++) {
1821 if (group_id == pgroups[i])
3847d426
MC
1822 break;
1823 }
f48d826e 1824 if (i >= num_groups
dbc6268f 1825 || !tls_group_allowed(s, group_id, SSL_SECOP_CURVE_SUPPORTED)) {
c48ffbcc 1826 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_BAD_KEY_SHARE);
3847d426
MC
1827 return 0;
1828 }
1829
555cbb32
TS
1830 s->s3.group_id = group_id;
1831 EVP_PKEY_free(s->s3.tmp.pkey);
1832 s->s3.tmp.pkey = NULL;
3847d426
MC
1833 return 1;
1834 }
1835
555cbb32 1836 if (group_id != s->s3.group_id) {
6dd083fd
MC
1837 /*
1838 * This isn't for the group that we sent in the original
1839 * key_share!
1840 */
c48ffbcc 1841 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_BAD_KEY_SHARE);
6dd083fd
MC
1842 return 0;
1843 }
aa6bd216
BK
1844 /* Retain this group in the SSL_SESSION */
1845 if (!s->hit) {
1846 s->session->kex_group = group_id;
1847 } else if (group_id != s->session->kex_group) {
1848 /*
1849 * If this is a resumption but changed what group was used, we need
1850 * to record the new group in the session, but the session is not
1851 * a new session and could be in use by other threads. So, make
1852 * a copy of the session to record the new information so that it's
1853 * useful for any sessions resumed from tickets issued on this
1854 * connection.
1855 */
1856 SSL_SESSION *new_sess;
1857
1858 if ((new_sess = ssl_session_dup(s->session, 0)) == NULL) {
1859 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_MALLOC_FAILURE);
1860 return 0;
1861 }
1862 SSL_SESSION_free(s->session);
1863 s->session = new_sess;
1864 s->session->kex_group = group_id;
1865 }
6dd083fd 1866
38b051a1
TM
1867 if ((ginf = tls1_group_id_lookup(SSL_CONNECTION_GET_CTX(s),
1868 group_id)) == NULL) {
c48ffbcc 1869 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_BAD_KEY_SHARE);
a011b586
NT
1870 return 0;
1871 }
1872
6dd083fd
MC
1873 if (!PACKET_as_length_prefixed_2(pkt, &encoded_pt)
1874 || PACKET_remaining(&encoded_pt) == 0) {
c48ffbcc 1875 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_LENGTH_MISMATCH);
6dd083fd
MC
1876 return 0;
1877 }
1878
a011b586
NT
1879 if (!ginf->is_kem) {
1880 /* Regular KEX */
1881 skey = EVP_PKEY_new();
1882 if (skey == NULL || EVP_PKEY_copy_parameters(skey, ckey) <= 0) {
c48ffbcc 1883 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_COPY_PARAMETERS_FAILED);
b3c34401 1884 EVP_PKEY_free(skey);
a011b586
NT
1885 return 0;
1886 }
afce590b 1887
d5530efa
TM
1888 if (tls13_set_encoded_pub_key(skey, PACKET_data(&encoded_pt),
1889 PACKET_remaining(&encoded_pt)) <= 0) {
c48ffbcc 1890 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_BAD_ECPOINT);
a011b586
NT
1891 EVP_PKEY_free(skey);
1892 return 0;
1893 }
6dd083fd 1894
a011b586
NT
1895 if (ssl_derive(s, ckey, skey, 1) == 0) {
1896 /* SSLfatal() already called */
1897 EVP_PKEY_free(skey);
1898 return 0;
1899 }
1900 s->s3.peer_tmp = skey;
1901 } else {
1902 /* KEM Mode */
1903 const unsigned char *ct = PACKET_data(&encoded_pt);
1904 size_t ctlen = PACKET_remaining(&encoded_pt);
1905
1906 if (ssl_decapsulate(s, ckey, ct, ctlen, 1) == 0) {
1907 /* SSLfatal() already called */
1908 return 0;
1909 }
6dd083fd 1910 }
aa6bd216 1911 s->s3.did_kex = 1;
3cf96e88 1912#endif
6dd083fd
MC
1913
1914 return 1;
1915}
4ff65f77 1916
38b051a1
TM
1917int tls_parse_stoc_cookie(SSL_CONNECTION *s, PACKET *pkt, unsigned int context,
1918 X509 *x, size_t chainidx)
cfef5027
MC
1919{
1920 PACKET cookie;
1921
1922 if (!PACKET_as_length_prefixed_2(pkt, &cookie)
1923 || !PACKET_memdup(&cookie, &s->ext.tls13_cookie,
1924 &s->ext.tls13_cookie_len)) {
c48ffbcc 1925 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_LENGTH_MISMATCH);
cfef5027
MC
1926 return 0;
1927 }
1928
1929 return 1;
1930}
1931
38b051a1
TM
1932int tls_parse_stoc_early_data(SSL_CONNECTION *s, PACKET *pkt,
1933 unsigned int context,
f63a17d6 1934 X509 *x, size_t chainidx)
38df5a45 1935{
fe874d27 1936 if (context == SSL_EXT_TLS1_3_NEW_SESSION_TICKET) {
6594189f
MC
1937 unsigned long max_early_data;
1938
1939 if (!PACKET_get_net_4(pkt, &max_early_data)
1940 || PACKET_remaining(pkt) != 0) {
c48ffbcc 1941 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_INVALID_MAX_EARLY_DATA);
6594189f
MC
1942 return 0;
1943 }
1944
1945 s->session->ext.max_early_data = max_early_data;
1946
1947 return 1;
1948 }
1949
38df5a45 1950 if (PACKET_remaining(pkt) != 0) {
c48ffbcc 1951 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
38df5a45
MC
1952 return 0;
1953 }
1954
4be3a7c7 1955 if (!s->ext.early_data_ok
c96ce52c 1956 || !s->hit) {
38df5a45
MC
1957 /*
1958 * If we get here then we didn't send early data, or we didn't resume
4be3a7c7
MC
1959 * using the first identity, or the SNI/ALPN is not consistent so the
1960 * server should not be accepting it.
38df5a45 1961 */
c48ffbcc 1962 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_BAD_EXTENSION);
38df5a45
MC
1963 return 0;
1964 }
1965
1966 s->ext.early_data = SSL_EARLY_DATA_ACCEPTED;
1967
1968 return 1;
1969}
1970
38b051a1
TM
1971int tls_parse_stoc_psk(SSL_CONNECTION *s, PACKET *pkt,
1972 unsigned int context, X509 *x,
f63a17d6 1973 size_t chainidx)
4ff65f77
MC
1974{
1975#ifndef OPENSSL_NO_TLS1_3
1976 unsigned int identity;
1977
1978 if (!PACKET_get_net_2(pkt, &identity) || PACKET_remaining(pkt) != 0) {
c48ffbcc 1979 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_LENGTH_MISMATCH);
4ff65f77
MC
1980 return 0;
1981 }
1982
c96ce52c 1983 if (identity >= (unsigned int)s->ext.tick_identity) {
c48ffbcc 1984 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_BAD_PSK_IDENTITY);
c96ce52c
MC
1985 return 0;
1986 }
1987
1988 /*
1989 * Session resumption tickets are always sent before PSK tickets. If the
1990 * ticket index is 0 then it must be for a session resumption ticket if we
1991 * sent two tickets, or if we didn't send a PSK ticket.
1992 */
1993 if (identity == 0 && (s->psksession == NULL || s->ext.tick_identity == 2)) {
9368f865
MC
1994 s->hit = 1;
1995 SSL_SESSION_free(s->psksession);
1996 s->psksession = NULL;
1997 return 1;
1998 }
1999
c96ce52c
MC
2000 if (s->psksession == NULL) {
2001 /* Should never happen */
c48ffbcc 2002 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
4ff65f77
MC
2003 return 0;
2004 }
2005
add8d0e9
MC
2006 /*
2007 * If we used the external PSK for sending early_data then s->early_secret
2008 * is already set up, so don't overwrite it. Otherwise we copy the
2009 * early_secret across that we generated earlier.
2010 */
2011 if ((s->early_data_state != SSL_EARLY_DATA_WRITE_RETRY
2012 && s->early_data_state != SSL_EARLY_DATA_FINISHED_WRITING)
2013 || s->session->ext.max_early_data > 0
2014 || s->psksession->ext.max_early_data == 0)
2015 memcpy(s->early_secret, s->psksession->early_secret, EVP_MAX_MD_SIZE);
2016
9368f865
MC
2017 SSL_SESSION_free(s->session);
2018 s->session = s->psksession;
2019 s->psksession = NULL;
4ff65f77 2020 s->hit = 1;
c96ce52c
MC
2021 /* Early data is only allowed if we used the first ticket */
2022 if (identity != 0)
2023 s->ext.early_data_ok = 0;
4ff65f77
MC
2024#endif
2025
2026 return 1;
2027}