summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libssl/tls13_client.c110
-rw-r--r--src/lib/libssl/tls13_handshake.c34
-rw-r--r--src/lib/libssl/tls13_handshake.h8
-rw-r--r--src/lib/libssl/tls13_internal.h6
-rw-r--r--src/lib/libssl/tls13_server.c12
5 files changed, 104 insertions, 66 deletions
diff --git a/src/lib/libssl/tls13_client.c b/src/lib/libssl/tls13_client.c
index 0da08f62c3..dffabf1753 100644
--- a/src/lib/libssl/tls13_client.c
+++ b/src/lib/libssl/tls13_client.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_client.c,v 1.50 2020/04/21 16:55:17 jsing Exp $ */ 1/* $OpenBSD: tls13_client.c,v 1.51 2020/04/22 17:05:07 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -281,6 +281,24 @@ tls13_server_hello_is_legacy(CBS *cbs)
281} 281}
282 282
283static int 283static int
284tls13_server_hello_is_retry(CBS *cbs)
285{
286 CBS server_hello, server_random;
287 uint16_t legacy_version;
288
289 CBS_dup(cbs, &server_hello);
290
291 if (!CBS_get_u16(&server_hello, &legacy_version))
292 return 0;
293 if (!CBS_get_bytes(&server_hello, &server_random, SSL3_RANDOM_SIZE))
294 return 0;
295
296 /* See if this is a HelloRetryRequest. */
297 return CBS_mem_equal(&server_random, tls13_hello_retry_request_hash,
298 sizeof(tls13_hello_retry_request_hash));
299}
300
301static int
284tls13_server_hello_process(struct tls13_ctx *ctx, CBS *cbs) 302tls13_server_hello_process(struct tls13_ctx *ctx, CBS *cbs)
285{ 303{
286 CBS server_random, session_id; 304 CBS server_random, session_id;
@@ -331,7 +349,8 @@ tls13_server_hello_process(struct tls13_ctx *ctx, CBS *cbs)
331 /* From here on in we know we are doing TLSv1.3. */ 349 /* From here on in we know we are doing TLSv1.3. */
332 tls13_record_layer_allow_legacy_alerts(ctx->rl, 0); 350 tls13_record_layer_allow_legacy_alerts(ctx->rl, 0);
333 351
334 /* See if this is a Hello Retry Request. */ 352 /* See if this is a HelloRetryRequest. */
353 /* XXX - see if we can avoid doing this twice. */
335 if (CBS_mem_equal(&server_random, tls13_hello_retry_request_hash, 354 if (CBS_mem_equal(&server_random, tls13_hello_retry_request_hash,
336 sizeof(tls13_hello_retry_request_hash))) { 355 sizeof(tls13_hello_retry_request_hash))) {
337 tlsext_msg_type = SSL_TLSEXT_MSG_HRR; 356 tlsext_msg_type = SSL_TLSEXT_MSG_HRR;
@@ -515,40 +534,75 @@ tls13_client_engage_record_protection(struct tls13_ctx *ctx)
515} 534}
516 535
517int 536int
537tls13_server_hello_retry_request_recv(struct tls13_ctx *ctx, CBS *cbs)
538{
539 /*
540 * The state machine has no way of knowing if we're going to receive a
541 * HelloRetryRequest or a ServerHello. As such, we have to handle
542 * this case here and hand off to the appropriate function.
543 */
544 if (!tls13_server_hello_is_retry(cbs)) {
545 ctx->handshake_stage.hs_type |= WITHOUT_HRR;
546 return tls13_server_hello_recv(ctx, cbs);
547 }
548
549 if (!tls13_server_hello_process(ctx, cbs))
550 return 0;
551
552 /*
553 * This may have been a TLSv1.2 or earlier ServerHello that just happened
554 * to have matching server random...
555 */
556 if (ctx->hs->use_legacy)
557 return tls13_use_legacy_client(ctx);
558
559 if (!ctx->hs->hrr)
560 return 0;
561
562 if (!tls13_client_synthetic_handshake_message(ctx))
563 return 0;
564 if (!tls13_handshake_msg_record(ctx))
565 return 0;
566
567 ctx->hs->hrr = 0;
568
569 return 1;
570}
571
572int
518tls13_server_hello_recv(struct tls13_ctx *ctx, CBS *cbs) 573tls13_server_hello_recv(struct tls13_ctx *ctx, CBS *cbs)
519{ 574{
520 SSL *s = ctx->ssl; 575 SSL *s = ctx->ssl;
521 576
522 /* 577 /*
523 * We may have received a legacy (pre-TLSv1.3) server hello, 578 * We may have received a legacy (pre-TLSv1.3) ServerHello or a TLSv1.3
524 * a TLSv1.3 server hello or a TLSv1.3 hello retry request. 579 * ServerHello. HelloRetryRequests have already been handled.
525 */ 580 */
526 if (!tls13_server_hello_process(ctx, cbs)) 581 if (!tls13_server_hello_process(ctx, cbs))
527 return 0; 582 return 0;
528 583
529 tls1_transcript_unfreeze(s); 584 if (ctx->handshake_stage.hs_type & WITHOUT_HRR) {
530 585 tls1_transcript_unfreeze(s);
531 if (ctx->hs->hrr) { 586 if (!tls13_handshake_msg_record(ctx))
532 if (!tls13_client_synthetic_handshake_message(ctx))
533 return 0; 587 return 0;
534 } 588 }
535 589
536 if (!tls13_handshake_msg_record(ctx)) 590 if (ctx->hs->use_legacy) {
537 return 0; 591 if (!(ctx->handshake_stage.hs_type & WITHOUT_HRR))
538 592 return 0;
539 if (ctx->hs->use_legacy)
540 return tls13_use_legacy_client(ctx); 593 return tls13_use_legacy_client(ctx);
594 }
541 595
542 if (!ctx->hs->hrr) { 596 if (ctx->hs->hrr) {
543 if (!tls13_client_engage_record_protection(ctx)) 597 /* The server has sent two HelloRetryRequests. */
544 return 0; 598 ctx->alert = SSL_AD_ILLEGAL_PARAMETER;
599 return 0;
545 } 600 }
546 601
547 ctx->handshake_stage.hs_type |= NEGOTIATED; 602 if (!tls13_client_engage_record_protection(ctx))
548 if (ctx->hs->hrr) 603 return 0;
549 ctx->handshake_stage.hs_type |= WITH_HRR;
550 604
551 ctx->hs->hrr = 0; 605 ctx->handshake_stage.hs_type |= NEGOTIATED;
552 606
553 return 1; 607 return 1;
554} 608}
@@ -581,24 +635,6 @@ tls13_client_hello_retry_send(struct tls13_ctx *ctx, CBB *cbb)
581} 635}
582 636
583int 637int
584tls13_server_hello_retry_recv(struct tls13_ctx *ctx, CBS *cbs)
585{
586 if (!tls13_server_hello_process(ctx, cbs))
587 return 0;
588
589 if (ctx->hs->use_legacy)
590 return 0; /* XXX alert */
591
592 if (ctx->hs->hrr)
593 return 0; /* XXX alert */
594
595 if (!tls13_client_engage_record_protection(ctx))
596 return 0;
597
598 return 1;
599}
600
601int
602tls13_server_encrypted_extensions_recv(struct tls13_ctx *ctx, CBS *cbs) 638tls13_server_encrypted_extensions_recv(struct tls13_ctx *ctx, CBS *cbs)
603{ 639{
604 int alert_desc; 640 int alert_desc;
diff --git a/src/lib/libssl/tls13_handshake.c b/src/lib/libssl/tls13_handshake.c
index 51585d31ba..86046144de 100644
--- a/src/lib/libssl/tls13_handshake.c
+++ b/src/lib/libssl/tls13_handshake.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_handshake.c,v 1.52 2020/03/10 17:15:02 jsing Exp $ */ 1/* $OpenBSD: tls13_handshake.c,v 1.53 2020/04/22 17:05:07 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018-2019 Theo Buehler <tb@openbsd.org> 3 * Copyright (c) 2018-2019 Theo Buehler <tb@openbsd.org>
4 * Copyright (c) 2019 Joel Sing <jsing@openbsd.org> 4 * Copyright (c) 2019 Joel Sing <jsing@openbsd.org>
@@ -96,11 +96,11 @@ struct tls13_handshake_action state_machine[] = {
96 .sent = tls13_server_hello_sent, 96 .sent = tls13_server_hello_sent,
97 .recv = tls13_server_hello_recv, 97 .recv = tls13_server_hello_recv,
98 }, 98 },
99 [SERVER_HELLO_RETRY] = { 99 [SERVER_HELLO_RETRY_REQUEST] = {
100 .handshake_type = TLS13_MT_SERVER_HELLO, 100 .handshake_type = TLS13_MT_SERVER_HELLO,
101 .sender = TLS13_HS_SERVER, 101 .sender = TLS13_HS_SERVER,
102 .send = tls13_server_hello_retry_send, 102 .send = tls13_server_hello_retry_request_send,
103 .recv = tls13_server_hello_retry_recv, 103 .recv = tls13_server_hello_retry_request_recv,
104 }, 104 },
105 [SERVER_ENCRYPTED_EXTENSIONS] = { 105 [SERVER_ENCRYPTED_EXTENSIONS] = {
106 .handshake_type = TLS13_MT_ENCRYPTED_EXTENSIONS, 106 .handshake_type = TLS13_MT_ENCRYPTED_EXTENSIONS,
@@ -145,10 +145,14 @@ struct tls13_handshake_action state_machine[] = {
145enum tls13_message_type handshakes[][TLS13_NUM_MESSAGE_TYPES] = { 145enum tls13_message_type handshakes[][TLS13_NUM_MESSAGE_TYPES] = {
146 [INITIAL] = { 146 [INITIAL] = {
147 CLIENT_HELLO, 147 CLIENT_HELLO,
148 SERVER_HELLO_RETRY_REQUEST,
149 CLIENT_HELLO_RETRY,
148 SERVER_HELLO, 150 SERVER_HELLO,
149 }, 151 },
150 [NEGOTIATED] = { 152 [NEGOTIATED] = {
151 CLIENT_HELLO, 153 CLIENT_HELLO,
154 SERVER_HELLO_RETRY_REQUEST,
155 CLIENT_HELLO_RETRY,
152 SERVER_HELLO, 156 SERVER_HELLO,
153 SERVER_ENCRYPTED_EXTENSIONS, 157 SERVER_ENCRYPTED_EXTENSIONS,
154 SERVER_CERTIFICATE_REQUEST, 158 SERVER_CERTIFICATE_REQUEST,
@@ -159,11 +163,9 @@ enum tls13_message_type handshakes[][TLS13_NUM_MESSAGE_TYPES] = {
159 CLIENT_FINISHED, 163 CLIENT_FINISHED,
160 APPLICATION_DATA, 164 APPLICATION_DATA,
161 }, 165 },
162 [NEGOTIATED | WITH_HRR] = { 166 [NEGOTIATED | WITHOUT_HRR] = {
163 CLIENT_HELLO, 167 CLIENT_HELLO,
164 SERVER_HELLO, 168 SERVER_HELLO,
165 CLIENT_HELLO_RETRY,
166 SERVER_HELLO_RETRY,
167 SERVER_ENCRYPTED_EXTENSIONS, 169 SERVER_ENCRYPTED_EXTENSIONS,
168 SERVER_CERTIFICATE_REQUEST, 170 SERVER_CERTIFICATE_REQUEST,
169 SERVER_CERTIFICATE, 171 SERVER_CERTIFICATE,
@@ -175,6 +177,8 @@ enum tls13_message_type handshakes[][TLS13_NUM_MESSAGE_TYPES] = {
175 }, 177 },
176 [NEGOTIATED | WITHOUT_CR] = { 178 [NEGOTIATED | WITHOUT_CR] = {
177 CLIENT_HELLO, 179 CLIENT_HELLO,
180 SERVER_HELLO_RETRY_REQUEST,
181 CLIENT_HELLO_RETRY,
178 SERVER_HELLO, 182 SERVER_HELLO,
179 SERVER_ENCRYPTED_EXTENSIONS, 183 SERVER_ENCRYPTED_EXTENSIONS,
180 SERVER_CERTIFICATE, 184 SERVER_CERTIFICATE,
@@ -183,11 +187,9 @@ enum tls13_message_type handshakes[][TLS13_NUM_MESSAGE_TYPES] = {
183 CLIENT_FINISHED, 187 CLIENT_FINISHED,
184 APPLICATION_DATA, 188 APPLICATION_DATA,
185 }, 189 },
186 [NEGOTIATED | WITH_HRR | WITHOUT_CR] = { 190 [NEGOTIATED | WITHOUT_HRR | WITHOUT_CR] = {
187 CLIENT_HELLO, 191 CLIENT_HELLO,
188 SERVER_HELLO, 192 SERVER_HELLO,
189 CLIENT_HELLO_RETRY,
190 SERVER_HELLO_RETRY,
191 SERVER_ENCRYPTED_EXTENSIONS, 193 SERVER_ENCRYPTED_EXTENSIONS,
192 SERVER_CERTIFICATE, 194 SERVER_CERTIFICATE,
193 SERVER_CERTIFICATE_VERIFY, 195 SERVER_CERTIFICATE_VERIFY,
@@ -197,17 +199,17 @@ enum tls13_message_type handshakes[][TLS13_NUM_MESSAGE_TYPES] = {
197 }, 199 },
198 [NEGOTIATED | WITH_PSK] = { 200 [NEGOTIATED | WITH_PSK] = {
199 CLIENT_HELLO, 201 CLIENT_HELLO,
202 SERVER_HELLO_RETRY_REQUEST,
203 CLIENT_HELLO_RETRY,
200 SERVER_HELLO, 204 SERVER_HELLO,
201 SERVER_ENCRYPTED_EXTENSIONS, 205 SERVER_ENCRYPTED_EXTENSIONS,
202 SERVER_FINISHED, 206 SERVER_FINISHED,
203 CLIENT_FINISHED, 207 CLIENT_FINISHED,
204 APPLICATION_DATA, 208 APPLICATION_DATA,
205 }, 209 },
206 [NEGOTIATED | WITH_HRR | WITH_PSK] = { 210 [NEGOTIATED | WITHOUT_HRR | WITH_PSK] = {
207 CLIENT_HELLO, 211 CLIENT_HELLO,
208 SERVER_HELLO, 212 SERVER_HELLO,
209 CLIENT_HELLO_RETRY,
210 SERVER_HELLO_RETRY,
211 SERVER_ENCRYPTED_EXTENSIONS, 213 SERVER_ENCRYPTED_EXTENSIONS,
212 SERVER_FINISHED, 214 SERVER_FINISHED,
213 CLIENT_FINISHED, 215 CLIENT_FINISHED,
@@ -215,6 +217,8 @@ enum tls13_message_type handshakes[][TLS13_NUM_MESSAGE_TYPES] = {
215 }, 217 },
216 [NEGOTIATED | WITH_CCV] = { 218 [NEGOTIATED | WITH_CCV] = {
217 CLIENT_HELLO, 219 CLIENT_HELLO,
220 SERVER_HELLO_RETRY_REQUEST,
221 CLIENT_HELLO_RETRY,
218 SERVER_HELLO, 222 SERVER_HELLO,
219 SERVER_ENCRYPTED_EXTENSIONS, 223 SERVER_ENCRYPTED_EXTENSIONS,
220 SERVER_CERTIFICATE_REQUEST, 224 SERVER_CERTIFICATE_REQUEST,
@@ -226,11 +230,9 @@ enum tls13_message_type handshakes[][TLS13_NUM_MESSAGE_TYPES] = {
226 CLIENT_FINISHED, 230 CLIENT_FINISHED,
227 APPLICATION_DATA, 231 APPLICATION_DATA,
228 }, 232 },
229 [NEGOTIATED | WITH_HRR | WITH_CCV] = { 233 [NEGOTIATED | WITHOUT_HRR | WITH_CCV] = {
230 CLIENT_HELLO, 234 CLIENT_HELLO,
231 SERVER_HELLO, 235 SERVER_HELLO,
232 CLIENT_HELLO_RETRY,
233 SERVER_HELLO_RETRY,
234 SERVER_ENCRYPTED_EXTENSIONS, 236 SERVER_ENCRYPTED_EXTENSIONS,
235 SERVER_CERTIFICATE_REQUEST, 237 SERVER_CERTIFICATE_REQUEST,
236 SERVER_CERTIFICATE, 238 SERVER_CERTIFICATE,
diff --git a/src/lib/libssl/tls13_handshake.h b/src/lib/libssl/tls13_handshake.h
index 956d27c61a..8a08b9fd5b 100644
--- a/src/lib/libssl/tls13_handshake.h
+++ b/src/lib/libssl/tls13_handshake.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_handshake.h,v 1.4 2020/03/10 17:15:02 jsing Exp $ */ 1/* $OpenBSD: tls13_handshake.h,v 1.5 2020/04/22 17:05:07 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2019 Theo Buehler <tb@openbsd.org> 3 * Copyright (c) 2019 Theo Buehler <tb@openbsd.org>
4 * 4 *
@@ -24,7 +24,7 @@ __BEGIN_HIDDEN_DECLS
24 24
25#define INITIAL 0x00 25#define INITIAL 0x00
26#define NEGOTIATED 0x01 26#define NEGOTIATED 0x01
27#define WITH_HRR 0x02 27#define WITHOUT_HRR 0x02
28#define WITHOUT_CR 0x04 28#define WITHOUT_CR 0x04
29#define WITH_PSK 0x08 29#define WITH_PSK 0x08
30#define WITH_CCV 0x10 30#define WITH_CCV 0x10
@@ -33,9 +33,9 @@ __BEGIN_HIDDEN_DECLS
33enum tls13_message_type { 33enum tls13_message_type {
34 INVALID, 34 INVALID,
35 CLIENT_HELLO, 35 CLIENT_HELLO,
36 SERVER_HELLO, 36 SERVER_HELLO_RETRY_REQUEST,
37 CLIENT_HELLO_RETRY, 37 CLIENT_HELLO_RETRY,
38 SERVER_HELLO_RETRY, 38 SERVER_HELLO,
39 SERVER_ENCRYPTED_EXTENSIONS, 39 SERVER_ENCRYPTED_EXTENSIONS,
40 SERVER_CERTIFICATE_REQUEST, 40 SERVER_CERTIFICATE_REQUEST,
41 SERVER_CERTIFICATE, 41 SERVER_CERTIFICATE,
diff --git a/src/lib/libssl/tls13_internal.h b/src/lib/libssl/tls13_internal.h
index c5b893bc16..ee82a44693 100644
--- a/src/lib/libssl/tls13_internal.h
+++ b/src/lib/libssl/tls13_internal.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_internal.h,v 1.64 2020/04/21 16:55:17 jsing Exp $ */ 1/* $OpenBSD: tls13_internal.h,v 1.65 2020/04/22 17:05:07 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2018 Bob Beck <beck@openbsd.org>
4 * Copyright (c) 2018 Theo Buehler <tb@openbsd.org> 4 * Copyright (c) 2018 Theo Buehler <tb@openbsd.org>
@@ -309,8 +309,8 @@ int tls13_client_finished_sent(struct tls13_ctx *ctx);
309int tls13_server_hello_recv(struct tls13_ctx *ctx, CBS *cbs); 309int tls13_server_hello_recv(struct tls13_ctx *ctx, CBS *cbs);
310int tls13_server_hello_send(struct tls13_ctx *ctx, CBB *cbb); 310int tls13_server_hello_send(struct tls13_ctx *ctx, CBB *cbb);
311int tls13_server_hello_sent(struct tls13_ctx *ctx); 311int tls13_server_hello_sent(struct tls13_ctx *ctx);
312int tls13_server_hello_retry_recv(struct tls13_ctx *ctx, CBS *cbs); 312int tls13_server_hello_retry_request_recv(struct tls13_ctx *ctx, CBS *cbs);
313int tls13_server_hello_retry_send(struct tls13_ctx *ctx, CBB *cbb); 313int tls13_server_hello_retry_request_send(struct tls13_ctx *ctx, CBB *cbb);
314int tls13_server_encrypted_extensions_recv(struct tls13_ctx *ctx, CBS *cbs); 314int tls13_server_encrypted_extensions_recv(struct tls13_ctx *ctx, CBS *cbs);
315int tls13_server_encrypted_extensions_send(struct tls13_ctx *ctx, CBB *cbb); 315int tls13_server_encrypted_extensions_send(struct tls13_ctx *ctx, CBB *cbb);
316int tls13_server_certificate_recv(struct tls13_ctx *ctx, CBS *cbs); 316int tls13_server_certificate_recv(struct tls13_ctx *ctx, CBS *cbs);
diff --git a/src/lib/libssl/tls13_server.c b/src/lib/libssl/tls13_server.c
index f3d21a7477..9bc4cb6170 100644
--- a/src/lib/libssl/tls13_server.c
+++ b/src/lib/libssl/tls13_server.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_server.c,v 1.30 2020/04/21 17:06:16 jsing Exp $ */ 1/* $OpenBSD: tls13_server.c,v 1.31 2020/04/22 17:05:07 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org>
4 * Copyright (c) 2020 Bob Beck <beck@openbsd.org> 4 * Copyright (c) 2020 Bob Beck <beck@openbsd.org>
@@ -280,11 +280,11 @@ tls13_client_hello_recv(struct tls13_ctx *ctx, CBS *cbs)
280 return 1; 280 return 1;
281 281
282 /* 282 /*
283 * If no matching key share was provided, we need to send a 283 * If a matching key share was provided, we do not need to
284 * HelloRetryRequest, if matching security parameters exist. 284 * send a HelloRetryRequest.
285 */ 285 */
286 if (ctx->hs->key_share == NULL) 286 if (ctx->hs->key_share != NULL)
287 ctx->handshake_stage.hs_type |= WITH_HRR; 287 ctx->handshake_stage.hs_type |= WITHOUT_HRR;
288 288
289 /* XXX - check this is the correct point */ 289 /* XXX - check this is the correct point */
290 tls13_record_layer_allow_ccs(ctx->rl, 1); 290 tls13_record_layer_allow_ccs(ctx->rl, 1);
@@ -608,7 +608,7 @@ tls13_server_hello_sent(struct tls13_ctx *ctx)
608} 608}
609 609
610int 610int
611tls13_server_hello_retry_send(struct tls13_ctx *ctx, CBB *cbb) 611tls13_server_hello_retry_request_send(struct tls13_ctx *ctx, CBB *cbb)
612{ 612{
613 return 0; 613 return 0;
614} 614}