diff options
author | jsing <> | 2017-08-12 21:03:08 +0000 |
---|---|---|
committer | jsing <> | 2017-08-12 21:03:08 +0000 |
commit | c648197458d45db4f93561e9497fac0532e6d0bc (patch) | |
tree | 942d907ed1f094ec2a23893a790715396a4d7e4f /src/lib | |
parent | be646f37c6508ed75a22ff21af60f2496b432c9d (diff) | |
download | openbsd-c648197458d45db4f93561e9497fac0532e6d0bc.tar.gz openbsd-c648197458d45db4f93561e9497fac0532e6d0bc.tar.bz2 openbsd-c648197458d45db4f93561e9497fac0532e6d0bc.zip |
Remove NPN support.
NPN was never standardised and the last draft expired in October 2012.
ALPN was standardised in July 2014 and has been supported in LibreSSL
since December 2014. NPN has also been removed from Chromium in May 2016.
TLS clients and servers that try to use/enable NPN will fail gracefully and
fallback to the default protocol, since it will essentially appear that the
otherside does not support NPN. At some point in the future we will
actually remove the NPN related symbols entirely.
ok bcook@ beck@ doug@
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libssl/man/SSL_CTX_set_alpn_select_cb.3 | 5 | ||||
-rw-r--r-- | src/lib/libssl/s3_lib.c | 6 | ||||
-rw-r--r-- | src/lib/libssl/ssl_clnt.c | 56 | ||||
-rw-r--r-- | src/lib/libssl/ssl_lib.c | 78 | ||||
-rw-r--r-- | src/lib/libssl/ssl_locl.h | 43 | ||||
-rw-r--r-- | src/lib/libssl/ssl_srvr.c | 104 | ||||
-rw-r--r-- | src/lib/libssl/t1_lib.c | 113 |
7 files changed, 28 insertions, 377 deletions
diff --git a/src/lib/libssl/man/SSL_CTX_set_alpn_select_cb.3 b/src/lib/libssl/man/SSL_CTX_set_alpn_select_cb.3 index ea7b1faf48..eb6c543478 100644 --- a/src/lib/libssl/man/SSL_CTX_set_alpn_select_cb.3 +++ b/src/lib/libssl/man/SSL_CTX_set_alpn_select_cb.3 | |||
@@ -1,4 +1,4 @@ | |||
1 | .\" $OpenBSD: SSL_CTX_set_alpn_select_cb.3,v 1.2 2017/06/10 13:58:59 schwarze Exp $ | 1 | .\" $OpenBSD: SSL_CTX_set_alpn_select_cb.3,v 1.3 2017/08/12 21:03:08 jsing Exp $ |
2 | .\" OpenSSL b97fdb57 Nov 11 09:33:09 2016 +0100 | 2 | .\" OpenSSL b97fdb57 Nov 11 09:33:09 2016 +0100 |
3 | .\" | 3 | .\" |
4 | .\" This file was written by Todd Short <tshort@akamai.com>. | 4 | .\" This file was written by Todd Short <tshort@akamai.com>. |
@@ -48,7 +48,7 @@ | |||
48 | .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | 48 | .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
49 | .\" OF THE POSSIBILITY OF SUCH DAMAGE. | 49 | .\" OF THE POSSIBILITY OF SUCH DAMAGE. |
50 | .\" | 50 | .\" |
51 | .Dd $Mdocdate: June 10 2017 $ | 51 | .Dd $Mdocdate: August 12 2017 $ |
52 | .Dt SSL_CTX_SET_ALPN_SELECT_CB 3 | 52 | .Dt SSL_CTX_SET_ALPN_SELECT_CB 3 |
53 | .Os | 53 | .Os |
54 | .Sh NAME | 54 | .Sh NAME |
@@ -181,7 +181,6 @@ If no match is found, the first item in | |||
181 | is returned in | 181 | is returned in |
182 | .Fa out , | 182 | .Fa out , |
183 | .Fa outlen . | 183 | .Fa outlen . |
184 | This function can also be used in the NPN callback. | ||
185 | .Pp | 184 | .Pp |
186 | .Fn SSL_get0_alpn_selected | 185 | .Fn SSL_get0_alpn_selected |
187 | returns a pointer to the selected protocol in | 186 | returns a pointer to the selected protocol in |
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c index 3a11d62893..acbe30d804 100644 --- a/src/lib/libssl/s3_lib.c +++ b/src/lib/libssl/s3_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: s3_lib.c,v 1.157 2017/08/12 02:55:22 jsing Exp $ */ | 1 | /* $OpenBSD: s3_lib.c,v 1.158 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 | * |
@@ -1705,10 +1705,6 @@ ssl3_clear(SSL *s) | |||
1705 | 1705 | ||
1706 | s->internal->packet_length = 0; | 1706 | s->internal->packet_length = 0; |
1707 | s->version = TLS1_VERSION; | 1707 | s->version = TLS1_VERSION; |
1708 | |||
1709 | free(s->internal->next_proto_negotiated); | ||
1710 | s->internal->next_proto_negotiated = NULL; | ||
1711 | s->internal->next_proto_negotiated_len = 0; | ||
1712 | } | 1708 | } |
1713 | 1709 | ||
1714 | static long | 1710 | static long |
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c index 865c961db7..ec4a4104fc 100644 --- a/src/lib/libssl/ssl_clnt.c +++ b/src/lib/libssl/ssl_clnt.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_clnt.c,v 1.15 2017/08/12 02:55:22 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_clnt.c,v 1.16 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 | * |
@@ -407,14 +407,11 @@ ssl3_connect(SSL *s) | |||
407 | case SSL3_ST_CW_CHANGE_A: | 407 | case SSL3_ST_CW_CHANGE_A: |
408 | case SSL3_ST_CW_CHANGE_B: | 408 | case SSL3_ST_CW_CHANGE_B: |
409 | ret = ssl3_send_change_cipher_spec(s, | 409 | ret = ssl3_send_change_cipher_spec(s, |
410 | SSL3_ST_CW_CHANGE_A, SSL3_ST_CW_CHANGE_B); | 410 | SSL3_ST_CW_CHANGE_A, SSL3_ST_CW_CHANGE_B); |
411 | if (ret <= 0) | 411 | if (ret <= 0) |
412 | goto end; | 412 | goto end; |
413 | 413 | ||
414 | if (S3I(s)->next_proto_neg_seen) | 414 | S3I(s)->hs.state = SSL3_ST_CW_FINISHED_A; |
415 | S3I(s)->hs.state = SSL3_ST_CW_NEXT_PROTO_A; | ||
416 | else | ||
417 | S3I(s)->hs.state = SSL3_ST_CW_FINISHED_A; | ||
418 | s->internal->init_num = 0; | 415 | s->internal->init_num = 0; |
419 | 416 | ||
420 | s->session->cipher = S3I(s)->hs.new_cipher; | 417 | s->session->cipher = S3I(s)->hs.new_cipher; |
@@ -431,14 +428,6 @@ ssl3_connect(SSL *s) | |||
431 | 428 | ||
432 | break; | 429 | break; |
433 | 430 | ||
434 | case SSL3_ST_CW_NEXT_PROTO_A: | ||
435 | case SSL3_ST_CW_NEXT_PROTO_B: | ||
436 | ret = ssl3_send_next_proto(s); | ||
437 | if (ret <= 0) | ||
438 | goto end; | ||
439 | S3I(s)->hs.state = SSL3_ST_CW_FINISHED_A; | ||
440 | break; | ||
441 | |||
442 | case SSL3_ST_CW_FINISHED_A: | 431 | case SSL3_ST_CW_FINISHED_A: |
443 | case SSL3_ST_CW_FINISHED_B: | 432 | case SSL3_ST_CW_FINISHED_B: |
444 | ret = ssl3_send_finished(s, SSL3_ST_CW_FINISHED_A, | 433 | ret = ssl3_send_finished(s, SSL3_ST_CW_FINISHED_A, |
@@ -2599,45 +2588,6 @@ err: | |||
2599 | return (0); | 2588 | return (0); |
2600 | } | 2589 | } |
2601 | 2590 | ||
2602 | int | ||
2603 | ssl3_send_next_proto(SSL *s) | ||
2604 | { | ||
2605 | CBB cbb, nextproto, npn, padding; | ||
2606 | size_t pad_len; | ||
2607 | uint8_t *pad; | ||
2608 | |||
2609 | memset(&cbb, 0, sizeof(cbb)); | ||
2610 | |||
2611 | if (S3I(s)->hs.state == SSL3_ST_CW_NEXT_PROTO_A) { | ||
2612 | pad_len = 32 - ((s->internal->next_proto_negotiated_len + 2) % 32); | ||
2613 | |||
2614 | if (!ssl3_handshake_msg_start_cbb(s, &cbb, &nextproto, | ||
2615 | SSL3_MT_NEXT_PROTO)) | ||
2616 | goto err; | ||
2617 | if (!CBB_add_u8_length_prefixed(&nextproto, &npn)) | ||
2618 | goto err; | ||
2619 | if (!CBB_add_bytes(&npn, s->internal->next_proto_negotiated, | ||
2620 | s->internal->next_proto_negotiated_len)) | ||
2621 | goto err; | ||
2622 | if (!CBB_add_u8_length_prefixed(&nextproto, &padding)) | ||
2623 | goto err; | ||
2624 | if (!CBB_add_space(&padding, &pad, pad_len)) | ||
2625 | goto err; | ||
2626 | memset(pad, 0, pad_len); | ||
2627 | if (!ssl3_handshake_msg_finish_cbb(s, &cbb)) | ||
2628 | goto err; | ||
2629 | |||
2630 | S3I(s)->hs.state = SSL3_ST_CW_NEXT_PROTO_B; | ||
2631 | } | ||
2632 | |||
2633 | return (ssl3_handshake_write(s)); | ||
2634 | |||
2635 | err: | ||
2636 | CBB_cleanup(&cbb); | ||
2637 | |||
2638 | return (-1); | ||
2639 | } | ||
2640 | |||
2641 | /* | 2591 | /* |
2642 | * Check to see if handshake is full or resumed. Usually this is just a | 2592 | * Check to see if handshake is full or resumed. Usually this is just a |
2643 | * case of checking to see if a cache hit has occurred. In the case of | 2593 | * case of checking to see if a cache hit has occurred. In the case of |
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c index de78ad2fcf..32a5680db7 100644 --- a/src/lib/libssl/ssl_lib.c +++ b/src/lib/libssl/ssl_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_lib.c,v 1.166 2017/08/12 02:55:22 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_lib.c,v 1.167 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 | * |
@@ -339,8 +339,6 @@ SSL_new(SSL_CTX *ctx) | |||
339 | ctx->internal->tlsext_supportedgroups_length; | 339 | ctx->internal->tlsext_supportedgroups_length; |
340 | } | 340 | } |
341 | 341 | ||
342 | s->internal->next_proto_negotiated = NULL; | ||
343 | |||
344 | if (s->ctx->internal->alpn_client_proto_list != NULL) { | 342 | if (s->ctx->internal->alpn_client_proto_list != NULL) { |
345 | s->internal->alpn_client_proto_list = | 343 | s->internal->alpn_client_proto_list = |
346 | malloc(s->ctx->internal->alpn_client_proto_list_len); | 344 | malloc(s->ctx->internal->alpn_client_proto_list_len); |
@@ -548,7 +546,6 @@ SSL_free(SSL *s) | |||
548 | 546 | ||
549 | SSL_CTX_free(s->ctx); | 547 | SSL_CTX_free(s->ctx); |
550 | 548 | ||
551 | free(s->internal->next_proto_negotiated); | ||
552 | free(s->internal->alpn_client_proto_list); | 549 | free(s->internal->alpn_client_proto_list); |
553 | 550 | ||
554 | #ifndef OPENSSL_NO_SRTP | 551 | #ifndef OPENSSL_NO_SRTP |
@@ -1541,33 +1538,15 @@ SSL_get_servername_type(const SSL *s) | |||
1541 | } | 1538 | } |
1542 | 1539 | ||
1543 | /* | 1540 | /* |
1544 | * SSL_select_next_proto implements the standard protocol selection. It is | 1541 | * SSL_select_next_proto implements standard protocol selection. It is |
1545 | * expected that this function is called from the callback set by | 1542 | * expected that this function is called from the callback set by |
1546 | * SSL_CTX_set_next_proto_select_cb. | 1543 | * SSL_CTX_set_alpn_select_cb. |
1547 | * | 1544 | * |
1548 | * The protocol data is assumed to be a vector of 8-bit, length prefixed byte | 1545 | * The protocol data is assumed to be a vector of 8-bit, length prefixed byte |
1549 | * strings. The length byte itself is not included in the length. A byte | 1546 | * strings. The length byte itself is not included in the length. A byte |
1550 | * string of length 0 is invalid. No byte string may be truncated. | 1547 | * string of length 0 is invalid. No byte string may be truncated. |
1551 | * | 1548 | * |
1552 | * The current, but experimental algorithm for selecting the protocol is: | 1549 | * It returns either: |
1553 | * | ||
1554 | * 1) If the server doesn't support NPN then this is indicated to the | ||
1555 | * callback. In this case, the client application has to abort the connection | ||
1556 | * or have a default application level protocol. | ||
1557 | * | ||
1558 | * 2) If the server supports NPN, but advertises an empty list then the | ||
1559 | * client selects the first protcol in its list, but indicates via the | ||
1560 | * API that this fallback case was enacted. | ||
1561 | * | ||
1562 | * 3) Otherwise, the client finds the first protocol in the server's list | ||
1563 | * that it supports and selects this protocol. This is because it's | ||
1564 | * assumed that the server has better information about which protocol | ||
1565 | * a client should use. | ||
1566 | * | ||
1567 | * 4) If the client doesn't support any of the server's advertised | ||
1568 | * protocols, then this is treated the same as case 2. | ||
1569 | * | ||
1570 | * It returns either | ||
1571 | * OPENSSL_NPN_NEGOTIATED if a common protocol was found, or | 1550 | * OPENSSL_NPN_NEGOTIATED if a common protocol was found, or |
1572 | * OPENSSL_NPN_NO_OVERLAP if the fallback case was reached. | 1551 | * OPENSSL_NPN_NO_OVERLAP if the fallback case was reached. |
1573 | */ | 1552 | */ |
@@ -1611,64 +1590,28 @@ found: | |||
1611 | return (status); | 1590 | return (status); |
1612 | } | 1591 | } |
1613 | 1592 | ||
1614 | /* | 1593 | /* SSL_get0_next_proto_negotiated is deprecated. */ |
1615 | * SSL_get0_next_proto_negotiated sets *data and *len to point to the client's | ||
1616 | * requested protocol for this connection and returns 0. If the client didn't | ||
1617 | * request any protocol, then *data is set to NULL. | ||
1618 | * | ||
1619 | * Note that the client can request any protocol it chooses. The value returned | ||
1620 | * from this function need not be a member of the list of supported protocols | ||
1621 | * provided by the callback. | ||
1622 | */ | ||
1623 | void | 1594 | void |
1624 | SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, | 1595 | SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, |
1625 | unsigned *len) | 1596 | unsigned *len) |
1626 | { | 1597 | { |
1627 | *data = s->internal->next_proto_negotiated; | 1598 | *data = NULL; |
1628 | if (!*data) { | 1599 | *len = 0; |
1629 | *len = 0; | ||
1630 | } else { | ||
1631 | *len = s->internal->next_proto_negotiated_len; | ||
1632 | } | ||
1633 | } | 1600 | } |
1634 | 1601 | ||
1635 | /* | 1602 | /* SSL_CTX_set_next_protos_advertised_cb is deprecated. */ |
1636 | * SSL_CTX_set_next_protos_advertised_cb sets a callback that is called when a | ||
1637 | * TLS server needs a list of supported protocols for Next Protocol | ||
1638 | * Negotiation. The returned list must be in wire format. The list is returned | ||
1639 | * by setting |out| to point to it and |outlen| to its length. This memory will | ||
1640 | * not be modified, but one should assume that the SSL* keeps a reference to | ||
1641 | * it. | ||
1642 | * | ||
1643 | * The callback should return SSL_TLSEXT_ERR_OK if it wishes to advertise. | ||
1644 | * Otherwise, no such extension will be included in the ServerHello. | ||
1645 | */ | ||
1646 | void | 1603 | void |
1647 | SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *ctx, int (*cb) (SSL *ssl, | 1604 | SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *ctx, int (*cb) (SSL *ssl, |
1648 | const unsigned char **out, unsigned int *outlen, void *arg), void *arg) | 1605 | const unsigned char **out, unsigned int *outlen, void *arg), void *arg) |
1649 | { | 1606 | { |
1650 | ctx->internal->next_protos_advertised_cb = cb; | ||
1651 | ctx->internal->next_protos_advertised_cb_arg = arg; | ||
1652 | } | 1607 | } |
1653 | 1608 | ||
1654 | /* | 1609 | /* SSL_CTX_set_next_proto_select_cb is deprecated. */ |
1655 | * SSL_CTX_set_next_proto_select_cb sets a callback that is called when a | ||
1656 | * client needs to select a protocol from the server's provided list. |out| | ||
1657 | * must be set to point to the selected protocol (which may be within |in|). | ||
1658 | * The length of the protocol name must be written into |outlen|. The server's | ||
1659 | * advertised protocols are provided in |in| and |inlen|. The callback can | ||
1660 | * assume that |in| is syntactically valid. | ||
1661 | * | ||
1662 | * The client must select a protocol. It is fatal to the connection if this | ||
1663 | * callback returns a value other than SSL_TLSEXT_ERR_OK. | ||
1664 | */ | ||
1665 | void | 1610 | void |
1666 | SSL_CTX_set_next_proto_select_cb(SSL_CTX *ctx, int (*cb) (SSL *s, | 1611 | SSL_CTX_set_next_proto_select_cb(SSL_CTX *ctx, int (*cb) (SSL *s, |
1667 | unsigned char **out, unsigned char *outlen, const unsigned char *in, | 1612 | unsigned char **out, unsigned char *outlen, const unsigned char *in, |
1668 | unsigned int inlen, void *arg), void *arg) | 1613 | unsigned int inlen, void *arg), void *arg) |
1669 | { | 1614 | { |
1670 | ctx->internal->next_proto_select_cb = cb; | ||
1671 | ctx->internal->next_proto_select_cb_arg = arg; | ||
1672 | } | 1615 | } |
1673 | 1616 | ||
1674 | /* | 1617 | /* |
@@ -1912,9 +1855,6 @@ SSL_CTX_new(const SSL_METHOD *meth) | |||
1912 | ret->internal->tlsext_status_cb = 0; | 1855 | ret->internal->tlsext_status_cb = 0; |
1913 | ret->internal->tlsext_status_arg = NULL; | 1856 | ret->internal->tlsext_status_arg = NULL; |
1914 | 1857 | ||
1915 | ret->internal->next_protos_advertised_cb = 0; | ||
1916 | ret->internal->next_proto_select_cb = 0; | ||
1917 | |||
1918 | #ifndef OPENSSL_NO_ENGINE | 1858 | #ifndef OPENSSL_NO_ENGINE |
1919 | ret->internal->client_cert_engine = NULL; | 1859 | ret->internal->client_cert_engine = NULL; |
1920 | #ifdef OPENSSL_SSL_CLIENT_ENGINE_AUTO | 1860 | #ifdef OPENSSL_SSL_CLIENT_ENGINE_AUTO |
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index 6f9be12fa7..914501213c 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.188 2017/08/12 02:55:22 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_locl.h,v 1.189 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 | * |
@@ -575,24 +575,8 @@ typedef struct ssl_ctx_internal_st { | |||
575 | /* SRTP profiles we are willing to do from RFC 5764 */ | 575 | /* SRTP profiles we are willing to do from RFC 5764 */ |
576 | STACK_OF(SRTP_PROTECTION_PROFILE) *srtp_profiles; | 576 | STACK_OF(SRTP_PROTECTION_PROFILE) *srtp_profiles; |
577 | 577 | ||
578 | /* Next protocol negotiation information */ | ||
579 | /* (for experimental NPN extension). */ | ||
580 | |||
581 | /* For a server, this contains a callback function by which the set of | ||
582 | * advertised protocols can be provided. */ | ||
583 | int (*next_protos_advertised_cb)(SSL *s, const unsigned char **buf, | ||
584 | unsigned int *len, void *arg); | ||
585 | void *next_protos_advertised_cb_arg; | ||
586 | /* For a client, this contains a callback function that selects the | ||
587 | * next protocol from the list provided by the server. */ | ||
588 | int (*next_proto_select_cb)(SSL *s, unsigned char **out, | ||
589 | unsigned char *outlen, const unsigned char *in, | ||
590 | unsigned int inlen, void *arg); | ||
591 | void *next_proto_select_cb_arg; | ||
592 | |||
593 | /* | 578 | /* |
594 | * ALPN information | 579 | * ALPN information. |
595 | * (we are in the process of transitioning from NPN to ALPN). | ||
596 | */ | 580 | */ |
597 | 581 | ||
598 | /* | 582 | /* |
@@ -627,16 +611,6 @@ typedef struct ssl_internal_st { | |||
627 | unsigned long options; /* protocol behaviour */ | 611 | unsigned long options; /* protocol behaviour */ |
628 | unsigned long mode; /* API behaviour */ | 612 | unsigned long mode; /* API behaviour */ |
629 | 613 | ||
630 | /* Next protocol negotiation. For the client, this is the protocol that | ||
631 | * we sent in NextProtocol and is set when handling ServerHello | ||
632 | * extensions. | ||
633 | * | ||
634 | * For a server, this is the client's selected_protocol from | ||
635 | * NextProtocol and is set when handling the NextProtocol message, | ||
636 | * before the Finished message. */ | ||
637 | unsigned char *next_proto_negotiated; | ||
638 | unsigned char next_proto_negotiated_len; | ||
639 | |||
640 | /* Client list of supported protocols in wire format. */ | 614 | /* Client list of supported protocols in wire format. */ |
641 | unsigned char *alpn_client_proto_list; | 615 | unsigned char *alpn_client_proto_list; |
642 | unsigned int alpn_client_proto_list_len; | 616 | unsigned int alpn_client_proto_list_len; |
@@ -881,16 +855,9 @@ typedef struct ssl3_state_internal_st { | |||
881 | /* Set if we saw a Renegotiation Indication extension from our peer. */ | 855 | /* Set if we saw a Renegotiation Indication extension from our peer. */ |
882 | int renegotiate_seen; | 856 | int renegotiate_seen; |
883 | 857 | ||
884 | /* Set if we saw the Next Protocol Negotiation extension from our peer. | ||
885 | */ | ||
886 | int next_proto_neg_seen; | ||
887 | |||
888 | /* | ||
889 | * ALPN information | ||
890 | * (we are in the process of transitioning from NPN to ALPN). | ||
891 | */ | ||
892 | |||
893 | /* | 858 | /* |
859 | * ALPN information. | ||
860 | * | ||
894 | * In a server these point to the selected ALPN protocol after the | 861 | * In a server these point to the selected ALPN protocol after the |
895 | * ClientHello has been processed. In a client these contain the | 862 | * ClientHello has been processed. In a client these contain the |
896 | * protocol that the server selected once the ServerHello has been | 863 | * protocol that the server selected once the ServerHello has been |
@@ -1245,7 +1212,6 @@ int ssl3_get_server_key_exchange(SSL *s); | |||
1245 | int ssl3_get_server_certificate(SSL *s); | 1212 | int ssl3_get_server_certificate(SSL *s); |
1246 | int ssl3_check_cert_and_algorithm(SSL *s); | 1213 | int ssl3_check_cert_and_algorithm(SSL *s); |
1247 | int ssl3_check_finished(SSL *s); | 1214 | int ssl3_check_finished(SSL *s); |
1248 | int ssl3_send_next_proto(SSL *s); | ||
1249 | 1215 | ||
1250 | /* some server-only functions */ | 1216 | /* some server-only functions */ |
1251 | int ssl3_get_client_hello(SSL *s); | 1217 | int ssl3_get_client_hello(SSL *s); |
@@ -1257,7 +1223,6 @@ int ssl3_send_server_done(SSL *s); | |||
1257 | int ssl3_get_client_certificate(SSL *s); | 1223 | int ssl3_get_client_certificate(SSL *s); |
1258 | int ssl3_get_client_key_exchange(SSL *s); | 1224 | int ssl3_get_client_key_exchange(SSL *s); |
1259 | int ssl3_get_cert_verify(SSL *s); | 1225 | int ssl3_get_cert_verify(SSL *s); |
1260 | int ssl3_get_next_proto(SSL *s); | ||
1261 | 1226 | ||
1262 | int ssl23_accept(SSL *s); | 1227 | int ssl23_accept(SSL *s); |
1263 | int ssl23_connect(SSL *s); | 1228 | int ssl23_connect(SSL *s); |
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c index a21039e727..50ce91ddd8 100644 --- a/src/lib/libssl/ssl_srvr.c +++ b/src/lib/libssl/ssl_srvr.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_srvr.c,v 1.20 2017/08/12 02:55:22 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_srvr.c,v 1.21 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 | * |
@@ -468,10 +468,7 @@ ssl3_accept(SSL *s) | |||
468 | * the client uses its key from the certificate | 468 | * the client uses its key from the certificate |
469 | * for key exchange. | 469 | * for key exchange. |
470 | */ | 470 | */ |
471 | if (S3I(s)->next_proto_neg_seen) | 471 | S3I(s)->hs.state = SSL3_ST_SR_FINISHED_A; |
472 | S3I(s)->hs.state = SSL3_ST_SR_NEXT_PROTO_A; | ||
473 | else | ||
474 | S3I(s)->hs.state = SSL3_ST_SR_FINISHED_A; | ||
475 | s->internal->init_num = 0; | 472 | s->internal->init_num = 0; |
476 | } else if (SSL_USE_SIGALGS(s) || (alg_k & SSL_kGOST)) { | 473 | } else if (SSL_USE_SIGALGS(s) || (alg_k & SSL_kGOST)) { |
477 | S3I(s)->hs.state = SSL3_ST_SR_CERT_VRFY_A; | 474 | S3I(s)->hs.state = SSL3_ST_SR_CERT_VRFY_A; |
@@ -525,20 +522,8 @@ ssl3_accept(SSL *s) | |||
525 | if (ret <= 0) | 522 | if (ret <= 0) |
526 | goto end; | 523 | goto end; |
527 | 524 | ||
528 | if (S3I(s)->next_proto_neg_seen) | ||
529 | S3I(s)->hs.state = SSL3_ST_SR_NEXT_PROTO_A; | ||
530 | else | ||
531 | S3I(s)->hs.state = SSL3_ST_SR_FINISHED_A; | ||
532 | s->internal->init_num = 0; | ||
533 | break; | ||
534 | |||
535 | case SSL3_ST_SR_NEXT_PROTO_A: | ||
536 | case SSL3_ST_SR_NEXT_PROTO_B: | ||
537 | ret = ssl3_get_next_proto(s); | ||
538 | if (ret <= 0) | ||
539 | goto end; | ||
540 | s->internal->init_num = 0; | ||
541 | S3I(s)->hs.state = SSL3_ST_SR_FINISHED_A; | 525 | S3I(s)->hs.state = SSL3_ST_SR_FINISHED_A; |
526 | s->internal->init_num = 0; | ||
542 | break; | 527 | break; |
543 | 528 | ||
544 | case SSL3_ST_SR_FINISHED_A: | 529 | case SSL3_ST_SR_FINISHED_A: |
@@ -610,15 +595,9 @@ ssl3_accept(SSL *s) | |||
610 | if (ret <= 0) | 595 | if (ret <= 0) |
611 | goto end; | 596 | goto end; |
612 | S3I(s)->hs.state = SSL3_ST_SW_FLUSH; | 597 | S3I(s)->hs.state = SSL3_ST_SW_FLUSH; |
613 | if (s->internal->hit) { | 598 | if (s->internal->hit) |
614 | if (S3I(s)->next_proto_neg_seen) { | 599 | S3I(s)->hs.next_state = SSL3_ST_SR_FINISHED_A; |
615 | s->s3->flags |= SSL3_FLAGS_CCS_OK; | 600 | else |
616 | S3I(s)->hs.next_state = | ||
617 | SSL3_ST_SR_NEXT_PROTO_A; | ||
618 | } else | ||
619 | S3I(s)->hs.next_state = | ||
620 | SSL3_ST_SR_FINISHED_A; | ||
621 | } else | ||
622 | S3I(s)->hs.next_state = SSL_ST_OK; | 601 | S3I(s)->hs.next_state = SSL_ST_OK; |
623 | s->internal->init_num = 0; | 602 | s->internal->init_num = 0; |
624 | break; | 603 | break; |
@@ -2708,74 +2687,3 @@ ssl3_send_cert_status(SSL *s) | |||
2708 | 2687 | ||
2709 | return (-1); | 2688 | return (-1); |
2710 | } | 2689 | } |
2711 | |||
2712 | /* | ||
2713 | * ssl3_get_next_proto reads a Next Protocol Negotiation handshake message. | ||
2714 | * It sets the next_proto member in s if found | ||
2715 | */ | ||
2716 | int | ||
2717 | ssl3_get_next_proto(SSL *s) | ||
2718 | { | ||
2719 | CBS cbs, proto, padding; | ||
2720 | int ok; | ||
2721 | long n; | ||
2722 | size_t len; | ||
2723 | |||
2724 | /* | ||
2725 | * Clients cannot send a NextProtocol message if we didn't see the | ||
2726 | * extension in their ClientHello | ||
2727 | */ | ||
2728 | if (!S3I(s)->next_proto_neg_seen) { | ||
2729 | SSLerror(s, SSL_R_GOT_NEXT_PROTO_WITHOUT_EXTENSION); | ||
2730 | return (-1); | ||
2731 | } | ||
2732 | |||
2733 | /* 514 maxlen is enough for the payload format below */ | ||
2734 | n = s->method->internal->ssl_get_message(s, SSL3_ST_SR_NEXT_PROTO_A, | ||
2735 | SSL3_ST_SR_NEXT_PROTO_B, SSL3_MT_NEXT_PROTO, 514, &ok); | ||
2736 | if (!ok) | ||
2737 | return ((int)n); | ||
2738 | |||
2739 | /* | ||
2740 | * S3I(s)->hs.state doesn't reflect whether ChangeCipherSpec has been received | ||
2741 | * in this handshake, but S3I(s)->change_cipher_spec does (will be reset | ||
2742 | * by ssl3_get_finished). | ||
2743 | */ | ||
2744 | if (!S3I(s)->change_cipher_spec) { | ||
2745 | SSLerror(s, SSL_R_GOT_NEXT_PROTO_BEFORE_A_CCS); | ||
2746 | return (-1); | ||
2747 | } | ||
2748 | |||
2749 | if (n < 2) | ||
2750 | return (0); | ||
2751 | /* The body must be > 1 bytes long */ | ||
2752 | |||
2753 | CBS_init(&cbs, s->internal->init_msg, s->internal->init_num); | ||
2754 | |||
2755 | /* | ||
2756 | * The payload looks like: | ||
2757 | * uint8 proto_len; | ||
2758 | * uint8 proto[proto_len]; | ||
2759 | * uint8 padding_len; | ||
2760 | * uint8 padding[padding_len]; | ||
2761 | */ | ||
2762 | if (!CBS_get_u8_length_prefixed(&cbs, &proto) || | ||
2763 | !CBS_get_u8_length_prefixed(&cbs, &padding) || | ||
2764 | CBS_len(&cbs) != 0) | ||
2765 | return 0; | ||
2766 | |||
2767 | /* | ||
2768 | * XXX We should not NULL it, but this matches old behavior of not | ||
2769 | * freeing before malloc. | ||
2770 | */ | ||
2771 | s->internal->next_proto_negotiated = NULL; | ||
2772 | s->internal->next_proto_negotiated_len = 0; | ||
2773 | |||
2774 | if (!CBS_stow(&proto, &s->internal->next_proto_negotiated, &len)) { | ||
2775 | SSLerror(s, ERR_R_MALLOC_FAILURE); | ||
2776 | return (0); | ||
2777 | } | ||
2778 | s->internal->next_proto_negotiated_len = (uint8_t)len; | ||
2779 | |||
2780 | return (1); | ||
2781 | } | ||
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 | */ | ||
1301 | static char | ||
1302 | ssl_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 | |||
1315 | int | 1241 | int |
1316 | ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, size_t n, int *al) | 1242 | ssl_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 | ||