Make OPENSSL_NO_COMP compile again.
[openssl.git] / ssl / ssl_ciph.c
index 260ed1fb5eb8d0f0b40378776f504c5b7d37be1e..cdd7a9ae74d682e2d4eb6651a17a46eb482d06ce 100644 (file)
@@ -165,9 +165,7 @@ static const SSL_CIPHER cipher_aliases[]={
        {0,SSL_TXT_HIGH,  0, 0,  SSL_HIGH, 0,0,0,0,SSL_STRONG_MASK},
        };
 
-static int init_ciphers=1;
-
-static void load_ciphers(void)
+void ssl_load_ciphers(void)
        {
        ssl_cipher_methods[SSL_ENC_DES_IDX]= 
                EVP_get_cipherbyname(SN_des_cbc);
@@ -192,9 +190,11 @@ static void load_ciphers(void)
                EVP_get_digestbyname(SN_md5);
        ssl_digest_methods[SSL_MD_SHA1_IDX]=
                EVP_get_digestbyname(SN_sha1);
-       init_ciphers=0;
        }
 
+
+#ifndef OPENSSL_NO_COMP
+
 static int sk_comp_cmp(const SSL_COMP * const *a,
                        const SSL_COMP * const *b)
        {
@@ -234,8 +234,9 @@ static void load_builtin_compressions(void)
                }
        CRYPTO_w_unlock(CRYPTO_LOCK_SSL);
        }
+#endif
 
-int ssl_cipher_get_evp(SSL_SESSION *s, const EVP_CIPHER **enc,
+int ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc,
             const EVP_MD **md, SSL_COMP **comp)
        {
        int i;
@@ -246,8 +247,9 @@ int ssl_cipher_get_evp(SSL_SESSION *s, const EVP_CIPHER **enc,
        if (comp != NULL)
                {
                SSL_COMP ctmp;
-
+#ifndef OPENSSL_NO_COMP
                load_builtin_compressions();
+#endif
 
                *comp=NULL;
                ctmp.id=s->compress_meth;
@@ -740,9 +742,18 @@ static int ssl_cipher_process_rulestr(const char *rule_str,
                        if (!found)
                                break;  /* ignore this entry */
 
-                       algorithms |= ca_list[j]->algorithms;
+                       /* New algorithms:
+                        *  1 - any old restrictions apply outside new mask
+                        *  2 - any new restrictions apply outside old mask
+                        *  3 - enforce old & new where masks intersect
+                        */
+                       algorithms = (algorithms & ~ca_list[j]->mask) |         /* 1 */
+                                    (ca_list[j]->algorithms & ~mask) |         /* 2 */
+                                    (algorithms & ca_list[j]->algorithms);     /* 3 */
                        mask |= ca_list[j]->mask;
-                       algo_strength |= ca_list[j]->algo_strength;
+                       algo_strength = (algo_strength & ~ca_list[j]->mask_strength) |
+                                       (ca_list[j]->algo_strength & ~mask_strength) |
+                                       (algo_strength & ca_list[j]->algo_strength);
                        mask_strength |= ca_list[j]->mask_strength;
 
                        if (!multi) break;
@@ -796,7 +807,7 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *ssl_method,
        {
        int ok, num_of_ciphers, num_of_alias_max, num_of_group_aliases;
        unsigned long disabled_mask;
-       STACK_OF(SSL_CIPHER) *cipherstack;
+       STACK_OF(SSL_CIPHER) *cipherstack, *tmp_cipher_list;
        const char *rule_p;
        CIPHER_ORDER *co_list = NULL, *head = NULL, *tail = NULL, *curr;
        SSL_CIPHER **ca_list = NULL;
@@ -804,14 +815,8 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *ssl_method,
        /*
         * Return with error if nothing to do.
         */
-       if (rule_str == NULL) return(NULL);
-
-       if (init_ciphers)
-               {
-               CRYPTO_w_lock(CRYPTO_LOCK_SSL);
-               if (init_ciphers) load_ciphers();
-               CRYPTO_w_unlock(CRYPTO_LOCK_SSL);
-               }
+       if (rule_str == NULL || cipher_list == NULL || cipher_list_by_id == NULL)
+               return NULL;
 
        /*
         * To reduce the work to do we only want to process the compiled
@@ -911,46 +916,18 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *ssl_method,
                }
        OPENSSL_free(co_list);  /* Not needed any longer */
 
-       /*
-        * The following passage is a little bit odd. If pointer variables
-        * were supplied to hold STACK_OF(SSL_CIPHER) return information,
-        * the old memory pointed to is free()ed. Then, however, the
-        * cipher_list entry will be assigned just a copy of the returned
-        * cipher stack. For cipher_list_by_id a copy of the cipher stack
-        * will be created. See next comment...
-        */
-       if (cipher_list != NULL)
-               {
-               if (*cipher_list != NULL)
-                       sk_SSL_CIPHER_free(*cipher_list);
-               *cipher_list = cipherstack;
-               }
-
-       if (cipher_list_by_id != NULL)
-               {
-               if (*cipher_list_by_id != NULL)
-                       sk_SSL_CIPHER_free(*cipher_list_by_id);
-               *cipher_list_by_id = sk_SSL_CIPHER_dup(cipherstack);
-               }
-
-       /*
-        * Now it is getting really strange. If something failed during
-        * the previous pointer assignment or if one of the pointers was
-        * not requested, the error condition is met. That might be
-        * discussable. The strange thing is however that in this case
-        * the memory "ret" pointed to is "free()ed" and hence the pointer
-        * cipher_list becomes wild. The memory reserved for
-        * cipher_list_by_id however is not "free()ed" and stays intact.
-        */
-       if (    (cipher_list_by_id == NULL) ||
-               (*cipher_list_by_id == NULL) ||
-               (cipher_list == NULL) ||
-               (*cipher_list == NULL))
+       tmp_cipher_list = sk_SSL_CIPHER_dup(cipherstack);
+       if (tmp_cipher_list == NULL)
                {
                sk_SSL_CIPHER_free(cipherstack);
-               return(NULL);
+               return NULL;
                }
-
+       if (*cipher_list != NULL)
+               sk_SSL_CIPHER_free(*cipher_list);
+       *cipher_list = cipherstack;
+       if (*cipher_list_by_id != NULL)
+               sk_SSL_CIPHER_free(*cipher_list_by_id);
+       *cipher_list_by_id = tmp_cipher_list;
        sk_SSL_CIPHER_set_cmp_func(*cipher_list_by_id,ssl_cipher_ptr_id_cmp);
 
        return(cipherstack);
@@ -1108,7 +1085,7 @@ char *SSL_CIPHER_description(SSL_CIPHER *cipher, char *buf, int len)
        return(buf);
        }
 
-char *SSL_CIPHER_get_version(SSL_CIPHER *c)
+char *SSL_CIPHER_get_version(const SSL_CIPHER *c)
        {
        int i;
 
@@ -1123,7 +1100,7 @@ char *SSL_CIPHER_get_version(SSL_CIPHER *c)
        }
 
 /* return the actual cipher being used */
-const char *SSL_CIPHER_get_name(SSL_CIPHER *c)
+const char *SSL_CIPHER_get_name(const SSL_CIPHER *c)
        {
        if (c != NULL)
                return(c->name);
@@ -1131,7 +1108,7 @@ const char *SSL_CIPHER_get_name(SSL_CIPHER *c)
        }
 
 /* number of bits for symmetric cipher */
-int SSL_CIPHER_get_bits(SSL_CIPHER *c, int *alg_bits)
+int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits)
        {
        int ret=0;
 
@@ -1159,6 +1136,21 @@ SSL_COMP *ssl3_comp_find(STACK_OF(SSL_COMP) *sk, int n)
        return(NULL);
        }
 
+#ifdef OPENSSL_NO_COMP
+void *SSL_COMP_get_compression_methods(void)
+       {
+       return NULL;
+       }
+int SSL_COMP_add_compression_method(int id, void *cm)
+       {
+       return 1;
+       }
+
+const char *SSL_COMP_get_name(const void *comp)
+       {
+       return NULL;
+       }
+#else
 STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void)
        {
        load_builtin_compressions();
@@ -1219,3 +1211,4 @@ const char *SSL_COMP_get_name(const COMP_METHOD *comp)
        return NULL;
        }
 
+#endif