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 | } |
