diff options
author | djm <> | 2011-11-03 02:32:23 +0000 |
---|---|---|
committer | djm <> | 2011-11-03 02:32:23 +0000 |
commit | 113f799ec7d1728f0a5d7ab5b0e3b42e3de56407 (patch) | |
tree | 26d712b25a8fa580b8f2dfc6df470ba5ffea9eb7 /src/lib/libssl/ssl_lib.c | |
parent | 829fd51d4f8dde4a7f3bf54754f3c1d1a502f5e2 (diff) | |
download | openbsd-113f799ec7d1728f0a5d7ab5b0e3b42e3de56407.tar.gz openbsd-113f799ec7d1728f0a5d7ab5b0e3b42e3de56407.tar.bz2 openbsd-113f799ec7d1728f0a5d7ab5b0e3b42e3de56407.zip |
import OpenSSL 1.0.0e
Diffstat (limited to 'src/lib/libssl/ssl_lib.c')
-rw-r--r-- | src/lib/libssl/ssl_lib.c | 47 |
1 files changed, 15 insertions, 32 deletions
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c index 3157f20eac..46732791fd 100644 --- a/src/lib/libssl/ssl_lib.c +++ b/src/lib/libssl/ssl_lib.c | |||
@@ -1833,7 +1833,7 @@ void ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) | |||
1833 | #endif | 1833 | #endif |
1834 | X509 *x = NULL; | 1834 | X509 *x = NULL; |
1835 | EVP_PKEY *ecc_pkey = NULL; | 1835 | EVP_PKEY *ecc_pkey = NULL; |
1836 | int signature_nid = 0; | 1836 | int signature_nid = 0, pk_nid = 0, md_nid = 0; |
1837 | 1837 | ||
1838 | if (c == NULL) return; | 1838 | if (c == NULL) return; |
1839 | 1839 | ||
@@ -1963,18 +1963,15 @@ void ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) | |||
1963 | EVP_PKEY_bits(ecc_pkey) : 0; | 1963 | EVP_PKEY_bits(ecc_pkey) : 0; |
1964 | EVP_PKEY_free(ecc_pkey); | 1964 | EVP_PKEY_free(ecc_pkey); |
1965 | if ((x->sig_alg) && (x->sig_alg->algorithm)) | 1965 | if ((x->sig_alg) && (x->sig_alg->algorithm)) |
1966 | { | ||
1966 | signature_nid = OBJ_obj2nid(x->sig_alg->algorithm); | 1967 | signature_nid = OBJ_obj2nid(x->sig_alg->algorithm); |
1968 | OBJ_find_sigid_algs(signature_nid, &md_nid, &pk_nid); | ||
1969 | } | ||
1967 | #ifndef OPENSSL_NO_ECDH | 1970 | #ifndef OPENSSL_NO_ECDH |
1968 | if (ecdh_ok) | 1971 | if (ecdh_ok) |
1969 | { | 1972 | { |
1970 | const char *sig = OBJ_nid2ln(signature_nid); | 1973 | |
1971 | if (sig == NULL) | 1974 | if (pk_nid == NID_rsaEncryption || pk_nid == NID_rsa) |
1972 | { | ||
1973 | ERR_clear_error(); | ||
1974 | sig = "unknown"; | ||
1975 | } | ||
1976 | |||
1977 | if (strstr(sig, "WithRSA")) | ||
1978 | { | 1975 | { |
1979 | mask_k|=SSL_kECDHr; | 1976 | mask_k|=SSL_kECDHr; |
1980 | mask_a|=SSL_aECDH; | 1977 | mask_a|=SSL_aECDH; |
@@ -1985,7 +1982,7 @@ void ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) | |||
1985 | } | 1982 | } |
1986 | } | 1983 | } |
1987 | 1984 | ||
1988 | if (signature_nid == NID_ecdsa_with_SHA1) | 1985 | if (pk_nid == NID_X9_62_id_ecPublicKey) |
1989 | { | 1986 | { |
1990 | mask_k|=SSL_kECDHe; | 1987 | mask_k|=SSL_kECDHe; |
1991 | mask_a|=SSL_aECDH; | 1988 | mask_a|=SSL_aECDH; |
@@ -2039,7 +2036,7 @@ int ssl_check_srvr_ecc_cert_and_alg(X509 *x, const SSL_CIPHER *cs) | |||
2039 | unsigned long alg_k, alg_a; | 2036 | unsigned long alg_k, alg_a; |
2040 | EVP_PKEY *pkey = NULL; | 2037 | EVP_PKEY *pkey = NULL; |
2041 | int keysize = 0; | 2038 | int keysize = 0; |
2042 | int signature_nid = 0; | 2039 | int signature_nid = 0, md_nid = 0, pk_nid = 0; |
2043 | 2040 | ||
2044 | alg_k = cs->algorithm_mkey; | 2041 | alg_k = cs->algorithm_mkey; |
2045 | alg_a = cs->algorithm_auth; | 2042 | alg_a = cs->algorithm_auth; |
@@ -2057,7 +2054,10 @@ int ssl_check_srvr_ecc_cert_and_alg(X509 *x, const SSL_CIPHER *cs) | |||
2057 | /* This call populates the ex_flags field correctly */ | 2054 | /* This call populates the ex_flags field correctly */ |
2058 | X509_check_purpose(x, -1, 0); | 2055 | X509_check_purpose(x, -1, 0); |
2059 | if ((x->sig_alg) && (x->sig_alg->algorithm)) | 2056 | if ((x->sig_alg) && (x->sig_alg->algorithm)) |
2057 | { | ||
2060 | signature_nid = OBJ_obj2nid(x->sig_alg->algorithm); | 2058 | signature_nid = OBJ_obj2nid(x->sig_alg->algorithm); |
2059 | OBJ_find_sigid_algs(signature_nid, &md_nid, &pk_nid); | ||
2060 | } | ||
2061 | if (alg_k & SSL_kECDHe || alg_k & SSL_kECDHr) | 2061 | if (alg_k & SSL_kECDHe || alg_k & SSL_kECDHr) |
2062 | { | 2062 | { |
2063 | /* key usage, if present, must allow key agreement */ | 2063 | /* key usage, if present, must allow key agreement */ |
@@ -2069,7 +2069,7 @@ int ssl_check_srvr_ecc_cert_and_alg(X509 *x, const SSL_CIPHER *cs) | |||
2069 | if (alg_k & SSL_kECDHe) | 2069 | if (alg_k & SSL_kECDHe) |
2070 | { | 2070 | { |
2071 | /* signature alg must be ECDSA */ | 2071 | /* signature alg must be ECDSA */ |
2072 | if (signature_nid != NID_ecdsa_with_SHA1) | 2072 | if (pk_nid != NID_X9_62_id_ecPublicKey) |
2073 | { | 2073 | { |
2074 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE); | 2074 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE); |
2075 | return 0; | 2075 | return 0; |
@@ -2079,13 +2079,7 @@ int ssl_check_srvr_ecc_cert_and_alg(X509 *x, const SSL_CIPHER *cs) | |||
2079 | { | 2079 | { |
2080 | /* signature alg must be RSA */ | 2080 | /* signature alg must be RSA */ |
2081 | 2081 | ||
2082 | const char *sig = OBJ_nid2ln(signature_nid); | 2082 | if (pk_nid != NID_rsaEncryption && pk_nid != NID_rsa) |
2083 | if (sig == NULL) | ||
2084 | { | ||
2085 | ERR_clear_error(); | ||
2086 | sig = "unknown"; | ||
2087 | } | ||
2088 | if (strstr(sig, "WithRSA") == NULL) | ||
2089 | { | 2083 | { |
2090 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE); | 2084 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE); |
2091 | return 0; | 2085 | return 0; |
@@ -2110,23 +2104,12 @@ int ssl_check_srvr_ecc_cert_and_alg(X509 *x, const SSL_CIPHER *cs) | |||
2110 | /* THIS NEEDS CLEANING UP */ | 2104 | /* THIS NEEDS CLEANING UP */ |
2111 | X509 *ssl_get_server_send_cert(SSL *s) | 2105 | X509 *ssl_get_server_send_cert(SSL *s) |
2112 | { | 2106 | { |
2113 | unsigned long alg_k,alg_a,mask_k,mask_a; | 2107 | unsigned long alg_k,alg_a; |
2114 | CERT *c; | 2108 | CERT *c; |
2115 | int i,is_export; | 2109 | int i; |
2116 | 2110 | ||
2117 | c=s->cert; | 2111 | c=s->cert; |
2118 | ssl_set_cert_masks(c, s->s3->tmp.new_cipher); | 2112 | ssl_set_cert_masks(c, s->s3->tmp.new_cipher); |
2119 | is_export=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher); | ||
2120 | if (is_export) | ||
2121 | { | ||
2122 | mask_k = c->export_mask_k; | ||
2123 | mask_a = c->export_mask_a; | ||
2124 | } | ||
2125 | else | ||
2126 | { | ||
2127 | mask_k = c->mask_k; | ||
2128 | mask_a = c->mask_a; | ||
2129 | } | ||
2130 | 2113 | ||
2131 | alg_k = s->s3->tmp.new_cipher->algorithm_mkey; | 2114 | alg_k = s->s3->tmp.new_cipher->algorithm_mkey; |
2132 | alg_a = s->s3->tmp.new_cipher->algorithm_auth; | 2115 | alg_a = s->s3->tmp.new_cipher->algorithm_auth; |