summaryrefslogtreecommitdiffstats
path: root/crypto/camellia
diff options
context:
space:
mode:
authorAndy Polyakov <appro@openssl.org>2006-12-02 12:00:27 +0000
committerAndy Polyakov <appro@openssl.org>2006-12-02 12:00:27 +0000
commit723b7d81e43100020812ffc9515937fbab87bb3d (patch)
treedbd7b7254c702171d95d1d45236270be2bb6b045 /crypto/camellia
parenta3ddd7358b51a02b89ee11ae3a5d895480418f8a (diff)
Camellia fixes and improvements from HEAD.
Diffstat (limited to 'crypto/camellia')
-rw-r--r--crypto/camellia/cmll_cbc.c106
-rw-r--r--crypto/camellia/cmll_locl.h3
-rw-r--r--crypto/camellia/cmll_misc.c4
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);