diff options
-rw-r--r-- | src/lib/libssl/ssl_lib.c | 71 |
1 files changed, 27 insertions, 44 deletions
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c index fa1d209c8c..2da0a60c08 100644 --- a/src/lib/libssl/ssl_lib.c +++ b/src/lib/libssl/ssl_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_lib.c,v 1.214 2020/05/19 16:35:20 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_lib.c,v 1.215 2020/05/21 19:28:32 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -1965,67 +1965,50 @@ SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth) | |||
1965 | X509_VERIFY_PARAM_set_depth(ctx->param, depth); | 1965 | X509_VERIFY_PARAM_set_depth(ctx->param, depth); |
1966 | } | 1966 | } |
1967 | 1967 | ||
1968 | static int | ||
1969 | ssl_cert_can_sign(X509 *x) | ||
1970 | { | ||
1971 | /* This call populates extension flags (ex_flags). */ | ||
1972 | X509_check_purpose(x, -1, 0); | ||
1973 | |||
1974 | /* Key usage, if present, must allow signing. */ | ||
1975 | return ((x->ex_flags & EXFLAG_KUSAGE) == 0 || | ||
1976 | (x->ex_kusage & X509v3_KU_DIGITAL_SIGNATURE)); | ||
1977 | } | ||
1978 | |||
1968 | void | 1979 | void |
1969 | ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) | 1980 | ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) |
1970 | { | 1981 | { |
1971 | int rsa, dh_tmp; | 1982 | unsigned long mask_a, mask_k; |
1972 | int have_ecc_cert; | 1983 | CERT_PKEY *cpk; |
1973 | unsigned long mask_k, mask_a; | ||
1974 | X509 *x = NULL; | ||
1975 | CERT_PKEY *cpk; | ||
1976 | 1984 | ||
1977 | if (c == NULL) | 1985 | if (c == NULL) |
1978 | return; | 1986 | return; |
1979 | 1987 | ||
1980 | dh_tmp = (c->dh_tmp != NULL || c->dh_tmp_cb != NULL || | 1988 | mask_a = SSL_aNULL | SSL_aTLS1_3; |
1981 | c->dh_tmp_auto != 0); | 1989 | mask_k = SSL_kECDHE | SSL_kTLS1_3; |
1982 | 1990 | ||
1983 | cpk = &(c->pkeys[SSL_PKEY_RSA]); | 1991 | if (c->dh_tmp != NULL || c->dh_tmp_cb != NULL || c->dh_tmp_auto != 0) |
1984 | rsa = (cpk->x509 != NULL && cpk->privatekey != NULL); | 1992 | mask_k |= SSL_kDHE; |
1985 | cpk = &(c->pkeys[SSL_PKEY_ECC]); | ||
1986 | have_ecc_cert = (cpk->x509 != NULL && cpk->privatekey != NULL); | ||
1987 | 1993 | ||
1988 | mask_k = 0; | 1994 | cpk = &(c->pkeys[SSL_PKEY_ECC]); |
1989 | mask_a = 0; | 1995 | if (cpk->x509 != NULL && cpk->privatekey != NULL) { |
1996 | if (ssl_cert_can_sign(cpk->x509)) | ||
1997 | mask_a |= SSL_aECDSA; | ||
1998 | } | ||
1990 | 1999 | ||
1991 | cpk = &(c->pkeys[SSL_PKEY_GOST01]); | 2000 | cpk = &(c->pkeys[SSL_PKEY_GOST01]); |
1992 | if (cpk->x509 != NULL && cpk->privatekey !=NULL) { | 2001 | if (cpk->x509 != NULL && cpk->privatekey != NULL) { |
1993 | mask_k |= SSL_kGOST; | 2002 | mask_k |= SSL_kGOST; |
1994 | mask_a |= SSL_aGOST01; | 2003 | mask_a |= SSL_aGOST01; |
1995 | } | 2004 | } |
1996 | 2005 | ||
1997 | if (rsa) | 2006 | cpk = &(c->pkeys[SSL_PKEY_RSA]); |
1998 | mask_k |= SSL_kRSA; | 2007 | if (cpk->x509 != NULL && cpk->privatekey != NULL) { |
1999 | |||
2000 | if (dh_tmp) | ||
2001 | mask_k |= SSL_kDHE; | ||
2002 | |||
2003 | if (rsa) | ||
2004 | mask_a |= SSL_aRSA; | 2008 | mask_a |= SSL_aRSA; |
2005 | 2009 | mask_k |= SSL_kRSA; | |
2006 | mask_a |= SSL_aNULL; | ||
2007 | mask_a |= SSL_aTLS1_3; | ||
2008 | |||
2009 | mask_k |= SSL_kTLS1_3; | ||
2010 | |||
2011 | /* | ||
2012 | * An ECC certificate may be usable for ECDH and/or | ||
2013 | * ECDSA cipher suites depending on the key usage extension. | ||
2014 | */ | ||
2015 | if (have_ecc_cert) { | ||
2016 | x = (c->pkeys[SSL_PKEY_ECC]).x509; | ||
2017 | |||
2018 | /* This call populates extension flags (ex_flags). */ | ||
2019 | X509_check_purpose(x, -1, 0); | ||
2020 | |||
2021 | /* Key usage, if present, must allow signing. */ | ||
2022 | if ((x->ex_flags & EXFLAG_KUSAGE) == 0 || | ||
2023 | (x->ex_kusage & X509v3_KU_DIGITAL_SIGNATURE)) | ||
2024 | mask_a |= SSL_aECDSA; | ||
2025 | } | 2010 | } |
2026 | 2011 | ||
2027 | mask_k |= SSL_kECDHE; | ||
2028 | |||
2029 | c->mask_k = mask_k; | 2012 | c->mask_k = mask_k; |
2030 | c->mask_a = mask_a; | 2013 | c->mask_a = mask_a; |
2031 | c->valid = 1; | 2014 | c->valid = 1; |