From 723b7d81e43100020812ffc9515937fbab87bb3d Mon Sep 17 00:00:00 2001 From: Andy Polyakov Date: Sat, 2 Dec 2006 12:00:27 +0000 Subject: [PATCH] Camellia fixes and improvements from HEAD. --- crypto/camellia/cmll_cbc.c | 106 ++++++++++++++++-------------------- crypto/camellia/cmll_locl.h | 3 - crypto/camellia/cmll_misc.c | 4 +- 3 files changed, 50 insertions(+), 63 deletions(-) diff --git a/crypto/camellia/cmll_cbc.c b/crypto/camellia/cmll_cbc.c index 22c6ebfb05..4141a7b59b 100644 --- a/crypto/camellia/cmll_cbc.c +++ b/crypto/camellia/cmll_cbc.c @@ -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); } } } } - diff --git a/crypto/camellia/cmll_locl.h b/crypto/camellia/cmll_locl.h index 32453462a2..2ac2e95435 100644 --- a/crypto/camellia/cmll_locl.h +++ b/crypto/camellia/cmll_locl.h @@ -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))) diff --git a/crypto/camellia/cmll_misc.c b/crypto/camellia/cmll_misc.c index c9c26e248a..63c7fd63fc 100644 --- a/crypto/camellia/cmll_misc.c +++ b/crypto/camellia/cmll_misc.c @@ -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); -- 2.40.0