]> git.ipfire.org Git - thirdparty/openssl.git/blob - ssl/statem/extensions_srvr.c
Add support for the TLS 1.3 signature_algorithms_cert extension
[thirdparty/openssl.git] / ssl / statem / extensions_srvr.c
1 /*
2 * Copyright 2016-2017 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the OpenSSL license (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_locl.h"
12 #include "statem_locl.h"
13 #include "internal/cryptlib.h"
14
15 #define COOKIE_STATE_FORMAT_VERSION 0
16
17 /*
18 * 2 bytes for packet length, 2 bytes for format version, 2 bytes for
19 * protocol version, 2 bytes for group id, 2 bytes for cipher id, 1 byte for
20 * key_share present flag, 4 bytes for timestamp, 2 bytes for the hashlen,
21 * EVP_MAX_MD_SIZE for transcript hash, 1 byte for app cookie length, app cookie
22 * length bytes, SHA256_DIGEST_LENGTH bytes for the HMAC of the whole thing.
23 */
24 #define MAX_COOKIE_SIZE (2 + 2 + 2 + 2 + 2 + 1 + 4 + 2 + EVP_MAX_MD_SIZE + 1 \
25 + SSL_COOKIE_LENGTH + SHA256_DIGEST_LENGTH)
26
27 /*
28 * Message header + 2 bytes for protocol version + number of random bytes +
29 * + 1 byte for legacy session id length + number of bytes in legacy session id
30 * + 2 bytes for ciphersuite + 1 byte for legacy compression
31 * + 2 bytes for extension block length + 6 bytes for key_share extension
32 * + 4 bytes for cookie extension header + the number of bytes in the cookie
33 */
34 #define MAX_HRR_SIZE (SSL3_HM_HEADER_LENGTH + 2 + SSL3_RANDOM_SIZE + 1 \
35 + SSL_MAX_SSL_SESSION_ID_LENGTH + 2 + 1 + 2 + 6 + 4 \
36 + MAX_COOKIE_SIZE)
37
38 /*
39 * Parse the client's renegotiation binding and abort if it's not right
40 */
41 int tls_parse_ctos_renegotiate(SSL *s, PACKET *pkt, unsigned int context,
42 X509 *x, size_t chainidx)
43 {
44 unsigned int ilen;
45 const unsigned char *data;
46
47 /* Parse the length byte */
48 if (!PACKET_get_1(pkt, &ilen)
49 || !PACKET_get_bytes(pkt, &data, ilen)) {
50 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_RENEGOTIATE,
51 SSL_R_RENEGOTIATION_ENCODING_ERR);
52 return 0;
53 }
54
55 /* Check that the extension matches */
56 if (ilen != s->s3->previous_client_finished_len) {
57 SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_PARSE_CTOS_RENEGOTIATE,
58 SSL_R_RENEGOTIATION_MISMATCH);
59 return 0;
60 }
61
62 if (memcmp(data, s->s3->previous_client_finished,
63 s->s3->previous_client_finished_len)) {
64 SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_PARSE_CTOS_RENEGOTIATE,
65 SSL_R_RENEGOTIATION_MISMATCH);
66 return 0;
67 }
68
69 s->s3->send_connection_binding = 1;
70
71 return 1;
72 }
73
74 /*-
75 * The servername extension is treated as follows:
76 *
77 * - Only the hostname type is supported with a maximum length of 255.
78 * - The servername is rejected if too long or if it contains zeros,
79 * in which case an fatal alert is generated.
80 * - The servername field is maintained together with the session cache.
81 * - When a session is resumed, the servername call back invoked in order
82 * to allow the application to position itself to the right context.
83 * - The servername is acknowledged if it is new for a session or when
84 * it is identical to a previously used for the same session.
85 * Applications can control the behaviour. They can at any time
86 * set a 'desirable' servername for a new SSL object. This can be the
87 * case for example with HTTPS when a Host: header field is received and
88 * a renegotiation is requested. In this case, a possible servername
89 * presented in the new client hello is only acknowledged if it matches
90 * the value of the Host: field.
91 * - Applications must use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
92 * if they provide for changing an explicit servername context for the
93 * session, i.e. when the session has been established with a servername
94 * extension.
95 * - On session reconnect, the servername extension may be absent.
96 */
97 int tls_parse_ctos_server_name(SSL *s, PACKET *pkt, unsigned int context,
98 X509 *x, size_t chainidx)
99 {
100 unsigned int servname_type;
101 PACKET sni, hostname;
102
103 if (!PACKET_as_length_prefixed_2(pkt, &sni)
104 /* ServerNameList must be at least 1 byte long. */
105 || PACKET_remaining(&sni) == 0) {
106 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_SERVER_NAME,
107 SSL_R_BAD_EXTENSION);
108 return 0;
109 }
110
111 /*
112 * Although the intent was for server_name to be extensible, RFC 4366
113 * was not clear about it; and so OpenSSL among other implementations,
114 * always and only allows a 'host_name' name types.
115 * RFC 6066 corrected the mistake but adding new name types
116 * is nevertheless no longer feasible, so act as if no other
117 * SNI types can exist, to simplify parsing.
118 *
119 * Also note that the RFC permits only one SNI value per type,
120 * i.e., we can only have a single hostname.
121 */
122 if (!PACKET_get_1(&sni, &servname_type)
123 || servname_type != TLSEXT_NAMETYPE_host_name
124 || !PACKET_as_length_prefixed_2(&sni, &hostname)) {
125 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_SERVER_NAME,
126 SSL_R_BAD_EXTENSION);
127 return 0;
128 }
129
130 if (!s->hit) {
131 if (PACKET_remaining(&hostname) > TLSEXT_MAXLEN_host_name) {
132 SSLfatal(s, SSL_AD_UNRECOGNIZED_NAME,
133 SSL_F_TLS_PARSE_CTOS_SERVER_NAME,
134 SSL_R_BAD_EXTENSION);
135 return 0;
136 }
137
138 if (PACKET_contains_zero_byte(&hostname)) {
139 SSLfatal(s, SSL_AD_UNRECOGNIZED_NAME,
140 SSL_F_TLS_PARSE_CTOS_SERVER_NAME,
141 SSL_R_BAD_EXTENSION);
142 return 0;
143 }
144
145 OPENSSL_free(s->session->ext.hostname);
146 s->session->ext.hostname = NULL;
147 if (!PACKET_strndup(&hostname, &s->session->ext.hostname)) {
148 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_SERVER_NAME,
149 ERR_R_INTERNAL_ERROR);
150 return 0;
151 }
152
153 s->servername_done = 1;
154 } else {
155 /*
156 * TODO(openssl-team): if the SNI doesn't match, we MUST
157 * fall back to a full handshake.
158 */
159 s->servername_done = s->session->ext.hostname
160 && PACKET_equal(&hostname, s->session->ext.hostname,
161 strlen(s->session->ext.hostname));
162
163 if (!s->servername_done && s->session->ext.hostname != NULL)
164 s->ext.early_data_ok = 0;
165 }
166
167 return 1;
168 }
169
170 int tls_parse_ctos_maxfragmentlen(SSL *s, PACKET *pkt, unsigned int context,
171 X509 *x, size_t chainidx)
172 {
173 unsigned int value;
174
175 if (PACKET_remaining(pkt) != 1 || !PACKET_get_1(pkt, &value)) {
176 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_MAXFRAGMENTLEN,
177 SSL_R_BAD_EXTENSION);
178 return 0;
179 }
180
181 /* Received |value| should be a valid max-fragment-length code. */
182 if (!IS_MAX_FRAGMENT_LENGTH_EXT_VALID(value)) {
183 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
184 SSL_F_TLS_PARSE_CTOS_MAXFRAGMENTLEN,
185 SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH);
186 return 0;
187 }
188
189 /*
190 * RFC 6066: The negotiated length applies for the duration of the session
191 * including session resumptions.
192 * We should receive the same code as in resumed session !
193 */
194 if (s->hit && s->session->ext.max_fragment_len_mode != value) {
195 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
196 SSL_F_TLS_PARSE_CTOS_MAXFRAGMENTLEN,
197 SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH);
198 return 0;
199 }
200
201 /*
202 * Store it in session, so it'll become binding for us
203 * and we'll include it in a next Server Hello.
204 */
205 s->session->ext.max_fragment_len_mode = value;
206 return 1;
207 }
208
209 #ifndef OPENSSL_NO_SRP
210 int tls_parse_ctos_srp(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
211 size_t chainidx)
212 {
213 PACKET srp_I;
214
215 if (!PACKET_as_length_prefixed_1(pkt, &srp_I)
216 || PACKET_contains_zero_byte(&srp_I)) {
217 SSLfatal(s, SSL_AD_DECODE_ERROR,
218 SSL_F_TLS_PARSE_CTOS_SRP,
219 SSL_R_BAD_EXTENSION);
220 return 0;
221 }
222
223 /*
224 * TODO(openssl-team): currently, we re-authenticate the user
225 * upon resumption. Instead, we MUST ignore the login.
226 */
227 if (!PACKET_strndup(&srp_I, &s->srp_ctx.login)) {
228 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_SRP,
229 ERR_R_INTERNAL_ERROR);
230 return 0;
231 }
232
233 return 1;
234 }
235 #endif
236
237 #ifndef OPENSSL_NO_EC
238 int tls_parse_ctos_ec_pt_formats(SSL *s, PACKET *pkt, unsigned int context,
239 X509 *x, size_t chainidx)
240 {
241 PACKET ec_point_format_list;
242
243 if (!PACKET_as_length_prefixed_1(pkt, &ec_point_format_list)
244 || PACKET_remaining(&ec_point_format_list) == 0) {
245 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_EC_PT_FORMATS,
246 SSL_R_BAD_EXTENSION);
247 return 0;
248 }
249
250 if (!s->hit) {
251 if (!PACKET_memdup(&ec_point_format_list,
252 &s->session->ext.ecpointformats,
253 &s->session->ext.ecpointformats_len)) {
254 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
255 SSL_F_TLS_PARSE_CTOS_EC_PT_FORMATS, ERR_R_INTERNAL_ERROR);
256 return 0;
257 }
258 }
259
260 return 1;
261 }
262 #endif /* OPENSSL_NO_EC */
263
264 int tls_parse_ctos_session_ticket(SSL *s, PACKET *pkt, unsigned int context,
265 X509 *x, size_t chainidx)
266 {
267 if (s->ext.session_ticket_cb &&
268 !s->ext.session_ticket_cb(s, PACKET_data(pkt),
269 PACKET_remaining(pkt),
270 s->ext.session_ticket_cb_arg)) {
271 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
272 SSL_F_TLS_PARSE_CTOS_SESSION_TICKET, ERR_R_INTERNAL_ERROR);
273 return 0;
274 }
275
276 return 1;
277 }
278
279 int tls_parse_ctos_sig_algs_cert(SSL *s, PACKET *pkt, unsigned int context,
280 X509 *x, size_t chainidx)
281 {
282 PACKET supported_sig_algs;
283
284 if (!PACKET_as_length_prefixed_2(pkt, &supported_sig_algs)
285 || PACKET_remaining(&supported_sig_algs) == 0) {
286 SSLfatal(s, SSL_AD_DECODE_ERROR,
287 SSL_F_TLS_PARSE_CTOS_SIG_ALGS_CERT, SSL_R_BAD_EXTENSION);
288 return 0;
289 }
290
291 if (!s->hit && !tls1_save_sigalgs(s, &supported_sig_algs, 1)) {
292 SSLfatal(s, SSL_AD_DECODE_ERROR,
293 SSL_F_TLS_PARSE_CTOS_SIG_ALGS_CERT, SSL_R_BAD_EXTENSION);
294 return 0;
295 }
296
297 return 1;
298 }
299
300 int tls_parse_ctos_sig_algs(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
301 size_t chainidx)
302 {
303 PACKET supported_sig_algs;
304
305 if (!PACKET_as_length_prefixed_2(pkt, &supported_sig_algs)
306 || PACKET_remaining(&supported_sig_algs) == 0) {
307 SSLfatal(s, SSL_AD_DECODE_ERROR,
308 SSL_F_TLS_PARSE_CTOS_SIG_ALGS, SSL_R_BAD_EXTENSION);
309 return 0;
310 }
311
312 if (!s->hit && !tls1_save_sigalgs(s, &supported_sig_algs, 0)) {
313 SSLfatal(s, SSL_AD_DECODE_ERROR,
314 SSL_F_TLS_PARSE_CTOS_SIG_ALGS, SSL_R_BAD_EXTENSION);
315 return 0;
316 }
317
318 return 1;
319 }
320
321 #ifndef OPENSSL_NO_OCSP
322 int tls_parse_ctos_status_request(SSL *s, PACKET *pkt, unsigned int context,
323 X509 *x, size_t chainidx)
324 {
325 PACKET responder_id_list, exts;
326
327 /* Not defined if we get one of these in a client Certificate */
328 if (x != NULL)
329 return 1;
330
331 if (!PACKET_get_1(pkt, (unsigned int *)&s->ext.status_type)) {
332 SSLfatal(s, SSL_AD_DECODE_ERROR,
333 SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION);
334 return 0;
335 }
336
337 if (s->ext.status_type != TLSEXT_STATUSTYPE_ocsp) {
338 /*
339 * We don't know what to do with any other type so ignore it.
340 */
341 s->ext.status_type = TLSEXT_STATUSTYPE_nothing;
342 return 1;
343 }
344
345 if (!PACKET_get_length_prefixed_2 (pkt, &responder_id_list)) {
346 SSLfatal(s, SSL_AD_DECODE_ERROR,
347 SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION);
348 return 0;
349 }
350
351 /*
352 * We remove any OCSP_RESPIDs from a previous handshake
353 * to prevent unbounded memory growth - CVE-2016-6304
354 */
355 sk_OCSP_RESPID_pop_free(s->ext.ocsp.ids, OCSP_RESPID_free);
356 if (PACKET_remaining(&responder_id_list) > 0) {
357 s->ext.ocsp.ids = sk_OCSP_RESPID_new_null();
358 if (s->ext.ocsp.ids == NULL) {
359 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
360 SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, ERR_R_MALLOC_FAILURE);
361 return 0;
362 }
363 } else {
364 s->ext.ocsp.ids = NULL;
365 }
366
367 while (PACKET_remaining(&responder_id_list) > 0) {
368 OCSP_RESPID *id;
369 PACKET responder_id;
370 const unsigned char *id_data;
371
372 if (!PACKET_get_length_prefixed_2(&responder_id_list, &responder_id)
373 || PACKET_remaining(&responder_id) == 0) {
374 SSLfatal(s, SSL_AD_DECODE_ERROR,
375 SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION);
376 return 0;
377 }
378
379 id_data = PACKET_data(&responder_id);
380 /* TODO(size_t): Convert d2i_* to size_t */
381 id = d2i_OCSP_RESPID(NULL, &id_data,
382 (int)PACKET_remaining(&responder_id));
383 if (id == NULL) {
384 SSLfatal(s, SSL_AD_DECODE_ERROR,
385 SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION);
386 return 0;
387 }
388
389 if (id_data != PACKET_end(&responder_id)) {
390 OCSP_RESPID_free(id);
391 SSLfatal(s, SSL_AD_DECODE_ERROR,
392 SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION);
393
394 return 0;
395 }
396
397 if (!sk_OCSP_RESPID_push(s->ext.ocsp.ids, id)) {
398 OCSP_RESPID_free(id);
399 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
400 SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, ERR_R_INTERNAL_ERROR);
401
402 return 0;
403 }
404 }
405
406 /* Read in request_extensions */
407 if (!PACKET_as_length_prefixed_2(pkt, &exts)) {
408 SSLfatal(s, SSL_AD_DECODE_ERROR,
409 SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION);
410 return 0;
411 }
412
413 if (PACKET_remaining(&exts) > 0) {
414 const unsigned char *ext_data = PACKET_data(&exts);
415
416 sk_X509_EXTENSION_pop_free(s->ext.ocsp.exts,
417 X509_EXTENSION_free);
418 s->ext.ocsp.exts =
419 d2i_X509_EXTENSIONS(NULL, &ext_data, (int)PACKET_remaining(&exts));
420 if (s->ext.ocsp.exts == NULL || ext_data != PACKET_end(&exts)) {
421 SSLfatal(s, SSL_AD_DECODE_ERROR,
422 SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION);
423 return 0;
424 }
425 }
426
427 return 1;
428 }
429 #endif
430
431 #ifndef OPENSSL_NO_NEXTPROTONEG
432 int tls_parse_ctos_npn(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
433 size_t chainidx)
434 {
435 /*
436 * We shouldn't accept this extension on a
437 * renegotiation.
438 */
439 if (SSL_IS_FIRST_HANDSHAKE(s))
440 s->s3->npn_seen = 1;
441
442 return 1;
443 }
444 #endif
445
446 /*
447 * Save the ALPN extension in a ClientHello.|pkt| holds the contents of the ALPN
448 * extension, not including type and length. Returns: 1 on success, 0 on error.
449 */
450 int tls_parse_ctos_alpn(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
451 size_t chainidx)
452 {
453 PACKET protocol_list, save_protocol_list, protocol;
454
455 if (!SSL_IS_FIRST_HANDSHAKE(s))
456 return 1;
457
458 if (!PACKET_as_length_prefixed_2(pkt, &protocol_list)
459 || PACKET_remaining(&protocol_list) < 2) {
460 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_ALPN,
461 SSL_R_BAD_EXTENSION);
462 return 0;
463 }
464
465 save_protocol_list = protocol_list;
466 do {
467 /* Protocol names can't be empty. */
468 if (!PACKET_get_length_prefixed_1(&protocol_list, &protocol)
469 || PACKET_remaining(&protocol) == 0) {
470 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_ALPN,
471 SSL_R_BAD_EXTENSION);
472 return 0;
473 }
474 } while (PACKET_remaining(&protocol_list) != 0);
475
476 OPENSSL_free(s->s3->alpn_proposed);
477 s->s3->alpn_proposed = NULL;
478 s->s3->alpn_proposed_len = 0;
479 if (!PACKET_memdup(&save_protocol_list,
480 &s->s3->alpn_proposed, &s->s3->alpn_proposed_len)) {
481 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_ALPN,
482 ERR_R_INTERNAL_ERROR);
483 return 0;
484 }
485
486 return 1;
487 }
488
489 #ifndef OPENSSL_NO_SRTP
490 int tls_parse_ctos_use_srtp(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
491 size_t chainidx)
492 {
493 STACK_OF(SRTP_PROTECTION_PROFILE) *srvr;
494 unsigned int ct, mki_len, id;
495 int i, srtp_pref;
496 PACKET subpkt;
497
498 /* Ignore this if we have no SRTP profiles */
499 if (SSL_get_srtp_profiles(s) == NULL)
500 return 1;
501
502 /* Pull off the length of the cipher suite list and check it is even */
503 if (!PACKET_get_net_2(pkt, &ct) || (ct & 1) != 0
504 || !PACKET_get_sub_packet(pkt, &subpkt, ct)) {
505 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_USE_SRTP,
506 SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
507 return 0;
508 }
509
510 srvr = SSL_get_srtp_profiles(s);
511 s->srtp_profile = NULL;
512 /* Search all profiles for a match initially */
513 srtp_pref = sk_SRTP_PROTECTION_PROFILE_num(srvr);
514
515 while (PACKET_remaining(&subpkt)) {
516 if (!PACKET_get_net_2(&subpkt, &id)) {
517 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_USE_SRTP,
518 SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
519 return 0;
520 }
521
522 /*
523 * Only look for match in profiles of higher preference than
524 * current match.
525 * If no profiles have been have been configured then this
526 * does nothing.
527 */
528 for (i = 0; i < srtp_pref; i++) {
529 SRTP_PROTECTION_PROFILE *sprof =
530 sk_SRTP_PROTECTION_PROFILE_value(srvr, i);
531
532 if (sprof->id == id) {
533 s->srtp_profile = sprof;
534 srtp_pref = i;
535 break;
536 }
537 }
538 }
539
540 /* Now extract the MKI value as a sanity check, but discard it for now */
541 if (!PACKET_get_1(pkt, &mki_len)) {
542 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_USE_SRTP,
543 SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
544 return 0;
545 }
546
547 if (!PACKET_forward(pkt, mki_len)
548 || PACKET_remaining(pkt)) {
549 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_USE_SRTP,
550 SSL_R_BAD_SRTP_MKI_VALUE);
551 return 0;
552 }
553
554 return 1;
555 }
556 #endif
557
558 int tls_parse_ctos_etm(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
559 size_t chainidx)
560 {
561 if (!(s->options & SSL_OP_NO_ENCRYPT_THEN_MAC))
562 s->ext.use_etm = 1;
563
564 return 1;
565 }
566
567 /*
568 * Process a psk_kex_modes extension received in the ClientHello. |pkt| contains
569 * the raw PACKET data for the extension. Returns 1 on success or 0 on failure.
570 */
571 int tls_parse_ctos_psk_kex_modes(SSL *s, PACKET *pkt, unsigned int context,
572 X509 *x, size_t chainidx)
573 {
574 #ifndef OPENSSL_NO_TLS1_3
575 PACKET psk_kex_modes;
576 unsigned int mode;
577
578 if (!PACKET_as_length_prefixed_1(pkt, &psk_kex_modes)
579 || PACKET_remaining(&psk_kex_modes) == 0) {
580 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_PSK_KEX_MODES,
581 SSL_R_BAD_EXTENSION);
582 return 0;
583 }
584
585 while (PACKET_get_1(&psk_kex_modes, &mode)) {
586 if (mode == TLSEXT_KEX_MODE_KE_DHE)
587 s->ext.psk_kex_mode |= TLSEXT_KEX_MODE_FLAG_KE_DHE;
588 else if (mode == TLSEXT_KEX_MODE_KE
589 && (s->options & SSL_OP_ALLOW_NO_DHE_KEX) != 0)
590 s->ext.psk_kex_mode |= TLSEXT_KEX_MODE_FLAG_KE;
591 }
592 #endif
593
594 return 1;
595 }
596
597 /*
598 * Process a key_share extension received in the ClientHello. |pkt| contains
599 * the raw PACKET data for the extension. Returns 1 on success or 0 on failure.
600 */
601 int tls_parse_ctos_key_share(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
602 size_t chainidx)
603 {
604 #ifndef OPENSSL_NO_TLS1_3
605 unsigned int group_id;
606 PACKET key_share_list, encoded_pt;
607 const uint16_t *clntgroups, *srvrgroups;
608 size_t clnt_num_groups, srvr_num_groups;
609 int found = 0;
610
611 if (s->hit && (s->ext.psk_kex_mode & TLSEXT_KEX_MODE_FLAG_KE_DHE) == 0)
612 return 1;
613
614 /* Sanity check */
615 if (s->s3->peer_tmp != NULL) {
616 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_KEY_SHARE,
617 ERR_R_INTERNAL_ERROR);
618 return 0;
619 }
620
621 if (!PACKET_as_length_prefixed_2(pkt, &key_share_list)) {
622 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_KEY_SHARE,
623 SSL_R_LENGTH_MISMATCH);
624 return 0;
625 }
626
627 /* Get our list of supported groups */
628 tls1_get_supported_groups(s, &srvrgroups, &srvr_num_groups);
629 /* Get the clients list of supported groups. */
630 tls1_get_peer_groups(s, &clntgroups, &clnt_num_groups);
631 if (clnt_num_groups == 0) {
632 /*
633 * This can only happen if the supported_groups extension was not sent,
634 * because we verify that the length is non-zero when we process that
635 * extension.
636 */
637 SSLfatal(s, SSL_AD_MISSING_EXTENSION, SSL_F_TLS_PARSE_CTOS_KEY_SHARE,
638 SSL_R_MISSING_SUPPORTED_GROUPS_EXTENSION);
639 return 0;
640 }
641
642 if (s->s3->group_id != 0 && PACKET_remaining(&key_share_list) == 0) {
643 /*
644 * If we set a group_id already, then we must have sent an HRR
645 * requesting a new key_share. If we haven't got one then that is an
646 * error
647 */
648 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_CTOS_KEY_SHARE,
649 SSL_R_BAD_KEY_SHARE);
650 return 0;
651 }
652
653 while (PACKET_remaining(&key_share_list) > 0) {
654 if (!PACKET_get_net_2(&key_share_list, &group_id)
655 || !PACKET_get_length_prefixed_2(&key_share_list, &encoded_pt)
656 || PACKET_remaining(&encoded_pt) == 0) {
657 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_KEY_SHARE,
658 SSL_R_LENGTH_MISMATCH);
659 return 0;
660 }
661
662 /*
663 * If we already found a suitable key_share we loop through the
664 * rest to verify the structure, but don't process them.
665 */
666 if (found)
667 continue;
668
669 /*
670 * If we sent an HRR then the key_share sent back MUST be for the group
671 * we requested, and must be the only key_share sent.
672 */
673 if (s->s3->group_id != 0
674 && (group_id != s->s3->group_id
675 || PACKET_remaining(&key_share_list) != 0)) {
676 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
677 SSL_F_TLS_PARSE_CTOS_KEY_SHARE, SSL_R_BAD_KEY_SHARE);
678 return 0;
679 }
680
681 /* Check if this share is in supported_groups sent from client */
682 if (!check_in_list(s, group_id, clntgroups, clnt_num_groups, 0)) {
683 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
684 SSL_F_TLS_PARSE_CTOS_KEY_SHARE, SSL_R_BAD_KEY_SHARE);
685 return 0;
686 }
687
688 /* Check if this share is for a group we can use */
689 if (!check_in_list(s, group_id, srvrgroups, srvr_num_groups, 1)) {
690 /* Share not suitable */
691 continue;
692 }
693
694 if ((s->s3->peer_tmp = ssl_generate_param_group(group_id)) == NULL) {
695 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_KEY_SHARE,
696 SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS);
697 return 0;
698 }
699
700 s->s3->group_id = group_id;
701
702 if (!EVP_PKEY_set1_tls_encodedpoint(s->s3->peer_tmp,
703 PACKET_data(&encoded_pt),
704 PACKET_remaining(&encoded_pt))) {
705 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
706 SSL_F_TLS_PARSE_CTOS_KEY_SHARE, SSL_R_BAD_ECPOINT);
707 return 0;
708 }
709
710 found = 1;
711 }
712 #endif
713
714 return 1;
715 }
716
717 int tls_parse_ctos_cookie(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
718 size_t chainidx)
719 {
720 unsigned int format, version, key_share, group_id;
721 EVP_MD_CTX *hctx;
722 EVP_PKEY *pkey;
723 PACKET cookie, raw, chhash, appcookie;
724 WPACKET hrrpkt;
725 const unsigned char *data, *mdin, *ciphdata;
726 unsigned char hmac[SHA256_DIGEST_LENGTH];
727 unsigned char hrr[MAX_HRR_SIZE];
728 size_t rawlen, hmaclen, hrrlen, ciphlen;
729 unsigned long tm, now;
730
731 /* Ignore any cookie if we're not set up to verify it */
732 if (s->ctx->app_verify_cookie_cb == NULL
733 || (s->s3->flags & TLS1_FLAGS_STATELESS) == 0)
734 return 1;
735
736 if (!PACKET_as_length_prefixed_2(pkt, &cookie)) {
737 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
738 SSL_R_LENGTH_MISMATCH);
739 return 0;
740 }
741
742 raw = cookie;
743 data = PACKET_data(&raw);
744 rawlen = PACKET_remaining(&raw);
745 if (rawlen < SHA256_DIGEST_LENGTH
746 || !PACKET_forward(&raw, rawlen - SHA256_DIGEST_LENGTH)) {
747 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
748 SSL_R_LENGTH_MISMATCH);
749 return 0;
750 }
751 mdin = PACKET_data(&raw);
752
753 /* Verify the HMAC of the cookie */
754 hctx = EVP_MD_CTX_create();
755 pkey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL,
756 s->session_ctx->ext.cookie_hmac_key,
757 sizeof(s->session_ctx->ext.cookie_hmac_key));
758 if (hctx == NULL || pkey == NULL) {
759 EVP_MD_CTX_free(hctx);
760 EVP_PKEY_free(pkey);
761 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
762 ERR_R_MALLOC_FAILURE);
763 return 0;
764 }
765
766 hmaclen = SHA256_DIGEST_LENGTH;
767 if (EVP_DigestSignInit(hctx, NULL, EVP_sha256(), NULL, pkey) <= 0
768 || EVP_DigestSign(hctx, hmac, &hmaclen, data,
769 rawlen - SHA256_DIGEST_LENGTH) <= 0
770 || hmaclen != SHA256_DIGEST_LENGTH) {
771 EVP_MD_CTX_free(hctx);
772 EVP_PKEY_free(pkey);
773 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
774 ERR_R_INTERNAL_ERROR);
775 return 0;
776 }
777
778 EVP_MD_CTX_free(hctx);
779 EVP_PKEY_free(pkey);
780
781 if (CRYPTO_memcmp(hmac, mdin, SHA256_DIGEST_LENGTH) != 0) {
782 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_CTOS_COOKIE,
783 SSL_R_COOKIE_MISMATCH);
784 return 0;
785 }
786
787 if (!PACKET_get_net_2(&cookie, &format)) {
788 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
789 SSL_R_LENGTH_MISMATCH);
790 return 0;
791 }
792 /* Check the cookie format is something we recognise. Ignore it if not */
793 if (format != COOKIE_STATE_FORMAT_VERSION)
794 return 1;
795
796 /*
797 * The rest of these checks really shouldn't fail since we have verified the
798 * HMAC above.
799 */
800
801 /* Check the version number is sane */
802 if (!PACKET_get_net_2(&cookie, &version)) {
803 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
804 SSL_R_LENGTH_MISMATCH);
805 return 0;
806 }
807 if (version != TLS1_3_VERSION) {
808 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_CTOS_COOKIE,
809 SSL_R_BAD_PROTOCOL_VERSION_NUMBER);
810 return 0;
811 }
812
813 if (!PACKET_get_net_2(&cookie, &group_id)) {
814 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
815 SSL_R_LENGTH_MISMATCH);
816 return 0;
817 }
818
819 ciphdata = PACKET_data(&cookie);
820 if (!PACKET_forward(&cookie, 2)) {
821 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
822 SSL_R_LENGTH_MISMATCH);
823 return 0;
824 }
825 if (group_id != s->s3->group_id
826 || s->s3->tmp.new_cipher
827 != ssl_get_cipher_by_char(s, ciphdata, 0)) {
828 /*
829 * We chose a different cipher or group id this time around to what is
830 * in the cookie. Something must have changed.
831 */
832 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_CTOS_COOKIE,
833 SSL_R_BAD_CIPHER);
834 return 0;
835 }
836
837 if (!PACKET_get_1(&cookie, &key_share)
838 || !PACKET_get_net_4(&cookie, &tm)
839 || !PACKET_get_length_prefixed_2(&cookie, &chhash)
840 || !PACKET_get_length_prefixed_1(&cookie, &appcookie)
841 || PACKET_remaining(&cookie) != SHA256_DIGEST_LENGTH) {
842 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
843 SSL_R_LENGTH_MISMATCH);
844 return 0;
845 }
846
847 /* We tolerate a cookie age of up to 10 minutes (= 60 * 10 seconds) */
848 now = (unsigned long)time(NULL);
849 if (tm > now || (now - tm) > 600) {
850 /* Cookie is stale. Ignore it */
851 return 1;
852 }
853
854 /* Verify the app cookie */
855 if (s->ctx->app_verify_cookie_cb(s, PACKET_data(&appcookie),
856 PACKET_remaining(&appcookie)) == 0) {
857 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_CTOS_COOKIE,
858 SSL_R_COOKIE_MISMATCH);
859 return 0;
860 }
861
862 /*
863 * Reconstruct the HRR that we would have sent in response to the original
864 * ClientHello so we can add it to the transcript hash.
865 * Note: This won't work with custom HRR extensions
866 */
867 if (!WPACKET_init_static_len(&hrrpkt, hrr, sizeof(hrr), 0)) {
868 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
869 ERR_R_INTERNAL_ERROR);
870 return 0;
871 }
872 if (!WPACKET_put_bytes_u8(&hrrpkt, SSL3_MT_SERVER_HELLO)
873 || !WPACKET_start_sub_packet_u24(&hrrpkt)
874 || !WPACKET_put_bytes_u16(&hrrpkt, TLS1_2_VERSION)
875 || !WPACKET_memcpy(&hrrpkt, hrrrandom, SSL3_RANDOM_SIZE)
876 || !WPACKET_sub_memcpy_u8(&hrrpkt, s->tmp_session_id,
877 s->tmp_session_id_len)
878 || !s->method->put_cipher_by_char(s->s3->tmp.new_cipher, &hrrpkt,
879 &ciphlen)
880 || !WPACKET_put_bytes_u8(&hrrpkt, 0)
881 || !WPACKET_start_sub_packet_u16(&hrrpkt)) {
882 WPACKET_cleanup(&hrrpkt);
883 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
884 ERR_R_INTERNAL_ERROR);
885 return 0;
886 }
887 if (!WPACKET_put_bytes_u16(&hrrpkt, TLSEXT_TYPE_supported_versions)
888 || !WPACKET_start_sub_packet_u16(&hrrpkt)
889 /* TODO(TLS1.3): Fix this before release */
890 || !WPACKET_put_bytes_u16(&hrrpkt, TLS1_3_VERSION_DRAFT)
891 || !WPACKET_close(&hrrpkt)) {
892 WPACKET_cleanup(&hrrpkt);
893 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
894 ERR_R_INTERNAL_ERROR);
895 return 0;
896 }
897 if (key_share) {
898 if (!WPACKET_put_bytes_u16(&hrrpkt, TLSEXT_TYPE_key_share)
899 || !WPACKET_start_sub_packet_u16(&hrrpkt)
900 || !WPACKET_put_bytes_u16(&hrrpkt, s->s3->group_id)
901 || !WPACKET_close(&hrrpkt)) {
902 WPACKET_cleanup(&hrrpkt);
903 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
904 ERR_R_INTERNAL_ERROR);
905 return 0;
906 }
907 }
908 if (!WPACKET_put_bytes_u16(&hrrpkt, TLSEXT_TYPE_cookie)
909 || !WPACKET_start_sub_packet_u16(&hrrpkt)
910 || !WPACKET_sub_memcpy_u16(&hrrpkt, data, rawlen)
911 || !WPACKET_close(&hrrpkt) /* cookie extension */
912 || !WPACKET_close(&hrrpkt) /* extension block */
913 || !WPACKET_close(&hrrpkt) /* message */
914 || !WPACKET_get_total_written(&hrrpkt, &hrrlen)
915 || !WPACKET_finish(&hrrpkt)) {
916 WPACKET_cleanup(&hrrpkt);
917 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
918 ERR_R_INTERNAL_ERROR);
919 return 0;
920 }
921
922 /* Reconstruct the transcript hash */
923 if (!create_synthetic_message_hash(s, PACKET_data(&chhash),
924 PACKET_remaining(&chhash), hrr,
925 hrrlen)) {
926 /* SSLfatal() already called */
927 return 0;
928 }
929
930 /* Act as if this ClientHello came after a HelloRetryRequest */
931 s->hello_retry_request = 1;
932
933 s->ext.cookieok = 1;
934
935 return 1;
936 }
937
938 #ifndef OPENSSL_NO_EC
939 int tls_parse_ctos_supported_groups(SSL *s, PACKET *pkt, unsigned int context,
940 X509 *x, size_t chainidx)
941 {
942 PACKET supported_groups_list;
943
944 /* Each group is 2 bytes and we must have at least 1. */
945 if (!PACKET_as_length_prefixed_2(pkt, &supported_groups_list)
946 || PACKET_remaining(&supported_groups_list) == 0
947 || (PACKET_remaining(&supported_groups_list) % 2) != 0) {
948 SSLfatal(s, SSL_AD_DECODE_ERROR,
949 SSL_F_TLS_PARSE_CTOS_SUPPORTED_GROUPS, SSL_R_BAD_EXTENSION);
950 return 0;
951 }
952
953 if (!s->hit || SSL_IS_TLS13(s)) {
954 OPENSSL_free(s->session->ext.supportedgroups);
955 s->session->ext.supportedgroups = NULL;
956 s->session->ext.supportedgroups_len = 0;
957 if (!tls1_save_u16(&supported_groups_list,
958 &s->session->ext.supportedgroups,
959 &s->session->ext.supportedgroups_len)) {
960 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
961 SSL_F_TLS_PARSE_CTOS_SUPPORTED_GROUPS,
962 ERR_R_INTERNAL_ERROR);
963 return 0;
964 }
965 }
966
967 return 1;
968 }
969 #endif
970
971 int tls_parse_ctos_ems(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
972 size_t chainidx)
973 {
974 /* The extension must always be empty */
975 if (PACKET_remaining(pkt) != 0) {
976 SSLfatal(s, SSL_AD_DECODE_ERROR,
977 SSL_F_TLS_PARSE_CTOS_EMS, SSL_R_BAD_EXTENSION);
978 return 0;
979 }
980
981 s->s3->flags |= TLS1_FLAGS_RECEIVED_EXTMS;
982
983 return 1;
984 }
985
986
987 int tls_parse_ctos_early_data(SSL *s, PACKET *pkt, unsigned int context,
988 X509 *x, size_t chainidx)
989 {
990 if (PACKET_remaining(pkt) != 0) {
991 SSLfatal(s, SSL_AD_DECODE_ERROR,
992 SSL_F_TLS_PARSE_CTOS_EARLY_DATA, SSL_R_BAD_EXTENSION);
993 return 0;
994 }
995
996 if (s->hello_retry_request != SSL_HRR_NONE) {
997 SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
998 SSL_F_TLS_PARSE_CTOS_EARLY_DATA, SSL_R_BAD_EXTENSION);
999 return 0;
1000 }
1001
1002 return 1;
1003 }
1004
1005 int tls_parse_ctos_psk(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
1006 size_t chainidx)
1007 {
1008 PACKET identities, binders, binder;
1009 size_t binderoffset, hashsize;
1010 SSL_SESSION *sess = NULL;
1011 unsigned int id, i, ext = 0;
1012 const EVP_MD *md = NULL;
1013
1014 /*
1015 * If we have no PSK kex mode that we recognise then we can't resume so
1016 * ignore this extension
1017 */
1018 if ((s->ext.psk_kex_mode
1019 & (TLSEXT_KEX_MODE_FLAG_KE | TLSEXT_KEX_MODE_FLAG_KE_DHE)) == 0)
1020 return 1;
1021
1022 if (!PACKET_get_length_prefixed_2(pkt, &identities)) {
1023 SSLfatal(s, SSL_AD_DECODE_ERROR,
1024 SSL_F_TLS_PARSE_CTOS_PSK, SSL_R_BAD_EXTENSION);
1025 return 0;
1026 }
1027
1028 for (id = 0; PACKET_remaining(&identities) != 0; id++) {
1029 PACKET identity;
1030 unsigned long ticket_agel;
1031
1032 if (!PACKET_get_length_prefixed_2(&identities, &identity)
1033 || !PACKET_get_net_4(&identities, &ticket_agel)) {
1034 SSLfatal(s, SSL_AD_DECODE_ERROR,
1035 SSL_F_TLS_PARSE_CTOS_PSK, SSL_R_BAD_EXTENSION);
1036 return 0;
1037 }
1038
1039 if (s->psk_find_session_cb != NULL
1040 && !s->psk_find_session_cb(s, PACKET_data(&identity),
1041 PACKET_remaining(&identity),
1042 &sess)) {
1043 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1044 SSL_F_TLS_PARSE_CTOS_PSK, SSL_R_BAD_EXTENSION);
1045 return 0;
1046 }
1047
1048 if (sess != NULL) {
1049 /* We found a PSK */
1050 SSL_SESSION *sesstmp = ssl_session_dup(sess, 0);
1051
1052 if (sesstmp == NULL) {
1053 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1054 SSL_F_TLS_PARSE_CTOS_PSK, ERR_R_INTERNAL_ERROR);
1055 return 0;
1056 }
1057 SSL_SESSION_free(sess);
1058 sess = sesstmp;
1059
1060 /*
1061 * We've just been told to use this session for this context so
1062 * make sure the sid_ctx matches up.
1063 */
1064 memcpy(sess->sid_ctx, s->sid_ctx, s->sid_ctx_length);
1065 sess->sid_ctx_length = s->sid_ctx_length;
1066 ext = 1;
1067 if (id == 0)
1068 s->ext.early_data_ok = 1;
1069 } else {
1070 uint32_t ticket_age = 0, now, agesec, agems;
1071 int ret = tls_decrypt_ticket(s, PACKET_data(&identity),
1072 PACKET_remaining(&identity), NULL, 0,
1073 &sess);
1074
1075 if (ret == TICKET_FATAL_ERR_MALLOC
1076 || ret == TICKET_FATAL_ERR_OTHER) {
1077 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1078 SSL_F_TLS_PARSE_CTOS_PSK, ERR_R_INTERNAL_ERROR);
1079 return 0;
1080 }
1081 if (ret == TICKET_NO_DECRYPT)
1082 continue;
1083
1084 ticket_age = (uint32_t)ticket_agel;
1085 now = (uint32_t)time(NULL);
1086 agesec = now - (uint32_t)sess->time;
1087 agems = agesec * (uint32_t)1000;
1088 ticket_age -= sess->ext.tick_age_add;
1089
1090 /*
1091 * For simplicity we do our age calculations in seconds. If the
1092 * client does it in ms then it could appear that their ticket age
1093 * is longer than ours (our ticket age calculation should always be
1094 * slightly longer than the client's due to the network latency).
1095 * Therefore we add 1000ms to our age calculation to adjust for
1096 * rounding errors.
1097 */
1098 if (id == 0
1099 && sess->timeout >= (long)agesec
1100 && agems / (uint32_t)1000 == agesec
1101 && ticket_age <= agems + 1000
1102 && ticket_age + TICKET_AGE_ALLOWANCE >= agems + 1000) {
1103 /*
1104 * Ticket age is within tolerance and not expired. We allow it
1105 * for early data
1106 */
1107 s->ext.early_data_ok = 1;
1108 }
1109 }
1110
1111 md = ssl_md(sess->cipher->algorithm2);
1112 if (md != ssl_md(s->s3->tmp.new_cipher->algorithm2)) {
1113 /* The ciphersuite is not compatible with this session. */
1114 SSL_SESSION_free(sess);
1115 sess = NULL;
1116 s->ext.early_data_ok = 0;
1117 continue;
1118 }
1119 break;
1120 }
1121
1122 if (sess == NULL)
1123 return 1;
1124
1125 binderoffset = PACKET_data(pkt) - (const unsigned char *)s->init_buf->data;
1126 hashsize = EVP_MD_size(md);
1127
1128 if (!PACKET_get_length_prefixed_2(pkt, &binders)) {
1129 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_PSK,
1130 SSL_R_BAD_EXTENSION);
1131 goto err;
1132 }
1133
1134 for (i = 0; i <= id; i++) {
1135 if (!PACKET_get_length_prefixed_1(&binders, &binder)) {
1136 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_PSK,
1137 SSL_R_BAD_EXTENSION);
1138 goto err;
1139 }
1140 }
1141
1142 if (PACKET_remaining(&binder) != hashsize) {
1143 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_PSK,
1144 SSL_R_BAD_EXTENSION);
1145 goto err;
1146 }
1147 if (tls_psk_do_binder(s, md, (const unsigned char *)s->init_buf->data,
1148 binderoffset, PACKET_data(&binder), NULL, sess, 0,
1149 ext) != 1) {
1150 /* SSLfatal() already called */
1151 goto err;
1152 }
1153
1154 sess->ext.tick_identity = id;
1155
1156 SSL_SESSION_free(s->session);
1157 s->session = sess;
1158 return 1;
1159 err:
1160 SSL_SESSION_free(sess);
1161 return 0;
1162 }
1163
1164 /*
1165 * Add the server's renegotiation binding
1166 */
1167 EXT_RETURN tls_construct_stoc_renegotiate(SSL *s, WPACKET *pkt,
1168 unsigned int context, X509 *x,
1169 size_t chainidx)
1170 {
1171 if (!s->s3->send_connection_binding)
1172 return EXT_RETURN_NOT_SENT;
1173
1174 /* Still add this even if SSL_OP_NO_RENEGOTIATION is set */
1175 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_renegotiate)
1176 || !WPACKET_start_sub_packet_u16(pkt)
1177 || !WPACKET_start_sub_packet_u8(pkt)
1178 || !WPACKET_memcpy(pkt, s->s3->previous_client_finished,
1179 s->s3->previous_client_finished_len)
1180 || !WPACKET_memcpy(pkt, s->s3->previous_server_finished,
1181 s->s3->previous_server_finished_len)
1182 || !WPACKET_close(pkt)
1183 || !WPACKET_close(pkt)) {
1184 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_RENEGOTIATE,
1185 ERR_R_INTERNAL_ERROR);
1186 return EXT_RETURN_FAIL;
1187 }
1188
1189 return EXT_RETURN_SENT;
1190 }
1191
1192 EXT_RETURN tls_construct_stoc_server_name(SSL *s, WPACKET *pkt,
1193 unsigned int context, X509 *x,
1194 size_t chainidx)
1195 {
1196 if (s->hit || s->servername_done != 1
1197 || s->session->ext.hostname == NULL)
1198 return EXT_RETURN_NOT_SENT;
1199
1200 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_server_name)
1201 || !WPACKET_put_bytes_u16(pkt, 0)) {
1202 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_SERVER_NAME,
1203 ERR_R_INTERNAL_ERROR);
1204 return EXT_RETURN_FAIL;
1205 }
1206
1207 return EXT_RETURN_SENT;
1208 }
1209
1210 /* Add/include the server's max fragment len extension into ServerHello */
1211 EXT_RETURN tls_construct_stoc_maxfragmentlen(SSL *s, WPACKET *pkt,
1212 unsigned int context, X509 *x,
1213 size_t chainidx)
1214 {
1215 if (!USE_MAX_FRAGMENT_LENGTH_EXT(s->session))
1216 return EXT_RETURN_NOT_SENT;
1217
1218 /*-
1219 * 4 bytes for this extension type and extension length
1220 * 1 byte for the Max Fragment Length code value.
1221 */
1222 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_max_fragment_length)
1223 || !WPACKET_start_sub_packet_u16(pkt)
1224 || !WPACKET_put_bytes_u8(pkt, s->session->ext.max_fragment_len_mode)
1225 || !WPACKET_close(pkt)) {
1226 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1227 SSL_F_TLS_CONSTRUCT_STOC_MAXFRAGMENTLEN, ERR_R_INTERNAL_ERROR);
1228 return EXT_RETURN_FAIL;
1229 }
1230
1231 return EXT_RETURN_SENT;
1232 }
1233
1234 #ifndef OPENSSL_NO_EC
1235 EXT_RETURN tls_construct_stoc_ec_pt_formats(SSL *s, WPACKET *pkt,
1236 unsigned int context, X509 *x,
1237 size_t chainidx)
1238 {
1239 unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1240 unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1241 int using_ecc = ((alg_k & SSL_kECDHE) || (alg_a & SSL_aECDSA))
1242 && (s->session->ext.ecpointformats != NULL);
1243 const unsigned char *plist;
1244 size_t plistlen;
1245
1246 if (!using_ecc)
1247 return EXT_RETURN_NOT_SENT;
1248
1249 tls1_get_formatlist(s, &plist, &plistlen);
1250 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_ec_point_formats)
1251 || !WPACKET_start_sub_packet_u16(pkt)
1252 || !WPACKET_sub_memcpy_u8(pkt, plist, plistlen)
1253 || !WPACKET_close(pkt)) {
1254 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1255 SSL_F_TLS_CONSTRUCT_STOC_EC_PT_FORMATS, ERR_R_INTERNAL_ERROR);
1256 return EXT_RETURN_FAIL;
1257 }
1258
1259 return EXT_RETURN_SENT;
1260 }
1261 #endif
1262
1263 #ifndef OPENSSL_NO_EC
1264 EXT_RETURN tls_construct_stoc_supported_groups(SSL *s, WPACKET *pkt,
1265 unsigned int context, X509 *x,
1266 size_t chainidx)
1267 {
1268 const uint16_t *groups;
1269 size_t numgroups, i, first = 1;
1270
1271 /* s->s3->group_id is non zero if we accepted a key_share */
1272 if (s->s3->group_id == 0)
1273 return EXT_RETURN_NOT_SENT;
1274
1275 /* Get our list of supported groups */
1276 tls1_get_supported_groups(s, &groups, &numgroups);
1277 if (numgroups == 0) {
1278 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1279 SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_GROUPS, ERR_R_INTERNAL_ERROR);
1280 return EXT_RETURN_FAIL;
1281 }
1282
1283 /* Copy group ID if supported */
1284 for (i = 0; i < numgroups; i++) {
1285 uint16_t group = groups[i];
1286
1287 if (tls_curve_allowed(s, group, SSL_SECOP_CURVE_SUPPORTED)) {
1288 if (first) {
1289 /*
1290 * Check if the client is already using our preferred group. If
1291 * so we don't need to add this extension
1292 */
1293 if (s->s3->group_id == group)
1294 return EXT_RETURN_NOT_SENT;
1295
1296 /* Add extension header */
1297 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_groups)
1298 /* Sub-packet for supported_groups extension */
1299 || !WPACKET_start_sub_packet_u16(pkt)
1300 || !WPACKET_start_sub_packet_u16(pkt)) {
1301 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1302 SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_GROUPS,
1303 ERR_R_INTERNAL_ERROR);
1304 return EXT_RETURN_FAIL;
1305 }
1306
1307 first = 0;
1308 }
1309 if (!WPACKET_put_bytes_u16(pkt, group)) {
1310 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1311 SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_GROUPS,
1312 ERR_R_INTERNAL_ERROR);
1313 return EXT_RETURN_FAIL;
1314 }
1315 }
1316 }
1317
1318 if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) {
1319 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1320 SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_GROUPS,
1321 ERR_R_INTERNAL_ERROR);
1322 return EXT_RETURN_FAIL;
1323 }
1324
1325 return EXT_RETURN_SENT;
1326 }
1327 #endif
1328
1329 EXT_RETURN tls_construct_stoc_session_ticket(SSL *s, WPACKET *pkt,
1330 unsigned int context, X509 *x,
1331 size_t chainidx)
1332 {
1333 if (!s->ext.ticket_expected || !tls_use_ticket(s)) {
1334 s->ext.ticket_expected = 0;
1335 return EXT_RETURN_NOT_SENT;
1336 }
1337
1338 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_session_ticket)
1339 || !WPACKET_put_bytes_u16(pkt, 0)) {
1340 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1341 SSL_F_TLS_CONSTRUCT_STOC_SESSION_TICKET, ERR_R_INTERNAL_ERROR);
1342 return EXT_RETURN_FAIL;
1343 }
1344
1345 return EXT_RETURN_SENT;
1346 }
1347
1348 #ifndef OPENSSL_NO_OCSP
1349 EXT_RETURN tls_construct_stoc_status_request(SSL *s, WPACKET *pkt,
1350 unsigned int context, X509 *x,
1351 size_t chainidx)
1352 {
1353 if (!s->ext.status_expected)
1354 return EXT_RETURN_NOT_SENT;
1355
1356 if (SSL_IS_TLS13(s) && chainidx != 0)
1357 return EXT_RETURN_NOT_SENT;
1358
1359 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_status_request)
1360 || !WPACKET_start_sub_packet_u16(pkt)) {
1361 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1362 SSL_F_TLS_CONSTRUCT_STOC_STATUS_REQUEST, ERR_R_INTERNAL_ERROR);
1363 return EXT_RETURN_FAIL;
1364 }
1365
1366 /*
1367 * In TLSv1.3 we include the certificate status itself. In <= TLSv1.2 we
1368 * send back an empty extension, with the certificate status appearing as a
1369 * separate message
1370 */
1371 if (SSL_IS_TLS13(s) && !tls_construct_cert_status_body(s, pkt)) {
1372 /* SSLfatal() already called */
1373 return EXT_RETURN_FAIL;
1374 }
1375 if (!WPACKET_close(pkt)) {
1376 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1377 SSL_F_TLS_CONSTRUCT_STOC_STATUS_REQUEST, ERR_R_INTERNAL_ERROR);
1378 return EXT_RETURN_FAIL;
1379 }
1380
1381 return EXT_RETURN_SENT;
1382 }
1383 #endif
1384
1385 #ifndef OPENSSL_NO_NEXTPROTONEG
1386 EXT_RETURN tls_construct_stoc_next_proto_neg(SSL *s, WPACKET *pkt,
1387 unsigned int context, X509 *x,
1388 size_t chainidx)
1389 {
1390 const unsigned char *npa;
1391 unsigned int npalen;
1392 int ret;
1393 int npn_seen = s->s3->npn_seen;
1394
1395 s->s3->npn_seen = 0;
1396 if (!npn_seen || s->ctx->ext.npn_advertised_cb == NULL)
1397 return EXT_RETURN_NOT_SENT;
1398
1399 ret = s->ctx->ext.npn_advertised_cb(s, &npa, &npalen,
1400 s->ctx->ext.npn_advertised_cb_arg);
1401 if (ret == SSL_TLSEXT_ERR_OK) {
1402 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_next_proto_neg)
1403 || !WPACKET_sub_memcpy_u16(pkt, npa, npalen)) {
1404 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1405 SSL_F_TLS_CONSTRUCT_STOC_NEXT_PROTO_NEG,
1406 ERR_R_INTERNAL_ERROR);
1407 return EXT_RETURN_FAIL;
1408 }
1409 s->s3->npn_seen = 1;
1410 }
1411
1412 return EXT_RETURN_SENT;
1413 }
1414 #endif
1415
1416 EXT_RETURN tls_construct_stoc_alpn(SSL *s, WPACKET *pkt, unsigned int context,
1417 X509 *x, size_t chainidx)
1418 {
1419 if (s->s3->alpn_selected == NULL)
1420 return EXT_RETURN_NOT_SENT;
1421
1422 if (!WPACKET_put_bytes_u16(pkt,
1423 TLSEXT_TYPE_application_layer_protocol_negotiation)
1424 || !WPACKET_start_sub_packet_u16(pkt)
1425 || !WPACKET_start_sub_packet_u16(pkt)
1426 || !WPACKET_sub_memcpy_u8(pkt, s->s3->alpn_selected,
1427 s->s3->alpn_selected_len)
1428 || !WPACKET_close(pkt)
1429 || !WPACKET_close(pkt)) {
1430 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1431 SSL_F_TLS_CONSTRUCT_STOC_ALPN, ERR_R_INTERNAL_ERROR);
1432 return EXT_RETURN_FAIL;
1433 }
1434
1435 return EXT_RETURN_SENT;
1436 }
1437
1438 #ifndef OPENSSL_NO_SRTP
1439 EXT_RETURN tls_construct_stoc_use_srtp(SSL *s, WPACKET *pkt,
1440 unsigned int context, X509 *x,
1441 size_t chainidx)
1442 {
1443 if (s->srtp_profile == NULL)
1444 return EXT_RETURN_NOT_SENT;
1445
1446 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_use_srtp)
1447 || !WPACKET_start_sub_packet_u16(pkt)
1448 || !WPACKET_put_bytes_u16(pkt, 2)
1449 || !WPACKET_put_bytes_u16(pkt, s->srtp_profile->id)
1450 || !WPACKET_put_bytes_u8(pkt, 0)
1451 || !WPACKET_close(pkt)) {
1452 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_USE_SRTP,
1453 ERR_R_INTERNAL_ERROR);
1454 return EXT_RETURN_FAIL;
1455 }
1456
1457 return EXT_RETURN_SENT;
1458 }
1459 #endif
1460
1461 EXT_RETURN tls_construct_stoc_etm(SSL *s, WPACKET *pkt, unsigned int context,
1462 X509 *x, size_t chainidx)
1463 {
1464 if (!s->ext.use_etm)
1465 return EXT_RETURN_NOT_SENT;
1466
1467 /*
1468 * Don't use encrypt_then_mac if AEAD or RC4 might want to disable
1469 * for other cases too.
1470 */
1471 if (s->s3->tmp.new_cipher->algorithm_mac == SSL_AEAD
1472 || s->s3->tmp.new_cipher->algorithm_enc == SSL_RC4
1473 || s->s3->tmp.new_cipher->algorithm_enc == SSL_eGOST2814789CNT
1474 || s->s3->tmp.new_cipher->algorithm_enc == SSL_eGOST2814789CNT12) {
1475 s->ext.use_etm = 0;
1476 return EXT_RETURN_NOT_SENT;
1477 }
1478
1479 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_encrypt_then_mac)
1480 || !WPACKET_put_bytes_u16(pkt, 0)) {
1481 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_ETM,
1482 ERR_R_INTERNAL_ERROR);
1483 return EXT_RETURN_FAIL;
1484 }
1485
1486 return EXT_RETURN_SENT;
1487 }
1488
1489 EXT_RETURN tls_construct_stoc_ems(SSL *s, WPACKET *pkt, unsigned int context,
1490 X509 *x, size_t chainidx)
1491 {
1492 if ((s->s3->flags & TLS1_FLAGS_RECEIVED_EXTMS) == 0)
1493 return EXT_RETURN_NOT_SENT;
1494
1495 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_extended_master_secret)
1496 || !WPACKET_put_bytes_u16(pkt, 0)) {
1497 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_EMS,
1498 ERR_R_INTERNAL_ERROR);
1499 return EXT_RETURN_FAIL;
1500 }
1501
1502 return EXT_RETURN_SENT;
1503 }
1504
1505 EXT_RETURN tls_construct_stoc_supported_versions(SSL *s, WPACKET *pkt,
1506 unsigned int context, X509 *x,
1507 size_t chainidx)
1508 {
1509 if (!SSL_IS_TLS13(s))
1510 return EXT_RETURN_NOT_SENT;
1511
1512 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_versions)
1513 || !WPACKET_start_sub_packet_u16(pkt)
1514 /* TODO(TLS1.3): Update to remove the TLSv1.3 draft indicator */
1515 || !WPACKET_put_bytes_u16(pkt, TLS1_3_VERSION_DRAFT)
1516 || !WPACKET_close(pkt)) {
1517 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1518 SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_VERSIONS,
1519 ERR_R_INTERNAL_ERROR);
1520 return EXT_RETURN_FAIL;
1521 }
1522
1523 return EXT_RETURN_SENT;
1524 }
1525
1526 EXT_RETURN tls_construct_stoc_key_share(SSL *s, WPACKET *pkt,
1527 unsigned int context, X509 *x,
1528 size_t chainidx)
1529 {
1530 #ifndef OPENSSL_NO_TLS1_3
1531 unsigned char *encodedPoint;
1532 size_t encoded_pt_len = 0;
1533 EVP_PKEY *ckey = s->s3->peer_tmp, *skey = NULL;
1534
1535 if (s->hello_retry_request == SSL_HRR_PENDING) {
1536 if (ckey != NULL) {
1537 /* Original key_share was acceptable so don't ask for another one */
1538 return EXT_RETURN_NOT_SENT;
1539 }
1540 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_key_share)
1541 || !WPACKET_start_sub_packet_u16(pkt)
1542 || !WPACKET_put_bytes_u16(pkt, s->s3->group_id)
1543 || !WPACKET_close(pkt)) {
1544 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1545 SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE,
1546 ERR_R_INTERNAL_ERROR);
1547 return EXT_RETURN_FAIL;
1548 }
1549
1550 return EXT_RETURN_SENT;
1551 }
1552
1553 if (ckey == NULL) {
1554 /* No key_share received from client - must be resuming */
1555 if (!s->hit || !tls13_generate_handshake_secret(s, NULL, 0)) {
1556 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1557 SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE, ERR_R_INTERNAL_ERROR);
1558 return EXT_RETURN_FAIL;
1559 }
1560 return EXT_RETURN_NOT_SENT;
1561 }
1562
1563 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_key_share)
1564 || !WPACKET_start_sub_packet_u16(pkt)
1565 || !WPACKET_put_bytes_u16(pkt, s->s3->group_id)) {
1566 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1567 SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE, ERR_R_INTERNAL_ERROR);
1568 return EXT_RETURN_FAIL;
1569 }
1570
1571 skey = ssl_generate_pkey(ckey);
1572 if (skey == NULL) {
1573 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE,
1574 ERR_R_MALLOC_FAILURE);
1575 return EXT_RETURN_FAIL;
1576 }
1577
1578 /* Generate encoding of server key */
1579 encoded_pt_len = EVP_PKEY_get1_tls_encodedpoint(skey, &encodedPoint);
1580 if (encoded_pt_len == 0) {
1581 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE,
1582 ERR_R_EC_LIB);
1583 EVP_PKEY_free(skey);
1584 return EXT_RETURN_FAIL;
1585 }
1586
1587 if (!WPACKET_sub_memcpy_u16(pkt, encodedPoint, encoded_pt_len)
1588 || !WPACKET_close(pkt)) {
1589 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE,
1590 ERR_R_INTERNAL_ERROR);
1591 EVP_PKEY_free(skey);
1592 OPENSSL_free(encodedPoint);
1593 return EXT_RETURN_FAIL;
1594 }
1595 OPENSSL_free(encodedPoint);
1596
1597 /* This causes the crypto state to be updated based on the derived keys */
1598 s->s3->tmp.pkey = skey;
1599 if (ssl_derive(s, skey, ckey, 1) == 0) {
1600 /* SSLfatal() already called */
1601 return EXT_RETURN_FAIL;
1602 }
1603 #endif
1604
1605 return EXT_RETURN_SENT;
1606 }
1607
1608 EXT_RETURN tls_construct_stoc_cookie(SSL *s, WPACKET *pkt, unsigned int context,
1609 X509 *x, size_t chainidx)
1610 {
1611 unsigned char *hashval1, *hashval2, *appcookie1, *appcookie2, *cookie;
1612 unsigned char *hmac, *hmac2;
1613 size_t startlen, ciphlen, totcookielen, hashlen, hmaclen;
1614 unsigned int appcookielen;
1615 EVP_MD_CTX *hctx;
1616 EVP_PKEY *pkey;
1617 int ret = EXT_RETURN_FAIL;
1618
1619 if (s->ctx->app_gen_cookie_cb == NULL
1620 || (s->s3->flags & TLS1_FLAGS_STATELESS) == 0)
1621 return EXT_RETURN_NOT_SENT;
1622
1623 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_cookie)
1624 || !WPACKET_start_sub_packet_u16(pkt)
1625 || !WPACKET_start_sub_packet_u16(pkt)
1626 || !WPACKET_get_total_written(pkt, &startlen)
1627 || !WPACKET_reserve_bytes(pkt, MAX_COOKIE_SIZE, &cookie)
1628 || !WPACKET_put_bytes_u16(pkt, COOKIE_STATE_FORMAT_VERSION)
1629 || !WPACKET_put_bytes_u16(pkt, TLS1_3_VERSION)
1630 || !WPACKET_put_bytes_u16(pkt, s->s3->group_id)
1631 || !s->method->put_cipher_by_char(s->s3->tmp.new_cipher, pkt,
1632 &ciphlen)
1633 /* Is there a key_share extension present in this HRR? */
1634 || !WPACKET_put_bytes_u8(pkt, s->s3->peer_tmp == NULL)
1635 || !WPACKET_put_bytes_u32(pkt, (unsigned int)time(NULL))
1636 || !WPACKET_start_sub_packet_u16(pkt)
1637 || !WPACKET_reserve_bytes(pkt, EVP_MAX_MD_SIZE, &hashval1)) {
1638 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1639 ERR_R_INTERNAL_ERROR);
1640 return EXT_RETURN_FAIL;
1641 }
1642
1643 /*
1644 * Get the hash of the initial ClientHello. ssl_handshake_hash() operates
1645 * on raw buffers, so we first reserve sufficient bytes (above) and then
1646 * subsequently allocate them (below)
1647 */
1648 if (!ssl3_digest_cached_records(s, 0)
1649 || !ssl_handshake_hash(s, hashval1, EVP_MAX_MD_SIZE, &hashlen)) {
1650 /* SSLfatal() already called */
1651 return EXT_RETURN_FAIL;
1652 }
1653
1654 if (!WPACKET_allocate_bytes(pkt, hashlen, &hashval2)
1655 || !ossl_assert(hashval1 == hashval2)
1656 || !WPACKET_close(pkt)
1657 || !WPACKET_start_sub_packet_u8(pkt)
1658 || !WPACKET_reserve_bytes(pkt, SSL_COOKIE_LENGTH, &appcookie1)) {
1659 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1660 ERR_R_INTERNAL_ERROR);
1661 return EXT_RETURN_FAIL;
1662 }
1663
1664 /* Generate the application cookie */
1665 if (s->ctx->app_gen_cookie_cb(s, appcookie1, &appcookielen) == 0) {
1666 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1667 SSL_R_COOKIE_GEN_CALLBACK_FAILURE);
1668 return EXT_RETURN_FAIL;
1669 }
1670
1671 if (!WPACKET_allocate_bytes(pkt, appcookielen, &appcookie2)
1672 || !ossl_assert(appcookie1 == appcookie2)
1673 || !WPACKET_close(pkt)
1674 || !WPACKET_get_total_written(pkt, &totcookielen)
1675 || !WPACKET_reserve_bytes(pkt, SHA256_DIGEST_LENGTH, &hmac)) {
1676 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1677 ERR_R_INTERNAL_ERROR);
1678 return EXT_RETURN_FAIL;
1679 }
1680 hmaclen = SHA256_DIGEST_LENGTH;
1681
1682 totcookielen -= startlen;
1683 if (!ossl_assert(totcookielen <= MAX_COOKIE_SIZE - SHA256_DIGEST_LENGTH)) {
1684 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1685 ERR_R_INTERNAL_ERROR);
1686 return EXT_RETURN_FAIL;
1687 }
1688
1689 /* HMAC the cookie */
1690 hctx = EVP_MD_CTX_create();
1691 pkey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL,
1692 s->session_ctx->ext.cookie_hmac_key,
1693 sizeof(s->session_ctx->ext.cookie_hmac_key));
1694 if (hctx == NULL || pkey == NULL) {
1695 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1696 ERR_R_MALLOC_FAILURE);
1697 goto err;
1698 }
1699
1700 if (EVP_DigestSignInit(hctx, NULL, EVP_sha256(), NULL, pkey) <= 0
1701 || EVP_DigestSign(hctx, hmac, &hmaclen, cookie,
1702 totcookielen) <= 0) {
1703 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1704 ERR_R_INTERNAL_ERROR);
1705 goto err;
1706 }
1707
1708 if (!ossl_assert(totcookielen + hmaclen <= MAX_COOKIE_SIZE)) {
1709 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1710 ERR_R_INTERNAL_ERROR);
1711 goto err;
1712 }
1713
1714 if (!WPACKET_allocate_bytes(pkt, hmaclen, &hmac2)
1715 || !ossl_assert(hmac == hmac2)
1716 || !ossl_assert(cookie == hmac - totcookielen)
1717 || !WPACKET_close(pkt)
1718 || !WPACKET_close(pkt)) {
1719 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1720 ERR_R_INTERNAL_ERROR);
1721 goto err;
1722 }
1723
1724 ret = EXT_RETURN_SENT;
1725
1726 err:
1727 EVP_MD_CTX_free(hctx);
1728 EVP_PKEY_free(pkey);
1729 return ret;
1730 }
1731
1732 EXT_RETURN tls_construct_stoc_cryptopro_bug(SSL *s, WPACKET *pkt,
1733 unsigned int context, X509 *x,
1734 size_t chainidx)
1735 {
1736 const unsigned char cryptopro_ext[36] = {
1737 0xfd, 0xe8, /* 65000 */
1738 0x00, 0x20, /* 32 bytes length */
1739 0x30, 0x1e, 0x30, 0x08, 0x06, 0x06, 0x2a, 0x85,
1740 0x03, 0x02, 0x02, 0x09, 0x30, 0x08, 0x06, 0x06,
1741 0x2a, 0x85, 0x03, 0x02, 0x02, 0x16, 0x30, 0x08,
1742 0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x17
1743 };
1744
1745 if (((s->s3->tmp.new_cipher->id & 0xFFFF) != 0x80
1746 && (s->s3->tmp.new_cipher->id & 0xFFFF) != 0x81)
1747 || (SSL_get_options(s) & SSL_OP_CRYPTOPRO_TLSEXT_BUG) == 0)
1748 return EXT_RETURN_NOT_SENT;
1749
1750 if (!WPACKET_memcpy(pkt, cryptopro_ext, sizeof(cryptopro_ext))) {
1751 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1752 SSL_F_TLS_CONSTRUCT_STOC_CRYPTOPRO_BUG, ERR_R_INTERNAL_ERROR);
1753 return EXT_RETURN_FAIL;
1754 }
1755
1756 return EXT_RETURN_SENT;
1757 }
1758
1759 EXT_RETURN tls_construct_stoc_early_data(SSL *s, WPACKET *pkt,
1760 unsigned int context, X509 *x,
1761 size_t chainidx)
1762 {
1763 if (context == SSL_EXT_TLS1_3_NEW_SESSION_TICKET) {
1764 if (s->max_early_data == 0)
1765 return EXT_RETURN_NOT_SENT;
1766
1767 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_early_data)
1768 || !WPACKET_start_sub_packet_u16(pkt)
1769 || !WPACKET_put_bytes_u32(pkt, s->max_early_data)
1770 || !WPACKET_close(pkt)) {
1771 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1772 SSL_F_TLS_CONSTRUCT_STOC_EARLY_DATA, ERR_R_INTERNAL_ERROR);
1773 return EXT_RETURN_FAIL;
1774 }
1775
1776 return EXT_RETURN_SENT;
1777 }
1778
1779 if (s->ext.early_data != SSL_EARLY_DATA_ACCEPTED)
1780 return EXT_RETURN_NOT_SENT;
1781
1782 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_early_data)
1783 || !WPACKET_start_sub_packet_u16(pkt)
1784 || !WPACKET_close(pkt)) {
1785 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_EARLY_DATA,
1786 ERR_R_INTERNAL_ERROR);
1787 return EXT_RETURN_FAIL;
1788 }
1789
1790 return EXT_RETURN_SENT;
1791 }
1792
1793 EXT_RETURN tls_construct_stoc_psk(SSL *s, WPACKET *pkt, unsigned int context,
1794 X509 *x, size_t chainidx)
1795 {
1796 if (!s->hit)
1797 return EXT_RETURN_NOT_SENT;
1798
1799 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_psk)
1800 || !WPACKET_start_sub_packet_u16(pkt)
1801 || !WPACKET_put_bytes_u16(pkt, s->session->ext.tick_identity)
1802 || !WPACKET_close(pkt)) {
1803 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1804 SSL_F_TLS_CONSTRUCT_STOC_PSK, ERR_R_INTERNAL_ERROR);
1805 return EXT_RETURN_FAIL;
1806 }
1807
1808 return EXT_RETURN_SENT;
1809 }