diff options
author | jsing <> | 2022-01-07 15:46:30 +0000 |
---|---|---|
committer | jsing <> | 2022-01-07 15:46:30 +0000 |
commit | 3f7702534a377e0a3b33a6681df0af8a57adbc57 (patch) | |
tree | 270b59705c9d4efa145c0649cce3fa41750939d9 /src/lib | |
parent | a42b07afac78ec75467b5a5ca9fcbbdaf9d093a4 (diff) | |
download | openbsd-3f7702534a377e0a3b33a6681df0af8a57adbc57.tar.gz openbsd-3f7702534a377e0a3b33a6681df0af8a57adbc57.tar.bz2 openbsd-3f7702534a377e0a3b33a6681df0af8a57adbc57.zip |
Convert legacy server to tls_key_share.
This requires a few more additions to the DHE key share code - we need to
be able to either set the DHE parameters or specify the number of key bits
for use with auto DHE parameters. Additionally, we need to be able to
serialise the DHE parameters to send to the client.
This removes the infamous 'tmp' struct from ssl3_state_internal_st.
ok inoguchi@ tb@
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) |