1/*
2 * Copyright (C) 2006
3 * NTT (Nippon Telegraph and Telephone Corporation).
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18 */
19
20/*
21 * Algorithm Specification
22 *  http://info.isl.ntt.co.jp/crypt/eng/camellia/specifications.html
23 */
24
25/*
26 *
27 * NOTE --- NOTE --- NOTE --- NOTE
28 * This implementation assumes that all memory addresses passed
29 * as parameters are four-byte aligned.
30 *
31 */
32
33#include <linux/crypto.h>
34#include <linux/errno.h>
35#include <linux/init.h>
36#include <linux/kernel.h>
37#include <linux/module.h>
38#include <linux/bitops.h>
39#include <asm/unaligned.h>
40
41static const u32 camellia_sp1110[256] = {
42	0x70707000, 0x82828200, 0x2c2c2c00, 0xececec00,
43	0xb3b3b300, 0x27272700, 0xc0c0c000, 0xe5e5e500,
44	0xe4e4e400, 0x85858500, 0x57575700, 0x35353500,
45	0xeaeaea00, 0x0c0c0c00, 0xaeaeae00, 0x41414100,
46	0x23232300, 0xefefef00, 0x6b6b6b00, 0x93939300,
47	0x45454500, 0x19191900, 0xa5a5a500, 0x21212100,
48	0xededed00, 0x0e0e0e00, 0x4f4f4f00, 0x4e4e4e00,
49	0x1d1d1d00, 0x65656500, 0x92929200, 0xbdbdbd00,
50	0x86868600, 0xb8b8b800, 0xafafaf00, 0x8f8f8f00,
51	0x7c7c7c00, 0xebebeb00, 0x1f1f1f00, 0xcecece00,
52	0x3e3e3e00, 0x30303000, 0xdcdcdc00, 0x5f5f5f00,
53	0x5e5e5e00, 0xc5c5c500, 0x0b0b0b00, 0x1a1a1a00,
54	0xa6a6a600, 0xe1e1e100, 0x39393900, 0xcacaca00,
55	0xd5d5d500, 0x47474700, 0x5d5d5d00, 0x3d3d3d00,
56	0xd9d9d900, 0x01010100, 0x5a5a5a00, 0xd6d6d600,
57	0x51515100, 0x56565600, 0x6c6c6c00, 0x4d4d4d00,
58	0x8b8b8b00, 0x0d0d0d00, 0x9a9a9a00, 0x66666600,
59	0xfbfbfb00, 0xcccccc00, 0xb0b0b000, 0x2d2d2d00,
60	0x74747400, 0x12121200, 0x2b2b2b00, 0x20202000,
61	0xf0f0f000, 0xb1b1b100, 0x84848400, 0x99999900,
62	0xdfdfdf00, 0x4c4c4c00, 0xcbcbcb00, 0xc2c2c200,
63	0x34343400, 0x7e7e7e00, 0x76767600, 0x05050500,
64	0x6d6d6d00, 0xb7b7b700, 0xa9a9a900, 0x31313100,
65	0xd1d1d100, 0x17171700, 0x04040400, 0xd7d7d700,
66	0x14141400, 0x58585800, 0x3a3a3a00, 0x61616100,
67	0xdedede00, 0x1b1b1b00, 0x11111100, 0x1c1c1c00,
68	0x32323200, 0x0f0f0f00, 0x9c9c9c00, 0x16161600,
69	0x53535300, 0x18181800, 0xf2f2f200, 0x22222200,
70	0xfefefe00, 0x44444400, 0xcfcfcf00, 0xb2b2b200,
71	0xc3c3c300, 0xb5b5b500, 0x7a7a7a00, 0x91919100,
72	0x24242400, 0x08080800, 0xe8e8e800, 0xa8a8a800,
73	0x60606000, 0xfcfcfc00, 0x69696900, 0x50505000,
74	0xaaaaaa00, 0xd0d0d000, 0xa0a0a000, 0x7d7d7d00,
75	0xa1a1a100, 0x89898900, 0x62626200, 0x97979700,
76	0x54545400, 0x5b5b5b00, 0x1e1e1e00, 0x95959500,
77	0xe0e0e000, 0xffffff00, 0x64646400, 0xd2d2d200,
78	0x10101000, 0xc4c4c400, 0x00000000, 0x48484800,
79	0xa3a3a300, 0xf7f7f700, 0x75757500, 0xdbdbdb00,
80	0x8a8a8a00, 0x03030300, 0xe6e6e600, 0xdadada00,
81	0x09090900, 0x3f3f3f00, 0xdddddd00, 0x94949400,
82	0x87878700, 0x5c5c5c00, 0x83838300, 0x02020200,
83	0xcdcdcd00, 0x4a4a4a00, 0x90909000, 0x33333300,
84	0x73737300, 0x67676700, 0xf6f6f600, 0xf3f3f300,
85	0x9d9d9d00, 0x7f7f7f00, 0xbfbfbf00, 0xe2e2e200,
86	0x52525200, 0x9b9b9b00, 0xd8d8d800, 0x26262600,
87	0xc8c8c800, 0x37373700, 0xc6c6c600, 0x3b3b3b00,
88	0x81818100, 0x96969600, 0x6f6f6f00, 0x4b4b4b00,
89	0x13131300, 0xbebebe00, 0x63636300, 0x2e2e2e00,
90	0xe9e9e900, 0x79797900, 0xa7a7a700, 0x8c8c8c00,
91	0x9f9f9f00, 0x6e6e6e00, 0xbcbcbc00, 0x8e8e8e00,
92	0x29292900, 0xf5f5f500, 0xf9f9f900, 0xb6b6b600,
93	0x2f2f2f00, 0xfdfdfd00, 0xb4b4b400, 0x59595900,
94	0x78787800, 0x98989800, 0x06060600, 0x6a6a6a00,
95	0xe7e7e700, 0x46464600, 0x71717100, 0xbababa00,
96	0xd4d4d400, 0x25252500, 0xababab00, 0x42424200,
97	0x88888800, 0xa2a2a200, 0x8d8d8d00, 0xfafafa00,
98	0x72727200, 0x07070700, 0xb9b9b900, 0x55555500,
99	0xf8f8f800, 0xeeeeee00, 0xacacac00, 0x0a0a0a00,
100	0x36363600, 0x49494900, 0x2a2a2a00, 0x68686800,
101	0x3c3c3c00, 0x38383800, 0xf1f1f100, 0xa4a4a400,
102	0x40404000, 0x28282800, 0xd3d3d300, 0x7b7b7b00,
103	0xbbbbbb00, 0xc9c9c900, 0x43434300, 0xc1c1c100,
104	0x15151500, 0xe3e3e300, 0xadadad00, 0xf4f4f400,
105	0x77777700, 0xc7c7c700, 0x80808000, 0x9e9e9e00,
106};
107
108static const u32 camellia_sp0222[256] = {
109	0x00e0e0e0, 0x00050505, 0x00585858, 0x00d9d9d9,
110	0x00676767, 0x004e4e4e, 0x00818181, 0x00cbcbcb,
111	0x00c9c9c9, 0x000b0b0b, 0x00aeaeae, 0x006a6a6a,
112	0x00d5d5d5, 0x00181818, 0x005d5d5d, 0x00828282,
113	0x00464646, 0x00dfdfdf, 0x00d6d6d6, 0x00272727,
114	0x008a8a8a, 0x00323232, 0x004b4b4b, 0x00424242,
115	0x00dbdbdb, 0x001c1c1c, 0x009e9e9e, 0x009c9c9c,
116	0x003a3a3a, 0x00cacaca, 0x00252525, 0x007b7b7b,
117	0x000d0d0d, 0x00717171, 0x005f5f5f, 0x001f1f1f,
118	0x00f8f8f8, 0x00d7d7d7, 0x003e3e3e, 0x009d9d9d,
119	0x007c7c7c, 0x00606060, 0x00b9b9b9, 0x00bebebe,
120	0x00bcbcbc, 0x008b8b8b, 0x00161616, 0x00343434,
121	0x004d4d4d, 0x00c3c3c3, 0x00727272, 0x00959595,
122	0x00ababab, 0x008e8e8e, 0x00bababa, 0x007a7a7a,
123	0x00b3b3b3, 0x00020202, 0x00b4b4b4, 0x00adadad,
124	0x00a2a2a2, 0x00acacac, 0x00d8d8d8, 0x009a9a9a,
125	0x00171717, 0x001a1a1a, 0x00353535, 0x00cccccc,
126	0x00f7f7f7, 0x00999999, 0x00616161, 0x005a5a5a,
127	0x00e8e8e8, 0x00242424, 0x00565656, 0x00404040,
128	0x00e1e1e1, 0x00636363, 0x00090909, 0x00333333,
129	0x00bfbfbf, 0x00989898, 0x00979797, 0x00858585,
130	0x00686868, 0x00fcfcfc, 0x00ececec, 0x000a0a0a,
131	0x00dadada, 0x006f6f6f, 0x00535353, 0x00626262,
132	0x00a3a3a3, 0x002e2e2e, 0x00080808, 0x00afafaf,
133	0x00282828, 0x00b0b0b0, 0x00747474, 0x00c2c2c2,
134	0x00bdbdbd, 0x00363636, 0x00222222, 0x00383838,
135	0x00646464, 0x001e1e1e, 0x00393939, 0x002c2c2c,
136	0x00a6a6a6, 0x00303030, 0x00e5e5e5, 0x00444444,
137	0x00fdfdfd, 0x00888888, 0x009f9f9f, 0x00656565,
138	0x00878787, 0x006b6b6b, 0x00f4f4f4, 0x00232323,
139	0x00484848, 0x00101010, 0x00d1d1d1, 0x00515151,
140	0x00c0c0c0, 0x00f9f9f9, 0x00d2d2d2, 0x00a0a0a0,
141	0x00555555, 0x00a1a1a1, 0x00414141, 0x00fafafa,
142	0x00434343, 0x00131313, 0x00c4c4c4, 0x002f2f2f,
143	0x00a8a8a8, 0x00b6b6b6, 0x003c3c3c, 0x002b2b2b,
144	0x00c1c1c1, 0x00ffffff, 0x00c8c8c8, 0x00a5a5a5,
145	0x00202020, 0x00898989, 0x00000000, 0x00909090,
146	0x00474747, 0x00efefef, 0x00eaeaea, 0x00b7b7b7,
147	0x00151515, 0x00060606, 0x00cdcdcd, 0x00b5b5b5,
148	0x00121212, 0x007e7e7e, 0x00bbbbbb, 0x00292929,
149	0x000f0f0f, 0x00b8b8b8, 0x00070707, 0x00040404,
150	0x009b9b9b, 0x00949494, 0x00212121, 0x00666666,
151	0x00e6e6e6, 0x00cecece, 0x00ededed, 0x00e7e7e7,
152	0x003b3b3b, 0x00fefefe, 0x007f7f7f, 0x00c5c5c5,
153	0x00a4a4a4, 0x00373737, 0x00b1b1b1, 0x004c4c4c,
154	0x00919191, 0x006e6e6e, 0x008d8d8d, 0x00767676,
155	0x00030303, 0x002d2d2d, 0x00dedede, 0x00969696,
156	0x00262626, 0x007d7d7d, 0x00c6c6c6, 0x005c5c5c,
157	0x00d3d3d3, 0x00f2f2f2, 0x004f4f4f, 0x00191919,
158	0x003f3f3f, 0x00dcdcdc, 0x00797979, 0x001d1d1d,
159	0x00525252, 0x00ebebeb, 0x00f3f3f3, 0x006d6d6d,
160	0x005e5e5e, 0x00fbfbfb, 0x00696969, 0x00b2b2b2,
161	0x00f0f0f0, 0x00313131, 0x000c0c0c, 0x00d4d4d4,
162	0x00cfcfcf, 0x008c8c8c, 0x00e2e2e2, 0x00757575,
163	0x00a9a9a9, 0x004a4a4a, 0x00575757, 0x00848484,
164	0x00111111, 0x00454545, 0x001b1b1b, 0x00f5f5f5,
165	0x00e4e4e4, 0x000e0e0e, 0x00737373, 0x00aaaaaa,
166	0x00f1f1f1, 0x00dddddd, 0x00595959, 0x00141414,
167	0x006c6c6c, 0x00929292, 0x00545454, 0x00d0d0d0,
168	0x00787878, 0x00707070, 0x00e3e3e3, 0x00494949,
169	0x00808080, 0x00505050, 0x00a7a7a7, 0x00f6f6f6,
170	0x00777777, 0x00939393, 0x00868686, 0x00838383,
171	0x002a2a2a, 0x00c7c7c7, 0x005b5b5b, 0x00e9e9e9,
172	0x00eeeeee, 0x008f8f8f, 0x00010101, 0x003d3d3d,
173};
174
175static const u32 camellia_sp3033[256] = {
176	0x38003838, 0x41004141, 0x16001616, 0x76007676,
177	0xd900d9d9, 0x93009393, 0x60006060, 0xf200f2f2,
178	0x72007272, 0xc200c2c2, 0xab00abab, 0x9a009a9a,
179	0x75007575, 0x06000606, 0x57005757, 0xa000a0a0,
180	0x91009191, 0xf700f7f7, 0xb500b5b5, 0xc900c9c9,
181	0xa200a2a2, 0x8c008c8c, 0xd200d2d2, 0x90009090,
182	0xf600f6f6, 0x07000707, 0xa700a7a7, 0x27002727,
183	0x8e008e8e, 0xb200b2b2, 0x49004949, 0xde00dede,
184	0x43004343, 0x5c005c5c, 0xd700d7d7, 0xc700c7c7,
185	0x3e003e3e, 0xf500f5f5, 0x8f008f8f, 0x67006767,
186	0x1f001f1f, 0x18001818, 0x6e006e6e, 0xaf00afaf,
187	0x2f002f2f, 0xe200e2e2, 0x85008585, 0x0d000d0d,
188	0x53005353, 0xf000f0f0, 0x9c009c9c, 0x65006565,
189	0xea00eaea, 0xa300a3a3, 0xae00aeae, 0x9e009e9e,
190	0xec00ecec, 0x80008080, 0x2d002d2d, 0x6b006b6b,
191	0xa800a8a8, 0x2b002b2b, 0x36003636, 0xa600a6a6,
192	0xc500c5c5, 0x86008686, 0x4d004d4d, 0x33003333,
193	0xfd00fdfd, 0x66006666, 0x58005858, 0x96009696,
194	0x3a003a3a, 0x09000909, 0x95009595, 0x10001010,
195	0x78007878, 0xd800d8d8, 0x42004242, 0xcc00cccc,
196	0xef00efef, 0x26002626, 0xe500e5e5, 0x61006161,
197	0x1a001a1a, 0x3f003f3f, 0x3b003b3b, 0x82008282,
198	0xb600b6b6, 0xdb00dbdb, 0xd400d4d4, 0x98009898,
199	0xe800e8e8, 0x8b008b8b, 0x02000202, 0xeb00ebeb,
200	0x0a000a0a, 0x2c002c2c, 0x1d001d1d, 0xb000b0b0,
201	0x6f006f6f, 0x8d008d8d, 0x88008888, 0x0e000e0e,
202	0x19001919, 0x87008787, 0x4e004e4e, 0x0b000b0b,
203	0xa900a9a9, 0x0c000c0c, 0x79007979, 0x11001111,
204	0x7f007f7f, 0x22002222, 0xe700e7e7, 0x59005959,
205	0xe100e1e1, 0xda00dada, 0x3d003d3d, 0xc800c8c8,
206	0x12001212, 0x04000404, 0x74007474, 0x54005454,
207	0x30003030, 0x7e007e7e, 0xb400b4b4, 0x28002828,
208	0x55005555, 0x68006868, 0x50005050, 0xbe00bebe,
209	0xd000d0d0, 0xc400c4c4, 0x31003131, 0xcb00cbcb,
210	0x2a002a2a, 0xad00adad, 0x0f000f0f, 0xca00caca,
211	0x70007070, 0xff00ffff, 0x32003232, 0x69006969,
212	0x08000808, 0x62006262, 0x00000000, 0x24002424,
213	0xd100d1d1, 0xfb00fbfb, 0xba00baba, 0xed00eded,
214	0x45004545, 0x81008181, 0x73007373, 0x6d006d6d,
215	0x84008484, 0x9f009f9f, 0xee00eeee, 0x4a004a4a,
216	0xc300c3c3, 0x2e002e2e, 0xc100c1c1, 0x01000101,
217	0xe600e6e6, 0x25002525, 0x48004848, 0x99009999,
218	0xb900b9b9, 0xb300b3b3, 0x7b007b7b, 0xf900f9f9,
219	0xce00cece, 0xbf00bfbf, 0xdf00dfdf, 0x71007171,
220	0x29002929, 0xcd00cdcd, 0x6c006c6c, 0x13001313,
221	0x64006464, 0x9b009b9b, 0x63006363, 0x9d009d9d,
222	0xc000c0c0, 0x4b004b4b, 0xb700b7b7, 0xa500a5a5,
223	0x89008989, 0x5f005f5f, 0xb100b1b1, 0x17001717,
224	0xf400f4f4, 0xbc00bcbc, 0xd300d3d3, 0x46004646,
225	0xcf00cfcf, 0x37003737, 0x5e005e5e, 0x47004747,
226	0x94009494, 0xfa00fafa, 0xfc00fcfc, 0x5b005b5b,
227	0x97009797, 0xfe00fefe, 0x5a005a5a, 0xac00acac,
228	0x3c003c3c, 0x4c004c4c, 0x03000303, 0x35003535,
229	0xf300f3f3, 0x23002323, 0xb800b8b8, 0x5d005d5d,
230	0x6a006a6a, 0x92009292, 0xd500d5d5, 0x21002121,
231	0x44004444, 0x51005151, 0xc600c6c6, 0x7d007d7d,
232	0x39003939, 0x83008383, 0xdc00dcdc, 0xaa00aaaa,
233	0x7c007c7c, 0x77007777, 0x56005656, 0x05000505,
234	0x1b001b1b, 0xa400a4a4, 0x15001515, 0x34003434,
235	0x1e001e1e, 0x1c001c1c, 0xf800f8f8, 0x52005252,
236	0x20002020, 0x14001414, 0xe900e9e9, 0xbd00bdbd,
237	0xdd00dddd, 0xe400e4e4, 0xa100a1a1, 0xe000e0e0,
238	0x8a008a8a, 0xf100f1f1, 0xd600d6d6, 0x7a007a7a,
239	0xbb00bbbb, 0xe300e3e3, 0x40004040, 0x4f004f4f,
240};
241
242static const u32 camellia_sp4404[256] = {
243	0x70700070, 0x2c2c002c, 0xb3b300b3, 0xc0c000c0,
244	0xe4e400e4, 0x57570057, 0xeaea00ea, 0xaeae00ae,
245	0x23230023, 0x6b6b006b, 0x45450045, 0xa5a500a5,
246	0xeded00ed, 0x4f4f004f, 0x1d1d001d, 0x92920092,
247	0x86860086, 0xafaf00af, 0x7c7c007c, 0x1f1f001f,
248	0x3e3e003e, 0xdcdc00dc, 0x5e5e005e, 0x0b0b000b,
249	0xa6a600a6, 0x39390039, 0xd5d500d5, 0x5d5d005d,
250	0xd9d900d9, 0x5a5a005a, 0x51510051, 0x6c6c006c,
251	0x8b8b008b, 0x9a9a009a, 0xfbfb00fb, 0xb0b000b0,
252	0x74740074, 0x2b2b002b, 0xf0f000f0, 0x84840084,
253	0xdfdf00df, 0xcbcb00cb, 0x34340034, 0x76760076,
254	0x6d6d006d, 0xa9a900a9, 0xd1d100d1, 0x04040004,
255	0x14140014, 0x3a3a003a, 0xdede00de, 0x11110011,
256	0x32320032, 0x9c9c009c, 0x53530053, 0xf2f200f2,
257	0xfefe00fe, 0xcfcf00cf, 0xc3c300c3, 0x7a7a007a,
258	0x24240024, 0xe8e800e8, 0x60600060, 0x69690069,
259	0xaaaa00aa, 0xa0a000a0, 0xa1a100a1, 0x62620062,
260	0x54540054, 0x1e1e001e, 0xe0e000e0, 0x64640064,
261	0x10100010, 0x00000000, 0xa3a300a3, 0x75750075,
262	0x8a8a008a, 0xe6e600e6, 0x09090009, 0xdddd00dd,
263	0x87870087, 0x83830083, 0xcdcd00cd, 0x90900090,
264	0x73730073, 0xf6f600f6, 0x9d9d009d, 0xbfbf00bf,
265	0x52520052, 0xd8d800d8, 0xc8c800c8, 0xc6c600c6,
266	0x81810081, 0x6f6f006f, 0x13130013, 0x63630063,
267	0xe9e900e9, 0xa7a700a7, 0x9f9f009f, 0xbcbc00bc,
268	0x29290029, 0xf9f900f9, 0x2f2f002f, 0xb4b400b4,
269	0x78780078, 0x06060006, 0xe7e700e7, 0x71710071,
270	0xd4d400d4, 0xabab00ab, 0x88880088, 0x8d8d008d,
271	0x72720072, 0xb9b900b9, 0xf8f800f8, 0xacac00ac,
272	0x36360036, 0x2a2a002a, 0x3c3c003c, 0xf1f100f1,
273	0x40400040, 0xd3d300d3, 0xbbbb00bb, 0x43430043,
274	0x15150015, 0xadad00ad, 0x77770077, 0x80800080,
275	0x82820082, 0xecec00ec, 0x27270027, 0xe5e500e5,
276	0x85850085, 0x35350035, 0x0c0c000c, 0x41410041,
277	0xefef00ef, 0x93930093, 0x19190019, 0x21210021,
278	0x0e0e000e, 0x4e4e004e, 0x65650065, 0xbdbd00bd,
279	0xb8b800b8, 0x8f8f008f, 0xebeb00eb, 0xcece00ce,
280	0x30300030, 0x5f5f005f, 0xc5c500c5, 0x1a1a001a,
281	0xe1e100e1, 0xcaca00ca, 0x47470047, 0x3d3d003d,
282	0x01010001, 0xd6d600d6, 0x56560056, 0x4d4d004d,
283	0x0d0d000d, 0x66660066, 0xcccc00cc, 0x2d2d002d,
284	0x12120012, 0x20200020, 0xb1b100b1, 0x99990099,
285	0x4c4c004c, 0xc2c200c2, 0x7e7e007e, 0x05050005,
286	0xb7b700b7, 0x31310031, 0x17170017, 0xd7d700d7,
287	0x58580058, 0x61610061, 0x1b1b001b, 0x1c1c001c,
288	0x0f0f000f, 0x16160016, 0x18180018, 0x22220022,
289	0x44440044, 0xb2b200b2, 0xb5b500b5, 0x91910091,
290	0x08080008, 0xa8a800a8, 0xfcfc00fc, 0x50500050,
291	0xd0d000d0, 0x7d7d007d, 0x89890089, 0x97970097,
292	0x5b5b005b, 0x95950095, 0xffff00ff, 0xd2d200d2,
293	0xc4c400c4, 0x48480048, 0xf7f700f7, 0xdbdb00db,
294	0x03030003, 0xdada00da, 0x3f3f003f, 0x94940094,
295	0x5c5c005c, 0x02020002, 0x4a4a004a, 0x33330033,
296	0x67670067, 0xf3f300f3, 0x7f7f007f, 0xe2e200e2,
297	0x9b9b009b, 0x26260026, 0x37370037, 0x3b3b003b,
298	0x96960096, 0x4b4b004b, 0xbebe00be, 0x2e2e002e,
299	0x79790079, 0x8c8c008c, 0x6e6e006e, 0x8e8e008e,
300	0xf5f500f5, 0xb6b600b6, 0xfdfd00fd, 0x59590059,
301	0x98980098, 0x6a6a006a, 0x46460046, 0xbaba00ba,
302	0x25250025, 0x42420042, 0xa2a200a2, 0xfafa00fa,
303	0x07070007, 0x55550055, 0xeeee00ee, 0x0a0a000a,
304	0x49490049, 0x68680068, 0x38380038, 0xa4a400a4,
305	0x28280028, 0x7b7b007b, 0xc9c900c9, 0xc1c100c1,
306	0xe3e300e3, 0xf4f400f4, 0xc7c700c7, 0x9e9e009e,
307};
308
309
310#define CAMELLIA_MIN_KEY_SIZE        16
311#define CAMELLIA_MAX_KEY_SIZE        32
312#define CAMELLIA_BLOCK_SIZE          16
313#define CAMELLIA_TABLE_BYTE_LEN     272
314
315/*
316 * NB: L and R below stand for 'left' and 'right' as in written numbers.
317 * That is, in (xxxL,xxxR) pair xxxL holds most significant digits,
318 * _not_ least significant ones!
319 */
320
321
322/* key constants */
323
324#define CAMELLIA_SIGMA1L (0xA09E667FL)
325#define CAMELLIA_SIGMA1R (0x3BCC908BL)
326#define CAMELLIA_SIGMA2L (0xB67AE858L)
327#define CAMELLIA_SIGMA2R (0x4CAA73B2L)
328#define CAMELLIA_SIGMA3L (0xC6EF372FL)
329#define CAMELLIA_SIGMA3R (0xE94F82BEL)
330#define CAMELLIA_SIGMA4L (0x54FF53A5L)
331#define CAMELLIA_SIGMA4R (0xF1D36F1CL)
332#define CAMELLIA_SIGMA5L (0x10E527FAL)
333#define CAMELLIA_SIGMA5R (0xDE682D1DL)
334#define CAMELLIA_SIGMA6L (0xB05688C2L)
335#define CAMELLIA_SIGMA6R (0xB3E6C1FDL)
336
337/*
338 *  macros
339 */
340#define ROLDQ(ll, lr, rl, rr, w0, w1, bits)		\
341    do {						\
342	w0 = ll;					\
343	ll = (ll << bits) + (lr >> (32 - bits));	\
344	lr = (lr << bits) + (rl >> (32 - bits));	\
345	rl = (rl << bits) + (rr >> (32 - bits));	\
346	rr = (rr << bits) + (w0 >> (32 - bits));	\
347    } while (0)
348
349#define ROLDQo32(ll, lr, rl, rr, w0, w1, bits)		\
350    do {						\
351	w0 = ll;					\
352	w1 = lr;					\
353	ll = (lr << (bits - 32)) + (rl >> (64 - bits));	\
354	lr = (rl << (bits - 32)) + (rr >> (64 - bits));	\
355	rl = (rr << (bits - 32)) + (w0 >> (64 - bits));	\
356	rr = (w0 << (bits - 32)) + (w1 >> (64 - bits));	\
357    } while (0)
358
359#define CAMELLIA_F(xl, xr, kl, kr, yl, yr, il, ir, t0, t1)	\
360    do {							\
361	il = xl ^ kl;						\
362	ir = xr ^ kr;						\
363	t0 = il >> 16;						\
364	t1 = ir >> 16;						\
365	yl = camellia_sp1110[(u8)(ir     )]			\
366	   ^ camellia_sp0222[    (t1 >> 8)]			\
367	   ^ camellia_sp3033[(u8)(t1     )]			\
368	   ^ camellia_sp4404[(u8)(ir >> 8)];			\
369	yr = camellia_sp1110[    (t0 >> 8)]			\
370	   ^ camellia_sp0222[(u8)(t0     )]			\
371	   ^ camellia_sp3033[(u8)(il >> 8)]			\
372	   ^ camellia_sp4404[(u8)(il     )];			\
373	yl ^= yr;						\
374	yr = ror32(yr, 8);					\
375	yr ^= yl;						\
376    } while (0)
377
378#define SUBKEY_L(INDEX) (subkey[(INDEX)*2])
379#define SUBKEY_R(INDEX) (subkey[(INDEX)*2 + 1])
380
381static void camellia_setup_tail(u32 *subkey, u32 *subL, u32 *subR, int max)
382{
383	u32 dw, tl, tr;
384	u32 kw4l, kw4r;
385	int i;
386
387	/* absorb kw2 to other subkeys */
388	/* round 2 */
389	subL[3] ^= subL[1]; subR[3] ^= subR[1];
390	/* round 4 */
391	subL[5] ^= subL[1]; subR[5] ^= subR[1];
392	/* round 6 */
393	subL[7] ^= subL[1]; subR[7] ^= subR[1];
394	subL[1] ^= subR[1] & ~subR[9];
395	dw = subL[1] & subL[9],
396		subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl2) */
397	/* round 8 */
398	subL[11] ^= subL[1]; subR[11] ^= subR[1];
399	/* round 10 */
400	subL[13] ^= subL[1]; subR[13] ^= subR[1];
401	/* round 12 */
402	subL[15] ^= subL[1]; subR[15] ^= subR[1];
403	subL[1] ^= subR[1] & ~subR[17];
404	dw = subL[1] & subL[17],
405		subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl4) */
406	/* round 14 */
407	subL[19] ^= subL[1]; subR[19] ^= subR[1];
408	/* round 16 */
409	subL[21] ^= subL[1]; subR[21] ^= subR[1];
410	/* round 18 */
411	subL[23] ^= subL[1]; subR[23] ^= subR[1];
412	if (max == 24) {
413		/* kw3 */
414		subL[24] ^= subL[1]; subR[24] ^= subR[1];
415
416	/* absorb kw4 to other subkeys */
417		kw4l = subL[25]; kw4r = subR[25];
418	} else {
419		subL[1] ^= subR[1] & ~subR[25];
420		dw = subL[1] & subL[25],
421			subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl6) */
422		/* round 20 */
423		subL[27] ^= subL[1]; subR[27] ^= subR[1];
424		/* round 22 */
425		subL[29] ^= subL[1]; subR[29] ^= subR[1];
426		/* round 24 */
427		subL[31] ^= subL[1]; subR[31] ^= subR[1];
428		/* kw3 */
429		subL[32] ^= subL[1]; subR[32] ^= subR[1];
430
431	/* absorb kw4 to other subkeys */
432		kw4l = subL[33]; kw4r = subR[33];
433		/* round 23 */
434		subL[30] ^= kw4l; subR[30] ^= kw4r;
435		/* round 21 */
436		subL[28] ^= kw4l; subR[28] ^= kw4r;
437		/* round 19 */
438		subL[26] ^= kw4l; subR[26] ^= kw4r;
439		kw4l ^= kw4r & ~subR[24];
440		dw = kw4l & subL[24],
441			kw4r ^= rol32(dw, 1); /* modified for FL(kl5) */
442	}
443	/* round 17 */
444	subL[22] ^= kw4l; subR[22] ^= kw4r;
445	/* round 15 */
446	subL[20] ^= kw4l; subR[20] ^= kw4r;
447	/* round 13 */
448	subL[18] ^= kw4l; subR[18] ^= kw4r;
449	kw4l ^= kw4r & ~subR[16];
450	dw = kw4l & subL[16],
451		kw4r ^= rol32(dw, 1); /* modified for FL(kl3) */
452	/* round 11 */
453	subL[14] ^= kw4l; subR[14] ^= kw4r;
454	/* round 9 */
455	subL[12] ^= kw4l; subR[12] ^= kw4r;
456	/* round 7 */
457	subL[10] ^= kw4l; subR[10] ^= kw4r;
458	kw4l ^= kw4r & ~subR[8];
459	dw = kw4l & subL[8],
460		kw4r ^= rol32(dw, 1); /* modified for FL(kl1) */
461	/* round 5 */
462	subL[6] ^= kw4l; subR[6] ^= kw4r;
463	/* round 3 */
464	subL[4] ^= kw4l; subR[4] ^= kw4r;
465	/* round 1 */
466	subL[2] ^= kw4l; subR[2] ^= kw4r;
467	/* kw1 */
468	subL[0] ^= kw4l; subR[0] ^= kw4r;
469
470	/* key XOR is end of F-function */
471	SUBKEY_L(0) = subL[0] ^ subL[2];/* kw1 */
472	SUBKEY_R(0) = subR[0] ^ subR[2];
473	SUBKEY_L(2) = subL[3];       /* round 1 */
474	SUBKEY_R(2) = subR[3];
475	SUBKEY_L(3) = subL[2] ^ subL[4]; /* round 2 */
476	SUBKEY_R(3) = subR[2] ^ subR[4];
477	SUBKEY_L(4) = subL[3] ^ subL[5]; /* round 3 */
478	SUBKEY_R(4) = subR[3] ^ subR[5];
479	SUBKEY_L(5) = subL[4] ^ subL[6]; /* round 4 */
480	SUBKEY_R(5) = subR[4] ^ subR[6];
481	SUBKEY_L(6) = subL[5] ^ subL[7]; /* round 5 */
482	SUBKEY_R(6) = subR[5] ^ subR[7];
483	tl = subL[10] ^ (subR[10] & ~subR[8]);
484	dw = tl & subL[8],  /* FL(kl1) */
485		tr = subR[10] ^ rol32(dw, 1);
486	SUBKEY_L(7) = subL[6] ^ tl; /* round 6 */
487	SUBKEY_R(7) = subR[6] ^ tr;
488	SUBKEY_L(8) = subL[8];       /* FL(kl1) */
489	SUBKEY_R(8) = subR[8];
490	SUBKEY_L(9) = subL[9];       /* FLinv(kl2) */
491	SUBKEY_R(9) = subR[9];
492	tl = subL[7] ^ (subR[7] & ~subR[9]);
493	dw = tl & subL[9],  /* FLinv(kl2) */
494		tr = subR[7] ^ rol32(dw, 1);
495	SUBKEY_L(10) = tl ^ subL[11]; /* round 7 */
496	SUBKEY_R(10) = tr ^ subR[11];
497	SUBKEY_L(11) = subL[10] ^ subL[12]; /* round 8 */
498	SUBKEY_R(11) = subR[10] ^ subR[12];
499	SUBKEY_L(12) = subL[11] ^ subL[13]; /* round 9 */
500	SUBKEY_R(12) = subR[11] ^ subR[13];
501	SUBKEY_L(13) = subL[12] ^ subL[14]; /* round 10 */
502	SUBKEY_R(13) = subR[12] ^ subR[14];
503	SUBKEY_L(14) = subL[13] ^ subL[15]; /* round 11 */
504	SUBKEY_R(14) = subR[13] ^ subR[15];
505	tl = subL[18] ^ (subR[18] & ~subR[16]);
506	dw = tl & subL[16], /* FL(kl3) */
507		tr = subR[18] ^ rol32(dw, 1);
508	SUBKEY_L(15) = subL[14] ^ tl; /* round 12 */
509	SUBKEY_R(15) = subR[14] ^ tr;
510	SUBKEY_L(16) = subL[16];     /* FL(kl3) */
511	SUBKEY_R(16) = subR[16];
512	SUBKEY_L(17) = subL[17];     /* FLinv(kl4) */
513	SUBKEY_R(17) = subR[17];
514	tl = subL[15] ^ (subR[15] & ~subR[17]);
515	dw = tl & subL[17], /* FLinv(kl4) */
516		tr = subR[15] ^ rol32(dw, 1);
517	SUBKEY_L(18) = tl ^ subL[19]; /* round 13 */
518	SUBKEY_R(18) = tr ^ subR[19];
519	SUBKEY_L(19) = subL[18] ^ subL[20]; /* round 14 */
520	SUBKEY_R(19) = subR[18] ^ subR[20];
521	SUBKEY_L(20) = subL[19] ^ subL[21]; /* round 15 */
522	SUBKEY_R(20) = subR[19] ^ subR[21];
523	SUBKEY_L(21) = subL[20] ^ subL[22]; /* round 16 */
524	SUBKEY_R(21) = subR[20] ^ subR[22];
525	SUBKEY_L(22) = subL[21] ^ subL[23]; /* round 17 */
526	SUBKEY_R(22) = subR[21] ^ subR[23];
527	if (max == 24) {
528		SUBKEY_L(23) = subL[22];     /* round 18 */
529		SUBKEY_R(23) = subR[22];
530		SUBKEY_L(24) = subL[24] ^ subL[23]; /* kw3 */
531		SUBKEY_R(24) = subR[24] ^ subR[23];
532	} else {
533		tl = subL[26] ^ (subR[26] & ~subR[24]);
534		dw = tl & subL[24], /* FL(kl5) */
535			tr = subR[26] ^ rol32(dw, 1);
536		SUBKEY_L(23) = subL[22] ^ tl; /* round 18 */
537		SUBKEY_R(23) = subR[22] ^ tr;
538		SUBKEY_L(24) = subL[24];     /* FL(kl5) */
539		SUBKEY_R(24) = subR[24];
540		SUBKEY_L(25) = subL[25];     /* FLinv(kl6) */
541		SUBKEY_R(25) = subR[25];
542		tl = subL[23] ^ (subR[23] & ~subR[25]);
543		dw = tl & subL[25], /* FLinv(kl6) */
544			tr = subR[23] ^ rol32(dw, 1);
545		SUBKEY_L(26) = tl ^ subL[27]; /* round 19 */
546		SUBKEY_R(26) = tr ^ subR[27];
547		SUBKEY_L(27) = subL[26] ^ subL[28]; /* round 20 */
548		SUBKEY_R(27) = subR[26] ^ subR[28];
549		SUBKEY_L(28) = subL[27] ^ subL[29]; /* round 21 */
550		SUBKEY_R(28) = subR[27] ^ subR[29];
551		SUBKEY_L(29) = subL[28] ^ subL[30]; /* round 22 */
552		SUBKEY_R(29) = subR[28] ^ subR[30];
553		SUBKEY_L(30) = subL[29] ^ subL[31]; /* round 23 */
554		SUBKEY_R(30) = subR[29] ^ subR[31];
555		SUBKEY_L(31) = subL[30];     /* round 24 */
556		SUBKEY_R(31) = subR[30];
557		SUBKEY_L(32) = subL[32] ^ subL[31]; /* kw3 */
558		SUBKEY_R(32) = subR[32] ^ subR[31];
559	}
560
561	/* apply the inverse of the last half of P-function */
562	i = 2;
563	do {
564		dw = SUBKEY_L(i + 0) ^ SUBKEY_R(i + 0); dw = rol32(dw, 8);/* round 1 */
565		SUBKEY_R(i + 0) = SUBKEY_L(i + 0) ^ dw; SUBKEY_L(i + 0) = dw;
566		dw = SUBKEY_L(i + 1) ^ SUBKEY_R(i + 1); dw = rol32(dw, 8);/* round 2 */
567		SUBKEY_R(i + 1) = SUBKEY_L(i + 1) ^ dw; SUBKEY_L(i + 1) = dw;
568		dw = SUBKEY_L(i + 2) ^ SUBKEY_R(i + 2); dw = rol32(dw, 8);/* round 3 */
569		SUBKEY_R(i + 2) = SUBKEY_L(i + 2) ^ dw; SUBKEY_L(i + 2) = dw;
570		dw = SUBKEY_L(i + 3) ^ SUBKEY_R(i + 3); dw = rol32(dw, 8);/* round 4 */
571		SUBKEY_R(i + 3) = SUBKEY_L(i + 3) ^ dw; SUBKEY_L(i + 3) = dw;
572		dw = SUBKEY_L(i + 4) ^ SUBKEY_R(i + 4); dw = rol32(dw, 8);/* round 5 */
573		SUBKEY_R(i + 4) = SUBKEY_L(i + 4) ^ dw; SUBKEY_L(i + 4) = dw;
574		dw = SUBKEY_L(i + 5) ^ SUBKEY_R(i + 5); dw = rol32(dw, 8);/* round 6 */
575		SUBKEY_R(i + 5) = SUBKEY_L(i + 5) ^ dw; SUBKEY_L(i + 5) = dw;
576		i += 8;
577	} while (i < max);
578}
579
580static void camellia_setup128(const unsigned char *key, u32 *subkey)
581{
582	u32 kll, klr, krl, krr;
583	u32 il, ir, t0, t1, w0, w1;
584	u32 subL[26];
585	u32 subR[26];
586
587	/**
588	 *  k == kll || klr || krl || krr (|| is concatenation)
589	 */
590	kll = get_unaligned_be32(key);
591	klr = get_unaligned_be32(key + 4);
592	krl = get_unaligned_be32(key + 8);
593	krr = get_unaligned_be32(key + 12);
594
595	/* generate KL dependent subkeys */
596	/* kw1 */
597	subL[0] = kll; subR[0] = klr;
598	/* kw2 */
599	subL[1] = krl; subR[1] = krr;
600	/* rotation left shift 15bit */
601	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
602	/* k3 */
603	subL[4] = kll; subR[4] = klr;
604	/* k4 */
605	subL[5] = krl; subR[5] = krr;
606	/* rotation left shift 15+30bit */
607	ROLDQ(kll, klr, krl, krr, w0, w1, 30);
608	/* k7 */
609	subL[10] = kll; subR[10] = klr;
610	/* k8 */
611	subL[11] = krl; subR[11] = krr;
612	/* rotation left shift 15+30+15bit */
613	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
614	/* k10 */
615	subL[13] = krl; subR[13] = krr;
616	/* rotation left shift 15+30+15+17 bit */
617	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
618	/* kl3 */
619	subL[16] = kll; subR[16] = klr;
620	/* kl4 */
621	subL[17] = krl; subR[17] = krr;
622	/* rotation left shift 15+30+15+17+17 bit */
623	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
624	/* k13 */
625	subL[18] = kll; subR[18] = klr;
626	/* k14 */
627	subL[19] = krl; subR[19] = krr;
628	/* rotation left shift 15+30+15+17+17+17 bit */
629	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
630	/* k17 */
631	subL[22] = kll; subR[22] = klr;
632	/* k18 */
633	subL[23] = krl; subR[23] = krr;
634
635	/* generate KA */
636	kll = subL[0]; klr = subR[0];
637	krl = subL[1]; krr = subR[1];
638	CAMELLIA_F(kll, klr,
639		   CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
640		   w0, w1, il, ir, t0, t1);
641	krl ^= w0; krr ^= w1;
642	CAMELLIA_F(krl, krr,
643		   CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
644		   kll, klr, il, ir, t0, t1);
645	/* current status == (kll, klr, w0, w1) */
646	CAMELLIA_F(kll, klr,
647		   CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
648		   krl, krr, il, ir, t0, t1);
649	krl ^= w0; krr ^= w1;
650	CAMELLIA_F(krl, krr,
651		   CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
652		   w0, w1, il, ir, t0, t1);
653	kll ^= w0; klr ^= w1;
654
655	/* generate KA dependent subkeys */
656	/* k1, k2 */
657	subL[2] = kll; subR[2] = klr;
658	subL[3] = krl; subR[3] = krr;
659	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
660	/* k5,k6 */
661	subL[6] = kll; subR[6] = klr;
662	subL[7] = krl; subR[7] = krr;
663	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
664	/* kl1, kl2 */
665	subL[8] = kll; subR[8] = klr;
666	subL[9] = krl; subR[9] = krr;
667	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
668	/* k9 */
669	subL[12] = kll; subR[12] = klr;
670	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
671	/* k11, k12 */
672	subL[14] = kll; subR[14] = klr;
673	subL[15] = krl; subR[15] = krr;
674	ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
675	/* k15, k16 */
676	subL[20] = kll; subR[20] = klr;
677	subL[21] = krl; subR[21] = krr;
678	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
679	/* kw3, kw4 */
680	subL[24] = kll; subR[24] = klr;
681	subL[25] = krl; subR[25] = krr;
682
683	camellia_setup_tail(subkey, subL, subR, 24);
684}
685
686static void camellia_setup256(const unsigned char *key, u32 *subkey)
687{
688	u32 kll, klr, krl, krr;        /* left half of key */
689	u32 krll, krlr, krrl, krrr;    /* right half of key */
690	u32 il, ir, t0, t1, w0, w1;    /* temporary variables */
691	u32 subL[34];
692	u32 subR[34];
693
694	/**
695	 *  key = (kll || klr || krl || krr || krll || krlr || krrl || krrr)
696	 *  (|| is concatenation)
697	 */
698	kll = get_unaligned_be32(key);
699	klr = get_unaligned_be32(key + 4);
700	krl = get_unaligned_be32(key + 8);
701	krr = get_unaligned_be32(key + 12);
702	krll = get_unaligned_be32(key + 16);
703	krlr = get_unaligned_be32(key + 20);
704	krrl = get_unaligned_be32(key + 24);
705	krrr = get_unaligned_be32(key + 28);
706
707	/* generate KL dependent subkeys */
708	/* kw1 */
709	subL[0] = kll; subR[0] = klr;
710	/* kw2 */
711	subL[1] = krl; subR[1] = krr;
712	ROLDQo32(kll, klr, krl, krr, w0, w1, 45);
713	/* k9 */
714	subL[12] = kll; subR[12] = klr;
715	/* k10 */
716	subL[13] = krl; subR[13] = krr;
717	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
718	/* kl3 */
719	subL[16] = kll; subR[16] = klr;
720	/* kl4 */
721	subL[17] = krl; subR[17] = krr;
722	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
723	/* k17 */
724	subL[22] = kll; subR[22] = klr;
725	/* k18 */
726	subL[23] = krl; subR[23] = krr;
727	ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
728	/* k23 */
729	subL[30] = kll; subR[30] = klr;
730	/* k24 */
731	subL[31] = krl; subR[31] = krr;
732
733	/* generate KR dependent subkeys */
734	ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
735	/* k3 */
736	subL[4] = krll; subR[4] = krlr;
737	/* k4 */
738	subL[5] = krrl; subR[5] = krrr;
739	ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
740	/* kl1 */
741	subL[8] = krll; subR[8] = krlr;
742	/* kl2 */
743	subL[9] = krrl; subR[9] = krrr;
744	ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
745	/* k13 */
746	subL[18] = krll; subR[18] = krlr;
747	/* k14 */
748	subL[19] = krrl; subR[19] = krrr;
749	ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
750	/* k19 */
751	subL[26] = krll; subR[26] = krlr;
752	/* k20 */
753	subL[27] = krrl; subR[27] = krrr;
754	ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
755
756	/* generate KA */
757	kll = subL[0] ^ krll; klr = subR[0] ^ krlr;
758	krl = subL[1] ^ krrl; krr = subR[1] ^ krrr;
759	CAMELLIA_F(kll, klr,
760		   CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
761		   w0, w1, il, ir, t0, t1);
762	krl ^= w0; krr ^= w1;
763	CAMELLIA_F(krl, krr,
764		   CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
765		   kll, klr, il, ir, t0, t1);
766	kll ^= krll; klr ^= krlr;
767	CAMELLIA_F(kll, klr,
768		   CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
769		   krl, krr, il, ir, t0, t1);
770	krl ^= w0 ^ krrl; krr ^= w1 ^ krrr;
771	CAMELLIA_F(krl, krr,
772		   CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
773		   w0, w1, il, ir, t0, t1);
774	kll ^= w0; klr ^= w1;
775
776	/* generate KB */
777	krll ^= kll; krlr ^= klr;
778	krrl ^= krl; krrr ^= krr;
779	CAMELLIA_F(krll, krlr,
780		   CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R,
781		   w0, w1, il, ir, t0, t1);
782	krrl ^= w0; krrr ^= w1;
783	CAMELLIA_F(krrl, krrr,
784		   CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R,
785		   w0, w1, il, ir, t0, t1);
786	krll ^= w0; krlr ^= w1;
787
788	/* generate KA dependent subkeys */
789	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
790	/* k5 */
791	subL[6] = kll; subR[6] = klr;
792	/* k6 */
793	subL[7] = krl; subR[7] = krr;
794	ROLDQ(kll, klr, krl, krr, w0, w1, 30);
795	/* k11 */
796	subL[14] = kll; subR[14] = klr;
797	/* k12 */
798	subL[15] = krl; subR[15] = krr;
799	/* rotation left shift 32bit */
800	/* kl5 */
801	subL[24] = klr; subR[24] = krl;
802	/* kl6 */
803	subL[25] = krr; subR[25] = kll;
804	/* rotation left shift 49 from k11,k12 -> k21,k22 */
805	ROLDQo32(kll, klr, krl, krr, w0, w1, 49);
806	/* k21 */
807	subL[28] = kll; subR[28] = klr;
808	/* k22 */
809	subL[29] = krl; subR[29] = krr;
810
811	/* generate KB dependent subkeys */
812	/* k1 */
813	subL[2] = krll; subR[2] = krlr;
814	/* k2 */
815	subL[3] = krrl; subR[3] = krrr;
816	ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
817	/* k7 */
818	subL[10] = krll; subR[10] = krlr;
819	/* k8 */
820	subL[11] = krrl; subR[11] = krrr;
821	ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
822	/* k15 */
823	subL[20] = krll; subR[20] = krlr;
824	/* k16 */
825	subL[21] = krrl; subR[21] = krrr;
826	ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 51);
827	/* kw3 */
828	subL[32] = krll; subR[32] = krlr;
829	/* kw4 */
830	subL[33] = krrl; subR[33] = krrr;
831
832	camellia_setup_tail(subkey, subL, subR, 32);
833}
834
835static void camellia_setup192(const unsigned char *key, u32 *subkey)
836{
837	unsigned char kk[32];
838	u32 krll, krlr, krrl, krrr;
839
840	memcpy(kk, key, 24);
841	memcpy((unsigned char *)&krll, key+16, 4);
842	memcpy((unsigned char *)&krlr, key+20, 4);
843	krrl = ~krll;
844	krrr = ~krlr;
845	memcpy(kk+24, (unsigned char *)&krrl, 4);
846	memcpy(kk+28, (unsigned char *)&krrr, 4);
847	camellia_setup256(kk, subkey);
848}
849
850
851/*
852 * Encrypt/decrypt
853 */
854#define CAMELLIA_FLS(ll, lr, rl, rr, kll, klr, krl, krr, t0, t1, t2, t3) \
855    do {								\
856	t0 = kll;							\
857	t2 = krr;							\
858	t0 &= ll;							\
859	t2 |= rr;							\
860	rl ^= t2;							\
861	lr ^= rol32(t0, 1);						\
862	t3 = krl;							\
863	t1 = klr;							\
864	t3 &= rl;							\
865	t1 |= lr;							\
866	ll ^= t1;							\
867	rr ^= rol32(t3, 1);						\
868    } while (0)
869
870#define CAMELLIA_ROUNDSM(xl, xr, kl, kr, yl, yr, il, ir)		\
871    do {								\
872	ir =  camellia_sp1110[(u8)xr];					\
873	il =  camellia_sp1110[    (xl >> 24)];				\
874	ir ^= camellia_sp0222[    (xr >> 24)];				\
875	il ^= camellia_sp0222[(u8)(xl >> 16)];				\
876	ir ^= camellia_sp3033[(u8)(xr >> 16)];				\
877	il ^= camellia_sp3033[(u8)(xl >> 8)];				\
878	ir ^= camellia_sp4404[(u8)(xr >> 8)];				\
879	il ^= camellia_sp4404[(u8)xl];					\
880	il ^= kl;							\
881	ir ^= il ^ kr;							\
882	yl ^= ir;							\
883	yr ^= ror32(il, 8) ^ ir;						\
884    } while (0)
885
886/* max = 24: 128bit encrypt, max = 32: 256bit encrypt */
887static void camellia_do_encrypt(const u32 *subkey, u32 *io, unsigned max)
888{
889	u32 il, ir, t0, t1;            /* temporary variables */
890
891	/* pre whitening but absorb kw2 */
892	io[0] ^= SUBKEY_L(0);
893	io[1] ^= SUBKEY_R(0);
894
895	/* main iteration */
896#define ROUNDS(i) do { \
897	CAMELLIA_ROUNDSM(io[0], io[1], \
898			 SUBKEY_L(i + 2), SUBKEY_R(i + 2), \
899			 io[2], io[3], il, ir); \
900	CAMELLIA_ROUNDSM(io[2], io[3], \
901			 SUBKEY_L(i + 3), SUBKEY_R(i + 3), \
902			 io[0], io[1], il, ir); \
903	CAMELLIA_ROUNDSM(io[0], io[1], \
904			 SUBKEY_L(i + 4), SUBKEY_R(i + 4), \
905			 io[2], io[3], il, ir); \
906	CAMELLIA_ROUNDSM(io[2], io[3], \
907			 SUBKEY_L(i + 5), SUBKEY_R(i + 5), \
908			 io[0], io[1], il, ir); \
909	CAMELLIA_ROUNDSM(io[0], io[1], \
910			 SUBKEY_L(i + 6), SUBKEY_R(i + 6), \
911			 io[2], io[3], il, ir); \
912	CAMELLIA_ROUNDSM(io[2], io[3], \
913			 SUBKEY_L(i + 7), SUBKEY_R(i + 7), \
914			 io[0], io[1], il, ir); \
915} while (0)
916#define FLS(i) do { \
917	CAMELLIA_FLS(io[0], io[1], io[2], io[3], \
918		     SUBKEY_L(i + 0), SUBKEY_R(i + 0), \
919		     SUBKEY_L(i + 1), SUBKEY_R(i + 1), \
920		     t0, t1, il, ir); \
921} while (0)
922
923	ROUNDS(0);
924	FLS(8);
925	ROUNDS(8);
926	FLS(16);
927	ROUNDS(16);
928	if (max == 32) {
929		FLS(24);
930		ROUNDS(24);
931	}
932
933#undef ROUNDS
934#undef FLS
935
936	/* post whitening but kw4 */
937	io[2] ^= SUBKEY_L(max);
938	io[3] ^= SUBKEY_R(max);
939	/* NB: io[0],[1] should be swapped with [2],[3] by caller! */
940}
941
942static void camellia_do_decrypt(const u32 *subkey, u32 *io, unsigned i)
943{
944	u32 il, ir, t0, t1;            /* temporary variables */
945
946	/* pre whitening but absorb kw2 */
947	io[0] ^= SUBKEY_L(i);
948	io[1] ^= SUBKEY_R(i);
949
950	/* main iteration */
951#define ROUNDS(i) do { \
952	CAMELLIA_ROUNDSM(io[0], io[1], \
953			 SUBKEY_L(i + 7), SUBKEY_R(i + 7), \
954			 io[2], io[3], il, ir); \
955	CAMELLIA_ROUNDSM(io[2], io[3], \
956			 SUBKEY_L(i + 6), SUBKEY_R(i + 6), \
957			 io[0], io[1], il, ir); \
958	CAMELLIA_ROUNDSM(io[0], io[1], \
959			 SUBKEY_L(i + 5), SUBKEY_R(i + 5), \
960			 io[2], io[3], il, ir); \
961	CAMELLIA_ROUNDSM(io[2], io[3], \
962			 SUBKEY_L(i + 4), SUBKEY_R(i + 4), \
963			 io[0], io[1], il, ir); \
964	CAMELLIA_ROUNDSM(io[0], io[1], \
965			 SUBKEY_L(i + 3), SUBKEY_R(i + 3), \
966			 io[2], io[3], il, ir); \
967	CAMELLIA_ROUNDSM(io[2], io[3], \
968			 SUBKEY_L(i + 2), SUBKEY_R(i + 2), \
969			 io[0], io[1], il, ir); \
970} while (0)
971#define FLS(i) do { \
972	CAMELLIA_FLS(io[0], io[1], io[2], io[3], \
973		     SUBKEY_L(i + 1), SUBKEY_R(i + 1), \
974		     SUBKEY_L(i + 0), SUBKEY_R(i + 0), \
975		     t0, t1, il, ir); \
976} while (0)
977
978	if (i == 32) {
979		ROUNDS(24);
980		FLS(24);
981	}
982	ROUNDS(16);
983	FLS(16);
984	ROUNDS(8);
985	FLS(8);
986	ROUNDS(0);
987
988#undef ROUNDS
989#undef FLS
990
991	/* post whitening but kw4 */
992	io[2] ^= SUBKEY_L(0);
993	io[3] ^= SUBKEY_R(0);
994	/* NB: 0,1 should be swapped with 2,3 by caller! */
995}
996
997
998struct camellia_ctx {
999	int key_length;
1000	u32 key_table[CAMELLIA_TABLE_BYTE_LEN / sizeof(u32)];
1001};
1002
1003static int
1004camellia_set_key(struct crypto_tfm *tfm, const u8 *in_key,
1005		 unsigned int key_len)
1006{
1007	struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
1008	const unsigned char *key = (const unsigned char *)in_key;
1009	u32 *flags = &tfm->crt_flags;
1010
1011	if (key_len != 16 && key_len != 24 && key_len != 32) {
1012		*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
1013		return -EINVAL;
1014	}
1015
1016	cctx->key_length = key_len;
1017
1018	switch (key_len) {
1019	case 16:
1020		camellia_setup128(key, cctx->key_table);
1021		break;
1022	case 24:
1023		camellia_setup192(key, cctx->key_table);
1024		break;
1025	case 32:
1026		camellia_setup256(key, cctx->key_table);
1027		break;
1028	}
1029
1030	return 0;
1031}
1032
1033static void camellia_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
1034{
1035	const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
1036	const __be32 *src = (const __be32 *)in;
1037	__be32 *dst = (__be32 *)out;
1038
1039	u32 tmp[4];
1040
1041	tmp[0] = be32_to_cpu(src[0]);
1042	tmp[1] = be32_to_cpu(src[1]);
1043	tmp[2] = be32_to_cpu(src[2]);
1044	tmp[3] = be32_to_cpu(src[3]);
1045
1046	camellia_do_encrypt(cctx->key_table, tmp,
1047		cctx->key_length == 16 ? 24 : 32 /* for key lengths of 24 and 32 */
1048	);
1049
1050	/* do_encrypt returns 0,1 swapped with 2,3 */
1051	dst[0] = cpu_to_be32(tmp[2]);
1052	dst[1] = cpu_to_be32(tmp[3]);
1053	dst[2] = cpu_to_be32(tmp[0]);
1054	dst[3] = cpu_to_be32(tmp[1]);
1055}
1056
1057static void camellia_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
1058{
1059	const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
1060	const __be32 *src = (const __be32 *)in;
1061	__be32 *dst = (__be32 *)out;
1062
1063	u32 tmp[4];
1064
1065	tmp[0] = be32_to_cpu(src[0]);
1066	tmp[1] = be32_to_cpu(src[1]);
1067	tmp[2] = be32_to_cpu(src[2]);
1068	tmp[3] = be32_to_cpu(src[3]);
1069
1070	camellia_do_decrypt(cctx->key_table, tmp,
1071		cctx->key_length == 16 ? 24 : 32 /* for key lengths of 24 and 32 */
1072	);
1073
1074	/* do_decrypt returns 0,1 swapped with 2,3 */
1075	dst[0] = cpu_to_be32(tmp[2]);
1076	dst[1] = cpu_to_be32(tmp[3]);
1077	dst[2] = cpu_to_be32(tmp[0]);
1078	dst[3] = cpu_to_be32(tmp[1]);
1079}
1080
1081static struct crypto_alg camellia_alg = {
1082	.cra_name		=	"camellia",
1083	.cra_driver_name	=	"camellia-generic",
1084	.cra_priority		=	100,
1085	.cra_flags		=	CRYPTO_ALG_TYPE_CIPHER,
1086	.cra_blocksize		=	CAMELLIA_BLOCK_SIZE,
1087	.cra_ctxsize		=	sizeof(struct camellia_ctx),
1088	.cra_alignmask		=	3,
1089	.cra_module		=	THIS_MODULE,
1090	.cra_list		=	LIST_HEAD_INIT(camellia_alg.cra_list),
1091	.cra_u			=	{
1092		.cipher = {
1093			.cia_min_keysize	=	CAMELLIA_MIN_KEY_SIZE,
1094			.cia_max_keysize	=	CAMELLIA_MAX_KEY_SIZE,
1095			.cia_setkey		=	camellia_set_key,
1096			.cia_encrypt		=	camellia_encrypt,
1097			.cia_decrypt		=	camellia_decrypt
1098		}
1099	}
1100};
1101
1102static int __init camellia_init(void)
1103{
1104	return crypto_register_alg(&camellia_alg);
1105}
1106
1107static void __exit camellia_fini(void)
1108{
1109	crypto_unregister_alg(&camellia_alg);
1110}
1111
1112module_init(camellia_init);
1113module_exit(camellia_fini);
1114
1115MODULE_DESCRIPTION("Camellia Cipher Algorithm");
1116MODULE_LICENSE("GPL");
1117