diff options
Diffstat (limited to 'src/lib/libssl/ssl_sigalgs.c')
-rw-r--r-- | src/lib/libssl/ssl_sigalgs.c | 41 |
1 files changed, 18 insertions, 23 deletions
diff --git a/src/lib/libssl/ssl_sigalgs.c b/src/lib/libssl/ssl_sigalgs.c index 456332e7cf..bd896c829b 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.31 2021/06/29 18:59:25 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_sigalgs.c,v 1.32 2021/06/29 19:10:08 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 | * | 4 | * |
@@ -260,32 +260,37 @@ ssl_sigalg_for_legacy(SSL *s, EVP_PKEY *pkey) | |||
260 | } | 260 | } |
261 | 261 | ||
262 | int | 262 | int |
263 | ssl_sigalg_pkey_ok(const struct ssl_sigalg *sigalg, EVP_PKEY *pkey, | 263 | ssl_sigalg_pkey_ok(SSL *s, const struct ssl_sigalg *sigalg, EVP_PKEY *pkey) |
264 | int check_curve) | ||
265 | { | 264 | { |
266 | if (sigalg == NULL || pkey == NULL) | 265 | if (sigalg == NULL || pkey == NULL) |
267 | return 0; | 266 | return 0; |
268 | if (sigalg->key_type != pkey->type) | 267 | if (sigalg->key_type != pkey->type) |
269 | return 0; | 268 | return 0; |
270 | 269 | ||
270 | /* | ||
271 | * RSA PSS must have an RSA key that needs to be at | ||
272 | * least as big as twice the size of the hash + 2 | ||
273 | */ | ||
271 | if ((sigalg->flags & SIGALG_FLAG_RSA_PSS)) { | 274 | if ((sigalg->flags & SIGALG_FLAG_RSA_PSS)) { |
272 | /* | ||
273 | * RSA PSS Must have an RSA key that needs to be at | ||
274 | * least as big as twice the size of the hash + 2 | ||
275 | */ | ||
276 | if (pkey->type != EVP_PKEY_RSA || | 275 | if (pkey->type != EVP_PKEY_RSA || |
277 | EVP_PKEY_size(pkey) < (2 * EVP_MD_size(sigalg->md()) + 2)) | 276 | EVP_PKEY_size(pkey) < (2 * EVP_MD_size(sigalg->md()) + 2)) |
278 | return 0; | 277 | return 0; |
279 | } | 278 | } |
280 | 279 | ||
281 | if (pkey->type == EVP_PKEY_EC && check_curve) { | 280 | /* RSA cannot be used without PSS in TLSv1.3. */ |
282 | /* Curve must match for EC keys. */ | 281 | if (S3I(s)->hs.negotiated_tls_version >= TLS1_3_VERSION && |
282 | sigalg->key_type == EVP_PKEY_RSA && | ||
283 | (sigalg->flags & SIGALG_FLAG_RSA_PSS) == 0) | ||
284 | return 0; | ||
285 | |||
286 | /* Ensure that curve matches for EC keys. */ | ||
287 | if (S3I(s)->hs.negotiated_tls_version >= TLS1_3_VERSION && | ||
288 | pkey->type == EVP_PKEY_EC) { | ||
283 | if (sigalg->curve_nid == 0) | 289 | if (sigalg->curve_nid == 0) |
284 | return 0; | 290 | return 0; |
285 | if (EC_GROUP_get_curve_name(EC_KEY_get0_group | 291 | if (EC_GROUP_get_curve_name(EC_KEY_get0_group( |
286 | (EVP_PKEY_get0_EC_KEY(pkey))) != sigalg->curve_nid) { | 292 | EVP_PKEY_get0_EC_KEY(pkey))) != sigalg->curve_nid) |
287 | return 0; | 293 | return 0; |
288 | } | ||
289 | } | 294 | } |
290 | 295 | ||
291 | return 1; | 296 | return 1; |
@@ -294,12 +299,8 @@ ssl_sigalg_pkey_ok(const struct ssl_sigalg *sigalg, EVP_PKEY *pkey, | |||
294 | const struct ssl_sigalg * | 299 | const struct ssl_sigalg * |
295 | ssl_sigalg_select(SSL *s, EVP_PKEY *pkey) | 300 | ssl_sigalg_select(SSL *s, EVP_PKEY *pkey) |
296 | { | 301 | { |
297 | int check_curve = 0; | ||
298 | CBS cbs; | 302 | CBS cbs; |
299 | 303 | ||
300 | if (S3I(s)->hs.negotiated_tls_version >= TLS1_3_VERSION) | ||
301 | check_curve = 1; | ||
302 | |||
303 | if (!SSL_USE_SIGALGS(s)) | 304 | if (!SSL_USE_SIGALGS(s)) |
304 | return ssl_sigalg_for_legacy(s, pkey); | 305 | return ssl_sigalg_for_legacy(s, pkey); |
305 | 306 | ||
@@ -326,13 +327,7 @@ ssl_sigalg_select(SSL *s, EVP_PKEY *pkey) | |||
326 | S3I(s)->hs.negotiated_tls_version, sigalg_value)) == NULL) | 327 | S3I(s)->hs.negotiated_tls_version, sigalg_value)) == NULL) |
327 | continue; | 328 | continue; |
328 | 329 | ||
329 | /* RSA cannot be used without PSS in TLSv1.3. */ | 330 | if (ssl_sigalg_pkey_ok(s, sigalg, pkey)) |
330 | if (S3I(s)->hs.negotiated_tls_version >= TLS1_3_VERSION && | ||
331 | sigalg->key_type == EVP_PKEY_RSA && | ||
332 | (sigalg->flags & SIGALG_FLAG_RSA_PSS) == 0) | ||
333 | continue; | ||
334 | |||
335 | if (ssl_sigalg_pkey_ok(sigalg, pkey, check_curve)) | ||
336 | return sigalg; | 331 | return sigalg; |
337 | } | 332 | } |
338 | 333 | ||