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.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c
index 262e09fe5e..2174e3a83d 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.59 2019/03/25 16:35:48 jsing Exp $ */ 1/* $OpenBSD: ssl_clnt.c,v 1.60 2019/03/25 17:21:18 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 *
@@ -1512,7 +1512,7 @@ ssl3_get_server_key_exchange(SSL *s)
1512 if (!CBS_get_u16(&cbs, &sigalg_value)) 1512 if (!CBS_get_u16(&cbs, &sigalg_value))
1513 goto truncated; 1513 goto truncated;
1514 if ((sigalg = ssl_sigalg(sigalg_value, tls12_sigalgs, 1514 if ((sigalg = ssl_sigalg(sigalg_value, tls12_sigalgs,
1515 tls12_sigalgs_len)) == NULL) { 1515 tls12_sigalgs_len)) == NULL) {
1516 SSLerror(s, SSL_R_UNKNOWN_DIGEST); 1516 SSLerror(s, SSL_R_UNKNOWN_DIGEST);
1517 al = SSL_AD_DECODE_ERROR; 1517 al = SSL_AD_DECODE_ERROR;
1518 goto f_err; 1518 goto f_err;
@@ -1522,7 +1522,7 @@ ssl3_get_server_key_exchange(SSL *s)
1522 al = SSL_AD_DECODE_ERROR; 1522 al = SSL_AD_DECODE_ERROR;
1523 goto f_err; 1523 goto f_err;
1524 } 1524 }
1525 if (!ssl_sigalg_pkey_ok(sigalg, pkey)) { 1525 if (!ssl_sigalg_pkey_ok(sigalg, pkey, 0)) {
1526 SSLerror(s, SSL_R_WRONG_SIGNATURE_TYPE); 1526 SSLerror(s, SSL_R_WRONG_SIGNATURE_TYPE);
1527 al = SSL_AD_DECODE_ERROR; 1527 al = SSL_AD_DECODE_ERROR;
1528 goto f_err; 1528 goto f_err;
@@ -1671,21 +1671,19 @@ ssl3_get_certificate_request(SSL *s)
1671 SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG); 1671 SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG);
1672 goto err; 1672 goto err;
1673 } 1673 }
1674
1675 /* Check we have enough room for signature algorithms and
1676 * following length value.
1677 */
1678 if (!CBS_get_u16_length_prefixed(&cert_request, &sigalgs)) { 1674 if (!CBS_get_u16_length_prefixed(&cert_request, &sigalgs)) {
1679 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); 1675 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1680 SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG); 1676 SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG);
1681 goto err; 1677 goto err;
1682 } 1678 }
1683 if (!tls1_process_sigalgs(s, &sigalgs, tls12_sigalgs, 1679 if (CBS_len(&sigalgs) % 2 != 0 || CBS_len(&sigalgs) > 64) {
1684 tls12_sigalgs_len)) {
1685 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); 1680 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1686 SSLerror(s, SSL_R_SIGNATURE_ALGORITHMS_ERROR); 1681 SSLerror(s, SSL_R_SIGNATURE_ALGORITHMS_ERROR);
1687 goto err; 1682 goto err;
1688 } 1683 }
1684 if (!CBS_stow(&sigalgs, &S3I(s)->hs.sigalgs,
1685 &S3I(s)->hs.sigalgs_len))
1686 goto err;
1689 } 1687 }
1690 1688
1691 /* get the CA RDNs */ 1689 /* get the CA RDNs */
@@ -2372,6 +2370,7 @@ err:
2372static int 2370static int
2373ssl3_send_client_verify_sigalgs(SSL *s, CBB *cert_verify) 2371ssl3_send_client_verify_sigalgs(SSL *s, CBB *cert_verify)
2374{ 2372{
2373 const struct ssl_sigalg *sigalg;
2375 CBB cbb_signature; 2374 CBB cbb_signature;
2376 EVP_PKEY_CTX *pctx = NULL; 2375 EVP_PKEY_CTX *pctx = NULL;
2377 EVP_PKEY *pkey; 2376 EVP_PKEY *pkey;
@@ -2387,10 +2386,17 @@ ssl3_send_client_verify_sigalgs(SSL *s, CBB *cert_verify)
2387 EVP_MD_CTX_init(&mctx); 2386 EVP_MD_CTX_init(&mctx);
2388 2387
2389 pkey = s->cert->key->privatekey; 2388 pkey = s->cert->key->privatekey;
2390 md = s->cert->key->sigalg->md(); 2389 if ((sigalg = ssl_sigalg_select(s, pkey)) == NULL) {
2390 SSLerror(s, SSL_R_SIGNATURE_ALGORITHMS_ERROR);
2391 goto err;
2392 }
2393 if ((md = sigalg->md()) == NULL) {
2394 SSLerror(s, SSL_R_UNKNOWN_DIGEST);
2395 goto err;
2396 }
2391 2397
2392 if (!tls1_transcript_data(s, &hdata, &hdatalen) || 2398 if (!tls1_transcript_data(s, &hdata, &hdatalen) ||
2393 !CBB_add_u16(cert_verify, s->cert->key->sigalg->value)) { 2399 !CBB_add_u16(cert_verify, sigalg->value)) {
2394 SSLerror(s, ERR_R_INTERNAL_ERROR); 2400 SSLerror(s, ERR_R_INTERNAL_ERROR);
2395 goto err; 2401 goto err;
2396 } 2402 }
@@ -2398,7 +2404,7 @@ ssl3_send_client_verify_sigalgs(SSL *s, CBB *cert_verify)
2398 SSLerror(s, ERR_R_EVP_LIB); 2404 SSLerror(s, ERR_R_EVP_LIB);
2399 goto err; 2405 goto err;
2400 } 2406 }
2401 if ((s->cert->key->sigalg->flags & SIGALG_FLAG_RSA_PSS) && 2407 if ((sigalg->flags & SIGALG_FLAG_RSA_PSS) &&
2402 (!EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) || 2408 (!EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) ||
2403 !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1))) { 2409 !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1))) {
2404 SSLerror(s, ERR_R_EVP_LIB); 2410 SSLerror(s, ERR_R_EVP_LIB);