Because of recent reductions in header interdependencies, these files need
[openssl.git] / crypto / des / str2key.c
index 76b002a0f7ade5e640b67cce23198e0f3afa4387..9c2054bda6b9da92351d3d1a37dac671dcf0c25b 100644 (file)
  */
 
 #include "des_locl.h"
+#include <openssl/crypto.h>
 
-EXTERN int des_check_key;
-
-void des_string_to_key(const char *str, des_cblock key)
+void DES_string_to_key(const char *str, DES_cblock *key)
        {
-       des_key_schedule ks;
+       DES_key_schedule ks;
        int i,length;
        register unsigned char j;
 
@@ -70,36 +69,39 @@ void des_string_to_key(const char *str, des_cblock key)
        length=strlen(str);
 #ifdef OLD_STR_TO_KEY
        for (i=0; i<length; i++)
-               key[i%8]^=(str[i]<<1);
+               (*key)[i%8]^=(str[i]<<1);
 #else /* MIT COMPATIBLE */
        for (i=0; i<length; i++)
                {
                j=str[i];
                if ((i%16) < 8)
-                       key[i%8]^=(j<<1);
+                       (*key)[i%8]^=(j<<1);
                else
                        {
                        /* Reverse the bit order 05/05/92 eay */
                        j=((j<<4)&0xf0)|((j>>4)&0x0f);
                        j=((j<<2)&0xcc)|((j>>2)&0x33);
                        j=((j<<1)&0xaa)|((j>>1)&0x55);
-                       key[7-(i%8)]^=j;
+                       (*key)[7-(i%8)]^=j;
                        }
                }
 #endif
-       des_set_odd_parity(key);
-       i=des_check_key;
-       des_check_key=0;
-       des_set_key(key,ks);
-       des_check_key=i;
-       des_cbc_cksum((unsigned char*)str,key,length,ks,key);
-       memset(ks,0,sizeof(ks));
-       des_set_odd_parity(key);
+       DES_set_odd_parity(key);
+#ifdef EXPERIMENTAL_STR_TO_STRONG_KEY
+       if(DES_is_weak_key(key))
+           (*key)[7] ^= 0xF0;
+       DES_set_key(key,&ks);
+#else
+       DES_set_key_unchecked(key,&ks);
+#endif
+       DES_cbc_cksum((const unsigned char*)str,key,length,&ks,key);
+       OPENSSL_cleanse(&ks,sizeof(ks));
+       DES_set_odd_parity(key);
        }
 
-void des_string_to_2keys(const char *str, des_cblock key1, des_cblock key2)
+void DES_string_to_2keys(const char *str, DES_cblock *key1, DES_cblock *key2)
        {
-       des_key_schedule ks;
+       DES_key_schedule ks;
        int i,length;
        register unsigned char j;
 
@@ -111,7 +113,7 @@ void des_string_to_2keys(const char *str, des_cblock key1, des_cblock key2)
                {
                for (i=0; i<length; i++)
                        {
-                       key2[i]=key1[i]=(str[i]<<1);
+                       (*key2)[i]=(*key1)[i]=(str[i]<<1);
                        }
                }
        else
@@ -119,9 +121,9 @@ void des_string_to_2keys(const char *str, des_cblock key1, des_cblock key2)
                for (i=0; i<length; i++)
                        {
                        if ((i/8)&1)
-                               key2[i%8]^=(str[i]<<1);
+                               (*key2)[i%8]^=(str[i]<<1);
                        else
-                               key1[i%8]^=(str[i]<<1);
+                               (*key1)[i%8]^=(str[i]<<1);
                        }
                }
 #else /* MIT COMPATIBLE */
@@ -131,9 +133,9 @@ void des_string_to_2keys(const char *str, des_cblock key1, des_cblock key2)
                if ((i%32) < 16)
                        {
                        if ((i%16) < 8)
-                               key1[i%8]^=(j<<1);
+                               (*key1)[i%8]^=(j<<1);
                        else
-                               key2[i%8]^=(j<<1);
+                               (*key2)[i%8]^=(j<<1);
                        }
                else
                        {
@@ -141,23 +143,32 @@ void des_string_to_2keys(const char *str, des_cblock key1, des_cblock key2)
                        j=((j<<2)&0xcc)|((j>>2)&0x33);
                        j=((j<<1)&0xaa)|((j>>1)&0x55);
                        if ((i%16) < 8)
-                               key1[7-(i%8)]^=j;
+                               (*key1)[7-(i%8)]^=j;
                        else
-                               key2[7-(i%8)]^=j;
+                               (*key2)[7-(i%8)]^=j;
                        }
                }
        if (length <= 8) memcpy(key2,key1,8);
 #endif
-       des_set_odd_parity(key1);
-       des_set_odd_parity(key2);
-       i=des_check_key;
-       des_check_key=0;
-       des_set_key(key1,ks);
-       des_cbc_cksum((unsigned char*)str,key1,length,ks,key1);
-       des_set_key(key2,ks);
-       des_cbc_cksum((unsigned char*)str,key2,length,ks,key2);
-       des_check_key=i;
-       memset(ks,0,sizeof(ks));
-       des_set_odd_parity(key1);
-       des_set_odd_parity(key2);
+       DES_set_odd_parity(key1);
+       DES_set_odd_parity(key2);
+#ifdef EXPERIMENTAL_STR_TO_STRONG_KEY
+       if(DES_is_weak_key(key1))
+           (*key1)[7] ^= 0xF0;
+       DES_set_key(key1,&ks);
+#else
+       DES_set_key_unchecked(key1,&ks);
+#endif
+       DES_cbc_cksum((const unsigned char*)str,key1,length,&ks,key1);
+#ifdef EXPERIMENTAL_STR_TO_STRONG_KEY
+       if(DES_is_weak_key(key2))
+           (*key2)[7] ^= 0xF0;
+       DES_set_key(key2,&ks);
+#else
+       DES_set_key_unchecked(key2,&ks);
+#endif
+       DES_cbc_cksum((const unsigned char*)str,key2,length,&ks,key2);
+       OPENSSL_cleanse(&ks,sizeof(ks));
+       DES_set_odd_parity(key1);
+       DES_set_odd_parity(key2);
        }