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