diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/d1_clnt.c | 10 | ||||
| -rw-r--r-- | src/lib/libssl/s3_clnt.c | 85 | ||||
| -rw-r--r-- | src/lib/libssl/s3_srvr.c | 106 | ||||
| -rw-r--r-- | src/lib/libssl/src/ssl/d1_clnt.c | 10 | ||||
| -rw-r--r-- | src/lib/libssl/src/ssl/s3_clnt.c | 85 | ||||
| -rw-r--r-- | src/lib/libssl/src/ssl/s3_srvr.c | 106 |
6 files changed, 296 insertions, 106 deletions
diff --git a/src/lib/libssl/d1_clnt.c b/src/lib/libssl/d1_clnt.c index 3f47a3854b..b85908c733 100644 --- a/src/lib/libssl/d1_clnt.c +++ b/src/lib/libssl/d1_clnt.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: d1_clnt.c,v 1.28 2014/07/11 09:24:44 beck Exp $ */ | 1 | /* $OpenBSD: d1_clnt.c,v 1.29 2014/07/11 22:57:25 miod Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * DTLS implementation written by Nagendra Modadugu | 3 | * DTLS implementation written by Nagendra Modadugu |
| 4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. | 4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. |
| @@ -879,6 +879,8 @@ dtls1_get_hello_verify(SSL *s) | |||
| 879 | return (1); | 879 | return (1); |
| 880 | } | 880 | } |
| 881 | 881 | ||
| 882 | if (2 > n) | ||
| 883 | goto truncated; | ||
| 882 | data = (unsigned char *)s->init_msg; | 884 | data = (unsigned char *)s->init_msg; |
| 883 | 885 | ||
| 884 | if ((data[0] != (s->version >> 8)) || (data[1] != (s->version&0xff))) { | 886 | if ((data[0] != (s->version >> 8)) || (data[1] != (s->version&0xff))) { |
| @@ -889,7 +891,11 @@ dtls1_get_hello_verify(SSL *s) | |||
| 889 | } | 891 | } |
| 890 | data += 2; | 892 | data += 2; |
| 891 | 893 | ||
| 894 | if (2 + 1 > n) | ||
| 895 | goto truncated; | ||
| 892 | cookie_len = *(data++); | 896 | cookie_len = *(data++); |
| 897 | if (2 + 1 + cookie_len > n) | ||
| 898 | goto truncated; | ||
| 893 | if (cookie_len > sizeof(s->d1->cookie)) { | 899 | if (cookie_len > sizeof(s->d1->cookie)) { |
| 894 | al = SSL_AD_ILLEGAL_PARAMETER; | 900 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 895 | goto f_err; | 901 | goto f_err; |
| @@ -901,6 +907,8 @@ dtls1_get_hello_verify(SSL *s) | |||
| 901 | s->d1->send_cookie = 1; | 907 | s->d1->send_cookie = 1; |
| 902 | return 1; | 908 | return 1; |
| 903 | 909 | ||
| 910 | truncated: | ||
| 911 | al = SSL_AD_DECODE_ERROR; | ||
| 904 | f_err: | 912 | f_err: |
| 905 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 913 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 906 | return -1; | 914 | return -1; |
diff --git a/src/lib/libssl/s3_clnt.c b/src/lib/libssl/s3_clnt.c index 3596acf1de..884b9f1efb 100644 --- a/src/lib/libssl/s3_clnt.c +++ b/src/lib/libssl/s3_clnt.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: s3_clnt.c,v 1.77 2014/07/11 15:44:53 miod Exp $ */ | 1 | /* $OpenBSD: s3_clnt.c,v 1.78 2014/07/11 22:57:25 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 | * |
| @@ -814,6 +814,8 @@ ssl3_get_server_hello(SSL *s) | |||
| 814 | 814 | ||
| 815 | d = p = (unsigned char *)s->init_msg; | 815 | d = p = (unsigned char *)s->init_msg; |
| 816 | 816 | ||
| 817 | if (2 > n) | ||
| 818 | goto truncated; | ||
| 817 | if ((p[0] != (s->version >> 8)) || (p[1] != (s->version & 0xff))) { | 819 | if ((p[0] != (s->version >> 8)) || (p[1] != (s->version & 0xff))) { |
| 818 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_WRONG_SSL_VERSION); | 820 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_WRONG_SSL_VERSION); |
| 819 | s->version = (s->version&0xff00) | p[1]; | 821 | s->version = (s->version&0xff00) | p[1]; |
| @@ -823,6 +825,10 @@ ssl3_get_server_hello(SSL *s) | |||
| 823 | p += 2; | 825 | p += 2; |
| 824 | 826 | ||
| 825 | /* load the server hello data */ | 827 | /* load the server hello data */ |
| 828 | |||
| 829 | if (p + SSL3_RANDOM_SIZE + 1 - d > n) | ||
| 830 | goto truncated; | ||
| 831 | |||
| 826 | /* load the server random */ | 832 | /* load the server random */ |
| 827 | memcpy(s->s3->server_random, p, SSL3_RANDOM_SIZE); | 833 | memcpy(s->s3->server_random, p, SSL3_RANDOM_SIZE); |
| 828 | p += SSL3_RANDOM_SIZE; | 834 | p += SSL3_RANDOM_SIZE; |
| @@ -838,6 +844,9 @@ ssl3_get_server_hello(SSL *s) | |||
| 838 | goto f_err; | 844 | goto f_err; |
| 839 | } | 845 | } |
| 840 | 846 | ||
| 847 | if (p + j + 2 - d > n) | ||
| 848 | goto truncated; | ||
| 849 | |||
| 841 | /* | 850 | /* |
| 842 | * Check if we want to resume the session based on external | 851 | * Check if we want to resume the session based on external |
| 843 | * pre-shared secret | 852 | * pre-shared secret |
| @@ -935,6 +944,8 @@ ssl3_get_server_hello(SSL *s) | |||
| 935 | } | 944 | } |
| 936 | /* lets get the compression algorithm */ | 945 | /* lets get the compression algorithm */ |
| 937 | /* COMPRESSION */ | 946 | /* COMPRESSION */ |
| 947 | if (p + 1 - d > n) | ||
| 948 | goto truncated; | ||
| 938 | if (*(p++) != 0) { | 949 | if (*(p++) != 0) { |
| 939 | al = SSL_AD_ILLEGAL_PARAMETER; | 950 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 940 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, | 951 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| @@ -958,15 +969,15 @@ ssl3_get_server_hello(SSL *s) | |||
| 958 | } | 969 | } |
| 959 | } | 970 | } |
| 960 | 971 | ||
| 961 | if (p != (d + n)) { | 972 | if (p != d + n) |
| 962 | /* wrong packet length */ | 973 | goto truncated; |
| 963 | al = SSL_AD_DECODE_ERROR; | ||
| 964 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, | ||
| 965 | SSL_R_BAD_PACKET_LENGTH); | ||
| 966 | goto f_err; | ||
| 967 | } | ||
| 968 | 974 | ||
| 969 | return (1); | 975 | return (1); |
| 976 | |||
| 977 | truncated: | ||
| 978 | /* wrong packet length */ | ||
| 979 | al = SSL_AD_DECODE_ERROR; | ||
| 980 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_BAD_PACKET_LENGTH); | ||
| 970 | f_err: | 981 | f_err: |
| 971 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 982 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 972 | err: | 983 | err: |
| @@ -1015,6 +1026,8 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1015 | goto err; | 1026 | goto err; |
| 1016 | } | 1027 | } |
| 1017 | 1028 | ||
| 1029 | if (p + 3 - d > n) | ||
| 1030 | goto truncated; | ||
| 1018 | n2l3(p, llen); | 1031 | n2l3(p, llen); |
| 1019 | if (llen + 3 != n) { | 1032 | if (llen + 3 != n) { |
| 1020 | al = SSL_AD_DECODE_ERROR; | 1033 | al = SSL_AD_DECODE_ERROR; |
| @@ -1023,6 +1036,8 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1023 | goto f_err; | 1036 | goto f_err; |
| 1024 | } | 1037 | } |
| 1025 | for (nc = 0; nc < llen; ) { | 1038 | for (nc = 0; nc < llen; ) { |
| 1039 | if (p + 3 - d > n) | ||
| 1040 | goto truncated; | ||
| 1026 | n2l3(p, l); | 1041 | n2l3(p, l); |
| 1027 | if ((l + nc + 3) > llen) { | 1042 | if ((l + nc + 3) > llen) { |
| 1028 | al = SSL_AD_DECODE_ERROR; | 1043 | al = SSL_AD_DECODE_ERROR; |
| @@ -1094,7 +1109,7 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1094 | x = NULL; | 1109 | x = NULL; |
| 1095 | al = SSL3_AL_FATAL; | 1110 | al = SSL3_AL_FATAL; |
| 1096 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, | 1111 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1097 | SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS); | 1112 | SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS); |
| 1098 | goto f_err; | 1113 | goto f_err; |
| 1099 | } | 1114 | } |
| 1100 | 1115 | ||
| @@ -1103,7 +1118,7 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1103 | x = NULL; | 1118 | x = NULL; |
| 1104 | al = SSL3_AL_FATAL; | 1119 | al = SSL3_AL_FATAL; |
| 1105 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, | 1120 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1106 | SSL_R_UNKNOWN_CERTIFICATE_TYPE); | 1121 | SSL_R_UNKNOWN_CERTIFICATE_TYPE); |
| 1107 | goto f_err; | 1122 | goto f_err; |
| 1108 | } | 1123 | } |
| 1109 | 1124 | ||
| @@ -1137,6 +1152,11 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1137 | ret = 1; | 1152 | ret = 1; |
| 1138 | 1153 | ||
| 1139 | if (0) { | 1154 | if (0) { |
| 1155 | truncated: | ||
| 1156 | /* wrong packet length */ | ||
| 1157 | al = SSL_AD_DECODE_ERROR; | ||
| 1158 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, | ||
| 1159 | SSL_R_BAD_PACKET_LENGTH); | ||
| 1140 | f_err: | 1160 | f_err: |
| 1141 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1161 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1142 | } | 1162 | } |
| @@ -1206,6 +1226,8 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1206 | ERR_R_MALLOC_FAILURE); | 1226 | ERR_R_MALLOC_FAILURE); |
| 1207 | goto err; | 1227 | goto err; |
| 1208 | } | 1228 | } |
| 1229 | if (2 > n) | ||
| 1230 | goto truncated; | ||
| 1209 | n2s(p, i); | 1231 | n2s(p, i); |
| 1210 | param_len = i + 2; | 1232 | param_len = i + 2; |
| 1211 | if (param_len > n) { | 1233 | if (param_len > n) { |
| @@ -1221,6 +1243,8 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1221 | } | 1243 | } |
| 1222 | p += i; | 1244 | p += i; |
| 1223 | 1245 | ||
| 1246 | if (param_len + 2 > n) | ||
| 1247 | goto truncated; | ||
| 1224 | n2s(p, i); | 1248 | n2s(p, i); |
| 1225 | param_len += i + 2; | 1249 | param_len += i + 2; |
| 1226 | if (param_len > n) { | 1250 | if (param_len > n) { |
| @@ -1258,6 +1282,8 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1258 | ERR_R_DH_LIB); | 1282 | ERR_R_DH_LIB); |
| 1259 | goto err; | 1283 | goto err; |
| 1260 | } | 1284 | } |
| 1285 | if (2 > n) | ||
| 1286 | goto truncated; | ||
| 1261 | n2s(p, i); | 1287 | n2s(p, i); |
| 1262 | param_len = i + 2; | 1288 | param_len = i + 2; |
| 1263 | if (param_len > n) { | 1289 | if (param_len > n) { |
| @@ -1273,6 +1299,8 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1273 | } | 1299 | } |
| 1274 | p += i; | 1300 | p += i; |
| 1275 | 1301 | ||
| 1302 | if (param_len + 2 > n) | ||
| 1303 | goto truncated; | ||
| 1276 | n2s(p, i); | 1304 | n2s(p, i); |
| 1277 | param_len += i + 2; | 1305 | param_len += i + 2; |
| 1278 | if (param_len > n) { | 1306 | if (param_len > n) { |
| @@ -1288,6 +1316,8 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1288 | } | 1316 | } |
| 1289 | p += i; | 1317 | p += i; |
| 1290 | 1318 | ||
| 1319 | if (param_len + 2 > n) | ||
| 1320 | goto truncated; | ||
| 1291 | n2s(p, i); | 1321 | n2s(p, i); |
| 1292 | param_len += i + 2; | 1322 | param_len += i + 2; |
| 1293 | if (param_len > n) { | 1323 | if (param_len > n) { |
| @@ -1376,6 +1406,8 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1376 | goto err; | 1406 | goto err; |
| 1377 | } | 1407 | } |
| 1378 | 1408 | ||
| 1409 | if (param_len + 1 > n) | ||
| 1410 | goto truncated; | ||
| 1379 | encoded_pt_len = *p; | 1411 | encoded_pt_len = *p; |
| 1380 | /* length of encoded point */ | 1412 | /* length of encoded point */ |
| 1381 | p += 1; | 1413 | p += 1; |
| @@ -1435,6 +1467,8 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1435 | * Check key type is consistent | 1467 | * Check key type is consistent |
| 1436 | * with signature | 1468 | * with signature |
| 1437 | */ | 1469 | */ |
| 1470 | if (2 > n) | ||
| 1471 | goto truncated; | ||
| 1438 | if (sigalg != (int)p[1]) { | 1472 | if (sigalg != (int)p[1]) { |
| 1439 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | 1473 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1440 | SSL_R_WRONG_SIGNATURE_TYPE); | 1474 | SSL_R_WRONG_SIGNATURE_TYPE); |
| @@ -1453,11 +1487,13 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1453 | } else | 1487 | } else |
| 1454 | md = EVP_sha1(); | 1488 | md = EVP_sha1(); |
| 1455 | 1489 | ||
| 1490 | if (2 > n) | ||
| 1491 | goto truncated; | ||
| 1456 | n2s(p, i); | 1492 | n2s(p, i); |
| 1457 | n -= 2; | 1493 | n -= 2; |
| 1458 | j = EVP_PKEY_size(pkey); | 1494 | j = EVP_PKEY_size(pkey); |
| 1459 | 1495 | ||
| 1460 | if ((i != n) || (n > j) || (n <= 0)) { | 1496 | if (i != n || n > j) { |
| 1461 | /* wrong packet length */ | 1497 | /* wrong packet length */ |
| 1462 | al = SSL_AD_DECODE_ERROR; | 1498 | al = SSL_AD_DECODE_ERROR; |
| 1463 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | 1499 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| @@ -1534,6 +1570,10 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1534 | EVP_PKEY_free(pkey); | 1570 | EVP_PKEY_free(pkey); |
| 1535 | EVP_MD_CTX_cleanup(&md_ctx); | 1571 | EVP_MD_CTX_cleanup(&md_ctx); |
| 1536 | return (1); | 1572 | return (1); |
| 1573 | truncated: | ||
| 1574 | /* wrong packet length */ | ||
| 1575 | al = SSL_AD_DECODE_ERROR; | ||
| 1576 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_PACKET_LENGTH); | ||
| 1537 | f_err: | 1577 | f_err: |
| 1538 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1578 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1539 | err: | 1579 | err: |
| @@ -1606,13 +1646,26 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1606 | } | 1646 | } |
| 1607 | 1647 | ||
| 1608 | /* get the certificate types */ | 1648 | /* get the certificate types */ |
| 1649 | if (1 > n) | ||
| 1650 | goto truncated; | ||
| 1609 | ctype_num= *(p++); | 1651 | ctype_num= *(p++); |
| 1610 | if (ctype_num > SSL3_CT_NUMBER) | 1652 | if (ctype_num > SSL3_CT_NUMBER) |
| 1611 | ctype_num = SSL3_CT_NUMBER; | 1653 | ctype_num = SSL3_CT_NUMBER; |
| 1654 | if (p + ctype_num - d > n) { | ||
| 1655 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, | ||
| 1656 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 1657 | goto err; | ||
| 1658 | } | ||
| 1659 | |||
| 1612 | for (i = 0; i < ctype_num; i++) | 1660 | for (i = 0; i < ctype_num; i++) |
| 1613 | s->s3->tmp.ctype[i] = p[i]; | 1661 | s->s3->tmp.ctype[i] = p[i]; |
| 1614 | p += ctype_num; | 1662 | p += ctype_num; |
| 1615 | if (SSL_USE_SIGALGS(s)) { | 1663 | if (SSL_USE_SIGALGS(s)) { |
| 1664 | if (p + 2 - d > n) { | ||
| 1665 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, | ||
| 1666 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 1667 | goto err; | ||
| 1668 | } | ||
| 1616 | n2s(p, llen); | 1669 | n2s(p, llen); |
| 1617 | /* Check we have enough room for signature algorithms and | 1670 | /* Check we have enough room for signature algorithms and |
| 1618 | * following length value. | 1671 | * following length value. |
| @@ -1633,6 +1686,11 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1633 | } | 1686 | } |
| 1634 | 1687 | ||
| 1635 | /* get the CA RDNs */ | 1688 | /* get the CA RDNs */ |
| 1689 | if (p + 2 - d > n) { | ||
| 1690 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, | ||
| 1691 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 1692 | goto err; | ||
| 1693 | } | ||
| 1636 | n2s(p, llen); | 1694 | n2s(p, llen); |
| 1637 | 1695 | ||
| 1638 | if ((unsigned long)(p - d + llen) != n) { | 1696 | if ((unsigned long)(p - d + llen) != n) { |
| @@ -1698,6 +1756,11 @@ cont: | |||
| 1698 | ca_sk = NULL; | 1756 | ca_sk = NULL; |
| 1699 | 1757 | ||
| 1700 | ret = 1; | 1758 | ret = 1; |
| 1759 | if (0) { | ||
| 1760 | truncated: | ||
| 1761 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, | ||
| 1762 | SSL_R_BAD_PACKET_LENGTH); | ||
| 1763 | } | ||
| 1701 | err: | 1764 | err: |
| 1702 | if (ca_sk != NULL) | 1765 | if (ca_sk != NULL) |
| 1703 | sk_X509_NAME_pop_free(ca_sk, X509_NAME_free); | 1766 | sk_X509_NAME_pop_free(ca_sk, X509_NAME_free); |
diff --git a/src/lib/libssl/s3_srvr.c b/src/lib/libssl/s3_srvr.c index 66a4552237..89325b7be9 100644 --- a/src/lib/libssl/s3_srvr.c +++ b/src/lib/libssl/s3_srvr.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: s3_srvr.c,v 1.74 2014/07/11 15:18:52 miod Exp $ */ | 1 | /* $OpenBSD: s3_srvr.c,v 1.75 2014/07/11 22:57:25 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 | * |
| @@ -894,18 +894,17 @@ ssl3_get_client_hello(SSL *s) | |||
| 894 | s->state = SSL3_ST_SR_CLNT_HELLO_B; | 894 | s->state = SSL3_ST_SR_CLNT_HELLO_B; |
| 895 | } | 895 | } |
| 896 | s->first_packet = 1; | 896 | s->first_packet = 1; |
| 897 | n = s->method->ssl_get_message(s, | 897 | n = s->method->ssl_get_message(s, SSL3_ST_SR_CLNT_HELLO_B, |
| 898 | SSL3_ST_SR_CLNT_HELLO_B, | 898 | SSL3_ST_SR_CLNT_HELLO_C, SSL3_MT_CLIENT_HELLO, |
| 899 | SSL3_ST_SR_CLNT_HELLO_C, | 899 | SSL3_RT_MAX_PLAIN_LENGTH, &ok); |
| 900 | SSL3_MT_CLIENT_HELLO, | ||
| 901 | SSL3_RT_MAX_PLAIN_LENGTH, | ||
| 902 | &ok); | ||
| 903 | 900 | ||
| 904 | if (!ok) | 901 | if (!ok) |
| 905 | return ((int)n); | 902 | return ((int)n); |
| 906 | s->first_packet = 0; | 903 | s->first_packet = 0; |
| 907 | d = p=(unsigned char *)s->init_msg; | 904 | d = p = (unsigned char *)s->init_msg; |
| 908 | 905 | ||
| 906 | if (2 > n) | ||
| 907 | goto truncated; | ||
| 909 | /* | 908 | /* |
| 910 | * Use version from inside client hello, not from record header. | 909 | * Use version from inside client hello, not from record header. |
| 911 | * (may differ: see RFC 2246, Appendix E, second paragraph) | 910 | * (may differ: see RFC 2246, Appendix E, second paragraph) |
| @@ -944,12 +943,17 @@ ssl3_get_client_hello(SSL *s) | |||
| 944 | return (1); | 943 | return (1); |
| 945 | } | 944 | } |
| 946 | 945 | ||
| 946 | if (p + SSL3_RANDOM_SIZE + 1 - d > n) | ||
| 947 | goto truncated; | ||
| 948 | |||
| 947 | /* load the client random */ | 949 | /* load the client random */ |
| 948 | memcpy(s->s3->client_random, p, SSL3_RANDOM_SIZE); | 950 | memcpy(s->s3->client_random, p, SSL3_RANDOM_SIZE); |
| 949 | p += SSL3_RANDOM_SIZE; | 951 | p += SSL3_RANDOM_SIZE; |
| 950 | 952 | ||
| 951 | /* get the session-id */ | 953 | /* get the session-id */ |
| 952 | j= *(p++); | 954 | j= *(p++); |
| 955 | if (p + j - d > n) | ||
| 956 | goto truncated; | ||
| 953 | 957 | ||
| 954 | s->hit = 0; | 958 | s->hit = 0; |
| 955 | /* | 959 | /* |
| @@ -988,6 +992,8 @@ ssl3_get_client_hello(SSL *s) | |||
| 988 | 992 | ||
| 989 | if (SSL_IS_DTLS(s)) { | 993 | if (SSL_IS_DTLS(s)) { |
| 990 | /* cookie stuff */ | 994 | /* cookie stuff */ |
| 995 | if (p + 1 - d > n) | ||
| 996 | goto truncated; | ||
| 991 | cookie_len = *(p++); | 997 | cookie_len = *(p++); |
| 992 | 998 | ||
| 993 | /* | 999 | /* |
| @@ -1003,6 +1009,9 @@ ssl3_get_client_hello(SSL *s) | |||
| 1003 | goto f_err; | 1009 | goto f_err; |
| 1004 | } | 1010 | } |
| 1005 | 1011 | ||
| 1012 | if (p + cookie_len - d > n) | ||
| 1013 | goto truncated; | ||
| 1014 | |||
| 1006 | /* verify the cookie if appropriate option is set. */ | 1015 | /* verify the cookie if appropriate option is set. */ |
| 1007 | if ((SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) && | 1016 | if ((SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) && |
| 1008 | cookie_len > 0) { | 1017 | cookie_len > 0) { |
| @@ -1032,6 +1041,8 @@ ssl3_get_client_hello(SSL *s) | |||
| 1032 | p += cookie_len; | 1041 | p += cookie_len; |
| 1033 | } | 1042 | } |
| 1034 | 1043 | ||
| 1044 | if (p + 2 - d > n) | ||
| 1045 | goto truncated; | ||
| 1035 | n2s(p, i); | 1046 | n2s(p, i); |
| 1036 | if ((i == 0) && (j != 0)) { | 1047 | if ((i == 0) && (j != 0)) { |
| 1037 | /* we need a cipher if we are not resuming a session */ | 1048 | /* we need a cipher if we are not resuming a session */ |
| @@ -1040,13 +1051,8 @@ ssl3_get_client_hello(SSL *s) | |||
| 1040 | SSL_R_NO_CIPHERS_SPECIFIED); | 1051 | SSL_R_NO_CIPHERS_SPECIFIED); |
| 1041 | goto f_err; | 1052 | goto f_err; |
| 1042 | } | 1053 | } |
| 1043 | if ((p + i) >= (d + n)) { | 1054 | if (p + i - d > n) |
| 1044 | /* not enough data */ | 1055 | goto truncated; |
| 1045 | al = SSL_AD_DECODE_ERROR; | ||
| 1046 | SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, | ||
| 1047 | SSL_R_LENGTH_MISMATCH); | ||
| 1048 | goto f_err; | ||
| 1049 | } | ||
| 1050 | if ((i > 0) && | 1056 | if ((i > 0) && |
| 1051 | (ssl_bytes_to_cipher_list(s, p, i, &(ciphers)) == NULL)) { | 1057 | (ssl_bytes_to_cipher_list(s, p, i, &(ciphers)) == NULL)) { |
| 1052 | goto err; | 1058 | goto err; |
| @@ -1078,14 +1084,11 @@ ssl3_get_client_hello(SSL *s) | |||
| 1078 | } | 1084 | } |
| 1079 | 1085 | ||
| 1080 | /* compression */ | 1086 | /* compression */ |
| 1087 | if (p + 1 - d > n) | ||
| 1088 | goto truncated; | ||
| 1081 | i= *(p++); | 1089 | i= *(p++); |
| 1082 | if ((p + i) > (d + n)) { | 1090 | if (p + i - d > n) |
| 1083 | /* not enough data */ | 1091 | goto truncated; |
| 1084 | al = SSL_AD_DECODE_ERROR; | ||
| 1085 | SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, | ||
| 1086 | SSL_R_LENGTH_MISMATCH); | ||
| 1087 | goto f_err; | ||
| 1088 | } | ||
| 1089 | for (j = 0; j < i; j++) { | 1092 | for (j = 0; j < i; j++) { |
| 1090 | if (p[j] == 0) | 1093 | if (p[j] == 0) |
| 1091 | break; | 1094 | break; |
| @@ -1247,6 +1250,9 @@ ssl3_get_client_hello(SSL *s) | |||
| 1247 | if (ret < 0) | 1250 | if (ret < 0) |
| 1248 | ret = 1; | 1251 | ret = 1; |
| 1249 | if (0) { | 1252 | if (0) { |
| 1253 | truncated: | ||
| 1254 | al = SSL_AD_DECODE_ERROR; | ||
| 1255 | SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_BAD_PACKET_LENGTH); | ||
| 1250 | f_err: | 1256 | f_err: |
| 1251 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1257 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1252 | } | 1258 | } |
| @@ -1847,7 +1853,7 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 1847 | int i, al, ok; | 1853 | int i, al, ok; |
| 1848 | long n; | 1854 | long n; |
| 1849 | unsigned long alg_k; | 1855 | unsigned long alg_k; |
| 1850 | unsigned char *p; | 1856 | unsigned char *d, *p; |
| 1851 | RSA *rsa = NULL; | 1857 | RSA *rsa = NULL; |
| 1852 | EVP_PKEY *pkey = NULL; | 1858 | EVP_PKEY *pkey = NULL; |
| 1853 | BIGNUM *pub = NULL; | 1859 | BIGNUM *pub = NULL; |
| @@ -1863,7 +1869,7 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 1863 | SSL3_ST_SR_KEY_EXCH_B, SSL3_MT_CLIENT_KEY_EXCHANGE, 2048, &ok); | 1869 | SSL3_ST_SR_KEY_EXCH_B, SSL3_MT_CLIENT_KEY_EXCHANGE, 2048, &ok); |
| 1864 | if (!ok) | 1870 | if (!ok) |
| 1865 | return ((int)n); | 1871 | return ((int)n); |
| 1866 | p = (unsigned char *)s->init_msg; | 1872 | d = p = (unsigned char *)s->init_msg; |
| 1867 | 1873 | ||
| 1868 | alg_k = s->s3->tmp.new_cipher->algorithm_mkey; | 1874 | alg_k = s->s3->tmp.new_cipher->algorithm_mkey; |
| 1869 | 1875 | ||
| @@ -1897,6 +1903,8 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 1897 | 1903 | ||
| 1898 | /* TLS and [incidentally] DTLS{0xFEFF} */ | 1904 | /* TLS and [incidentally] DTLS{0xFEFF} */ |
| 1899 | if (s->version > SSL3_VERSION && s->version != DTLS1_BAD_VER) { | 1905 | if (s->version > SSL3_VERSION && s->version != DTLS1_BAD_VER) { |
| 1906 | if (2 > n) | ||
| 1907 | goto truncated; | ||
| 1900 | n2s(p, i); | 1908 | n2s(p, i); |
| 1901 | if (n != i + 2) { | 1909 | if (n != i + 2) { |
| 1902 | if (!(s->options & SSL_OP_TLS_D5_BUG)) { | 1910 | if (!(s->options & SSL_OP_TLS_D5_BUG)) { |
| @@ -1919,6 +1927,8 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 1919 | /* SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT); */ | 1927 | /* SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT); */ |
| 1920 | } | 1928 | } |
| 1921 | 1929 | ||
| 1930 | if (p + 2 - d > n) /* needed in the SSL3 case */ | ||
| 1931 | goto truncated; | ||
| 1922 | if ((al == -1) && !((p[0] == (s->client_version >> 8)) && | 1932 | if ((al == -1) && !((p[0] == (s->client_version >> 8)) && |
| 1923 | (p[1] == (s->client_version & 0xff)))) { | 1933 | (p[1] == (s->client_version & 0xff)))) { |
| 1924 | /* | 1934 | /* |
| @@ -1975,6 +1985,8 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 1975 | OPENSSL_cleanse(p, i); | 1985 | OPENSSL_cleanse(p, i); |
| 1976 | } else | 1986 | } else |
| 1977 | if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) { | 1987 | if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) { |
| 1988 | if (2 > n) | ||
| 1989 | goto truncated; | ||
| 1978 | n2s(p, i); | 1990 | n2s(p, i); |
| 1979 | if (n != i + 2) { | 1991 | if (n != i + 2) { |
| 1980 | if (!(s->options & SSL_OP_SSLEAY_080_CLIENT_DH_BUG)) { | 1992 | if (!(s->options & SSL_OP_SSLEAY_080_CLIENT_DH_BUG)) { |
| @@ -2206,6 +2218,8 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 2206 | client_pub_pkey) <= 0) | 2218 | client_pub_pkey) <= 0) |
| 2207 | ERR_clear_error(); | 2219 | ERR_clear_error(); |
| 2208 | } | 2220 | } |
| 2221 | if (2 > n) | ||
| 2222 | goto truncated; | ||
| 2209 | /* Decrypt session key */ | 2223 | /* Decrypt session key */ |
| 2210 | if (ASN1_get_object((const unsigned char **)&p, &Tlen, &Ttag, | 2224 | if (ASN1_get_object((const unsigned char **)&p, &Tlen, &Ttag, |
| 2211 | &Tclass, n) != V_ASN1_CONSTRUCTED || | 2225 | &Tclass, n) != V_ASN1_CONSTRUCTED || |
| @@ -2242,11 +2256,14 @@ gerr: | |||
| 2242 | } else { | 2256 | } else { |
| 2243 | al = SSL_AD_HANDSHAKE_FAILURE; | 2257 | al = SSL_AD_HANDSHAKE_FAILURE; |
| 2244 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | 2258 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, |
| 2245 | SSL_R_UNKNOWN_CIPHER_TYPE); | 2259 | SSL_R_UNKNOWN_CIPHER_TYPE); |
| 2246 | goto f_err; | 2260 | goto f_err; |
| 2247 | } | 2261 | } |
| 2248 | 2262 | ||
| 2249 | return (1); | 2263 | return (1); |
| 2264 | truncated: | ||
| 2265 | al = SSL_AD_DECODE_ERROR; | ||
| 2266 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, SSL_R_BAD_PACKET_LENGTH); | ||
| 2250 | f_err: | 2267 | f_err: |
| 2251 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 2268 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 2252 | err: | 2269 | err: |
| @@ -2338,6 +2355,8 @@ ssl3_get_cert_verify(SSL *s) | |||
| 2338 | al = SSL_AD_INTERNAL_ERROR; | 2355 | al = SSL_AD_INTERNAL_ERROR; |
| 2339 | goto f_err; | 2356 | goto f_err; |
| 2340 | } | 2357 | } |
| 2358 | if (2 > n) | ||
| 2359 | goto truncated; | ||
| 2341 | /* Check key type is consistent with signature */ | 2360 | /* Check key type is consistent with signature */ |
| 2342 | if (sigalg != (int)p[1]) { | 2361 | if (sigalg != (int)p[1]) { |
| 2343 | SSLerr(SSL_F_SSL3_GET_CERT_VERIFY, | 2362 | SSLerr(SSL_F_SSL3_GET_CERT_VERIFY, |
| @@ -2355,14 +2374,12 @@ ssl3_get_cert_verify(SSL *s) | |||
| 2355 | p += 2; | 2374 | p += 2; |
| 2356 | n -= 2; | 2375 | n -= 2; |
| 2357 | } | 2376 | } |
| 2377 | if (2 > n) | ||
| 2378 | goto truncated; | ||
| 2358 | n2s(p, i); | 2379 | n2s(p, i); |
| 2359 | n -= 2; | 2380 | n -= 2; |
| 2360 | if (i > n) { | 2381 | if (i > n) |
| 2361 | SSLerr(SSL_F_SSL3_GET_CERT_VERIFY, | 2382 | goto truncated; |
| 2362 | SSL_R_LENGTH_MISMATCH); | ||
| 2363 | al = SSL_AD_DECODE_ERROR; | ||
| 2364 | goto f_err; | ||
| 2365 | } | ||
| 2366 | } | 2383 | } |
| 2367 | j = EVP_PKEY_size(pkey); | 2384 | j = EVP_PKEY_size(pkey); |
| 2368 | if ((i > j) || (n > j) || (n <= 0)) { | 2385 | if ((i > j) || (n > j) || (n <= 0)) { |
| @@ -2445,7 +2462,10 @@ ssl3_get_cert_verify(SSL *s) | |||
| 2445 | EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new(pkey, NULL); | 2462 | EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new(pkey, NULL); |
| 2446 | EVP_PKEY_verify_init(pctx); | 2463 | EVP_PKEY_verify_init(pctx); |
| 2447 | if (i != 64) { | 2464 | if (i != 64) { |
| 2448 | fprintf(stderr, "GOST signature length is %d", i); | 2465 | SSLerr(SSL_F_SSL3_GET_CERT_VERIFY, |
| 2466 | SSL_R_WRONG_SIGNATURE_SIZE); | ||
| 2467 | al = SSL_AD_DECODE_ERROR; | ||
| 2468 | goto f_err; | ||
| 2449 | } | 2469 | } |
| 2450 | for (idx = 0; idx < 64; idx++) { | 2470 | for (idx = 0; idx < 64; idx++) { |
| 2451 | signature[63 - idx] = p[idx]; | 2471 | signature[63 - idx] = p[idx]; |
| @@ -2469,6 +2489,9 @@ ssl3_get_cert_verify(SSL *s) | |||
| 2469 | 2489 | ||
| 2470 | ret = 1; | 2490 | ret = 1; |
| 2471 | if (0) { | 2491 | if (0) { |
| 2492 | truncated: | ||
| 2493 | al = SSL_AD_DECODE_ERROR; | ||
| 2494 | SSLerr(SSL_F_SSL3_GET_CERT_VERIFY, SSL_R_BAD_PACKET_LENGTH); | ||
| 2472 | f_err: | 2495 | f_err: |
| 2473 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 2496 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 2474 | } | 2497 | } |
| @@ -2490,7 +2513,6 @@ ssl3_get_client_certificate(SSL *s) | |||
| 2490 | X509 *x = NULL; | 2513 | X509 *x = NULL; |
| 2491 | unsigned long l, nc, llen, n; | 2514 | unsigned long l, nc, llen, n; |
| 2492 | const unsigned char *p, *q; | 2515 | const unsigned char *p, *q; |
| 2493 | unsigned char *d; | ||
| 2494 | STACK_OF(X509) *sk = NULL; | 2516 | STACK_OF(X509) *sk = NULL; |
| 2495 | 2517 | ||
| 2496 | n = s->method->ssl_get_message(s, SSL3_ST_SR_CERT_A, SSL3_ST_SR_CERT_B, | 2518 | n = s->method->ssl_get_message(s, SSL3_ST_SR_CERT_A, SSL3_ST_SR_CERT_B, |
| @@ -2528,7 +2550,7 @@ ssl3_get_client_certificate(SSL *s) | |||
| 2528 | SSL_R_WRONG_MESSAGE_TYPE); | 2550 | SSL_R_WRONG_MESSAGE_TYPE); |
| 2529 | goto f_err; | 2551 | goto f_err; |
| 2530 | } | 2552 | } |
| 2531 | p = d = (unsigned char *)s->init_msg; | 2553 | p = (const unsigned char *)s->init_msg; |
| 2532 | 2554 | ||
| 2533 | if ((sk = sk_X509_new_null()) == NULL) { | 2555 | if ((sk = sk_X509_new_null()) == NULL) { |
| 2534 | SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, | 2556 | SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, |
| @@ -2536,16 +2558,14 @@ ssl3_get_client_certificate(SSL *s) | |||
| 2536 | goto err; | 2558 | goto err; |
| 2537 | } | 2559 | } |
| 2538 | 2560 | ||
| 2561 | if (3 > n) | ||
| 2562 | goto truncated; | ||
| 2539 | n2l3(p, llen); | 2563 | n2l3(p, llen); |
| 2540 | if (llen + 3 != n) { | 2564 | if (llen + 3 != n) |
| 2541 | al = SSL_AD_DECODE_ERROR; | 2565 | goto truncated; |
| 2542 | SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, | ||
| 2543 | SSL_R_LENGTH_MISMATCH); | ||
| 2544 | goto f_err; | ||
| 2545 | } | ||
| 2546 | for (nc = 0; nc < llen;) { | 2566 | for (nc = 0; nc < llen;) { |
| 2547 | n2l3(p, l); | 2567 | n2l3(p, l); |
| 2548 | if ((l + nc + 3) > llen) { | 2568 | if (l + nc + 3 > llen) { |
| 2549 | al = SSL_AD_DECODE_ERROR; | 2569 | al = SSL_AD_DECODE_ERROR; |
| 2550 | SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, | 2570 | SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, |
| 2551 | SSL_R_CERT_LENGTH_MISMATCH); | 2571 | SSL_R_CERT_LENGTH_MISMATCH); |
| @@ -2635,6 +2655,10 @@ ssl3_get_client_certificate(SSL *s) | |||
| 2635 | 2655 | ||
| 2636 | ret = 1; | 2656 | ret = 1; |
| 2637 | if (0) { | 2657 | if (0) { |
| 2658 | truncated: | ||
| 2659 | al = SSL_AD_DECODE_ERROR; | ||
| 2660 | SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, | ||
| 2661 | SSL_R_BAD_PACKET_LENGTH); | ||
| 2638 | f_err: | 2662 | f_err: |
| 2639 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 2663 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 2640 | } | 2664 | } |
diff --git a/src/lib/libssl/src/ssl/d1_clnt.c b/src/lib/libssl/src/ssl/d1_clnt.c index 3f47a3854b..b85908c733 100644 --- a/src/lib/libssl/src/ssl/d1_clnt.c +++ b/src/lib/libssl/src/ssl/d1_clnt.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: d1_clnt.c,v 1.28 2014/07/11 09:24:44 beck Exp $ */ | 1 | /* $OpenBSD: d1_clnt.c,v 1.29 2014/07/11 22:57:25 miod Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * DTLS implementation written by Nagendra Modadugu | 3 | * DTLS implementation written by Nagendra Modadugu |
| 4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. | 4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. |
| @@ -879,6 +879,8 @@ dtls1_get_hello_verify(SSL *s) | |||
| 879 | return (1); | 879 | return (1); |
| 880 | } | 880 | } |
| 881 | 881 | ||
| 882 | if (2 > n) | ||
| 883 | goto truncated; | ||
| 882 | data = (unsigned char *)s->init_msg; | 884 | data = (unsigned char *)s->init_msg; |
| 883 | 885 | ||
| 884 | if ((data[0] != (s->version >> 8)) || (data[1] != (s->version&0xff))) { | 886 | if ((data[0] != (s->version >> 8)) || (data[1] != (s->version&0xff))) { |
| @@ -889,7 +891,11 @@ dtls1_get_hello_verify(SSL *s) | |||
| 889 | } | 891 | } |
| 890 | data += 2; | 892 | data += 2; |
| 891 | 893 | ||
| 894 | if (2 + 1 > n) | ||
| 895 | goto truncated; | ||
| 892 | cookie_len = *(data++); | 896 | cookie_len = *(data++); |
| 897 | if (2 + 1 + cookie_len > n) | ||
| 898 | goto truncated; | ||
| 893 | if (cookie_len > sizeof(s->d1->cookie)) { | 899 | if (cookie_len > sizeof(s->d1->cookie)) { |
| 894 | al = SSL_AD_ILLEGAL_PARAMETER; | 900 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 895 | goto f_err; | 901 | goto f_err; |
| @@ -901,6 +907,8 @@ dtls1_get_hello_verify(SSL *s) | |||
| 901 | s->d1->send_cookie = 1; | 907 | s->d1->send_cookie = 1; |
| 902 | return 1; | 908 | return 1; |
| 903 | 909 | ||
| 910 | truncated: | ||
| 911 | al = SSL_AD_DECODE_ERROR; | ||
| 904 | f_err: | 912 | f_err: |
| 905 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 913 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 906 | return -1; | 914 | return -1; |
diff --git a/src/lib/libssl/src/ssl/s3_clnt.c b/src/lib/libssl/src/ssl/s3_clnt.c index 3596acf1de..884b9f1efb 100644 --- a/src/lib/libssl/src/ssl/s3_clnt.c +++ b/src/lib/libssl/src/ssl/s3_clnt.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: s3_clnt.c,v 1.77 2014/07/11 15:44:53 miod Exp $ */ | 1 | /* $OpenBSD: s3_clnt.c,v 1.78 2014/07/11 22:57:25 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 | * |
| @@ -814,6 +814,8 @@ ssl3_get_server_hello(SSL *s) | |||
| 814 | 814 | ||
| 815 | d = p = (unsigned char *)s->init_msg; | 815 | d = p = (unsigned char *)s->init_msg; |
| 816 | 816 | ||
| 817 | if (2 > n) | ||
| 818 | goto truncated; | ||
| 817 | if ((p[0] != (s->version >> 8)) || (p[1] != (s->version & 0xff))) { | 819 | if ((p[0] != (s->version >> 8)) || (p[1] != (s->version & 0xff))) { |
| 818 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_WRONG_SSL_VERSION); | 820 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_WRONG_SSL_VERSION); |
| 819 | s->version = (s->version&0xff00) | p[1]; | 821 | s->version = (s->version&0xff00) | p[1]; |
| @@ -823,6 +825,10 @@ ssl3_get_server_hello(SSL *s) | |||
| 823 | p += 2; | 825 | p += 2; |
| 824 | 826 | ||
| 825 | /* load the server hello data */ | 827 | /* load the server hello data */ |
| 828 | |||
| 829 | if (p + SSL3_RANDOM_SIZE + 1 - d > n) | ||
| 830 | goto truncated; | ||
| 831 | |||
| 826 | /* load the server random */ | 832 | /* load the server random */ |
| 827 | memcpy(s->s3->server_random, p, SSL3_RANDOM_SIZE); | 833 | memcpy(s->s3->server_random, p, SSL3_RANDOM_SIZE); |
| 828 | p += SSL3_RANDOM_SIZE; | 834 | p += SSL3_RANDOM_SIZE; |
| @@ -838,6 +844,9 @@ ssl3_get_server_hello(SSL *s) | |||
| 838 | goto f_err; | 844 | goto f_err; |
| 839 | } | 845 | } |
| 840 | 846 | ||
| 847 | if (p + j + 2 - d > n) | ||
| 848 | goto truncated; | ||
| 849 | |||
| 841 | /* | 850 | /* |
| 842 | * Check if we want to resume the session based on external | 851 | * Check if we want to resume the session based on external |
| 843 | * pre-shared secret | 852 | * pre-shared secret |
| @@ -935,6 +944,8 @@ ssl3_get_server_hello(SSL *s) | |||
| 935 | } | 944 | } |
| 936 | /* lets get the compression algorithm */ | 945 | /* lets get the compression algorithm */ |
| 937 | /* COMPRESSION */ | 946 | /* COMPRESSION */ |
| 947 | if (p + 1 - d > n) | ||
| 948 | goto truncated; | ||
| 938 | if (*(p++) != 0) { | 949 | if (*(p++) != 0) { |
| 939 | al = SSL_AD_ILLEGAL_PARAMETER; | 950 | al = SSL_AD_ILLEGAL_PARAMETER; |
| 940 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, | 951 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, |
| @@ -958,15 +969,15 @@ ssl3_get_server_hello(SSL *s) | |||
| 958 | } | 969 | } |
| 959 | } | 970 | } |
| 960 | 971 | ||
| 961 | if (p != (d + n)) { | 972 | if (p != d + n) |
| 962 | /* wrong packet length */ | 973 | goto truncated; |
| 963 | al = SSL_AD_DECODE_ERROR; | ||
| 964 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, | ||
| 965 | SSL_R_BAD_PACKET_LENGTH); | ||
| 966 | goto f_err; | ||
| 967 | } | ||
| 968 | 974 | ||
| 969 | return (1); | 975 | return (1); |
| 976 | |||
| 977 | truncated: | ||
| 978 | /* wrong packet length */ | ||
| 979 | al = SSL_AD_DECODE_ERROR; | ||
| 980 | SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, SSL_R_BAD_PACKET_LENGTH); | ||
| 970 | f_err: | 981 | f_err: |
| 971 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 982 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 972 | err: | 983 | err: |
| @@ -1015,6 +1026,8 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1015 | goto err; | 1026 | goto err; |
| 1016 | } | 1027 | } |
| 1017 | 1028 | ||
| 1029 | if (p + 3 - d > n) | ||
| 1030 | goto truncated; | ||
| 1018 | n2l3(p, llen); | 1031 | n2l3(p, llen); |
| 1019 | if (llen + 3 != n) { | 1032 | if (llen + 3 != n) { |
| 1020 | al = SSL_AD_DECODE_ERROR; | 1033 | al = SSL_AD_DECODE_ERROR; |
| @@ -1023,6 +1036,8 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1023 | goto f_err; | 1036 | goto f_err; |
| 1024 | } | 1037 | } |
| 1025 | for (nc = 0; nc < llen; ) { | 1038 | for (nc = 0; nc < llen; ) { |
| 1039 | if (p + 3 - d > n) | ||
| 1040 | goto truncated; | ||
| 1026 | n2l3(p, l); | 1041 | n2l3(p, l); |
| 1027 | if ((l + nc + 3) > llen) { | 1042 | if ((l + nc + 3) > llen) { |
| 1028 | al = SSL_AD_DECODE_ERROR; | 1043 | al = SSL_AD_DECODE_ERROR; |
| @@ -1094,7 +1109,7 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1094 | x = NULL; | 1109 | x = NULL; |
| 1095 | al = SSL3_AL_FATAL; | 1110 | al = SSL3_AL_FATAL; |
| 1096 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, | 1111 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1097 | SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS); | 1112 | SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS); |
| 1098 | goto f_err; | 1113 | goto f_err; |
| 1099 | } | 1114 | } |
| 1100 | 1115 | ||
| @@ -1103,7 +1118,7 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1103 | x = NULL; | 1118 | x = NULL; |
| 1104 | al = SSL3_AL_FATAL; | 1119 | al = SSL3_AL_FATAL; |
| 1105 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, | 1120 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, |
| 1106 | SSL_R_UNKNOWN_CERTIFICATE_TYPE); | 1121 | SSL_R_UNKNOWN_CERTIFICATE_TYPE); |
| 1107 | goto f_err; | 1122 | goto f_err; |
| 1108 | } | 1123 | } |
| 1109 | 1124 | ||
| @@ -1137,6 +1152,11 @@ ssl3_get_server_certificate(SSL *s) | |||
| 1137 | ret = 1; | 1152 | ret = 1; |
| 1138 | 1153 | ||
| 1139 | if (0) { | 1154 | if (0) { |
| 1155 | truncated: | ||
| 1156 | /* wrong packet length */ | ||
| 1157 | al = SSL_AD_DECODE_ERROR; | ||
| 1158 | SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, | ||
| 1159 | SSL_R_BAD_PACKET_LENGTH); | ||
| 1140 | f_err: | 1160 | f_err: |
| 1141 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1161 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1142 | } | 1162 | } |
| @@ -1206,6 +1226,8 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1206 | ERR_R_MALLOC_FAILURE); | 1226 | ERR_R_MALLOC_FAILURE); |
| 1207 | goto err; | 1227 | goto err; |
| 1208 | } | 1228 | } |
| 1229 | if (2 > n) | ||
| 1230 | goto truncated; | ||
| 1209 | n2s(p, i); | 1231 | n2s(p, i); |
| 1210 | param_len = i + 2; | 1232 | param_len = i + 2; |
| 1211 | if (param_len > n) { | 1233 | if (param_len > n) { |
| @@ -1221,6 +1243,8 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1221 | } | 1243 | } |
| 1222 | p += i; | 1244 | p += i; |
| 1223 | 1245 | ||
| 1246 | if (param_len + 2 > n) | ||
| 1247 | goto truncated; | ||
| 1224 | n2s(p, i); | 1248 | n2s(p, i); |
| 1225 | param_len += i + 2; | 1249 | param_len += i + 2; |
| 1226 | if (param_len > n) { | 1250 | if (param_len > n) { |
| @@ -1258,6 +1282,8 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1258 | ERR_R_DH_LIB); | 1282 | ERR_R_DH_LIB); |
| 1259 | goto err; | 1283 | goto err; |
| 1260 | } | 1284 | } |
| 1285 | if (2 > n) | ||
| 1286 | goto truncated; | ||
| 1261 | n2s(p, i); | 1287 | n2s(p, i); |
| 1262 | param_len = i + 2; | 1288 | param_len = i + 2; |
| 1263 | if (param_len > n) { | 1289 | if (param_len > n) { |
| @@ -1273,6 +1299,8 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1273 | } | 1299 | } |
| 1274 | p += i; | 1300 | p += i; |
| 1275 | 1301 | ||
| 1302 | if (param_len + 2 > n) | ||
| 1303 | goto truncated; | ||
| 1276 | n2s(p, i); | 1304 | n2s(p, i); |
| 1277 | param_len += i + 2; | 1305 | param_len += i + 2; |
| 1278 | if (param_len > n) { | 1306 | if (param_len > n) { |
| @@ -1288,6 +1316,8 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1288 | } | 1316 | } |
| 1289 | p += i; | 1317 | p += i; |
| 1290 | 1318 | ||
| 1319 | if (param_len + 2 > n) | ||
| 1320 | goto truncated; | ||
| 1291 | n2s(p, i); | 1321 | n2s(p, i); |
| 1292 | param_len += i + 2; | 1322 | param_len += i + 2; |
| 1293 | if (param_len > n) { | 1323 | if (param_len > n) { |
| @@ -1376,6 +1406,8 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1376 | goto err; | 1406 | goto err; |
| 1377 | } | 1407 | } |
| 1378 | 1408 | ||
| 1409 | if (param_len + 1 > n) | ||
| 1410 | goto truncated; | ||
| 1379 | encoded_pt_len = *p; | 1411 | encoded_pt_len = *p; |
| 1380 | /* length of encoded point */ | 1412 | /* length of encoded point */ |
| 1381 | p += 1; | 1413 | p += 1; |
| @@ -1435,6 +1467,8 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1435 | * Check key type is consistent | 1467 | * Check key type is consistent |
| 1436 | * with signature | 1468 | * with signature |
| 1437 | */ | 1469 | */ |
| 1470 | if (2 > n) | ||
| 1471 | goto truncated; | ||
| 1438 | if (sigalg != (int)p[1]) { | 1472 | if (sigalg != (int)p[1]) { |
| 1439 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | 1473 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| 1440 | SSL_R_WRONG_SIGNATURE_TYPE); | 1474 | SSL_R_WRONG_SIGNATURE_TYPE); |
| @@ -1453,11 +1487,13 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1453 | } else | 1487 | } else |
| 1454 | md = EVP_sha1(); | 1488 | md = EVP_sha1(); |
| 1455 | 1489 | ||
| 1490 | if (2 > n) | ||
| 1491 | goto truncated; | ||
| 1456 | n2s(p, i); | 1492 | n2s(p, i); |
| 1457 | n -= 2; | 1493 | n -= 2; |
| 1458 | j = EVP_PKEY_size(pkey); | 1494 | j = EVP_PKEY_size(pkey); |
| 1459 | 1495 | ||
| 1460 | if ((i != n) || (n > j) || (n <= 0)) { | 1496 | if (i != n || n > j) { |
| 1461 | /* wrong packet length */ | 1497 | /* wrong packet length */ |
| 1462 | al = SSL_AD_DECODE_ERROR; | 1498 | al = SSL_AD_DECODE_ERROR; |
| 1463 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | 1499 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
| @@ -1534,6 +1570,10 @@ ssl3_get_key_exchange(SSL *s) | |||
| 1534 | EVP_PKEY_free(pkey); | 1570 | EVP_PKEY_free(pkey); |
| 1535 | EVP_MD_CTX_cleanup(&md_ctx); | 1571 | EVP_MD_CTX_cleanup(&md_ctx); |
| 1536 | return (1); | 1572 | return (1); |
| 1573 | truncated: | ||
| 1574 | /* wrong packet length */ | ||
| 1575 | al = SSL_AD_DECODE_ERROR; | ||
| 1576 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_PACKET_LENGTH); | ||
| 1537 | f_err: | 1577 | f_err: |
| 1538 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1578 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1539 | err: | 1579 | err: |
| @@ -1606,13 +1646,26 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1606 | } | 1646 | } |
| 1607 | 1647 | ||
| 1608 | /* get the certificate types */ | 1648 | /* get the certificate types */ |
| 1649 | if (1 > n) | ||
| 1650 | goto truncated; | ||
| 1609 | ctype_num= *(p++); | 1651 | ctype_num= *(p++); |
| 1610 | if (ctype_num > SSL3_CT_NUMBER) | 1652 | if (ctype_num > SSL3_CT_NUMBER) |
| 1611 | ctype_num = SSL3_CT_NUMBER; | 1653 | ctype_num = SSL3_CT_NUMBER; |
| 1654 | if (p + ctype_num - d > n) { | ||
| 1655 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, | ||
| 1656 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 1657 | goto err; | ||
| 1658 | } | ||
| 1659 | |||
| 1612 | for (i = 0; i < ctype_num; i++) | 1660 | for (i = 0; i < ctype_num; i++) |
| 1613 | s->s3->tmp.ctype[i] = p[i]; | 1661 | s->s3->tmp.ctype[i] = p[i]; |
| 1614 | p += ctype_num; | 1662 | p += ctype_num; |
| 1615 | if (SSL_USE_SIGALGS(s)) { | 1663 | if (SSL_USE_SIGALGS(s)) { |
| 1664 | if (p + 2 - d > n) { | ||
| 1665 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, | ||
| 1666 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 1667 | goto err; | ||
| 1668 | } | ||
| 1616 | n2s(p, llen); | 1669 | n2s(p, llen); |
| 1617 | /* Check we have enough room for signature algorithms and | 1670 | /* Check we have enough room for signature algorithms and |
| 1618 | * following length value. | 1671 | * following length value. |
| @@ -1633,6 +1686,11 @@ ssl3_get_certificate_request(SSL *s) | |||
| 1633 | } | 1686 | } |
| 1634 | 1687 | ||
| 1635 | /* get the CA RDNs */ | 1688 | /* get the CA RDNs */ |
| 1689 | if (p + 2 - d > n) { | ||
| 1690 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, | ||
| 1691 | SSL_R_DATA_LENGTH_TOO_LONG); | ||
| 1692 | goto err; | ||
| 1693 | } | ||
| 1636 | n2s(p, llen); | 1694 | n2s(p, llen); |
| 1637 | 1695 | ||
| 1638 | if ((unsigned long)(p - d + llen) != n) { | 1696 | if ((unsigned long)(p - d + llen) != n) { |
| @@ -1698,6 +1756,11 @@ cont: | |||
| 1698 | ca_sk = NULL; | 1756 | ca_sk = NULL; |
| 1699 | 1757 | ||
| 1700 | ret = 1; | 1758 | ret = 1; |
| 1759 | if (0) { | ||
| 1760 | truncated: | ||
| 1761 | SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, | ||
| 1762 | SSL_R_BAD_PACKET_LENGTH); | ||
| 1763 | } | ||
| 1701 | err: | 1764 | err: |
| 1702 | if (ca_sk != NULL) | 1765 | if (ca_sk != NULL) |
| 1703 | sk_X509_NAME_pop_free(ca_sk, X509_NAME_free); | 1766 | sk_X509_NAME_pop_free(ca_sk, X509_NAME_free); |
diff --git a/src/lib/libssl/src/ssl/s3_srvr.c b/src/lib/libssl/src/ssl/s3_srvr.c index 66a4552237..89325b7be9 100644 --- a/src/lib/libssl/src/ssl/s3_srvr.c +++ b/src/lib/libssl/src/ssl/s3_srvr.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: s3_srvr.c,v 1.74 2014/07/11 15:18:52 miod Exp $ */ | 1 | /* $OpenBSD: s3_srvr.c,v 1.75 2014/07/11 22:57:25 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 | * |
| @@ -894,18 +894,17 @@ ssl3_get_client_hello(SSL *s) | |||
| 894 | s->state = SSL3_ST_SR_CLNT_HELLO_B; | 894 | s->state = SSL3_ST_SR_CLNT_HELLO_B; |
| 895 | } | 895 | } |
| 896 | s->first_packet = 1; | 896 | s->first_packet = 1; |
| 897 | n = s->method->ssl_get_message(s, | 897 | n = s->method->ssl_get_message(s, SSL3_ST_SR_CLNT_HELLO_B, |
| 898 | SSL3_ST_SR_CLNT_HELLO_B, | 898 | SSL3_ST_SR_CLNT_HELLO_C, SSL3_MT_CLIENT_HELLO, |
| 899 | SSL3_ST_SR_CLNT_HELLO_C, | 899 | SSL3_RT_MAX_PLAIN_LENGTH, &ok); |
| 900 | SSL3_MT_CLIENT_HELLO, | ||
| 901 | SSL3_RT_MAX_PLAIN_LENGTH, | ||
| 902 | &ok); | ||
| 903 | 900 | ||
| 904 | if (!ok) | 901 | if (!ok) |
| 905 | return ((int)n); | 902 | return ((int)n); |
| 906 | s->first_packet = 0; | 903 | s->first_packet = 0; |
| 907 | d = p=(unsigned char *)s->init_msg; | 904 | d = p = (unsigned char *)s->init_msg; |
| 908 | 905 | ||
| 906 | if (2 > n) | ||
| 907 | goto truncated; | ||
| 909 | /* | 908 | /* |
| 910 | * Use version from inside client hello, not from record header. | 909 | * Use version from inside client hello, not from record header. |
| 911 | * (may differ: see RFC 2246, Appendix E, second paragraph) | 910 | * (may differ: see RFC 2246, Appendix E, second paragraph) |
| @@ -944,12 +943,17 @@ ssl3_get_client_hello(SSL *s) | |||
| 944 | return (1); | 943 | return (1); |
| 945 | } | 944 | } |
| 946 | 945 | ||
| 946 | if (p + SSL3_RANDOM_SIZE + 1 - d > n) | ||
| 947 | goto truncated; | ||
| 948 | |||
| 947 | /* load the client random */ | 949 | /* load the client random */ |
| 948 | memcpy(s->s3->client_random, p, SSL3_RANDOM_SIZE); | 950 | memcpy(s->s3->client_random, p, SSL3_RANDOM_SIZE); |
| 949 | p += SSL3_RANDOM_SIZE; | 951 | p += SSL3_RANDOM_SIZE; |
| 950 | 952 | ||
| 951 | /* get the session-id */ | 953 | /* get the session-id */ |
| 952 | j= *(p++); | 954 | j= *(p++); |
| 955 | if (p + j - d > n) | ||
| 956 | goto truncated; | ||
| 953 | 957 | ||
| 954 | s->hit = 0; | 958 | s->hit = 0; |
| 955 | /* | 959 | /* |
| @@ -988,6 +992,8 @@ ssl3_get_client_hello(SSL *s) | |||
| 988 | 992 | ||
| 989 | if (SSL_IS_DTLS(s)) { | 993 | if (SSL_IS_DTLS(s)) { |
| 990 | /* cookie stuff */ | 994 | /* cookie stuff */ |
| 995 | if (p + 1 - d > n) | ||
| 996 | goto truncated; | ||
| 991 | cookie_len = *(p++); | 997 | cookie_len = *(p++); |
| 992 | 998 | ||
| 993 | /* | 999 | /* |
| @@ -1003,6 +1009,9 @@ ssl3_get_client_hello(SSL *s) | |||
| 1003 | goto f_err; | 1009 | goto f_err; |
| 1004 | } | 1010 | } |
| 1005 | 1011 | ||
| 1012 | if (p + cookie_len - d > n) | ||
| 1013 | goto truncated; | ||
| 1014 | |||
| 1006 | /* verify the cookie if appropriate option is set. */ | 1015 | /* verify the cookie if appropriate option is set. */ |
| 1007 | if ((SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) && | 1016 | if ((SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) && |
| 1008 | cookie_len > 0) { | 1017 | cookie_len > 0) { |
| @@ -1032,6 +1041,8 @@ ssl3_get_client_hello(SSL *s) | |||
| 1032 | p += cookie_len; | 1041 | p += cookie_len; |
| 1033 | } | 1042 | } |
| 1034 | 1043 | ||
| 1044 | if (p + 2 - d > n) | ||
| 1045 | goto truncated; | ||
| 1035 | n2s(p, i); | 1046 | n2s(p, i); |
| 1036 | if ((i == 0) && (j != 0)) { | 1047 | if ((i == 0) && (j != 0)) { |
| 1037 | /* we need a cipher if we are not resuming a session */ | 1048 | /* we need a cipher if we are not resuming a session */ |
| @@ -1040,13 +1051,8 @@ ssl3_get_client_hello(SSL *s) | |||
| 1040 | SSL_R_NO_CIPHERS_SPECIFIED); | 1051 | SSL_R_NO_CIPHERS_SPECIFIED); |
| 1041 | goto f_err; | 1052 | goto f_err; |
| 1042 | } | 1053 | } |
| 1043 | if ((p + i) >= (d + n)) { | 1054 | if (p + i - d > n) |
| 1044 | /* not enough data */ | 1055 | goto truncated; |
| 1045 | al = SSL_AD_DECODE_ERROR; | ||
| 1046 | SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, | ||
| 1047 | SSL_R_LENGTH_MISMATCH); | ||
| 1048 | goto f_err; | ||
| 1049 | } | ||
| 1050 | if ((i > 0) && | 1056 | if ((i > 0) && |
| 1051 | (ssl_bytes_to_cipher_list(s, p, i, &(ciphers)) == NULL)) { | 1057 | (ssl_bytes_to_cipher_list(s, p, i, &(ciphers)) == NULL)) { |
| 1052 | goto err; | 1058 | goto err; |
| @@ -1078,14 +1084,11 @@ ssl3_get_client_hello(SSL *s) | |||
| 1078 | } | 1084 | } |
| 1079 | 1085 | ||
| 1080 | /* compression */ | 1086 | /* compression */ |
| 1087 | if (p + 1 - d > n) | ||
| 1088 | goto truncated; | ||
| 1081 | i= *(p++); | 1089 | i= *(p++); |
| 1082 | if ((p + i) > (d + n)) { | 1090 | if (p + i - d > n) |
| 1083 | /* not enough data */ | 1091 | goto truncated; |
| 1084 | al = SSL_AD_DECODE_ERROR; | ||
| 1085 | SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, | ||
| 1086 | SSL_R_LENGTH_MISMATCH); | ||
| 1087 | goto f_err; | ||
| 1088 | } | ||
| 1089 | for (j = 0; j < i; j++) { | 1092 | for (j = 0; j < i; j++) { |
| 1090 | if (p[j] == 0) | 1093 | if (p[j] == 0) |
| 1091 | break; | 1094 | break; |
| @@ -1247,6 +1250,9 @@ ssl3_get_client_hello(SSL *s) | |||
| 1247 | if (ret < 0) | 1250 | if (ret < 0) |
| 1248 | ret = 1; | 1251 | ret = 1; |
| 1249 | if (0) { | 1252 | if (0) { |
| 1253 | truncated: | ||
| 1254 | al = SSL_AD_DECODE_ERROR; | ||
| 1255 | SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_BAD_PACKET_LENGTH); | ||
| 1250 | f_err: | 1256 | f_err: |
| 1251 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1257 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1252 | } | 1258 | } |
| @@ -1847,7 +1853,7 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 1847 | int i, al, ok; | 1853 | int i, al, ok; |
| 1848 | long n; | 1854 | long n; |
| 1849 | unsigned long alg_k; | 1855 | unsigned long alg_k; |
| 1850 | unsigned char *p; | 1856 | unsigned char *d, *p; |
| 1851 | RSA *rsa = NULL; | 1857 | RSA *rsa = NULL; |
| 1852 | EVP_PKEY *pkey = NULL; | 1858 | EVP_PKEY *pkey = NULL; |
| 1853 | BIGNUM *pub = NULL; | 1859 | BIGNUM *pub = NULL; |
| @@ -1863,7 +1869,7 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 1863 | SSL3_ST_SR_KEY_EXCH_B, SSL3_MT_CLIENT_KEY_EXCHANGE, 2048, &ok); | 1869 | SSL3_ST_SR_KEY_EXCH_B, SSL3_MT_CLIENT_KEY_EXCHANGE, 2048, &ok); |
| 1864 | if (!ok) | 1870 | if (!ok) |
| 1865 | return ((int)n); | 1871 | return ((int)n); |
| 1866 | p = (unsigned char *)s->init_msg; | 1872 | d = p = (unsigned char *)s->init_msg; |
| 1867 | 1873 | ||
| 1868 | alg_k = s->s3->tmp.new_cipher->algorithm_mkey; | 1874 | alg_k = s->s3->tmp.new_cipher->algorithm_mkey; |
| 1869 | 1875 | ||
| @@ -1897,6 +1903,8 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 1897 | 1903 | ||
| 1898 | /* TLS and [incidentally] DTLS{0xFEFF} */ | 1904 | /* TLS and [incidentally] DTLS{0xFEFF} */ |
| 1899 | if (s->version > SSL3_VERSION && s->version != DTLS1_BAD_VER) { | 1905 | if (s->version > SSL3_VERSION && s->version != DTLS1_BAD_VER) { |
| 1906 | if (2 > n) | ||
| 1907 | goto truncated; | ||
| 1900 | n2s(p, i); | 1908 | n2s(p, i); |
| 1901 | if (n != i + 2) { | 1909 | if (n != i + 2) { |
| 1902 | if (!(s->options & SSL_OP_TLS_D5_BUG)) { | 1910 | if (!(s->options & SSL_OP_TLS_D5_BUG)) { |
| @@ -1919,6 +1927,8 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 1919 | /* SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT); */ | 1927 | /* SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT); */ |
| 1920 | } | 1928 | } |
| 1921 | 1929 | ||
| 1930 | if (p + 2 - d > n) /* needed in the SSL3 case */ | ||
| 1931 | goto truncated; | ||
| 1922 | if ((al == -1) && !((p[0] == (s->client_version >> 8)) && | 1932 | if ((al == -1) && !((p[0] == (s->client_version >> 8)) && |
| 1923 | (p[1] == (s->client_version & 0xff)))) { | 1933 | (p[1] == (s->client_version & 0xff)))) { |
| 1924 | /* | 1934 | /* |
| @@ -1975,6 +1985,8 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 1975 | OPENSSL_cleanse(p, i); | 1985 | OPENSSL_cleanse(p, i); |
| 1976 | } else | 1986 | } else |
| 1977 | if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) { | 1987 | if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd)) { |
| 1988 | if (2 > n) | ||
| 1989 | goto truncated; | ||
| 1978 | n2s(p, i); | 1990 | n2s(p, i); |
| 1979 | if (n != i + 2) { | 1991 | if (n != i + 2) { |
| 1980 | if (!(s->options & SSL_OP_SSLEAY_080_CLIENT_DH_BUG)) { | 1992 | if (!(s->options & SSL_OP_SSLEAY_080_CLIENT_DH_BUG)) { |
| @@ -2206,6 +2218,8 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 2206 | client_pub_pkey) <= 0) | 2218 | client_pub_pkey) <= 0) |
| 2207 | ERR_clear_error(); | 2219 | ERR_clear_error(); |
| 2208 | } | 2220 | } |
| 2221 | if (2 > n) | ||
| 2222 | goto truncated; | ||
| 2209 | /* Decrypt session key */ | 2223 | /* Decrypt session key */ |
| 2210 | if (ASN1_get_object((const unsigned char **)&p, &Tlen, &Ttag, | 2224 | if (ASN1_get_object((const unsigned char **)&p, &Tlen, &Ttag, |
| 2211 | &Tclass, n) != V_ASN1_CONSTRUCTED || | 2225 | &Tclass, n) != V_ASN1_CONSTRUCTED || |
| @@ -2242,11 +2256,14 @@ gerr: | |||
| 2242 | } else { | 2256 | } else { |
| 2243 | al = SSL_AD_HANDSHAKE_FAILURE; | 2257 | al = SSL_AD_HANDSHAKE_FAILURE; |
| 2244 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, | 2258 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, |
| 2245 | SSL_R_UNKNOWN_CIPHER_TYPE); | 2259 | SSL_R_UNKNOWN_CIPHER_TYPE); |
| 2246 | goto f_err; | 2260 | goto f_err; |
| 2247 | } | 2261 | } |
| 2248 | 2262 | ||
| 2249 | return (1); | 2263 | return (1); |
| 2264 | truncated: | ||
| 2265 | al = SSL_AD_DECODE_ERROR; | ||
| 2266 | SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, SSL_R_BAD_PACKET_LENGTH); | ||
| 2250 | f_err: | 2267 | f_err: |
| 2251 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 2268 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 2252 | err: | 2269 | err: |
| @@ -2338,6 +2355,8 @@ ssl3_get_cert_verify(SSL *s) | |||
| 2338 | al = SSL_AD_INTERNAL_ERROR; | 2355 | al = SSL_AD_INTERNAL_ERROR; |
| 2339 | goto f_err; | 2356 | goto f_err; |
| 2340 | } | 2357 | } |
| 2358 | if (2 > n) | ||
| 2359 | goto truncated; | ||
| 2341 | /* Check key type is consistent with signature */ | 2360 | /* Check key type is consistent with signature */ |
| 2342 | if (sigalg != (int)p[1]) { | 2361 | if (sigalg != (int)p[1]) { |
| 2343 | SSLerr(SSL_F_SSL3_GET_CERT_VERIFY, | 2362 | SSLerr(SSL_F_SSL3_GET_CERT_VERIFY, |
| @@ -2355,14 +2374,12 @@ ssl3_get_cert_verify(SSL *s) | |||
| 2355 | p += 2; | 2374 | p += 2; |
| 2356 | n -= 2; | 2375 | n -= 2; |
| 2357 | } | 2376 | } |
| 2377 | if (2 > n) | ||
| 2378 | goto truncated; | ||
| 2358 | n2s(p, i); | 2379 | n2s(p, i); |
| 2359 | n -= 2; | 2380 | n -= 2; |
| 2360 | if (i > n) { | 2381 | if (i > n) |
| 2361 | SSLerr(SSL_F_SSL3_GET_CERT_VERIFY, | 2382 | goto truncated; |
| 2362 | SSL_R_LENGTH_MISMATCH); | ||
| 2363 | al = SSL_AD_DECODE_ERROR; | ||
| 2364 | goto f_err; | ||
| 2365 | } | ||
| 2366 | } | 2383 | } |
| 2367 | j = EVP_PKEY_size(pkey); | 2384 | j = EVP_PKEY_size(pkey); |
| 2368 | if ((i > j) || (n > j) || (n <= 0)) { | 2385 | if ((i > j) || (n > j) || (n <= 0)) { |
| @@ -2445,7 +2462,10 @@ ssl3_get_cert_verify(SSL *s) | |||
| 2445 | EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new(pkey, NULL); | 2462 | EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new(pkey, NULL); |
| 2446 | EVP_PKEY_verify_init(pctx); | 2463 | EVP_PKEY_verify_init(pctx); |
| 2447 | if (i != 64) { | 2464 | if (i != 64) { |
| 2448 | fprintf(stderr, "GOST signature length is %d", i); | 2465 | SSLerr(SSL_F_SSL3_GET_CERT_VERIFY, |
| 2466 | SSL_R_WRONG_SIGNATURE_SIZE); | ||
| 2467 | al = SSL_AD_DECODE_ERROR; | ||
| 2468 | goto f_err; | ||
| 2449 | } | 2469 | } |
| 2450 | for (idx = 0; idx < 64; idx++) { | 2470 | for (idx = 0; idx < 64; idx++) { |
| 2451 | signature[63 - idx] = p[idx]; | 2471 | signature[63 - idx] = p[idx]; |
| @@ -2469,6 +2489,9 @@ ssl3_get_cert_verify(SSL *s) | |||
| 2469 | 2489 | ||
| 2470 | ret = 1; | 2490 | ret = 1; |
| 2471 | if (0) { | 2491 | if (0) { |
| 2492 | truncated: | ||
| 2493 | al = SSL_AD_DECODE_ERROR; | ||
| 2494 | SSLerr(SSL_F_SSL3_GET_CERT_VERIFY, SSL_R_BAD_PACKET_LENGTH); | ||
| 2472 | f_err: | 2495 | f_err: |
| 2473 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 2496 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 2474 | } | 2497 | } |
| @@ -2490,7 +2513,6 @@ ssl3_get_client_certificate(SSL *s) | |||
| 2490 | X509 *x = NULL; | 2513 | X509 *x = NULL; |
| 2491 | unsigned long l, nc, llen, n; | 2514 | unsigned long l, nc, llen, n; |
| 2492 | const unsigned char *p, *q; | 2515 | const unsigned char *p, *q; |
| 2493 | unsigned char *d; | ||
| 2494 | STACK_OF(X509) *sk = NULL; | 2516 | STACK_OF(X509) *sk = NULL; |
| 2495 | 2517 | ||
| 2496 | n = s->method->ssl_get_message(s, SSL3_ST_SR_CERT_A, SSL3_ST_SR_CERT_B, | 2518 | n = s->method->ssl_get_message(s, SSL3_ST_SR_CERT_A, SSL3_ST_SR_CERT_B, |
| @@ -2528,7 +2550,7 @@ ssl3_get_client_certificate(SSL *s) | |||
| 2528 | SSL_R_WRONG_MESSAGE_TYPE); | 2550 | SSL_R_WRONG_MESSAGE_TYPE); |
| 2529 | goto f_err; | 2551 | goto f_err; |
| 2530 | } | 2552 | } |
| 2531 | p = d = (unsigned char *)s->init_msg; | 2553 | p = (const unsigned char *)s->init_msg; |
| 2532 | 2554 | ||
| 2533 | if ((sk = sk_X509_new_null()) == NULL) { | 2555 | if ((sk = sk_X509_new_null()) == NULL) { |
| 2534 | SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, | 2556 | SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, |
| @@ -2536,16 +2558,14 @@ ssl3_get_client_certificate(SSL *s) | |||
| 2536 | goto err; | 2558 | goto err; |
| 2537 | } | 2559 | } |
| 2538 | 2560 | ||
| 2561 | if (3 > n) | ||
| 2562 | goto truncated; | ||
| 2539 | n2l3(p, llen); | 2563 | n2l3(p, llen); |
| 2540 | if (llen + 3 != n) { | 2564 | if (llen + 3 != n) |
| 2541 | al = SSL_AD_DECODE_ERROR; | 2565 | goto truncated; |
| 2542 | SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, | ||
| 2543 | SSL_R_LENGTH_MISMATCH); | ||
| 2544 | goto f_err; | ||
| 2545 | } | ||
| 2546 | for (nc = 0; nc < llen;) { | 2566 | for (nc = 0; nc < llen;) { |
| 2547 | n2l3(p, l); | 2567 | n2l3(p, l); |
| 2548 | if ((l + nc + 3) > llen) { | 2568 | if (l + nc + 3 > llen) { |
| 2549 | al = SSL_AD_DECODE_ERROR; | 2569 | al = SSL_AD_DECODE_ERROR; |
| 2550 | SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, | 2570 | SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, |
| 2551 | SSL_R_CERT_LENGTH_MISMATCH); | 2571 | SSL_R_CERT_LENGTH_MISMATCH); |
| @@ -2635,6 +2655,10 @@ ssl3_get_client_certificate(SSL *s) | |||
| 2635 | 2655 | ||
| 2636 | ret = 1; | 2656 | ret = 1; |
| 2637 | if (0) { | 2657 | if (0) { |
| 2658 | truncated: | ||
| 2659 | al = SSL_AD_DECODE_ERROR; | ||
| 2660 | SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, | ||
| 2661 | SSL_R_BAD_PACKET_LENGTH); | ||
| 2638 | f_err: | 2662 | f_err: |
| 2639 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 2663 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 2640 | } | 2664 | } |
