Allow 32-bit perl to generate x86_64 assembler.
[oweals/openssl.git] / crypto / camellia / cmll_misc.c
index 8edead8db8456bd9559061345d53e9f40587dddb..f1047b54e03b427981156f338eb40700c48bd9c4 100644 (file)
 #include <openssl/camellia.h>
 #include "cmll_locl.h"
 
- const char *CAMELLIA_version="CAMELLIA" OPENSSL_VERSION_PTEXT;
+const char CAMELLIA_version[]="CAMELLIA" OPENSSL_VERSION_PTEXT;
 
 int Camellia_set_key(const unsigned char *userKey, const int bits,
        CAMELLIA_KEY *key)
        {
-       if(!userKey || !key)
+       if (!userKey || !key)
+               {
                return -1;
-       if(bits != 128 && bits != 192 && bits != 256)
+               }
+       
+       switch(bits)
+               {
+       case 128:
+               camellia_setup128(userKey, (unsigned int *)key->rd_key);
+               key->enc = camellia_encrypt128;
+               key->dec = camellia_decrypt128;
+               break;
+       case 192:
+               camellia_setup192(userKey, (unsigned int *)key->rd_key);
+               key->enc = camellia_encrypt256;
+               key->dec = camellia_decrypt256;
+               break;
+       case 256:
+               camellia_setup256(userKey, (unsigned int *)key->rd_key);
+               key->enc = camellia_encrypt256;
+               key->dec = camellia_decrypt256;
+               break;
+       default:
                return -2;
-       Camellia_Ekeygen(bits , userKey, key->rd_key);
+               }
+       
        key->bitLength = bits;
        return 0;
        }
@@ -70,12 +91,26 @@ int Camellia_set_key(const unsigned char *userKey, const int bits,
 void Camellia_encrypt(const unsigned char *in, unsigned char *out,
        const CAMELLIA_KEY *key)
        {
-       Camellia_EncryptBlock(key->bitLength, in , key->rd_key , out);
+       u32 tmp[CAMELLIA_BLOCK_SIZE/sizeof(u32)];
+       const union { long one; char little; } camellia_endian = {1};
+
+       memcpy(tmp, in, CAMELLIA_BLOCK_SIZE);
+       if (camellia_endian.little) SWAP4WORD(tmp);
+       key->enc(key->rd_key, tmp);
+       if (camellia_endian.little) SWAP4WORD(tmp);
+       memcpy(out, tmp, CAMELLIA_BLOCK_SIZE);
        }
 
 void Camellia_decrypt(const unsigned char *in, unsigned char *out,
        const CAMELLIA_KEY *key)
        {
-       Camellia_DecryptBlock(key->bitLength, in , key->rd_key , out);
+       u32 tmp[CAMELLIA_BLOCK_SIZE/sizeof(u32)];
+       const union { long one; char little; } camellia_endian = {1};
+
+       memcpy(tmp, in, CAMELLIA_BLOCK_SIZE);
+       if (camellia_endian.little) SWAP4WORD(tmp);
+       key->dec(key->rd_key, tmp);
+       if (camellia_endian.little) SWAP4WORD(tmp);
+       memcpy(out, tmp, CAMELLIA_BLOCK_SIZE);
        }