diff options
Diffstat (limited to 'src/lib/libssl/ssl_srvr.c')
| -rw-r--r-- | src/lib/libssl/ssl_srvr.c | 242 |
1 files changed, 40 insertions, 202 deletions
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c index 0496985351..b66a2c108d 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.130 2022/01/04 12:53:31 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_srvr.c,v 1.131 2022/01/07 15:46:30 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,23 +1309,23 @@ 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; | 1312 | int nid = NID_dhKeyAgreement; |
| 1313 | int al; | ||
| 1314 | 1313 | ||
| 1315 | if ((dh = DH_new()) == NULL) | 1314 | tls_key_share_free(S3I(s)->hs.key_share); |
| 1315 | if ((S3I(s)->hs.key_share = tls_key_share_new_nid(nid)) == NULL) | ||
| 1316 | goto err; | 1316 | goto err; |
| 1317 | 1317 | ||
| 1318 | if (s->cert->dh_tmp_auto != 0) { | 1318 | if (s->cert->dh_tmp_auto != 0) { |
| 1319 | size_t key_bits; | 1319 | size_t key_bits; |
| 1320 | 1320 | ||
| 1321 | if ((key_bits = ssl_dhe_params_auto_key_bits(s)) == 0) { | 1321 | if ((key_bits = ssl_dhe_params_auto_key_bits(s)) == 0) { |
| 1322 | al = SSL_AD_INTERNAL_ERROR; | ||
| 1323 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 1322 | SSLerror(s, ERR_R_INTERNAL_ERROR); |
| 1324 | goto fatal_err; | 1323 | ssl3_send_alert(s, SSL3_AL_FATAL, |
| 1325 | } | 1324 | SSL_AD_INTERNAL_ERROR); |
| 1326 | |||
| 1327 | if (!ssl_kex_generate_dhe_params_auto(dh, key_bits)) | ||
| 1328 | goto err; | 1325 | goto err; |
| 1326 | } | ||
| 1327 | tls_key_share_set_key_bits(S3I(s)->hs.key_share, | ||
| 1328 | key_bits); | ||
| 1329 | } else { | 1329 | } else { |
| 1330 | DH *dh_params = s->cert->dh_tmp; | 1330 | DH *dh_params = s->cert->dh_tmp; |
| 1331 | 1331 | ||
| @@ -1334,157 +1334,69 @@ ssl3_send_server_kex_dhe(SSL *s, CBB *cbb) | |||
| 1334 | SSL_C_PKEYLENGTH(S3I(s)->hs.cipher)); | 1334 | SSL_C_PKEYLENGTH(S3I(s)->hs.cipher)); |
| 1335 | 1335 | ||
| 1336 | if (dh_params == NULL) { | 1336 | if (dh_params == NULL) { |
| 1337 | al = SSL_AD_HANDSHAKE_FAILURE; | ||
| 1338 | SSLerror(s, SSL_R_MISSING_TMP_DH_KEY); | 1337 | SSLerror(s, SSL_R_MISSING_TMP_DH_KEY); |
| 1339 | goto fatal_err; | 1338 | ssl3_send_alert(s, SSL3_AL_FATAL, |
| 1339 | SSL_AD_HANDSHAKE_FAILURE); | ||
| 1340 | goto err; | ||
| 1340 | } | 1341 | } |
| 1341 | 1342 | ||
| 1342 | if (!ssl_kex_generate_dhe(dh, dh_params)) | 1343 | if (!tls_key_share_set_dh_params(S3I(s)->hs.key_share, dh_params)) |
| 1343 | goto err; | 1344 | goto err; |
| 1344 | } | 1345 | } |
| 1345 | 1346 | ||
| 1346 | if (!ssl_kex_params_dhe(dh, cbb)) | 1347 | if (!tls_key_share_generate(S3I(s)->hs.key_share)) |
| 1347 | goto err; | ||
| 1348 | if (!ssl_kex_public_dhe(dh, cbb)) | ||
| 1349 | goto err; | 1348 | goto err; |
| 1350 | 1349 | ||
| 1351 | if (S3I(s)->tmp.dh != NULL) { | 1350 | if (!tls_key_share_params(S3I(s)->hs.key_share, cbb)) |
| 1352 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 1351 | goto err; |
| 1352 | if (!tls_key_share_public(S3I(s)->hs.key_share, cbb)) | ||
| 1353 | goto err; | 1353 | goto err; |
| 1354 | } | ||
| 1355 | S3I(s)->tmp.dh = dh; | ||
| 1356 | 1354 | ||
| 1357 | return 1; | 1355 | return 1; |
| 1358 | 1356 | ||
| 1359 | fatal_err: | ||
| 1360 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | ||
| 1361 | err: | 1357 | err: |
| 1362 | DH_free(dh); | ||
| 1363 | |||
| 1364 | return 0; | 1358 | return 0; |
| 1365 | } | 1359 | } |
| 1366 | 1360 | ||
| 1367 | static int | 1361 | static int |
| 1368 | ssl3_send_server_kex_ecdhe_ecp(SSL *s, int nid, CBB *cbb) | 1362 | ssl3_send_server_kex_ecdhe(SSL *s, CBB *cbb) |
| 1369 | { | 1363 | { |
| 1370 | uint16_t curve_id; | 1364 | CBB public; |
| 1371 | EC_KEY *ecdh; | 1365 | int nid; |
| 1372 | CBB ecpoint; | ||
| 1373 | int al; | ||
| 1374 | 1366 | ||
| 1375 | /* | 1367 | if ((nid = tls1_get_shared_curve(s)) == NID_undef) { |
| 1376 | * Only named curves are supported in ECDH ephemeral key exchanges. | ||
| 1377 | * For supported named curves, curve_id is non-zero. | ||
| 1378 | */ | ||
| 1379 | if ((curve_id = tls1_ec_nid2curve_id(nid)) == 0) { | ||
| 1380 | SSLerror(s, SSL_R_UNSUPPORTED_ELLIPTIC_CURVE); | 1368 | SSLerror(s, SSL_R_UNSUPPORTED_ELLIPTIC_CURVE); |
| 1369 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); | ||
| 1381 | goto err; | 1370 | goto err; |
| 1382 | } | 1371 | } |
| 1383 | 1372 | ||
| 1384 | if (S3I(s)->tmp.ecdh != NULL) { | 1373 | tls_key_share_free(S3I(s)->hs.key_share); |
| 1385 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 1374 | if ((S3I(s)->hs.key_share = tls_key_share_new_nid(nid)) == NULL) |
| 1386 | goto err; | 1375 | goto err; |
| 1387 | } | ||
| 1388 | 1376 | ||
| 1389 | if ((S3I(s)->tmp.ecdh = EC_KEY_new()) == NULL) { | 1377 | if (!tls_key_share_generate(S3I(s)->hs.key_share)) |
| 1390 | al = SSL_AD_HANDSHAKE_FAILURE; | ||
| 1391 | SSLerror(s, SSL_R_MISSING_TMP_ECDH_KEY); | ||
| 1392 | goto fatal_err; | ||
| 1393 | } | ||
| 1394 | S3I(s)->tmp.ecdh_nid = nid; | ||
| 1395 | ecdh = S3I(s)->tmp.ecdh; | ||
| 1396 | |||
| 1397 | if (!ssl_kex_generate_ecdhe_ecp(ecdh, nid)) | ||
| 1398 | goto err; | 1378 | goto err; |
| 1399 | 1379 | ||
| 1400 | /* | 1380 | /* |
| 1401 | * Encode the public key. | 1381 | * ECC key exchange - see RFC 8422, section 5.4. |
| 1402 | * | ||
| 1403 | * Only named curves are supported in ECDH ephemeral key exchanges. | ||
| 1404 | * In this case the ServerKeyExchange message has: | ||
| 1405 | * [1 byte CurveType], [2 byte CurveName] | ||
| 1406 | * [1 byte length of encoded point], followed by | ||
| 1407 | * the actual encoded point itself. | ||
| 1408 | */ | 1382 | */ |
| 1409 | if (!CBB_add_u8(cbb, NAMED_CURVE_TYPE)) | 1383 | if (!CBB_add_u8(cbb, NAMED_CURVE_TYPE)) |
| 1410 | goto err; | 1384 | goto err; |
| 1411 | if (!CBB_add_u16(cbb, curve_id)) | 1385 | if (!CBB_add_u16(cbb, tls_key_share_group(S3I(s)->hs.key_share))) |
| 1412 | goto err; | 1386 | goto err; |
| 1413 | if (!CBB_add_u8_length_prefixed(cbb, &ecpoint)) | 1387 | if (!CBB_add_u8_length_prefixed(cbb, &public)) |
| 1414 | goto err; | 1388 | goto err; |
| 1415 | if (!ssl_kex_public_ecdhe_ecp(ecdh, &ecpoint)) | 1389 | if (!tls_key_share_public(S3I(s)->hs.key_share, &public)) |
| 1416 | goto err; | 1390 | goto err; |
| 1417 | if (!CBB_flush(cbb)) | 1391 | if (!CBB_flush(cbb)) |
| 1418 | goto err; | 1392 | goto err; |
| 1419 | 1393 | ||
| 1420 | return 1; | 1394 | return 1; |
| 1421 | 1395 | ||
| 1422 | fatal_err: | ||
| 1423 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | ||
| 1424 | err: | 1396 | err: |
| 1425 | return 0; | 1397 | return 0; |
| 1426 | } | 1398 | } |
| 1427 | 1399 | ||
| 1428 | static int | ||
| 1429 | ssl3_send_server_kex_ecdhe_ecx(SSL *s, int nid, CBB *cbb) | ||
| 1430 | { | ||
| 1431 | uint8_t *public_key = NULL, *private_key = NULL; | ||
| 1432 | uint16_t curve_id; | ||
| 1433 | CBB ecpoint; | ||
| 1434 | int ret = 0; | ||
| 1435 | |||
| 1436 | /* Generate an X25519 key pair. */ | ||
| 1437 | if (S3I(s)->tmp.x25519 != NULL) { | ||
| 1438 | SSLerror(s, ERR_R_INTERNAL_ERROR); | ||
| 1439 | goto err; | ||
| 1440 | } | ||
| 1441 | if ((private_key = malloc(X25519_KEY_LENGTH)) == NULL) | ||
| 1442 | goto err; | ||
| 1443 | if ((public_key = malloc(X25519_KEY_LENGTH)) == NULL) | ||
| 1444 | goto err; | ||
| 1445 | X25519_keypair(public_key, private_key); | ||
| 1446 | |||
| 1447 | /* Serialize public key. */ | ||
| 1448 | if ((curve_id = tls1_ec_nid2curve_id(nid)) == 0) { | ||
| 1449 | SSLerror(s, SSL_R_UNSUPPORTED_ELLIPTIC_CURVE); | ||
| 1450 | goto err; | ||
| 1451 | } | ||
| 1452 | |||
| 1453 | if (!CBB_add_u8(cbb, NAMED_CURVE_TYPE)) | ||
| 1454 | goto err; | ||
| 1455 | if (!CBB_add_u16(cbb, curve_id)) | ||
| 1456 | goto err; | ||
| 1457 | if (!CBB_add_u8_length_prefixed(cbb, &ecpoint)) | ||
| 1458 | goto err; | ||
| 1459 | if (!CBB_add_bytes(&ecpoint, public_key, X25519_KEY_LENGTH)) | ||
| 1460 | goto err; | ||
| 1461 | if (!CBB_flush(cbb)) | ||
| 1462 | goto err; | ||
| 1463 | |||
| 1464 | S3I(s)->tmp.x25519 = private_key; | ||
| 1465 | private_key = NULL; | ||
| 1466 | ret = 1; | ||
| 1467 | |||
| 1468 | err: | ||
| 1469 | free(public_key); | ||
| 1470 | freezero(private_key, X25519_KEY_LENGTH); | ||
| 1471 | |||
| 1472 | return ret; | ||
| 1473 | } | ||
| 1474 | |||
| 1475 | static int | ||
| 1476 | ssl3_send_server_kex_ecdhe(SSL *s, CBB *cbb) | ||
| 1477 | { | ||
| 1478 | int nid; | ||
| 1479 | |||
| 1480 | nid = tls1_get_shared_curve(s); | ||
| 1481 | |||
| 1482 | if (nid == NID_X25519) | ||
| 1483 | return ssl3_send_server_kex_ecdhe_ecx(s, nid, cbb); | ||
| 1484 | |||
| 1485 | return ssl3_send_server_kex_ecdhe_ecp(s, nid, cbb); | ||
| 1486 | } | ||
| 1487 | |||
| 1488 | int | 1400 | int |
| 1489 | ssl3_send_server_key_exchange(SSL *s) | 1401 | ssl3_send_server_key_exchange(SSL *s) |
| 1490 | { | 1402 | { |
| @@ -1791,148 +1703,74 @@ ssl3_get_client_kex_rsa(SSL *s, CBS *cbs) | |||
| 1791 | static int | 1703 | static int |
| 1792 | ssl3_get_client_kex_dhe(SSL *s, CBS *cbs) | 1704 | ssl3_get_client_kex_dhe(SSL *s, CBS *cbs) |
| 1793 | { | 1705 | { |
| 1794 | DH *dh_clnt = NULL; | ||
| 1795 | DH *dh_srvr; | ||
| 1796 | int invalid_key; | ||
| 1797 | uint8_t *key = NULL; | 1706 | uint8_t *key = NULL; |
| 1798 | size_t key_len = 0; | 1707 | size_t key_len = 0; |
| 1708 | int invalid_key; | ||
| 1799 | int ret = 0; | 1709 | int ret = 0; |
| 1800 | 1710 | ||
| 1801 | if ((dh_srvr = S3I(s)->tmp.dh) == NULL) { | 1711 | if (S3I(s)->hs.key_share == NULL) { |
| 1802 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); | 1712 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); |
| 1803 | SSLerror(s, SSL_R_MISSING_TMP_DH_KEY); | 1713 | SSLerror(s, SSL_R_MISSING_TMP_DH_KEY); |
| 1804 | goto err; | 1714 | goto err; |
| 1805 | } | 1715 | } |
| 1806 | 1716 | ||
| 1807 | if ((dh_clnt = DHparams_dup(dh_srvr)) == NULL) | 1717 | if (!tls_key_share_peer_public(S3I(s)->hs.key_share, cbs, |
| 1808 | goto err; | 1718 | &invalid_key)) |
| 1809 | |||
| 1810 | if (!ssl_kex_peer_public_dhe(dh_clnt, cbs, &invalid_key)) { | ||
| 1811 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | ||
| 1812 | SSLerror(s, SSL_R_BAD_PACKET_LENGTH); | ||
| 1813 | goto err; | 1719 | goto err; |
| 1814 | } | ||
| 1815 | if (invalid_key) { | 1720 | if (invalid_key) { |
| 1816 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER); | 1721 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER); |
| 1817 | SSLerror(s, SSL_R_BAD_DH_PUB_KEY_LENGTH); | 1722 | SSLerror(s, SSL_R_BAD_DH_PUB_KEY_LENGTH); |
| 1818 | goto err; | 1723 | goto err; |
| 1819 | } | 1724 | } |
| 1820 | 1725 | ||
| 1821 | if (!ssl_kex_derive_dhe(dh_srvr, dh_clnt, &key, &key_len)) | 1726 | if (!tls_key_share_derive(S3I(s)->hs.key_share, &key, &key_len)) |
| 1822 | goto err; | 1727 | goto err; |
| 1823 | 1728 | ||
| 1824 | if (!tls12_derive_master_secret(s, key, key_len)) | 1729 | if (!tls12_derive_master_secret(s, key, key_len)) |
| 1825 | goto err; | 1730 | goto err; |
| 1826 | 1731 | ||
| 1827 | DH_free(S3I(s)->tmp.dh); | ||
| 1828 | S3I(s)->tmp.dh = NULL; | ||
| 1829 | |||
| 1830 | ret = 1; | 1732 | ret = 1; |
| 1831 | 1733 | ||
| 1832 | err: | 1734 | err: |
| 1833 | freezero(key, key_len); | 1735 | freezero(key, key_len); |
| 1834 | DH_free(dh_clnt); | ||
| 1835 | 1736 | ||
| 1836 | return ret; | 1737 | return ret; |
| 1837 | } | 1738 | } |
| 1838 | 1739 | ||
| 1839 | static int | 1740 | static int |
| 1840 | ssl3_get_client_kex_ecdhe_ecp(SSL *s, CBS *cbs) | 1741 | ssl3_get_client_kex_ecdhe(SSL *s, CBS *cbs) |
| 1841 | { | 1742 | { |
| 1842 | uint8_t *key = NULL; | 1743 | uint8_t *key = NULL; |
| 1843 | size_t key_len = 0; | 1744 | size_t key_len = 0; |
| 1844 | EC_KEY *ecdh_peer = NULL; | ||
| 1845 | EC_KEY *ecdh; | ||
| 1846 | CBS public; | 1745 | CBS public; |
| 1847 | int ret = 0; | 1746 | int ret = 0; |
| 1848 | 1747 | ||
| 1849 | /* | 1748 | if (S3I(s)->hs.key_share == NULL) { |
| 1850 | * Use the ephemeral values we saved when generating the | 1749 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); |
| 1851 | * ServerKeyExchange message. | 1750 | SSLerror(s, SSL_R_MISSING_TMP_DH_KEY); |
| 1852 | */ | ||
| 1853 | if ((ecdh = S3I(s)->tmp.ecdh) == NULL) { | ||
| 1854 | SSLerror(s, ERR_R_INTERNAL_ERROR); | ||
| 1855 | goto err; | 1751 | goto err; |
| 1856 | } | 1752 | } |
| 1857 | 1753 | ||
| 1858 | /* | ||
| 1859 | * Get client's public key from encoded point in the ClientKeyExchange | ||
| 1860 | * message. | ||
| 1861 | */ | ||
| 1862 | if (!CBS_get_u8_length_prefixed(cbs, &public)) | 1754 | if (!CBS_get_u8_length_prefixed(cbs, &public)) |
| 1863 | goto err; | 1755 | goto err; |
| 1864 | if (CBS_len(cbs) != 0) | 1756 | if (!tls_key_share_peer_public(S3I(s)->hs.key_share, &public, NULL)) |
| 1865 | goto err; | 1757 | goto err; |
| 1866 | 1758 | ||
| 1867 | if ((ecdh_peer = EC_KEY_new()) == NULL) | 1759 | if (!tls_key_share_derive(S3I(s)->hs.key_share, &key, &key_len)) |
| 1868 | goto err; | 1760 | goto err; |
| 1869 | 1761 | ||
| 1870 | if (!ssl_kex_peer_public_ecdhe_ecp(ecdh_peer, S3I(s)->tmp.ecdh_nid, | ||
| 1871 | &public)) | ||
| 1872 | goto err; | ||
| 1873 | |||
| 1874 | /* Derive the shared secret and compute master secret. */ | ||
| 1875 | if (!ssl_kex_derive_ecdhe_ecp(ecdh, ecdh_peer, &key, &key_len)) | ||
| 1876 | goto err; | ||
| 1877 | if (!tls12_derive_master_secret(s, key, key_len)) | 1762 | if (!tls12_derive_master_secret(s, key, key_len)) |
| 1878 | goto err; | 1763 | goto err; |
| 1879 | 1764 | ||
| 1880 | EC_KEY_free(S3I(s)->tmp.ecdh); | ||
| 1881 | S3I(s)->tmp.ecdh = NULL; | ||
| 1882 | S3I(s)->tmp.ecdh_nid = NID_undef; | ||
| 1883 | |||
| 1884 | ret = 1; | 1765 | ret = 1; |
| 1885 | 1766 | ||
| 1886 | err: | 1767 | err: |
| 1887 | freezero(key, key_len); | 1768 | freezero(key, key_len); |
| 1888 | EC_KEY_free(ecdh_peer); | ||
| 1889 | 1769 | ||
| 1890 | return ret; | 1770 | return ret; |
| 1891 | } | 1771 | } |
| 1892 | 1772 | ||
| 1893 | static int | 1773 | static int |
| 1894 | ssl3_get_client_kex_ecdhe_ecx(SSL *s, CBS *cbs) | ||
| 1895 | { | ||
| 1896 | uint8_t *shared_key = NULL; | ||
| 1897 | CBS ecpoint; | ||
| 1898 | int ret = 0; | ||
| 1899 | |||
| 1900 | if (!CBS_get_u8_length_prefixed(cbs, &ecpoint)) | ||
| 1901 | goto err; | ||
| 1902 | if (CBS_len(cbs) != 0) | ||
| 1903 | goto err; | ||
| 1904 | if (CBS_len(&ecpoint) != X25519_KEY_LENGTH) | ||
| 1905 | goto err; | ||
| 1906 | |||
| 1907 | if ((shared_key = malloc(X25519_KEY_LENGTH)) == NULL) | ||
| 1908 | goto err; | ||
| 1909 | if (!X25519(shared_key, S3I(s)->tmp.x25519, CBS_data(&ecpoint))) | ||
| 1910 | goto err; | ||
| 1911 | |||
| 1912 | freezero(S3I(s)->tmp.x25519, X25519_KEY_LENGTH); | ||
| 1913 | S3I(s)->tmp.x25519 = NULL; | ||
| 1914 | |||
| 1915 | if (!tls12_derive_master_secret(s, shared_key, X25519_KEY_LENGTH)) | ||
| 1916 | goto err; | ||
| 1917 | |||
| 1918 | ret = 1; | ||
| 1919 | |||
| 1920 | err: | ||
| 1921 | freezero(shared_key, X25519_KEY_LENGTH); | ||
| 1922 | |||
| 1923 | return ret; | ||
| 1924 | } | ||
| 1925 | |||
| 1926 | static int | ||
| 1927 | ssl3_get_client_kex_ecdhe(SSL *s, CBS *cbs) | ||
| 1928 | { | ||
| 1929 | if (S3I(s)->tmp.x25519 != NULL) | ||
| 1930 | return ssl3_get_client_kex_ecdhe_ecx(s, cbs); | ||
| 1931 | |||
| 1932 | return ssl3_get_client_kex_ecdhe_ecp(s, cbs); | ||
| 1933 | } | ||
| 1934 | |||
| 1935 | static int | ||
| 1936 | ssl3_get_client_kex_gost(SSL *s, CBS *cbs) | 1774 | ssl3_get_client_kex_gost(SSL *s, CBS *cbs) |
| 1937 | { | 1775 | { |
| 1938 | EVP_PKEY_CTX *pkey_ctx; | 1776 | EVP_PKEY_CTX *pkey_ctx; |
