Blame view

crypto/camellia_generic.c 34.9 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
  static const u32 camellia_sp1110[256] = {
621dd3692   Richard Hartmann   crypto: camellia ...
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
  	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...
106
107
108
  };
  
  static const u32 camellia_sp0222[256] = {
621dd3692   Richard Hartmann   crypto: camellia ...
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
  	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...
173
174
175
  };
  
  static const u32 camellia_sp3033[256] = {
621dd3692   Richard Hartmann   crypto: camellia ...
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
  	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...
240
241
242
  };
  
  static const u32 camellia_sp4404[256] = {
621dd3692   Richard Hartmann   crypto: camellia ...
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
  	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...
307
  };
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
   */
e2861a71c   Jussi Kivilinna   crypto: camellia ...
336
  #define ROLDQ(ll, lr, rl, rr, w0, w1, bits) ({		\
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
337
338
339
340
341
  	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 ...
342
  })
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
343

e2861a71c   Jussi Kivilinna   crypto: camellia ...
344
  #define ROLDQo32(ll, lr, rl, rr, w0, w1, bits) ({	\
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
345
346
347
348
349
350
  	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 ...
351
  })
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
352

e2861a71c   Jussi Kivilinna   crypto: camellia ...
353
  #define CAMELLIA_F(xl, xr, kl, kr, yl, yr, il, ir, t0, t1) ({	\
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
354
355
356
357
  	il = xl ^ kl;						\
  	ir = xr ^ kr;						\
  	t0 = il >> 16;						\
  	t1 = ir >> 16;						\
e2861a71c   Jussi Kivilinna   crypto: camellia ...
358
359
360
  	yl = camellia_sp1110[(u8)(ir)]				\
  	   ^ camellia_sp0222[(u8)(t1 >> 8)]			\
  	   ^ camellia_sp3033[(u8)(t1)]				\
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
361
  	   ^ camellia_sp4404[(u8)(ir >> 8)];			\
e2861a71c   Jussi Kivilinna   crypto: camellia ...
362
363
  	yr = camellia_sp1110[(u8)(t0 >> 8)]			\
  	   ^ camellia_sp0222[(u8)(t0)]				\
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
364
  	   ^ camellia_sp3033[(u8)(il >> 8)]			\
e2861a71c   Jussi Kivilinna   crypto: camellia ...
365
  	   ^ camellia_sp4404[(u8)(il)];				\
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
366
  	yl ^= yr;						\
32bd78e0a   Harvey Harrison   crypto: camellia ...
367
  	yr = ror32(yr, 8);					\
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
368
  	yr ^= yl;						\
e2861a71c   Jussi Kivilinna   crypto: camellia ...
369
  })
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
370

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

ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
379
380
381
382
383
384
385
386
  	/* 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_...
387
388
  	dw = subL[1] & subL[9];
  	subR[1] ^= rol32(dw, 1); /* modified for FLinv(kl2) */
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
389
390
391
392
393
394
395
  	/* 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_...
396
397
  	dw = subL[1] & subL[17];
  	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
  	/* 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_...
412
413
  		dw = subL[1] & subL[25];
  		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
  		/* 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_...
432
433
  		dw = kw4l & subL[24];
  		kw4r ^= rol32(dw, 1); /* modified for FL(kl5) */
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
434
435
436
437
438
439
440
441
  	}
  	/* 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_...
442
443
  	dw = kw4l & subL[16];
  	kw4r ^= rol32(dw, 1); /* modified for FL(kl3) */
ff85a8082   Denys Vlasenko   [CRYPTO] camellia...
444
445
446
447
448
449
450
  	/* 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_...
451
452
  	dw = kw4l & subL[8];
  	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
  	/* 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_...
475
476
  	dw = tl & subL[8];  /* FL(kl1) */
  	tr = subR[10] ^ rol32(dw, 1);
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
477
478
479
480
481
482
483
  	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_...
484
485
  	dw = tl & subL[9];  /* FLinv(kl2) */
  	tr = subR[7] ^ rol32(dw, 1);
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
486
487
488
489
490
491
492
493
494
495
496
  	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_...
497
498
  	dw = tl & subL[16]; /* FL(kl3) */
  	tr = subR[18] ^ rol32(dw, 1);
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
499
500
501
502
503
504
505
  	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_...
506
507
  	dw = tl & subL[17]; /* FLinv(kl4) */
  	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
  	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_...
525
526
  		dw = tl & subL[24]; /* FL(kl5) */
  		tr = subR[26] ^ rol32(dw, 1);
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
527
528
529
530
531
532
533
  		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_...
534
535
  		dw = tl & subL[25]; /* FLinv(kl6) */
  		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
  		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...
551
  }
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
552
553
554
555
  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...
556
557
558
559
  	u32 subL[26];
  	u32 subR[26];
  
  	/**
dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
560
  	 *  k == kll || klr || krl || krr (|| is concatenation)
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
561
  	 */
32bd78e0a   Harvey Harrison   crypto: camellia ...
562
563
564
565
  	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...
566

dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
567
  	/* generate KL dependent subkeys */
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
568
  	/* kw1 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
569
  	subL[0] = kll; subR[0] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
570
  	/* kw2 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
571
  	subL[1] = krl; subR[1] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
572
  	/* rotation left shift 15bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
573
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
574
  	/* k3 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
575
  	subL[4] = kll; subR[4] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
576
  	/* k4 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
577
  	subL[5] = krl; subR[5] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
578
  	/* rotation left shift 15+30bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
579
  	ROLDQ(kll, klr, krl, krr, w0, w1, 30);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
580
  	/* k7 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
581
  	subL[10] = kll; subR[10] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
582
  	/* k8 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
583
  	subL[11] = krl; subR[11] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
584
  	/* rotation left shift 15+30+15bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
585
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
586
  	/* k10 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
587
  	subL[13] = krl; subR[13] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
588
  	/* rotation left shift 15+30+15+17 bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
589
  	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
590
  	/* kl3 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
591
  	subL[16] = kll; subR[16] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
592
  	/* kl4 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
593
  	subL[17] = krl; subR[17] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
594
  	/* rotation left shift 15+30+15+17+17 bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
595
  	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
596
  	/* k13 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
597
  	subL[18] = kll; subR[18] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
598
  	/* k14 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
599
  	subL[19] = krl; subR[19] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
600
  	/* rotation left shift 15+30+15+17+17+17 bit */
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
601
  	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
602
  	/* k17 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
603
  	subL[22] = kll; subR[22] = klr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
604
  	/* k18 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
605
  	subL[23] = krl; subR[23] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
606
607
  
  	/* generate KA */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
608
609
  	kll = subL[0]; klr = subR[0];
  	krl = subL[1]; krr = subR[1];
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
  	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...
629
630
  	subL[2] = kll; subR[2] = klr;
  	subL[3] = krl; subR[3] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
631
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
632
  	/* k5,k6 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
633
634
  	subL[6] = kll; subR[6] = klr;
  	subL[7] = krl; subR[7] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
635
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
636
  	/* kl1, kl2 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
637
638
  	subL[8] = kll; subR[8] = klr;
  	subL[9] = krl; subR[9] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
639
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
640
  	/* k9 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
641
  	subL[12] = kll; subR[12] = klr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
642
  	ROLDQ(kll, klr, krl, krr, w0, w1, 15);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
643
  	/* k11, k12 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
644
645
  	subL[14] = kll; subR[14] = klr;
  	subL[15] = krl; subR[15] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
646
  	ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
647
  	/* k15, k16 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
648
649
  	subL[20] = kll; subR[20] = klr;
  	subL[21] = krl; subR[21] = krr;
3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
650
  	ROLDQ(kll, klr, krl, krr, w0, w1, 17);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
651
  	/* kw3, kw4 */
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
652
653
  	subL[24] = kll; subR[24] = klr;
  	subL[25] = krl; subR[25] = krr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
654

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

dedcf8b06   Denys Vlasenko   [CRYPTO] camellia...
803
  	camellia_setup_tail(subkey, subL, subR, 32);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
804
805
806
807
808
  }
  
  static void camellia_setup192(const unsigned char *key, u32 *subkey)
  {
  	unsigned char kk[32];
621dd3692   Richard Hartmann   crypto: camellia ...
809
  	u32 krll, krlr, krrl, krrr;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
810
811
  
  	memcpy(kk, key, 24);
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
812
813
  	memcpy((unsigned char *)&krll, key+16, 4);
  	memcpy((unsigned char *)&krlr, key+20, 4);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
814
815
816
817
818
  	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...
819
  }
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
820
821
822
  /*
   * Encrypt/decrypt
   */
e2861a71c   Jussi Kivilinna   crypto: camellia ...
823
  #define CAMELLIA_FLS(ll, lr, rl, rr, kll, klr, krl, krr, t0, t1, t2, t3) ({ \
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
824
825
826
827
828
  	t0 = kll;							\
  	t2 = krr;							\
  	t0 &= ll;							\
  	t2 |= rr;							\
  	rl ^= t2;							\
32bd78e0a   Harvey Harrison   crypto: camellia ...
829
  	lr ^= rol32(t0, 1);						\
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
830
831
832
833
834
  	t3 = krl;							\
  	t1 = klr;							\
  	t3 &= rl;							\
  	t1 |= lr;							\
  	ll ^= t1;							\
32bd78e0a   Harvey Harrison   crypto: camellia ...
835
  	rr ^= rol32(t3, 1);						\
e2861a71c   Jussi Kivilinna   crypto: camellia ...
836
  })
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
837

e2861a71c   Jussi Kivilinna   crypto: camellia ...
838
  #define CAMELLIA_ROUNDSM(xl, xr, kl, kr, yl, yr, il, ir) ({		\
c9b56d33b   Jussi Kivilinna   crypto: camellia ...
839
840
  	yl ^= kl;							\
  	yr ^= kr;							\
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
841
  	ir =  camellia_sp1110[(u8)xr];					\
e2861a71c   Jussi Kivilinna   crypto: camellia ...
842
843
  	il =  camellia_sp1110[(u8)(xl >> 24)];				\
  	ir ^= camellia_sp0222[(u8)(xr >> 24)];				\
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
844
845
846
847
848
  	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 ...
849
  	ir ^= il;							\
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
850
  	yl ^= ir;							\
e2861a71c   Jussi Kivilinna   crypto: camellia ...
851
852
  	yr ^= ror32(il, 8) ^ ir;					\
  })
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
853

acca79a66   Denys Vlasenko   [CRYPTO] camellia...
854
855
  /* 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...
856
  {
621dd3692   Richard Hartmann   crypto: camellia ...
857
  	u32 il, ir, t0, t1;            /* temporary variables */
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
858

1721a8125   Denys Vlasenko   [CRYPTO] camellia...
859
  	/* pre whitening but absorb kw2 */
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
860
861
  	io[0] ^= SUBKEY_L(0);
  	io[1] ^= SUBKEY_R(0);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
862

1721a8125   Denys Vlasenko   [CRYPTO] camellia...
863
  	/* main iteration */
e2861a71c   Jussi Kivilinna   crypto: camellia ...
864
  #define ROUNDS(i) ({ \
621dd3692   Richard Hartmann   crypto: camellia ...
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
  	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 ...
883
884
  })
  #define FLS(i) ({ \
621dd3692   Richard Hartmann   crypto: camellia ...
885
886
887
888
  	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 ...
889
  })
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
890
891
892
893
894
895
896
897
898
899
  
  	ROUNDS(0);
  	FLS(8);
  	ROUNDS(8);
  	FLS(16);
  	ROUNDS(16);
  	if (max == 32) {
  		FLS(24);
  		ROUNDS(24);
  	}
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
900

acca79a66   Denys Vlasenko   [CRYPTO] camellia...
901
902
  #undef ROUNDS
  #undef FLS
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
903
904
  
  	/* post whitening but kw4 */
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
905
906
907
  	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...
908
  }
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
909
  static void camellia_do_decrypt(const u32 *subkey, u32 *io, unsigned i)
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
910
  {
621dd3692   Richard Hartmann   crypto: camellia ...
911
  	u32 il, ir, t0, t1;            /* temporary variables */
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
912

1721a8125   Denys Vlasenko   [CRYPTO] camellia...
913
  	/* pre whitening but absorb kw2 */
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
914
915
  	io[0] ^= SUBKEY_L(i);
  	io[1] ^= SUBKEY_R(i);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
916
917
  
  	/* main iteration */
e2861a71c   Jussi Kivilinna   crypto: camellia ...
918
  #define ROUNDS(i) ({ \
621dd3692   Richard Hartmann   crypto: camellia ...
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
  	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 ...
937
938
  })
  #define FLS(i) ({ \
621dd3692   Richard Hartmann   crypto: camellia ...
939
940
941
942
  	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 ...
943
  })
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
944
945
946
947
948
949
950
951
952
953
  
  	if (i == 32) {
  		ROUNDS(24);
  		FLS(24);
  	}
  	ROUNDS(16);
  	FLS(16);
  	ROUNDS(8);
  	FLS(8);
  	ROUNDS(0);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
954

acca79a66   Denys Vlasenko   [CRYPTO] camellia...
955
956
  #undef ROUNDS
  #undef FLS
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
957
958
  
  	/* post whitening but kw4 */
acca79a66   Denys Vlasenko   [CRYPTO] camellia...
959
960
961
  	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...
962
  }
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
963
964
  struct camellia_ctx {
  	int key_length;
2ddae4a64   Denys Vlasenko   [CRYPTO] camellia...
965
  	u32 key_table[CAMELLIA_TABLE_BYTE_LEN / sizeof(u32)];
1721a8125   Denys Vlasenko   [CRYPTO] camellia...
966
  };
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
967
968
969
970
971
972
973
974
975
976
977
978
979
980
  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...
981
  	switch (key_len) {
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
982
983
984
985
986
987
988
989
990
  	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...
991
992
993
994
  	}
  
  	return 0;
  }
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
995
996
997
998
999
  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;
e2861a71c   Jussi Kivilinna   crypto: camellia ...
1000
  	unsigned int max;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1001

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

3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
1004
1005
1006
1007
  	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...
1008

e2861a71c   Jussi Kivilinna   crypto: camellia ...
1009
1010
1011
1012
1013
1014
  	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...
1015

acca79a66   Denys Vlasenko   [CRYPTO] camellia...
1016
1017
1018
1019
1020
  	/* 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...
1021
  }
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1022
1023
1024
1025
1026
  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;
e2861a71c   Jussi Kivilinna   crypto: camellia ...
1027
  	unsigned int max;
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1028

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

3a5e5f810   Denys Vlasenko   [CRYPTO] camellia...
1031
1032
1033
1034
  	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...
1035

e2861a71c   Jussi Kivilinna   crypto: camellia ...
1036
1037
1038
1039
1040
1041
  	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...
1042

acca79a66   Denys Vlasenko   [CRYPTO] camellia...
1043
1044
1045
1046
1047
  	/* 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...
1048
  }
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1049
1050
1051
1052
1053
1054
1055
1056
1057
  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,
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
  	.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...
1073
1074
1075
1076
  static void __exit camellia_fini(void)
  {
  	crypto_unregister_alg(&camellia_alg);
  }
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1077
1078
  module_init(camellia_init);
  module_exit(camellia_fini);
d64beac05   Noriaki TAKAMIYA   [CRYPTO] camellia...
1079
1080
  MODULE_DESCRIPTION("Camellia Cipher Algorithm");
  MODULE_LICENSE("GPL");
5d26a105b   Kees Cook   crypto: prefix mo...
1081
  MODULE_ALIAS_CRYPTO("camellia");
3e14dcf7c   Mathias Krause   crypto: add missi...
1082
  MODULE_ALIAS_CRYPTO("camellia-generic");