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