diff options
Diffstat (limited to 'src/lib/libssl/tls13_client.c')
-rw-r--r-- | src/lib/libssl/tls13_client.c | 90 |
1 files changed, 74 insertions, 16 deletions
diff --git a/src/lib/libssl/tls13_client.c b/src/lib/libssl/tls13_client.c index 24286569b1..67d663c326 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.54.4.1 2020/05/19 20:22:33 tb Exp $ */ | 1 | /* $OpenBSD: tls13_client.c,v 1.54.4.2 2020/08/10 18:59:47 tb 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 | * |
@@ -811,30 +811,92 @@ tls13_server_finished_recv(struct tls13_ctx *ctx, CBS *cbs) | |||
811 | return ret; | 811 | return ret; |
812 | } | 812 | } |
813 | 813 | ||
814 | static int | ||
815 | tls13_client_check_certificate(struct tls13_ctx *ctx, CERT_PKEY *cpk, | ||
816 | int *ok, const struct ssl_sigalg **out_sigalg) | ||
817 | { | ||
818 | const struct ssl_sigalg *sigalg; | ||
819 | SSL *s = ctx->ssl; | ||
820 | |||
821 | *ok = 0; | ||
822 | *out_sigalg = NULL; | ||
823 | |||
824 | if (cpk->x509 == NULL || cpk->privatekey == NULL) | ||
825 | goto done; | ||
826 | |||
827 | if ((sigalg = ssl_sigalg_select(s, cpk->privatekey)) == NULL) | ||
828 | goto done; | ||
829 | |||
830 | *ok = 1; | ||
831 | *out_sigalg = sigalg; | ||
832 | |||
833 | done: | ||
834 | return 1; | ||
835 | } | ||
836 | |||
837 | static int | ||
838 | tls13_client_select_certificate(struct tls13_ctx *ctx, CERT_PKEY **out_cpk, | ||
839 | const struct ssl_sigalg **out_sigalg) | ||
840 | { | ||
841 | SSL *s = ctx->ssl; | ||
842 | const struct ssl_sigalg *sigalg; | ||
843 | CERT_PKEY *cpk; | ||
844 | int cert_ok; | ||
845 | |||
846 | *out_cpk = NULL; | ||
847 | *out_sigalg = NULL; | ||
848 | |||
849 | cpk = &s->cert->pkeys[SSL_PKEY_ECC]; | ||
850 | if (!tls13_client_check_certificate(ctx, cpk, &cert_ok, &sigalg)) | ||
851 | return 0; | ||
852 | if (cert_ok) | ||
853 | goto done; | ||
854 | |||
855 | cpk = &s->cert->pkeys[SSL_PKEY_RSA_ENC]; | ||
856 | if (!tls13_client_check_certificate(ctx, cpk, &cert_ok, &sigalg)) | ||
857 | return 0; | ||
858 | if (cert_ok) | ||
859 | goto done; | ||
860 | |||
861 | cpk = NULL; | ||
862 | sigalg = NULL; | ||
863 | |||
864 | done: | ||
865 | *out_cpk = cpk; | ||
866 | *out_sigalg = sigalg; | ||
867 | |||
868 | return 1; | ||
869 | } | ||
870 | |||
814 | int | 871 | int |
815 | tls13_client_certificate_send(struct tls13_ctx *ctx, CBB *cbb) | 872 | tls13_client_certificate_send(struct tls13_ctx *ctx, CBB *cbb) |
816 | { | 873 | { |
817 | SSL *s = ctx->ssl; | 874 | SSL *s = ctx->ssl; |
818 | CBB cert_request_context, cert_list; | 875 | CBB cert_request_context, cert_list; |
876 | const struct ssl_sigalg *sigalg; | ||
819 | STACK_OF(X509) *chain; | 877 | STACK_OF(X509) *chain; |
820 | CERT_PKEY *cpk; | 878 | CERT_PKEY *cpk; |
821 | X509 *cert; | 879 | X509 *cert; |
822 | int i, ret = 0; | 880 | int i, ret = 0; |
823 | 881 | ||
824 | /* XXX - Need to revisit certificate selection. */ | 882 | if (!tls13_client_select_certificate(ctx, &cpk, &sigalg)) |
825 | cpk = &s->cert->pkeys[SSL_PKEY_RSA_ENC]; | 883 | goto err; |
826 | 884 | ||
827 | if ((chain = cpk->chain) == NULL) | 885 | ctx->hs->cpk = cpk; |
828 | chain = s->ctx->extra_certs; | 886 | ctx->hs->sigalg = sigalg; |
829 | 887 | ||
830 | if (!CBB_add_u8_length_prefixed(cbb, &cert_request_context)) | 888 | if (!CBB_add_u8_length_prefixed(cbb, &cert_request_context)) |
831 | goto err; | 889 | goto err; |
832 | if (!CBB_add_u24_length_prefixed(cbb, &cert_list)) | 890 | if (!CBB_add_u24_length_prefixed(cbb, &cert_list)) |
833 | goto err; | 891 | goto err; |
834 | 892 | ||
835 | if (cpk->x509 == NULL) | 893 | /* No certificate selected. */ |
894 | if (cpk == NULL) | ||
836 | goto done; | 895 | goto done; |
837 | 896 | ||
897 | if ((chain = cpk->chain) == NULL) | ||
898 | chain = s->ctx->extra_certs; | ||
899 | |||
838 | if (!tls13_cert_add(&cert_list, cpk->x509)) | 900 | if (!tls13_cert_add(&cert_list, cpk->x509)) |
839 | goto err; | 901 | goto err; |
840 | 902 | ||
@@ -858,27 +920,23 @@ tls13_client_certificate_send(struct tls13_ctx *ctx, CBB *cbb) | |||
858 | int | 920 | int |
859 | tls13_client_certificate_verify_send(struct tls13_ctx *ctx, CBB *cbb) | 921 | tls13_client_certificate_verify_send(struct tls13_ctx *ctx, CBB *cbb) |
860 | { | 922 | { |
861 | SSL *s = ctx->ssl; | 923 | const struct ssl_sigalg *sigalg; |
862 | const struct ssl_sigalg *sigalg = NULL; | ||
863 | uint8_t *sig = NULL, *sig_content = NULL; | 924 | uint8_t *sig = NULL, *sig_content = NULL; |
864 | size_t sig_len, sig_content_len; | 925 | size_t sig_len, sig_content_len; |
865 | EVP_MD_CTX *mdctx = NULL; | 926 | EVP_MD_CTX *mdctx = NULL; |
866 | EVP_PKEY_CTX *pctx; | 927 | EVP_PKEY_CTX *pctx; |
867 | EVP_PKEY *pkey; | 928 | EVP_PKEY *pkey; |
868 | CERT_PKEY *cpk; | 929 | const CERT_PKEY *cpk; |
869 | CBB sig_cbb; | 930 | CBB sig_cbb; |
870 | int ret = 0; | 931 | int ret = 0; |
871 | 932 | ||
872 | memset(&sig_cbb, 0, sizeof(sig_cbb)); | 933 | memset(&sig_cbb, 0, sizeof(sig_cbb)); |
873 | 934 | ||
874 | /* XXX - Need to revisit certificate selection. */ | 935 | if ((cpk = ctx->hs->cpk) == NULL) |
875 | cpk = &s->cert->pkeys[SSL_PKEY_RSA_ENC]; | ||
876 | pkey = cpk->privatekey; | ||
877 | |||
878 | if ((sigalg = ssl_sigalg_select(s, pkey)) == NULL) { | ||
879 | /* XXX - SSL_R_SIGNATURE_ALGORITHMS_ERROR */ | ||
880 | goto err; | 936 | goto err; |
881 | } | 937 | if ((sigalg = ctx->hs->sigalg) == NULL) |
938 | goto err; | ||
939 | pkey = cpk->privatekey; | ||
882 | 940 | ||
883 | if (!CBB_init(&sig_cbb, 0)) | 941 | if (!CBB_init(&sig_cbb, 0)) |
884 | goto err; | 942 | goto err; |