diff options
| author | jsing <> | 2018-02-08 11:30:30 +0000 |
|---|---|---|
| committer | jsing <> | 2018-02-08 11:30:30 +0000 |
| commit | 80eca49ce660d22bdfc1eea6731e8af8c5d43030 (patch) | |
| tree | 9e5cad14fc7d443c7ddd3a3abf5efddfc0546802 /src/lib/libssl/t1_lib.c | |
| parent | 65ab7356a60597cf0c63882b8ed825bef112e719 (diff) | |
| download | openbsd-80eca49ce660d22bdfc1eea6731e8af8c5d43030.tar.gz openbsd-80eca49ce660d22bdfc1eea6731e8af8c5d43030.tar.bz2 openbsd-80eca49ce660d22bdfc1eea6731e8af8c5d43030.zip | |
Complete the TLS extension rewrite on the client-side.
The RI logic gets pulled up into ssl3_get_server_hello() and
ssl_parse_serverhello_tlsext() gets replaced by tlsext_client_parse(),
which allows a CBS to be passed all the way down.
This also deduplicates the tlsext_client_build() and tlsext_server_build()
code.
ok beck@
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/t1_lib.c | 75 |
1 files changed, 1 insertions, 74 deletions
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c index fbd79431db..d92fd70f5b 100644 --- a/src/lib/libssl/t1_lib.c +++ b/src/lib/libssl/t1_lib.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: t1_lib.c,v 1.140 2018/01/27 15:30:05 jsing Exp $ */ | 1 | /* $OpenBSD: t1_lib.c,v 1.141 2018/02/08 11:30:30 jsing Exp $ */ |
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | * | 4 | * |
| @@ -662,79 +662,6 @@ tls12_get_req_sig_algs(SSL *s, unsigned char **sigalgs, size_t *sigalgs_len) | |||
| 662 | } | 662 | } |
| 663 | 663 | ||
| 664 | int | 664 | int |
| 665 | ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, size_t n, int *al) | ||
| 666 | { | ||
| 667 | unsigned short type; | ||
| 668 | unsigned short size; | ||
| 669 | unsigned short len; | ||
| 670 | unsigned char *data = *p; | ||
| 671 | unsigned char *end = *p + n; | ||
| 672 | CBS cbs; | ||
| 673 | |||
| 674 | S3I(s)->renegotiate_seen = 0; | ||
| 675 | free(S3I(s)->alpn_selected); | ||
| 676 | S3I(s)->alpn_selected = NULL; | ||
| 677 | |||
| 678 | if (data == end) | ||
| 679 | goto ri_check; | ||
| 680 | |||
| 681 | if (end - data < 2) | ||
| 682 | goto err; | ||
| 683 | n2s(data, len); | ||
| 684 | |||
| 685 | if (end - data != len) | ||
| 686 | goto err; | ||
| 687 | |||
| 688 | while (end - data >= 4) { | ||
| 689 | n2s(data, type); | ||
| 690 | n2s(data, size); | ||
| 691 | |||
| 692 | if (end - data < size) | ||
| 693 | goto err; | ||
| 694 | |||
| 695 | if (s->internal->tlsext_debug_cb) | ||
| 696 | s->internal->tlsext_debug_cb(s, 1, type, data, size, | ||
| 697 | s->internal->tlsext_debug_arg); | ||
| 698 | |||
| 699 | CBS_init(&cbs, data, size); | ||
| 700 | if (!tlsext_serverhello_parse_one(s, &cbs, type, al)) | ||
| 701 | return 0; | ||
| 702 | |||
| 703 | data += size; | ||
| 704 | |||
| 705 | } | ||
| 706 | |||
| 707 | if (data != end) { | ||
| 708 | *al = SSL_AD_DECODE_ERROR; | ||
| 709 | return 0; | ||
| 710 | } | ||
| 711 | |||
| 712 | *p = data; | ||
| 713 | |||
| 714 | ri_check: | ||
| 715 | |||
| 716 | /* Determine if we need to see RI. Strictly speaking if we want to | ||
| 717 | * avoid an attack we should *always* see RI even on initial server | ||
| 718 | * hello because the client doesn't see any renegotiation during an | ||
| 719 | * attack. However this would mean we could not connect to any server | ||
| 720 | * which doesn't support RI so for the immediate future tolerate RI | ||
| 721 | * absence on initial connect only. | ||
| 722 | */ | ||
| 723 | if (!S3I(s)->renegotiate_seen && | ||
| 724 | !(s->internal->options & SSL_OP_LEGACY_SERVER_CONNECT)) { | ||
| 725 | *al = SSL_AD_HANDSHAKE_FAILURE; | ||
| 726 | SSLerror(s, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED); | ||
| 727 | return 0; | ||
| 728 | } | ||
| 729 | |||
| 730 | return 1; | ||
| 731 | |||
| 732 | err: | ||
| 733 | *al = SSL_AD_DECODE_ERROR; | ||
| 734 | return 0; | ||
| 735 | } | ||
| 736 | |||
| 737 | int | ||
| 738 | ssl_check_clienthello_tlsext_early(SSL *s) | 665 | ssl_check_clienthello_tlsext_early(SSL *s) |
| 739 | { | 666 | { |
| 740 | int ret = SSL_TLSEXT_ERR_NOACK; | 667 | int ret = SSL_TLSEXT_ERR_NOACK; |
