Blame view

crypto/camellia_generic.c 34 KB
1ccea77e2   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-or-later
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
2
3
4
  /*
   * Copyright (C) 2006
   * NTT (Nippon Telegraph and Telephone Corporation).
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
5
6
7
8
   */
  
  /*
   * Algorithm Specification
9332a9e73   Alexander A. Klimov   crypto: Replace H...
9
   *  https://info.isl.ntt.co.jp/crypt/eng/camellia/specifications.html
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
10
   */
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
11
12
13
14
15
  #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 ...
16
17
  #include <linux/bitops.h>
  #include <asm/unaligned.h>
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
18

d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
19
  static const u32 camellia_sp1110[256] = {
621dd3692   Richard Hartmann   crypto: camellia ...
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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
  	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,
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
84
85
86
  };
  
  static const u32 camellia_sp0222[256] = {
621dd3692   Richard Hartmann   crypto: camellia ...
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
  	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,
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
151
152
153
  };
  
  static const u32 camellia_sp3033[256] = {
621dd3692   Richard Hartmann   crypto: camellia ...
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
  	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,
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
218
219
220
  };
  
  static const u32 camellia_sp4404[256] = {
621dd3692   Richard Hartmann   crypto: camellia ...
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
  	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,
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
285
  };
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
286
287
288
289
  #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...
290
291
292
293
294
  /*
   * 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...
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
  
  /* 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
   */
e2861a71c   Jussi Kivilinna   crypto: camellia ...
314
  #define ROLDQ(ll, lr, rl, rr, w0, w1, bits) ({		\
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
315
316
317
318
319
  	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));	\
e2861a71c   Jussi Kivilinna   crypto: camellia ...
320
  })
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
321

e2861a71c   Jussi Kivilinna   crypto: camellia ...
322
  #define ROLDQo32(ll, lr, rl, rr, w0, w1, bits) ({	\
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
323
324
325
326
327
328
  	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));	\
e2861a71c   Jussi Kivilinna   crypto: camellia ...
329
  })
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
330

e2861a71c   Jussi Kivilinna   crypto: camellia ...
331
  #define CAMELLIA_F(xl, xr, kl, kr, yl, yr, il, ir, t0, t1) ({	\
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
332
333
334
335
  	il = xl ^ kl;						\
  	ir = xr ^ kr;						\
  	t0 = il >> 16;						\
  	t1 = ir >> 16;						\
e2861a71c   Jussi Kivilinna   crypto: camellia ...
336
337
338
  	yl = camellia_sp1110[(u8)(ir)]				\
  	   ^ camellia_sp0222[(u8)(t1 >> 8)]			\
  	   ^ camellia_sp3033[(u8)(t1)]				\
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
339
  	   ^ camellia_sp4404[(u8)(ir >> 8)];			\
e2861a71c   Jussi Kivilinna   crypto: camellia ...
340
341
  	yr = camellia_sp1110[(u8)(t0 >> 8)]			\
  	   ^ camellia_sp0222[(u8)(t0)]				\
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
342
  	   ^ camellia_sp3033[(u8)(il >> 8)]			\
e2861a71c   Jussi Kivilinna   crypto: camellia ...
343
  	   ^ camellia_sp4404[(u8)(il)];				\
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
344
  	yl ^= yr;						\
32bd78e0a   Harvey Harrison   crypto: camellia ...
345
  	yr = ror32(yr, 8);					\
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
346
  	yr ^= yl;						\
e2861a71c   Jussi Kivilinna   crypto: camellia ...
347
  })
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
348

3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
349
350
  #define SUBKEY_L(INDEX) (subkey[(INDEX)*2])
  #define SUBKEY_R(INDEX) (subkey[(INDEX)*2 + 1])
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
351

dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
352
  static void camellia_setup_tail(u32 *subkey, u32 *subL, u32 *subR, int max)
d3e748057   Denys Vlasenko   [CRYPTO] camellia...
353
  {
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
354
  	u32 dw, tl, tr;
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
355
  	u32 kw4l, kw4r;
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
356

ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
357
358
359
360
361
362
363
364
  	/* 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];
452ec0498   Julia Lawall   crypto: camellia_...
365
366
  	dw = subL[1] & subL[9];
  	subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl2) */
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
367
368
369
370
371
372
373
  	/* 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];
452ec0498   Julia Lawall   crypto: camellia_...
374
375
  	dw = subL[1] & subL[17];
  	subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl4) */
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
376
377
378
379
380
381
382
383
384
385
386
387
388
389
  	/* 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];
452ec0498   Julia Lawall   crypto: camellia_...
390
391
  		dw = subL[1] & subL[25];
  		subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl6) */
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
  		/* 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];
452ec0498   Julia Lawall   crypto: camellia_...
410
411
  		dw = kw4l & subL[24];
  		kw4r ^= rol32(dw, 1); /* modified for FL(kl5) */
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
412
413
414
415
416
417
418
419
  	}
  	/* 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];
452ec0498   Julia Lawall   crypto: camellia_...
420
421
  	dw = kw4l & subL[16];
  	kw4r ^= rol32(dw, 1); /* modified for FL(kl3) */
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
422
423
424
425
426
427
428
  	/* 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];
452ec0498   Julia Lawall   crypto: camellia_...
429
430
  	dw = kw4l & subL[8];
  	kw4r ^= rol32(dw, 1); /* modified for FL(kl1) */
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
431
432
433
434
435
436
437
438
  	/* 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...
439
440
441
442
443
444
445
446
447
448
449
450
451
452
  	/* 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]);
452ec0498   Julia Lawall   crypto: camellia_...
453
454
  	dw = tl & subL[8];  /* FL(kl1) */
  	tr = subR[10] ^ rol32(dw, 1);
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
455
456
457
458
459
460
461
  	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]);
452ec0498   Julia Lawall   crypto: camellia_...
462
463
  	dw = tl & subL[9];  /* FLinv(kl2) */
  	tr = subR[7] ^ rol32(dw, 1);
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
464
465
466
467
468
469
470
471
472
473
474
  	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]);
452ec0498   Julia Lawall   crypto: camellia_...
475
476
  	dw = tl & subL[16]; /* FL(kl3) */
  	tr = subR[18] ^ rol32(dw, 1);
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
477
478
479
480
481
482
483
  	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]);
452ec0498   Julia Lawall   crypto: camellia_...
484
485
  	dw = tl & subL[17]; /* FLinv(kl4) */
  	tr = subR[15] ^ rol32(dw, 1);
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
  	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]);
452ec0498   Julia Lawall   crypto: camellia_...
503
504
  		dw = tl & subL[24]; /* FL(kl5) */
  		tr = subR[26] ^ rol32(dw, 1);
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
505
506
507
508
509
510
511
  		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]);
452ec0498   Julia Lawall   crypto: camellia_...
512
513
  		dw = tl & subL[25]; /* FLinv(kl6) */
  		tr = subR[23] ^ rol32(dw, 1);
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
  		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];
  	}
d3e748057   Denys Vlasenko   [CRYPTO] camellia...
529
  }
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
530
531
532
533
  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...
534
535
536
537
  	u32 subL[26];
  	u32 subR[26];
  
  	/**
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
538
  	 *  k == kll || klr || krl || krr (|| is concatenation)
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
539
  	 */
32bd78e0a   Harvey Harrison   crypto: camellia ...
540
541
542
543
  	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...
544

dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
545
  	/* generate KL dependent subkeys */
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
546
  	/* kw1 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
547
  	subL[0] = kll; subR[0] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
548
  	/* kw2 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
549
  	subL[1] = krl; subR[1] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
550
  	/* rotation left shift 15bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
551
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
552
  	/* k3 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
553
  	subL[4] = kll; subR[4] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
554
  	/* k4 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
555
  	subL[5] = krl; subR[5] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
556
  	/* rotation left shift 15+30bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
557
  	ROLDQ(kll, klr, krl, krr, w0, w1, 30);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
558
  	/* k7 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
559
  	subL[10] = kll; subR[10] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
560
  	/* k8 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
561
  	subL[11] = krl; subR[11] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
562
  	/* rotation left shift 15+30+15bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
563
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
564
  	/* k10 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
565
  	subL[13] = krl; subR[13] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
566
  	/* rotation left shift 15+30+15+17 bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
567
  	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
568
  	/* kl3 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
569
  	subL[16] = kll; subR[16] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
570
  	/* kl4 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
571
  	subL[17] = krl; subR[17] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
572
  	/* rotation left shift 15+30+15+17+17 bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
573
  	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
574
  	/* k13 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
575
  	subL[18] = kll; subR[18] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
576
  	/* k14 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
577
  	subL[19] = krl; subR[19] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
578
  	/* rotation left shift 15+30+15+17+17+17 bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
579
  	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
580
  	/* k17 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
581
  	subL[22] = kll; subR[22] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
582
  	/* k18 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
583
  	subL[23] = krl; subR[23] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
584
585
  
  	/* generate KA */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
586
587
  	kll = subL[0]; klr = subR[0];
  	krl = subL[1]; krr = subR[1];
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
  	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...
607
608
  	subL[2] = kll; subR[2] = klr;
  	subL[3] = krl; subR[3] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
609
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
610
  	/* k5,k6 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
611
612
  	subL[6] = kll; subR[6] = klr;
  	subL[7] = krl; subR[7] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
613
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
614
  	/* kl1, kl2 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
615
616
  	subL[8] = kll; subR[8] = klr;
  	subL[9] = krl; subR[9] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
617
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
618
  	/* k9 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
619
  	subL[12] = kll; subR[12] = klr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
620
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
621
  	/* k11, k12 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
622
623
  	subL[14] = kll; subR[14] = klr;
  	subL[15] = krl; subR[15] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
624
  	ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
625
  	/* k15, k16 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
626
627
  	subL[20] = kll; subR[20] = klr;
  	subL[21] = krl; subR[21] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
628
  	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
629
  	/* kw3, kw4 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
630
631
  	subL[24] = kll; subR[24] = klr;
  	subL[25] = krl; subR[25] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
632

dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
633
  	camellia_setup_tail(subkey, subL, subR, 24);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
634
  }
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
635
636
  static void camellia_setup256(const unsigned char *key, u32 *subkey)
  {
1ce73e8d6   Denys Vlasenko   [CRYPTO] camellia...
637
638
  	u32 kll, klr, krl, krr;        /* left half of key */
  	u32 krll, krlr, krrl, krrr;    /* right half of key */
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
639
  	u32 il, ir, t0, t1, w0, w1;    /* temporary variables */
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
640
641
642
643
644
  	u32 subL[34];
  	u32 subR[34];
  
  	/**
  	 *  key = (kll || klr || krl || krr || krll || krlr || krrl || krrr)
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
645
  	 *  (|| is concatenation)
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
646
  	 */
32bd78e0a   Harvey Harrison   crypto: camellia ...
647
648
649
650
651
652
653
654
  	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...
655
656
657
  
  	/* generate KL dependent subkeys */
  	/* kw1 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
658
  	subL[0] = kll; subR[0] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
659
  	/* kw2 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
660
  	subL[1] = krl; subR[1] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
661
  	ROLDQo32(kll, klr, krl, krr, w0, w1, 45);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
662
  	/* k9 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
663
  	subL[12] = kll; subR[12] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
664
  	/* k10 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
665
  	subL[13] = krl; subR[13] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
666
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
667
  	/* kl3 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
668
  	subL[16] = kll; subR[16] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
669
  	/* kl4 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
670
  	subL[17] = krl; subR[17] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
671
  	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
672
  	/* k17 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
673
  	subL[22] = kll; subR[22] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
674
  	/* k18 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
675
  	subL[23] = krl; subR[23] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
676
  	ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
677
  	/* k23 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
678
  	subL[30] = kll; subR[30] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
679
  	/* k24 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
680
  	subL[31] = krl; subR[31] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
681
682
  
  	/* generate KR dependent subkeys */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
683
  	ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
684
  	/* k3 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
685
  	subL[4] = krll; subR[4] = krlr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
686
  	/* k4 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
687
  	subL[5] = krrl; subR[5] = krrr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
688
  	ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
689
  	/* kl1 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
690
  	subL[8] = krll; subR[8] = krlr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
691
  	/* kl2 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
692
  	subL[9] = krrl; subR[9] = krrr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
693
  	ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
694
  	/* k13 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
695
  	subL[18] = krll; subR[18] = krlr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
696
  	/* k14 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
697
  	subL[19] = krrl; subR[19] = krrr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
698
  	ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
699
  	/* k19 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
700
  	subL[26] = krll; subR[26] = krlr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
701
  	/* k20 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
702
  	subL[27] = krrl; subR[27] = krrr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
703
  	ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
704
705
  
  	/* generate KA */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
706
707
  	kll = subL[0] ^ krll; klr = subR[0] ^ krlr;
  	krl = subL[1] ^ krrl; krr = subR[1] ^ krrr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
  	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...
738
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
739
  	/* k5 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
740
  	subL[6] = kll; subR[6] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
741
  	/* k6 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
742
  	subL[7] = krl; subR[7] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
743
  	ROLDQ(kll, klr, krl, krr, w0, w1, 30);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
744
  	/* k11 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
745
  	subL[14] = kll; subR[14] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
746
  	/* k12 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
747
  	subL[15] = krl; subR[15] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
748
749
  	/* rotation left shift 32bit */
  	/* kl5 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
750
  	subL[24] = klr; subR[24] = krl;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
751
  	/* kl6 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
752
  	subL[25] = krr; subR[25] = kll;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
753
  	/* rotation left shift 49 from k11,k12 -> k21,k22 */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
754
  	ROLDQo32(kll, klr, krl, krr, w0, w1, 49);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
755
  	/* k21 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
756
  	subL[28] = kll; subR[28] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
757
  	/* k22 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
758
  	subL[29] = krl; subR[29] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
759
760
761
  
  	/* generate KB dependent subkeys */
  	/* k1 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
762
  	subL[2] = krll; subR[2] = krlr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
763
  	/* k2 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
764
  	subL[3] = krrl; subR[3] = krrr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
765
  	ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
766
  	/* k7 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
767
  	subL[10] = krll; subR[10] = krlr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
768
  	/* k8 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
769
  	subL[11] = krrl; subR[11] = krrr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
770
  	ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
771
  	/* k15 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
772
  	subL[20] = krll; subR[20] = krlr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
773
  	/* k16 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
774
  	subL[21] = krrl; subR[21] = krrr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
775
  	ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 51);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
776
  	/* kw3 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
777
  	subL[32] = krll; subR[32] = krlr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
778
  	/* kw4 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
779
  	subL[33] = krrl; subR[33] = krrr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
780

dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
781
  	camellia_setup_tail(subkey, subL, subR, 32);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
782
783
784
785
786
  }
  
  static void camellia_setup192(const unsigned char *key, u32 *subkey)
  {
  	unsigned char kk[32];
621dd3692   Richard Hartmann   crypto: camellia ...
787
  	u32 krll, krlr, krrl, krrr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
788
789
  
  	memcpy(kk, key, 24);
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
790
791
  	memcpy((unsigned char *)&krll, key+16, 4);
  	memcpy((unsigned char *)&krlr, key+20, 4);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
792
793
794
795
796
  	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...
797
  }
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
798
799
800
  /*
   * Encrypt/decrypt
   */
e2861a71c   Jussi Kivilinna   crypto: camellia ...
801
  #define CAMELLIA_FLS(ll, lr, rl, rr, kll, klr, krl, krr, t0, t1, t2, t3) ({ \
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
802
803
804
805
806
  	t0 = kll;							\
  	t2 = krr;							\
  	t0 &= ll;							\
  	t2 |= rr;							\
  	rl ^= t2;							\
32bd78e0a   Harvey Harrison   crypto: camellia ...
807
  	lr ^= rol32(t0, 1);						\
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
808
809
810
811
812
  	t3 = krl;							\
  	t1 = klr;							\
  	t3 &= rl;							\
  	t1 |= lr;							\
  	ll ^= t1;							\
32bd78e0a   Harvey Harrison   crypto: camellia ...
813
  	rr ^= rol32(t3, 1);						\
e2861a71c   Jussi Kivilinna   crypto: camellia ...
814
  })
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
815

e2861a71c   Jussi Kivilinna   crypto: camellia ...
816
  #define CAMELLIA_ROUNDSM(xl, xr, kl, kr, yl, yr, il, ir) ({		\
c9b56d33b   Jussi Kivilinna   crypto: camellia ...
817
818
  	yl ^= kl;							\
  	yr ^= kr;							\
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
819
  	ir =  camellia_sp1110[(u8)xr];					\
e2861a71c   Jussi Kivilinna   crypto: camellia ...
820
821
  	il =  camellia_sp1110[(u8)(xl >> 24)];				\
  	ir ^= camellia_sp0222[(u8)(xr >> 24)];				\
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
822
823
824
825
826
  	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];					\
c9b56d33b   Jussi Kivilinna   crypto: camellia ...
827
  	ir ^= il;							\
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
828
  	yl ^= ir;							\
e2861a71c   Jussi Kivilinna   crypto: camellia ...
829
830
  	yr ^= ror32(il, 8) ^ ir;					\
  })
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
831

acca79a66   Denys Vlasenko   [CRYPTO] camellia...
832
833
  /* 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...
834
  {
621dd3692   Richard Hartmann   crypto: camellia ...
835
  	u32 il, ir, t0, t1;            /* temporary variables */
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
836

1721a8125   Denys Vlasenko   [CRYPTO] camellia...
837
  	/* pre whitening but absorb kw2 */
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
838
839
  	io[0] ^= SUBKEY_L(0);
  	io[1] ^= SUBKEY_R(0);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
840

1721a8125   Denys Vlasenko   [CRYPTO] camellia...
841
  	/* main iteration */
e2861a71c   Jussi Kivilinna   crypto: camellia ...
842
  #define ROUNDS(i) ({ \
621dd3692   Richard Hartmann   crypto: camellia ...
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
  	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); \
e2861a71c   Jussi Kivilinna   crypto: camellia ...
861
862
  })
  #define FLS(i) ({ \
621dd3692   Richard Hartmann   crypto: camellia ...
863
864
865
866
  	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); \
e2861a71c   Jussi Kivilinna   crypto: camellia ...
867
  })
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
868
869
870
871
872
873
874
875
876
877
  
  	ROUNDS(0);
  	FLS(8);
  	ROUNDS(8);
  	FLS(16);
  	ROUNDS(16);
  	if (max == 32) {
  		FLS(24);
  		ROUNDS(24);
  	}
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
878

acca79a66   Denys Vlasenko   [CRYPTO] camellia...
879
880
  #undef ROUNDS
  #undef FLS
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
881
882
  
  	/* post whitening but kw4 */
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
883
884
885
  	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...
886
  }
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
887
  static void camellia_do_decrypt(const u32 *subkey, u32 *io, unsigned i)
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
888
  {
621dd3692   Richard Hartmann   crypto: camellia ...
889
  	u32 il, ir, t0, t1;            /* temporary variables */
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
890

1721a8125   Denys Vlasenko   [CRYPTO] camellia...
891
  	/* pre whitening but absorb kw2 */
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
892
893
  	io[0] ^= SUBKEY_L(i);
  	io[1] ^= SUBKEY_R(i);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
894
895
  
  	/* main iteration */
e2861a71c   Jussi Kivilinna   crypto: camellia ...
896
  #define ROUNDS(i) ({ \
621dd3692   Richard Hartmann   crypto: camellia ...
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
  	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); \
e2861a71c   Jussi Kivilinna   crypto: camellia ...
915
916
  })
  #define FLS(i) ({ \
621dd3692   Richard Hartmann   crypto: camellia ...
917
918
919
920
  	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); \
e2861a71c   Jussi Kivilinna   crypto: camellia ...
921
  })
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
922
923
924
925
926
927
928
929
930
931
  
  	if (i == 32) {
  		ROUNDS(24);
  		FLS(24);
  	}
  	ROUNDS(16);
  	FLS(16);
  	ROUNDS(8);
  	FLS(8);
  	ROUNDS(0);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
932

acca79a66   Denys Vlasenko   [CRYPTO] camellia...
933
934
  #undef ROUNDS
  #undef FLS
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
935
936
  
  	/* post whitening but kw4 */
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
937
938
939
  	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...
940
  }
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
941
942
  struct camellia_ctx {
  	int key_length;
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
943
  	u32 key_table[CAMELLIA_TABLE_BYTE_LEN / sizeof(u32)];
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
944
  };
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
945
946
947
948
949
950
  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;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
951

674f368a9   Eric Biggers   crypto: remove CR...
952
  	if (key_len != 16 && key_len != 24 && key_len != 32)
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
953
  		return -EINVAL;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
954
955
  
  	cctx->key_length = key_len;
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
956
  	switch (key_len) {
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
957
958
959
960
961
962
963
964
965
  	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...
966
967
968
969
  	}
  
  	return 0;
  }
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
970
971
972
  static void camellia_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
  {
  	const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
e2861a71c   Jussi Kivilinna   crypto: camellia ...
973
  	unsigned int max;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
974

3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
975
  	u32 tmp[4];
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
976

833854151   Ard Biesheuvel   crypto: camellia ...
977
978
979
980
  	tmp[0] = get_unaligned_be32(in);
  	tmp[1] = get_unaligned_be32(in + 4);
  	tmp[2] = get_unaligned_be32(in + 8);
  	tmp[3] = get_unaligned_be32(in + 12);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
981

e2861a71c   Jussi Kivilinna   crypto: camellia ...
982
983
984
985
986
987
  	if (cctx->key_length == 16)
  		max = 24;
  	else
  		max = 32; /* for key lengths of 24 and 32 */
  
  	camellia_do_encrypt(cctx->key_table, tmp, max);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
988

acca79a66   Denys Vlasenko   [CRYPTO] camellia...
989
  	/* do_encrypt returns 0,1 swapped with 2,3 */
833854151   Ard Biesheuvel   crypto: camellia ...
990
991
992
993
  	put_unaligned_be32(tmp[2], out);
  	put_unaligned_be32(tmp[3], out + 4);
  	put_unaligned_be32(tmp[0], out + 8);
  	put_unaligned_be32(tmp[1], out + 12);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
994
  }
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
995
996
997
  static void camellia_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
  {
  	const struct camellia_ctx *cctx = crypto_tfm_ctx(tfm);
e2861a71c   Jussi Kivilinna   crypto: camellia ...
998
  	unsigned int max;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
999

3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
1000
  	u32 tmp[4];
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1001

833854151   Ard Biesheuvel   crypto: camellia ...
1002
1003
1004
1005
  	tmp[0] = get_unaligned_be32(in);
  	tmp[1] = get_unaligned_be32(in + 4);
  	tmp[2] = get_unaligned_be32(in + 8);
  	tmp[3] = get_unaligned_be32(in + 12);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1006

e2861a71c   Jussi Kivilinna   crypto: camellia ...
1007
1008
1009
1010
1011
1012
  	if (cctx->key_length == 16)
  		max = 24;
  	else
  		max = 32; /* for key lengths of 24 and 32 */
  
  	camellia_do_decrypt(cctx->key_table, tmp, max);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1013

acca79a66   Denys Vlasenko   [CRYPTO] camellia...
1014
  	/* do_decrypt returns 0,1 swapped with 2,3 */
833854151   Ard Biesheuvel   crypto: camellia ...
1015
1016
1017
1018
  	put_unaligned_be32(tmp[2], out);
  	put_unaligned_be32(tmp[3], out + 4);
  	put_unaligned_be32(tmp[0], out + 8);
  	put_unaligned_be32(tmp[1], out + 12);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1019
  }
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1020
1021
1022
1023
1024
1025
1026
  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),
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1027
  	.cra_module		=	THIS_MODULE,
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
  	.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...
1043
1044
1045
1046
  static void __exit camellia_fini(void)
  {
  	crypto_unregister_alg(&camellia_alg);
  }
c4741b230   Eric Biggers   crypto: run initc...
1047
  subsys_initcall(camellia_init);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1048
  module_exit(camellia_fini);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1049
1050
  MODULE_DESCRIPTION("Camellia Cipher Algorithm");
  MODULE_LICENSE("GPL");
5d26a105b   Kees Cook   crypto: prefix mo...
1051
  MODULE_ALIAS_CRYPTO("camellia");
3e14dcf7c   Mathias Krause   crypto: add missi...
1052
  MODULE_ALIAS_CRYPTO("camellia-generic");