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 |