diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libssl/s3_lib.c | 14 | ||||
-rw-r--r-- | src/lib/libssl/ssl_locl.h | 11 | ||||
-rw-r--r-- | src/lib/libssl/ssl_srvr.c | 242 | ||||
-rw-r--r-- | src/lib/libssl/tls13_server.c | 6 | ||||
-rw-r--r-- | src/lib/libssl/tls_internal.h | 6 | ||||
-rw-r--r-- | src/lib/libssl/tls_key_share.c | 69 |
6 files changed, 115 insertions, 233 deletions
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c index 54261c575a..899432e947 100644 --- a/src/lib/libssl/s3_lib.c +++ b/src/lib/libssl/s3_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: s3_lib.c,v 1.221 2022/01/06 18:23:56 jsing Exp $ */ | 1 | /* $OpenBSD: s3_lib.c,v 1.222 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 | * |
@@ -1565,10 +1565,6 @@ ssl3_free(SSL *s) | |||
1565 | ssl3_release_write_buffer(s); | 1565 | ssl3_release_write_buffer(s); |
1566 | freezero(S3I(s)->hs.sigalgs, S3I(s)->hs.sigalgs_len); | 1566 | freezero(S3I(s)->hs.sigalgs, S3I(s)->hs.sigalgs_len); |
1567 | 1567 | ||
1568 | DH_free(S3I(s)->tmp.dh); | ||
1569 | EC_KEY_free(S3I(s)->tmp.ecdh); | ||
1570 | freezero(S3I(s)->tmp.x25519, X25519_KEY_LENGTH); | ||
1571 | |||
1572 | tls_key_share_free(S3I(s)->hs.key_share); | 1568 | tls_key_share_free(S3I(s)->hs.key_share); |
1573 | 1569 | ||
1574 | tls13_secrets_destroy(S3I(s)->hs.tls13.secrets); | 1570 | tls13_secrets_destroy(S3I(s)->hs.tls13.secrets); |
@@ -1601,14 +1597,6 @@ ssl3_clear(SSL *s) | |||
1601 | sk_X509_pop_free(s->internal->verified_chain, X509_free); | 1597 | sk_X509_pop_free(s->internal->verified_chain, X509_free); |
1602 | s->internal->verified_chain = NULL; | 1598 | s->internal->verified_chain = NULL; |
1603 | 1599 | ||
1604 | DH_free(S3I(s)->tmp.dh); | ||
1605 | S3I(s)->tmp.dh = NULL; | ||
1606 | EC_KEY_free(S3I(s)->tmp.ecdh); | ||
1607 | S3I(s)->tmp.ecdh = NULL; | ||
1608 | S3I(s)->tmp.ecdh_nid = NID_undef; | ||
1609 | freezero(S3I(s)->tmp.x25519, X25519_KEY_LENGTH); | ||
1610 | S3I(s)->tmp.x25519 = NULL; | ||
1611 | |||
1612 | freezero(S3I(s)->hs.sigalgs, S3I(s)->hs.sigalgs_len); | 1600 | freezero(S3I(s)->hs.sigalgs, S3I(s)->hs.sigalgs_len); |
1613 | S3I(s)->hs.sigalgs = NULL; | 1601 | S3I(s)->hs.sigalgs = NULL; |
1614 | S3I(s)->hs.sigalgs_len = 0; | 1602 | S3I(s)->hs.sigalgs_len = 0; |
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index 83b40d2dd3..cc7b342247 100644 --- a/src/lib/libssl/ssl_locl.h +++ b/src/lib/libssl/ssl_locl.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_locl.h,v 1.374 2022/01/06 18:23:56 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_locl.h,v 1.375 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 | * |
@@ -1168,15 +1168,6 @@ typedef struct ssl3_state_internal_st { | |||
1168 | 1168 | ||
1169 | SSL_HANDSHAKE hs; | 1169 | SSL_HANDSHAKE hs; |
1170 | 1170 | ||
1171 | struct { | ||
1172 | DH *dh; | ||
1173 | |||
1174 | EC_KEY *ecdh; /* holds short lived ECDH key */ | ||
1175 | int ecdh_nid; | ||
1176 | |||
1177 | uint8_t *x25519; | ||
1178 | } tmp; | ||
1179 | |||
1180 | /* Connection binding to prevent renegotiation attacks */ | 1171 | /* Connection binding to prevent renegotiation attacks */ |
1181 | unsigned char previous_client_finished[EVP_MAX_MD_SIZE]; | 1172 | unsigned char previous_client_finished[EVP_MAX_MD_SIZE]; |
1182 | unsigned char previous_client_finished_len; | 1173 | unsigned char previous_client_finished_len; |
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; |
diff --git a/src/lib/libssl/tls13_server.c b/src/lib/libssl/tls13_server.c index 739ef06609..c32ae22779 100644 --- a/src/lib/libssl/tls13_server.c +++ b/src/lib/libssl/tls13_server.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_server.c,v 1.90 2022/01/05 17:10:02 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_server.c,v 1.91 2022/01/07 15:46:30 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org> |
4 | * Copyright (c) 2020 Bob Beck <beck@openbsd.org> | 4 | * Copyright (c) 2020 Bob Beck <beck@openbsd.org> |
@@ -360,8 +360,8 @@ tls13_server_engage_record_protection(struct tls13_ctx *ctx) | |||
360 | SSL *s = ctx->ssl; | 360 | SSL *s = ctx->ssl; |
361 | int ret = 0; | 361 | int ret = 0; |
362 | 362 | ||
363 | if (!tls_key_share_derive(ctx->hs->key_share, | 363 | if (!tls_key_share_derive(ctx->hs->key_share, &shared_key, |
364 | &shared_key, &shared_key_len)) | 364 | &shared_key_len)) |
365 | goto err; | 365 | goto err; |
366 | 366 | ||
367 | s->session->cipher = ctx->hs->cipher; | 367 | s->session->cipher = ctx->hs->cipher; |
diff --git a/src/lib/libssl/tls_internal.h b/src/lib/libssl/tls_internal.h index 7e2beadeac..f7f939215a 100644 --- a/src/lib/libssl/tls_internal.h +++ b/src/lib/libssl/tls_internal.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls_internal.h,v 1.3 2022/01/06 18:23:56 jsing Exp $ */ | 1 | /* $OpenBSD: tls_internal.h,v 1.4 2022/01/07 15:46:30 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018, 2019, 2021 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2018, 2019, 2021 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -18,6 +18,7 @@ | |||
18 | #ifndef HEADER_TLS_INTERNAL_H | 18 | #ifndef HEADER_TLS_INTERNAL_H |
19 | #define HEADER_TLS_INTERNAL_H | 19 | #define HEADER_TLS_INTERNAL_H |
20 | 20 | ||
21 | #include <openssl/dh.h> | ||
21 | #include <openssl/evp.h> | 22 | #include <openssl/evp.h> |
22 | 23 | ||
23 | #include "bytestring.h" | 24 | #include "bytestring.h" |
@@ -64,8 +65,11 @@ void tls_key_share_free(struct tls_key_share *ks); | |||
64 | 65 | ||
65 | uint16_t tls_key_share_group(struct tls_key_share *ks); | 66 | uint16_t tls_key_share_group(struct tls_key_share *ks); |
66 | int tls_key_share_nid(struct tls_key_share *ks); | 67 | int tls_key_share_nid(struct tls_key_share *ks); |
68 | void tls_key_share_set_key_bits(struct tls_key_share *ks, size_t key_bits); | ||
69 | int tls_key_share_set_dh_params(struct tls_key_share *ks, DH *dh_params); | ||
67 | int tls_key_share_peer_pkey(struct tls_key_share *ks, EVP_PKEY *pkey); | 70 | int tls_key_share_peer_pkey(struct tls_key_share *ks, EVP_PKEY *pkey); |
68 | int tls_key_share_generate(struct tls_key_share *ks); | 71 | int tls_key_share_generate(struct tls_key_share *ks); |
72 | int tls_key_share_params(struct tls_key_share *ks, CBB *cbb); | ||
69 | int tls_key_share_public(struct tls_key_share *ks, CBB *cbb); | 73 | int tls_key_share_public(struct tls_key_share *ks, CBB *cbb); |
70 | int tls_key_share_peer_params(struct tls_key_share *ks, CBS *cbs, | 74 | int tls_key_share_peer_params(struct tls_key_share *ks, CBS *cbs, |
71 | int *invalid_params); | 75 | int *invalid_params); |
diff --git a/src/lib/libssl/tls_key_share.c b/src/lib/libssl/tls_key_share.c index 6e390f4a24..eb30a0ea69 100644 --- a/src/lib/libssl/tls_key_share.c +++ b/src/lib/libssl/tls_key_share.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* $OpenBSD: tls_key_share.c,v 1.2 2022/01/06 18:23:56 jsing Exp $ */ | 1 | /* $OpenBSD: tls_key_share.c,v 1.3 2022/01/07 15:46:30 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2020, 2021 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
5 | * Permission to use, copy, modify, and distribute this software for any | 5 | * Permission to use, copy, modify, and distribute this software for any |
6 | * purpose with or without fee is hereby granted, provided that the above | 6 | * purpose with or without fee is hereby granted, provided that the above |
@@ -18,7 +18,9 @@ | |||
18 | #include <stdlib.h> | 18 | #include <stdlib.h> |
19 | 19 | ||
20 | #include <openssl/curve25519.h> | 20 | #include <openssl/curve25519.h> |
21 | #include <openssl/dh.h> | ||
21 | #include <openssl/ec.h> | 22 | #include <openssl/ec.h> |
23 | #include <openssl/evp.h> | ||
22 | 24 | ||
23 | #include "bytestring.h" | 25 | #include "bytestring.h" |
24 | #include "ssl_locl.h" | 26 | #include "ssl_locl.h" |
@@ -27,6 +29,7 @@ | |||
27 | struct tls_key_share { | 29 | struct tls_key_share { |
28 | int nid; | 30 | int nid; |
29 | uint16_t group_id; | 31 | uint16_t group_id; |
32 | size_t key_bits; | ||
30 | 33 | ||
31 | DH *dhe; | 34 | DH *dhe; |
32 | DH *dhe_peer; | 35 | DH *dhe_peer; |
@@ -108,6 +111,28 @@ tls_key_share_nid(struct tls_key_share *ks) | |||
108 | return ks->nid; | 111 | return ks->nid; |
109 | } | 112 | } |
110 | 113 | ||
114 | void | ||
115 | tls_key_share_set_key_bits(struct tls_key_share *ks, size_t key_bits) | ||
116 | { | ||
117 | ks->key_bits = key_bits; | ||
118 | } | ||
119 | |||
120 | int | ||
121 | tls_key_share_set_dh_params(struct tls_key_share *ks, DH *dh_params) | ||
122 | { | ||
123 | if (ks->nid != NID_dhKeyAgreement) | ||
124 | return 0; | ||
125 | if (ks->dhe != NULL || ks->dhe_peer != NULL) | ||
126 | return 0; | ||
127 | |||
128 | if ((ks->dhe = DHparams_dup(dh_params)) == NULL) | ||
129 | return 0; | ||
130 | if ((ks->dhe_peer = DHparams_dup(dh_params)) == NULL) | ||
131 | return 0; | ||
132 | |||
133 | return 1; | ||
134 | } | ||
135 | |||
111 | int | 136 | int |
112 | tls_key_share_peer_pkey(struct tls_key_share *ks, EVP_PKEY *pkey) | 137 | tls_key_share_peer_pkey(struct tls_key_share *ks, EVP_PKEY *pkey) |
113 | { | 138 | { |
@@ -126,10 +151,28 @@ tls_key_share_peer_pkey(struct tls_key_share *ks, EVP_PKEY *pkey) | |||
126 | static int | 151 | static int |
127 | tls_key_share_generate_dhe(struct tls_key_share *ks) | 152 | tls_key_share_generate_dhe(struct tls_key_share *ks) |
128 | { | 153 | { |
129 | if (ks->dhe == NULL) | 154 | /* |
155 | * If auto params are not being used then we must already have DH | ||
156 | * parameters set. | ||
157 | */ | ||
158 | if (ks->key_bits == 0) { | ||
159 | if (ks->dhe == NULL) | ||
160 | return 0; | ||
161 | |||
162 | return ssl_kex_generate_dhe(ks->dhe, ks->dhe); | ||
163 | } | ||
164 | |||
165 | if (ks->dhe != NULL || ks->dhe_peer != NULL) | ||
166 | return 0; | ||
167 | |||
168 | if ((ks->dhe = DH_new()) == NULL) | ||
169 | return 0; | ||
170 | if (!ssl_kex_generate_dhe_params_auto(ks->dhe, ks->key_bits)) | ||
171 | return 0; | ||
172 | if ((ks->dhe_peer = DHparams_dup(ks->dhe)) == NULL) | ||
130 | return 0; | 173 | return 0; |
131 | 174 | ||
132 | return ssl_kex_generate_dhe(ks->dhe, ks->dhe); | 175 | return 1; |
133 | } | 176 | } |
134 | 177 | ||
135 | static int | 178 | static int |
@@ -200,6 +243,24 @@ tls_key_share_generate(struct tls_key_share *ks) | |||
200 | } | 243 | } |
201 | 244 | ||
202 | static int | 245 | static int |
246 | tls_key_share_params_dhe(struct tls_key_share *ks, CBB *cbb) | ||
247 | { | ||
248 | if (ks->dhe == NULL) | ||
249 | return 0; | ||
250 | |||
251 | return ssl_kex_params_dhe(ks->dhe, cbb); | ||
252 | } | ||
253 | |||
254 | int | ||
255 | tls_key_share_params(struct tls_key_share *ks, CBB *cbb) | ||
256 | { | ||
257 | if (ks->nid == NID_dhKeyAgreement) | ||
258 | return tls_key_share_params_dhe(ks, cbb); | ||
259 | |||
260 | return 0; | ||
261 | } | ||
262 | |||
263 | static int | ||
203 | tls_key_share_public_dhe(struct tls_key_share *ks, CBB *cbb) | 264 | tls_key_share_public_dhe(struct tls_key_share *ks, CBB *cbb) |
204 | { | 265 | { |
205 | if (ks->dhe == NULL) | 266 | if (ks->dhe == NULL) |