diff options
Diffstat (limited to 'src/lib/libssl/ssl_srvr.c')
| -rw-r--r-- | src/lib/libssl/ssl_srvr.c | 133 |
1 files changed, 55 insertions, 78 deletions
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c index 0c217d6d3e..e9ea6b141c 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.126 2021/11/29 16:03:56 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_srvr.c,v 1.127 2021/12/04 14:03:22 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 | * |
| @@ -1309,43 +1309,38 @@ ssl3_send_server_done(SSL *s) | |||
| 1309 | static int | 1309 | static int |
| 1310 | ssl3_send_server_kex_dhe(SSL *s, CBB *cbb) | 1310 | ssl3_send_server_kex_dhe(SSL *s, CBB *cbb) |
| 1311 | { | 1311 | { |
| 1312 | DH *dh = NULL, *dhp; | 1312 | DH *dh = NULL; |
| 1313 | int al; | 1313 | int al; |
| 1314 | 1314 | ||
| 1315 | if ((dh = DH_new()) == NULL) | ||
| 1316 | goto err; | ||
| 1317 | |||
| 1315 | if (s->cert->dh_tmp_auto != 0) { | 1318 | if (s->cert->dh_tmp_auto != 0) { |
| 1316 | if ((dhp = ssl_get_auto_dh(s)) == NULL) { | 1319 | size_t key_bits; |
| 1320 | |||
| 1321 | if ((key_bits = ssl_dhe_params_auto_key_bits(s)) == 0) { | ||
| 1317 | al = SSL_AD_INTERNAL_ERROR; | 1322 | al = SSL_AD_INTERNAL_ERROR; |
| 1318 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 1323 | SSLerror(s, ERR_R_INTERNAL_ERROR); |
| 1319 | goto fatal_err; | 1324 | goto fatal_err; |
| 1320 | } | 1325 | } |
| 1321 | } else | ||
| 1322 | dhp = s->cert->dh_tmp; | ||
| 1323 | 1326 | ||
| 1324 | if (dhp == NULL && s->cert->dh_tmp_cb != NULL) | 1327 | if (!ssl_kex_generate_dhe_params_auto(dh, key_bits)) |
| 1325 | dhp = s->cert->dh_tmp_cb(s, 0, | 1328 | goto err; |
| 1326 | SSL_C_PKEYLENGTH(S3I(s)->hs.cipher)); | 1329 | } else { |
| 1330 | DH *dh_params = s->cert->dh_tmp; | ||
| 1327 | 1331 | ||
| 1328 | if (dhp == NULL) { | 1332 | if (dh_params == NULL && s->cert->dh_tmp_cb != NULL) |
| 1329 | al = SSL_AD_HANDSHAKE_FAILURE; | 1333 | dh_params = s->cert->dh_tmp_cb(s, 0, |
| 1330 | SSLerror(s, SSL_R_MISSING_TMP_DH_KEY); | 1334 | SSL_C_PKEYLENGTH(S3I(s)->hs.cipher)); |
| 1331 | goto fatal_err; | ||
| 1332 | } | ||
| 1333 | 1335 | ||
| 1334 | if (S3I(s)->tmp.dh != NULL) { | 1336 | if (dh_params == NULL) { |
| 1335 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 1337 | al = SSL_AD_HANDSHAKE_FAILURE; |
| 1336 | goto err; | 1338 | SSLerror(s, SSL_R_MISSING_TMP_DH_KEY); |
| 1337 | } | 1339 | goto fatal_err; |
| 1340 | } | ||
| 1338 | 1341 | ||
| 1339 | if (s->cert->dh_tmp_auto != 0) { | 1342 | if (!ssl_kex_generate_dhe(dh, dh_params)) |
| 1340 | dh = dhp; | 1343 | goto err; |
| 1341 | } else if ((dh = DHparams_dup(dhp)) == NULL) { | ||
| 1342 | SSLerror(s, ERR_R_DH_LIB); | ||
| 1343 | goto err; | ||
| 1344 | } | ||
| 1345 | S3I(s)->tmp.dh = dh; | ||
| 1346 | if (!DH_generate_key(dh)) { | ||
| 1347 | SSLerror(s, ERR_R_DH_LIB); | ||
| 1348 | goto err; | ||
| 1349 | } | 1344 | } |
| 1350 | 1345 | ||
| 1351 | if (!ssl_kex_params_dhe(dh, cbb)) | 1346 | if (!ssl_kex_params_dhe(dh, cbb)) |
| @@ -1353,12 +1348,20 @@ ssl3_send_server_kex_dhe(SSL *s, CBB *cbb) | |||
| 1353 | if (!ssl_kex_public_dhe(dh, cbb)) | 1348 | if (!ssl_kex_public_dhe(dh, cbb)) |
| 1354 | goto err; | 1349 | goto err; |
| 1355 | 1350 | ||
| 1356 | return (1); | 1351 | if (S3I(s)->tmp.dh != NULL) { |
| 1352 | SSLerror(s, ERR_R_INTERNAL_ERROR); | ||
| 1353 | goto err; | ||
| 1354 | } | ||
| 1355 | S3I(s)->tmp.dh = dh; | ||
| 1356 | |||
| 1357 | return 1; | ||
| 1357 | 1358 | ||
| 1358 | fatal_err: | 1359 | fatal_err: |
| 1359 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1360 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1360 | err: | 1361 | err: |
| 1361 | return (-1); | 1362 | DH_free(dh); |
| 1363 | |||
| 1364 | return -1; | ||
| 1362 | } | 1365 | } |
| 1363 | 1366 | ||
| 1364 | static int | 1367 | static int |
| @@ -1787,53 +1790,35 @@ ssl3_get_client_kex_rsa(SSL *s, CBS *cbs) | |||
| 1787 | static int | 1790 | static int |
| 1788 | ssl3_get_client_kex_dhe(SSL *s, CBS *cbs) | 1791 | ssl3_get_client_kex_dhe(SSL *s, CBS *cbs) |
| 1789 | { | 1792 | { |
| 1790 | int key_size = 0; | 1793 | DH *dh_clnt = NULL; |
| 1791 | int key_is_invalid, key_len, al; | 1794 | DH *dh_srvr; |
| 1792 | unsigned char *key = NULL; | 1795 | int invalid_key; |
| 1793 | BIGNUM *bn = NULL; | 1796 | uint8_t *key = NULL; |
| 1794 | CBS dh_Yc; | 1797 | size_t key_len = 0; |
| 1795 | DH *dh; | 1798 | int ret = -1; |
| 1796 | |||
| 1797 | if (!CBS_get_u16_length_prefixed(cbs, &dh_Yc)) | ||
| 1798 | goto decode_err; | ||
| 1799 | if (CBS_len(cbs) != 0) | ||
| 1800 | goto decode_err; | ||
| 1801 | 1799 | ||
| 1802 | if (S3I(s)->tmp.dh == NULL) { | 1800 | if ((dh_srvr = S3I(s)->tmp.dh) == NULL) { |
| 1803 | al = SSL_AD_HANDSHAKE_FAILURE; | 1801 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); |
| 1804 | SSLerror(s, SSL_R_MISSING_TMP_DH_KEY); | 1802 | SSLerror(s, SSL_R_MISSING_TMP_DH_KEY); |
| 1805 | goto fatal_err; | 1803 | goto err; |
| 1806 | } | 1804 | } |
| 1807 | dh = S3I(s)->tmp.dh; | ||
| 1808 | 1805 | ||
| 1809 | if ((bn = BN_bin2bn(CBS_data(&dh_Yc), CBS_len(&dh_Yc), NULL)) == NULL) { | 1806 | if ((dh_clnt = DHparams_dup(dh_srvr)) == NULL) |
| 1810 | SSLerror(s, SSL_R_BN_LIB); | ||
| 1811 | goto err; | 1807 | goto err; |
| 1812 | } | ||
| 1813 | 1808 | ||
| 1814 | if ((key_size = DH_size(dh)) <= 0) { | 1809 | if (!ssl_kex_peer_public_dhe(dh_clnt, cbs, &invalid_key)) { |
| 1815 | SSLerror(s, ERR_R_DH_LIB); | 1810 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); |
| 1811 | SSLerror(s, SSL_R_BAD_PACKET_LENGTH); | ||
| 1816 | goto err; | 1812 | goto err; |
| 1817 | } | 1813 | } |
| 1818 | if ((key = malloc(key_size)) == NULL) { | 1814 | if (invalid_key) { |
| 1819 | SSLerror(s, ERR_R_MALLOC_FAILURE); | 1815 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER); |
| 1816 | SSLerror(s, SSL_R_BAD_DH_PUB_KEY_LENGTH); | ||
| 1820 | goto err; | 1817 | goto err; |
| 1821 | } | 1818 | } |
| 1822 | if (!DH_check_pub_key(dh, bn, &key_is_invalid)) { | 1819 | |
| 1823 | al = SSL_AD_INTERNAL_ERROR; | 1820 | if (!ssl_kex_derive_dhe(dh_srvr, dh_clnt, &key, &key_len)) |
| 1824 | SSLerror(s, ERR_R_DH_LIB); | 1821 | goto err; |
| 1825 | goto fatal_err; | ||
| 1826 | } | ||
| 1827 | if (key_is_invalid) { | ||
| 1828 | al = SSL_AD_ILLEGAL_PARAMETER; | ||
| 1829 | SSLerror(s, ERR_R_DH_LIB); | ||
| 1830 | goto fatal_err; | ||
| 1831 | } | ||
| 1832 | if ((key_len = DH_compute_key(key, bn, dh)) <= 0) { | ||
| 1833 | al = SSL_AD_INTERNAL_ERROR; | ||
| 1834 | SSLerror(s, ERR_R_DH_LIB); | ||
| 1835 | goto fatal_err; | ||
| 1836 | } | ||
| 1837 | 1822 | ||
| 1838 | if (!tls12_derive_master_secret(s, key, key_len)) | 1823 | if (!tls12_derive_master_secret(s, key, key_len)) |
| 1839 | goto err; | 1824 | goto err; |
| @@ -1841,21 +1826,13 @@ ssl3_get_client_kex_dhe(SSL *s, CBS *cbs) | |||
| 1841 | DH_free(S3I(s)->tmp.dh); | 1826 | DH_free(S3I(s)->tmp.dh); |
| 1842 | S3I(s)->tmp.dh = NULL; | 1827 | S3I(s)->tmp.dh = NULL; |
| 1843 | 1828 | ||
| 1844 | freezero(key, key_size); | 1829 | ret = 1; |
| 1845 | BN_clear_free(bn); | ||
| 1846 | |||
| 1847 | return (1); | ||
| 1848 | 1830 | ||
| 1849 | decode_err: | ||
| 1850 | al = SSL_AD_DECODE_ERROR; | ||
| 1851 | SSLerror(s, SSL_R_BAD_PACKET_LENGTH); | ||
| 1852 | fatal_err: | ||
| 1853 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | ||
| 1854 | err: | 1831 | err: |
| 1855 | freezero(key, key_size); | 1832 | freezero(key, key_len); |
| 1856 | BN_clear_free(bn); | 1833 | DH_free(dh_clnt); |
| 1857 | 1834 | ||
| 1858 | return (-1); | 1835 | return ret; |
| 1859 | } | 1836 | } |
| 1860 | 1837 | ||
| 1861 | static int | 1838 | static int |
