diff options
author | jsing <> | 2019-01-30 16:37:32 +0000 |
---|---|---|
committer | jsing <> | 2019-01-30 16:37:32 +0000 |
commit | 057210e0a7055f5db949f2b8ec12d8cb2eaa66e8 (patch) | |
tree | b779c2e7e5b2b664cebb207f1e527aeac1b6c6cc /src/lib | |
parent | 44d441a36180f7a025ae35b21cac5108b547d1ea (diff) | |
download | openbsd-057210e0a7055f5db949f2b8ec12d8cb2eaa66e8.tar.gz openbsd-057210e0a7055f5db949f2b8ec12d8cb2eaa66e8.tar.bz2 openbsd-057210e0a7055f5db949f2b8ec12d8cb2eaa66e8.zip |
Correct handling of TLS sigalgs extension for TLSv1.0/TLSv1.1.
When operating as a TLSv1.0 or TLSv1.1 server, we still have to parse the
TLS sigalgs extension if presented by the client (which might be TLSv1.2
capable), rather than treating its presence as an error.
While here, remove future version dependence issues by avoiding explicit
version equality checks.
Issue reported by bluhm@.
ok bluhm@ tb@
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libssl/ssl_tlsext.c | 52 |
1 files changed, 19 insertions, 33 deletions
diff --git a/src/lib/libssl/ssl_tlsext.c b/src/lib/libssl/ssl_tlsext.c index c99ad671dc..08aafb206a 100644 --- a/src/lib/libssl/ssl_tlsext.c +++ b/src/lib/libssl/ssl_tlsext.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_tlsext.c,v 1.38 2019/01/28 15:52:17 beck Exp $ */ | 1 | /* $OpenBSD: ssl_tlsext.c,v 1.39 2019/01/30 16:37:32 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2016, 2017, 2019 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2016, 2017, 2019 Joel Sing <jsing@openbsd.org> |
4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> | 4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> |
@@ -540,32 +540,21 @@ tlsext_sigalgs_client_needs(SSL *s) | |||
540 | int | 540 | int |
541 | tlsext_sigalgs_client_build(SSL *s, CBB *cbb) | 541 | tlsext_sigalgs_client_build(SSL *s, CBB *cbb) |
542 | { | 542 | { |
543 | uint16_t *tls_sigalgs = tls12_sigalgs; | ||
544 | size_t tls_sigalgs_len = tls12_sigalgs_len; | ||
543 | CBB sigalgs; | 545 | CBB sigalgs; |
544 | 546 | ||
547 | if (TLS1_get_client_version(s) >= TLS1_3_VERSION && | ||
548 | S3I(s)->hs_tls13.min_version >= TLS1_3_VERSION) { | ||
549 | tls_sigalgs = tls13_sigalgs; | ||
550 | tls_sigalgs_len = tls13_sigalgs_len; | ||
551 | } | ||
552 | |||
545 | if (!CBB_add_u16_length_prefixed(cbb, &sigalgs)) | 553 | if (!CBB_add_u16_length_prefixed(cbb, &sigalgs)) |
546 | return 0; | 554 | return 0; |
547 | 555 | ||
548 | switch (TLS1_get_client_version(s)) { | 556 | if (!ssl_sigalgs_build(&sigalgs, tls_sigalgs, tls_sigalgs_len)) |
549 | case TLS1_2_VERSION: | ||
550 | if (!ssl_sigalgs_build(&sigalgs, tls12_sigalgs, tls12_sigalgs_len)) | ||
551 | return 0; | ||
552 | break; | ||
553 | case TLS1_3_VERSION: | ||
554 | if (S3I(s)->hs_tls13.min_version < TLS1_3_VERSION) { | ||
555 | if (!ssl_sigalgs_build(&sigalgs, tls12_sigalgs, | ||
556 | tls12_sigalgs_len)) | ||
557 | return 0; | ||
558 | } | ||
559 | else { | ||
560 | if (!ssl_sigalgs_build(&sigalgs, tls13_sigalgs, | ||
561 | tls13_sigalgs_len)) | ||
562 | return 0; | ||
563 | } | ||
564 | break; | ||
565 | default: | ||
566 | /* Should not happen */ | ||
567 | return 0; | 557 | return 0; |
568 | } | ||
569 | 558 | ||
570 | if (!CBB_flush(cbb)) | 559 | if (!CBB_flush(cbb)) |
571 | return 0; | 560 | return 0; |
@@ -576,23 +565,20 @@ tlsext_sigalgs_client_build(SSL *s, CBB *cbb) | |||
576 | int | 565 | int |
577 | tlsext_sigalgs_server_parse(SSL *s, CBS *cbs, int *alert) | 566 | tlsext_sigalgs_server_parse(SSL *s, CBS *cbs, int *alert) |
578 | { | 567 | { |
568 | uint16_t *tls_sigalgs = tls12_sigalgs; | ||
569 | size_t tls_sigalgs_len = tls12_sigalgs_len; | ||
579 | CBS sigalgs; | 570 | CBS sigalgs; |
580 | 571 | ||
572 | if (s->version >= TLS1_3_VERSION) { | ||
573 | tls_sigalgs = tls13_sigalgs; | ||
574 | tls_sigalgs_len = tls13_sigalgs_len; | ||
575 | } | ||
576 | |||
581 | if (!CBS_get_u16_length_prefixed(cbs, &sigalgs)) | 577 | if (!CBS_get_u16_length_prefixed(cbs, &sigalgs)) |
582 | return 0; | 578 | return 0; |
583 | 579 | ||
584 | switch (s->version) { | 580 | return tls1_process_sigalgs(s, &sigalgs, tls_sigalgs, |
585 | case TLS1_3_VERSION: | 581 | tls_sigalgs_len); |
586 | return tls1_process_sigalgs(s, &sigalgs, tls13_sigalgs, | ||
587 | tls13_sigalgs_len); | ||
588 | case TLS1_2_VERSION: | ||
589 | return tls1_process_sigalgs(s, &sigalgs, tls12_sigalgs, | ||
590 | tls12_sigalgs_len); | ||
591 | default: | ||
592 | break; | ||
593 | } | ||
594 | |||
595 | return 0; | ||
596 | } | 582 | } |
597 | 583 | ||
598 | int | 584 | int |