summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libssl/ssl_sigalgs.c26
-rw-r--r--src/lib/libssl/ssl_sigalgs.h4
-rw-r--r--src/lib/libssl/tls13_client.c9
-rw-r--r--src/lib/libssl/tls13_server.c9
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
339const struct ssl_sigalg *
340ssl_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);
75int ssl_sigalg_pkey_ok(SSL *s, const struct ssl_sigalg *sigalg, 75int ssl_sigalg_pkey_ok(SSL *s, const struct ssl_sigalg *sigalg,
76 EVP_PKEY *pkey); 76 EVP_PKEY *pkey);
77const struct ssl_sigalg *ssl_sigalg_select(SSL *s, EVP_PKEY *pkey); 77const struct ssl_sigalg *ssl_sigalg_select(SSL *s, EVP_PKEY *pkey);
78const 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