diff options
Diffstat (limited to 'src/lib/libssl/ssl_lib.c')
-rw-r--r-- | src/lib/libssl/ssl_lib.c | 74 |
1 files changed, 44 insertions, 30 deletions
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c index 46732791fd..497515f9ec 100644 --- a/src/lib/libssl/ssl_lib.c +++ b/src/lib/libssl/ssl_lib.c | |||
@@ -1306,36 +1306,33 @@ int SSL_set_cipher_list(SSL *s,const char *str) | |||
1306 | /* works well for SSLv2, not so good for SSLv3 */ | 1306 | /* works well for SSLv2, not so good for SSLv3 */ |
1307 | char *SSL_get_shared_ciphers(const SSL *s,char *buf,int len) | 1307 | char *SSL_get_shared_ciphers(const SSL *s,char *buf,int len) |
1308 | { | 1308 | { |
1309 | char *p; | 1309 | char *end; |
1310 | STACK_OF(SSL_CIPHER) *sk; | 1310 | STACK_OF(SSL_CIPHER) *sk; |
1311 | SSL_CIPHER *c; | 1311 | SSL_CIPHER *c; |
1312 | size_t curlen = 0; | ||
1312 | int i; | 1313 | int i; |
1313 | 1314 | ||
1314 | if ((s->session == NULL) || (s->session->ciphers == NULL) || | 1315 | if ((s->session == NULL) || (s->session->ciphers == NULL) || |
1315 | (len < 2)) | 1316 | (len < 2)) |
1316 | return(NULL); | 1317 | return(NULL); |
1317 | 1318 | ||
1318 | p=buf; | ||
1319 | sk=s->session->ciphers; | 1319 | sk=s->session->ciphers; |
1320 | buf[0] = '\0'; | ||
1320 | for (i=0; i<sk_SSL_CIPHER_num(sk); i++) | 1321 | for (i=0; i<sk_SSL_CIPHER_num(sk); i++) |
1321 | { | 1322 | { |
1322 | int n; | ||
1323 | |||
1324 | c=sk_SSL_CIPHER_value(sk,i); | 1323 | c=sk_SSL_CIPHER_value(sk,i); |
1325 | n=strlen(c->name); | 1324 | end = buf + curlen; |
1326 | if (n+1 > len) | 1325 | if (strlcat(buf, c->name, len) >= len || |
1326 | (curlen = strlcat(buf, ":", len)) >= len) | ||
1327 | { | 1327 | { |
1328 | if (p != buf) | 1328 | /* remove truncated cipher from list */ |
1329 | --p; | 1329 | *end = '\0'; |
1330 | *p='\0'; | 1330 | break; |
1331 | return buf; | ||
1332 | } | 1331 | } |
1333 | strcpy(p,c->name); | ||
1334 | p+=n; | ||
1335 | *(p++)=':'; | ||
1336 | len-=n+1; | ||
1337 | } | 1332 | } |
1338 | p[-1]='\0'; | 1333 | /* remove trailing colon */ |
1334 | if ((end = strrchr(buf, ':')) != NULL) | ||
1335 | *end = '\0'; | ||
1339 | return(buf); | 1336 | return(buf); |
1340 | } | 1337 | } |
1341 | 1338 | ||
@@ -1833,7 +1830,7 @@ void ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) | |||
1833 | #endif | 1830 | #endif |
1834 | X509 *x = NULL; | 1831 | X509 *x = NULL; |
1835 | EVP_PKEY *ecc_pkey = NULL; | 1832 | EVP_PKEY *ecc_pkey = NULL; |
1836 | int signature_nid = 0, pk_nid = 0, md_nid = 0; | 1833 | int signature_nid = 0; |
1837 | 1834 | ||
1838 | if (c == NULL) return; | 1835 | if (c == NULL) return; |
1839 | 1836 | ||
@@ -1963,15 +1960,18 @@ void ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) | |||
1963 | EVP_PKEY_bits(ecc_pkey) : 0; | 1960 | EVP_PKEY_bits(ecc_pkey) : 0; |
1964 | EVP_PKEY_free(ecc_pkey); | 1961 | EVP_PKEY_free(ecc_pkey); |
1965 | if ((x->sig_alg) && (x->sig_alg->algorithm)) | 1962 | if ((x->sig_alg) && (x->sig_alg->algorithm)) |
1966 | { | ||
1967 | signature_nid = OBJ_obj2nid(x->sig_alg->algorithm); | 1963 | signature_nid = OBJ_obj2nid(x->sig_alg->algorithm); |
1968 | OBJ_find_sigid_algs(signature_nid, &md_nid, &pk_nid); | ||
1969 | } | ||
1970 | #ifndef OPENSSL_NO_ECDH | 1964 | #ifndef OPENSSL_NO_ECDH |
1971 | if (ecdh_ok) | 1965 | if (ecdh_ok) |
1972 | { | 1966 | { |
1973 | 1967 | const char *sig = OBJ_nid2ln(signature_nid); | |
1974 | if (pk_nid == NID_rsaEncryption || pk_nid == NID_rsa) | 1968 | if (sig == NULL) |
1969 | { | ||
1970 | ERR_clear_error(); | ||
1971 | sig = "unknown"; | ||
1972 | } | ||
1973 | |||
1974 | if (strstr(sig, "WithRSA")) | ||
1975 | { | 1975 | { |
1976 | mask_k|=SSL_kECDHr; | 1976 | mask_k|=SSL_kECDHr; |
1977 | mask_a|=SSL_aECDH; | 1977 | mask_a|=SSL_aECDH; |
@@ -1982,7 +1982,7 @@ void ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) | |||
1982 | } | 1982 | } |
1983 | } | 1983 | } |
1984 | 1984 | ||
1985 | if (pk_nid == NID_X9_62_id_ecPublicKey) | 1985 | if (signature_nid == NID_ecdsa_with_SHA1) |
1986 | { | 1986 | { |
1987 | mask_k|=SSL_kECDHe; | 1987 | mask_k|=SSL_kECDHe; |
1988 | mask_a|=SSL_aECDH; | 1988 | mask_a|=SSL_aECDH; |
@@ -2036,7 +2036,7 @@ int ssl_check_srvr_ecc_cert_and_alg(X509 *x, const SSL_CIPHER *cs) | |||
2036 | unsigned long alg_k, alg_a; | 2036 | unsigned long alg_k, alg_a; |
2037 | EVP_PKEY *pkey = NULL; | 2037 | EVP_PKEY *pkey = NULL; |
2038 | int keysize = 0; | 2038 | int keysize = 0; |
2039 | int signature_nid = 0, md_nid = 0, pk_nid = 0; | 2039 | int signature_nid = 0; |
2040 | 2040 | ||
2041 | alg_k = cs->algorithm_mkey; | 2041 | alg_k = cs->algorithm_mkey; |
2042 | alg_a = cs->algorithm_auth; | 2042 | alg_a = cs->algorithm_auth; |
@@ -2054,10 +2054,7 @@ int ssl_check_srvr_ecc_cert_and_alg(X509 *x, const SSL_CIPHER *cs) | |||
2054 | /* This call populates the ex_flags field correctly */ | 2054 | /* This call populates the ex_flags field correctly */ |
2055 | X509_check_purpose(x, -1, 0); | 2055 | X509_check_purpose(x, -1, 0); |
2056 | if ((x->sig_alg) && (x->sig_alg->algorithm)) | 2056 | if ((x->sig_alg) && (x->sig_alg->algorithm)) |
2057 | { | ||
2058 | signature_nid = OBJ_obj2nid(x->sig_alg->algorithm); | 2057 | 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) | 2058 | if (alg_k & SSL_kECDHe || alg_k & SSL_kECDHr) |
2062 | { | 2059 | { |
2063 | /* key usage, if present, must allow key agreement */ | 2060 | /* key usage, if present, must allow key agreement */ |
@@ -2069,7 +2066,7 @@ int ssl_check_srvr_ecc_cert_and_alg(X509 *x, const SSL_CIPHER *cs) | |||
2069 | if (alg_k & SSL_kECDHe) | 2066 | if (alg_k & SSL_kECDHe) |
2070 | { | 2067 | { |
2071 | /* signature alg must be ECDSA */ | 2068 | /* signature alg must be ECDSA */ |
2072 | if (pk_nid != NID_X9_62_id_ecPublicKey) | 2069 | if (signature_nid != NID_ecdsa_with_SHA1) |
2073 | { | 2070 | { |
2074 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE); | 2071 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_SHOULD_HAVE_SHA1_SIGNATURE); |
2075 | return 0; | 2072 | return 0; |
@@ -2079,7 +2076,13 @@ int ssl_check_srvr_ecc_cert_and_alg(X509 *x, const SSL_CIPHER *cs) | |||
2079 | { | 2076 | { |
2080 | /* signature alg must be RSA */ | 2077 | /* signature alg must be RSA */ |
2081 | 2078 | ||
2082 | if (pk_nid != NID_rsaEncryption && pk_nid != NID_rsa) | 2079 | const char *sig = OBJ_nid2ln(signature_nid); |
2080 | if (sig == NULL) | ||
2081 | { | ||
2082 | ERR_clear_error(); | ||
2083 | sig = "unknown"; | ||
2084 | } | ||
2085 | if (strstr(sig, "WithRSA") == NULL) | ||
2083 | { | 2086 | { |
2084 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE); | 2087 | SSLerr(SSL_F_SSL_CHECK_SRVR_ECC_CERT_AND_ALG, SSL_R_ECC_CERT_SHOULD_HAVE_RSA_SIGNATURE); |
2085 | return 0; | 2088 | return 0; |
@@ -2104,12 +2107,23 @@ int ssl_check_srvr_ecc_cert_and_alg(X509 *x, const SSL_CIPHER *cs) | |||
2104 | /* THIS NEEDS CLEANING UP */ | 2107 | /* THIS NEEDS CLEANING UP */ |
2105 | X509 *ssl_get_server_send_cert(SSL *s) | 2108 | X509 *ssl_get_server_send_cert(SSL *s) |
2106 | { | 2109 | { |
2107 | unsigned long alg_k,alg_a; | 2110 | unsigned long alg_k,alg_a,mask_k,mask_a; |
2108 | CERT *c; | 2111 | CERT *c; |
2109 | int i; | 2112 | int i,is_export; |
2110 | 2113 | ||
2111 | c=s->cert; | 2114 | c=s->cert; |
2112 | ssl_set_cert_masks(c, s->s3->tmp.new_cipher); | 2115 | ssl_set_cert_masks(c, s->s3->tmp.new_cipher); |
2116 | is_export=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher); | ||
2117 | if (is_export) | ||
2118 | { | ||
2119 | mask_k = c->export_mask_k; | ||
2120 | mask_a = c->export_mask_a; | ||
2121 | } | ||
2122 | else | ||
2123 | { | ||
2124 | mask_k = c->mask_k; | ||
2125 | mask_a = c->mask_a; | ||
2126 | } | ||
2113 | 2127 | ||
2114 | alg_k = s->s3->tmp.new_cipher->algorithm_mkey; | 2128 | alg_k = s->s3->tmp.new_cipher->algorithm_mkey; |
2115 | alg_a = s->s3->tmp.new_cipher->algorithm_auth; | 2129 | alg_a = s->s3->tmp.new_cipher->algorithm_auth; |