Remove SSLv2 support
[openssl.git] / ssl / ssl_cert.c
index d56b2c5dd581321376ae8e2d6c62888050db9ca5..f214bafe4a5511be9e73ea1ab9beb128205cea84 100644 (file)
@@ -294,35 +294,6 @@ CERT *ssl_cert_dup(CERT *cert)
                        rpk->privatekey = cpk->privatekey;
                        CRYPTO_add(&cpk->privatekey->references, 1,
                                CRYPTO_LOCK_EVP_PKEY);
-
-                       switch(i) 
-                               {
-                               /* If there was anything special to do for
-                                * certain types of keys, we'd do it here.
-                                * (Nothing at the moment, I think.) */
-
-                       case SSL_PKEY_RSA_ENC:
-                       case SSL_PKEY_RSA_SIGN:
-                               /* We have an RSA key. */
-                               break;
-                               
-                       case SSL_PKEY_DSA_SIGN:
-                               /* We have a DSA key. */
-                               break;
-                               
-                       case SSL_PKEY_DH_RSA:
-                       case SSL_PKEY_DH_DSA:
-                               /* We have a DH key. */
-                               break;
-
-                       case SSL_PKEY_ECC:
-                               /* We have an ECC key */
-                               break;
-
-                       default:
-                               /* Can't happen. */
-                               SSLerr(SSL_F_SSL_CERT_DUP, SSL_R_LIBRARY_BUG);
-                               }
                        }
 
                if (cpk->chain)
@@ -423,6 +394,13 @@ CERT *ssl_cert_dup(CERT *cert)
        ret->sec_level = cert->sec_level;
        ret->sec_ex = cert->sec_ex;
 
+#ifndef OPENSSL_NO_TLSEXT
+       if (!custom_exts_copy(&ret->cli_ext, &cert->cli_ext))
+               goto err;
+       if (!custom_exts_copy(&ret->srv_ext, &cert->srv_ext))
+               goto err;
+#endif
+
        return(ret);
        
 #if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_ECDH)
@@ -441,6 +419,11 @@ err:
                EC_KEY_free(ret->ecdh_tmp);
 #endif
 
+#ifndef OPENSSL_NO_TLSEXT
+       custom_exts_free(&ret->cli_ext);
+       custom_exts_free(&ret->srv_ext);
+#endif
+
        ssl_cert_clear_certs(ret);
 
        return NULL;
@@ -531,6 +514,10 @@ void ssl_cert_free(CERT *c)
                X509_STORE_free(c->chain_store);
        if (c->ciphers_raw)
                OPENSSL_free(c->ciphers_raw);
+#ifndef OPENSSL_NO_TLSEXT
+       custom_exts_free(&c->cli_ext);
+       custom_exts_free(&c->srv_ext);
+#endif
        OPENSSL_free(c);
        }
 
@@ -670,7 +657,7 @@ int ssl_cert_set_current(CERT *c, long op)
                return 0;
        for (i = idx; i < SSL_PKEY_NUM; i++)
                {
-               CERT_PKEY *cpk = c->key + i;
+               CERT_PKEY *cpk = c->pkeys + i;
                if (cpk->x509 && cpk->privatekey)
                        {
                        c->key = cpk;
@@ -1402,15 +1389,15 @@ static int ssl_security_default_callback(SSL *s, SSL_CTX *ctx, int op, int bits,
                /* No ciphers below security level */
                if (bits < minbits)
                        return 0;
-               /* No SSLv2 ciphers */
-               if ((SSL_CIPHER_get_id(c) >> 24) == 0x2)
-                       return 0;
                /* No unauthenticated ciphersuites */
                if (c->algorithm_auth & SSL_aNULL)
                        return 0;
                /* No MD5 mac ciphersuites */
                if (c->algorithm_mac & SSL_MD5)
                        return 0;
+               /* SHA1 HMAC is 160 bits of security */
+               if (minbits > 160 && c->algorithm_mac & SSL_SHA1)
+                       return 0;
                /* Level 2: no RC4 */
                if (level >= 2 && c->algorithm_enc == SSL_RC4)
                        return 0;
@@ -1420,9 +1407,6 @@ static int ssl_security_default_callback(SSL *s, SSL_CTX *ctx, int op, int bits,
                break;
                }
        case SSL_SECOP_VERSION:
-               /* SSLv2 allowed only on level zero */
-               if (nid == SSL2_VERSION)
-                       return 0;
                /* SSLv3 not allowed on level 2 */
                if (nid <= SSL3_VERSION && level >= 2)
                        return 0;
@@ -1442,9 +1426,6 @@ static int ssl_security_default_callback(SSL *s, SSL_CTX *ctx, int op, int bits,
                if (level >= 3)
                        return 0;
                break;
-       case SSL_SECOP_SSL2_COMPAT:
-               /* SSLv2 compatible client hello only for level zero */
-               return 0;
        default:
                if (bits < minbits)
                        return 0;