summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_clnt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/ssl_clnt.c')
-rw-r--r--src/lib/libssl/ssl_clnt.c44
1 files changed, 27 insertions, 17 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}