summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_lib.c
diff options
context:
space:
mode:
authordjm <>2011-11-03 02:32:23 +0000
committerdjm <>2011-11-03 02:32:23 +0000
commit113f799ec7d1728f0a5d7ab5b0e3b42e3de56407 (patch)
tree26d712b25a8fa580b8f2dfc6df470ba5ffea9eb7 /src/lib/libssl/ssl_lib.c
parent829fd51d4f8dde4a7f3bf54754f3c1d1a502f5e2 (diff)
downloadopenbsd-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.c47
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 */
2111X509 *ssl_get_server_send_cert(SSL *s) 2105X509 *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;