summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorjsing <>2017-07-24 17:10:31 +0000
committerjsing <>2017-07-24 17:10:31 +0000
commit367191ae741e8a7c4ce333bdaa5ef7aaa43e3d3b (patch)
tree8569a0a64e02d438a436db68dfa476dc61e0f26f /src/lib
parentd6011d52b96722a292a3849d4f6c034339a53006 (diff)
downloadopenbsd-367191ae741e8a7c4ce333bdaa5ef7aaa43e3d3b.tar.gz
openbsd-367191ae741e8a7c4ce333bdaa5ef7aaa43e3d3b.tar.bz2
openbsd-367191ae741e8a7c4ce333bdaa5ef7aaa43e3d3b.zip
Rewrite the TLS Renegotiation Indication extension handling using CBB/CBS
and the new extension framework. Feedback from doug@ ok inoguchi@
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libssl/Makefile4
-rw-r--r--src/lib/libssl/ssl_locl.h13
-rw-r--r--src/lib/libssl/ssl_tlsext.c143
-rw-r--r--src/lib/libssl/ssl_tlsext.h9
-rw-r--r--src/lib/libssl/t1_lib.c63
-rw-r--r--src/lib/libssl/t1_reneg.c275
6 files changed, 161 insertions, 346 deletions
diff --git a/src/lib/libssl/Makefile b/src/lib/libssl/Makefile
index f004507060..6ae361c00c 100644
--- a/src/lib/libssl/Makefile
+++ b/src/lib/libssl/Makefile
@@ -1,4 +1,4 @@
1# $OpenBSD: Makefile,v 1.36 2017/07/16 18:14:37 jsing Exp $ 1# $OpenBSD: Makefile,v 1.37 2017/07/24 17:10:31 jsing Exp $
2 2
3.include <bsd.own.mk> 3.include <bsd.own.mk>
4.ifndef NOMAN 4.ifndef NOMAN
@@ -32,7 +32,7 @@ SRCS= \
32 ssl_lib.c ssl_cert.c ssl_sess.c \ 32 ssl_lib.c ssl_cert.c ssl_sess.c \
33 ssl_ciph.c ssl_stat.c ssl_rsa.c \ 33 ssl_ciph.c ssl_stat.c ssl_rsa.c \
34 ssl_asn1.c ssl_txt.c ssl_algs.c \ 34 ssl_asn1.c ssl_txt.c ssl_algs.c \
35 bio_ssl.c ssl_err.c t1_reneg.c \ 35 bio_ssl.c ssl_err.c \
36 ssl_packet.c ssl_tlsext.c ssl_versions.c pqueue.c 36 ssl_packet.c ssl_tlsext.c ssl_versions.c pqueue.c
37SRCS+= s3_cbc.c 37SRCS+= s3_cbc.c
38SRCS+= bs_ber.c bs_cbb.c bs_cbs.c 38SRCS+= bs_ber.c bs_cbb.c bs_cbs.c
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h
index 8f1721ce5a..0d48920471 100644
--- a/src/lib/libssl/ssl_locl.h
+++ b/src/lib/libssl/ssl_locl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_locl.h,v 1.181 2017/05/07 04:22:24 beck Exp $ */ 1/* $OpenBSD: ssl_locl.h,v 1.182 2017/07/24 17:10:31 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 *
@@ -881,6 +881,9 @@ typedef struct ssl3_state_internal_st {
881 unsigned char previous_server_finished_len; 881 unsigned char previous_server_finished_len;
882 int send_connection_binding; /* TODOEKR */ 882 int send_connection_binding; /* TODOEKR */
883 883
884 /* Set if we saw a Renegotiation Indication extension from our peer. */
885 int renegotiate_seen;
886
884 /* Set if we saw the Next Protocol Negotiation extension from our peer. 887 /* Set if we saw the Next Protocol Negotiation extension from our peer.
885 */ 888 */
886 int next_proto_neg_seen; 889 int next_proto_neg_seen;
@@ -1344,14 +1347,6 @@ int tls12_get_sigid(const EVP_PKEY *pk);
1344const EVP_MD *tls12_get_hash(unsigned char hash_alg); 1347const EVP_MD *tls12_get_hash(unsigned char hash_alg);
1345 1348
1346void ssl_clear_hash_ctx(EVP_MD_CTX **hash); 1349void ssl_clear_hash_ctx(EVP_MD_CTX **hash);
1347int ssl_add_serverhello_renegotiate_ext(SSL *s, unsigned char *p,
1348 int *len, int maxlen);
1349int ssl_parse_serverhello_renegotiate_ext(SSL *s, const unsigned char *d,
1350 int len, int *al);
1351int ssl_add_clienthello_renegotiate_ext(SSL *s, unsigned char *p,
1352 int *len, int maxlen);
1353int ssl_parse_clienthello_renegotiate_ext(SSL *s, const unsigned char *d,
1354 int len, int *al);
1355long ssl_get_algorithm2(SSL *s); 1350long ssl_get_algorithm2(SSL *s);
1356int tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize); 1351int tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize);
1357int tls12_get_req_sig_algs(SSL *s, unsigned char *p); 1352int tls12_get_req_sig_algs(SSL *s, unsigned char *p);
diff --git a/src/lib/libssl/ssl_tlsext.c b/src/lib/libssl/ssl_tlsext.c
index 18ac98103a..539c380fb9 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.1 2017/07/16 18:14:37 jsing Exp $ */ 1/* $OpenBSD: ssl_tlsext.c,v 1.2 2017/07/24 17:10:31 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -21,6 +21,138 @@
21#include "ssl_tlsext.h" 21#include "ssl_tlsext.h"
22 22
23/* 23/*
24 * Renegotiation Indication - RFC 5746.
25 */
26int
27tlsext_ri_clienthello_needs(SSL *s)
28{
29 return (s->internal->renegotiate);
30}
31
32int
33tlsext_ri_clienthello_build(SSL *s, CBB *cbb)
34{
35 CBB reneg;
36
37 if (!CBB_add_u8_length_prefixed(cbb, &reneg))
38 return 0;
39 if (!CBB_add_bytes(&reneg, S3I(s)->previous_client_finished,
40 S3I(s)->previous_client_finished_len))
41 return 0;
42 if (!CBB_flush(cbb))
43 return 0;
44
45 return 1;
46}
47
48int
49tlsext_ri_clienthello_parse(SSL *s, CBS *cbs, int *alert)
50{
51 CBS reneg;
52
53 if (!CBS_get_u8_length_prefixed(cbs, &reneg))
54 goto err;
55 if (CBS_len(cbs) != 0)
56 goto err;
57
58 if (!CBS_mem_equal(&reneg, S3I(s)->previous_client_finished,
59 S3I(s)->previous_client_finished_len)) {
60 SSLerror(s, SSL_R_RENEGOTIATION_MISMATCH);
61 *alert = SSL_AD_HANDSHAKE_FAILURE;
62 return 0;
63 }
64
65 S3I(s)->renegotiate_seen = 1;
66 S3I(s)->send_connection_binding = 1;
67
68 return 1;
69
70 err:
71 SSLerror(s, SSL_R_RENEGOTIATION_ENCODING_ERR);
72 *alert = SSL_AD_DECODE_ERROR;
73 return 0;
74}
75
76int
77tlsext_ri_serverhello_needs(SSL *s)
78{
79 return (S3I(s)->send_connection_binding);
80}
81
82int
83tlsext_ri_serverhello_build(SSL *s, CBB *cbb)
84{
85 CBB reneg;
86
87 if (!CBB_add_u8_length_prefixed(cbb, &reneg))
88 return 0;
89 if (!CBB_add_bytes(&reneg, S3I(s)->previous_client_finished,
90 S3I(s)->previous_client_finished_len))
91 return 0;
92 if (!CBB_add_bytes(&reneg, S3I(s)->previous_server_finished,
93 S3I(s)->previous_server_finished_len))
94 return 0;
95 if (!CBB_flush(cbb))
96 return 0;
97
98 return 1;
99}
100
101int
102tlsext_ri_serverhello_parse(SSL *s, CBS *cbs, int *alert)
103{
104 CBS reneg, prev_client, prev_server;
105
106 /*
107 * Ensure that the previous client and server values are both not
108 * present, or that they are both present.
109 */
110 if ((S3I(s)->previous_client_finished_len == 0 &&
111 S3I(s)->previous_server_finished_len != 0) ||
112 (S3I(s)->previous_client_finished_len != 0 &&
113 S3I(s)->previous_server_finished_len == 0)) {
114 *alert = TLS1_AD_INTERNAL_ERROR;
115 return 0;
116 }
117
118 if (!CBS_get_u8_length_prefixed(cbs, &reneg))
119 goto err;
120 if (!CBS_get_bytes(&reneg, &prev_client,
121 S3I(s)->previous_client_finished_len))
122 goto err;
123 if (!CBS_get_bytes(&reneg, &prev_server,
124 S3I(s)->previous_server_finished_len))
125 goto err;
126 if (CBS_len(&reneg) != 0)
127 goto err;
128 if (CBS_len(cbs) != 0)
129 goto err;
130
131 if (!CBS_mem_equal(&prev_client, S3I(s)->previous_client_finished,
132 S3I(s)->previous_client_finished_len)) {
133 SSLerror(s, SSL_R_RENEGOTIATION_MISMATCH);
134 *alert = SSL_AD_HANDSHAKE_FAILURE;
135 return 0;
136 }
137 if (!CBS_mem_equal(&prev_server, S3I(s)->previous_server_finished,
138 S3I(s)->previous_server_finished_len)) {
139 SSLerror(s, SSL_R_RENEGOTIATION_MISMATCH);
140 *alert = SSL_AD_HANDSHAKE_FAILURE;
141 return 0;
142 }
143
144 S3I(s)->renegotiate_seen = 1;
145 S3I(s)->send_connection_binding = 1;
146
147 return 1;
148
149 err:
150 SSLerror(s, SSL_R_RENEGOTIATION_ENCODING_ERR);
151 *alert = SSL_AD_DECODE_ERROR;
152 return 0;
153}
154
155/*
24 * Server Name Indication - RFC 6066, section 3. 156 * Server Name Indication - RFC 6066, section 3.
25 */ 157 */
26int 158int
@@ -150,6 +282,15 @@ static struct tls_extension tls_extensions[] = {
150 .serverhello_build = tlsext_sni_serverhello_build, 282 .serverhello_build = tlsext_sni_serverhello_build,
151 .serverhello_parse = tlsext_sni_serverhello_parse, 283 .serverhello_parse = tlsext_sni_serverhello_parse,
152 }, 284 },
285 {
286 .type = TLSEXT_TYPE_renegotiate,
287 .clienthello_needs = tlsext_ri_clienthello_needs,
288 .clienthello_build = tlsext_ri_clienthello_build,
289 .clienthello_parse = tlsext_ri_clienthello_parse,
290 .serverhello_needs = tlsext_ri_serverhello_needs,
291 .serverhello_build = tlsext_ri_serverhello_build,
292 .serverhello_parse = tlsext_ri_serverhello_parse,
293 },
153}; 294};
154 295
155#define N_TLS_EXTENSIONS (sizeof(tls_extensions) / sizeof(*tls_extensions)) 296#define N_TLS_EXTENSIONS (sizeof(tls_extensions) / sizeof(*tls_extensions))
diff --git a/src/lib/libssl/ssl_tlsext.h b/src/lib/libssl/ssl_tlsext.h
index a8e478d9c0..4b0194861a 100644
--- a/src/lib/libssl/ssl_tlsext.h
+++ b/src/lib/libssl/ssl_tlsext.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_tlsext.h,v 1.1 2017/07/16 18:14:37 jsing Exp $ */ 1/* $OpenBSD: ssl_tlsext.h,v 1.2 2017/07/24 17:10:31 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -15,6 +15,13 @@
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */ 16 */
17 17
18int tlsext_ri_clienthello_needs(SSL *s);
19int tlsext_ri_clienthello_build(SSL *s, CBB *cbb);
20int tlsext_ri_clienthello_parse(SSL *s, CBS *cbs, int *alert);
21int tlsext_ri_serverhello_needs(SSL *s);
22int tlsext_ri_serverhello_build(SSL *s, CBB *cbb);
23int tlsext_ri_serverhello_parse(SSL *s, CBS *cbs, int *alert);
24
18int tlsext_sni_clienthello_needs(SSL *s); 25int tlsext_sni_clienthello_needs(SSL *s);
19int tlsext_sni_clienthello_build(SSL *s, CBB *cbb); 26int tlsext_sni_clienthello_build(SSL *s, CBB *cbb);
20int tlsext_sni_clienthello_parse(SSL *s, CBS *cbs, int *alert); 27int tlsext_sni_clienthello_parse(SSL *s, CBS *cbs, int *alert);
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c
index 8d56e74759..bf5e2de80b 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.120 2017/07/23 16:27:44 jsing Exp $ */ 1/* $OpenBSD: t1_lib.c,v 1.121 2017/07/24 17:10:31 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 *
@@ -720,29 +720,6 @@ ssl_add_clienthello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
720 return NULL; 720 return NULL;
721 ret += len; 721 ret += len;
722 722
723 /* Add RI if renegotiating */
724 if (s->internal->renegotiate) {
725 int el;
726
727 if (!ssl_add_clienthello_renegotiate_ext(s, 0, &el, 0)) {
728 SSLerror(s, ERR_R_INTERNAL_ERROR);
729 return NULL;
730 }
731
732 if ((size_t)(limit - ret) < 4 + el)
733 return NULL;
734
735 s2n(TLSEXT_TYPE_renegotiate, ret);
736 s2n(el, ret);
737
738 if (!ssl_add_clienthello_renegotiate_ext(s, ret, &el, el)) {
739 SSLerror(s, ERR_R_INTERNAL_ERROR);
740 return NULL;
741 }
742
743 ret += el;
744 }
745
746 if (using_ecc) { 723 if (using_ecc) {
747 size_t curveslen, formatslen, lenmax; 724 size_t curveslen, formatslen, lenmax;
748 const uint16_t *curves; 725 const uint16_t *curves;
@@ -1006,28 +983,6 @@ ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
1006 return NULL; 983 return NULL;
1007 ret += len; 984 ret += len;
1008 985
1009 if (S3I(s)->send_connection_binding) {
1010 int el;
1011
1012 if (!ssl_add_serverhello_renegotiate_ext(s, 0, &el, 0)) {
1013 SSLerror(s, ERR_R_INTERNAL_ERROR);
1014 return NULL;
1015 }
1016
1017 if ((size_t)(limit - ret) < 4 + el)
1018 return NULL;
1019
1020 s2n(TLSEXT_TYPE_renegotiate, ret);
1021 s2n(el, ret);
1022
1023 if (!ssl_add_serverhello_renegotiate_ext(s, ret, &el, el)) {
1024 SSLerror(s, ERR_R_INTERNAL_ERROR);
1025 return NULL;
1026 }
1027
1028 ret += el;
1029 }
1030
1031 if (using_ecc && s->version != DTLS1_VERSION) { 986 if (using_ecc && s->version != DTLS1_VERSION) {
1032 const unsigned char *formats; 987 const unsigned char *formats;
1033 size_t formatslen, lenmax; 988 size_t formatslen, lenmax;
@@ -1229,12 +1184,12 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
1229 unsigned short len; 1184 unsigned short len;
1230 unsigned char *data = *p; 1185 unsigned char *data = *p;
1231 unsigned char *end = d + n; 1186 unsigned char *end = d + n;
1232 int renegotiate_seen = 0;
1233 int sigalg_seen = 0; 1187 int sigalg_seen = 0;
1234 CBS cbs; 1188 CBS cbs;
1235 1189
1236 s->internal->servername_done = 0; 1190 s->internal->servername_done = 0;
1237 s->tlsext_status_type = -1; 1191 s->tlsext_status_type = -1;
1192 S3I(s)->renegotiate_seen = 0;
1238 S3I(s)->next_proto_neg_seen = 0; 1193 S3I(s)->next_proto_neg_seen = 0;
1239 free(S3I(s)->alpn_selected); 1194 free(S3I(s)->alpn_selected);
1240 S3I(s)->alpn_selected = NULL; 1195 S3I(s)->alpn_selected = NULL;
@@ -1335,10 +1290,6 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
1335 *al = TLS1_AD_INTERNAL_ERROR; 1290 *al = TLS1_AD_INTERNAL_ERROR;
1336 return 0; 1291 return 0;
1337 } 1292 }
1338 } else if (type == TLSEXT_TYPE_renegotiate) {
1339 if (!ssl_parse_clienthello_renegotiate_ext(s, data, size, al))
1340 return 0;
1341 renegotiate_seen = 1;
1342 } else if (type == TLSEXT_TYPE_signature_algorithms) { 1293 } else if (type == TLSEXT_TYPE_signature_algorithms) {
1343 int dsize; 1294 int dsize;
1344 if (sigalg_seen || size < 2) { 1295 if (sigalg_seen || size < 2) {
@@ -1513,7 +1464,7 @@ ri_check:
1513 1464
1514 /* Need RI if renegotiating */ 1465 /* Need RI if renegotiating */
1515 1466
1516 if (!renegotiate_seen && s->internal->renegotiate) { 1467 if (!S3I(s)->renegotiate_seen && s->internal->renegotiate) {
1517 *al = SSL_AD_HANDSHAKE_FAILURE; 1468 *al = SSL_AD_HANDSHAKE_FAILURE;
1518 SSLerror(s, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED); 1469 SSLerror(s, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
1519 return 0; 1470 return 0;
@@ -1554,9 +1505,9 @@ ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, size_t n, int *al)
1554 unsigned char *data = *p; 1505 unsigned char *data = *p;
1555 unsigned char *end = *p + n; 1506 unsigned char *end = *p + n;
1556 int tlsext_servername = 0; 1507 int tlsext_servername = 0;
1557 int renegotiate_seen = 0;
1558 CBS cbs; 1508 CBS cbs;
1559 1509
1510 S3I(s)->renegotiate_seen = 0;
1560 S3I(s)->next_proto_neg_seen = 0; 1511 S3I(s)->next_proto_neg_seen = 0;
1561 free(S3I(s)->alpn_selected); 1512 free(S3I(s)->alpn_selected);
1562 S3I(s)->alpn_selected = NULL; 1513 S3I(s)->alpn_selected = NULL;
@@ -1719,10 +1670,6 @@ ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, size_t n, int *al)
1719 memcpy(S3I(s)->alpn_selected, data + 3, len); 1670 memcpy(S3I(s)->alpn_selected, data + 3, len);
1720 S3I(s)->alpn_selected_len = len; 1671 S3I(s)->alpn_selected_len = len;
1721 1672
1722 } else if (type == TLSEXT_TYPE_renegotiate) {
1723 if (!ssl_parse_serverhello_renegotiate_ext(s, data, size, al))
1724 return 0;
1725 renegotiate_seen = 1;
1726 } 1673 }
1727#ifndef OPENSSL_NO_SRTP 1674#ifndef OPENSSL_NO_SRTP
1728 else if (SSL_IS_DTLS(s) && type == TLSEXT_TYPE_use_srtp) { 1675 else if (SSL_IS_DTLS(s) && type == TLSEXT_TYPE_use_srtp) {
@@ -1769,7 +1716,7 @@ ri_check:
1769 * which doesn't support RI so for the immediate future tolerate RI 1716 * which doesn't support RI so for the immediate future tolerate RI
1770 * absence on initial connect only. 1717 * absence on initial connect only.
1771 */ 1718 */
1772 if (!renegotiate_seen && 1719 if (!S3I(s)->renegotiate_seen &&
1773 !(s->internal->options & SSL_OP_LEGACY_SERVER_CONNECT)) { 1720 !(s->internal->options & SSL_OP_LEGACY_SERVER_CONNECT)) {
1774 *al = SSL_AD_HANDSHAKE_FAILURE; 1721 *al = SSL_AD_HANDSHAKE_FAILURE;
1775 SSLerror(s, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED); 1722 SSLerror(s, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
diff --git a/src/lib/libssl/t1_reneg.c b/src/lib/libssl/t1_reneg.c
deleted file mode 100644
index 4e194dd5df..0000000000
--- a/src/lib/libssl/t1_reneg.c
+++ /dev/null
@@ -1,275 +0,0 @@
1/* $OpenBSD: t1_reneg.c,v 1.15 2017/02/07 02:08:38 beck Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58/* ====================================================================
59 * Copyright (c) 1998-2009 The OpenSSL Project. All rights reserved.
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in
70 * the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 * software must display the following acknowledgment:
75 * "This product includes software developed by the OpenSSL Project
76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 * endorse or promote products derived from this software without
80 * prior written permission. For written permission, please contact
81 * openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 * nor may "OpenSSL" appear in their names without prior written
85 * permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 * acknowledgment:
89 * "This product includes software developed by the OpenSSL Project
90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com). This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
111
112#include <stdio.h>
113
114#include <openssl/objects.h>
115
116#include "ssl_locl.h"
117#include "bytestring.h"
118
119/* Add the client's renegotiation binding */
120int
121ssl_add_clienthello_renegotiate_ext(SSL *s, unsigned char *p, int *len,
122 int maxlen)
123{
124 if (p) {
125 if ((S3I(s)->previous_client_finished_len + 1) > maxlen) {
126 SSLerror(s, SSL_R_RENEGOTIATE_EXT_TOO_LONG);
127 return 0;
128 }
129
130 /* Length byte */
131 *p = S3I(s)->previous_client_finished_len;
132 p++;
133
134 memcpy(p, S3I(s)->previous_client_finished,
135 S3I(s)->previous_client_finished_len);
136
137 }
138
139 *len = S3I(s)->previous_client_finished_len + 1;
140
141 return 1;
142}
143
144/* Parse the client's renegotiation binding and abort if it's not
145 right */
146int
147ssl_parse_clienthello_renegotiate_ext(SSL *s, const unsigned char *d, int len,
148 int *al)
149{
150 CBS cbs, reneg;
151
152 if (len < 0) {
153 SSLerror(s, SSL_R_RENEGOTIATION_ENCODING_ERR);
154 *al = SSL_AD_ILLEGAL_PARAMETER;
155 return 0;
156 }
157
158 CBS_init(&cbs, d, len);
159 if (!CBS_get_u8_length_prefixed(&cbs, &reneg) ||
160 /* Consistency check */
161 CBS_len(&cbs) != 0) {
162 SSLerror(s, SSL_R_RENEGOTIATION_ENCODING_ERR);
163 *al = SSL_AD_ILLEGAL_PARAMETER;
164 return 0;
165 }
166
167 /* Check that the extension matches */
168 if (CBS_len(&reneg) != S3I(s)->previous_client_finished_len) {
169 SSLerror(s, SSL_R_RENEGOTIATION_MISMATCH);
170 *al = SSL_AD_HANDSHAKE_FAILURE;
171 return 0;
172 }
173
174 if (!CBS_mem_equal(&reneg, S3I(s)->previous_client_finished,
175 S3I(s)->previous_client_finished_len)) {
176 SSLerror(s, SSL_R_RENEGOTIATION_MISMATCH);
177 *al = SSL_AD_HANDSHAKE_FAILURE;
178 return 0;
179 }
180
181 S3I(s)->send_connection_binding = 1;
182
183 return 1;
184}
185
186/* Add the server's renegotiation binding */
187int
188ssl_add_serverhello_renegotiate_ext(SSL *s, unsigned char *p, int *len,
189 int maxlen)
190{
191 if (p) {
192 if ((S3I(s)->previous_client_finished_len +
193 S3I(s)->previous_server_finished_len + 1) > maxlen) {
194 SSLerror(s, SSL_R_RENEGOTIATE_EXT_TOO_LONG);
195 return 0;
196 }
197
198 /* Length byte */
199 *p = S3I(s)->previous_client_finished_len +
200 S3I(s)->previous_server_finished_len;
201 p++;
202
203 memcpy(p, S3I(s)->previous_client_finished,
204 S3I(s)->previous_client_finished_len);
205 p += S3I(s)->previous_client_finished_len;
206
207 memcpy(p, S3I(s)->previous_server_finished,
208 S3I(s)->previous_server_finished_len);
209
210 }
211
212 *len = S3I(s)->previous_client_finished_len +
213 S3I(s)->previous_server_finished_len + 1;
214
215 return 1;
216}
217
218/* Parse the server's renegotiation binding and abort if it's not
219 right */
220int
221ssl_parse_serverhello_renegotiate_ext(SSL *s, const unsigned char *d, int len, int *al)
222{
223 CBS cbs, reneg, previous_client, previous_server;
224 int expected_len = S3I(s)->previous_client_finished_len +
225 S3I(s)->previous_server_finished_len;
226
227 /* Check for logic errors */
228 OPENSSL_assert(!expected_len || S3I(s)->previous_client_finished_len);
229 OPENSSL_assert(!expected_len || S3I(s)->previous_server_finished_len);
230
231 if (len < 0) {
232 SSLerror(s, SSL_R_RENEGOTIATION_ENCODING_ERR);
233 *al = SSL_AD_ILLEGAL_PARAMETER;
234 return 0;
235 }
236
237 CBS_init(&cbs, d, len);
238
239 if (!CBS_get_u8_length_prefixed(&cbs, &reneg) ||
240 /* Consistency check */
241 CBS_len(&cbs) != 0) {
242 SSLerror(s, SSL_R_RENEGOTIATION_ENCODING_ERR);
243 *al = SSL_AD_ILLEGAL_PARAMETER;
244 return 0;
245 }
246
247 /* Check that the extension matches */
248 if (CBS_len(&reneg) != expected_len ||
249 !CBS_get_bytes(&reneg, &previous_client,
250 S3I(s)->previous_client_finished_len) ||
251 !CBS_get_bytes(&reneg, &previous_server,
252 S3I(s)->previous_server_finished_len) ||
253 CBS_len(&reneg) != 0) {
254 SSLerror(s, SSL_R_RENEGOTIATION_MISMATCH);
255 *al = SSL_AD_HANDSHAKE_FAILURE;
256 return 0;
257 }
258
259 if (!CBS_mem_equal(&previous_client, S3I(s)->previous_client_finished,
260 CBS_len(&previous_client))) {
261 SSLerror(s, SSL_R_RENEGOTIATION_MISMATCH);
262 *al = SSL_AD_HANDSHAKE_FAILURE;
263 return 0;
264 }
265 if (!CBS_mem_equal(&previous_server, S3I(s)->previous_server_finished,
266 CBS_len(&previous_server))) {
267 SSLerror(s, SSL_R_RENEGOTIATION_MISMATCH);
268 *al = SSL_AD_ILLEGAL_PARAMETER;
269 return 0;
270 }
271
272 S3I(s)->send_connection_binding = 1;
273
274 return 1;
275}