summaryrefslogtreecommitdiff
path: root/src/lib/libssl/t1_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/t1_lib.c')
-rw-r--r--src/lib/libssl/t1_lib.c113
1 files changed, 3 insertions, 110 deletions
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c
index 3e5133ab54..911e8d3f4e 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.127 2017/08/12 02:55:22 jsing Exp $ */ 1/* $OpenBSD: t1_lib.c,v 1.128 2017/08/12 21:03:08 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 *
@@ -779,16 +779,6 @@ skip_ext:
779 i2d_X509_EXTENSIONS(s->internal->tlsext_ocsp_exts, &ret); 779 i2d_X509_EXTENSIONS(s->internal->tlsext_ocsp_exts, &ret);
780 } 780 }
781 781
782 if (s->ctx->internal->next_proto_select_cb &&
783 !S3I(s)->tmp.finish_md_len) {
784 /* The client advertises an emtpy extension to indicate its
785 * support for Next Protocol Negotiation */
786 if ((size_t)(limit - ret) < 4)
787 return NULL;
788 s2n(TLSEXT_TYPE_next_proto_neg, ret);
789 s2n(0, ret);
790 }
791
792 if (s->internal->alpn_client_proto_list != NULL && 782 if (s->internal->alpn_client_proto_list != NULL &&
793 S3I(s)->tmp.finish_md_len == 0) { 783 S3I(s)->tmp.finish_md_len == 0) {
794 if ((size_t)(limit - ret) < 784 if ((size_t)(limit - ret) <
@@ -868,7 +858,6 @@ ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
868{ 858{
869 int extdatalen = 0; 859 int extdatalen = 0;
870 unsigned char *ret = p; 860 unsigned char *ret = p;
871 int next_proto_neg_seen;
872 size_t len; 861 size_t len;
873 CBB cbb; 862 CBB cbb;
874 863
@@ -949,26 +938,6 @@ ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
949 ret += sizeof(cryptopro_ext); 938 ret += sizeof(cryptopro_ext);
950 } 939 }
951 940
952 next_proto_neg_seen = S3I(s)->next_proto_neg_seen;
953 S3I(s)->next_proto_neg_seen = 0;
954 if (next_proto_neg_seen && s->ctx->internal->next_protos_advertised_cb) {
955 const unsigned char *npa;
956 unsigned int npalen;
957 int r;
958
959 r = s->ctx->internal->next_protos_advertised_cb(s, &npa, &npalen,
960 s->ctx->internal->next_protos_advertised_cb_arg);
961 if (r == SSL_TLSEXT_ERR_OK) {
962 if ((size_t)(limit - ret) < 4 + npalen)
963 return NULL;
964 s2n(TLSEXT_TYPE_next_proto_neg, ret);
965 s2n(npalen, ret);
966 memcpy(ret, npa, npalen);
967 ret += npalen;
968 S3I(s)->next_proto_neg_seen = 1;
969 }
970 }
971
972 if (S3I(s)->alpn_selected != NULL) { 941 if (S3I(s)->alpn_selected != NULL) {
973 const unsigned char *selected = S3I(s)->alpn_selected; 942 const unsigned char *selected = S3I(s)->alpn_selected;
974 unsigned int len = S3I(s)->alpn_selected_len; 943 unsigned int len = S3I(s)->alpn_selected_len;
@@ -1070,7 +1039,6 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
1070 s->internal->servername_done = 0; 1039 s->internal->servername_done = 0;
1071 s->tlsext_status_type = -1; 1040 s->tlsext_status_type = -1;
1072 S3I(s)->renegotiate_seen = 0; 1041 S3I(s)->renegotiate_seen = 0;
1073 S3I(s)->next_proto_neg_seen = 0;
1074 free(S3I(s)->alpn_selected); 1042 free(S3I(s)->alpn_selected);
1075 S3I(s)->alpn_selected = NULL; 1043 S3I(s)->alpn_selected = NULL;
1076 s->internal->srtp_profile = NULL; 1044 s->internal->srtp_profile = NULL;
@@ -1227,36 +1195,13 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
1227 */ 1195 */
1228 s->tlsext_status_type = -1; 1196 s->tlsext_status_type = -1;
1229 } 1197 }
1230 } 1198 } else if (type ==
1231 else if (type == TLSEXT_TYPE_next_proto_neg &&
1232 S3I(s)->tmp.finish_md_len == 0 &&
1233 S3I(s)->alpn_selected == NULL) {
1234 /* We shouldn't accept this extension on a
1235 * renegotiation.
1236 *
1237 * s->internal->new_session will be set on renegotiation, but we
1238 * probably shouldn't rely that it couldn't be set on
1239 * the initial renegotation too in certain cases (when
1240 * there's some other reason to disallow resuming an
1241 * earlier session -- the current code won't be doing
1242 * anything like that, but this might change).
1243
1244 * A valid sign that there's been a previous handshake
1245 * in this connection is if S3I(s)->tmp.finish_md_len >
1246 * 0. (We are talking about a check that will happen
1247 * in the Hello protocol round, well before a new
1248 * Finished message could have been computed.) */
1249 S3I(s)->next_proto_neg_seen = 1;
1250 }
1251 else if (type ==
1252 TLSEXT_TYPE_application_layer_protocol_negotiation && 1199 TLSEXT_TYPE_application_layer_protocol_negotiation &&
1253 s->ctx->internal->alpn_select_cb != NULL && 1200 s->ctx->internal->alpn_select_cb != NULL &&
1254 S3I(s)->tmp.finish_md_len == 0) { 1201 S3I(s)->tmp.finish_md_len == 0) {
1255 if (tls1_alpn_handle_client_hello(s, data, 1202 if (tls1_alpn_handle_client_hello(s, data,
1256 size, al) != 1) 1203 size, al) != 1)
1257 return (0); 1204 return (0);
1258 /* ALPN takes precedence over NPN. */
1259 S3I(s)->next_proto_neg_seen = 0;
1260 } 1205 }
1261 1206
1262 /* session ticket processed earlier */ 1207 /* session ticket processed earlier */
@@ -1293,25 +1238,6 @@ err:
1293 return 0; 1238 return 0;
1294} 1239}
1295 1240
1296/*
1297 * ssl_next_proto_validate validates a Next Protocol Negotiation block. No
1298 * elements of zero length are allowed and the set of elements must exactly fill
1299 * the length of the block.
1300 */
1301static char
1302ssl_next_proto_validate(const unsigned char *d, unsigned int len)
1303{
1304 CBS npn, value;
1305
1306 CBS_init(&npn, d, len);
1307 while (CBS_len(&npn) > 0) {
1308 if (!CBS_get_u8_length_prefixed(&npn, &value) ||
1309 CBS_len(&value) == 0)
1310 return 0;
1311 }
1312 return 1;
1313}
1314
1315int 1241int
1316ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, size_t n, int *al) 1242ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, size_t n, int *al)
1317{ 1243{
@@ -1323,7 +1249,6 @@ ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, size_t n, int *al)
1323 CBS cbs; 1249 CBS cbs;
1324 1250
1325 S3I(s)->renegotiate_seen = 0; 1251 S3I(s)->renegotiate_seen = 0;
1326 S3I(s)->next_proto_neg_seen = 0;
1327 free(S3I(s)->alpn_selected); 1252 free(S3I(s)->alpn_selected);
1328 S3I(s)->alpn_selected = NULL; 1253 S3I(s)->alpn_selected = NULL;
1329 1254
@@ -1375,39 +1300,7 @@ ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, size_t n, int *al)
1375 } 1300 }
1376 /* Set flag to expect CertificateStatus message */ 1301 /* Set flag to expect CertificateStatus message */
1377 s->internal->tlsext_status_expected = 1; 1302 s->internal->tlsext_status_expected = 1;
1378 } 1303 } else if (type ==
1379 else if (type == TLSEXT_TYPE_next_proto_neg &&
1380 S3I(s)->tmp.finish_md_len == 0) {
1381 unsigned char *selected;
1382 unsigned char selected_len;
1383
1384 /* We must have requested it. */
1385 if (s->ctx->internal->next_proto_select_cb == NULL) {
1386 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
1387 return 0;
1388 }
1389 /* The data must be valid */
1390 if (!ssl_next_proto_validate(data, size)) {
1391 *al = TLS1_AD_DECODE_ERROR;
1392 return 0;
1393 }
1394 if (s->ctx->internal->next_proto_select_cb(s, &selected,
1395 &selected_len, data, size,
1396 s->ctx->internal->next_proto_select_cb_arg) !=
1397 SSL_TLSEXT_ERR_OK) {
1398 *al = TLS1_AD_INTERNAL_ERROR;
1399 return 0;
1400 }
1401 s->internal->next_proto_negotiated = malloc(selected_len);
1402 if (!s->internal->next_proto_negotiated) {
1403 *al = TLS1_AD_INTERNAL_ERROR;
1404 return 0;
1405 }
1406 memcpy(s->internal->next_proto_negotiated, selected, selected_len);
1407 s->internal->next_proto_negotiated_len = selected_len;
1408 S3I(s)->next_proto_neg_seen = 1;
1409 }
1410 else if (type ==
1411 TLSEXT_TYPE_application_layer_protocol_negotiation) { 1304 TLSEXT_TYPE_application_layer_protocol_negotiation) {
1412 unsigned int len; 1305 unsigned int len;
1413 1306