diff options
Diffstat (limited to 'src/lib/libssl/s3_clnt.c')
-rw-r--r-- | src/lib/libssl/s3_clnt.c | 85 |
1 files changed, 74 insertions, 11 deletions
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); |