diff options
author | jsing <> | 2020-01-22 13:10:51 +0000 |
---|---|---|
committer | jsing <> | 2020-01-22 13:10:51 +0000 |
commit | 7655835d7e1b8fa812246e1e652a1747a4f67b32 (patch) | |
tree | 80ca1bcd2a0b8b6d5658a3b4bbec080ceced53e3 /src/lib/libssl/tls13_client.c | |
parent | e53889cb5c5ff4e8801ca99623f6e16491f94358 (diff) | |
download | openbsd-7655835d7e1b8fa812246e1e652a1747a4f67b32.tar.gz openbsd-7655835d7e1b8fa812246e1e652a1747a4f67b32.tar.bz2 openbsd-7655835d7e1b8fa812246e1e652a1747a4f67b32.zip |
Pass a handshake message content CBS to TLSv1.3 receive handlers.
This avoids every receive handler from having to get the handshake message
content itself. Additionally, pull the trailing data check up so that each
receive handler does not have to implement it. This makes the code more
readable and reduces duplication.
ok beck@ tb@
Diffstat (limited to 'src/lib/libssl/tls13_client.c')
-rw-r--r-- | src/lib/libssl/tls13_client.c | 81 |
1 files changed, 26 insertions, 55 deletions
diff --git a/src/lib/libssl/tls13_client.c b/src/lib/libssl/tls13_client.c index 3648d09b22..4ec5e58f02 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.27 2020/01/22 11:26:47 beck Exp $ */ | 1 | /* $OpenBSD: tls13_client.c,v 1.28 2020/01/22 13:10:51 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 | * |
@@ -288,17 +288,17 @@ tls13_server_hello_process(struct tls13_ctx *ctx, CBS *cbs) | |||
288 | if (!CBS_get_u8(cbs, &compression_method)) | 288 | if (!CBS_get_u8(cbs, &compression_method)) |
289 | goto err; | 289 | goto err; |
290 | 290 | ||
291 | if (tls13_server_hello_is_legacy(cbs)) | 291 | if (tls13_server_hello_is_legacy(cbs)) { |
292 | if (!CBS_skip(cbs, CBS_len(cbs))) | ||
293 | goto err; | ||
292 | return tls13_use_legacy_client(ctx); | 294 | return tls13_use_legacy_client(ctx); |
295 | } | ||
293 | 296 | ||
294 | if (!tlsext_client_parse(s, cbs, &alert_desc, SSL_TLSEXT_MSG_SH)) { | 297 | if (!tlsext_client_parse(s, cbs, &alert_desc, SSL_TLSEXT_MSG_SH)) { |
295 | ctx->alert = alert_desc; | 298 | ctx->alert = alert_desc; |
296 | goto err; | 299 | goto err; |
297 | } | 300 | } |
298 | 301 | ||
299 | if (CBS_len(cbs) != 0) | ||
300 | goto err; | ||
301 | |||
302 | /* | 302 | /* |
303 | * See if a supported versions extension was returned. If it was then | 303 | * See if a supported versions extension was returned. If it was then |
304 | * the legacy version must be set to 0x0303 (RFC 8446 section 4.1.3). | 304 | * the legacy version must be set to 0x0303 (RFC 8446 section 4.1.3). |
@@ -359,7 +359,7 @@ tls13_server_hello_process(struct tls13_ctx *ctx, CBS *cbs) | |||
359 | } | 359 | } |
360 | 360 | ||
361 | int | 361 | int |
362 | tls13_server_hello_recv(struct tls13_ctx *ctx) | 362 | tls13_server_hello_recv(struct tls13_ctx *ctx, CBS *cbs) |
363 | { | 363 | { |
364 | struct tls13_secrets *secrets; | 364 | struct tls13_secrets *secrets; |
365 | struct tls13_secret context; | 365 | struct tls13_secret context; |
@@ -368,12 +368,8 @@ tls13_server_hello_recv(struct tls13_ctx *ctx) | |||
368 | size_t hash_len; | 368 | size_t hash_len; |
369 | SSL *s = ctx->ssl; | 369 | SSL *s = ctx->ssl; |
370 | int ret = 0; | 370 | int ret = 0; |
371 | CBS cbs; | ||
372 | |||
373 | if (!tls13_handshake_msg_content(ctx->hs_msg, &cbs)) | ||
374 | goto err; | ||
375 | 371 | ||
376 | if (!tls13_server_hello_process(ctx, &cbs)) | 372 | if (!tls13_server_hello_process(ctx, cbs)) |
377 | goto err; | 373 | goto err; |
378 | 374 | ||
379 | /* See if we switched back to the legacy client method. */ | 375 | /* See if we switched back to the legacy client method. */ |
@@ -440,22 +436,15 @@ tls13_server_hello_recv(struct tls13_ctx *ctx) | |||
440 | } | 436 | } |
441 | 437 | ||
442 | int | 438 | int |
443 | tls13_server_encrypted_extensions_recv(struct tls13_ctx *ctx) | 439 | tls13_server_encrypted_extensions_recv(struct tls13_ctx *ctx, CBS *cbs) |
444 | { | 440 | { |
445 | CBS cbs; | ||
446 | int alert_desc; | 441 | int alert_desc; |
447 | 442 | ||
448 | if (!tls13_handshake_msg_content(ctx->hs_msg, &cbs)) | 443 | if (!tlsext_client_parse(ctx->ssl, cbs, &alert_desc, SSL_TLSEXT_MSG_EE)) { |
449 | goto err; | ||
450 | |||
451 | if (!tlsext_client_parse(ctx->ssl, &cbs, &alert_desc, SSL_TLSEXT_MSG_EE)) { | ||
452 | ctx->alert = alert_desc; | 444 | ctx->alert = alert_desc; |
453 | goto err; | 445 | goto err; |
454 | } | 446 | } |
455 | 447 | ||
456 | if (CBS_len(&cbs) != 0) | ||
457 | goto err; | ||
458 | |||
459 | return 1; | 448 | return 1; |
460 | 449 | ||
461 | err: | 450 | err: |
@@ -465,7 +454,7 @@ tls13_server_encrypted_extensions_recv(struct tls13_ctx *ctx) | |||
465 | } | 454 | } |
466 | 455 | ||
467 | int | 456 | int |
468 | tls13_server_certificate_request_recv(struct tls13_ctx *ctx) | 457 | tls13_server_certificate_request_recv(struct tls13_ctx *ctx, CBS *cbs) |
469 | { | 458 | { |
470 | /* | 459 | /* |
471 | * Thanks to poor state design in the RFC, this function can be called | 460 | * Thanks to poor state design in the RFC, this function can be called |
@@ -475,7 +464,7 @@ tls13_server_certificate_request_recv(struct tls13_ctx *ctx) | |||
475 | */ | 464 | */ |
476 | if (tls13_handshake_msg_type(ctx->hs_msg) == TLS13_MT_CERTIFICATE) { | 465 | if (tls13_handshake_msg_type(ctx->hs_msg) == TLS13_MT_CERTIFICATE) { |
477 | ctx->handshake_stage.hs_type |= WITHOUT_CR; | 466 | ctx->handshake_stage.hs_type |= WITHOUT_CR; |
478 | return tls13_server_certificate_recv(ctx); | 467 | return tls13_server_certificate_recv(ctx, cbs); |
479 | } | 468 | } |
480 | 469 | ||
481 | /* XXX - unimplemented. */ | 470 | /* XXX - unimplemented. */ |
@@ -484,9 +473,9 @@ tls13_server_certificate_request_recv(struct tls13_ctx *ctx) | |||
484 | } | 473 | } |
485 | 474 | ||
486 | int | 475 | int |
487 | tls13_server_certificate_recv(struct tls13_ctx *ctx) | 476 | tls13_server_certificate_recv(struct tls13_ctx *ctx, CBS *cbs) |
488 | { | 477 | { |
489 | CBS cbs, cert_request_context, cert_list, cert_data, cert_exts; | 478 | CBS cert_request_context, cert_list, cert_data, cert_exts; |
490 | struct stack_st_X509 *certs = NULL; | 479 | struct stack_st_X509 *certs = NULL; |
491 | SSL *s = ctx->ssl; | 480 | SSL *s = ctx->ssl; |
492 | X509 *cert = NULL; | 481 | X509 *cert = NULL; |
@@ -498,16 +487,11 @@ tls13_server_certificate_recv(struct tls13_ctx *ctx) | |||
498 | if ((certs = sk_X509_new_null()) == NULL) | 487 | if ((certs = sk_X509_new_null()) == NULL) |
499 | goto err; | 488 | goto err; |
500 | 489 | ||
501 | if (!tls13_handshake_msg_content(ctx->hs_msg, &cbs)) | 490 | if (!CBS_get_u8_length_prefixed(cbs, &cert_request_context)) |
502 | goto err; | ||
503 | |||
504 | if (!CBS_get_u8_length_prefixed(&cbs, &cert_request_context)) | ||
505 | goto err; | 491 | goto err; |
506 | if (CBS_len(&cert_request_context) != 0) | 492 | if (CBS_len(&cert_request_context) != 0) |
507 | goto err; | 493 | goto err; |
508 | if (!CBS_get_u24_length_prefixed(&cbs, &cert_list)) | 494 | if (!CBS_get_u24_length_prefixed(cbs, &cert_list)) |
509 | goto err; | ||
510 | if (CBS_len(&cbs) != 0) | ||
511 | goto err; | 495 | goto err; |
512 | 496 | ||
513 | while (CBS_len(&cert_list) > 0) { | 497 | while (CBS_len(&cert_list) > 0) { |
@@ -595,7 +579,7 @@ static uint8_t cert_verify_pad[64] = { | |||
595 | static uint8_t server_cert_verify_context[] = "TLS 1.3, server CertificateVerify"; | 579 | static uint8_t server_cert_verify_context[] = "TLS 1.3, server CertificateVerify"; |
596 | 580 | ||
597 | int | 581 | int |
598 | tls13_server_certificate_verify_recv(struct tls13_ctx *ctx) | 582 | tls13_server_certificate_verify_recv(struct tls13_ctx *ctx, CBS *cbs) |
599 | { | 583 | { |
600 | const struct ssl_sigalg *sigalg; | 584 | const struct ssl_sigalg *sigalg; |
601 | uint16_t signature_scheme; | 585 | uint16_t signature_scheme; |
@@ -605,20 +589,15 @@ tls13_server_certificate_verify_recv(struct tls13_ctx *ctx) | |||
605 | EVP_PKEY_CTX *pctx; | 589 | EVP_PKEY_CTX *pctx; |
606 | EVP_PKEY *pkey; | 590 | EVP_PKEY *pkey; |
607 | X509 *cert; | 591 | X509 *cert; |
608 | CBS cbs, signature; | 592 | CBS signature; |
609 | CBB cbb; | 593 | CBB cbb; |
610 | int ret = 0; | 594 | int ret = 0; |
611 | 595 | ||
612 | memset(&cbb, 0, sizeof(cbb)); | 596 | memset(&cbb, 0, sizeof(cbb)); |
613 | 597 | ||
614 | if (!tls13_handshake_msg_content(ctx->hs_msg, &cbs)) | 598 | if (!CBS_get_u16(cbs, &signature_scheme)) |
615 | goto err; | ||
616 | |||
617 | if (!CBS_get_u16(&cbs, &signature_scheme)) | ||
618 | goto err; | ||
619 | if (!CBS_get_u16_length_prefixed(&cbs, &signature)) | ||
620 | goto err; | 599 | goto err; |
621 | if (CBS_len(&cbs) != 0) | 600 | if (!CBS_get_u16_length_prefixed(cbs, &signature)) |
622 | goto err; | 601 | goto err; |
623 | 602 | ||
624 | if ((sigalg = ssl_sigalg(signature_scheme, tls13_sigalgs, | 603 | if ((sigalg = ssl_sigalg(signature_scheme, tls13_sigalgs, |
@@ -680,7 +659,7 @@ tls13_server_certificate_verify_recv(struct tls13_ctx *ctx) | |||
680 | } | 659 | } |
681 | 660 | ||
682 | int | 661 | int |
683 | tls13_server_finished_recv(struct tls13_ctx *ctx) | 662 | tls13_server_finished_recv(struct tls13_ctx *ctx, CBS *cbs) |
684 | { | 663 | { |
685 | struct tls13_secrets *secrets = ctx->hs->secrets; | 664 | struct tls13_secrets *secrets = ctx->hs->secrets; |
686 | struct tls13_secret context = { .data = "", .len = 0 }; | 665 | struct tls13_secret context = { .data = "", .len = 0 }; |
@@ -693,10 +672,6 @@ tls13_server_finished_recv(struct tls13_ctx *ctx) | |||
693 | HMAC_CTX *hmac_ctx = NULL; | 672 | HMAC_CTX *hmac_ctx = NULL; |
694 | unsigned int hlen; | 673 | unsigned int hlen; |
695 | int ret = 0; | 674 | int ret = 0; |
696 | CBS cbs; | ||
697 | |||
698 | if (!tls13_handshake_msg_content(ctx->hs_msg, &cbs)) | ||
699 | goto err; | ||
700 | 675 | ||
701 | /* | 676 | /* |
702 | * Verify server finished. | 677 | * Verify server finished. |
@@ -725,11 +700,14 @@ tls13_server_finished_recv(struct tls13_ctx *ctx) | |||
725 | if (hlen != verify_data_len) | 700 | if (hlen != verify_data_len) |
726 | goto err; | 701 | goto err; |
727 | 702 | ||
728 | if (!CBS_mem_equal(&cbs, verify_data, verify_data_len)) { | 703 | if (!CBS_mem_equal(cbs, verify_data, verify_data_len)) { |
729 | ctx->alert = TLS1_AD_DECRYPTION_FAILED; | 704 | ctx->alert = TLS1_AD_DECRYPTION_FAILED; |
730 | goto err; | 705 | goto err; |
731 | } | 706 | } |
732 | 707 | ||
708 | if (!CBS_skip(cbs, verify_data_len)) | ||
709 | goto err; | ||
710 | |||
733 | /* | 711 | /* |
734 | * Derive application traffic keys. | 712 | * Derive application traffic keys. |
735 | */ | 713 | */ |
@@ -864,9 +842,6 @@ tls13_client_hello_retry_process(struct tls13_ctx *ctx, CBS *cbs) | |||
864 | goto err; | 842 | goto err; |
865 | } | 843 | } |
866 | 844 | ||
867 | if (CBS_len(cbs) != 0) | ||
868 | goto err; | ||
869 | |||
870 | /* XXX for now, just say no, we will not change our hello */ | 845 | /* XXX for now, just say no, we will not change our hello */ |
871 | ctx->alert = SSL_AD_ILLEGAL_PARAMETER; | 846 | ctx->alert = SSL_AD_ILLEGAL_PARAMETER; |
872 | err: | 847 | err: |
@@ -876,15 +851,11 @@ tls13_client_hello_retry_process(struct tls13_ctx *ctx, CBS *cbs) | |||
876 | } | 851 | } |
877 | 852 | ||
878 | int | 853 | int |
879 | tls13_client_hello_retry_recv(struct tls13_ctx *ctx) | 854 | tls13_client_hello_retry_recv(struct tls13_ctx *ctx, CBS *cbs) |
880 | { | 855 | { |
881 | int ret = 0; | 856 | int ret = 0; |
882 | CBS cbs; | ||
883 | |||
884 | if (!tls13_handshake_msg_content(ctx->hs_msg, &cbs)) | ||
885 | goto err; | ||
886 | 857 | ||
887 | if (!tls13_client_hello_retry_process(ctx, &cbs)) { | 858 | if (!tls13_client_hello_retry_process(ctx, cbs)) { |
888 | if (ctx->alert == SSL_AD_ILLEGAL_PARAMETER) | 859 | if (ctx->alert == SSL_AD_ILLEGAL_PARAMETER) |
889 | tls13_set_errorx(ctx, TLS13_ERR_HRR_FAILED, 0, | 860 | tls13_set_errorx(ctx, TLS13_ERR_HRR_FAILED, 0, |
890 | "Unsatisfiable hello retry request", NULL); | 861 | "Unsatisfiable hello retry request", NULL); |