Commit 723b7d81 authored by Andy Polyakov's avatar Andy Polyakov
Browse files

Camellia fixes and improvements from HEAD.

parent a3ddd735
Loading
Loading
Loading
Loading
+48 −58
Original line number Diff line number Diff line
@@ -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);
				}
			}
		}
}
+0 −3
Original line number Diff line number Diff line
@@ -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)))
+2 −2
Original line number Diff line number Diff line
@@ -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);