Commit dec95a12 authored by Andy Polyakov's avatar Andy Polyakov
Browse files

Camellia update: make it respect NO_[INLINE_]ASM and typo in assembler.

parent a79b668b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1133,6 +1133,6 @@ my ($s0,$s1,$s2,$s3) = @T;
&function_end("Camellia_cbc_encrypt");
}

&asciz("Camellia for x86 by <appro@openssl.org>");
&asciz("Camellia for x86 by <appro\@openssl.org>");

&asm_finish();
+1 −1
Original line number Diff line number Diff line
@@ -859,7 +859,7 @@ Camellia_cbc_encrypt:
	ret
.size	Camellia_cbc_encrypt,.-Camellia_cbc_encrypt

.asciz	"Camellia for x86_64 by <appro@openssl.org>"
.asciz	"Camellia for x86_64 by <appro\@openssl.org>"
___
}

+23 −2
Original line number Diff line number Diff line
@@ -91,10 +91,24 @@
# if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64))
#  define RightRotate(x, s) _lrotr(x, s)
#  define LeftRotate(x, s)  _lrotl(x, s)
#  if _MSC_VER >= 1400
#   define SWAP(x) _byteswap_ulong(x)
#  else
#   define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)
#  endif
#  define GETU32(p)   SWAP(*((u32 *)(p)))
#  define PUTU32(p,v) (*((u32 *)(p)) = SWAP((v)))
# elif defined(__GNUC__) && __GNUC__>=2
#  if defined(__i386) || defined(__x86_64)
#   define RightRotate(x,s) ({u32 ret; asm ("rorl %1,%0":"=r"(ret):"I"(s),"0"(x):"cc"); ret; })
#   define LeftRotate(x,s)  ({u32 ret; asm ("roll %1,%0":"=r"(ret):"I"(s),"0"(x):"cc"); ret; })
#   if defined(B_ENDIAN) /* stratus.com does it */
#    define GETU32(p)   (*(u32 *)(p))
#    define PUTU32(p,v) (*(u32 *)(p)=(v))
#   else
#    define GETU32(p)   ({u32 r=*(const u32 *)(p); asm("bswapl %0":"=r"(r):"0"(r)); r; })
#    define PUTU32(p,v) ({u32 r=(v); asm("bswapl %0":"=r"(r):"0"(r)); *(u32 *)(p)=r; })
#   endif
#  elif defined(_ARCH_PPC) || defined(_ARCH_PPC64) || \
        defined(__powerpc) || defined(__ppc__) || defined(__powerpc64__)
#   define LeftRotate(x,s)  ({u32 ret; asm ("rlwinm %0,%1,%2,0,31":"=r"(ret):"r"(x),"I"(s)); ret; })
@@ -102,6 +116,8 @@
#  elif defined(__s390x__)
#   define LeftRotate(x,s)  ({u32 ret; asm ("rll %0,%1,%2":"=r"(ret):"r"(x),"I"(s)); ret; })
#   define RightRotate(x,s) LeftRotate(x,(32-s))
#   define GETU32(p)   (*(u32 *)(p))
#   define PUTU32(p,v) (*(u32 *)(p)=(v))
#  endif
# endif
#endif
@@ -111,6 +127,11 @@
# define LeftRotate(x, s)  ( ((x) << (s)) + ((x) >> (32 - s)) )
#endif

#if !defined(GETU32) && !defined(PUTU32)
# define GETU32(p)   (((u32)(p)[0] << 24) ^ ((u32)(p)[1] << 16) ^ ((u32)(p)[2] <<  8) ^ ((u32)(p)[3]))
# define PUTU32(p,v) ((p)[0] = (u8)((v) >> 24), (p)[1] = (u8)((v) >> 16), (p)[2] = (u8)((v) >>  8), (p)[3] = (u8)(v))
#endif

/* S-box data */
#define SBOX1_1110 Camellia_SBOX[0]
#define SBOX4_4404 Camellia_SBOX[1]
+0 −24
Original line number Diff line number Diff line
@@ -71,30 +71,6 @@
typedef unsigned int  u32;
typedef unsigned char u8;

#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64))
# if _MSC_VER >= 1400
#  define SWAP(x) _byteswap_ulong(x)
# else
#  define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)
# endif
# define GETU32(p)   SWAP(*((u32 *)(p)))
# define PUTU32(p,v) (*((u32 *)(p)) = SWAP((v)))
#elif defined(__GNUC__) && __GNUC__>=2 && (defined(__i386) || defined(__x86_64)) && !defined(PEDANTIC)
# if defined(B_ENDIAN) /* stratus.com does it */
#  define GETU32(p)   (*(u32 *)(p))
#  define PUTU32(p,v) (*(u32 *)(p)=(v))
# else
#  define GETU32(p)   ({u32 r=*(const u32 *)(p); asm("bswapl %0":"=r"(r):"0"(r)); r; })
#  define PUTU32(p,v) ({u32 r=(v); asm("bswapl %0":"=r"(r):"0"(r)); *(u32 *)(p)=r; })
# endif
#elif defined(__s390__) || defined(__s390x__)
# define GETU32(p)   (*(u32 *)(p))
# define PUTU32(p,v) (*(u32 *)(p)=(v))
#else
# define GETU32(p)   (((u32)(p)[0] << 24) ^ ((u32)(p)[1] << 16) ^ ((u32)(p)[2] <<  8) ^ ((u32)(p)[3]))
# define PUTU32(p,v) ((p)[0] = (u8)((v) >> 24), (p)[1] = (u8)((v) >> 16), (p)[2] = (u8)((v) >>  8), (p)[3] = (u8)(v))
#endif

int Camellia_Ekeygen(int keyBitLength, const u8 *rawKey, KEY_TABLE_TYPE keyTable);
void Camellia_EncryptBlock_Rounds(int grandRounds, const u8 plaintext[], 
		const KEY_TABLE_TYPE keyTable, u8 ciphertext[]);