diff options
Diffstat (limited to 'src/lib/libssl/ssl_clnt.c')
-rw-r--r-- | src/lib/libssl/ssl_clnt.c | 44 |
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) | |||
1299 | static int | 1299 | static int |
1300 | ssl3_get_server_key_exchange(SSL *s) | 1300 | ssl3_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, ¶ms); | ||
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(¶ms)) |
1370 | goto err; | ||
1371 | if (!CBB_add_bytes(&cbb, CBS_data(¶ms), 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 | } |