summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libssl/ssl_clnt.c44
-rw-r--r--src/lib/libssl/ssl_srvr.c65
2 files changed, 62 insertions, 47 deletions
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c
index 2ab90b5c37..6aea590132 100644
--- a/src/lib/libssl/ssl_clnt.c
+++ b/src/lib/libssl/ssl_clnt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_clnt.c,v 1.159 2023/06/11 18:50:51 tb Exp $ */ 1/* $OpenBSD: ssl_clnt.c,v 1.160 2023/06/11 19:01:01 tb 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 *
@@ -1299,13 +1299,17 @@ ssl3_get_server_kex_ecdhe(SSL *s, CBS *cbs)
1299static int 1299static int
1300ssl3_get_server_key_exchange(SSL *s) 1300ssl3_get_server_key_exchange(SSL *s)
1301{ 1301{
1302 CBS cbs, signature; 1302 CBB cbb;
1303 CBS cbs, params, signature;
1303 EVP_MD_CTX *md_ctx; 1304 EVP_MD_CTX *md_ctx;
1304 const unsigned char *param; 1305 unsigned char *signed_params = NULL;
1305 size_t param_len; 1306 size_t signed_params_len;
1307 size_t params_len;
1306 long alg_k, alg_a; 1308 long alg_k, alg_a;
1307 int al, ret; 1309 int al, ret;
1308 1310
1311 memset(&cbb, 0, sizeof(cbb));
1312
1309 alg_k = s->s3->hs.cipher->algorithm_mkey; 1313 alg_k = s->s3->hs.cipher->algorithm_mkey;
1310 alg_a = s->s3->hs.cipher->algorithm_auth; 1314 alg_a = s->s3->hs.cipher->algorithm_auth;
1311 1315
@@ -1341,8 +1345,14 @@ ssl3_get_server_key_exchange(SSL *s)
1341 return (1); 1345 return (1);
1342 } 1346 }
1343 1347
1344 param = CBS_data(&cbs); 1348 if (!CBB_init(&cbb, 0))
1345 param_len = CBS_len(&cbs); 1349 goto err;
1350 if (!CBB_add_bytes(&cbb, s->s3->client_random, SSL3_RANDOM_SIZE))
1351 goto err;
1352 if (!CBB_add_bytes(&cbb, s->s3->server_random, SSL3_RANDOM_SIZE))
1353 goto err;
1354
1355 CBS_dup(&cbs, &params);
1346 1356
1347 if (alg_k & SSL_kDHE) { 1357 if (alg_k & SSL_kDHE) {
1348 if (!ssl3_get_server_kex_dhe(s, &cbs)) 1358 if (!ssl3_get_server_kex_dhe(s, &cbs))
@@ -1356,7 +1366,12 @@ ssl3_get_server_key_exchange(SSL *s)
1356 goto fatal_err; 1366 goto fatal_err;
1357 } 1367 }
1358 1368
1359 param_len -= CBS_len(&cbs); 1369 if ((params_len = CBS_offset(&cbs)) > CBS_len(&params))
1370 goto err;
1371 if (!CBB_add_bytes(&cbb, CBS_data(&params), params_len))
1372 goto err;
1373 if (!CBB_finish(&cbb, &signed_params, &signed_params_len))
1374 goto err;
1360 1375
1361 /* if it was signed, check the signature */ 1376 /* if it was signed, check the signature */
1362 if ((alg_a & SSL_aNULL) == 0) { 1377 if ((alg_a & SSL_aNULL) == 0) {
@@ -1400,21 +1415,13 @@ ssl3_get_server_key_exchange(SSL *s)
1400 if (!EVP_DigestVerifyInit(md_ctx, &pctx, sigalg->md(), 1415 if (!EVP_DigestVerifyInit(md_ctx, &pctx, sigalg->md(),
1401 NULL, pkey)) 1416 NULL, pkey))
1402 goto err; 1417 goto err;
1403 if (!EVP_DigestVerifyUpdate(md_ctx, s->s3->client_random,
1404 SSL3_RANDOM_SIZE))
1405 goto err;
1406 if ((sigalg->flags & SIGALG_FLAG_RSA_PSS) && 1418 if ((sigalg->flags & SIGALG_FLAG_RSA_PSS) &&
1407 (!EVP_PKEY_CTX_set_rsa_padding(pctx, 1419 (!EVP_PKEY_CTX_set_rsa_padding(pctx,
1408 RSA_PKCS1_PSS_PADDING) || 1420 RSA_PKCS1_PSS_PADDING) ||
1409 !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1))) 1421 !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1)))
1410 goto err; 1422 goto err;
1411 if (!EVP_DigestVerifyUpdate(md_ctx, s->s3->server_random, 1423 if (EVP_DigestVerify(md_ctx, CBS_data(&signature),
1412 SSL3_RANDOM_SIZE)) 1424 CBS_len(&signature), signed_params, signed_params_len) <= 0) {
1413 goto err;
1414 if (!EVP_DigestVerifyUpdate(md_ctx, param, param_len))
1415 goto err;
1416 if (EVP_DigestVerifyFinal(md_ctx, CBS_data(&signature),
1417 CBS_len(&signature)) <= 0) {
1418 al = SSL_AD_DECRYPT_ERROR; 1425 al = SSL_AD_DECRYPT_ERROR;
1419 SSLerror(s, SSL_R_BAD_SIGNATURE); 1426 SSLerror(s, SSL_R_BAD_SIGNATURE);
1420 goto fatal_err; 1427 goto fatal_err;
@@ -1428,6 +1435,7 @@ ssl3_get_server_key_exchange(SSL *s)
1428 } 1435 }
1429 1436
1430 EVP_MD_CTX_free(md_ctx); 1437 EVP_MD_CTX_free(md_ctx);
1438 free(signed_params);
1431 1439
1432 return (1); 1440 return (1);
1433 1441
@@ -1439,7 +1447,9 @@ ssl3_get_server_key_exchange(SSL *s)
1439 ssl3_send_alert(s, SSL3_AL_FATAL, al); 1447 ssl3_send_alert(s, SSL3_AL_FATAL, al);
1440 1448
1441 err: 1449 err:
1450 CBB_cleanup(&cbb);
1442 EVP_MD_CTX_free(md_ctx); 1451 EVP_MD_CTX_free(md_ctx);
1452 free(signed_params);
1443 1453
1444 return (-1); 1454 return (-1);
1445} 1455}
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c
index d0814a8455..8edbf77156 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.154 2023/06/11 18:50:51 tb Exp $ */ 1/* $OpenBSD: ssl_srvr.c,v 1.155 2023/06/11 19:01:01 tb 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 *
@@ -1431,12 +1431,13 @@ ssl3_send_server_kex_ecdhe(SSL *s, CBB *cbb)
1431static int 1431static int
1432ssl3_send_server_key_exchange(SSL *s) 1432ssl3_send_server_key_exchange(SSL *s)
1433{ 1433{
1434 CBB cbb, cbb_params, cbb_signature, server_kex; 1434 CBB cbb, cbb_signature, cbb_signed_params, server_kex;
1435 CBS params;
1435 const struct ssl_sigalg *sigalg = NULL; 1436 const struct ssl_sigalg *sigalg = NULL;
1437 unsigned char *signed_params = NULL;
1438 size_t signed_params_len;
1436 unsigned char *signature = NULL; 1439 unsigned char *signature = NULL;
1437 size_t signature_len = 0; 1440 size_t signature_len = 0;
1438 unsigned char *params = NULL;
1439 size_t params_len;
1440 const EVP_MD *md = NULL; 1441 const EVP_MD *md = NULL;
1441 unsigned long type; 1442 unsigned long type;
1442 EVP_MD_CTX *md_ctx = NULL; 1443 EVP_MD_CTX *md_ctx = NULL;
@@ -1445,7 +1446,7 @@ ssl3_send_server_key_exchange(SSL *s)
1445 int al; 1446 int al;
1446 1447
1447 memset(&cbb, 0, sizeof(cbb)); 1448 memset(&cbb, 0, sizeof(cbb));
1448 memset(&cbb_params, 0, sizeof(cbb_params)); 1449 memset(&cbb_signed_params, 0, sizeof(cbb_signed_params));
1449 1450
1450 if ((md_ctx = EVP_MD_CTX_new()) == NULL) 1451 if ((md_ctx = EVP_MD_CTX_new()) == NULL)
1451 goto err; 1452 goto err;
@@ -1456,15 +1457,26 @@ ssl3_send_server_key_exchange(SSL *s)
1456 SSL3_MT_SERVER_KEY_EXCHANGE)) 1457 SSL3_MT_SERVER_KEY_EXCHANGE))
1457 goto err; 1458 goto err;
1458 1459
1459 if (!CBB_init(&cbb_params, 0)) 1460 if (!CBB_init(&cbb_signed_params, 0))
1460 goto err; 1461 goto err;
1461 1462
1463 if (!CBB_add_bytes(&cbb_signed_params, s->s3->client_random,
1464 SSL3_RANDOM_SIZE)) {
1465 SSLerror(s, ERR_R_INTERNAL_ERROR);
1466 goto err;
1467 }
1468 if (!CBB_add_bytes(&cbb_signed_params, s->s3->server_random,
1469 SSL3_RANDOM_SIZE)) {
1470 SSLerror(s, ERR_R_INTERNAL_ERROR);
1471 goto err;
1472 }
1473
1462 type = s->s3->hs.cipher->algorithm_mkey; 1474 type = s->s3->hs.cipher->algorithm_mkey;
1463 if (type & SSL_kDHE) { 1475 if (type & SSL_kDHE) {
1464 if (!ssl3_send_server_kex_dhe(s, &cbb_params)) 1476 if (!ssl3_send_server_kex_dhe(s, &cbb_signed_params))
1465 goto err; 1477 goto err;
1466 } else if (type & SSL_kECDHE) { 1478 } else if (type & SSL_kECDHE) {
1467 if (!ssl3_send_server_kex_ecdhe(s, &cbb_params)) 1479 if (!ssl3_send_server_kex_ecdhe(s, &cbb_signed_params))
1468 goto err; 1480 goto err;
1469 } else { 1481 } else {
1470 al = SSL_AD_HANDSHAKE_FAILURE; 1482 al = SSL_AD_HANDSHAKE_FAILURE;
@@ -1472,10 +1484,16 @@ ssl3_send_server_key_exchange(SSL *s)
1472 goto fatal_err; 1484 goto fatal_err;
1473 } 1485 }
1474 1486
1475 if (!CBB_finish(&cbb_params, &params, &params_len)) 1487 if (!CBB_finish(&cbb_signed_params, &signed_params,
1488 &signed_params_len))
1489 goto err;
1490
1491 CBS_init(&params, signed_params, signed_params_len);
1492 if (!CBS_skip(&params, 2 * SSL3_RANDOM_SIZE))
1476 goto err; 1493 goto err;
1477 1494
1478 if (!CBB_add_bytes(&server_kex, params, params_len)) 1495 if (!CBB_add_bytes(&server_kex, CBS_data(&params),
1496 CBS_len(&params)))
1479 goto err; 1497 goto err;
1480 1498
1481 /* Add signature unless anonymous. */ 1499 /* Add signature unless anonymous. */
@@ -1507,22 +1525,8 @@ ssl3_send_server_key_exchange(SSL *s)
1507 SSLerror(s, ERR_R_EVP_LIB); 1525 SSLerror(s, ERR_R_EVP_LIB);
1508 goto err; 1526 goto err;
1509 } 1527 }
1510 if (!EVP_DigestSignUpdate(md_ctx, s->s3->client_random, 1528 if (!EVP_DigestSign(md_ctx, NULL, &signature_len,
1511 SSL3_RANDOM_SIZE)) { 1529 signed_params, signed_params_len)) {
1512 SSLerror(s, ERR_R_EVP_LIB);
1513 goto err;
1514 }
1515 if (!EVP_DigestSignUpdate(md_ctx, s->s3->server_random,
1516 SSL3_RANDOM_SIZE)) {
1517 SSLerror(s, ERR_R_EVP_LIB);
1518 goto err;
1519 }
1520 if (!EVP_DigestSignUpdate(md_ctx, params, params_len)) {
1521 SSLerror(s, ERR_R_EVP_LIB);
1522 goto err;
1523 }
1524 if (!EVP_DigestSignFinal(md_ctx, NULL, &signature_len) ||
1525 !signature_len) {
1526 SSLerror(s, ERR_R_EVP_LIB); 1530 SSLerror(s, ERR_R_EVP_LIB);
1527 goto err; 1531 goto err;
1528 } 1532 }
@@ -1530,7 +1534,8 @@ ssl3_send_server_key_exchange(SSL *s)
1530 SSLerror(s, ERR_R_MALLOC_FAILURE); 1534 SSLerror(s, ERR_R_MALLOC_FAILURE);
1531 goto err; 1535 goto err;
1532 } 1536 }
1533 if (!EVP_DigestSignFinal(md_ctx, signature, &signature_len)) { 1537 if (!EVP_DigestSign(md_ctx, signature, &signature_len,
1538 signed_params, signed_params_len)) {
1534 SSLerror(s, ERR_R_EVP_LIB); 1539 SSLerror(s, ERR_R_EVP_LIB);
1535 goto err; 1540 goto err;
1536 } 1541 }
@@ -1550,19 +1555,19 @@ ssl3_send_server_key_exchange(SSL *s)
1550 } 1555 }
1551 1556
1552 EVP_MD_CTX_free(md_ctx); 1557 EVP_MD_CTX_free(md_ctx);
1553 free(params);
1554 free(signature); 1558 free(signature);
1559 free(signed_params);
1555 1560
1556 return (ssl3_handshake_write(s)); 1561 return (ssl3_handshake_write(s));
1557 1562
1558 fatal_err: 1563 fatal_err:
1559 ssl3_send_alert(s, SSL3_AL_FATAL, al); 1564 ssl3_send_alert(s, SSL3_AL_FATAL, al);
1560 err: 1565 err:
1561 CBB_cleanup(&cbb_params); 1566 CBB_cleanup(&cbb_signed_params);
1562 CBB_cleanup(&cbb); 1567 CBB_cleanup(&cbb);
1563 EVP_MD_CTX_free(md_ctx); 1568 EVP_MD_CTX_free(md_ctx);
1564 free(params);
1565 free(signature); 1569 free(signature);
1570 free(signed_params);
1566 1571
1567 return (-1); 1572 return (-1);
1568} 1573}