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