Blame view

crypto/camellia.c 35.1 KB
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
  /*
   * Copyright (C) 2006
   * NTT (Nippon Telegraph and Telephone Corporation).
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; either version 2
   * of the License, or (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
   */
  
  /*
   * Algorithm Specification
   *  http://info.isl.ntt.co.jp/crypt/eng/camellia/specifications.html
   */
  
  /*
   *
   * NOTE --- NOTE --- NOTE --- NOTE
   * This implementation assumes that all memory addresses passed
   * as parameters are four-byte aligned.
   *
   */
  
  #include <linux/crypto.h>
  #include <linux/errno.h>
  #include <linux/init.h>
  #include <linux/kernel.h>
  #include <linux/module.h>
32bd78e0a   Harvey Harrison   crypto: camellia ...
38
39
  #include <linux/bitops.h>
  #include <asm/unaligned.h>
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
40

d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
  static const u32 camellia_sp1110[256] = {
  	0x70707000,0x82828200,0x2c2c2c00,0xececec00,
  	0xb3b3b300,0x27272700,0xc0c0c000,0xe5e5e500,
  	0xe4e4e400,0x85858500,0x57575700,0x35353500,
  	0xeaeaea00,0x0c0c0c00,0xaeaeae00,0x41414100,
  	0x23232300,0xefefef00,0x6b6b6b00,0x93939300,
  	0x45454500,0x19191900,0xa5a5a500,0x21212100,
  	0xededed00,0x0e0e0e00,0x4f4f4f00,0x4e4e4e00,
  	0x1d1d1d00,0x65656500,0x92929200,0xbdbdbd00,
  	0x86868600,0xb8b8b800,0xafafaf00,0x8f8f8f00,
  	0x7c7c7c00,0xebebeb00,0x1f1f1f00,0xcecece00,
  	0x3e3e3e00,0x30303000,0xdcdcdc00,0x5f5f5f00,
  	0x5e5e5e00,0xc5c5c500,0x0b0b0b00,0x1a1a1a00,
  	0xa6a6a600,0xe1e1e100,0x39393900,0xcacaca00,
  	0xd5d5d500,0x47474700,0x5d5d5d00,0x3d3d3d00,
  	0xd9d9d900,0x01010100,0x5a5a5a00,0xd6d6d600,
  	0x51515100,0x56565600,0x6c6c6c00,0x4d4d4d00,
  	0x8b8b8b00,0x0d0d0d00,0x9a9a9a00,0x66666600,
  	0xfbfbfb00,0xcccccc00,0xb0b0b000,0x2d2d2d00,
  	0x74747400,0x12121200,0x2b2b2b00,0x20202000,
  	0xf0f0f000,0xb1b1b100,0x84848400,0x99999900,
  	0xdfdfdf00,0x4c4c4c00,0xcbcbcb00,0xc2c2c200,
  	0x34343400,0x7e7e7e00,0x76767600,0x05050500,
  	0x6d6d6d00,0xb7b7b700,0xa9a9a900,0x31313100,
  	0xd1d1d100,0x17171700,0x04040400,0xd7d7d700,
  	0x14141400,0x58585800,0x3a3a3a00,0x61616100,
  	0xdedede00,0x1b1b1b00,0x11111100,0x1c1c1c00,
  	0x32323200,0x0f0f0f00,0x9c9c9c00,0x16161600,
  	0x53535300,0x18181800,0xf2f2f200,0x22222200,
  	0xfefefe00,0x44444400,0xcfcfcf00,0xb2b2b200,
  	0xc3c3c300,0xb5b5b500,0x7a7a7a00,0x91919100,
  	0x24242400,0x08080800,0xe8e8e800,0xa8a8a800,
  	0x60606000,0xfcfcfc00,0x69696900,0x50505000,
  	0xaaaaaa00,0xd0d0d000,0xa0a0a000,0x7d7d7d00,
  	0xa1a1a100,0x89898900,0x62626200,0x97979700,
  	0x54545400,0x5b5b5b00,0x1e1e1e00,0x95959500,
  	0xe0e0e000,0xffffff00,0x64646400,0xd2d2d200,
  	0x10101000,0xc4c4c400,0x00000000,0x48484800,
  	0xa3a3a300,0xf7f7f700,0x75757500,0xdbdbdb00,
  	0x8a8a8a00,0x03030300,0xe6e6e600,0xdadada00,
  	0x09090900,0x3f3f3f00,0xdddddd00,0x94949400,
  	0x87878700,0x5c5c5c00,0x83838300,0x02020200,
  	0xcdcdcd00,0x4a4a4a00,0x90909000,0x33333300,
  	0x73737300,0x67676700,0xf6f6f600,0xf3f3f300,
  	0x9d9d9d00,0x7f7f7f00,0xbfbfbf00,0xe2e2e200,
  	0x52525200,0x9b9b9b00,0xd8d8d800,0x26262600,
  	0xc8c8c800,0x37373700,0xc6c6c600,0x3b3b3b00,
  	0x81818100,0x96969600,0x6f6f6f00,0x4b4b4b00,
  	0x13131300,0xbebebe00,0x63636300,0x2e2e2e00,
  	0xe9e9e900,0x79797900,0xa7a7a700,0x8c8c8c00,
  	0x9f9f9f00,0x6e6e6e00,0xbcbcbc00,0x8e8e8e00,
  	0x29292900,0xf5f5f500,0xf9f9f900,0xb6b6b600,
  	0x2f2f2f00,0xfdfdfd00,0xb4b4b400,0x59595900,
  	0x78787800,0x98989800,0x06060600,0x6a6a6a00,
  	0xe7e7e700,0x46464600,0x71717100,0xbababa00,
  	0xd4d4d400,0x25252500,0xababab00,0x42424200,
  	0x88888800,0xa2a2a200,0x8d8d8d00,0xfafafa00,
  	0x72727200,0x07070700,0xb9b9b900,0x55555500,
  	0xf8f8f800,0xeeeeee00,0xacacac00,0x0a0a0a00,
  	0x36363600,0x49494900,0x2a2a2a00,0x68686800,
  	0x3c3c3c00,0x38383800,0xf1f1f100,0xa4a4a400,
  	0x40404000,0x28282800,0xd3d3d300,0x7b7b7b00,
  	0xbbbbbb00,0xc9c9c900,0x43434300,0xc1c1c100,
  	0x15151500,0xe3e3e300,0xadadad00,0xf4f4f400,
  	0x77777700,0xc7c7c700,0x80808000,0x9e9e9e00,
  };
  
  static const u32 camellia_sp0222[256] = {
  	0x00e0e0e0,0x00050505,0x00585858,0x00d9d9d9,
  	0x00676767,0x004e4e4e,0x00818181,0x00cbcbcb,
  	0x00c9c9c9,0x000b0b0b,0x00aeaeae,0x006a6a6a,
  	0x00d5d5d5,0x00181818,0x005d5d5d,0x00828282,
  	0x00464646,0x00dfdfdf,0x00d6d6d6,0x00272727,
  	0x008a8a8a,0x00323232,0x004b4b4b,0x00424242,
  	0x00dbdbdb,0x001c1c1c,0x009e9e9e,0x009c9c9c,
  	0x003a3a3a,0x00cacaca,0x00252525,0x007b7b7b,
  	0x000d0d0d,0x00717171,0x005f5f5f,0x001f1f1f,
  	0x00f8f8f8,0x00d7d7d7,0x003e3e3e,0x009d9d9d,
  	0x007c7c7c,0x00606060,0x00b9b9b9,0x00bebebe,
  	0x00bcbcbc,0x008b8b8b,0x00161616,0x00343434,
  	0x004d4d4d,0x00c3c3c3,0x00727272,0x00959595,
  	0x00ababab,0x008e8e8e,0x00bababa,0x007a7a7a,
  	0x00b3b3b3,0x00020202,0x00b4b4b4,0x00adadad,
  	0x00a2a2a2,0x00acacac,0x00d8d8d8,0x009a9a9a,
  	0x00171717,0x001a1a1a,0x00353535,0x00cccccc,
  	0x00f7f7f7,0x00999999,0x00616161,0x005a5a5a,
  	0x00e8e8e8,0x00242424,0x00565656,0x00404040,
  	0x00e1e1e1,0x00636363,0x00090909,0x00333333,
  	0x00bfbfbf,0x00989898,0x00979797,0x00858585,
  	0x00686868,0x00fcfcfc,0x00ececec,0x000a0a0a,
  	0x00dadada,0x006f6f6f,0x00535353,0x00626262,
  	0x00a3a3a3,0x002e2e2e,0x00080808,0x00afafaf,
  	0x00282828,0x00b0b0b0,0x00747474,0x00c2c2c2,
  	0x00bdbdbd,0x00363636,0x00222222,0x00383838,
  	0x00646464,0x001e1e1e,0x00393939,0x002c2c2c,
  	0x00a6a6a6,0x00303030,0x00e5e5e5,0x00444444,
  	0x00fdfdfd,0x00888888,0x009f9f9f,0x00656565,
  	0x00878787,0x006b6b6b,0x00f4f4f4,0x00232323,
  	0x00484848,0x00101010,0x00d1d1d1,0x00515151,
  	0x00c0c0c0,0x00f9f9f9,0x00d2d2d2,0x00a0a0a0,
  	0x00555555,0x00a1a1a1,0x00414141,0x00fafafa,
  	0x00434343,0x00131313,0x00c4c4c4,0x002f2f2f,
  	0x00a8a8a8,0x00b6b6b6,0x003c3c3c,0x002b2b2b,
  	0x00c1c1c1,0x00ffffff,0x00c8c8c8,0x00a5a5a5,
  	0x00202020,0x00898989,0x00000000,0x00909090,
  	0x00474747,0x00efefef,0x00eaeaea,0x00b7b7b7,
  	0x00151515,0x00060606,0x00cdcdcd,0x00b5b5b5,
  	0x00121212,0x007e7e7e,0x00bbbbbb,0x00292929,
  	0x000f0f0f,0x00b8b8b8,0x00070707,0x00040404,
  	0x009b9b9b,0x00949494,0x00212121,0x00666666,
  	0x00e6e6e6,0x00cecece,0x00ededed,0x00e7e7e7,
  	0x003b3b3b,0x00fefefe,0x007f7f7f,0x00c5c5c5,
  	0x00a4a4a4,0x00373737,0x00b1b1b1,0x004c4c4c,
  	0x00919191,0x006e6e6e,0x008d8d8d,0x00767676,
  	0x00030303,0x002d2d2d,0x00dedede,0x00969696,
  	0x00262626,0x007d7d7d,0x00c6c6c6,0x005c5c5c,
  	0x00d3d3d3,0x00f2f2f2,0x004f4f4f,0x00191919,
  	0x003f3f3f,0x00dcdcdc,0x00797979,0x001d1d1d,
  	0x00525252,0x00ebebeb,0x00f3f3f3,0x006d6d6d,
  	0x005e5e5e,0x00fbfbfb,0x00696969,0x00b2b2b2,
  	0x00f0f0f0,0x00313131,0x000c0c0c,0x00d4d4d4,
  	0x00cfcfcf,0x008c8c8c,0x00e2e2e2,0x00757575,
  	0x00a9a9a9,0x004a4a4a,0x00575757,0x00848484,
  	0x00111111,0x00454545,0x001b1b1b,0x00f5f5f5,
  	0x00e4e4e4,0x000e0e0e,0x00737373,0x00aaaaaa,
  	0x00f1f1f1,0x00dddddd,0x00595959,0x00141414,
  	0x006c6c6c,0x00929292,0x00545454,0x00d0d0d0,
  	0x00787878,0x00707070,0x00e3e3e3,0x00494949,
  	0x00808080,0x00505050,0x00a7a7a7,0x00f6f6f6,
  	0x00777777,0x00939393,0x00868686,0x00838383,
  	0x002a2a2a,0x00c7c7c7,0x005b5b5b,0x00e9e9e9,
  	0x00eeeeee,0x008f8f8f,0x00010101,0x003d3d3d,
  };
  
  static const u32 camellia_sp3033[256] = {
  	0x38003838,0x41004141,0x16001616,0x76007676,
  	0xd900d9d9,0x93009393,0x60006060,0xf200f2f2,
  	0x72007272,0xc200c2c2,0xab00abab,0x9a009a9a,
  	0x75007575,0x06000606,0x57005757,0xa000a0a0,
  	0x91009191,0xf700f7f7,0xb500b5b5,0xc900c9c9,
  	0xa200a2a2,0x8c008c8c,0xd200d2d2,0x90009090,
  	0xf600f6f6,0x07000707,0xa700a7a7,0x27002727,
  	0x8e008e8e,0xb200b2b2,0x49004949,0xde00dede,
  	0x43004343,0x5c005c5c,0xd700d7d7,0xc700c7c7,
  	0x3e003e3e,0xf500f5f5,0x8f008f8f,0x67006767,
  	0x1f001f1f,0x18001818,0x6e006e6e,0xaf00afaf,
  	0x2f002f2f,0xe200e2e2,0x85008585,0x0d000d0d,
  	0x53005353,0xf000f0f0,0x9c009c9c,0x65006565,
  	0xea00eaea,0xa300a3a3,0xae00aeae,0x9e009e9e,
  	0xec00ecec,0x80008080,0x2d002d2d,0x6b006b6b,
  	0xa800a8a8,0x2b002b2b,0x36003636,0xa600a6a6,
  	0xc500c5c5,0x86008686,0x4d004d4d,0x33003333,
  	0xfd00fdfd,0x66006666,0x58005858,0x96009696,
  	0x3a003a3a,0x09000909,0x95009595,0x10001010,
  	0x78007878,0xd800d8d8,0x42004242,0xcc00cccc,
  	0xef00efef,0x26002626,0xe500e5e5,0x61006161,
  	0x1a001a1a,0x3f003f3f,0x3b003b3b,0x82008282,
  	0xb600b6b6,0xdb00dbdb,0xd400d4d4,0x98009898,
  	0xe800e8e8,0x8b008b8b,0x02000202,0xeb00ebeb,
  	0x0a000a0a,0x2c002c2c,0x1d001d1d,0xb000b0b0,
  	0x6f006f6f,0x8d008d8d,0x88008888,0x0e000e0e,
  	0x19001919,0x87008787,0x4e004e4e,0x0b000b0b,
  	0xa900a9a9,0x0c000c0c,0x79007979,0x11001111,
  	0x7f007f7f,0x22002222,0xe700e7e7,0x59005959,
  	0xe100e1e1,0xda00dada,0x3d003d3d,0xc800c8c8,
  	0x12001212,0x04000404,0x74007474,0x54005454,
  	0x30003030,0x7e007e7e,0xb400b4b4,0x28002828,
  	0x55005555,0x68006868,0x50005050,0xbe00bebe,
  	0xd000d0d0,0xc400c4c4,0x31003131,0xcb00cbcb,
  	0x2a002a2a,0xad00adad,0x0f000f0f,0xca00caca,
  	0x70007070,0xff00ffff,0x32003232,0x69006969,
  	0x08000808,0x62006262,0x00000000,0x24002424,
  	0xd100d1d1,0xfb00fbfb,0xba00baba,0xed00eded,
  	0x45004545,0x81008181,0x73007373,0x6d006d6d,
  	0x84008484,0x9f009f9f,0xee00eeee,0x4a004a4a,
  	0xc300c3c3,0x2e002e2e,0xc100c1c1,0x01000101,
  	0xe600e6e6,0x25002525,0x48004848,0x99009999,
  	0xb900b9b9,0xb300b3b3,0x7b007b7b,0xf900f9f9,
  	0xce00cece,0xbf00bfbf,0xdf00dfdf,0x71007171,
  	0x29002929,0xcd00cdcd,0x6c006c6c,0x13001313,
  	0x64006464,0x9b009b9b,0x63006363,0x9d009d9d,
  	0xc000c0c0,0x4b004b4b,0xb700b7b7,0xa500a5a5,
  	0x89008989,0x5f005f5f,0xb100b1b1,0x17001717,
  	0xf400f4f4,0xbc00bcbc,0xd300d3d3,0x46004646,
  	0xcf00cfcf,0x37003737,0x5e005e5e,0x47004747,
  	0x94009494,0xfa00fafa,0xfc00fcfc,0x5b005b5b,
  	0x97009797,0xfe00fefe,0x5a005a5a,0xac00acac,
  	0x3c003c3c,0x4c004c4c,0x03000303,0x35003535,
  	0xf300f3f3,0x23002323,0xb800b8b8,0x5d005d5d,
  	0x6a006a6a,0x92009292,0xd500d5d5,0x21002121,
  	0x44004444,0x51005151,0xc600c6c6,0x7d007d7d,
  	0x39003939,0x83008383,0xdc00dcdc,0xaa00aaaa,
  	0x7c007c7c,0x77007777,0x56005656,0x05000505,
  	0x1b001b1b,0xa400a4a4,0x15001515,0x34003434,
  	0x1e001e1e,0x1c001c1c,0xf800f8f8,0x52005252,
  	0x20002020,0x14001414,0xe900e9e9,0xbd00bdbd,
  	0xdd00dddd,0xe400e4e4,0xa100a1a1,0xe000e0e0,
  	0x8a008a8a,0xf100f1f1,0xd600d6d6,0x7a007a7a,
  	0xbb00bbbb,0xe300e3e3,0x40004040,0x4f004f4f,
  };
  
  static const u32 camellia_sp4404[256] = {
  	0x70700070,0x2c2c002c,0xb3b300b3,0xc0c000c0,
  	0xe4e400e4,0x57570057,0xeaea00ea,0xaeae00ae,
  	0x23230023,0x6b6b006b,0x45450045,0xa5a500a5,
  	0xeded00ed,0x4f4f004f,0x1d1d001d,0x92920092,
  	0x86860086,0xafaf00af,0x7c7c007c,0x1f1f001f,
  	0x3e3e003e,0xdcdc00dc,0x5e5e005e,0x0b0b000b,
  	0xa6a600a6,0x39390039,0xd5d500d5,0x5d5d005d,
  	0xd9d900d9,0x5a5a005a,0x51510051,0x6c6c006c,
  	0x8b8b008b,0x9a9a009a,0xfbfb00fb,0xb0b000b0,
  	0x74740074,0x2b2b002b,0xf0f000f0,0x84840084,
  	0xdfdf00df,0xcbcb00cb,0x34340034,0x76760076,
  	0x6d6d006d,0xa9a900a9,0xd1d100d1,0x04040004,
  	0x14140014,0x3a3a003a,0xdede00de,0x11110011,
  	0x32320032,0x9c9c009c,0x53530053,0xf2f200f2,
  	0xfefe00fe,0xcfcf00cf,0xc3c300c3,0x7a7a007a,
  	0x24240024,0xe8e800e8,0x60600060,0x69690069,
  	0xaaaa00aa,0xa0a000a0,0xa1a100a1,0x62620062,
  	0x54540054,0x1e1e001e,0xe0e000e0,0x64640064,
  	0x10100010,0x00000000,0xa3a300a3,0x75750075,
  	0x8a8a008a,0xe6e600e6,0x09090009,0xdddd00dd,
  	0x87870087,0x83830083,0xcdcd00cd,0x90900090,
  	0x73730073,0xf6f600f6,0x9d9d009d,0xbfbf00bf,
  	0x52520052,0xd8d800d8,0xc8c800c8,0xc6c600c6,
  	0x81810081,0x6f6f006f,0x13130013,0x63630063,
  	0xe9e900e9,0xa7a700a7,0x9f9f009f,0xbcbc00bc,
  	0x29290029,0xf9f900f9,0x2f2f002f,0xb4b400b4,
  	0x78780078,0x06060006,0xe7e700e7,0x71710071,
  	0xd4d400d4,0xabab00ab,0x88880088,0x8d8d008d,
  	0x72720072,0xb9b900b9,0xf8f800f8,0xacac00ac,
  	0x36360036,0x2a2a002a,0x3c3c003c,0xf1f100f1,
  	0x40400040,0xd3d300d3,0xbbbb00bb,0x43430043,
  	0x15150015,0xadad00ad,0x77770077,0x80800080,
  	0x82820082,0xecec00ec,0x27270027,0xe5e500e5,
  	0x85850085,0x35350035,0x0c0c000c,0x41410041,
  	0xefef00ef,0x93930093,0x19190019,0x21210021,
  	0x0e0e000e,0x4e4e004e,0x65650065,0xbdbd00bd,
  	0xb8b800b8,0x8f8f008f,0xebeb00eb,0xcece00ce,
  	0x30300030,0x5f5f005f,0xc5c500c5,0x1a1a001a,
  	0xe1e100e1,0xcaca00ca,0x47470047,0x3d3d003d,
  	0x01010001,0xd6d600d6,0x56560056,0x4d4d004d,
  	0x0d0d000d,0x66660066,0xcccc00cc,0x2d2d002d,
  	0x12120012,0x20200020,0xb1b100b1,0x99990099,
  	0x4c4c004c,0xc2c200c2,0x7e7e007e,0x05050005,
  	0xb7b700b7,0x31310031,0x17170017,0xd7d700d7,
  	0x58580058,0x61610061,0x1b1b001b,0x1c1c001c,
  	0x0f0f000f,0x16160016,0x18180018,0x22220022,
  	0x44440044,0xb2b200b2,0xb5b500b5,0x91910091,
  	0x08080008,0xa8a800a8,0xfcfc00fc,0x50500050,
  	0xd0d000d0,0x7d7d007d,0x89890089,0x97970097,
  	0x5b5b005b,0x95950095,0xffff00ff,0xd2d200d2,
  	0xc4c400c4,0x48480048,0xf7f700f7,0xdbdb00db,
  	0x03030003,0xdada00da,0x3f3f003f,0x94940094,
  	0x5c5c005c,0x02020002,0x4a4a004a,0x33330033,
  	0x67670067,0xf3f300f3,0x7f7f007f,0xe2e200e2,
  	0x9b9b009b,0x26260026,0x37370037,0x3b3b003b,
  	0x96960096,0x4b4b004b,0xbebe00be,0x2e2e002e,
  	0x79790079,0x8c8c008c,0x6e6e006e,0x8e8e008e,
  	0xf5f500f5,0xb6b600b6,0xfdfd00fd,0x59590059,
  	0x98980098,0x6a6a006a,0x46460046,0xbaba00ba,
  	0x25250025,0x42420042,0xa2a200a2,0xfafa00fa,
  	0x07070007,0x55550055,0xeeee00ee,0x0a0a000a,
  	0x49490049,0x68680068,0x38380038,0xa4a400a4,
  	0x28280028,0x7b7b007b,0xc9c900c9,0xc1c100c1,
  	0xe3e300e3,0xf4f400f4,0xc7c700c7,0x9e9e009e,
  };
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
308
309
310
311
  #define CAMELLIA_MIN_KEY_SIZE        16
  #define CAMELLIA_MAX_KEY_SIZE        32
  #define CAMELLIA_BLOCK_SIZE          16
  #define CAMELLIA_TABLE_BYTE_LEN     272
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
312
313
314
315
316
  /*
   * NB: L and R below stand for 'left' and 'right' as in written numbers.
   * That is, in (xxxL,xxxR) pair xxxL holds most significant digits,
   * _not_ least significant ones!
   */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
  
  /* key constants */
  
  #define CAMELLIA_SIGMA1L (0xA09E667FL)
  #define CAMELLIA_SIGMA1R (0x3BCC908BL)
  #define CAMELLIA_SIGMA2L (0xB67AE858L)
  #define CAMELLIA_SIGMA2R (0x4CAA73B2L)
  #define CAMELLIA_SIGMA3L (0xC6EF372FL)
  #define CAMELLIA_SIGMA3R (0xE94F82BEL)
  #define CAMELLIA_SIGMA4L (0x54FF53A5L)
  #define CAMELLIA_SIGMA4R (0xF1D36F1CL)
  #define CAMELLIA_SIGMA5L (0x10E527FAL)
  #define CAMELLIA_SIGMA5R (0xDE682D1DL)
  #define CAMELLIA_SIGMA6L (0xB05688C2L)
  #define CAMELLIA_SIGMA6R (0xB3E6C1FDL)
  
  /*
   *  macros
   */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
336
  #define ROLDQ(ll, lr, rl, rr, w0, w1, bits)		\
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
337
338
339
340
341
342
343
      do {						\
  	w0 = ll;					\
  	ll = (ll << bits) + (lr >> (32 - bits));	\
  	lr = (lr << bits) + (rl >> (32 - bits));	\
  	rl = (rl << bits) + (rr >> (32 - bits));	\
  	rr = (rr << bits) + (w0 >> (32 - bits));	\
      } while(0)
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
344
  #define ROLDQo32(ll, lr, rl, rr, w0, w1, bits)		\
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
345
346
347
348
349
350
351
352
      do {						\
  	w0 = ll;					\
  	w1 = lr;					\
  	ll = (lr << (bits - 32)) + (rl >> (64 - bits));	\
  	lr = (rl << (bits - 32)) + (rr >> (64 - bits));	\
  	rl = (rr << (bits - 32)) + (w0 >> (64 - bits));	\
  	rr = (w0 << (bits - 32)) + (w1 >> (64 - bits));	\
      } while(0)
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
353
354
355
356
357
358
  #define CAMELLIA_F(xl, xr, kl, kr, yl, yr, il, ir, t0, t1)	\
      do {							\
  	il = xl ^ kl;						\
  	ir = xr ^ kr;						\
  	t0 = il >> 16;						\
  	t1 = ir >> 16;						\
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
359
360
361
362
363
364
365
366
  	yl = camellia_sp1110[(u8)(ir     )]			\
  	   ^ camellia_sp0222[    (t1 >> 8)]			\
  	   ^ camellia_sp3033[(u8)(t1     )]			\
  	   ^ camellia_sp4404[(u8)(ir >> 8)];			\
  	yr = camellia_sp1110[    (t0 >> 8)]			\
  	   ^ camellia_sp0222[(u8)(t0     )]			\
  	   ^ camellia_sp3033[(u8)(il >> 8)]			\
  	   ^ camellia_sp4404[(u8)(il     )];			\
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
367
  	yl ^= yr;						\
32bd78e0a   Harvey Harrison   crypto: camellia ...
368
  	yr = ror32(yr, 8);					\
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
369
370
  	yr ^= yl;						\
      } while(0)
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
371
372
  #define SUBKEY_L(INDEX) (subkey[(INDEX)*2])
  #define SUBKEY_R(INDEX) (subkey[(INDEX)*2 + 1])
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
373

dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
374
  static void camellia_setup_tail(u32 *subkey, u32 *subL, u32 *subR, int max)
d3e748057   Denys Vlasenko   [CRYPTO] camellia...
375
  {
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
376
  	u32 dw, tl, tr;
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
377
  	u32 kw4l, kw4r;
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
378
  	int i;
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
379
380
381
382
383
384
385
386
387
  	/* absorb kw2 to other subkeys */
  	/* round 2 */
  	subL[3] ^= subL[1]; subR[3] ^= subR[1];
  	/* round 4 */
  	subL[5] ^= subL[1]; subR[5] ^= subR[1];
  	/* round 6 */
  	subL[7] ^= subL[1]; subR[7] ^= subR[1];
  	subL[1] ^= subR[1] & ~subR[9];
  	dw = subL[1] & subL[9],
32bd78e0a   Harvey Harrison   crypto: camellia ...
388
  		subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl2) */
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
389
390
391
392
393
394
395
396
  	/* round 8 */
  	subL[11] ^= subL[1]; subR[11] ^= subR[1];
  	/* round 10 */
  	subL[13] ^= subL[1]; subR[13] ^= subR[1];
  	/* round 12 */
  	subL[15] ^= subL[1]; subR[15] ^= subR[1];
  	subL[1] ^= subR[1] & ~subR[17];
  	dw = subL[1] & subL[17],
32bd78e0a   Harvey Harrison   crypto: camellia ...
397
  		subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl4) */
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
  	/* round 14 */
  	subL[19] ^= subL[1]; subR[19] ^= subR[1];
  	/* round 16 */
  	subL[21] ^= subL[1]; subR[21] ^= subR[1];
  	/* round 18 */
  	subL[23] ^= subL[1]; subR[23] ^= subR[1];
  	if (max == 24) {
  		/* kw3 */
  		subL[24] ^= subL[1]; subR[24] ^= subR[1];
  
  	/* absorb kw4 to other subkeys */
  		kw4l = subL[25]; kw4r = subR[25];
  	} else {
  		subL[1] ^= subR[1] & ~subR[25];
  		dw = subL[1] & subL[25],
32bd78e0a   Harvey Harrison   crypto: camellia ...
413
  			subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl6) */
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
  		/* round 20 */
  		subL[27] ^= subL[1]; subR[27] ^= subR[1];
  		/* round 22 */
  		subL[29] ^= subL[1]; subR[29] ^= subR[1];
  		/* round 24 */
  		subL[31] ^= subL[1]; subR[31] ^= subR[1];
  		/* kw3 */
  		subL[32] ^= subL[1]; subR[32] ^= subR[1];
  
  	/* absorb kw4 to other subkeys */
  		kw4l = subL[33]; kw4r = subR[33];
  		/* round 23 */
  		subL[30] ^= kw4l; subR[30] ^= kw4r;
  		/* round 21 */
  		subL[28] ^= kw4l; subR[28] ^= kw4r;
  		/* round 19 */
  		subL[26] ^= kw4l; subR[26] ^= kw4r;
  		kw4l ^= kw4r & ~subR[24];
  		dw = kw4l & subL[24],
32bd78e0a   Harvey Harrison   crypto: camellia ...
433
  			kw4r ^= rol32(dw, 1); /* modified for FL(kl5) */
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
434
435
436
437
438
439
440
441
442
  	}
  	/* round 17 */
  	subL[22] ^= kw4l; subR[22] ^= kw4r;
  	/* round 15 */
  	subL[20] ^= kw4l; subR[20] ^= kw4r;
  	/* round 13 */
  	subL[18] ^= kw4l; subR[18] ^= kw4r;
  	kw4l ^= kw4r & ~subR[16];
  	dw = kw4l & subL[16],
32bd78e0a   Harvey Harrison   crypto: camellia ...
443
  		kw4r ^= rol32(dw, 1); /* modified for FL(kl3) */
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
444
445
446
447
448
449
450
451
  	/* round 11 */
  	subL[14] ^= kw4l; subR[14] ^= kw4r;
  	/* round 9 */
  	subL[12] ^= kw4l; subR[12] ^= kw4r;
  	/* round 7 */
  	subL[10] ^= kw4l; subR[10] ^= kw4r;
  	kw4l ^= kw4r & ~subR[8];
  	dw = kw4l & subL[8],
32bd78e0a   Harvey Harrison   crypto: camellia ...
452
  		kw4r ^= rol32(dw, 1); /* modified for FL(kl1) */
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
453
454
455
456
457
458
459
460
  	/* round 5 */
  	subL[6] ^= kw4l; subR[6] ^= kw4r;
  	/* round 3 */
  	subL[4] ^= kw4l; subR[4] ^= kw4r;
  	/* round 1 */
  	subL[2] ^= kw4l; subR[2] ^= kw4r;
  	/* kw1 */
  	subL[0] ^= kw4l; subR[0] ^= kw4r;
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
  	/* key XOR is end of F-function */
  	SUBKEY_L(0) = subL[0] ^ subL[2];/* kw1 */
  	SUBKEY_R(0) = subR[0] ^ subR[2];
  	SUBKEY_L(2) = subL[3];       /* round 1 */
  	SUBKEY_R(2) = subR[3];
  	SUBKEY_L(3) = subL[2] ^ subL[4]; /* round 2 */
  	SUBKEY_R(3) = subR[2] ^ subR[4];
  	SUBKEY_L(4) = subL[3] ^ subL[5]; /* round 3 */
  	SUBKEY_R(4) = subR[3] ^ subR[5];
  	SUBKEY_L(5) = subL[4] ^ subL[6]; /* round 4 */
  	SUBKEY_R(5) = subR[4] ^ subR[6];
  	SUBKEY_L(6) = subL[5] ^ subL[7]; /* round 5 */
  	SUBKEY_R(6) = subR[5] ^ subR[7];
  	tl = subL[10] ^ (subR[10] & ~subR[8]);
  	dw = tl & subL[8],  /* FL(kl1) */
32bd78e0a   Harvey Harrison   crypto: camellia ...
476
  		tr = subR[10] ^ rol32(dw, 1);
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
477
478
479
480
481
482
483
484
  	SUBKEY_L(7) = subL[6] ^ tl; /* round 6 */
  	SUBKEY_R(7) = subR[6] ^ tr;
  	SUBKEY_L(8) = subL[8];       /* FL(kl1) */
  	SUBKEY_R(8) = subR[8];
  	SUBKEY_L(9) = subL[9];       /* FLinv(kl2) */
  	SUBKEY_R(9) = subR[9];
  	tl = subL[7] ^ (subR[7] & ~subR[9]);
  	dw = tl & subL[9],  /* FLinv(kl2) */
32bd78e0a   Harvey Harrison   crypto: camellia ...
485
  		tr = subR[7] ^ rol32(dw, 1);
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
486
487
488
489
490
491
492
493
494
495
496
497
  	SUBKEY_L(10) = tl ^ subL[11]; /* round 7 */
  	SUBKEY_R(10) = tr ^ subR[11];
  	SUBKEY_L(11) = subL[10] ^ subL[12]; /* round 8 */
  	SUBKEY_R(11) = subR[10] ^ subR[12];
  	SUBKEY_L(12) = subL[11] ^ subL[13]; /* round 9 */
  	SUBKEY_R(12) = subR[11] ^ subR[13];
  	SUBKEY_L(13) = subL[12] ^ subL[14]; /* round 10 */
  	SUBKEY_R(13) = subR[12] ^ subR[14];
  	SUBKEY_L(14) = subL[13] ^ subL[15]; /* round 11 */
  	SUBKEY_R(14) = subR[13] ^ subR[15];
  	tl = subL[18] ^ (subR[18] & ~subR[16]);
  	dw = tl & subL[16], /* FL(kl3) */
32bd78e0a   Harvey Harrison   crypto: camellia ...
498
  		tr = subR[18] ^ rol32(dw, 1);
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
499
500
501
502
503
504
505
506
  	SUBKEY_L(15) = subL[14] ^ tl; /* round 12 */
  	SUBKEY_R(15) = subR[14] ^ tr;
  	SUBKEY_L(16) = subL[16];     /* FL(kl3) */
  	SUBKEY_R(16) = subR[16];
  	SUBKEY_L(17) = subL[17];     /* FLinv(kl4) */
  	SUBKEY_R(17) = subR[17];
  	tl = subL[15] ^ (subR[15] & ~subR[17]);
  	dw = tl & subL[17], /* FLinv(kl4) */
32bd78e0a   Harvey Harrison   crypto: camellia ...
507
  		tr = subR[15] ^ rol32(dw, 1);
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
  	SUBKEY_L(18) = tl ^ subL[19]; /* round 13 */
  	SUBKEY_R(18) = tr ^ subR[19];
  	SUBKEY_L(19) = subL[18] ^ subL[20]; /* round 14 */
  	SUBKEY_R(19) = subR[18] ^ subR[20];
  	SUBKEY_L(20) = subL[19] ^ subL[21]; /* round 15 */
  	SUBKEY_R(20) = subR[19] ^ subR[21];
  	SUBKEY_L(21) = subL[20] ^ subL[22]; /* round 16 */
  	SUBKEY_R(21) = subR[20] ^ subR[22];
  	SUBKEY_L(22) = subL[21] ^ subL[23]; /* round 17 */
  	SUBKEY_R(22) = subR[21] ^ subR[23];
  	if (max == 24) {
  		SUBKEY_L(23) = subL[22];     /* round 18 */
  		SUBKEY_R(23) = subR[22];
  		SUBKEY_L(24) = subL[24] ^ subL[23]; /* kw3 */
  		SUBKEY_R(24) = subR[24] ^ subR[23];
  	} else {
  		tl = subL[26] ^ (subR[26] & ~subR[24]);
  		dw = tl & subL[24], /* FL(kl5) */
32bd78e0a   Harvey Harrison   crypto: camellia ...
526
  			tr = subR[26] ^ rol32(dw, 1);
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
527
528
529
530
531
532
533
534
  		SUBKEY_L(23) = subL[22] ^ tl; /* round 18 */
  		SUBKEY_R(23) = subR[22] ^ tr;
  		SUBKEY_L(24) = subL[24];     /* FL(kl5) */
  		SUBKEY_R(24) = subR[24];
  		SUBKEY_L(25) = subL[25];     /* FLinv(kl6) */
  		SUBKEY_R(25) = subR[25];
  		tl = subL[23] ^ (subR[23] & ~subR[25]);
  		dw = tl & subL[25], /* FLinv(kl6) */
32bd78e0a   Harvey Harrison   crypto: camellia ...
535
  			tr = subR[23] ^ rol32(dw, 1);
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
  		SUBKEY_L(26) = tl ^ subL[27]; /* round 19 */
  		SUBKEY_R(26) = tr ^ subR[27];
  		SUBKEY_L(27) = subL[26] ^ subL[28]; /* round 20 */
  		SUBKEY_R(27) = subR[26] ^ subR[28];
  		SUBKEY_L(28) = subL[27] ^ subL[29]; /* round 21 */
  		SUBKEY_R(28) = subR[27] ^ subR[29];
  		SUBKEY_L(29) = subL[28] ^ subL[30]; /* round 22 */
  		SUBKEY_R(29) = subR[28] ^ subR[30];
  		SUBKEY_L(30) = subL[29] ^ subL[31]; /* round 23 */
  		SUBKEY_R(30) = subR[29] ^ subR[31];
  		SUBKEY_L(31) = subL[30];     /* round 24 */
  		SUBKEY_R(31) = subR[30];
  		SUBKEY_L(32) = subL[32] ^ subL[31]; /* kw3 */
  		SUBKEY_R(32) = subR[32] ^ subR[31];
  	}
  
  	/* apply the inverse of the last half of P-function */
  	i = 2;
d3e748057   Denys Vlasenko   [CRYPTO] camellia...
554
  	do {
32bd78e0a   Harvey Harrison   crypto: camellia ...
555
  		dw = SUBKEY_L(i + 0) ^ SUBKEY_R(i + 0); dw = rol32(dw, 8);/* round 1 */
d3e748057   Denys Vlasenko   [CRYPTO] camellia...
556
  		SUBKEY_R(i + 0) = SUBKEY_L(i + 0) ^ dw; SUBKEY_L(i + 0) = dw;
32bd78e0a   Harvey Harrison   crypto: camellia ...
557
  		dw = SUBKEY_L(i + 1) ^ SUBKEY_R(i + 1); dw = rol32(dw, 8);/* round 2 */
d3e748057   Denys Vlasenko   [CRYPTO] camellia...
558
  		SUBKEY_R(i + 1) = SUBKEY_L(i + 1) ^ dw; SUBKEY_L(i + 1) = dw;
32bd78e0a   Harvey Harrison   crypto: camellia ...
559
  		dw = SUBKEY_L(i + 2) ^ SUBKEY_R(i + 2); dw = rol32(dw, 8);/* round 3 */
d3e748057   Denys Vlasenko   [CRYPTO] camellia...
560
  		SUBKEY_R(i + 2) = SUBKEY_L(i + 2) ^ dw; SUBKEY_L(i + 2) = dw;
32bd78e0a   Harvey Harrison   crypto: camellia ...
561
  		dw = SUBKEY_L(i + 3) ^ SUBKEY_R(i + 3); dw = rol32(dw, 8);/* round 4 */
d3e748057   Denys Vlasenko   [CRYPTO] camellia...
562
  		SUBKEY_R(i + 3) = SUBKEY_L(i + 3) ^ dw; SUBKEY_L(i + 3) = dw;
32bd78e0a   Harvey Harrison   crypto: camellia ...
563
  		dw = SUBKEY_L(i + 4) ^ SUBKEY_R(i + 4); dw = rol32(dw, 8);/* round 5 */
d3e748057   Denys Vlasenko   [CRYPTO] camellia...
564
  		SUBKEY_R(i + 4) = SUBKEY_L(i + 4) ^ dw; SUBKEY_L(i + 4) = dw;
32bd78e0a   Harvey Harrison   crypto: camellia ...
565
  		dw = SUBKEY_L(i + 5) ^ SUBKEY_R(i + 5); dw = rol32(dw, 8);/* round 6 */
d3e748057   Denys Vlasenko   [CRYPTO] camellia...
566
567
568
569
  		SUBKEY_R(i + 5) = SUBKEY_L(i + 5) ^ dw; SUBKEY_L(i + 5) = dw;
  		i += 8;
  	} while (i < max);
  }
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
570
571
572
573
  static void camellia_setup128(const unsigned char *key, u32 *subkey)
  {
  	u32 kll, klr, krl, krr;
  	u32 il, ir, t0, t1, w0, w1;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
574
575
576
577
  	u32 subL[26];
  	u32 subR[26];
  
  	/**
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
578
  	 *  k == kll || klr || krl || krr (|| is concatenation)
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
579
  	 */
32bd78e0a   Harvey Harrison   crypto: camellia ...
580
581
582
583
  	kll = get_unaligned_be32(key);
  	klr = get_unaligned_be32(key + 4);
  	krl = get_unaligned_be32(key + 8);
  	krr = get_unaligned_be32(key + 12);
1ce73e8d6   Denys Vlasenko   [CRYPTO] camellia...
584

dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
585
  	/* generate KL dependent subkeys */
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
586
  	/* kw1 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
587
  	subL[0] = kll; subR[0] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
588
  	/* kw2 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
589
  	subL[1] = krl; subR[1] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
590
  	/* rotation left shift 15bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
591
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
592
  	/* k3 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
593
  	subL[4] = kll; subR[4] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
594
  	/* k4 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
595
  	subL[5] = krl; subR[5] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
596
  	/* rotation left shift 15+30bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
597
  	ROLDQ(kll, klr, krl, krr, w0, w1, 30);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
598
  	/* k7 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
599
  	subL[10] = kll; subR[10] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
600
  	/* k8 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
601
  	subL[11] = krl; subR[11] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
602
  	/* rotation left shift 15+30+15bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
603
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
604
  	/* k10 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
605
  	subL[13] = krl; subR[13] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
606
  	/* rotation left shift 15+30+15+17 bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
607
  	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
608
  	/* kl3 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
609
  	subL[16] = kll; subR[16] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
610
  	/* kl4 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
611
  	subL[17] = krl; subR[17] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
612
  	/* rotation left shift 15+30+15+17+17 bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
613
  	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
614
  	/* k13 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
615
  	subL[18] = kll; subR[18] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
616
  	/* k14 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
617
  	subL[19] = krl; subR[19] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
618
  	/* rotation left shift 15+30+15+17+17+17 bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
619
  	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
620
  	/* k17 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
621
  	subL[22] = kll; subR[22] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
622
  	/* k18 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
623
  	subL[23] = krl; subR[23] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
624
625
  
  	/* generate KA */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
626
627
  	kll = subL[0]; klr = subR[0];
  	krl = subL[1]; krr = subR[1];
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
  	CAMELLIA_F(kll, klr,
  		   CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
  		   w0, w1, il, ir, t0, t1);
  	krl ^= w0; krr ^= w1;
  	CAMELLIA_F(krl, krr,
  		   CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
  		   kll, klr, il, ir, t0, t1);
  	/* current status == (kll, klr, w0, w1) */
  	CAMELLIA_F(kll, klr,
  		   CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
  		   krl, krr, il, ir, t0, t1);
  	krl ^= w0; krr ^= w1;
  	CAMELLIA_F(krl, krr,
  		   CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
  		   w0, w1, il, ir, t0, t1);
  	kll ^= w0; klr ^= w1;
  
  	/* generate KA dependent subkeys */
  	/* k1, k2 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
647
648
  	subL[2] = kll; subR[2] = klr;
  	subL[3] = krl; subR[3] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
649
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
650
  	/* k5,k6 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
651
652
  	subL[6] = kll; subR[6] = klr;
  	subL[7] = krl; subR[7] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
653
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
654
  	/* kl1, kl2 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
655
656
  	subL[8] = kll; subR[8] = klr;
  	subL[9] = krl; subR[9] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
657
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
658
  	/* k9 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
659
  	subL[12] = kll; subR[12] = klr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
660
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
661
  	/* k11, k12 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
662
663
  	subL[14] = kll; subR[14] = klr;
  	subL[15] = krl; subR[15] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
664
  	ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
665
  	/* k15, k16 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
666
667
  	subL[20] = kll; subR[20] = klr;
  	subL[21] = krl; subR[21] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
668
  	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
669
  	/* kw3, kw4 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
670
671
  	subL[24] = kll; subR[24] = klr;
  	subL[25] = krl; subR[25] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
672

dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
673
  	camellia_setup_tail(subkey, subL, subR, 24);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
674
  }
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
675
676
  static void camellia_setup256(const unsigned char *key, u32 *subkey)
  {
1ce73e8d6   Denys Vlasenko   [CRYPTO] camellia...
677
678
  	u32 kll, klr, krl, krr;        /* left half of key */
  	u32 krll, krlr, krrl, krrr;    /* right half of key */
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
679
  	u32 il, ir, t0, t1, w0, w1;    /* temporary variables */
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
680
681
682
683
684
  	u32 subL[34];
  	u32 subR[34];
  
  	/**
  	 *  key = (kll || klr || krl || krr || krll || krlr || krrl || krrr)
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
685
  	 *  (|| is concatenation)
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
686
  	 */
32bd78e0a   Harvey Harrison   crypto: camellia ...
687
688
689
690
691
692
693
694
  	kll = get_unaligned_be32(key);
  	klr = get_unaligned_be32(key + 4);
  	krl = get_unaligned_be32(key + 8);
  	krr = get_unaligned_be32(key + 12);
  	krll = get_unaligned_be32(key + 16);
  	krlr = get_unaligned_be32(key + 20);
  	krrl = get_unaligned_be32(key + 24);
  	krrr = get_unaligned_be32(key + 28);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
695
696
697
  
  	/* generate KL dependent subkeys */
  	/* kw1 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
698
  	subL[0] = kll; subR[0] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
699
  	/* kw2 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
700
  	subL[1] = krl; subR[1] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
701
  	ROLDQo32(kll, klr, krl, krr, w0, w1, 45);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
702
  	/* k9 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
703
  	subL[12] = kll; subR[12] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
704
  	/* k10 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
705
  	subL[13] = krl; subR[13] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
706
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
707
  	/* kl3 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
708
  	subL[16] = kll; subR[16] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
709
  	/* kl4 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
710
  	subL[17] = krl; subR[17] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
711
  	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
712
  	/* k17 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
713
  	subL[22] = kll; subR[22] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
714
  	/* k18 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
715
  	subL[23] = krl; subR[23] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
716
  	ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
717
  	/* k23 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
718
  	subL[30] = kll; subR[30] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
719
  	/* k24 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
720
  	subL[31] = krl; subR[31] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
721
722
  
  	/* generate KR dependent subkeys */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
723
  	ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
724
  	/* k3 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
725
  	subL[4] = krll; subR[4] = krlr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
726
  	/* k4 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
727
  	subL[5] = krrl; subR[5] = krrr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
728
  	ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
729
  	/* kl1 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
730
  	subL[8] = krll; subR[8] = krlr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
731
  	/* kl2 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
732
  	subL[9] = krrl; subR[9] = krrr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
733
  	ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
734
  	/* k13 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
735
  	subL[18] = krll; subR[18] = krlr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
736
  	/* k14 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
737
  	subL[19] = krrl; subR[19] = krrr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
738
  	ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
739
  	/* k19 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
740
  	subL[26] = krll; subR[26] = krlr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
741
  	/* k20 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
742
  	subL[27] = krrl; subR[27] = krrr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
743
  	ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
744
745
  
  	/* generate KA */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
746
747
  	kll = subL[0] ^ krll; klr = subR[0] ^ krlr;
  	krl = subL[1] ^ krrl; krr = subR[1] ^ krrr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
  	CAMELLIA_F(kll, klr,
  		   CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
  		   w0, w1, il, ir, t0, t1);
  	krl ^= w0; krr ^= w1;
  	CAMELLIA_F(krl, krr,
  		   CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
  		   kll, klr, il, ir, t0, t1);
  	kll ^= krll; klr ^= krlr;
  	CAMELLIA_F(kll, klr,
  		   CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
  		   krl, krr, il, ir, t0, t1);
  	krl ^= w0 ^ krrl; krr ^= w1 ^ krrr;
  	CAMELLIA_F(krl, krr,
  		   CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
  		   w0, w1, il, ir, t0, t1);
  	kll ^= w0; klr ^= w1;
  
  	/* generate KB */
  	krll ^= kll; krlr ^= klr;
  	krrl ^= krl; krrr ^= krr;
  	CAMELLIA_F(krll, krlr,
  		   CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R,
  		   w0, w1, il, ir, t0, t1);
  	krrl ^= w0; krrr ^= w1;
  	CAMELLIA_F(krrl, krrr,
  		   CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R,
  		   w0, w1, il, ir, t0, t1);
  	krll ^= w0; krlr ^= w1;
  
  	/* generate KA dependent subkeys */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
778
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
779
  	/* k5 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
780
  	subL[6] = kll; subR[6] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
781
  	/* k6 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
782
  	subL[7] = krl; subR[7] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
783
  	ROLDQ(kll, klr, krl, krr, w0, w1, 30);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
784
  	/* k11 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
785
  	subL[14] = kll; subR[14] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
786
  	/* k12 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
787
  	subL[15] = krl; subR[15] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
788
789
  	/* rotation left shift 32bit */
  	/* kl5 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
790
  	subL[24] = klr; subR[24] = krl;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
791
  	/* kl6 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
792
  	subL[25] = krr; subR[25] = kll;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
793
  	/* rotation left shift 49 from k11,k12 -> k21,k22 */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
794
  	ROLDQo32(kll, klr, krl, krr, w0, w1, 49);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
795
  	/* k21 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
796
  	subL[28] = kll; subR[28] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
797
  	/* k22 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
798
  	subL[29] = krl; subR[29] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
799
800
801
  
  	/* generate KB dependent subkeys */
  	/* k1 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
802
  	subL[2] = krll; subR[2] = krlr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
803
  	/* k2 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
804
  	subL[3] = krrl; subR[3] = krrr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
805
  	ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
806
  	/* k7 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
807
  	subL[10] = krll; subR[10] = krlr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
808
  	/* k8 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
809
  	subL[11] = krrl; subR[11] = krrr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
810
  	ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
811
  	/* k15 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
812
  	subL[20] = krll; subR[20] = krlr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
813
  	/* k16 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
814
  	subL[21] = krrl; subR[21] = krrr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
815
  	ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 51);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
816
  	/* kw3 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
817
  	subL[32] = krll; subR[32] = krlr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
818
  	/* kw4 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
819
  	subL[33] = krrl; subR[33] = krrr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
820

dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
821
  	camellia_setup_tail(subkey, subL, subR, 32);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
822
823
824
825
826
827
828
829
  }
  
  static void camellia_setup192(const unsigned char *key, u32 *subkey)
  {
  	unsigned char kk[32];
  	u32 krll, krlr, krrl,krrr;
  
  	memcpy(kk, key, 24);
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
830
831
  	memcpy((unsigned char *)&krll, key+16, 4);
  	memcpy((unsigned char *)&krlr, key+20, 4);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
832
833
834
835
836
  	krrl = ~krll;
  	krrr = ~krlr;
  	memcpy(kk+24, (unsigned char *)&krrl, 4);
  	memcpy(kk+28, (unsigned char *)&krrr, 4);
  	camellia_setup256(kk, subkey);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
837
  }
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
838
839
840
841
842
843
844
845
846
847
  /*
   * Encrypt/decrypt
   */
  #define CAMELLIA_FLS(ll, lr, rl, rr, kll, klr, krl, krr, t0, t1, t2, t3) \
      do {								\
  	t0 = kll;							\
  	t2 = krr;							\
  	t0 &= ll;							\
  	t2 |= rr;							\
  	rl ^= t2;							\
32bd78e0a   Harvey Harrison   crypto: camellia ...
848
  	lr ^= rol32(t0, 1);						\
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
849
850
851
852
853
  	t3 = krl;							\
  	t1 = klr;							\
  	t3 &= rl;							\
  	t1 |= lr;							\
  	ll ^= t1;							\
32bd78e0a   Harvey Harrison   crypto: camellia ...
854
  	rr ^= rol32(t3, 1);						\
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
      } while(0)
  
  #define CAMELLIA_ROUNDSM(xl, xr, kl, kr, yl, yr, il, ir)		\
      do {								\
  	ir =  camellia_sp1110[(u8)xr];					\
  	il =  camellia_sp1110[    (xl >> 24)];				\
  	ir ^= camellia_sp0222[    (xr >> 24)];				\
  	il ^= camellia_sp0222[(u8)(xl >> 16)];				\
  	ir ^= camellia_sp3033[(u8)(xr >> 16)];				\
  	il ^= camellia_sp3033[(u8)(xl >> 8)];				\
  	ir ^= camellia_sp4404[(u8)(xr >> 8)];				\
  	il ^= camellia_sp4404[(u8)xl];					\
  	il ^= kl;							\
  	ir ^= il ^ kr;							\
  	yl ^= ir;							\
32bd78e0a   Harvey Harrison   crypto: camellia ...
870
  	yr ^= ror32(il, 8) ^ ir;						\
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
871
      } while(0)
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
872
873
  /* max = 24: 128bit encrypt, max = 32: 256bit encrypt */
  static void camellia_do_encrypt(const u32 *subkey, u32 *io, unsigned max)
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
874
  {
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
875
  	u32 il,ir,t0,t1;               /* temporary variables */
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
876

1721a8125   Denys Vlasenko   [CRYPTO] camellia...
877
  	/* pre whitening but absorb kw2 */
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
878
879
  	io[0] ^= SUBKEY_L(0);
  	io[1] ^= SUBKEY_R(0);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
880

1721a8125   Denys Vlasenko   [CRYPTO] camellia...
881
  	/* main iteration */
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
  #define ROUNDS(i) do { \
  	CAMELLIA_ROUNDSM(io[0],io[1], \
  			 SUBKEY_L(i + 2),SUBKEY_R(i + 2), \
  			 io[2],io[3],il,ir); \
  	CAMELLIA_ROUNDSM(io[2],io[3], \
  			 SUBKEY_L(i + 3),SUBKEY_R(i + 3), \
  			 io[0],io[1],il,ir); \
  	CAMELLIA_ROUNDSM(io[0],io[1], \
  			 SUBKEY_L(i + 4),SUBKEY_R(i + 4), \
  			 io[2],io[3],il,ir); \
  	CAMELLIA_ROUNDSM(io[2],io[3], \
  			 SUBKEY_L(i + 5),SUBKEY_R(i + 5), \
  			 io[0],io[1],il,ir); \
  	CAMELLIA_ROUNDSM(io[0],io[1], \
  			 SUBKEY_L(i + 6),SUBKEY_R(i + 6), \
  			 io[2],io[3],il,ir); \
  	CAMELLIA_ROUNDSM(io[2],io[3], \
  			 SUBKEY_L(i + 7),SUBKEY_R(i + 7), \
  			 io[0],io[1],il,ir); \
  } while (0)
  #define FLS(i) do { \
  	CAMELLIA_FLS(io[0],io[1],io[2],io[3], \
  		     SUBKEY_L(i + 0),SUBKEY_R(i + 0), \
  		     SUBKEY_L(i + 1),SUBKEY_R(i + 1), \
  		     t0,t1,il,ir); \
  } while (0)
  
  	ROUNDS(0);
  	FLS(8);
  	ROUNDS(8);
  	FLS(16);
  	ROUNDS(16);
  	if (max == 32) {
  		FLS(24);
  		ROUNDS(24);
  	}
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
918

acca79a66   Denys Vlasenko   [CRYPTO] camellia...
919
920
  #undef ROUNDS
  #undef FLS
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
921
922
  
  	/* post whitening but kw4 */
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
923
924
925
  	io[2] ^= SUBKEY_L(max);
  	io[3] ^= SUBKEY_R(max);
  	/* NB: io[0],[1] should be swapped with [2],[3] by caller! */
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
926
  }
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
927
  static void camellia_do_decrypt(const u32 *subkey, u32 *io, unsigned i)
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
928
  {
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
929
  	u32 il,ir,t0,t1;               /* temporary variables */
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
930

1721a8125   Denys Vlasenko   [CRYPTO] camellia...
931
  	/* pre whitening but absorb kw2 */
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
932
933
  	io[0] ^= SUBKEY_L(i);
  	io[1] ^= SUBKEY_R(i);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
934
935
  
  	/* main iteration */
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
  #define ROUNDS(i) do { \
  	CAMELLIA_ROUNDSM(io[0],io[1], \
  			 SUBKEY_L(i + 7),SUBKEY_R(i + 7), \
  			 io[2],io[3],il,ir); \
  	CAMELLIA_ROUNDSM(io[2],io[3], \
  			 SUBKEY_L(i + 6),SUBKEY_R(i + 6), \
  			 io[0],io[1],il,ir); \
  	CAMELLIA_ROUNDSM(io[0],io[1], \
  			 SUBKEY_L(i + 5),SUBKEY_R(i + 5), \
  			 io[2],io[3],il,ir); \
  	CAMELLIA_ROUNDSM(io[2],io[3], \
  			 SUBKEY_L(i + 4),SUBKEY_R(i + 4), \
  			 io[0],io[1],il,ir); \
  	CAMELLIA_ROUNDSM(io[0],io[1], \
  			 SUBKEY_L(i + 3),SUBKEY_R(i + 3), \
  			 io[2],io[3],il,ir); \
  	CAMELLIA_ROUNDSM(io[2],io[3], \
  			 SUBKEY_L(i + 2),SUBKEY_R(i + 2), \
  			 io[0],io[1],il,ir); \
  } while (0)
  #define FLS(i) do { \
  	CAMELLIA_FLS(io[0],io[1],io[2],io[3], \
  		     SUBKEY_L(i + 1),SUBKEY_R(i + 1), \
  		     SUBKEY_L(i + 0),SUBKEY_R(i + 0), \
  		     t0,t1,il,ir); \
  } while (0)
  
  	if (i == 32) {
  		ROUNDS(24);
  		FLS(24);
  	}
  	ROUNDS(16);
  	FLS(16);
  	ROUNDS(8);
  	FLS(8);
  	ROUNDS(0);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
972

acca79a66   Denys Vlasenko   [CRYPTO] camellia...
973
974
  #undef ROUNDS
  #undef FLS
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
975
976
  
  	/* post whitening but kw4 */
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
977
978
979
  	io[2] ^= SUBKEY_L(0);
  	io[3] ^= SUBKEY_R(0);
  	/* NB: 0,1 should be swapped with 2,3 by caller! */
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
980
  }
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
981
982
  struct camellia_ctx {
  	int key_length;
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
983
  	u32 key_table[CAMELLIA_TABLE_BYTE_LEN / sizeof(u32)];
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
984
  };
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
985
986
987
988
989
990
991
992
993
994
995
996
997
998
  static int
  camellia_set_key(struct crypto_tfm *tfm, const u8 *in_key,
  		 unsigned int key_len)
  {
  	struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
  	const unsigned char *key = (const unsigned char *)in_key;
  	u32 *flags = &tfm->crt_flags;
  
  	if (key_len != 16 && key_len != 24 && key_len != 32) {
  		*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
  		return -EINVAL;
  	}
  
  	cctx->key_length = key_len;
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
999
  	switch (key_len) {
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1000
1001
1002
1003
1004
1005
1006
1007
1008
  	case 16:
  		camellia_setup128(key, cctx->key_table);
  		break;
  	case 24:
  		camellia_setup192(key, cctx->key_table);
  		break;
  	case 32:
  		camellia_setup256(key, cctx->key_table);
  		break;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1009
1010
1011
1012
  	}
  
  	return 0;
  }
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1013
1014
1015
1016
1017
  static void camellia_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
  {
  	const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
  	const __be32 *src = (const __be32 *)in;
  	__be32 *dst = (__be32 *)out;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
1018
  	u32 tmp[4];
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1019

3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
1020
1021
1022
1023
  	tmp[0] = be32_to_cpu(src[0]);
  	tmp[1] = be32_to_cpu(src[1]);
  	tmp[2] = be32_to_cpu(src[2]);
  	tmp[3] = be32_to_cpu(src[3]);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1024

acca79a66   Denys Vlasenko   [CRYPTO] camellia...
1025
1026
1027
  	camellia_do_encrypt(cctx->key_table, tmp,
  		cctx->key_length == 16 ? 24 : 32 /* for key lengths of 24 and 32 */
  	);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1028

acca79a66   Denys Vlasenko   [CRYPTO] camellia...
1029
1030
1031
1032
1033
  	/* do_encrypt returns 0,1 swapped with 2,3 */
  	dst[0] = cpu_to_be32(tmp[2]);
  	dst[1] = cpu_to_be32(tmp[3]);
  	dst[2] = cpu_to_be32(tmp[0]);
  	dst[3] = cpu_to_be32(tmp[1]);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1034
  }
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1035
1036
1037
1038
1039
  static void camellia_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
  {
  	const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
  	const __be32 *src = (const __be32 *)in;
  	__be32 *dst = (__be32 *)out;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
1040
  	u32 tmp[4];
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1041

3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
1042
1043
1044
1045
  	tmp[0] = be32_to_cpu(src[0]);
  	tmp[1] = be32_to_cpu(src[1]);
  	tmp[2] = be32_to_cpu(src[2]);
  	tmp[3] = be32_to_cpu(src[3]);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1046

acca79a66   Denys Vlasenko   [CRYPTO] camellia...
1047
1048
1049
  	camellia_do_decrypt(cctx->key_table, tmp,
  		cctx->key_length == 16 ? 24 : 32 /* for key lengths of 24 and 32 */
  	);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1050

acca79a66   Denys Vlasenko   [CRYPTO] camellia...
1051
1052
1053
1054
1055
  	/* do_decrypt returns 0,1 swapped with 2,3 */
  	dst[0] = cpu_to_be32(tmp[2]);
  	dst[1] = cpu_to_be32(tmp[3]);
  	dst[2] = cpu_to_be32(tmp[0]);
  	dst[3] = cpu_to_be32(tmp[1]);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1056
  }
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
  static struct crypto_alg camellia_alg = {
  	.cra_name		=	"camellia",
  	.cra_driver_name	=	"camellia-generic",
  	.cra_priority		=	100,
  	.cra_flags		=	CRYPTO_ALG_TYPE_CIPHER,
  	.cra_blocksize		=	CAMELLIA_BLOCK_SIZE,
  	.cra_ctxsize		=	sizeof(struct camellia_ctx),
  	.cra_alignmask		=	3,
  	.cra_module		=	THIS_MODULE,
  	.cra_list		=	LIST_HEAD_INIT(camellia_alg.cra_list),
  	.cra_u			=	{
  		.cipher = {
  			.cia_min_keysize	=	CAMELLIA_MIN_KEY_SIZE,
  			.cia_max_keysize	=	CAMELLIA_MAX_KEY_SIZE,
  			.cia_setkey		=	camellia_set_key,
  			.cia_encrypt		=	camellia_encrypt,
  			.cia_decrypt		=	camellia_decrypt
  		}
  	}
  };
  
  static int __init camellia_init(void)
  {
  	return crypto_register_alg(&camellia_alg);
  }
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1082
1083
1084
1085
  static void __exit camellia_fini(void)
  {
  	crypto_unregister_alg(&camellia_alg);
  }
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1086
1087
  module_init(camellia_init);
  module_exit(camellia_fini);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1088
1089
  MODULE_DESCRIPTION("Camellia Cipher Algorithm");
  MODULE_LICENSE("GPL");