diff options
| author | jsing <> | 2026-05-31 14:34:44 +0000 |
|---|---|---|
| committer | jsing <> | 2026-05-31 14:34:44 +0000 |
| commit | 220b0356be08906dac6ccaa9ba6cf9e0289b3435 (patch) | |
| tree | 89953440f661f3c880d44b48db9a1e891f88879e /src/lib/libssl | |
| parent | e10fcd3d372e2b1cc95379aa034431113c0aa7b4 (diff) | |
| download | openbsd-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.c | 140 | ||||
| -rw-r--r-- | src/lib/libssl/ssl_local.h | 15 | ||||
| -rw-r--r-- | src/lib/libssl/ssl_sigalgs.c | 19 | ||||
| -rw-r--r-- | src/lib/libssl/ssl_sigalgs.h | 5 | ||||
| -rw-r--r-- | src/lib/libssl/ssl_srvr.c | 148 |
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) | |||
| 1448 | static int | 1440 | static int |
| 1449 | ssl3_get_certificate_request(SSL *s) | 1441 | ssl3_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 | ||
| 2037 | static int | 2025 | static int |
| 2038 | ssl3_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 | |||
| 2073 | static int | ||
| 2074 | ssl3_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 | |||
| 2108 | static int | ||
| 2109 | ssl3_send_client_verify(SSL *s) | 2026 | ssl3_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 | ||
| 1182 | extern const SSL_CIPHER ssl3_ciphers[]; | 1173 | extern 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 | ||
| 55 | struct ssl_sigalg { | 52 | struct 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 | ||
