diff options
Diffstat (limited to 'src/lib/libssl/ssl_sigalgs.c')
| -rw-r--r-- | src/lib/libssl/ssl_sigalgs.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/lib/libssl/ssl_sigalgs.c b/src/lib/libssl/ssl_sigalgs.c index bd896c829b..28d1d36b85 100644 --- a/src/lib/libssl/ssl_sigalgs.c +++ b/src/lib/libssl/ssl_sigalgs.c | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | /* $OpenBSD: ssl_sigalgs.c,v 1.32 2021/06/29 19:10:08 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_sigalgs.c,v 1.33 2021/06/29 19:20:39 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 | * | 5 | * |
| 5 | * Permission to use, copy, modify, and/or distribute this software for any | 6 | * Permission to use, copy, modify, and/or distribute this software for any |
| 6 | * purpose with or without fee is hereby granted, provided that the above | 7 | * purpose with or without fee is hereby granted, provided that the above |
| @@ -14,6 +15,7 @@ | |||
| 14 | * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | 15 | * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN |
| 15 | * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 16 | * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| 16 | */ | 17 | */ |
| 18 | |||
| 17 | #include <string.h> | 19 | #include <string.h> |
| 18 | #include <stdlib.h> | 20 | #include <stdlib.h> |
| 19 | 21 | ||
| @@ -326,7 +328,6 @@ ssl_sigalg_select(SSL *s, EVP_PKEY *pkey) | |||
| 326 | if ((sigalg = ssl_sigalg_from_value( | 328 | if ((sigalg = ssl_sigalg_from_value( |
| 327 | S3I(s)->hs.negotiated_tls_version, sigalg_value)) == NULL) | 329 | S3I(s)->hs.negotiated_tls_version, sigalg_value)) == NULL) |
| 328 | continue; | 330 | continue; |
| 329 | |||
| 330 | if (ssl_sigalg_pkey_ok(s, sigalg, pkey)) | 331 | if (ssl_sigalg_pkey_ok(s, sigalg, pkey)) |
| 331 | return sigalg; | 332 | return sigalg; |
| 332 | } | 333 | } |
| @@ -334,3 +335,24 @@ ssl_sigalg_select(SSL *s, EVP_PKEY *pkey) | |||
| 334 | SSLerror(s, SSL_R_UNKNOWN_PKEY_TYPE); | 335 | SSLerror(s, SSL_R_UNKNOWN_PKEY_TYPE); |
| 335 | return NULL; | 336 | return NULL; |
| 336 | } | 337 | } |
| 338 | |||
| 339 | const struct ssl_sigalg * | ||
| 340 | ssl_sigalg_for_peer(SSL *s, EVP_PKEY *pkey, uint16_t sigalg_value) | ||
| 341 | { | ||
| 342 | const struct ssl_sigalg *sigalg; | ||
| 343 | |||
| 344 | if (!SSL_USE_SIGALGS(s)) | ||
| 345 | return ssl_sigalg_for_legacy(s, pkey); | ||
| 346 | |||
| 347 | if ((sigalg = ssl_sigalg_from_value(S3I(s)->hs.negotiated_tls_version, | ||
| 348 | sigalg_value)) == NULL) { | ||
| 349 | SSLerror(s, SSL_R_UNKNOWN_DIGEST); | ||
| 350 | return (NULL); | ||
| 351 | } | ||
| 352 | if (!ssl_sigalg_pkey_ok(s, sigalg, pkey)) { | ||
| 353 | SSLerror(s, SSL_R_WRONG_SIGNATURE_TYPE); | ||
| 354 | return (NULL); | ||
| 355 | } | ||
| 356 | |||
| 357 | return sigalg; | ||
| 358 | } | ||
