Separate client and server permitted signature algorithm support: by default
[openssl.git] / ssl / ssl_cert.c
index 784300e26a6401e1976a7c953acfeb90599529c5..1edbf18f3b7ece36e59a2d3f067b7c26b0ff8b27 100644 (file)
@@ -160,18 +160,18 @@ int SSL_get_ex_data_X509_STORE_CTX_idx(void)
        return ssl_x509_store_ctx_idx;
        }
 
-static void ssl_cert_set_default_md(CERT *cert)
+void ssl_cert_set_default_md(CERT *cert)
        {
        /* Set digest values to defaults */
 #ifndef OPENSSL_NO_DSA
-       cert->pkeys[SSL_PKEY_DSA_SIGN].digest = EVP_dss1();
+       cert->pkeys[SSL_PKEY_DSA_SIGN].digest = EVP_sha1();
 #endif
 #ifndef OPENSSL_NO_RSA
        cert->pkeys[SSL_PKEY_RSA_SIGN].digest = EVP_sha1();
        cert->pkeys[SSL_PKEY_RSA_ENC].digest = EVP_sha1();
 #endif
 #ifndef OPENSSL_NO_ECDSA
-       cert->pkeys[SSL_PKEY_ECC].digest = EVP_ecdsa();
+       cert->pkeys[SSL_PKEY_ECC].digest = EVP_sha1();
 #endif
        }
 
@@ -334,6 +334,23 @@ CERT *ssl_cert_dup(CERT *cert)
                                CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509);
                                }
                        }
+               rpk->valid_flags = 0;
+                if (cert->pkeys[i].authz != NULL)
+                       {
+                       /* Just copy everything. */
+                       ret->pkeys[i].authz_length =
+                               cert->pkeys[i].authz_length;
+                       ret->pkeys[i].authz =
+                               OPENSSL_malloc(ret->pkeys[i].authz_length);
+                       if (ret->pkeys[i].authz == NULL)
+                               {
+                               SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_MALLOC_FAILURE);
+                               return(NULL);
+                               }
+                       memcpy(ret->pkeys[i].authz,
+                              cert->pkeys[i].authz,
+                              cert->pkeys[i].authz_length);
+                       }
                }
        
        ret->references=1;
@@ -341,9 +358,38 @@ CERT *ssl_cert_dup(CERT *cert)
         * will be set during handshake.
         */
        ssl_cert_set_default_md(ret);
-       /* Sigalgs set to NULL as we get these from handshake too */
-       ret->sigalgs = NULL;
-       ret->sigalgslen = 0;
+       /* Peer sigalgs set to NULL as we get these from handshake too */
+       ret->peer_sigalgs = NULL;
+       ret->peer_sigalgslen = 0;
+       /* Configured sigalgs however we copy across */
+
+       if (cert->conf_sigalgs)
+               {
+               ret->conf_sigalgs = OPENSSL_malloc(cert->conf_sigalgslen);
+               if (!ret->conf_sigalgs)
+                       goto err;
+               memcpy(ret->conf_sigalgs, cert->conf_sigalgs,
+                                               cert->conf_sigalgslen);
+               ret->conf_sigalgslen = cert->conf_sigalgslen;
+               }
+       else
+               ret->conf_sigalgs = NULL;
+
+       if (cert->client_sigalgs)
+               {
+               ret->client_sigalgs = OPENSSL_malloc(cert->client_sigalgslen);
+               if (!ret->client_sigalgs)
+                       goto err;
+               memcpy(ret->client_sigalgs, cert->client_sigalgs,
+                                               cert->client_sigalgslen);
+               ret->client_sigalgslen = cert->client_sigalgslen;
+               }
+       else
+               ret->client_sigalgs = NULL;
+       /* Shared sigalgs also NULL */
+       ret->shared_sigalgs = NULL;
+
+       ret->cert_flags = cert->cert_flags;
 
        ret->cert_cb = cert->cert_cb;
        ret->cert_cb_arg = cert->cert_cb_arg;
@@ -376,6 +422,8 @@ err:
 void ssl_cert_clear_certs(CERT *c)
        {
        int i;
+       if (c == NULL)
+               return;
        for (i = 0; i<SSL_PKEY_NUM; i++)
                {
                CERT_PKEY *cpk = c->pkeys + i;
@@ -394,6 +442,11 @@ void ssl_cert_clear_certs(CERT *c)
                        sk_X509_pop_free(cpk->chain, X509_free);
                        cpk->chain = NULL;
                        }
+#ifndef OPENSSL_NO_TLSEXT
+                if (cpk->authz != NULL)
+                       OPENSSL_free(cpk->authz);
+#endif
+               cpk->valid_flags = 0;
                }
        }
 
@@ -428,9 +481,14 @@ void ssl_cert_free(CERT *c)
 #endif
 
        ssl_cert_clear_certs(c);
-
-       if (c->sigalgs)
-               OPENSSL_free(c->sigalgs);
+       if (c->peer_sigalgs)
+               OPENSSL_free(c->peer_sigalgs);
+       if (c->conf_sigalgs)
+               OPENSSL_free(c->conf_sigalgs);
+       if (c->client_sigalgs)
+               OPENSSL_free(c->client_sigalgs);
+       if (c->shared_sigalgs)
+               OPENSSL_free(c->shared_sigalgs);
        OPENSSL_free(c);
        }