Camellia fixes and improvements from HEAD.
authorAndy Polyakov <appro@openssl.org>
Sat, 2 Dec 2006 12:00:27 +0000 (12:00 +0000)
committerAndy Polyakov <appro@openssl.org>
Sat, 2 Dec 2006 12:00:27 +0000 (12:00 +0000)
crypto/camellia/cmll_cbc.c
crypto/camellia/cmll_locl.h
crypto/camellia/cmll_misc.c

index 22c6ebfb058ce2e4eeaa5214561918cc7607897a..4141a7b59bb733522af648452d359e4ac7402db7 100644 (file)
@@ -67,18 +67,16 @@ void Camellia_cbc_encrypt(const unsigned char *in, unsigned char *out,
 
        unsigned long n;
        unsigned long len = length;
-       unsigned char tmp[CAMELLIA_BLOCK_SIZE];
        const unsigned char *iv = ivec;
-       u32 t32[UNITSIZE];
+       union { u32 t32[CAMELLIA_BLOCK_SIZE/sizeof(u32)];
+               u8  t8 [CAMELLIA_BLOCK_SIZE]; } tmp;
        const union { long one; char little; } camellia_endian = {1};
 
 
        assert(in && out && key && ivec);
        assert((CAMELLIA_ENCRYPT == enc)||(CAMELLIA_DECRYPT == enc));
 
-       if(((size_t)in) % ALIGN == 0
-               && ((size_t)out) % ALIGN == 0
-               && ((size_t)ivec) % ALIGN == 0)
+       if(((size_t)in|(size_t)out|(size_t)ivec) % sizeof(u32) == 0)
                {
                if (CAMELLIA_ENCRYPT == enc)
                        {
@@ -129,14 +127,14 @@ void Camellia_cbc_encrypt(const unsigned char *in, unsigned char *out,
                                }
                        if (len)
                                {
-                               memcpy(tmp, in, CAMELLIA_BLOCK_SIZE);
+                               memcpy(tmp.t8, in, CAMELLIA_BLOCK_SIZE);
                                if (camellia_endian.little)
-                                       SWAP4WORD((u32 *)tmp);
-                               key->dec(key->rd_key, (u32 *)tmp);
+                                       SWAP4WORD(tmp.t32);
+                               key->dec(key->rd_key, tmp.t32);
                                if (camellia_endian.little)
-                                       SWAP4WORD((u32 *)tmp);
+                                       SWAP4WORD(tmp.t32);
                                for(n=0; n < len; ++n)
-                                       out[n] = tmp[n] ^ iv[n];
+                                       out[n] = tmp.t8[n] ^ iv[n];
                                iv = in;
                                }
                        memcpy(ivec,iv,CAMELLIA_BLOCK_SIZE);
@@ -145,21 +143,21 @@ void Camellia_cbc_encrypt(const unsigned char *in, unsigned char *out,
                        {
                        while (len >= CAMELLIA_BLOCK_SIZE)
                                {
-                               memcpy(tmp, in, CAMELLIA_BLOCK_SIZE);
+                               memcpy(tmp.t8, in, CAMELLIA_BLOCK_SIZE);
                                if (camellia_endian.little)
                                        SWAP4WORD((u32 *)out);
                                key->dec(key->rd_key, (u32 *)out);
                                if (camellia_endian.little)
                                        SWAP4WORD((u32 *)out);
                                XOR4WORD((u32 *)out, (u32 *)ivec);
-                               memcpy(ivec, tmp, CAMELLIA_BLOCK_SIZE);
+                               memcpy(ivec, tmp.t8, CAMELLIA_BLOCK_SIZE);
                                len -= CAMELLIA_BLOCK_SIZE;
                                in += CAMELLIA_BLOCK_SIZE;
                                out += CAMELLIA_BLOCK_SIZE;
                                }
                        if (len)
                                {
-                               memcpy(tmp, in, CAMELLIA_BLOCK_SIZE);
+                               memcpy(tmp.t8, in, CAMELLIA_BLOCK_SIZE);
                                if (camellia_endian.little)
                                        SWAP4WORD((u32 *)out);
                                key->dec(key->rd_key,(u32 *)out);
@@ -168,8 +166,8 @@ void Camellia_cbc_encrypt(const unsigned char *in, unsigned char *out,
                                for(n=0; n < len; ++n)
                                        out[n] ^= ivec[n];
                                for(n=len; n < CAMELLIA_BLOCK_SIZE; ++n)
-                                       out[n] = tmp[n];
-                               memcpy(ivec, tmp, CAMELLIA_BLOCK_SIZE);
+                                       out[n] = tmp.t8[n];
+                               memcpy(ivec, tmp.t8, CAMELLIA_BLOCK_SIZE);
                                }
                        }
                }
@@ -180,14 +178,13 @@ void Camellia_cbc_encrypt(const unsigned char *in, unsigned char *out,
                        while (len >= CAMELLIA_BLOCK_SIZE)
                                {
                                for(n=0; n < CAMELLIA_BLOCK_SIZE; ++n)
-                                       out[n] = in[n] ^ iv[n];
-                               memcpy(t32, out, CAMELLIA_BLOCK_SIZE);
+                                       tmp.t8[n] = in[n] ^ iv[n];
                                if (camellia_endian.little)
-                                       SWAP4WORD(t32);
-                               key->enc(key->rd_key, t32);
+                                       SWAP4WORD(tmp.t32);
+                               key->enc(key->rd_key, tmp.t32);
                                if (camellia_endian.little)
-                                       SWAP4WORD(t32);
-                               memcpy(out, t32, CAMELLIA_BLOCK_SIZE);
+                                       SWAP4WORD(tmp.t32);
+                               memcpy(out, tmp.t8, CAMELLIA_BLOCK_SIZE);
                                iv = out;
                                len -= CAMELLIA_BLOCK_SIZE;
                                in += CAMELLIA_BLOCK_SIZE;
@@ -196,14 +193,15 @@ void Camellia_cbc_encrypt(const unsigned char *in, unsigned char *out,
                        if (len)
                                {
                                for(n=0; n < len; ++n)
-                                       out[n] = in[n] ^ iv[n];
+                                       tmp.t8[n] = in[n] ^ iv[n];
                                for(n=len; n < CAMELLIA_BLOCK_SIZE; ++n)
-                                       out[n] = iv[n];
+                                       tmp.t8[n] = iv[n];
                                if (camellia_endian.little)
-                                       SWAP4WORD((u32 *)out);
-                               key->enc(key->rd_key, (u32 *)out);
+                                       SWAP4WORD(tmp.t32);
+                               key->enc(key->rd_key, tmp.t32);
                                if (camellia_endian.little)
-                                       SWAP4WORD((u32 *)out);
+                                       SWAP4WORD(tmp.t32);
+                               memcpy(out, tmp.t8, CAMELLIA_BLOCK_SIZE);
                                iv = out;
                                }
                        memcpy(ivec,iv,CAMELLIA_BLOCK_SIZE);
@@ -212,15 +210,14 @@ void Camellia_cbc_encrypt(const unsigned char *in, unsigned char *out,
                        {
                        while (len >= CAMELLIA_BLOCK_SIZE)
                                {
-                               memcpy(t32,in,CAMELLIA_BLOCK_SIZE);
+                               memcpy(tmp.t8,in,CAMELLIA_BLOCK_SIZE);
                                if (camellia_endian.little)
-                                       SWAP4WORD(t32);
-                               key->dec(key->rd_key,t32);
+                                       SWAP4WORD(tmp.t32);
+                               key->dec(key->rd_key,tmp.t32);
                                if (camellia_endian.little)
-                                       SWAP4WORD(t32);
-                               memcpy(out,t32,CAMELLIA_BLOCK_SIZE);
+                                       SWAP4WORD(tmp.t32);
                                for(n=0; n < CAMELLIA_BLOCK_SIZE; ++n)
-                                       out[n] ^= iv[n];
+                                       out[n] = tmp.t8[n] ^ iv[n];
                                iv = in;
                                len -= CAMELLIA_BLOCK_SIZE;
                                in  += CAMELLIA_BLOCK_SIZE;
@@ -228,16 +225,14 @@ void Camellia_cbc_encrypt(const unsigned char *in, unsigned char *out,
                                }
                        if (len)
                                {
-                               memcpy(tmp, in, CAMELLIA_BLOCK_SIZE);
-                               memcpy(t32, in, CAMELLIA_BLOCK_SIZE);
+                               memcpy(tmp.t8, in, CAMELLIA_BLOCK_SIZE);
                                if (camellia_endian.little)
-                                       SWAP4WORD(t32);
-                               key->dec(key->rd_key, t32);
+                                       SWAP4WORD(tmp.t32);
+                               key->dec(key->rd_key, tmp.t32);
                                if (camellia_endian.little)
-                                       SWAP4WORD(t32);
-                               memcpy(out, t32, CAMELLIA_BLOCK_SIZE);
+                                       SWAP4WORD(tmp.t32);
                                for(n=0; n < len; ++n)
-                                       out[n] = tmp[n] ^ iv[n];
+                                       out[n] = tmp.t8[n] ^ iv[n];
                                iv = in;
                                }
                        memcpy(ivec,iv,CAMELLIA_BLOCK_SIZE);
@@ -246,38 +241,33 @@ void Camellia_cbc_encrypt(const unsigned char *in, unsigned char *out,
                        {
                        while (len >= CAMELLIA_BLOCK_SIZE)
                                {
-                               memcpy(tmp, in, CAMELLIA_BLOCK_SIZE);
-                               memcpy(t32, in, CAMELLIA_BLOCK_SIZE);
+                               memcpy(tmp.t8, in, CAMELLIA_BLOCK_SIZE);
                                if (camellia_endian.little)
-                                       SWAP4WORD(t32);
-                               key->dec(key->rd_key, t32);
+                                       SWAP4WORD(tmp.t32);
+                               key->dec(key->rd_key, tmp.t32);
                                if (camellia_endian.little)
-                                       SWAP4WORD(t32);
-                               memcpy(out, t32, CAMELLIA_BLOCK_SIZE);
+                                       SWAP4WORD(tmp.t32);
                                for(n=0; n < CAMELLIA_BLOCK_SIZE; ++n)
-                                       out[n] ^= ivec[n];
-                               memcpy(ivec, tmp, CAMELLIA_BLOCK_SIZE);
+                                       tmp.t8[n] ^= ivec[n];
+                               memcpy(ivec, in, CAMELLIA_BLOCK_SIZE);
+                               memcpy(out, tmp.t8, CAMELLIA_BLOCK_SIZE);
                                len -= CAMELLIA_BLOCK_SIZE;
                                in += CAMELLIA_BLOCK_SIZE;
                                out += CAMELLIA_BLOCK_SIZE;
                                }
                        if (len)
                                {
-                               memcpy(tmp, in, CAMELLIA_BLOCK_SIZE);
-                               memcpy(t32, in, CAMELLIA_BLOCK_SIZE);
+                               memcpy(tmp.t8, in, CAMELLIA_BLOCK_SIZE);
                                if (camellia_endian.little)
-                                       SWAP4WORD(t32);
-                               key->dec(key->rd_key,t32);
+                                       SWAP4WORD(tmp.t32);
+                               key->dec(key->rd_key,tmp.t32);
                                if (camellia_endian.little)
-                                       SWAP4WORD(t32);
-                               memcpy(out, t32, CAMELLIA_BLOCK_SIZE);
+                                       SWAP4WORD(tmp.t32);
                                for(n=0; n < len; ++n)
-                                       out[n] ^= ivec[n];
-                               for(n=len; n < CAMELLIA_BLOCK_SIZE; ++n)
-                                       out[n] = tmp[n];
-                               memcpy(ivec, tmp, CAMELLIA_BLOCK_SIZE);
+                                       tmp.t8[n] ^= ivec[n];
+                               memcpy(ivec, in, CAMELLIA_BLOCK_SIZE);
+                               memcpy(out,tmp.t8,len);
                                }
                        }
                }
 }
-
index 32453462a2c7940f2bca19ba0fbbc11e103a16f0..2ac2e95435713aa338e2b2f51bfd9f81cdabb913 100644 (file)
@@ -80,9 +80,6 @@ typedef unsigned int u32;
 extern "C" {
 #endif
 
-#define ALIGN 4
-#define UNITSIZE 4
-
 #if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64))
 # define SWAP(x) ( _lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00 )
 # define GETU32(p) SWAP(*((u32 *)(p)))
index c9c26e248ac2f01e5f5ffc941b932028818327ab..63c7fd63fc4676b0d77f15446a9cdcbf6609ff8c 100644 (file)
@@ -91,7 +91,7 @@ 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)
        {
-       u32 tmp[UNITSIZE];
+       u32 tmp[CAMELLIA_BLOCK_SIZE/sizeof(u32)];
        const union { long one; char little; } camellia_endian = {1};
 
        memcpy(tmp, in, CAMELLIA_BLOCK_SIZE);
@@ -104,7 +104,7 @@ void Camellia_encrypt(const unsigned char *in, unsigned char *out,
 void Camellia_decrypt(const unsigned char *in, unsigned char *out,
        const CAMELLIA_KEY *key)
        {
-       u32 tmp[UNITSIZE];
+       u32 tmp[CAMELLIA_BLOCK_SIZE/sizeof(u32)];
        const union { long one; char little; } camellia_endian = {1};
 
        memcpy(tmp, in, CAMELLIA_BLOCK_SIZE);