diff options
author | jsing <> | 2021-06-29 19:20:39 +0000 |
---|---|---|
committer | jsing <> | 2021-06-29 19:20:39 +0000 |
commit | d8bbfb5c853f1528593599b4cad373dd3f4ac17b (patch) | |
tree | acb82022939a1d3f1bd7dda9dca7bc6324d50b45 | |
parent | 2084659c33f3dd4553097139197351f79d9931da (diff) | |
download | openbsd-d8bbfb5c853f1528593599b4cad373dd3f4ac17b.tar.gz openbsd-d8bbfb5c853f1528593599b4cad373dd3f4ac17b.tar.bz2 openbsd-d8bbfb5c853f1528593599b4cad373dd3f4ac17b.zip |
Provide a ssl_sigalg_for_peer() function and use in the TLSv1.3 code.
Provide an ssl_sigalg_for_peer() function that knows how to figure out
which signature algorithm should be used for a peer provided signature,
performing appropriate validation to ensure that the peer provided value
is suitable for the protocol version and key in use.
In the TLSv1.3 code, this replaces the need for separate calls to lookup
the sigalg from the peer provided value, then perform validation.
ok inoguchi@ tb@
-rw-r--r-- | src/lib/libssl/ssl_sigalgs.c | 26 | ||||
-rw-r--r-- | src/lib/libssl/ssl_sigalgs.h | 4 | ||||
-rw-r--r-- | src/lib/libssl/tls13_client.c | 9 | ||||
-rw-r--r-- | src/lib/libssl/tls13_server.c | 9 |
4 files changed, 33 insertions, 15 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 | } | ||
diff --git a/src/lib/libssl/ssl_sigalgs.h b/src/lib/libssl/ssl_sigalgs.h index 6905bba060..dffa0e0158 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.21 2021/06/29 19:10:08 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_sigalgs.h,v 1.22 2021/06/29 19:20:39 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 | * |
@@ -75,6 +75,8 @@ int ssl_sigalgs_build(uint16_t tls_version, CBB *cbb); | |||
75 | int ssl_sigalg_pkey_ok(SSL *s, const struct ssl_sigalg *sigalg, | 75 | int ssl_sigalg_pkey_ok(SSL *s, const struct ssl_sigalg *sigalg, |
76 | EVP_PKEY *pkey); | 76 | EVP_PKEY *pkey); |
77 | const struct ssl_sigalg *ssl_sigalg_select(SSL *s, EVP_PKEY *pkey); | 77 | const struct ssl_sigalg *ssl_sigalg_select(SSL *s, EVP_PKEY *pkey); |
78 | const struct ssl_sigalg *ssl_sigalg_for_peer(SSL *s, EVP_PKEY *pkey, | ||
79 | uint16_t sigalg_value); | ||
78 | 80 | ||
79 | __END_HIDDEN_DECLS | 81 | __END_HIDDEN_DECLS |
80 | 82 | ||
diff --git a/src/lib/libssl/tls13_client.c b/src/lib/libssl/tls13_client.c index dd9a5b1606..62c5174490 100644 --- a/src/lib/libssl/tls13_client.c +++ b/src/lib/libssl/tls13_client.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_client.c,v 1.85 2021/06/29 19:10:08 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_client.c,v 1.86 2021/06/29 19:20:39 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -680,10 +680,6 @@ tls13_server_certificate_verify_recv(struct tls13_ctx *ctx, CBS *cbs) | |||
680 | if (!CBS_get_u16_length_prefixed(cbs, &signature)) | 680 | if (!CBS_get_u16_length_prefixed(cbs, &signature)) |
681 | goto err; | 681 | goto err; |
682 | 682 | ||
683 | if ((sigalg = ssl_sigalg_from_value(ctx->hs->negotiated_tls_version, | ||
684 | signature_scheme)) == NULL) | ||
685 | goto err; | ||
686 | |||
687 | if (!CBB_init(&cbb, 0)) | 683 | if (!CBB_init(&cbb, 0)) |
688 | goto err; | 684 | goto err; |
689 | if (!CBB_add_bytes(&cbb, tls13_cert_verify_pad, | 685 | if (!CBB_add_bytes(&cbb, tls13_cert_verify_pad, |
@@ -704,7 +700,8 @@ tls13_server_certificate_verify_recv(struct tls13_ctx *ctx, CBS *cbs) | |||
704 | goto err; | 700 | goto err; |
705 | if ((pkey = X509_get0_pubkey(cert)) == NULL) | 701 | if ((pkey = X509_get0_pubkey(cert)) == NULL) |
706 | goto err; | 702 | goto err; |
707 | if (!ssl_sigalg_pkey_ok(ctx->ssl, sigalg, pkey)) | 703 | if ((sigalg = ssl_sigalg_for_peer(ctx->ssl, pkey, |
704 | signature_scheme)) == NULL) | ||
708 | goto err; | 705 | goto err; |
709 | ctx->hs->peer_sigalg = sigalg; | 706 | ctx->hs->peer_sigalg = sigalg; |
710 | 707 | ||
diff --git a/src/lib/libssl/tls13_server.c b/src/lib/libssl/tls13_server.c index c3d4ca9bd8..ff410fbb34 100644 --- a/src/lib/libssl/tls13_server.c +++ b/src/lib/libssl/tls13_server.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_server.c,v 1.82 2021/06/29 19:10:08 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_server.c,v 1.83 2021/06/29 19:20:39 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org> |
4 | * Copyright (c) 2020 Bob Beck <beck@openbsd.org> | 4 | * Copyright (c) 2020 Bob Beck <beck@openbsd.org> |
@@ -970,10 +970,6 @@ tls13_client_certificate_verify_recv(struct tls13_ctx *ctx, CBS *cbs) | |||
970 | if (!CBS_get_u16_length_prefixed(cbs, &signature)) | 970 | if (!CBS_get_u16_length_prefixed(cbs, &signature)) |
971 | goto err; | 971 | goto err; |
972 | 972 | ||
973 | if ((sigalg = ssl_sigalg_from_value(ctx->hs->negotiated_tls_version, | ||
974 | signature_scheme)) == NULL) | ||
975 | goto err; | ||
976 | |||
977 | if (!CBB_init(&cbb, 0)) | 973 | if (!CBB_init(&cbb, 0)) |
978 | goto err; | 974 | goto err; |
979 | if (!CBB_add_bytes(&cbb, tls13_cert_verify_pad, | 975 | if (!CBB_add_bytes(&cbb, tls13_cert_verify_pad, |
@@ -994,7 +990,8 @@ tls13_client_certificate_verify_recv(struct tls13_ctx *ctx, CBS *cbs) | |||
994 | goto err; | 990 | goto err; |
995 | if ((pkey = X509_get0_pubkey(cert)) == NULL) | 991 | if ((pkey = X509_get0_pubkey(cert)) == NULL) |
996 | goto err; | 992 | goto err; |
997 | if (!ssl_sigalg_pkey_ok(ctx->ssl, sigalg, pkey)) | 993 | if ((sigalg = ssl_sigalg_for_peer(ctx->ssl, pkey, |
994 | signature_scheme)) == NULL) | ||
998 | goto err; | 995 | goto err; |
999 | ctx->hs->peer_sigalg = sigalg; | 996 | ctx->hs->peer_sigalg = sigalg; |
1000 | 997 | ||