diff options
Diffstat (limited to 'src/lib/libssl/t1_lib.c')
-rw-r--r-- | src/lib/libssl/t1_lib.c | 214 |
1 files changed, 1 insertions, 213 deletions
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c index 6e4a29c4c8..b780faf603 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.45 2014/06/12 15:49:31 deraadt Exp $ */ | 1 | /* $OpenBSD: t1_lib.c,v 1.46 2014/06/13 04:29:13 miod 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 | * |
@@ -557,25 +557,6 @@ skip_ext: | |||
557 | ret += sizeof(tls12_sigalgs); | 557 | ret += sizeof(tls12_sigalgs); |
558 | } | 558 | } |
559 | 559 | ||
560 | #ifdef TLSEXT_TYPE_opaque_prf_input | ||
561 | if (s->s3->client_opaque_prf_input != NULL && | ||
562 | s->version != DTLS1_VERSION) { | ||
563 | size_t col = s->s3->client_opaque_prf_input_len; | ||
564 | |||
565 | if ((size_t)(limit - ret) < 6 + col) | ||
566 | return NULL; | ||
567 | if (col > 0xFFFD) /* can't happen */ | ||
568 | return NULL; | ||
569 | |||
570 | s2n(TLSEXT_TYPE_opaque_prf_input, ret); | ||
571 | |||
572 | s2n(col + 2, ret); | ||
573 | s2n(col, ret); | ||
574 | memcpy(ret, s->s3->client_opaque_prf_input, col); | ||
575 | ret += col; | ||
576 | } | ||
577 | #endif | ||
578 | |||
579 | if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp && | 560 | if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp && |
580 | s->version != DTLS1_VERSION) { | 561 | s->version != DTLS1_VERSION) { |
581 | int i; | 562 | int i; |
@@ -783,25 +764,6 @@ ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, unsigned char *limit) | |||
783 | s2n(0, ret); | 764 | s2n(0, ret); |
784 | } | 765 | } |
785 | 766 | ||
786 | #ifdef TLSEXT_TYPE_opaque_prf_input | ||
787 | if (s->s3->server_opaque_prf_input != NULL && | ||
788 | s->version != DTLS1_VERSION) { | ||
789 | size_t sol = s->s3->server_opaque_prf_input_len; | ||
790 | |||
791 | if ((size_t)(limit - ret) < 6 + sol) | ||
792 | return NULL; | ||
793 | if (sol > 0xFFFD) /* can't happen */ | ||
794 | return NULL; | ||
795 | |||
796 | s2n(TLSEXT_TYPE_opaque_prf_input, ret); | ||
797 | |||
798 | s2n(sol + 2, ret); | ||
799 | s2n(sol, ret); | ||
800 | memcpy(ret, s->s3->server_opaque_prf_input, sol); | ||
801 | ret += sol; | ||
802 | } | ||
803 | #endif | ||
804 | |||
805 | #ifndef OPENSSL_NO_SRTP | 767 | #ifndef OPENSSL_NO_SRTP |
806 | if (s->srtp_profile) { | 768 | if (s->srtp_profile) { |
807 | int el; | 769 | int el; |
@@ -1131,35 +1093,6 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, | |||
1131 | memcpy(s->session->tlsext_ellipticcurvelist, sdata, ellipticcurvelist_length); | 1093 | memcpy(s->session->tlsext_ellipticcurvelist, sdata, ellipticcurvelist_length); |
1132 | } | 1094 | } |
1133 | } | 1095 | } |
1134 | #ifdef TLSEXT_TYPE_opaque_prf_input | ||
1135 | else if (type == TLSEXT_TYPE_opaque_prf_input && | ||
1136 | s->version != DTLS1_VERSION) { | ||
1137 | unsigned char *sdata = data; | ||
1138 | |||
1139 | if (size < 2) { | ||
1140 | *al = SSL_AD_DECODE_ERROR; | ||
1141 | return 0; | ||
1142 | } | ||
1143 | n2s(sdata, s->s3->client_opaque_prf_input_len); | ||
1144 | if (s->s3->client_opaque_prf_input_len != size - 2) { | ||
1145 | *al = SSL_AD_DECODE_ERROR; | ||
1146 | return 0; | ||
1147 | } | ||
1148 | |||
1149 | free(s->s3->client_opaque_prf_input); | ||
1150 | s->s3->client_opaque_prf_input = NULL; | ||
1151 | |||
1152 | if (s->s3->client_opaque_prf_input_len != 0) { | ||
1153 | s->s3->client_opaque_prf_input = | ||
1154 | BUF_memdup(sdata, | ||
1155 | s->s3->client_opaque_prf_input_len); | ||
1156 | if (s->s3->client_opaque_prf_input == NULL) { | ||
1157 | *al = TLS1_AD_INTERNAL_ERROR; | ||
1158 | return 0; | ||
1159 | } | ||
1160 | } | ||
1161 | } | ||
1162 | #endif | ||
1163 | else if (type == TLSEXT_TYPE_session_ticket) { | 1096 | else if (type == TLSEXT_TYPE_session_ticket) { |
1164 | if (s->tls_session_ticket_ext_cb && | 1097 | if (s->tls_session_ticket_ext_cb && |
1165 | !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg)) { | 1098 | !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg)) { |
@@ -1428,35 +1361,6 @@ ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, | |||
1428 | } | 1361 | } |
1429 | s->tlsext_ticket_expected = 1; | 1362 | s->tlsext_ticket_expected = 1; |
1430 | } | 1363 | } |
1431 | #ifdef TLSEXT_TYPE_opaque_prf_input | ||
1432 | else if (type == TLSEXT_TYPE_opaque_prf_input && | ||
1433 | s->version != DTLS1_VERSION) { | ||
1434 | unsigned char *sdata = data; | ||
1435 | |||
1436 | if (size < 2) { | ||
1437 | *al = SSL_AD_DECODE_ERROR; | ||
1438 | return 0; | ||
1439 | } | ||
1440 | n2s(sdata, s->s3->server_opaque_prf_input_len); | ||
1441 | if (s->s3->server_opaque_prf_input_len != size - 2) { | ||
1442 | *al = SSL_AD_DECODE_ERROR; | ||
1443 | return 0; | ||
1444 | } | ||
1445 | |||
1446 | free(s->s3->server_opaque_prf_input); | ||
1447 | s->s3->server_opaque_prf_input = NULL; | ||
1448 | |||
1449 | if (s->s3->server_opaque_prf_input_len != 0) | ||
1450 | s->s3->server_opaque_prf_input = | ||
1451 | BUF_memdup(sdata, | ||
1452 | s->s3->server_opaque_prf_input_len); | ||
1453 | if (s->s3->server_opaque_prf_input == NULL) { | ||
1454 | *al = TLS1_AD_INTERNAL_ERROR; | ||
1455 | return 0; | ||
1456 | } | ||
1457 | } | ||
1458 | } | ||
1459 | #endif | ||
1460 | else if (type == TLSEXT_TYPE_status_request && | 1364 | else if (type == TLSEXT_TYPE_status_request && |
1461 | s->version != DTLS1_VERSION) { | 1365 | s->version != DTLS1_VERSION) { |
1462 | /* MUST be empty and only sent if we've requested | 1366 | /* MUST be empty and only sent if we've requested |
@@ -1609,42 +1513,6 @@ ssl_prepare_clienthello_tlsext(SSL *s) | |||
1609 | } | 1513 | } |
1610 | } | 1514 | } |
1611 | 1515 | ||
1612 | #ifdef TLSEXT_TYPE_opaque_prf_input | ||
1613 | { | ||
1614 | int r = 1; | ||
1615 | |||
1616 | if (s->ctx->tlsext_opaque_prf_input_callback != 0) { | ||
1617 | r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, | ||
1618 | s->ctx->tlsext_opaque_prf_input_callback_arg); | ||
1619 | if (!r) | ||
1620 | return -1; | ||
1621 | } | ||
1622 | |||
1623 | if (s->tlsext_opaque_prf_input != NULL) { | ||
1624 | free(s->s3->client_opaque_prf_input); | ||
1625 | s->s3->client_opaque_prf_input = NULL; | ||
1626 | if (s->tlsext_opaque_prf_input_len != 0) { | ||
1627 | s->s3->client_opaque_prf_input = | ||
1628 | BUF_memdup(s->tlsext_opaque_prf_input, | ||
1629 | s->tlsext_opaque_prf_input_len); | ||
1630 | if (s->s3->client_opaque_prf_input == NULL) { | ||
1631 | SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT, | ||
1632 | ERR_R_MALLOC_FAILURE); | ||
1633 | return -1; | ||
1634 | } | ||
1635 | } | ||
1636 | s->s3->client_opaque_prf_input_len = | ||
1637 | s->tlsext_opaque_prf_input_len; | ||
1638 | } | ||
1639 | |||
1640 | if (r == 2) { | ||
1641 | /* at callback's request, insist on receiving an appropriate server opaque PRF input */ | ||
1642 | s->s3->server_opaque_prf_input_len = | ||
1643 | s->tlsext_opaque_prf_input_len; | ||
1644 | } | ||
1645 | } | ||
1646 | #endif | ||
1647 | |||
1648 | return 1; | 1516 | return 1; |
1649 | } | 1517 | } |
1650 | 1518 | ||
@@ -1694,65 +1562,6 @@ ssl_check_clienthello_tlsext_early(SSL *s) | |||
1694 | else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0) | 1562 | else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0) |
1695 | ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg); | 1563 | ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg); |
1696 | 1564 | ||
1697 | #ifdef TLSEXT_TYPE_opaque_prf_input | ||
1698 | { | ||
1699 | /* This sort of belongs into ssl_prepare_serverhello_tlsext(), | ||
1700 | * but we might be sending an alert in response to the client hello, | ||
1701 | * so this has to happen here in | ||
1702 | * ssl_check_clienthello_tlsext_early(). */ | ||
1703 | |||
1704 | int r = 1; | ||
1705 | |||
1706 | if (s->ctx->tlsext_opaque_prf_input_callback != 0) { | ||
1707 | r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, | ||
1708 | s->ctx->tlsext_opaque_prf_input_callback_arg); | ||
1709 | if (!r) { | ||
1710 | ret = SSL_TLSEXT_ERR_ALERT_FATAL; | ||
1711 | al = SSL_AD_INTERNAL_ERROR; | ||
1712 | goto err; | ||
1713 | } | ||
1714 | } | ||
1715 | |||
1716 | free(s->s3->server_opaque_prf_input); | ||
1717 | s->s3->server_opaque_prf_input = NULL; | ||
1718 | |||
1719 | if (s->tlsext_opaque_prf_input != NULL) { | ||
1720 | if (s->s3->client_opaque_prf_input != NULL && | ||
1721 | s->s3->client_opaque_prf_input_len == | ||
1722 | s->tlsext_opaque_prf_input_len) { | ||
1723 | /* | ||
1724 | * Can only use this extension if we have a | ||
1725 | * server opaque PRF input of the same length | ||
1726 | * as the client opaque PRF input! | ||
1727 | */ | ||
1728 | if (s->tlsext_opaque_prf_input_len != 0) { | ||
1729 | s->s3->server_opaque_prf_input = | ||
1730 | BUF_memdup(s->tlsext_opaque_prf_input, | ||
1731 | s->tlsext_opaque_prf_input_len); | ||
1732 | if (s->s3->server_opaque_prf_input == | ||
1733 | NULL) { | ||
1734 | ret = SSL_TLSEXT_ERR_ALERT_FATAL; | ||
1735 | al = SSL_AD_INTERNAL_ERROR; | ||
1736 | goto err; | ||
1737 | } | ||
1738 | } | ||
1739 | s->s3->server_opaque_prf_input_len = | ||
1740 | s->tlsext_opaque_prf_input_len; | ||
1741 | } | ||
1742 | } | ||
1743 | |||
1744 | if (r == 2 && s->s3->server_opaque_prf_input == NULL) { | ||
1745 | /* The callback wants to enforce use of the extension, | ||
1746 | * but we can't do that with the client opaque PRF input; | ||
1747 | * abort the handshake. | ||
1748 | */ | ||
1749 | ret = SSL_TLSEXT_ERR_ALERT_FATAL; | ||
1750 | al = SSL_AD_HANDSHAKE_FAILURE; | ||
1751 | } | ||
1752 | } | ||
1753 | |||
1754 | err: | ||
1755 | #endif | ||
1756 | switch (ret) { | 1565 | switch (ret) { |
1757 | case SSL_TLSEXT_ERR_ALERT_FATAL: | 1566 | case SSL_TLSEXT_ERR_ALERT_FATAL: |
1758 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1567 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
@@ -1867,27 +1676,6 @@ ssl_check_serverhello_tlsext(SSL *s) | |||
1867 | else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0) | 1676 | else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0) |
1868 | ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg); | 1677 | ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg); |
1869 | 1678 | ||
1870 | #ifdef TLSEXT_TYPE_opaque_prf_input | ||
1871 | if (s->s3->server_opaque_prf_input_len > 0) { | ||
1872 | /* This case may indicate that we, as a client, want to insist on using opaque PRF inputs. | ||
1873 | * So first verify that we really have a value from the server too. */ | ||
1874 | |||
1875 | if (s->s3->server_opaque_prf_input == NULL) { | ||
1876 | ret = SSL_TLSEXT_ERR_ALERT_FATAL; | ||
1877 | al = SSL_AD_HANDSHAKE_FAILURE; | ||
1878 | } | ||
1879 | |||
1880 | /* Anytime the server *has* sent an opaque PRF input, we need to check | ||
1881 | * that we have a client opaque PRF input of the same size. */ | ||
1882 | if (s->s3->client_opaque_prf_input == NULL || | ||
1883 | s->s3->client_opaque_prf_input_len != | ||
1884 | s->s3->server_opaque_prf_input_len) { | ||
1885 | ret = SSL_TLSEXT_ERR_ALERT_FATAL; | ||
1886 | al = SSL_AD_ILLEGAL_PARAMETER; | ||
1887 | } | ||
1888 | } | ||
1889 | #endif | ||
1890 | |||
1891 | /* If we've requested certificate status and we wont get one | 1679 | /* If we've requested certificate status and we wont get one |
1892 | * tell the callback | 1680 | * tell the callback |
1893 | */ | 1681 | */ |