summaryrefslogtreecommitdiff
path: root/src/lib/libssl
diff options
context:
space:
mode:
authorjsing <>2026-05-31 14:34:44 +0000
committerjsing <>2026-05-31 14:34:44 +0000
commit220b0356be08906dac6ccaa9ba6cf9e0289b3435 (patch)
tree89953440f661f3c880d44b48db9a1e891f88879e /src/lib/libssl
parente10fcd3d372e2b1cc95379aa034431113c0aa7b4 (diff)
downloadopenbsd-220b0356be08906dac6ccaa9ba6cf9e0289b3435.tar.gz
openbsd-220b0356be08906dac6ccaa9ba6cf9e0289b3435.tar.bz2
openbsd-220b0356be08906dac6ccaa9ba6cf9e0289b3435.zip
Clean up signature algorithm handling.
Now that we no longer support TLSv1.0 and TLSv1.1, SSL_USE_SIGALGS() is always true - remove all of the code that handles the non-sigalgs path, along with SSL_USE_SIGALGS() and the related flags. Also remove SIGALG_RSA_PKCS1_MD5_SHA1 and references to it, since this is also now unused. ok kenjiro@ tb@
Diffstat (limited to 'src/lib/libssl')
-rw-r--r--src/lib/libssl/ssl_clnt.c140
-rw-r--r--src/lib/libssl/ssl_local.h15
-rw-r--r--src/lib/libssl/ssl_sigalgs.c19
-rw-r--r--src/lib/libssl/ssl_sigalgs.h5
-rw-r--r--src/lib/libssl/ssl_srvr.c148
5 files changed, 66 insertions, 261 deletions
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c
index 6ef81a1706..b59ffa0eff 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.171 2026/04/03 12:58:19 jsing Exp $ */ 1/* $OpenBSD: ssl_clnt.c,v 1.172 2026/05/31 14:34:44 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 *
@@ -1034,13 +1034,6 @@ ssl3_get_server_hello(SSL *s)
1034 if (!tls1_transcript_hash_init(s)) 1034 if (!tls1_transcript_hash_init(s))
1035 goto err; 1035 goto err;
1036 1036
1037 /*
1038 * Don't digest cached records if no sigalgs: we may need them for
1039 * client authentication.
1040 */
1041 if (!SSL_USE_SIGALGS(s))
1042 tls1_transcript_free(s);
1043
1044 if (!CBS_get_u8(&cbs, &compression_method)) 1037 if (!CBS_get_u8(&cbs, &compression_method))
1045 goto decode_err; 1038 goto decode_err;
1046 1039
@@ -1384,10 +1377,9 @@ ssl3_get_server_key_exchange(SSL *s)
1384 goto fatal_err; 1377 goto fatal_err;
1385 } 1378 }
1386 1379
1387 if (SSL_USE_SIGALGS(s)) { 1380 if (!CBS_get_u16(&cbs, &sigalg_value))
1388 if (!CBS_get_u16(&cbs, &sigalg_value)) 1381 goto decode_err;
1389 goto decode_err; 1382
1390 }
1391 if (!CBS_get_u16_length_prefixed(&cbs, &signature)) 1383 if (!CBS_get_u16_length_prefixed(&cbs, &signature))
1392 goto decode_err; 1384 goto decode_err;
1393 if (CBS_len(&signature) > EVP_PKEY_size(pkey)) { 1385 if (CBS_len(&signature) > EVP_PKEY_size(pkey)) {
@@ -1448,7 +1440,7 @@ ssl3_get_server_key_exchange(SSL *s)
1448static int 1440static int
1449ssl3_get_certificate_request(SSL *s) 1441ssl3_get_certificate_request(SSL *s)
1450{ 1442{
1451 CBS cert_request, cert_types, rdn_list; 1443 CBS cert_request, cert_types, rdn_list, sigalgs;
1452 X509_NAME *xn = NULL; 1444 X509_NAME *xn = NULL;
1453 const unsigned char *q; 1445 const unsigned char *q;
1454 STACK_OF(X509_NAME) *ca_sk = NULL; 1446 STACK_OF(X509_NAME) *ca_sk = NULL;
@@ -1497,27 +1489,23 @@ ssl3_get_certificate_request(SSL *s)
1497 if (!CBS_get_u8_length_prefixed(&cert_request, &cert_types)) 1489 if (!CBS_get_u8_length_prefixed(&cert_request, &cert_types))
1498 goto decode_err; 1490 goto decode_err;
1499 1491
1500 if (SSL_USE_SIGALGS(s)) { 1492 if (CBS_len(&cert_request) < 2) {
1501 CBS sigalgs; 1493 SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG);
1502 1494 goto err;
1503 if (CBS_len(&cert_request) < 2) { 1495 }
1504 SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG); 1496 if (!CBS_get_u16_length_prefixed(&cert_request, &sigalgs)) {
1505 goto err; 1497 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1506 } 1498 SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG);
1507 if (!CBS_get_u16_length_prefixed(&cert_request, &sigalgs)) { 1499 goto err;
1508 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1509 SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG);
1510 goto err;
1511 }
1512 if (CBS_len(&sigalgs) % 2 != 0 || CBS_len(&sigalgs) > 64) {
1513 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1514 SSLerror(s, SSL_R_SIGNATURE_ALGORITHMS_ERROR);
1515 goto err;
1516 }
1517 if (!CBS_stow(&sigalgs, &s->s3->hs.sigalgs,
1518 &s->s3->hs.sigalgs_len))
1519 goto err;
1520 } 1500 }
1501 if (CBS_len(&sigalgs) % 2 != 0 || CBS_len(&sigalgs) > 64) {
1502 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1503 SSLerror(s, SSL_R_SIGNATURE_ALGORITHMS_ERROR);
1504 goto err;
1505 }
1506 if (!CBS_stow(&sigalgs, &s->s3->hs.sigalgs,
1507 &s->s3->hs.sigalgs_len))
1508 goto err;
1521 1509
1522 /* get the CA RDNs */ 1510 /* get the CA RDNs */
1523 if (CBS_len(&cert_request) < 2) { 1511 if (CBS_len(&cert_request) < 2) {
@@ -2035,77 +2023,6 @@ ssl3_send_client_verify_sigalgs(SSL *s, EVP_PKEY *pkey,
2035} 2023}
2036 2024
2037static int 2025static int
2038ssl3_send_client_verify_rsa(SSL *s, EVP_PKEY *pkey, CBB *cert_verify)
2039{
2040 CBB cbb_signature;
2041 RSA *rsa;
2042 unsigned char data[EVP_MAX_MD_SIZE];
2043 unsigned char *signature = NULL;
2044 unsigned int signature_len;
2045 size_t data_len;
2046 int ret = 0;
2047
2048 if (!tls1_transcript_hash_value(s, data, sizeof(data), &data_len))
2049 goto err;
2050 if ((signature = calloc(1, EVP_PKEY_size(pkey))) == NULL)
2051 goto err;
2052 if ((rsa = EVP_PKEY_get0_RSA(pkey)) == NULL)
2053 goto err;
2054 if (RSA_sign(NID_md5_sha1, data, data_len, signature, &signature_len,
2055 rsa) <= 0 ) {
2056 SSLerror(s, ERR_R_RSA_LIB);
2057 goto err;
2058 }
2059
2060 if (!CBB_add_u16_length_prefixed(cert_verify, &cbb_signature))
2061 goto err;
2062 if (!CBB_add_bytes(&cbb_signature, signature, signature_len))
2063 goto err;
2064 if (!CBB_flush(cert_verify))
2065 goto err;
2066
2067 ret = 1;
2068 err:
2069 free(signature);
2070 return ret;
2071}
2072
2073static int
2074ssl3_send_client_verify_ec(SSL *s, EVP_PKEY *pkey, CBB *cert_verify)
2075{
2076 CBB cbb_signature;
2077 EC_KEY *eckey;
2078 unsigned char data[EVP_MAX_MD_SIZE];
2079 unsigned char *signature = NULL;
2080 unsigned int signature_len;
2081 int ret = 0;
2082
2083 if (!tls1_transcript_hash_value(s, data, sizeof(data), NULL))
2084 goto err;
2085 if ((signature = calloc(1, EVP_PKEY_size(pkey))) == NULL)
2086 goto err;
2087 if ((eckey = EVP_PKEY_get0_EC_KEY(pkey)) == NULL)
2088 goto err;
2089 if (!ECDSA_sign(0, &data[MD5_DIGEST_LENGTH], SHA_DIGEST_LENGTH,
2090 signature, &signature_len, eckey)) {
2091 SSLerror(s, ERR_R_ECDSA_LIB);
2092 goto err;
2093 }
2094
2095 if (!CBB_add_u16_length_prefixed(cert_verify, &cbb_signature))
2096 goto err;
2097 if (!CBB_add_bytes(&cbb_signature, signature, signature_len))
2098 goto err;
2099 if (!CBB_flush(cert_verify))
2100 goto err;
2101
2102 ret = 1;
2103 err:
2104 free(signature);
2105 return ret;
2106}
2107
2108static int
2109ssl3_send_client_verify(SSL *s) 2026ssl3_send_client_verify(SSL *s)
2110{ 2027{
2111 const struct ssl_sigalg *sigalg; 2028 const struct ssl_sigalg *sigalg;
@@ -2130,20 +2047,9 @@ ssl3_send_client_verify(SSL *s)
2130 * For TLS v1.2 send signature algorithm and signature using 2047 * For TLS v1.2 send signature algorithm and signature using
2131 * agreed digest and cached handshake records. 2048 * agreed digest and cached handshake records.
2132 */ 2049 */
2133 if (SSL_USE_SIGALGS(s)) { 2050 if (!ssl3_send_client_verify_sigalgs(s, pkey, sigalg,
2134 if (!ssl3_send_client_verify_sigalgs(s, pkey, sigalg, 2051 &cert_verify))
2135 &cert_verify))
2136 goto err;
2137 } else if (EVP_PKEY_id(pkey) == EVP_PKEY_RSA) {
2138 if (!ssl3_send_client_verify_rsa(s, pkey, &cert_verify))
2139 goto err;
2140 } else if (EVP_PKEY_id(pkey) == EVP_PKEY_EC) {
2141 if (!ssl3_send_client_verify_ec(s, pkey, &cert_verify))
2142 goto err;
2143 } else {
2144 SSLerror(s, ERR_R_INTERNAL_ERROR);
2145 goto err; 2052 goto err;
2146 }
2147 2053
2148 tls1_transcript_free(s); 2054 tls1_transcript_free(s);
2149 2055
diff --git a/src/lib/libssl/ssl_local.h b/src/lib/libssl/ssl_local.h
index ec8a52d703..df4c0dc357 100644
--- a/src/lib/libssl/ssl_local.h
+++ b/src/lib/libssl/ssl_local.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_local.h,v 1.38 2026/05/25 09:09:34 jsing Exp $ */ 1/* $OpenBSD: ssl_local.h,v 1.39 2026/05/31 14:34:44 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 *
@@ -263,10 +263,6 @@ __BEGIN_HIDDEN_DECLS
263 */ 263 */
264#define SSL_C_PKEYLENGTH(c) 1024 264#define SSL_C_PKEYLENGTH(c) 1024
265 265
266/* See if we use signature algorithms extension. */
267#define SSL_USE_SIGALGS(s) \
268 (s->method->enc_flags & SSL_ENC_FLAG_SIGALGS)
269
270/* Allow TLS 1.2 ciphersuites: applies to DTLS 1.2 as well as TLS 1.2. */ 266/* Allow TLS 1.2 ciphersuites: applies to DTLS 1.2 as well as TLS 1.2. */
271#define SSL_USE_TLS1_2_CIPHERS(s) \ 267#define SSL_USE_TLS1_2_CIPHERS(s) \
272 (s->method->enc_flags & SSL_ENC_FLAG_TLS1_2_CIPHERS) 268 (s->method->enc_flags & SSL_ENC_FLAG_TLS1_2_CIPHERS)
@@ -1163,9 +1159,6 @@ typedef struct ssl3_state_st {
1163 * Flag values for enc_flags. 1159 * Flag values for enc_flags.
1164 */ 1160 */
1165 1161
1166/* Uses signature algorithms extension. */
1167#define SSL_ENC_FLAG_SIGALGS (1 << 1)
1168
1169/* Allow TLS 1.2 ciphersuites: applies to DTLS 1.2 as well as TLS 1.2. */ 1162/* Allow TLS 1.2 ciphersuites: applies to DTLS 1.2 as well as TLS 1.2. */
1170#define SSL_ENC_FLAG_TLS1_2_CIPHERS (1 << 4) 1163#define SSL_ENC_FLAG_TLS1_2_CIPHERS (1 << 4)
1171 1164
@@ -1174,10 +1167,8 @@ typedef struct ssl3_state_st {
1174 1167
1175#define TLSV1_ENC_FLAGS 0 1168#define TLSV1_ENC_FLAGS 0
1176#define TLSV1_1_ENC_FLAGS 0 1169#define TLSV1_1_ENC_FLAGS 0
1177#define TLSV1_2_ENC_FLAGS (SSL_ENC_FLAG_SIGALGS | \ 1170#define TLSV1_2_ENC_FLAGS SSL_ENC_FLAG_TLS1_2_CIPHERS
1178 SSL_ENC_FLAG_TLS1_2_CIPHERS) 1171#define TLSV1_3_ENC_FLAGS SSL_ENC_FLAG_TLS1_3_CIPHERS
1179#define TLSV1_3_ENC_FLAGS (SSL_ENC_FLAG_SIGALGS | \
1180 SSL_ENC_FLAG_TLS1_3_CIPHERS)
1181 1172
1182extern const SSL_CIPHER ssl3_ciphers[]; 1173extern const SSL_CIPHER ssl3_ciphers[];
1183 1174
diff --git a/src/lib/libssl/ssl_sigalgs.c b/src/lib/libssl/ssl_sigalgs.c
index ee4088f6ab..779d47985a 100644
--- a/src/lib/libssl/ssl_sigalgs.c
+++ b/src/lib/libssl/ssl_sigalgs.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_sigalgs.c,v 1.53 2026/03/30 06:20:08 tb Exp $ */ 1/* $OpenBSD: ssl_sigalgs.c,v 1.54 2026/05/31 14:34:44 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018-2020 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2018-2020 Bob Beck <beck@openbsd.org>
4 * Copyright (c) 2021 Joel Sing <jsing@openbsd.org> 4 * Copyright (c) 2021 Joel Sing <jsing@openbsd.org>
@@ -134,12 +134,6 @@ const struct ssl_sigalg sigalgs[] = {
134 .security_level = 1, 134 .security_level = 1,
135 }, 135 },
136 { 136 {
137 .value = SIGALG_RSA_PKCS1_MD5_SHA1,
138 .key_type = EVP_PKEY_RSA,
139 .md = EVP_md5_sha1,
140 .security_level = 1,
141 },
142 {
143 .value = SIGALG_NONE, 137 .value = SIGALG_NONE,
144 }, 138 },
145}; 139};
@@ -237,9 +231,6 @@ ssl_sigalgs_build(uint16_t tls_version, CBB *cbb, int security_level)
237 231
238 /* Add values in order as long as they are supported. */ 232 /* Add values in order as long as they are supported. */
239 for (i = 0; i < len; i++) { 233 for (i = 0; i < len; i++) {
240 /* Do not allow the legacy value for < 1.2 to be used. */
241 if (values[i] == SIGALG_RSA_PKCS1_MD5_SHA1)
242 return 0;
243 if ((sigalg = ssl_sigalg_lookup(values[i])) == NULL) 234 if ((sigalg = ssl_sigalg_lookup(values[i])) == NULL)
244 return 0; 235 return 0;
245 if (sigalg->security_level < security_level) 236 if (sigalg->security_level < security_level)
@@ -262,8 +253,6 @@ ssl_sigalg_for_legacy(SSL *s, EVP_PKEY *pkey)
262 /* Default signature algorithms used for TLSv1.2 and earlier. */ 253 /* Default signature algorithms used for TLSv1.2 and earlier. */
263 switch (EVP_PKEY_id(pkey)) { 254 switch (EVP_PKEY_id(pkey)) {
264 case EVP_PKEY_RSA: 255 case EVP_PKEY_RSA:
265 if (s->s3->hs.negotiated_tls_version < TLS1_2_VERSION)
266 return ssl_sigalg_lookup(SIGALG_RSA_PKCS1_MD5_SHA1);
267 return ssl_sigalg_lookup(SIGALG_RSA_PKCS1_SHA1); 256 return ssl_sigalg_lookup(SIGALG_RSA_PKCS1_SHA1);
268 case EVP_PKEY_EC: 257 case EVP_PKEY_EC:
269 return ssl_sigalg_lookup(SIGALG_ECDSA_SHA1); 258 return ssl_sigalg_lookup(SIGALG_ECDSA_SHA1);
@@ -317,9 +306,6 @@ ssl_sigalg_select(SSL *s, EVP_PKEY *pkey)
317{ 306{
318 CBS cbs; 307 CBS cbs;
319 308
320 if (!SSL_USE_SIGALGS(s))
321 return ssl_sigalg_for_legacy(s, pkey);
322
323 /* 309 /*
324 * RFC 5246 allows a TLS 1.2 client to send no sigalgs extension, 310 * RFC 5246 allows a TLS 1.2 client to send no sigalgs extension,
325 * in which case the server must use the default. 311 * in which case the server must use the default.
@@ -353,9 +339,6 @@ ssl_sigalg_for_peer(SSL *s, EVP_PKEY *pkey, uint16_t sigalg_value)
353{ 339{
354 const struct ssl_sigalg *sigalg; 340 const struct ssl_sigalg *sigalg;
355 341
356 if (!SSL_USE_SIGALGS(s))
357 return ssl_sigalg_for_legacy(s, pkey);
358
359 if ((sigalg = ssl_sigalg_from_value(s, sigalg_value)) == NULL) { 342 if ((sigalg = ssl_sigalg_from_value(s, sigalg_value)) == NULL) {
360 SSLerror(s, SSL_R_UNKNOWN_DIGEST); 343 SSLerror(s, SSL_R_UNKNOWN_DIGEST);
361 return NULL; 344 return NULL;
diff --git a/src/lib/libssl/ssl_sigalgs.h b/src/lib/libssl/ssl_sigalgs.h
index 5211ec6b62..775842a093 100644
--- a/src/lib/libssl/ssl_sigalgs.h
+++ b/src/lib/libssl/ssl_sigalgs.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_sigalgs.h,v 1.27 2024/02/03 15:58:34 beck Exp $ */ 1/* $OpenBSD: ssl_sigalgs.h,v 1.28 2026/05/31 14:34:44 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018-2019 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2018-2019 Bob Beck <beck@openbsd.org>
4 * 4 *
@@ -47,9 +47,6 @@ __BEGIN_HIDDEN_DECLS
47#define SIGALG_PRIVATE_START 0xFE00 47#define SIGALG_PRIVATE_START 0xFE00
48#define SIGALG_PRIVATE_END 0xFFFF 48#define SIGALG_PRIVATE_END 0xFFFF
49 49
50/* Legacy sigalg for < TLSv1.2 same value as BoringSSL uses. */
51#define SIGALG_RSA_PKCS1_MD5_SHA1 0xFF01
52
53#define SIGALG_FLAG_RSA_PSS 0x00000001 50#define SIGALG_FLAG_RSA_PSS 0x00000001
54 51
55struct ssl_sigalg { 52struct ssl_sigalg {
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c
index af4b20f6ce..f9c4ef918a 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.168 2026/04/03 12:58:19 jsing Exp $ */ 1/* $OpenBSD: ssl_srvr.c,v 1.169 2026/05/31 14:34:44 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 *
@@ -568,33 +568,14 @@ ssl3_accept(SSL *s)
568 } 568 }
569 569
570 alg_k = s->s3->hs.cipher->algorithm_mkey; 570 alg_k = s->s3->hs.cipher->algorithm_mkey;
571 if (SSL_USE_SIGALGS(s)) { 571 s->s3->hs.state = SSL3_ST_SR_CERT_VRFY_A;
572 s->s3->hs.state = SSL3_ST_SR_CERT_VRFY_A; 572 s->init_num = 0;
573 s->init_num = 0; 573 if (s->session->peer_cert != NULL) {
574 if (!s->session->peer_cert)
575 break;
576 /* 574 /*
577 * Freeze the transcript for use during client 575 * Freeze the transcript for use during client
578 * certificate verification. 576 * certificate verification.
579 */ 577 */
580 tls1_transcript_freeze(s); 578 tls1_transcript_freeze(s);
581 } else {
582 s->s3->hs.state = SSL3_ST_SR_CERT_VRFY_A;
583 s->init_num = 0;
584
585 tls1_transcript_free(s);
586
587 /*
588 * We need to get hashes here so if there is
589 * a client cert, it can be verified.
590 */
591 if (!tls1_transcript_hash_value(s,
592 s->s3->hs.tls12.cert_verify,
593 sizeof(s->s3->hs.tls12.cert_verify),
594 NULL)) {
595 ret = -1;
596 goto end;
597 }
598 } 579 }
599 break; 580 break;
600 581
@@ -1142,7 +1123,7 @@ ssl3_get_client_hello(SSL *s)
1142 if (!tls1_transcript_hash_init(s)) 1123 if (!tls1_transcript_hash_init(s))
1143 goto err; 1124 goto err;
1144 1125
1145 if (!SSL_USE_SIGALGS(s) || !(s->verify_mode & SSL_VERIFY_PEER)) 1126 if (!(s->verify_mode & SSL_VERIFY_PEER))
1146 tls1_transcript_free(s); 1127 tls1_transcript_free(s);
1147 1128
1148 /* 1129 /*
@@ -1501,12 +1482,10 @@ ssl3_send_server_key_exchange(SSL *s)
1501 s->s3->hs.our_sigalg = sigalg; 1482 s->s3->hs.our_sigalg = sigalg;
1502 1483
1503 /* Send signature algorithm. */ 1484 /* Send signature algorithm. */
1504 if (SSL_USE_SIGALGS(s)) { 1485 if (!CBB_add_u16(&server_kex, sigalg->value)) {
1505 if (!CBB_add_u16(&server_kex, sigalg->value)) { 1486 al = SSL_AD_INTERNAL_ERROR;
1506 al = SSL_AD_INTERNAL_ERROR; 1487 SSLerror(s, ERR_R_INTERNAL_ERROR);
1507 SSLerror(s, ERR_R_INTERNAL_ERROR); 1488 goto fatal_err;
1508 goto fatal_err;
1509 }
1510 } 1489 }
1511 1490
1512 if (!EVP_DigestSignInit(md_ctx, &pctx, md, NULL, pkey)) { 1491 if (!EVP_DigestSignInit(md_ctx, &pctx, md, NULL, pkey)) {
@@ -1591,14 +1570,11 @@ ssl3_send_certificate_request(SSL *s)
1591 if (!ssl3_get_req_cert_types(s, &cert_types)) 1570 if (!ssl3_get_req_cert_types(s, &cert_types))
1592 goto err; 1571 goto err;
1593 1572
1594 if (SSL_USE_SIGALGS(s)) { 1573 if (!CBB_add_u16_length_prefixed(&cert_request, &sigalgs))
1595 if (!CBB_add_u16_length_prefixed(&cert_request, 1574 goto err;
1596 &sigalgs)) 1575 if (!ssl_sigalgs_build(s->s3->hs.negotiated_tls_version,
1597 goto err; 1576 &sigalgs, SSL_get_security_level(s)))
1598 if (!ssl_sigalgs_build(s->s3->hs.negotiated_tls_version, 1577 goto err;
1599 &sigalgs, SSL_get_security_level(s)))
1600 goto err;
1601 }
1602 1578
1603 if (!CBB_add_u16_length_prefixed(&cert_request, &cert_auth)) 1579 if (!CBB_add_u16_length_prefixed(&cert_request, &cert_auth))
1604 goto err; 1580 goto err;
@@ -1879,7 +1855,8 @@ ssl3_get_cert_verify(SSL *s)
1879 EVP_PKEY *pkey; 1855 EVP_PKEY *pkey;
1880 X509 *peer_cert = NULL; 1856 X509 *peer_cert = NULL;
1881 EVP_MD_CTX *mctx = NULL; 1857 EVP_MD_CTX *mctx = NULL;
1882 int al, verify; 1858 EVP_PKEY_CTX *pctx;
1859 int al;
1883 const unsigned char *hdata; 1860 const unsigned char *hdata;
1884 size_t hdatalen; 1861 size_t hdatalen;
1885 int type = 0; 1862 int type = 0;
@@ -1932,10 +1909,9 @@ ssl3_get_cert_verify(SSL *s)
1932 goto fatal_err; 1909 goto fatal_err;
1933 } 1910 }
1934 1911
1935 if (SSL_USE_SIGALGS(s)) { 1912 if (!CBS_get_u16(&cbs, &sigalg_value))
1936 if (!CBS_get_u16(&cbs, &sigalg_value)) 1913 goto decode_err;
1937 goto decode_err; 1914
1938 }
1939 if (!CBS_get_u16_length_prefixed(&cbs, &signature)) 1915 if (!CBS_get_u16_length_prefixed(&cbs, &signature))
1940 goto err; 1916 goto err;
1941 if (CBS_len(&cbs) != 0) { 1917 if (CBS_len(&cbs) != 0) {
@@ -1957,74 +1933,26 @@ ssl3_get_cert_verify(SSL *s)
1957 } 1933 }
1958 s->s3->hs.peer_sigalg = sigalg; 1934 s->s3->hs.peer_sigalg = sigalg;
1959 1935
1960 if (SSL_USE_SIGALGS(s)) { 1936 if (!tls1_transcript_data(s, &hdata, &hdatalen)) {
1961 EVP_PKEY_CTX *pctx;
1962
1963 if (!tls1_transcript_data(s, &hdata, &hdatalen)) {
1964 SSLerror(s, ERR_R_INTERNAL_ERROR);
1965 al = SSL_AD_INTERNAL_ERROR;
1966 goto fatal_err;
1967 }
1968 if (!EVP_DigestVerifyInit(mctx, &pctx, sigalg->md(),
1969 NULL, pkey)) {
1970 SSLerror(s, ERR_R_EVP_LIB);
1971 al = SSL_AD_INTERNAL_ERROR;
1972 goto fatal_err;
1973 }
1974 if ((sigalg->flags & SIGALG_FLAG_RSA_PSS) &&
1975 (!EVP_PKEY_CTX_set_rsa_padding(pctx,
1976 RSA_PKCS1_PSS_PADDING) ||
1977 !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1))) {
1978 al = SSL_AD_INTERNAL_ERROR;
1979 goto fatal_err;
1980 }
1981 if (EVP_DigestVerify(mctx, CBS_data(&signature),
1982 CBS_len(&signature), hdata, hdatalen) <= 0) {
1983 SSLerror(s, ERR_R_EVP_LIB);
1984 al = SSL_AD_INTERNAL_ERROR;
1985 goto fatal_err;
1986 }
1987 } else if (EVP_PKEY_id(pkey) == EVP_PKEY_RSA) {
1988 RSA *rsa;
1989
1990 if ((rsa = EVP_PKEY_get0_RSA(pkey)) == NULL) {
1991 al = SSL_AD_INTERNAL_ERROR;
1992 SSLerror(s, ERR_R_EVP_LIB);
1993 goto fatal_err;
1994 }
1995 verify = RSA_verify(NID_md5_sha1, s->s3->hs.tls12.cert_verify,
1996 MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH, CBS_data(&signature),
1997 CBS_len(&signature), rsa);
1998 if (verify < 0) {
1999 al = SSL_AD_DECRYPT_ERROR;
2000 SSLerror(s, SSL_R_BAD_RSA_DECRYPT);
2001 goto fatal_err;
2002 }
2003 if (verify == 0) {
2004 al = SSL_AD_DECRYPT_ERROR;
2005 SSLerror(s, SSL_R_BAD_RSA_SIGNATURE);
2006 goto fatal_err;
2007 }
2008 } else if (EVP_PKEY_id(pkey) == EVP_PKEY_EC) {
2009 EC_KEY *eckey;
2010
2011 if ((eckey = EVP_PKEY_get0_EC_KEY(pkey)) == NULL) {
2012 al = SSL_AD_INTERNAL_ERROR;
2013 SSLerror(s, ERR_R_EVP_LIB);
2014 goto fatal_err;
2015 }
2016 verify = ECDSA_verify(0,
2017 &(s->s3->hs.tls12.cert_verify[MD5_DIGEST_LENGTH]),
2018 SHA_DIGEST_LENGTH, CBS_data(&signature),
2019 CBS_len(&signature), eckey);
2020 if (verify <= 0) {
2021 al = SSL_AD_DECRYPT_ERROR;
2022 SSLerror(s, SSL_R_BAD_ECDSA_SIGNATURE);
2023 goto fatal_err;
2024 }
2025 } else {
2026 SSLerror(s, ERR_R_INTERNAL_ERROR); 1937 SSLerror(s, ERR_R_INTERNAL_ERROR);
2027 al = SSL_AD_UNSUPPORTED_CERTIFICATE; 1938 al = SSL_AD_INTERNAL_ERROR;
1939 goto fatal_err;
1940 }
1941 if (!EVP_DigestVerifyInit(mctx, &pctx, sigalg->md(), NULL, pkey)) {
1942 SSLerror(s, ERR_R_EVP_LIB);
1943 al = SSL_AD_INTERNAL_ERROR;
1944 goto fatal_err;
1945 }
1946 if ((sigalg->flags & SIGALG_FLAG_RSA_PSS) &&
1947 (!EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) ||
1948 !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1))) {
1949 al = SSL_AD_INTERNAL_ERROR;
1950 goto fatal_err;
1951 }
1952 if (EVP_DigestVerify(mctx, CBS_data(&signature), CBS_len(&signature),
1953 hdata, hdatalen) <= 0) {
1954 SSLerror(s, ERR_R_EVP_LIB);
1955 al = SSL_AD_INTERNAL_ERROR;
2028 goto fatal_err; 1956 goto fatal_err;
2029 } 1957 }
2030 1958