Run util/openssl-format-source -v -c .
[openssl.git] / crypto / camellia / camellia.c
1 /* crypto/camellia/camellia.c -*- mode:C; c-file-style: "eay" -*- */
2 /* ====================================================================
3  * Copyright 2006 NTT (Nippon Telegraph and Telephone Corporation) .
4  * ALL RIGHTS RESERVED.
5  *
6  * Intellectual Property information for Camellia:
7  *     http://info.isl.ntt.co.jp/crypt/eng/info/chiteki.html
8  *
9  * News Release for Announcement of Camellia open source:
10  *     http://www.ntt.co.jp/news/news06e/0604/060413a.html
11  *
12  * The Camellia Code included herein is developed by
13  * NTT (Nippon Telegraph and Telephone Corporation), and is contributed
14  * to the OpenSSL project.
15  *
16  * The Camellia Code is licensed pursuant to the OpenSSL open source
17  * license provided below.
18  */
19 /* ====================================================================
20  * Copyright (c) 2006 The OpenSSL Project.  All rights reserved.
21  *
22  * Redistribution and use in source and binary forms, with or without
23  * modification, are permitted provided that the following conditions
24  * are met:
25  *
26  * 1. Redistributions of source code must retain the above copyright
27  *    notice, this list of conditions and the following disclaimer.
28  *
29  * 2. Redistributions in binary form must reproduce the above copyright
30  *    notice, this list of conditions and the following disclaimer in
31  *    the documentation and/or other materials provided with the
32  *    distribution.
33  *
34  * 3. All advertising materials mentioning features or use of this
35  *    software must display the following acknowledgment:
36  *    "This product includes software developed by the OpenSSL Project
37  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
38  *
39  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
40  *    endorse or promote products derived from this software without
41  *    prior written permission. For written permission, please contact
42  *    openssl-core@openssl.org.
43  *
44  * 5. Products derived from this software may not be called "OpenSSL"
45  *    nor may "OpenSSL" appear in their names without prior written
46  *    permission of the OpenSSL Project.
47  *
48  * 6. Redistributions of any form whatsoever must retain the following
49  *    acknowledgment:
50  *    "This product includes software developed by the OpenSSL Project
51  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
52  *
53  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
54  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
55  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
56  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
57  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
58  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
59  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
60  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
61  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
62  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
63  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
64  * OF THE POSSIBILITY OF SUCH DAMAGE.
65  * ====================================================================
66  */
67
68 /*
69  * Algorithm Specification
70  * http://info.isl.llia/specicrypt/eng/camellia/specifications.html
71  */
72
73 /*
74  * This release balances code size and performance. In particular key
75  * schedule setup is fully unrolled, because doing so *significantly*
76  * reduces amount of instructions per setup round and code increase is
77  * justifiable. In block functions on the other hand only inner loops
78  * are unrolled, as full unroll gives only nominal performance boost,
79  * while code size grows 4 or 7 times. Also, unlike previous versions
80  * this one "encourages" compiler to keep intermediate variables in
81  * registers, which should give better "all round" results, in other
82  * words reasonable performance even with not so modern compilers.
83  */
84
85 #include "camellia.h"
86 #include "cmll_locl.h"
87 #include <string.h>
88 #include <stdlib.h>
89
90 /* 32-bit rotations */
91 #if !defined(PEDANTIC) && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
92 # if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64))
93 #  define RightRotate(x, s) _lrotr(x, s)
94 #  define LeftRotate(x, s)  _lrotl(x, s)
95 #  if _MSC_VER >= 1400
96 #   define SWAP(x) _byteswap_ulong(x)
97 #  else
98 #   define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)
99 #  endif
100 #  define GETU32(p)   SWAP(*((u32 *)(p)))
101 #  define PUTU32(p,v) (*((u32 *)(p)) = SWAP((v)))
102 # elif defined(__GNUC__) && __GNUC__>=2
103 #  if defined(__i386) || defined(__x86_64)
104 #   define RightRotate(x,s) ({u32 ret; asm ("rorl %1,%0":"=r"(ret):"I"(s),"0"(x):"cc"); ret; })
105 #   define LeftRotate(x,s)  ({u32 ret; asm ("roll %1,%0":"=r"(ret):"I"(s),"0"(x):"cc"); ret; })
106 #   if defined(B_ENDIAN)        /* stratus.com does it */
107 #    define GETU32(p)   (*(u32 *)(p))
108 #    define PUTU32(p,v) (*(u32 *)(p)=(v))
109 #   else
110 #    define GETU32(p)   ({u32 r=*(const u32 *)(p); asm("bswapl %0":"=r"(r):"0"(r)); r; })
111 #    define PUTU32(p,v) ({u32 r=(v); asm("bswapl %0":"=r"(r):"0"(r)); *(u32 *)(p)=r; })
112 #   endif
113 #  elif defined(_ARCH_PPC) || defined(_ARCH_PPC64) || \
114         defined(__powerpc) || defined(__ppc__) || defined(__powerpc64__)
115 #   define LeftRotate(x,s)  ({u32 ret; asm ("rlwinm %0,%1,%2,0,31":"=r"(ret):"r"(x),"I"(s)); ret; })
116 #   define RightRotate(x,s) LeftRotate(x,(32-s))
117 #  elif defined(__s390x__)
118 #   define LeftRotate(x,s)  ({u32 ret; asm ("rll %0,%1,%2":"=r"(ret):"r"(x),"I"(s)); ret; })
119 #   define RightRotate(x,s) LeftRotate(x,(32-s))
120 #   define GETU32(p)   (*(u32 *)(p))
121 #   define PUTU32(p,v) (*(u32 *)(p)=(v))
122 #  endif
123 # endif
124 #endif
125
126 #if !defined(RightRotate) && !defined(LeftRotate)
127 # define RightRotate(x, s) ( ((x) >> (s)) + ((x) << (32 - s)) )
128 # define LeftRotate(x, s)  ( ((x) << (s)) + ((x) >> (32 - s)) )
129 #endif
130
131 #if !defined(GETU32) && !defined(PUTU32)
132 # define GETU32(p)   (((u32)(p)[0] << 24) ^ ((u32)(p)[1] << 16) ^ ((u32)(p)[2] <<  8) ^ ((u32)(p)[3]))
133 # define PUTU32(p,v) ((p)[0] = (u8)((v) >> 24), (p)[1] = (u8)((v) >> 16), (p)[2] = (u8)((v) >>  8), (p)[3] = (u8)(v))
134 #endif
135
136 /* S-box data */
137 #define SBOX1_1110 Camellia_SBOX[0]
138 #define SBOX4_4404 Camellia_SBOX[1]
139 #define SBOX2_0222 Camellia_SBOX[2]
140 #define SBOX3_3033 Camellia_SBOX[3]
141 static const u32 Camellia_SBOX[][256] = {
142     {0x70707000, 0x82828200, 0x2c2c2c00, 0xececec00, 0xb3b3b300, 0x27272700,
143      0xc0c0c000, 0xe5e5e500, 0xe4e4e400, 0x85858500, 0x57575700, 0x35353500,
144      0xeaeaea00, 0x0c0c0c00, 0xaeaeae00, 0x41414100, 0x23232300, 0xefefef00,
145      0x6b6b6b00, 0x93939300, 0x45454500, 0x19191900, 0xa5a5a500, 0x21212100,
146      0xededed00, 0x0e0e0e00, 0x4f4f4f00, 0x4e4e4e00, 0x1d1d1d00, 0x65656500,
147      0x92929200, 0xbdbdbd00, 0x86868600, 0xb8b8b800, 0xafafaf00, 0x8f8f8f00,
148      0x7c7c7c00, 0xebebeb00, 0x1f1f1f00, 0xcecece00, 0x3e3e3e00, 0x30303000,
149      0xdcdcdc00, 0x5f5f5f00, 0x5e5e5e00, 0xc5c5c500, 0x0b0b0b00, 0x1a1a1a00,
150      0xa6a6a600, 0xe1e1e100, 0x39393900, 0xcacaca00, 0xd5d5d500, 0x47474700,
151      0x5d5d5d00, 0x3d3d3d00, 0xd9d9d900, 0x01010100, 0x5a5a5a00, 0xd6d6d600,
152      0x51515100, 0x56565600, 0x6c6c6c00, 0x4d4d4d00, 0x8b8b8b00, 0x0d0d0d00,
153      0x9a9a9a00, 0x66666600, 0xfbfbfb00, 0xcccccc00, 0xb0b0b000, 0x2d2d2d00,
154      0x74747400, 0x12121200, 0x2b2b2b00, 0x20202000, 0xf0f0f000, 0xb1b1b100,
155      0x84848400, 0x99999900, 0xdfdfdf00, 0x4c4c4c00, 0xcbcbcb00, 0xc2c2c200,
156      0x34343400, 0x7e7e7e00, 0x76767600, 0x05050500, 0x6d6d6d00, 0xb7b7b700,
157      0xa9a9a900, 0x31313100, 0xd1d1d100, 0x17171700, 0x04040400, 0xd7d7d700,
158      0x14141400, 0x58585800, 0x3a3a3a00, 0x61616100, 0xdedede00, 0x1b1b1b00,
159      0x11111100, 0x1c1c1c00, 0x32323200, 0x0f0f0f00, 0x9c9c9c00, 0x16161600,
160      0x53535300, 0x18181800, 0xf2f2f200, 0x22222200, 0xfefefe00, 0x44444400,
161      0xcfcfcf00, 0xb2b2b200, 0xc3c3c300, 0xb5b5b500, 0x7a7a7a00, 0x91919100,
162      0x24242400, 0x08080800, 0xe8e8e800, 0xa8a8a800, 0x60606000, 0xfcfcfc00,
163      0x69696900, 0x50505000, 0xaaaaaa00, 0xd0d0d000, 0xa0a0a000, 0x7d7d7d00,
164      0xa1a1a100, 0x89898900, 0x62626200, 0x97979700, 0x54545400, 0x5b5b5b00,
165      0x1e1e1e00, 0x95959500, 0xe0e0e000, 0xffffff00, 0x64646400, 0xd2d2d200,
166      0x10101000, 0xc4c4c400, 0x00000000, 0x48484800, 0xa3a3a300, 0xf7f7f700,
167      0x75757500, 0xdbdbdb00, 0x8a8a8a00, 0x03030300, 0xe6e6e600, 0xdadada00,
168      0x09090900, 0x3f3f3f00, 0xdddddd00, 0x94949400, 0x87878700, 0x5c5c5c00,
169      0x83838300, 0x02020200, 0xcdcdcd00, 0x4a4a4a00, 0x90909000, 0x33333300,
170      0x73737300, 0x67676700, 0xf6f6f600, 0xf3f3f300, 0x9d9d9d00, 0x7f7f7f00,
171      0xbfbfbf00, 0xe2e2e200, 0x52525200, 0x9b9b9b00, 0xd8d8d800, 0x26262600,
172      0xc8c8c800, 0x37373700, 0xc6c6c600, 0x3b3b3b00, 0x81818100, 0x96969600,
173      0x6f6f6f00, 0x4b4b4b00, 0x13131300, 0xbebebe00, 0x63636300, 0x2e2e2e00,
174      0xe9e9e900, 0x79797900, 0xa7a7a700, 0x8c8c8c00, 0x9f9f9f00, 0x6e6e6e00,
175      0xbcbcbc00, 0x8e8e8e00, 0x29292900, 0xf5f5f500, 0xf9f9f900, 0xb6b6b600,
176      0x2f2f2f00, 0xfdfdfd00, 0xb4b4b400, 0x59595900, 0x78787800, 0x98989800,
177      0x06060600, 0x6a6a6a00, 0xe7e7e700, 0x46464600, 0x71717100, 0xbababa00,
178      0xd4d4d400, 0x25252500, 0xababab00, 0x42424200, 0x88888800, 0xa2a2a200,
179      0x8d8d8d00, 0xfafafa00, 0x72727200, 0x07070700, 0xb9b9b900, 0x55555500,
180      0xf8f8f800, 0xeeeeee00, 0xacacac00, 0x0a0a0a00, 0x36363600, 0x49494900,
181      0x2a2a2a00, 0x68686800, 0x3c3c3c00, 0x38383800, 0xf1f1f100, 0xa4a4a400,
182      0x40404000, 0x28282800, 0xd3d3d300, 0x7b7b7b00, 0xbbbbbb00, 0xc9c9c900,
183      0x43434300, 0xc1c1c100, 0x15151500, 0xe3e3e300, 0xadadad00, 0xf4f4f400,
184      0x77777700, 0xc7c7c700, 0x80808000, 0x9e9e9e00},
185     {0x70700070, 0x2c2c002c, 0xb3b300b3, 0xc0c000c0, 0xe4e400e4, 0x57570057,
186      0xeaea00ea, 0xaeae00ae, 0x23230023, 0x6b6b006b, 0x45450045, 0xa5a500a5,
187      0xeded00ed, 0x4f4f004f, 0x1d1d001d, 0x92920092, 0x86860086, 0xafaf00af,
188      0x7c7c007c, 0x1f1f001f, 0x3e3e003e, 0xdcdc00dc, 0x5e5e005e, 0x0b0b000b,
189      0xa6a600a6, 0x39390039, 0xd5d500d5, 0x5d5d005d, 0xd9d900d9, 0x5a5a005a,
190      0x51510051, 0x6c6c006c, 0x8b8b008b, 0x9a9a009a, 0xfbfb00fb, 0xb0b000b0,
191      0x74740074, 0x2b2b002b, 0xf0f000f0, 0x84840084, 0xdfdf00df, 0xcbcb00cb,
192      0x34340034, 0x76760076, 0x6d6d006d, 0xa9a900a9, 0xd1d100d1, 0x04040004,
193      0x14140014, 0x3a3a003a, 0xdede00de, 0x11110011, 0x32320032, 0x9c9c009c,
194      0x53530053, 0xf2f200f2, 0xfefe00fe, 0xcfcf00cf, 0xc3c300c3, 0x7a7a007a,
195      0x24240024, 0xe8e800e8, 0x60600060, 0x69690069, 0xaaaa00aa, 0xa0a000a0,
196      0xa1a100a1, 0x62620062, 0x54540054, 0x1e1e001e, 0xe0e000e0, 0x64640064,
197      0x10100010, 0x00000000, 0xa3a300a3, 0x75750075, 0x8a8a008a, 0xe6e600e6,
198      0x09090009, 0xdddd00dd, 0x87870087, 0x83830083, 0xcdcd00cd, 0x90900090,
199      0x73730073, 0xf6f600f6, 0x9d9d009d, 0xbfbf00bf, 0x52520052, 0xd8d800d8,
200      0xc8c800c8, 0xc6c600c6, 0x81810081, 0x6f6f006f, 0x13130013, 0x63630063,
201      0xe9e900e9, 0xa7a700a7, 0x9f9f009f, 0xbcbc00bc, 0x29290029, 0xf9f900f9,
202      0x2f2f002f, 0xb4b400b4, 0x78780078, 0x06060006, 0xe7e700e7, 0x71710071,
203      0xd4d400d4, 0xabab00ab, 0x88880088, 0x8d8d008d, 0x72720072, 0xb9b900b9,
204      0xf8f800f8, 0xacac00ac, 0x36360036, 0x2a2a002a, 0x3c3c003c, 0xf1f100f1,
205      0x40400040, 0xd3d300d3, 0xbbbb00bb, 0x43430043, 0x15150015, 0xadad00ad,
206      0x77770077, 0x80800080, 0x82820082, 0xecec00ec, 0x27270027, 0xe5e500e5,
207      0x85850085, 0x35350035, 0x0c0c000c, 0x41410041, 0xefef00ef, 0x93930093,
208      0x19190019, 0x21210021, 0x0e0e000e, 0x4e4e004e, 0x65650065, 0xbdbd00bd,
209      0xb8b800b8, 0x8f8f008f, 0xebeb00eb, 0xcece00ce, 0x30300030, 0x5f5f005f,
210      0xc5c500c5, 0x1a1a001a, 0xe1e100e1, 0xcaca00ca, 0x47470047, 0x3d3d003d,
211      0x01010001, 0xd6d600d6, 0x56560056, 0x4d4d004d, 0x0d0d000d, 0x66660066,
212      0xcccc00cc, 0x2d2d002d, 0x12120012, 0x20200020, 0xb1b100b1, 0x99990099,
213      0x4c4c004c, 0xc2c200c2, 0x7e7e007e, 0x05050005, 0xb7b700b7, 0x31310031,
214      0x17170017, 0xd7d700d7, 0x58580058, 0x61610061, 0x1b1b001b, 0x1c1c001c,
215      0x0f0f000f, 0x16160016, 0x18180018, 0x22220022, 0x44440044, 0xb2b200b2,
216      0xb5b500b5, 0x91910091, 0x08080008, 0xa8a800a8, 0xfcfc00fc, 0x50500050,
217      0xd0d000d0, 0x7d7d007d, 0x89890089, 0x97970097, 0x5b5b005b, 0x95950095,
218      0xffff00ff, 0xd2d200d2, 0xc4c400c4, 0x48480048, 0xf7f700f7, 0xdbdb00db,
219      0x03030003, 0xdada00da, 0x3f3f003f, 0x94940094, 0x5c5c005c, 0x02020002,
220      0x4a4a004a, 0x33330033, 0x67670067, 0xf3f300f3, 0x7f7f007f, 0xe2e200e2,
221      0x9b9b009b, 0x26260026, 0x37370037, 0x3b3b003b, 0x96960096, 0x4b4b004b,
222      0xbebe00be, 0x2e2e002e, 0x79790079, 0x8c8c008c, 0x6e6e006e, 0x8e8e008e,
223      0xf5f500f5, 0xb6b600b6, 0xfdfd00fd, 0x59590059, 0x98980098, 0x6a6a006a,
224      0x46460046, 0xbaba00ba, 0x25250025, 0x42420042, 0xa2a200a2, 0xfafa00fa,
225      0x07070007, 0x55550055, 0xeeee00ee, 0x0a0a000a, 0x49490049, 0x68680068,
226      0x38380038, 0xa4a400a4, 0x28280028, 0x7b7b007b, 0xc9c900c9, 0xc1c100c1,
227      0xe3e300e3, 0xf4f400f4, 0xc7c700c7, 0x9e9e009e},
228     {0x00e0e0e0, 0x00050505, 0x00585858, 0x00d9d9d9, 0x00676767, 0x004e4e4e,
229      0x00818181, 0x00cbcbcb, 0x00c9c9c9, 0x000b0b0b, 0x00aeaeae, 0x006a6a6a,
230      0x00d5d5d5, 0x00181818, 0x005d5d5d, 0x00828282, 0x00464646, 0x00dfdfdf,
231      0x00d6d6d6, 0x00272727, 0x008a8a8a, 0x00323232, 0x004b4b4b, 0x00424242,
232      0x00dbdbdb, 0x001c1c1c, 0x009e9e9e, 0x009c9c9c, 0x003a3a3a, 0x00cacaca,
233      0x00252525, 0x007b7b7b, 0x000d0d0d, 0x00717171, 0x005f5f5f, 0x001f1f1f,
234      0x00f8f8f8, 0x00d7d7d7, 0x003e3e3e, 0x009d9d9d, 0x007c7c7c, 0x00606060,
235      0x00b9b9b9, 0x00bebebe, 0x00bcbcbc, 0x008b8b8b, 0x00161616, 0x00343434,
236      0x004d4d4d, 0x00c3c3c3, 0x00727272, 0x00959595, 0x00ababab, 0x008e8e8e,
237      0x00bababa, 0x007a7a7a, 0x00b3b3b3, 0x00020202, 0x00b4b4b4, 0x00adadad,
238      0x00a2a2a2, 0x00acacac, 0x00d8d8d8, 0x009a9a9a, 0x00171717, 0x001a1a1a,
239      0x00353535, 0x00cccccc, 0x00f7f7f7, 0x00999999, 0x00616161, 0x005a5a5a,
240      0x00e8e8e8, 0x00242424, 0x00565656, 0x00404040, 0x00e1e1e1, 0x00636363,
241      0x00090909, 0x00333333, 0x00bfbfbf, 0x00989898, 0x00979797, 0x00858585,
242      0x00686868, 0x00fcfcfc, 0x00ececec, 0x000a0a0a, 0x00dadada, 0x006f6f6f,
243      0x00535353, 0x00626262, 0x00a3a3a3, 0x002e2e2e, 0x00080808, 0x00afafaf,
244      0x00282828, 0x00b0b0b0, 0x00747474, 0x00c2c2c2, 0x00bdbdbd, 0x00363636,
245      0x00222222, 0x00383838, 0x00646464, 0x001e1e1e, 0x00393939, 0x002c2c2c,
246      0x00a6a6a6, 0x00303030, 0x00e5e5e5, 0x00444444, 0x00fdfdfd, 0x00888888,
247      0x009f9f9f, 0x00656565, 0x00878787, 0x006b6b6b, 0x00f4f4f4, 0x00232323,
248      0x00484848, 0x00101010, 0x00d1d1d1, 0x00515151, 0x00c0c0c0, 0x00f9f9f9,
249      0x00d2d2d2, 0x00a0a0a0, 0x00555555, 0x00a1a1a1, 0x00414141, 0x00fafafa,
250      0x00434343, 0x00131313, 0x00c4c4c4, 0x002f2f2f, 0x00a8a8a8, 0x00b6b6b6,
251      0x003c3c3c, 0x002b2b2b, 0x00c1c1c1, 0x00ffffff, 0x00c8c8c8, 0x00a5a5a5,
252      0x00202020, 0x00898989, 0x00000000, 0x00909090, 0x00474747, 0x00efefef,
253      0x00eaeaea, 0x00b7b7b7, 0x00151515, 0x00060606, 0x00cdcdcd, 0x00b5b5b5,
254      0x00121212, 0x007e7e7e, 0x00bbbbbb, 0x00292929, 0x000f0f0f, 0x00b8b8b8,
255      0x00070707, 0x00040404, 0x009b9b9b, 0x00949494, 0x00212121, 0x00666666,
256      0x00e6e6e6, 0x00cecece, 0x00ededed, 0x00e7e7e7, 0x003b3b3b, 0x00fefefe,
257      0x007f7f7f, 0x00c5c5c5, 0x00a4a4a4, 0x00373737, 0x00b1b1b1, 0x004c4c4c,
258      0x00919191, 0x006e6e6e, 0x008d8d8d, 0x00767676, 0x00030303, 0x002d2d2d,
259      0x00dedede, 0x00969696, 0x00262626, 0x007d7d7d, 0x00c6c6c6, 0x005c5c5c,
260      0x00d3d3d3, 0x00f2f2f2, 0x004f4f4f, 0x00191919, 0x003f3f3f, 0x00dcdcdc,
261      0x00797979, 0x001d1d1d, 0x00525252, 0x00ebebeb, 0x00f3f3f3, 0x006d6d6d,
262      0x005e5e5e, 0x00fbfbfb, 0x00696969, 0x00b2b2b2, 0x00f0f0f0, 0x00313131,
263      0x000c0c0c, 0x00d4d4d4, 0x00cfcfcf, 0x008c8c8c, 0x00e2e2e2, 0x00757575,
264      0x00a9a9a9, 0x004a4a4a, 0x00575757, 0x00848484, 0x00111111, 0x00454545,
265      0x001b1b1b, 0x00f5f5f5, 0x00e4e4e4, 0x000e0e0e, 0x00737373, 0x00aaaaaa,
266      0x00f1f1f1, 0x00dddddd, 0x00595959, 0x00141414, 0x006c6c6c, 0x00929292,
267      0x00545454, 0x00d0d0d0, 0x00787878, 0x00707070, 0x00e3e3e3, 0x00494949,
268      0x00808080, 0x00505050, 0x00a7a7a7, 0x00f6f6f6, 0x00777777, 0x00939393,
269      0x00868686, 0x00838383, 0x002a2a2a, 0x00c7c7c7, 0x005b5b5b, 0x00e9e9e9,
270      0x00eeeeee, 0x008f8f8f, 0x00010101, 0x003d3d3d},
271     {0x38003838, 0x41004141, 0x16001616, 0x76007676, 0xd900d9d9, 0x93009393,
272      0x60006060, 0xf200f2f2, 0x72007272, 0xc200c2c2, 0xab00abab, 0x9a009a9a,
273      0x75007575, 0x06000606, 0x57005757, 0xa000a0a0, 0x91009191, 0xf700f7f7,
274      0xb500b5b5, 0xc900c9c9, 0xa200a2a2, 0x8c008c8c, 0xd200d2d2, 0x90009090,
275      0xf600f6f6, 0x07000707, 0xa700a7a7, 0x27002727, 0x8e008e8e, 0xb200b2b2,
276      0x49004949, 0xde00dede, 0x43004343, 0x5c005c5c, 0xd700d7d7, 0xc700c7c7,
277      0x3e003e3e, 0xf500f5f5, 0x8f008f8f, 0x67006767, 0x1f001f1f, 0x18001818,
278      0x6e006e6e, 0xaf00afaf, 0x2f002f2f, 0xe200e2e2, 0x85008585, 0x0d000d0d,
279      0x53005353, 0xf000f0f0, 0x9c009c9c, 0x65006565, 0xea00eaea, 0xa300a3a3,
280      0xae00aeae, 0x9e009e9e, 0xec00ecec, 0x80008080, 0x2d002d2d, 0x6b006b6b,
281      0xa800a8a8, 0x2b002b2b, 0x36003636, 0xa600a6a6, 0xc500c5c5, 0x86008686,
282      0x4d004d4d, 0x33003333, 0xfd00fdfd, 0x66006666, 0x58005858, 0x96009696,
283      0x3a003a3a, 0x09000909, 0x95009595, 0x10001010, 0x78007878, 0xd800d8d8,
284      0x42004242, 0xcc00cccc, 0xef00efef, 0x26002626, 0xe500e5e5, 0x61006161,
285      0x1a001a1a, 0x3f003f3f, 0x3b003b3b, 0x82008282, 0xb600b6b6, 0xdb00dbdb,
286      0xd400d4d4, 0x98009898, 0xe800e8e8, 0x8b008b8b, 0x02000202, 0xeb00ebeb,
287      0x0a000a0a, 0x2c002c2c, 0x1d001d1d, 0xb000b0b0, 0x6f006f6f, 0x8d008d8d,
288      0x88008888, 0x0e000e0e, 0x19001919, 0x87008787, 0x4e004e4e, 0x0b000b0b,
289      0xa900a9a9, 0x0c000c0c, 0x79007979, 0x11001111, 0x7f007f7f, 0x22002222,
290      0xe700e7e7, 0x59005959, 0xe100e1e1, 0xda00dada, 0x3d003d3d, 0xc800c8c8,
291      0x12001212, 0x04000404, 0x74007474, 0x54005454, 0x30003030, 0x7e007e7e,
292      0xb400b4b4, 0x28002828, 0x55005555, 0x68006868, 0x50005050, 0xbe00bebe,
293      0xd000d0d0, 0xc400c4c4, 0x31003131, 0xcb00cbcb, 0x2a002a2a, 0xad00adad,
294      0x0f000f0f, 0xca00caca, 0x70007070, 0xff00ffff, 0x32003232, 0x69006969,
295      0x08000808, 0x62006262, 0x00000000, 0x24002424, 0xd100d1d1, 0xfb00fbfb,
296      0xba00baba, 0xed00eded, 0x45004545, 0x81008181, 0x73007373, 0x6d006d6d,
297      0x84008484, 0x9f009f9f, 0xee00eeee, 0x4a004a4a, 0xc300c3c3, 0x2e002e2e,
298      0xc100c1c1, 0x01000101, 0xe600e6e6, 0x25002525, 0x48004848, 0x99009999,
299      0xb900b9b9, 0xb300b3b3, 0x7b007b7b, 0xf900f9f9, 0xce00cece, 0xbf00bfbf,
300      0xdf00dfdf, 0x71007171, 0x29002929, 0xcd00cdcd, 0x6c006c6c, 0x13001313,
301      0x64006464, 0x9b009b9b, 0x63006363, 0x9d009d9d, 0xc000c0c0, 0x4b004b4b,
302      0xb700b7b7, 0xa500a5a5, 0x89008989, 0x5f005f5f, 0xb100b1b1, 0x17001717,
303      0xf400f4f4, 0xbc00bcbc, 0xd300d3d3, 0x46004646, 0xcf00cfcf, 0x37003737,
304      0x5e005e5e, 0x47004747, 0x94009494, 0xfa00fafa, 0xfc00fcfc, 0x5b005b5b,
305      0x97009797, 0xfe00fefe, 0x5a005a5a, 0xac00acac, 0x3c003c3c, 0x4c004c4c,
306      0x03000303, 0x35003535, 0xf300f3f3, 0x23002323, 0xb800b8b8, 0x5d005d5d,
307      0x6a006a6a, 0x92009292, 0xd500d5d5, 0x21002121, 0x44004444, 0x51005151,
308      0xc600c6c6, 0x7d007d7d, 0x39003939, 0x83008383, 0xdc00dcdc, 0xaa00aaaa,
309      0x7c007c7c, 0x77007777, 0x56005656, 0x05000505, 0x1b001b1b, 0xa400a4a4,
310      0x15001515, 0x34003434, 0x1e001e1e, 0x1c001c1c, 0xf800f8f8, 0x52005252,
311      0x20002020, 0x14001414, 0xe900e9e9, 0xbd00bdbd, 0xdd00dddd, 0xe400e4e4,
312      0xa100a1a1, 0xe000e0e0, 0x8a008a8a, 0xf100f1f1, 0xd600d6d6, 0x7a007a7a,
313      0xbb00bbbb, 0xe300e3e3, 0x40004040, 0x4f004f4f}
314 };
315
316 /* Key generation constants */
317 static const u32 SIGMA[] = {
318     0xa09e667f, 0x3bcc908b, 0xb67ae858, 0x4caa73b2, 0xc6ef372f, 0xe94f82be,
319     0x54ff53a5, 0xf1d36f1c, 0x10e527fa, 0xde682d1d, 0xb05688c2, 0xb3e6c1fd
320 };
321
322 /* The phi algorithm given in C.2.7 of the Camellia spec document. */
323 /*
324  * This version does not attempt to minimize amount of temporary
325  * variables, but instead explicitly exposes algorithm's parallelism.
326  * It is therefore most appropriate for platforms with not less than
327  * ~16 registers. For platforms with less registers [well, x86 to be
328  * specific] assembler version should be/is provided anyway...
329  */
330 #define Camellia_Feistel(_s0,_s1,_s2,_s3,_key) do {\
331         register u32 _t0,_t1,_t2,_t3;\
332 \
333         _t0  = _s0 ^ (_key)[0];\
334         _t3  = SBOX4_4404[_t0&0xff];\
335         _t1  = _s1 ^ (_key)[1];\
336         _t3 ^= SBOX3_3033[(_t0 >> 8)&0xff];\
337         _t2  = SBOX1_1110[_t1&0xff];\
338         _t3 ^= SBOX2_0222[(_t0 >> 16)&0xff];\
339         _t2 ^= SBOX4_4404[(_t1 >> 8)&0xff];\
340         _t3 ^= SBOX1_1110[(_t0 >> 24)];\
341         _t2 ^= _t3;\
342         _t3  = RightRotate(_t3,8);\
343         _t2 ^= SBOX3_3033[(_t1 >> 16)&0xff];\
344         _s3 ^= _t3;\
345         _t2 ^= SBOX2_0222[(_t1 >> 24)];\
346         _s2 ^= _t2; \
347         _s3 ^= _t2;\
348 } while(0)
349
350 /*
351  * Note that n has to be less than 32. Rotations for larger amount
352  * of bits are achieved by "rotating" order of s-elements and
353  * adjusting n accordingly, e.g. RotLeft128(s1,s2,s3,s0,n-32).
354  */
355 #define RotLeft128(_s0,_s1,_s2,_s3,_n) do {\
356         u32 _t0=_s0>>(32-_n);\
357         _s0 = (_s0<<_n) | (_s1>>(32-_n));\
358         _s1 = (_s1<<_n) | (_s2>>(32-_n));\
359         _s2 = (_s2<<_n) | (_s3>>(32-_n));\
360         _s3 = (_s3<<_n) | _t0;\
361 } while (0)
362
363 int Camellia_Ekeygen(int keyBitLength, const u8 *rawKey, KEY_TABLE_TYPE k)
364 {
365     register u32 s0, s1, s2, s3;
366
367     k[0] = s0 = GETU32(rawKey);
368     k[1] = s1 = GETU32(rawKey + 4);
369     k[2] = s2 = GETU32(rawKey + 8);
370     k[3] = s3 = GETU32(rawKey + 12);
371
372     if (keyBitLength != 128) {
373         k[8] = s0 = GETU32(rawKey + 16);
374         k[9] = s1 = GETU32(rawKey + 20);
375         if (keyBitLength == 192) {
376             k[10] = s2 = ~s0;
377             k[11] = s3 = ~s1;
378         } else {
379             k[10] = s2 = GETU32(rawKey + 24);
380             k[11] = s3 = GETU32(rawKey + 28);
381         }
382         s0 ^= k[0], s1 ^= k[1], s2 ^= k[2], s3 ^= k[3];
383     }
384
385     /* Use the Feistel routine to scramble the key material */
386     Camellia_Feistel(s0, s1, s2, s3, SIGMA + 0);
387     Camellia_Feistel(s2, s3, s0, s1, SIGMA + 2);
388
389     s0 ^= k[0], s1 ^= k[1], s2 ^= k[2], s3 ^= k[3];
390     Camellia_Feistel(s0, s1, s2, s3, SIGMA + 4);
391     Camellia_Feistel(s2, s3, s0, s1, SIGMA + 6);
392
393     /* Fill the keyTable. Requires many block rotations. */
394     if (keyBitLength == 128) {
395         k[4] = s0, k[5] = s1, k[6] = s2, k[7] = s3;
396         RotLeft128(s0, s1, s2, s3, 15); /* KA <<< 15 */
397         k[12] = s0, k[13] = s1, k[14] = s2, k[15] = s3;
398         RotLeft128(s0, s1, s2, s3, 15); /* KA <<< 30 */
399         k[16] = s0, k[17] = s1, k[18] = s2, k[19] = s3;
400         RotLeft128(s0, s1, s2, s3, 15); /* KA <<< 45 */
401         k[24] = s0, k[25] = s1;
402         RotLeft128(s0, s1, s2, s3, 15); /* KA <<< 60 */
403         k[28] = s0, k[29] = s1, k[30] = s2, k[31] = s3;
404         RotLeft128(s1, s2, s3, s0, 2); /* KA <<< 94 */
405         k[40] = s1, k[41] = s2, k[42] = s3, k[43] = s0;
406         RotLeft128(s1, s2, s3, s0, 17); /* KA <<<111 */
407         k[48] = s1, k[49] = s2, k[50] = s3, k[51] = s0;
408
409         s0 = k[0], s1 = k[1], s2 = k[2], s3 = k[3];
410         RotLeft128(s0, s1, s2, s3, 15); /* KL <<< 15 */
411         k[8] = s0, k[9] = s1, k[10] = s2, k[11] = s3;
412         RotLeft128(s0, s1, s2, s3, 30); /* KL <<< 45 */
413         k[20] = s0, k[21] = s1, k[22] = s2, k[23] = s3;
414         RotLeft128(s0, s1, s2, s3, 15); /* KL <<< 60 */
415         k[26] = s2, k[27] = s3;
416         RotLeft128(s0, s1, s2, s3, 17); /* KL <<< 77 */
417         k[32] = s0, k[33] = s1, k[34] = s2, k[35] = s3;
418         RotLeft128(s0, s1, s2, s3, 17); /* KL <<< 94 */
419         k[36] = s0, k[37] = s1, k[38] = s2, k[39] = s3;
420         RotLeft128(s0, s1, s2, s3, 17); /* KL <<<111 */
421         k[44] = s0, k[45] = s1, k[46] = s2, k[47] = s3;
422
423         return 3;               /* grand rounds */
424     } else {
425         k[12] = s0, k[13] = s1, k[14] = s2, k[15] = s3;
426         s0 ^= k[8], s1 ^= k[9], s2 ^= k[10], s3 ^= k[11];
427         Camellia_Feistel(s0, s1, s2, s3, (SIGMA + 8));
428         Camellia_Feistel(s2, s3, s0, s1, (SIGMA + 10));
429
430         k[4] = s0, k[5] = s1, k[6] = s2, k[7] = s3;
431         RotLeft128(s0, s1, s2, s3, 30); /* KB <<< 30 */
432         k[20] = s0, k[21] = s1, k[22] = s2, k[23] = s3;
433         RotLeft128(s0, s1, s2, s3, 30); /* KB <<< 60 */
434         k[40] = s0, k[41] = s1, k[42] = s2, k[43] = s3;
435         RotLeft128(s1, s2, s3, s0, 19); /* KB <<<111 */
436         k[64] = s1, k[65] = s2, k[66] = s3, k[67] = s0;
437
438         s0 = k[8], s1 = k[9], s2 = k[10], s3 = k[11];
439         RotLeft128(s0, s1, s2, s3, 15); /* KR <<< 15 */
440         k[8] = s0, k[9] = s1, k[10] = s2, k[11] = s3;
441         RotLeft128(s0, s1, s2, s3, 15); /* KR <<< 30 */
442         k[16] = s0, k[17] = s1, k[18] = s2, k[19] = s3;
443         RotLeft128(s0, s1, s2, s3, 30); /* KR <<< 60 */
444         k[36] = s0, k[37] = s1, k[38] = s2, k[39] = s3;
445         RotLeft128(s1, s2, s3, s0, 2); /* KR <<< 94 */
446         k[52] = s1, k[53] = s2, k[54] = s3, k[55] = s0;
447
448         s0 = k[12], s1 = k[13], s2 = k[14], s3 = k[15];
449         RotLeft128(s0, s1, s2, s3, 15); /* KA <<< 15 */
450         k[12] = s0, k[13] = s1, k[14] = s2, k[15] = s3;
451         RotLeft128(s0, s1, s2, s3, 30); /* KA <<< 45 */
452         k[28] = s0, k[29] = s1, k[30] = s2, k[31] = s3;
453         /* KA <<< 77 */
454         k[48] = s1, k[49] = s2, k[50] = s3, k[51] = s0;
455         RotLeft128(s1, s2, s3, s0, 17); /* KA <<< 94 */
456         k[56] = s1, k[57] = s2, k[58] = s3, k[59] = s0;
457
458         s0 = k[0], s1 = k[1], s2 = k[2], s3 = k[3];
459         RotLeft128(s1, s2, s3, s0, 13); /* KL <<< 45 */
460         k[24] = s1, k[25] = s2, k[26] = s3, k[27] = s0;
461         RotLeft128(s1, s2, s3, s0, 15); /* KL <<< 60 */
462         k[32] = s1, k[33] = s2, k[34] = s3, k[35] = s0;
463         RotLeft128(s1, s2, s3, s0, 17); /* KL <<< 77 */
464         k[44] = s1, k[45] = s2, k[46] = s3, k[47] = s0;
465         RotLeft128(s2, s3, s0, s1, 2); /* KL <<<111 */
466         k[60] = s2, k[61] = s3, k[62] = s0, k[63] = s1;
467
468         return 4;               /* grand rounds */
469     }
470     /*
471      * It is possible to perform certain precalculations, which
472      * would spare few cycles in block procedure. It's not done,
473      * because it upsets the performance balance between key
474      * setup and block procedures, negatively affecting overall
475      * throughput in applications operating on short messages
476      * and volatile keys.
477      */
478 }
479
480 void Camellia_EncryptBlock_Rounds(int grandRounds, const u8 plaintext[],
481                                   const KEY_TABLE_TYPE keyTable,
482                                   u8 ciphertext[])
483 {
484     register u32 s0, s1, s2, s3;
485     const u32 *k = keyTable, *kend = keyTable + grandRounds * 16;
486
487     s0 = GETU32(plaintext) ^ k[0];
488     s1 = GETU32(plaintext + 4) ^ k[1];
489     s2 = GETU32(plaintext + 8) ^ k[2];
490     s3 = GETU32(plaintext + 12) ^ k[3];
491     k += 4;
492
493     while (1) {
494         /* Camellia makes 6 Feistel rounds */
495         Camellia_Feistel(s0, s1, s2, s3, k + 0);
496         Camellia_Feistel(s2, s3, s0, s1, k + 2);
497         Camellia_Feistel(s0, s1, s2, s3, k + 4);
498         Camellia_Feistel(s2, s3, s0, s1, k + 6);
499         Camellia_Feistel(s0, s1, s2, s3, k + 8);
500         Camellia_Feistel(s2, s3, s0, s1, k + 10);
501         k += 12;
502
503         if (k == kend)
504             break;
505
506         /*
507          * This is the same function as the diffusion function D of the
508          * accompanying documentation. See section 3.2 for properties of the
509          * FLlayer function.
510          */
511         s1 ^= LeftRotate(s0 & k[0], 1);
512         s2 ^= s3 | k[3];
513         s0 ^= s1 | k[1];
514         s3 ^= LeftRotate(s2 & k[2], 1);
515         k += 4;
516     }
517
518     s2 ^= k[0], s3 ^= k[1], s0 ^= k[2], s1 ^= k[3];
519
520     PUTU32(ciphertext, s2);
521     PUTU32(ciphertext + 4, s3);
522     PUTU32(ciphertext + 8, s0);
523     PUTU32(ciphertext + 12, s1);
524 }
525
526 void Camellia_EncryptBlock(int keyBitLength, const u8 plaintext[],
527                            const KEY_TABLE_TYPE keyTable, u8 ciphertext[])
528 {
529     Camellia_EncryptBlock_Rounds(keyBitLength == 128 ? 3 : 4,
530                                  plaintext, keyTable, ciphertext);
531 }
532
533 void Camellia_DecryptBlock_Rounds(int grandRounds, const u8 ciphertext[],
534                                   const KEY_TABLE_TYPE keyTable,
535                                   u8 plaintext[])
536 {
537     u32 s0, s1, s2, s3;
538     const u32 *k = keyTable + grandRounds * 16, *kend = keyTable + 4;
539
540     s0 = GETU32(ciphertext) ^ k[0];
541     s1 = GETU32(ciphertext + 4) ^ k[1];
542     s2 = GETU32(ciphertext + 8) ^ k[2];
543     s3 = GETU32(ciphertext + 12) ^ k[3];
544
545     while (1) {
546         /* Camellia makes 6 Feistel rounds */
547         k -= 12;
548         Camellia_Feistel(s0, s1, s2, s3, k + 10);
549         Camellia_Feistel(s2, s3, s0, s1, k + 8);
550         Camellia_Feistel(s0, s1, s2, s3, k + 6);
551         Camellia_Feistel(s2, s3, s0, s1, k + 4);
552         Camellia_Feistel(s0, s1, s2, s3, k + 2);
553         Camellia_Feistel(s2, s3, s0, s1, k + 0);
554
555         if (k == kend)
556             break;
557
558         /*
559          * This is the same function as the diffusion function D of the
560          * accompanying documentation. See section 3.2 for properties of the
561          * FLlayer function.
562          */
563         k -= 4;
564         s1 ^= LeftRotate(s0 & k[2], 1);
565         s2 ^= s3 | k[1];
566         s0 ^= s1 | k[3];
567         s3 ^= LeftRotate(s2 & k[0], 1);
568     }
569
570     k -= 4;
571     s2 ^= k[0], s3 ^= k[1], s0 ^= k[2], s1 ^= k[3];
572
573     PUTU32(plaintext, s2);
574     PUTU32(plaintext + 4, s3);
575     PUTU32(plaintext + 8, s0);
576     PUTU32(plaintext + 12, s1);
577 }
578
579 void Camellia_DecryptBlock(int keyBitLength, const u8 plaintext[],
580                            const KEY_TABLE_TYPE keyTable, u8 ciphertext[])
581 {
582     Camellia_DecryptBlock_Rounds(keyBitLength == 128 ? 3 : 4,
583                                  plaintext, keyTable, ciphertext);
584 }