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