Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/crypto/camellia/camellia.c
39482 views
1
/* camellia.h ver 1.1.0
2
*
3
* Copyright (c) 2006
4
* NTT (Nippon Telegraph and Telephone Corporation) . All rights reserved.
5
*
6
* Redistribution and use in source and binary forms, with or without
7
* modification, are permitted provided that the following conditions
8
* are met:
9
* 1. Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer as
11
* the first lines of this file unmodified.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
*
16
* THIS SOFTWARE IS PROVIDED BY NTT ``AS IS'' AND ANY EXPRESS OR
17
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19
* IN NO EVENT SHALL NTT BE LIABLE FOR ANY DIRECT, INDIRECT,
20
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
*/
27
28
/*
29
* Algorithm Specification
30
* http://info.isl.ntt.co.jp/crypt/eng/camellia/specifications.html
31
*/
32
33
#include <sys/types.h>
34
#include <sys/endian.h>
35
#ifdef _KERNEL
36
#include <sys/systm.h>
37
#else
38
#include <string.h>
39
#include <assert.h>
40
#define KASSERT(exp, msg) assert(exp)
41
#endif
42
43
#include <crypto/camellia/camellia.h>
44
45
46
/* key constants */
47
48
#define CAMELLIA_SIGMA1L (0xA09E667FL)
49
#define CAMELLIA_SIGMA1R (0x3BCC908BL)
50
#define CAMELLIA_SIGMA2L (0xB67AE858L)
51
#define CAMELLIA_SIGMA2R (0x4CAA73B2L)
52
#define CAMELLIA_SIGMA3L (0xC6EF372FL)
53
#define CAMELLIA_SIGMA3R (0xE94F82BEL)
54
#define CAMELLIA_SIGMA4L (0x54FF53A5L)
55
#define CAMELLIA_SIGMA4R (0xF1D36F1CL)
56
#define CAMELLIA_SIGMA5L (0x10E527FAL)
57
#define CAMELLIA_SIGMA5R (0xDE682D1DL)
58
#define CAMELLIA_SIGMA6L (0xB05688C2L)
59
#define CAMELLIA_SIGMA6R (0xB3E6C1FDL)
60
61
/*
62
* macros
63
*/
64
#define GETU32(pt) (((uint32_t)(pt)[0] << 24) \
65
^ ((uint32_t)(pt)[1] << 16) \
66
^ ((uint32_t)(pt)[2] << 8) \
67
^ ((uint32_t)(pt)[3]))
68
69
#define PUTU32(ct, st) {(ct)[0] = (uint8_t)((st) >> 24); \
70
(ct)[1] = (uint8_t)((st) >> 16); \
71
(ct)[2] = (uint8_t)((st) >> 8); \
72
(ct)[3] = (uint8_t)(st);}
73
74
#define SUBL(INDEX) (subkey[(INDEX)*2+1])
75
#define SUBR(INDEX) (subkey[(INDEX)*2])
76
77
#define CAMELLIA_RR8(x) (((x) >> 8) + ((x) << 24))
78
#define CAMELLIA_RL1(x) (((x) << 1) + ((x) >> 31))
79
#define CAMELLIA_RL8(x) (((x) << 8) + ((x) >> 24))
80
81
#define CAMELLIA_ROLDQ(ll, lr, rl, rr, w0, w1, bits) \
82
do { \
83
w0 = ll; \
84
ll = (ll << bits) + (lr >> (32 - bits)); \
85
lr = (lr << bits) + (rl >> (32 - bits)); \
86
rl = (rl << bits) + (rr >> (32 - bits)); \
87
rr = (rr << bits) + (w0 >> (32 - bits)); \
88
} while(0)
89
90
#define CAMELLIA_ROLDQo32(ll, lr, rl, rr, w0, w1, bits) \
91
do { \
92
w0 = ll; \
93
w1 = lr; \
94
ll = (lr << (bits - 32)) + (rl >> (64 - bits)); \
95
lr = (rl << (bits - 32)) + (rr >> (64 - bits)); \
96
rl = (rr << (bits - 32)) + (w0 >> (64 - bits)); \
97
rr = (w0 << (bits - 32)) + (w1 >> (64 - bits)); \
98
} while(0)
99
100
#define CAMELLIA_SP1110(INDEX) (camellia_sp1110[(INDEX)])
101
#define CAMELLIA_SP0222(INDEX) (camellia_sp0222[(INDEX)])
102
#define CAMELLIA_SP3033(INDEX) (camellia_sp3033[(INDEX)])
103
#define CAMELLIA_SP4404(INDEX) (camellia_sp4404[(INDEX)])
104
105
#define CAMELLIA_F(xl, xr, kl, kr, yl, yr, il, ir, t0, t1) \
106
do { \
107
il = xl ^ kl; \
108
ir = xr ^ kr; \
109
t0 = il >> 16; \
110
t1 = ir >> 16; \
111
yl = CAMELLIA_SP1110(ir & 0xff) \
112
^ CAMELLIA_SP0222((t1 >> 8) & 0xff) \
113
^ CAMELLIA_SP3033(t1 & 0xff) \
114
^ CAMELLIA_SP4404((ir >> 8) & 0xff); \
115
yr = CAMELLIA_SP1110((t0 >> 8) & 0xff) \
116
^ CAMELLIA_SP0222(t0 & 0xff) \
117
^ CAMELLIA_SP3033((il >> 8) & 0xff) \
118
^ CAMELLIA_SP4404(il & 0xff); \
119
yl ^= yr; \
120
yr = CAMELLIA_RR8(yr); \
121
yr ^= yl; \
122
} while(0)
123
124
125
#define CAMELLIA_FLS(ll, lr, rl, rr, kll, klr, krl, krr, t0, t1, t2, t3) \
126
do { \
127
t0 = kll; \
128
t2 = krr; \
129
t0 &= ll; \
130
t2 |= rr; \
131
rl ^= t2; \
132
lr ^= CAMELLIA_RL1(t0); \
133
t3 = krl; \
134
t1 = klr; \
135
t3 &= rl; \
136
t1 |= lr; \
137
ll ^= t1; \
138
rr ^= CAMELLIA_RL1(t3); \
139
} while(0)
140
141
#define CAMELLIA_ROUNDSM(xl, xr, kl, kr, yl, yr, il, ir, t0, t1) \
142
do { \
143
ir = CAMELLIA_SP1110(xr & 0xff); \
144
il = CAMELLIA_SP1110((xl>>24) & 0xff); \
145
ir ^= CAMELLIA_SP0222((xr>>24) & 0xff); \
146
il ^= CAMELLIA_SP0222((xl>>16) & 0xff); \
147
ir ^= CAMELLIA_SP3033((xr>>16) & 0xff); \
148
il ^= CAMELLIA_SP3033((xl>>8) & 0xff); \
149
ir ^= CAMELLIA_SP4404((xr>>8) & 0xff); \
150
il ^= CAMELLIA_SP4404(xl & 0xff); \
151
il ^= kl; \
152
ir ^= kr; \
153
ir ^= il; \
154
il = CAMELLIA_RR8(il); \
155
il ^= ir; \
156
yl ^= ir; \
157
yr ^= il; \
158
} while(0)
159
160
161
static const uint32_t camellia_sp1110[256] = {
162
0x70707000,0x82828200,0x2c2c2c00,0xececec00,
163
0xb3b3b300,0x27272700,0xc0c0c000,0xe5e5e500,
164
0xe4e4e400,0x85858500,0x57575700,0x35353500,
165
0xeaeaea00,0x0c0c0c00,0xaeaeae00,0x41414100,
166
0x23232300,0xefefef00,0x6b6b6b00,0x93939300,
167
0x45454500,0x19191900,0xa5a5a500,0x21212100,
168
0xededed00,0x0e0e0e00,0x4f4f4f00,0x4e4e4e00,
169
0x1d1d1d00,0x65656500,0x92929200,0xbdbdbd00,
170
0x86868600,0xb8b8b800,0xafafaf00,0x8f8f8f00,
171
0x7c7c7c00,0xebebeb00,0x1f1f1f00,0xcecece00,
172
0x3e3e3e00,0x30303000,0xdcdcdc00,0x5f5f5f00,
173
0x5e5e5e00,0xc5c5c500,0x0b0b0b00,0x1a1a1a00,
174
0xa6a6a600,0xe1e1e100,0x39393900,0xcacaca00,
175
0xd5d5d500,0x47474700,0x5d5d5d00,0x3d3d3d00,
176
0xd9d9d900,0x01010100,0x5a5a5a00,0xd6d6d600,
177
0x51515100,0x56565600,0x6c6c6c00,0x4d4d4d00,
178
0x8b8b8b00,0x0d0d0d00,0x9a9a9a00,0x66666600,
179
0xfbfbfb00,0xcccccc00,0xb0b0b000,0x2d2d2d00,
180
0x74747400,0x12121200,0x2b2b2b00,0x20202000,
181
0xf0f0f000,0xb1b1b100,0x84848400,0x99999900,
182
0xdfdfdf00,0x4c4c4c00,0xcbcbcb00,0xc2c2c200,
183
0x34343400,0x7e7e7e00,0x76767600,0x05050500,
184
0x6d6d6d00,0xb7b7b700,0xa9a9a900,0x31313100,
185
0xd1d1d100,0x17171700,0x04040400,0xd7d7d700,
186
0x14141400,0x58585800,0x3a3a3a00,0x61616100,
187
0xdedede00,0x1b1b1b00,0x11111100,0x1c1c1c00,
188
0x32323200,0x0f0f0f00,0x9c9c9c00,0x16161600,
189
0x53535300,0x18181800,0xf2f2f200,0x22222200,
190
0xfefefe00,0x44444400,0xcfcfcf00,0xb2b2b200,
191
0xc3c3c300,0xb5b5b500,0x7a7a7a00,0x91919100,
192
0x24242400,0x08080800,0xe8e8e800,0xa8a8a800,
193
0x60606000,0xfcfcfc00,0x69696900,0x50505000,
194
0xaaaaaa00,0xd0d0d000,0xa0a0a000,0x7d7d7d00,
195
0xa1a1a100,0x89898900,0x62626200,0x97979700,
196
0x54545400,0x5b5b5b00,0x1e1e1e00,0x95959500,
197
0xe0e0e000,0xffffff00,0x64646400,0xd2d2d200,
198
0x10101000,0xc4c4c400,0x00000000,0x48484800,
199
0xa3a3a300,0xf7f7f700,0x75757500,0xdbdbdb00,
200
0x8a8a8a00,0x03030300,0xe6e6e600,0xdadada00,
201
0x09090900,0x3f3f3f00,0xdddddd00,0x94949400,
202
0x87878700,0x5c5c5c00,0x83838300,0x02020200,
203
0xcdcdcd00,0x4a4a4a00,0x90909000,0x33333300,
204
0x73737300,0x67676700,0xf6f6f600,0xf3f3f300,
205
0x9d9d9d00,0x7f7f7f00,0xbfbfbf00,0xe2e2e200,
206
0x52525200,0x9b9b9b00,0xd8d8d800,0x26262600,
207
0xc8c8c800,0x37373700,0xc6c6c600,0x3b3b3b00,
208
0x81818100,0x96969600,0x6f6f6f00,0x4b4b4b00,
209
0x13131300,0xbebebe00,0x63636300,0x2e2e2e00,
210
0xe9e9e900,0x79797900,0xa7a7a700,0x8c8c8c00,
211
0x9f9f9f00,0x6e6e6e00,0xbcbcbc00,0x8e8e8e00,
212
0x29292900,0xf5f5f500,0xf9f9f900,0xb6b6b600,
213
0x2f2f2f00,0xfdfdfd00,0xb4b4b400,0x59595900,
214
0x78787800,0x98989800,0x06060600,0x6a6a6a00,
215
0xe7e7e700,0x46464600,0x71717100,0xbababa00,
216
0xd4d4d400,0x25252500,0xababab00,0x42424200,
217
0x88888800,0xa2a2a200,0x8d8d8d00,0xfafafa00,
218
0x72727200,0x07070700,0xb9b9b900,0x55555500,
219
0xf8f8f800,0xeeeeee00,0xacacac00,0x0a0a0a00,
220
0x36363600,0x49494900,0x2a2a2a00,0x68686800,
221
0x3c3c3c00,0x38383800,0xf1f1f100,0xa4a4a400,
222
0x40404000,0x28282800,0xd3d3d300,0x7b7b7b00,
223
0xbbbbbb00,0xc9c9c900,0x43434300,0xc1c1c100,
224
0x15151500,0xe3e3e300,0xadadad00,0xf4f4f400,
225
0x77777700,0xc7c7c700,0x80808000,0x9e9e9e00,
226
};
227
228
static const uint32_t camellia_sp0222[256] = {
229
0x00e0e0e0,0x00050505,0x00585858,0x00d9d9d9,
230
0x00676767,0x004e4e4e,0x00818181,0x00cbcbcb,
231
0x00c9c9c9,0x000b0b0b,0x00aeaeae,0x006a6a6a,
232
0x00d5d5d5,0x00181818,0x005d5d5d,0x00828282,
233
0x00464646,0x00dfdfdf,0x00d6d6d6,0x00272727,
234
0x008a8a8a,0x00323232,0x004b4b4b,0x00424242,
235
0x00dbdbdb,0x001c1c1c,0x009e9e9e,0x009c9c9c,
236
0x003a3a3a,0x00cacaca,0x00252525,0x007b7b7b,
237
0x000d0d0d,0x00717171,0x005f5f5f,0x001f1f1f,
238
0x00f8f8f8,0x00d7d7d7,0x003e3e3e,0x009d9d9d,
239
0x007c7c7c,0x00606060,0x00b9b9b9,0x00bebebe,
240
0x00bcbcbc,0x008b8b8b,0x00161616,0x00343434,
241
0x004d4d4d,0x00c3c3c3,0x00727272,0x00959595,
242
0x00ababab,0x008e8e8e,0x00bababa,0x007a7a7a,
243
0x00b3b3b3,0x00020202,0x00b4b4b4,0x00adadad,
244
0x00a2a2a2,0x00acacac,0x00d8d8d8,0x009a9a9a,
245
0x00171717,0x001a1a1a,0x00353535,0x00cccccc,
246
0x00f7f7f7,0x00999999,0x00616161,0x005a5a5a,
247
0x00e8e8e8,0x00242424,0x00565656,0x00404040,
248
0x00e1e1e1,0x00636363,0x00090909,0x00333333,
249
0x00bfbfbf,0x00989898,0x00979797,0x00858585,
250
0x00686868,0x00fcfcfc,0x00ececec,0x000a0a0a,
251
0x00dadada,0x006f6f6f,0x00535353,0x00626262,
252
0x00a3a3a3,0x002e2e2e,0x00080808,0x00afafaf,
253
0x00282828,0x00b0b0b0,0x00747474,0x00c2c2c2,
254
0x00bdbdbd,0x00363636,0x00222222,0x00383838,
255
0x00646464,0x001e1e1e,0x00393939,0x002c2c2c,
256
0x00a6a6a6,0x00303030,0x00e5e5e5,0x00444444,
257
0x00fdfdfd,0x00888888,0x009f9f9f,0x00656565,
258
0x00878787,0x006b6b6b,0x00f4f4f4,0x00232323,
259
0x00484848,0x00101010,0x00d1d1d1,0x00515151,
260
0x00c0c0c0,0x00f9f9f9,0x00d2d2d2,0x00a0a0a0,
261
0x00555555,0x00a1a1a1,0x00414141,0x00fafafa,
262
0x00434343,0x00131313,0x00c4c4c4,0x002f2f2f,
263
0x00a8a8a8,0x00b6b6b6,0x003c3c3c,0x002b2b2b,
264
0x00c1c1c1,0x00ffffff,0x00c8c8c8,0x00a5a5a5,
265
0x00202020,0x00898989,0x00000000,0x00909090,
266
0x00474747,0x00efefef,0x00eaeaea,0x00b7b7b7,
267
0x00151515,0x00060606,0x00cdcdcd,0x00b5b5b5,
268
0x00121212,0x007e7e7e,0x00bbbbbb,0x00292929,
269
0x000f0f0f,0x00b8b8b8,0x00070707,0x00040404,
270
0x009b9b9b,0x00949494,0x00212121,0x00666666,
271
0x00e6e6e6,0x00cecece,0x00ededed,0x00e7e7e7,
272
0x003b3b3b,0x00fefefe,0x007f7f7f,0x00c5c5c5,
273
0x00a4a4a4,0x00373737,0x00b1b1b1,0x004c4c4c,
274
0x00919191,0x006e6e6e,0x008d8d8d,0x00767676,
275
0x00030303,0x002d2d2d,0x00dedede,0x00969696,
276
0x00262626,0x007d7d7d,0x00c6c6c6,0x005c5c5c,
277
0x00d3d3d3,0x00f2f2f2,0x004f4f4f,0x00191919,
278
0x003f3f3f,0x00dcdcdc,0x00797979,0x001d1d1d,
279
0x00525252,0x00ebebeb,0x00f3f3f3,0x006d6d6d,
280
0x005e5e5e,0x00fbfbfb,0x00696969,0x00b2b2b2,
281
0x00f0f0f0,0x00313131,0x000c0c0c,0x00d4d4d4,
282
0x00cfcfcf,0x008c8c8c,0x00e2e2e2,0x00757575,
283
0x00a9a9a9,0x004a4a4a,0x00575757,0x00848484,
284
0x00111111,0x00454545,0x001b1b1b,0x00f5f5f5,
285
0x00e4e4e4,0x000e0e0e,0x00737373,0x00aaaaaa,
286
0x00f1f1f1,0x00dddddd,0x00595959,0x00141414,
287
0x006c6c6c,0x00929292,0x00545454,0x00d0d0d0,
288
0x00787878,0x00707070,0x00e3e3e3,0x00494949,
289
0x00808080,0x00505050,0x00a7a7a7,0x00f6f6f6,
290
0x00777777,0x00939393,0x00868686,0x00838383,
291
0x002a2a2a,0x00c7c7c7,0x005b5b5b,0x00e9e9e9,
292
0x00eeeeee,0x008f8f8f,0x00010101,0x003d3d3d,
293
};
294
295
static const uint32_t camellia_sp3033[256] = {
296
0x38003838,0x41004141,0x16001616,0x76007676,
297
0xd900d9d9,0x93009393,0x60006060,0xf200f2f2,
298
0x72007272,0xc200c2c2,0xab00abab,0x9a009a9a,
299
0x75007575,0x06000606,0x57005757,0xa000a0a0,
300
0x91009191,0xf700f7f7,0xb500b5b5,0xc900c9c9,
301
0xa200a2a2,0x8c008c8c,0xd200d2d2,0x90009090,
302
0xf600f6f6,0x07000707,0xa700a7a7,0x27002727,
303
0x8e008e8e,0xb200b2b2,0x49004949,0xde00dede,
304
0x43004343,0x5c005c5c,0xd700d7d7,0xc700c7c7,
305
0x3e003e3e,0xf500f5f5,0x8f008f8f,0x67006767,
306
0x1f001f1f,0x18001818,0x6e006e6e,0xaf00afaf,
307
0x2f002f2f,0xe200e2e2,0x85008585,0x0d000d0d,
308
0x53005353,0xf000f0f0,0x9c009c9c,0x65006565,
309
0xea00eaea,0xa300a3a3,0xae00aeae,0x9e009e9e,
310
0xec00ecec,0x80008080,0x2d002d2d,0x6b006b6b,
311
0xa800a8a8,0x2b002b2b,0x36003636,0xa600a6a6,
312
0xc500c5c5,0x86008686,0x4d004d4d,0x33003333,
313
0xfd00fdfd,0x66006666,0x58005858,0x96009696,
314
0x3a003a3a,0x09000909,0x95009595,0x10001010,
315
0x78007878,0xd800d8d8,0x42004242,0xcc00cccc,
316
0xef00efef,0x26002626,0xe500e5e5,0x61006161,
317
0x1a001a1a,0x3f003f3f,0x3b003b3b,0x82008282,
318
0xb600b6b6,0xdb00dbdb,0xd400d4d4,0x98009898,
319
0xe800e8e8,0x8b008b8b,0x02000202,0xeb00ebeb,
320
0x0a000a0a,0x2c002c2c,0x1d001d1d,0xb000b0b0,
321
0x6f006f6f,0x8d008d8d,0x88008888,0x0e000e0e,
322
0x19001919,0x87008787,0x4e004e4e,0x0b000b0b,
323
0xa900a9a9,0x0c000c0c,0x79007979,0x11001111,
324
0x7f007f7f,0x22002222,0xe700e7e7,0x59005959,
325
0xe100e1e1,0xda00dada,0x3d003d3d,0xc800c8c8,
326
0x12001212,0x04000404,0x74007474,0x54005454,
327
0x30003030,0x7e007e7e,0xb400b4b4,0x28002828,
328
0x55005555,0x68006868,0x50005050,0xbe00bebe,
329
0xd000d0d0,0xc400c4c4,0x31003131,0xcb00cbcb,
330
0x2a002a2a,0xad00adad,0x0f000f0f,0xca00caca,
331
0x70007070,0xff00ffff,0x32003232,0x69006969,
332
0x08000808,0x62006262,0x00000000,0x24002424,
333
0xd100d1d1,0xfb00fbfb,0xba00baba,0xed00eded,
334
0x45004545,0x81008181,0x73007373,0x6d006d6d,
335
0x84008484,0x9f009f9f,0xee00eeee,0x4a004a4a,
336
0xc300c3c3,0x2e002e2e,0xc100c1c1,0x01000101,
337
0xe600e6e6,0x25002525,0x48004848,0x99009999,
338
0xb900b9b9,0xb300b3b3,0x7b007b7b,0xf900f9f9,
339
0xce00cece,0xbf00bfbf,0xdf00dfdf,0x71007171,
340
0x29002929,0xcd00cdcd,0x6c006c6c,0x13001313,
341
0x64006464,0x9b009b9b,0x63006363,0x9d009d9d,
342
0xc000c0c0,0x4b004b4b,0xb700b7b7,0xa500a5a5,
343
0x89008989,0x5f005f5f,0xb100b1b1,0x17001717,
344
0xf400f4f4,0xbc00bcbc,0xd300d3d3,0x46004646,
345
0xcf00cfcf,0x37003737,0x5e005e5e,0x47004747,
346
0x94009494,0xfa00fafa,0xfc00fcfc,0x5b005b5b,
347
0x97009797,0xfe00fefe,0x5a005a5a,0xac00acac,
348
0x3c003c3c,0x4c004c4c,0x03000303,0x35003535,
349
0xf300f3f3,0x23002323,0xb800b8b8,0x5d005d5d,
350
0x6a006a6a,0x92009292,0xd500d5d5,0x21002121,
351
0x44004444,0x51005151,0xc600c6c6,0x7d007d7d,
352
0x39003939,0x83008383,0xdc00dcdc,0xaa00aaaa,
353
0x7c007c7c,0x77007777,0x56005656,0x05000505,
354
0x1b001b1b,0xa400a4a4,0x15001515,0x34003434,
355
0x1e001e1e,0x1c001c1c,0xf800f8f8,0x52005252,
356
0x20002020,0x14001414,0xe900e9e9,0xbd00bdbd,
357
0xdd00dddd,0xe400e4e4,0xa100a1a1,0xe000e0e0,
358
0x8a008a8a,0xf100f1f1,0xd600d6d6,0x7a007a7a,
359
0xbb00bbbb,0xe300e3e3,0x40004040,0x4f004f4f,
360
};
361
362
static const uint32_t camellia_sp4404[256] = {
363
0x70700070,0x2c2c002c,0xb3b300b3,0xc0c000c0,
364
0xe4e400e4,0x57570057,0xeaea00ea,0xaeae00ae,
365
0x23230023,0x6b6b006b,0x45450045,0xa5a500a5,
366
0xeded00ed,0x4f4f004f,0x1d1d001d,0x92920092,
367
0x86860086,0xafaf00af,0x7c7c007c,0x1f1f001f,
368
0x3e3e003e,0xdcdc00dc,0x5e5e005e,0x0b0b000b,
369
0xa6a600a6,0x39390039,0xd5d500d5,0x5d5d005d,
370
0xd9d900d9,0x5a5a005a,0x51510051,0x6c6c006c,
371
0x8b8b008b,0x9a9a009a,0xfbfb00fb,0xb0b000b0,
372
0x74740074,0x2b2b002b,0xf0f000f0,0x84840084,
373
0xdfdf00df,0xcbcb00cb,0x34340034,0x76760076,
374
0x6d6d006d,0xa9a900a9,0xd1d100d1,0x04040004,
375
0x14140014,0x3a3a003a,0xdede00de,0x11110011,
376
0x32320032,0x9c9c009c,0x53530053,0xf2f200f2,
377
0xfefe00fe,0xcfcf00cf,0xc3c300c3,0x7a7a007a,
378
0x24240024,0xe8e800e8,0x60600060,0x69690069,
379
0xaaaa00aa,0xa0a000a0,0xa1a100a1,0x62620062,
380
0x54540054,0x1e1e001e,0xe0e000e0,0x64640064,
381
0x10100010,0x00000000,0xa3a300a3,0x75750075,
382
0x8a8a008a,0xe6e600e6,0x09090009,0xdddd00dd,
383
0x87870087,0x83830083,0xcdcd00cd,0x90900090,
384
0x73730073,0xf6f600f6,0x9d9d009d,0xbfbf00bf,
385
0x52520052,0xd8d800d8,0xc8c800c8,0xc6c600c6,
386
0x81810081,0x6f6f006f,0x13130013,0x63630063,
387
0xe9e900e9,0xa7a700a7,0x9f9f009f,0xbcbc00bc,
388
0x29290029,0xf9f900f9,0x2f2f002f,0xb4b400b4,
389
0x78780078,0x06060006,0xe7e700e7,0x71710071,
390
0xd4d400d4,0xabab00ab,0x88880088,0x8d8d008d,
391
0x72720072,0xb9b900b9,0xf8f800f8,0xacac00ac,
392
0x36360036,0x2a2a002a,0x3c3c003c,0xf1f100f1,
393
0x40400040,0xd3d300d3,0xbbbb00bb,0x43430043,
394
0x15150015,0xadad00ad,0x77770077,0x80800080,
395
0x82820082,0xecec00ec,0x27270027,0xe5e500e5,
396
0x85850085,0x35350035,0x0c0c000c,0x41410041,
397
0xefef00ef,0x93930093,0x19190019,0x21210021,
398
0x0e0e000e,0x4e4e004e,0x65650065,0xbdbd00bd,
399
0xb8b800b8,0x8f8f008f,0xebeb00eb,0xcece00ce,
400
0x30300030,0x5f5f005f,0xc5c500c5,0x1a1a001a,
401
0xe1e100e1,0xcaca00ca,0x47470047,0x3d3d003d,
402
0x01010001,0xd6d600d6,0x56560056,0x4d4d004d,
403
0x0d0d000d,0x66660066,0xcccc00cc,0x2d2d002d,
404
0x12120012,0x20200020,0xb1b100b1,0x99990099,
405
0x4c4c004c,0xc2c200c2,0x7e7e007e,0x05050005,
406
0xb7b700b7,0x31310031,0x17170017,0xd7d700d7,
407
0x58580058,0x61610061,0x1b1b001b,0x1c1c001c,
408
0x0f0f000f,0x16160016,0x18180018,0x22220022,
409
0x44440044,0xb2b200b2,0xb5b500b5,0x91910091,
410
0x08080008,0xa8a800a8,0xfcfc00fc,0x50500050,
411
0xd0d000d0,0x7d7d007d,0x89890089,0x97970097,
412
0x5b5b005b,0x95950095,0xffff00ff,0xd2d200d2,
413
0xc4c400c4,0x48480048,0xf7f700f7,0xdbdb00db,
414
0x03030003,0xdada00da,0x3f3f003f,0x94940094,
415
0x5c5c005c,0x02020002,0x4a4a004a,0x33330033,
416
0x67670067,0xf3f300f3,0x7f7f007f,0xe2e200e2,
417
0x9b9b009b,0x26260026,0x37370037,0x3b3b003b,
418
0x96960096,0x4b4b004b,0xbebe00be,0x2e2e002e,
419
0x79790079,0x8c8c008c,0x6e6e006e,0x8e8e008e,
420
0xf5f500f5,0xb6b600b6,0xfdfd00fd,0x59590059,
421
0x98980098,0x6a6a006a,0x46460046,0xbaba00ba,
422
0x25250025,0x42420042,0xa2a200a2,0xfafa00fa,
423
0x07070007,0x55550055,0xeeee00ee,0x0a0a000a,
424
0x49490049,0x68680068,0x38380038,0xa4a400a4,
425
0x28280028,0x7b7b007b,0xc9c900c9,0xc1c100c1,
426
0xe3e300e3,0xf4f400f4,0xc7c700c7,0x9e9e009e,
427
};
428
429
430
/*
431
* Stuff related to the Camellia key schedule
432
*/
433
#define subl(x) subL[(x)]
434
#define subr(x) subR[(x)]
435
436
void
437
camellia_setup128(const unsigned char *key, uint32_t *subkey)
438
{
439
uint32_t kll, klr, krl, krr;
440
uint32_t il, ir, t0, t1, w0, w1;
441
uint32_t kw4l, kw4r, dw, tl, tr;
442
uint32_t subL[26];
443
uint32_t subR[26];
444
445
/*
446
* k == kll || klr || krl || krr (|| is concatination)
447
*/
448
kll = GETU32(key );
449
klr = GETU32(key + 4);
450
krl = GETU32(key + 8);
451
krr = GETU32(key + 12);
452
/*
453
* generate KL dependent subkeys
454
*/
455
subl(0) = kll; subr(0) = klr;
456
subl(1) = krl; subr(1) = krr;
457
CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
458
subl(4) = kll; subr(4) = klr;
459
subl(5) = krl; subr(5) = krr;
460
CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 30);
461
subl(10) = kll; subr(10) = klr;
462
subl(11) = krl; subr(11) = krr;
463
CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
464
subl(13) = krl; subr(13) = krr;
465
CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17);
466
subl(16) = kll; subr(16) = klr;
467
subl(17) = krl; subr(17) = krr;
468
CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17);
469
subl(18) = kll; subr(18) = klr;
470
subl(19) = krl; subr(19) = krr;
471
CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17);
472
subl(22) = kll; subr(22) = klr;
473
subl(23) = krl; subr(23) = krr;
474
475
/* generate KA */
476
kll = subl(0); klr = subr(0);
477
krl = subl(1); krr = subr(1);
478
CAMELLIA_F(kll, klr, CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
479
w0, w1, il, ir, t0, t1);
480
krl ^= w0; krr ^= w1;
481
CAMELLIA_F(krl, krr, CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
482
kll, klr, il, ir, t0, t1);
483
CAMELLIA_F(kll, klr, CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
484
krl, krr, il, ir, t0, t1);
485
krl ^= w0; krr ^= w1;
486
CAMELLIA_F(krl, krr, CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
487
w0, w1, il, ir, t0, t1);
488
kll ^= w0; klr ^= w1;
489
490
/* generate KA dependent subkeys */
491
subl(2) = kll; subr(2) = klr;
492
subl(3) = krl; subr(3) = krr;
493
CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
494
subl(6) = kll; subr(6) = klr;
495
subl(7) = krl; subr(7) = krr;
496
CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
497
subl(8) = kll; subr(8) = klr;
498
subl(9) = krl; subr(9) = krr;
499
CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
500
subl(12) = kll; subr(12) = klr;
501
CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
502
subl(14) = kll; subr(14) = klr;
503
subl(15) = krl; subr(15) = krr;
504
CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
505
subl(20) = kll; subr(20) = klr;
506
subl(21) = krl; subr(21) = krr;
507
CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17);
508
subl(24) = kll; subr(24) = klr;
509
subl(25) = krl; subr(25) = krr;
510
511
512
/* absorb kw2 to other subkeys */
513
subl(3) ^= subl(1); subr(3) ^= subr(1);
514
subl(5) ^= subl(1); subr(5) ^= subr(1);
515
subl(7) ^= subl(1); subr(7) ^= subr(1);
516
subl(1) ^= subr(1) & ~subr(9);
517
dw = subl(1) & subl(9), subr(1) ^= CAMELLIA_RL1(dw);
518
subl(11) ^= subl(1); subr(11) ^= subr(1);
519
subl(13) ^= subl(1); subr(13) ^= subr(1);
520
subl(15) ^= subl(1); subr(15) ^= subr(1);
521
subl(1) ^= subr(1) & ~subr(17);
522
dw = subl(1) & subl(17), subr(1) ^= CAMELLIA_RL1(dw);
523
subl(19) ^= subl(1); subr(19) ^= subr(1);
524
subl(21) ^= subl(1); subr(21) ^= subr(1);
525
subl(23) ^= subl(1); subr(23) ^= subr(1);
526
subl(24) ^= subl(1); subr(24) ^= subr(1);
527
528
/* absorb kw4 to other subkeys */
529
kw4l = subl(25); kw4r = subr(25);
530
subl(22) ^= kw4l; subr(22) ^= kw4r;
531
subl(20) ^= kw4l; subr(20) ^= kw4r;
532
subl(18) ^= kw4l; subr(18) ^= kw4r;
533
kw4l ^= kw4r & ~subr(16);
534
dw = kw4l & subl(16), kw4r ^= CAMELLIA_RL1(dw);
535
subl(14) ^= kw4l; subr(14) ^= kw4r;
536
subl(12) ^= kw4l; subr(12) ^= kw4r;
537
subl(10) ^= kw4l; subr(10) ^= kw4r;
538
kw4l ^= kw4r & ~subr(8);
539
dw = kw4l & subl(8), kw4r ^= CAMELLIA_RL1(dw);
540
subl(6) ^= kw4l; subr(6) ^= kw4r;
541
subl(4) ^= kw4l; subr(4) ^= kw4r;
542
subl(2) ^= kw4l; subr(2) ^= kw4r;
543
subl(0) ^= kw4l; subr(0) ^= kw4r;
544
545
/* key XOR is end of F-function */
546
SUBL(0) = subl(0) ^ subl(2);
547
SUBR(0) = subr(0) ^ subr(2);
548
SUBL(2) = subl(3);
549
SUBR(2) = subr(3);
550
SUBL(3) = subl(2) ^ subl(4);
551
SUBR(3) = subr(2) ^ subr(4);
552
SUBL(4) = subl(3) ^ subl(5);
553
SUBR(4) = subr(3) ^ subr(5);
554
SUBL(5) = subl(4) ^ subl(6);
555
SUBR(5) = subr(4) ^ subr(6);
556
SUBL(6) = subl(5) ^ subl(7);
557
SUBR(6) = subr(5) ^ subr(7);
558
tl = subl(10) ^ (subr(10) & ~subr(8));
559
dw = tl & subl(8), tr = subr(10) ^ CAMELLIA_RL1(dw);
560
SUBL(7) = subl(6) ^ tl;
561
SUBR(7) = subr(6) ^ tr;
562
SUBL(8) = subl(8);
563
SUBR(8) = subr(8);
564
SUBL(9) = subl(9);
565
SUBR(9) = subr(9);
566
tl = subl(7) ^ (subr(7) & ~subr(9));
567
dw = tl & subl(9), tr = subr(7) ^ CAMELLIA_RL1(dw);
568
SUBL(10) = tl ^ subl(11);
569
SUBR(10) = tr ^ subr(11);
570
SUBL(11) = subl(10) ^ subl(12);
571
SUBR(11) = subr(10) ^ subr(12);
572
SUBL(12) = subl(11) ^ subl(13);
573
SUBR(12) = subr(11) ^ subr(13);
574
SUBL(13) = subl(12) ^ subl(14);
575
SUBR(13) = subr(12) ^ subr(14);
576
SUBL(14) = subl(13) ^ subl(15);
577
SUBR(14) = subr(13) ^ subr(15);
578
tl = subl(18) ^ (subr(18) & ~subr(16));
579
dw = tl & subl(16), tr = subr(18) ^ CAMELLIA_RL1(dw);
580
SUBL(15) = subl(14) ^ tl;
581
SUBR(15) = subr(14) ^ tr;
582
SUBL(16) = subl(16);
583
SUBR(16) = subr(16);
584
SUBL(17) = subl(17);
585
SUBR(17) = subr(17);
586
tl = subl(15) ^ (subr(15) & ~subr(17));
587
dw = tl & subl(17), tr = subr(15) ^ CAMELLIA_RL1(dw);
588
SUBL(18) = tl ^ subl(19);
589
SUBR(18) = tr ^ subr(19);
590
SUBL(19) = subl(18) ^ subl(20);
591
SUBR(19) = subr(18) ^ subr(20);
592
SUBL(20) = subl(19) ^ subl(21);
593
SUBR(20) = subr(19) ^ subr(21);
594
SUBL(21) = subl(20) ^ subl(22);
595
SUBR(21) = subr(20) ^ subr(22);
596
SUBL(22) = subl(21) ^ subl(23);
597
SUBR(22) = subr(21) ^ subr(23);
598
SUBL(23) = subl(22);
599
SUBR(23) = subr(22);
600
SUBL(24) = subl(24) ^ subl(23);
601
SUBR(24) = subr(24) ^ subr(23);
602
603
/* apply the inverse of the last half of P-function */
604
dw = SUBL(2) ^ SUBR(2), dw = CAMELLIA_RL8(dw);
605
SUBR(2) = SUBL(2) ^ dw, SUBL(2) = dw;
606
dw = SUBL(3) ^ SUBR(3), dw = CAMELLIA_RL8(dw);
607
SUBR(3) = SUBL(3) ^ dw, SUBL(3) = dw;
608
dw = SUBL(4) ^ SUBR(4), dw = CAMELLIA_RL8(dw);
609
SUBR(4) = SUBL(4) ^ dw, SUBL(4) = dw;
610
dw = SUBL(5) ^ SUBR(5), dw = CAMELLIA_RL8(dw);
611
SUBR(5) = SUBL(5) ^ dw, SUBL(5) = dw;
612
dw = SUBL(6) ^ SUBR(6), dw = CAMELLIA_RL8(dw);
613
SUBR(6) = SUBL(6) ^ dw, SUBL(6) = dw;
614
dw = SUBL(7) ^ SUBR(7), dw = CAMELLIA_RL8(dw);
615
SUBR(7) = SUBL(7) ^ dw, SUBL(7) = dw;
616
dw = SUBL(10) ^ SUBR(10), dw = CAMELLIA_RL8(dw);
617
SUBR(10) = SUBL(10) ^ dw, SUBL(10) = dw;
618
dw = SUBL(11) ^ SUBR(11), dw = CAMELLIA_RL8(dw);
619
SUBR(11) = SUBL(11) ^ dw, SUBL(11) = dw;
620
dw = SUBL(12) ^ SUBR(12), dw = CAMELLIA_RL8(dw);
621
SUBR(12) = SUBL(12) ^ dw, SUBL(12) = dw;
622
dw = SUBL(13) ^ SUBR(13), dw = CAMELLIA_RL8(dw);
623
SUBR(13) = SUBL(13) ^ dw, SUBL(13) = dw;
624
dw = SUBL(14) ^ SUBR(14), dw = CAMELLIA_RL8(dw);
625
SUBR(14) = SUBL(14) ^ dw, SUBL(14) = dw;
626
dw = SUBL(15) ^ SUBR(15), dw = CAMELLIA_RL8(dw);
627
SUBR(15) = SUBL(15) ^ dw, SUBL(15) = dw;
628
dw = SUBL(18) ^ SUBR(18), dw = CAMELLIA_RL8(dw);
629
SUBR(18) = SUBL(18) ^ dw, SUBL(18) = dw;
630
dw = SUBL(19) ^ SUBR(19), dw = CAMELLIA_RL8(dw);
631
SUBR(19) = SUBL(19) ^ dw, SUBL(19) = dw;
632
dw = SUBL(20) ^ SUBR(20), dw = CAMELLIA_RL8(dw);
633
SUBR(20) = SUBL(20) ^ dw, SUBL(20) = dw;
634
dw = SUBL(21) ^ SUBR(21), dw = CAMELLIA_RL8(dw);
635
SUBR(21) = SUBL(21) ^ dw, SUBL(21) = dw;
636
dw = SUBL(22) ^ SUBR(22), dw = CAMELLIA_RL8(dw);
637
SUBR(22) = SUBL(22) ^ dw, SUBL(22) = dw;
638
dw = SUBL(23) ^ SUBR(23), dw = CAMELLIA_RL8(dw);
639
SUBR(23) = SUBL(23) ^ dw, SUBL(23) = dw;
640
}
641
642
void
643
camellia_setup256(const unsigned char *key, uint32_t *subkey)
644
{
645
uint32_t kll,klr,krl,krr; /* left half of key */
646
uint32_t krll,krlr,krrl,krrr; /* right half of key */
647
uint32_t il, ir, t0, t1, w0, w1; /* temporary variables */
648
uint32_t kw4l, kw4r, dw, tl, tr;
649
uint32_t subL[34];
650
uint32_t subR[34];
651
652
/*
653
* key = (kll || klr || krl || krr || krll || krlr || krrl || krrr)
654
* (|| is concatination)
655
*/
656
657
kll = GETU32(key );
658
klr = GETU32(key + 4);
659
krl = GETU32(key + 8);
660
krr = GETU32(key + 12);
661
krll = GETU32(key + 16);
662
krlr = GETU32(key + 20);
663
krrl = GETU32(key + 24);
664
krrr = GETU32(key + 28);
665
666
/* generate KL dependent subkeys */
667
subl(0) = kll; subr(0) = klr;
668
subl(1) = krl; subr(1) = krr;
669
CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 45);
670
subl(12) = kll; subr(12) = klr;
671
subl(13) = krl; subr(13) = krr;
672
CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
673
subl(16) = kll; subr(16) = klr;
674
subl(17) = krl; subr(17) = krr;
675
CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17);
676
subl(22) = kll; subr(22) = klr;
677
subl(23) = krl; subr(23) = krr;
678
CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 34);
679
subl(30) = kll; subr(30) = klr;
680
subl(31) = krl; subr(31) = krr;
681
682
/* generate KR dependent subkeys */
683
CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
684
subl(4) = krll; subr(4) = krlr;
685
subl(5) = krrl; subr(5) = krrr;
686
CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15);
687
subl(8) = krll; subr(8) = krlr;
688
subl(9) = krrl; subr(9) = krrr;
689
CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
690
subl(18) = krll; subr(18) = krlr;
691
subl(19) = krrl; subr(19) = krrr;
692
CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
693
subl(26) = krll; subr(26) = krlr;
694
subl(27) = krrl; subr(27) = krrr;
695
CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34);
696
697
/* generate KA */
698
kll = subl(0) ^ krll; klr = subr(0) ^ krlr;
699
krl = subl(1) ^ krrl; krr = subr(1) ^ krrr;
700
CAMELLIA_F(kll, klr, CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R,
701
w0, w1, il, ir, t0, t1);
702
krl ^= w0; krr ^= w1;
703
CAMELLIA_F(krl, krr, CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R,
704
kll, klr, il, ir, t0, t1);
705
kll ^= krll; klr ^= krlr;
706
CAMELLIA_F(kll, klr, CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R,
707
krl, krr, il, ir, t0, t1);
708
krl ^= w0 ^ krrl; krr ^= w1 ^ krrr;
709
CAMELLIA_F(krl, krr, CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R,
710
w0, w1, il, ir, t0, t1);
711
kll ^= w0; klr ^= w1;
712
713
/* generate KB */
714
krll ^= kll; krlr ^= klr;
715
krrl ^= krl; krrr ^= krr;
716
CAMELLIA_F(krll, krlr, CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R,
717
w0, w1, il, ir, t0, t1);
718
krrl ^= w0; krrr ^= w1;
719
CAMELLIA_F(krrl, krrr, CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R,
720
w0, w1, il, ir, t0, t1);
721
krll ^= w0; krlr ^= w1;
722
723
/* generate KA dependent subkeys */
724
CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15);
725
subl(6) = kll; subr(6) = klr;
726
subl(7) = krl; subr(7) = krr;
727
CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 30);
728
subl(14) = kll; subr(14) = klr;
729
subl(15) = krl; subr(15) = krr;
730
subl(24) = klr; subr(24) = krl;
731
subl(25) = krr; subr(25) = kll;
732
CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 49);
733
subl(28) = kll; subr(28) = klr;
734
subl(29) = krl; subr(29) = krr;
735
736
/* generate KB dependent subkeys */
737
subl(2) = krll; subr(2) = krlr;
738
subl(3) = krrl; subr(3) = krrr;
739
CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
740
subl(10) = krll; subr(10) = krlr;
741
subl(11) = krrl; subr(11) = krrr;
742
CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30);
743
subl(20) = krll; subr(20) = krlr;
744
subl(21) = krrl; subr(21) = krrr;
745
CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 51);
746
subl(32) = krll; subr(32) = krlr;
747
subl(33) = krrl; subr(33) = krrr;
748
749
/* absorb kw2 to other subkeys */
750
subl(3) ^= subl(1); subr(3) ^= subr(1);
751
subl(5) ^= subl(1); subr(5) ^= subr(1);
752
subl(7) ^= subl(1); subr(7) ^= subr(1);
753
subl(1) ^= subr(1) & ~subr(9);
754
dw = subl(1) & subl(9), subr(1) ^= CAMELLIA_RL1(dw);
755
subl(11) ^= subl(1); subr(11) ^= subr(1);
756
subl(13) ^= subl(1); subr(13) ^= subr(1);
757
subl(15) ^= subl(1); subr(15) ^= subr(1);
758
subl(1) ^= subr(1) & ~subr(17);
759
dw = subl(1) & subl(17), subr(1) ^= CAMELLIA_RL1(dw);
760
subl(19) ^= subl(1); subr(19) ^= subr(1);
761
subl(21) ^= subl(1); subr(21) ^= subr(1);
762
subl(23) ^= subl(1); subr(23) ^= subr(1);
763
subl(1) ^= subr(1) & ~subr(25);
764
dw = subl(1) & subl(25), subr(1) ^= CAMELLIA_RL1(dw);
765
subl(27) ^= subl(1); subr(27) ^= subr(1);
766
subl(29) ^= subl(1); subr(29) ^= subr(1);
767
subl(31) ^= subl(1); subr(31) ^= subr(1);
768
subl(32) ^= subl(1); subr(32) ^= subr(1);
769
770
771
/* absorb kw4 to other subkeys */
772
kw4l = subl(33); kw4r = subr(33);
773
subl(30) ^= kw4l; subr(30) ^= kw4r;
774
subl(28) ^= kw4l; subr(28) ^= kw4r;
775
subl(26) ^= kw4l; subr(26) ^= kw4r;
776
kw4l ^= kw4r & ~subr(24);
777
dw = kw4l & subl(24), kw4r ^= CAMELLIA_RL1(dw);
778
subl(22) ^= kw4l; subr(22) ^= kw4r;
779
subl(20) ^= kw4l; subr(20) ^= kw4r;
780
subl(18) ^= kw4l; subr(18) ^= kw4r;
781
kw4l ^= kw4r & ~subr(16);
782
dw = kw4l & subl(16), kw4r ^= CAMELLIA_RL1(dw);
783
subl(14) ^= kw4l; subr(14) ^= kw4r;
784
subl(12) ^= kw4l; subr(12) ^= kw4r;
785
subl(10) ^= kw4l; subr(10) ^= kw4r;
786
kw4l ^= kw4r & ~subr(8);
787
dw = kw4l & subl(8), kw4r ^= CAMELLIA_RL1(dw);
788
subl(6) ^= kw4l; subr(6) ^= kw4r;
789
subl(4) ^= kw4l; subr(4) ^= kw4r;
790
subl(2) ^= kw4l; subr(2) ^= kw4r;
791
subl(0) ^= kw4l; subr(0) ^= kw4r;
792
793
/* key XOR is end of F-function */
794
SUBL(0) = subl(0) ^ subl(2);
795
SUBR(0) = subr(0) ^ subr(2);
796
SUBL(2) = subl(3);
797
SUBR(2) = subr(3);
798
SUBL(3) = subl(2) ^ subl(4);
799
SUBR(3) = subr(2) ^ subr(4);
800
SUBL(4) = subl(3) ^ subl(5);
801
SUBR(4) = subr(3) ^ subr(5);
802
SUBL(5) = subl(4) ^ subl(6);
803
SUBR(5) = subr(4) ^ subr(6);
804
SUBL(6) = subl(5) ^ subl(7);
805
SUBR(6) = subr(5) ^ subr(7);
806
tl = subl(10) ^ (subr(10) & ~subr(8));
807
dw = tl & subl(8), tr = subr(10) ^ CAMELLIA_RL1(dw);
808
SUBL(7) = subl(6) ^ tl;
809
SUBR(7) = subr(6) ^ tr;
810
SUBL(8) = subl(8);
811
SUBR(8) = subr(8);
812
SUBL(9) = subl(9);
813
SUBR(9) = subr(9);
814
tl = subl(7) ^ (subr(7) & ~subr(9));
815
dw = tl & subl(9), tr = subr(7) ^ CAMELLIA_RL1(dw);
816
SUBL(10) = tl ^ subl(11);
817
SUBR(10) = tr ^ subr(11);
818
SUBL(11) = subl(10) ^ subl(12);
819
SUBR(11) = subr(10) ^ subr(12);
820
SUBL(12) = subl(11) ^ subl(13);
821
SUBR(12) = subr(11) ^ subr(13);
822
SUBL(13) = subl(12) ^ subl(14);
823
SUBR(13) = subr(12) ^ subr(14);
824
SUBL(14) = subl(13) ^ subl(15);
825
SUBR(14) = subr(13) ^ subr(15);
826
tl = subl(18) ^ (subr(18) & ~subr(16));
827
dw = tl & subl(16), tr = subr(18) ^ CAMELLIA_RL1(dw);
828
SUBL(15) = subl(14) ^ tl;
829
SUBR(15) = subr(14) ^ tr;
830
SUBL(16) = subl(16);
831
SUBR(16) = subr(16);
832
SUBL(17) = subl(17);
833
SUBR(17) = subr(17);
834
tl = subl(15) ^ (subr(15) & ~subr(17));
835
dw = tl & subl(17), tr = subr(15) ^ CAMELLIA_RL1(dw);
836
SUBL(18) = tl ^ subl(19);
837
SUBR(18) = tr ^ subr(19);
838
SUBL(19) = subl(18) ^ subl(20);
839
SUBR(19) = subr(18) ^ subr(20);
840
SUBL(20) = subl(19) ^ subl(21);
841
SUBR(20) = subr(19) ^ subr(21);
842
SUBL(21) = subl(20) ^ subl(22);
843
SUBR(21) = subr(20) ^ subr(22);
844
SUBL(22) = subl(21) ^ subl(23);
845
SUBR(22) = subr(21) ^ subr(23);
846
tl = subl(26) ^ (subr(26) & ~subr(24));
847
dw = tl & subl(24), tr = subr(26) ^ CAMELLIA_RL1(dw);
848
SUBL(23) = subl(22) ^ tl;
849
SUBR(23) = subr(22) ^ tr;
850
SUBL(24) = subl(24);
851
SUBR(24) = subr(24);
852
SUBL(25) = subl(25);
853
SUBR(25) = subr(25);
854
tl = subl(23) ^ (subr(23) & ~subr(25));
855
dw = tl & subl(25), tr = subr(23) ^ CAMELLIA_RL1(dw);
856
SUBL(26) = tl ^ subl(27);
857
SUBR(26) = tr ^ subr(27);
858
SUBL(27) = subl(26) ^ subl(28);
859
SUBR(27) = subr(26) ^ subr(28);
860
SUBL(28) = subl(27) ^ subl(29);
861
SUBR(28) = subr(27) ^ subr(29);
862
SUBL(29) = subl(28) ^ subl(30);
863
SUBR(29) = subr(28) ^ subr(30);
864
SUBL(30) = subl(29) ^ subl(31);
865
SUBR(30) = subr(29) ^ subr(31);
866
SUBL(31) = subl(30);
867
SUBR(31) = subr(30);
868
SUBL(32) = subl(32) ^ subl(31);
869
SUBR(32) = subr(32) ^ subr(31);
870
871
/* apply the inverse of the last half of P-function */
872
dw = SUBL(2) ^ SUBR(2), dw = CAMELLIA_RL8(dw);
873
SUBR(2) = SUBL(2) ^ dw, SUBL(2) = dw;
874
dw = SUBL(3) ^ SUBR(3), dw = CAMELLIA_RL8(dw);
875
SUBR(3) = SUBL(3) ^ dw, SUBL(3) = dw;
876
dw = SUBL(4) ^ SUBR(4), dw = CAMELLIA_RL8(dw);
877
SUBR(4) = SUBL(4) ^ dw, SUBL(4) = dw;
878
dw = SUBL(5) ^ SUBR(5), dw = CAMELLIA_RL8(dw);
879
SUBR(5) = SUBL(5) ^ dw, SUBL(5) = dw;
880
dw = SUBL(6) ^ SUBR(6), dw = CAMELLIA_RL8(dw);
881
SUBR(6) = SUBL(6) ^ dw, SUBL(6) = dw;
882
dw = SUBL(7) ^ SUBR(7), dw = CAMELLIA_RL8(dw);
883
SUBR(7) = SUBL(7) ^ dw, SUBL(7) = dw;
884
dw = SUBL(10) ^ SUBR(10), dw = CAMELLIA_RL8(dw);
885
SUBR(10) = SUBL(10) ^ dw, SUBL(10) = dw;
886
dw = SUBL(11) ^ SUBR(11), dw = CAMELLIA_RL8(dw);
887
SUBR(11) = SUBL(11) ^ dw, SUBL(11) = dw;
888
dw = SUBL(12) ^ SUBR(12), dw = CAMELLIA_RL8(dw);
889
SUBR(12) = SUBL(12) ^ dw, SUBL(12) = dw;
890
dw = SUBL(13) ^ SUBR(13), dw = CAMELLIA_RL8(dw);
891
SUBR(13) = SUBL(13) ^ dw, SUBL(13) = dw;
892
dw = SUBL(14) ^ SUBR(14), dw = CAMELLIA_RL8(dw);
893
SUBR(14) = SUBL(14) ^ dw, SUBL(14) = dw;
894
dw = SUBL(15) ^ SUBR(15), dw = CAMELLIA_RL8(dw);
895
SUBR(15) = SUBL(15) ^ dw, SUBL(15) = dw;
896
dw = SUBL(18) ^ SUBR(18), dw = CAMELLIA_RL8(dw);
897
SUBR(18) = SUBL(18) ^ dw, SUBL(18) = dw;
898
dw = SUBL(19) ^ SUBR(19), dw = CAMELLIA_RL8(dw);
899
SUBR(19) = SUBL(19) ^ dw, SUBL(19) = dw;
900
dw = SUBL(20) ^ SUBR(20), dw = CAMELLIA_RL8(dw);
901
SUBR(20) = SUBL(20) ^ dw, SUBL(20) = dw;
902
dw = SUBL(21) ^ SUBR(21), dw = CAMELLIA_RL8(dw);
903
SUBR(21) = SUBL(21) ^ dw, SUBL(21) = dw;
904
dw = SUBL(22) ^ SUBR(22), dw = CAMELLIA_RL8(dw);
905
SUBR(22) = SUBL(22) ^ dw, SUBL(22) = dw;
906
dw = SUBL(23) ^ SUBR(23), dw = CAMELLIA_RL8(dw);
907
SUBR(23) = SUBL(23) ^ dw, SUBL(23) = dw;
908
dw = SUBL(26) ^ SUBR(26), dw = CAMELLIA_RL8(dw);
909
SUBR(26) = SUBL(26) ^ dw, SUBL(26) = dw;
910
dw = SUBL(27) ^ SUBR(27), dw = CAMELLIA_RL8(dw);
911
SUBR(27) = SUBL(27) ^ dw, SUBL(27) = dw;
912
dw = SUBL(28) ^ SUBR(28), dw = CAMELLIA_RL8(dw);
913
SUBR(28) = SUBL(28) ^ dw, SUBL(28) = dw;
914
dw = SUBL(29) ^ SUBR(29), dw = CAMELLIA_RL8(dw);
915
SUBR(29) = SUBL(29) ^ dw, SUBL(29) = dw;
916
dw = SUBL(30) ^ SUBR(30), dw = CAMELLIA_RL8(dw);
917
SUBR(30) = SUBL(30) ^ dw, SUBL(30) = dw;
918
dw = SUBL(31) ^ SUBR(31), dw = CAMELLIA_RL8(dw);
919
SUBR(31) = SUBL(31) ^ dw, SUBL(31) = dw;
920
}
921
922
void
923
camellia_setup192(const unsigned char *key, uint32_t *subkey)
924
{
925
unsigned char kk[32];
926
uint32_t krll, krlr, krrl,krrr;
927
928
memcpy(kk, key, 24);
929
memcpy((unsigned char *)&krll, key+16,4);
930
memcpy((unsigned char *)&krlr, key+20,4);
931
krrl = ~krll;
932
krrr = ~krlr;
933
memcpy(kk+24, (unsigned char *)&krrl, 4);
934
memcpy(kk+28, (unsigned char *)&krrr, 4);
935
camellia_setup256(kk, subkey);
936
}
937
938
939
/**
940
* Stuff related to camellia encryption/decryption
941
*/
942
void
943
camellia_encrypt128(const uint32_t *subkey, uint32_t *io)
944
{
945
uint32_t il, ir, t0, t1;
946
947
/* pre whitening but absorb kw2*/
948
io[0] ^= SUBL(0);
949
io[1] ^= SUBR(0);
950
/* main iteration */
951
952
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(2),SUBR(2),
953
io[2],io[3],il,ir,t0,t1);
954
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(3),SUBR(3),
955
io[0],io[1],il,ir,t0,t1);
956
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(4),SUBR(4),
957
io[2],io[3],il,ir,t0,t1);
958
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(5),SUBR(5),
959
io[0],io[1],il,ir,t0,t1);
960
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(6),SUBR(6),
961
io[2],io[3],il,ir,t0,t1);
962
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(7),SUBR(7),
963
io[0],io[1],il,ir,t0,t1);
964
965
CAMELLIA_FLS(io[0],io[1],io[2],io[3], SUBL(8),SUBR(8), SUBL(9),SUBR(9),
966
t0,t1,il,ir);
967
968
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(10),SUBR(10),
969
io[2],io[3],il,ir,t0,t1);
970
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(11),SUBR(11),
971
io[0],io[1],il,ir,t0,t1);
972
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(12),SUBR(12),
973
io[2],io[3],il,ir,t0,t1);
974
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(13),SUBR(13),
975
io[0],io[1],il,ir,t0,t1);
976
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(14),SUBR(14),
977
io[2],io[3],il,ir,t0,t1);
978
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(15),SUBR(15),
979
io[0],io[1],il,ir,t0,t1);
980
981
CAMELLIA_FLS(io[0],io[1],io[2],io[3], SUBL(16), SUBR(16), SUBL(17),SUBR(17),
982
t0,t1,il,ir);
983
984
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(18),SUBR(18),
985
io[2],io[3],il,ir,t0,t1);
986
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(19),SUBR(19),
987
io[0],io[1],il,ir,t0,t1);
988
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(20),SUBR(20),
989
io[2],io[3],il,ir,t0,t1);
990
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(21),SUBR(21),
991
io[0],io[1],il,ir,t0,t1);
992
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(22),SUBR(22),
993
io[2],io[3],il,ir,t0,t1);
994
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(23),SUBR(23),
995
io[0],io[1],il,ir,t0,t1);
996
997
/* post whitening but kw4 */
998
io[2] ^= SUBL(24);
999
io[3] ^= SUBR(24);
1000
1001
t0 = io[0];
1002
t1 = io[1];
1003
io[0] = io[2];
1004
io[1] = io[3];
1005
io[2] = t0;
1006
io[3] = t1;
1007
}
1008
1009
void
1010
camellia_decrypt128(const uint32_t *subkey, uint32_t *io)
1011
{
1012
uint32_t il,ir,t0,t1; /* temporary variables */
1013
1014
/* pre whitening but absorb kw2*/
1015
io[0] ^= SUBL(24);
1016
io[1] ^= SUBR(24);
1017
1018
/* main iteration */
1019
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(23),SUBR(23),
1020
io[2],io[3],il,ir,t0,t1);
1021
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(22),SUBR(22),
1022
io[0],io[1],il,ir,t0,t1);
1023
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(21),SUBR(21),
1024
io[2],io[3],il,ir,t0,t1);
1025
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(20),SUBR(20),
1026
io[0],io[1],il,ir,t0,t1);
1027
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(19),SUBR(19),
1028
io[2],io[3],il,ir,t0,t1);
1029
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(18),SUBR(18),
1030
io[0],io[1],il,ir,t0,t1);
1031
1032
CAMELLIA_FLS(io[0],io[1],io[2],io[3],SUBL(17),SUBR(17),SUBL(16),SUBR(16),
1033
t0,t1,il,ir);
1034
1035
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(15),SUBR(15),
1036
io[2],io[3],il,ir,t0,t1);
1037
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(14),SUBR(14),
1038
io[0],io[1],il,ir,t0,t1);
1039
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(13),SUBR(13),
1040
io[2],io[3],il,ir,t0,t1);
1041
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(12),SUBR(12),
1042
io[0],io[1],il,ir,t0,t1);
1043
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(11),SUBR(11),
1044
io[2],io[3],il,ir,t0,t1);
1045
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(10),SUBR(10),
1046
io[0],io[1],il,ir,t0,t1);
1047
1048
CAMELLIA_FLS(io[0],io[1],io[2],io[3], SUBL(9),SUBR(9), SUBL(8),SUBR(8),
1049
t0,t1,il,ir);
1050
1051
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(7),SUBR(7),
1052
io[2],io[3],il,ir,t0,t1);
1053
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(6),SUBR(6),
1054
io[0],io[1],il,ir,t0,t1);
1055
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(5),SUBR(5),
1056
io[2],io[3],il,ir,t0,t1);
1057
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(4),SUBR(4),
1058
io[0],io[1],il,ir,t0,t1);
1059
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(3),SUBR(3),
1060
io[2],io[3],il,ir,t0,t1);
1061
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(2),SUBR(2),
1062
io[0],io[1],il,ir,t0,t1);
1063
1064
/* post whitening but kw4 */
1065
io[2] ^= SUBL(0);
1066
io[3] ^= SUBR(0);
1067
1068
t0 = io[0];
1069
t1 = io[1];
1070
io[0] = io[2];
1071
io[1] = io[3];
1072
io[2] = t0;
1073
io[3] = t1;
1074
}
1075
1076
/**
1077
* stuff for 192 and 256bit encryption/decryption
1078
*/
1079
void
1080
camellia_encrypt256(const uint32_t *subkey, uint32_t *io)
1081
{
1082
uint32_t il,ir,t0,t1; /* temporary variables */
1083
1084
/* pre whitening but absorb kw2*/
1085
io[0] ^= SUBL(0);
1086
io[1] ^= SUBR(0);
1087
1088
/* main iteration */
1089
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(2),SUBR(2),
1090
io[2],io[3],il,ir,t0,t1);
1091
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(3),SUBR(3),
1092
io[0],io[1],il,ir,t0,t1);
1093
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(4),SUBR(4),
1094
io[2],io[3],il,ir,t0,t1);
1095
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(5),SUBR(5),
1096
io[0],io[1],il,ir,t0,t1);
1097
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(6),SUBR(6),
1098
io[2],io[3],il,ir,t0,t1);
1099
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(7),SUBR(7),
1100
io[0],io[1],il,ir,t0,t1);
1101
1102
CAMELLIA_FLS(io[0],io[1],io[2],io[3], SUBL(8),SUBR(8), SUBL(9),SUBR(9),
1103
t0,t1,il,ir);
1104
1105
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(10),SUBR(10),
1106
io[2],io[3],il,ir,t0,t1);
1107
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(11),SUBR(11),
1108
io[0],io[1],il,ir,t0,t1);
1109
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(12),SUBR(12),
1110
io[2],io[3],il,ir,t0,t1);
1111
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(13),SUBR(13),
1112
io[0],io[1],il,ir,t0,t1);
1113
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(14),SUBR(14),
1114
io[2],io[3],il,ir,t0,t1);
1115
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(15),SUBR(15),
1116
io[0],io[1],il,ir,t0,t1);
1117
1118
CAMELLIA_FLS(io[0],io[1],io[2],io[3], SUBL(16),SUBR(16), SUBL(17),SUBR(17),
1119
t0,t1,il,ir);
1120
1121
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(18),SUBR(18),
1122
io[2],io[3],il,ir,t0,t1);
1123
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(19),SUBR(19),
1124
io[0],io[1],il,ir,t0,t1);
1125
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(20),SUBR(20),
1126
io[2],io[3],il,ir,t0,t1);
1127
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(21),SUBR(21),
1128
io[0],io[1],il,ir,t0,t1);
1129
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(22),SUBR(22),
1130
io[2],io[3],il,ir,t0,t1);
1131
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(23),SUBR(23),
1132
io[0],io[1],il,ir,t0,t1);
1133
1134
CAMELLIA_FLS(io[0],io[1],io[2],io[3], SUBL(24),SUBR(24), SUBL(25),SUBR(25),
1135
t0,t1,il,ir);
1136
1137
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(26),SUBR(26),
1138
io[2],io[3],il,ir,t0,t1);
1139
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(27),SUBR(27),
1140
io[0],io[1],il,ir,t0,t1);
1141
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(28),SUBR(28),
1142
io[2],io[3],il,ir,t0,t1);
1143
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(29),SUBR(29),
1144
io[0],io[1],il,ir,t0,t1);
1145
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(30),SUBR(30),
1146
io[2],io[3],il,ir,t0,t1);
1147
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(31),SUBR(31),
1148
io[0],io[1],il,ir,t0,t1);
1149
1150
/* post whitening but kw4 */
1151
io[2] ^= SUBL(32);
1152
io[3] ^= SUBR(32);
1153
1154
t0 = io[0];
1155
t1 = io[1];
1156
io[0] = io[2];
1157
io[1] = io[3];
1158
io[2] = t0;
1159
io[3] = t1;
1160
}
1161
1162
void
1163
camellia_decrypt256(const uint32_t *subkey, uint32_t *io)
1164
{
1165
uint32_t il,ir,t0,t1; /* temporary variables */
1166
1167
/* pre whitening but absorb kw2*/
1168
io[0] ^= SUBL(32);
1169
io[1] ^= SUBR(32);
1170
1171
/* main iteration */
1172
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(31),SUBR(31),
1173
io[2],io[3],il,ir,t0,t1);
1174
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(30),SUBR(30),
1175
io[0],io[1],il,ir,t0,t1);
1176
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(29),SUBR(29),
1177
io[2],io[3],il,ir,t0,t1);
1178
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(28),SUBR(28),
1179
io[0],io[1],il,ir,t0,t1);
1180
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(27),SUBR(27),
1181
io[2],io[3],il,ir,t0,t1);
1182
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(26),SUBR(26),
1183
io[0],io[1],il,ir,t0,t1);
1184
1185
CAMELLIA_FLS(io[0],io[1],io[2],io[3], SUBL(25),SUBR(25), SUBL(24),SUBR(24),
1186
t0,t1,il,ir);
1187
1188
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(23),SUBR(23),
1189
io[2],io[3],il,ir,t0,t1);
1190
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(22),SUBR(22),
1191
io[0],io[1],il,ir,t0,t1);
1192
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(21),SUBR(21),
1193
io[2],io[3],il,ir,t0,t1);
1194
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(20),SUBR(20),
1195
io[0],io[1],il,ir,t0,t1);
1196
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(19),SUBR(19),
1197
io[2],io[3],il,ir,t0,t1);
1198
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(18),SUBR(18),
1199
io[0],io[1],il,ir,t0,t1);
1200
1201
CAMELLIA_FLS(io[0],io[1],io[2],io[3], SUBL(17),SUBR(17), SUBL(16),SUBR(16),
1202
t0,t1,il,ir);
1203
1204
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(15),SUBR(15),
1205
io[2],io[3],il,ir,t0,t1);
1206
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(14),SUBR(14),
1207
io[0],io[1],il,ir,t0,t1);
1208
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(13),SUBR(13),
1209
io[2],io[3],il,ir,t0,t1);
1210
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(12),SUBR(12),
1211
io[0],io[1],il,ir,t0,t1);
1212
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(11),SUBR(11),
1213
io[2],io[3],il,ir,t0,t1);
1214
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(10),SUBR(10),
1215
io[0],io[1],il,ir,t0,t1);
1216
1217
CAMELLIA_FLS(io[0],io[1],io[2],io[3], SUBL(9),SUBR(9), SUBL(8),SUBR(8),
1218
t0,t1,il,ir);
1219
1220
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(7),SUBR(7),
1221
io[2],io[3],il,ir,t0,t1);
1222
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(6),SUBR(6),
1223
io[0],io[1],il,ir,t0,t1);
1224
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(5),SUBR(5),
1225
io[2],io[3],il,ir,t0,t1);
1226
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(4),SUBR(4),
1227
io[0],io[1],il,ir,t0,t1);
1228
CAMELLIA_ROUNDSM(io[0],io[1], SUBL(3),SUBR(3),
1229
io[2],io[3],il,ir,t0,t1);
1230
CAMELLIA_ROUNDSM(io[2],io[3], SUBL(2),SUBR(2),
1231
io[0],io[1],il,ir,t0,t1);
1232
1233
/* post whitening but kw4 */
1234
io[2] ^= SUBL(0);
1235
io[3] ^= SUBR(0);
1236
1237
t0 = io[0];
1238
t1 = io[1];
1239
io[0] = io[2];
1240
io[1] = io[3];
1241
io[2] = t0;
1242
io[3] = t1;
1243
}
1244
1245
void
1246
Camellia_Ekeygen(const int keyBitLength,
1247
const unsigned char *rawKey,
1248
uint32_t *subkey)
1249
{
1250
KASSERT(keyBitLength == 128 || keyBitLength == 192 || keyBitLength == 256,
1251
("Invalid key size (%d).", keyBitLength));
1252
1253
switch(keyBitLength) {
1254
case 128:
1255
camellia_setup128(rawKey, subkey);
1256
break;
1257
case 192:
1258
camellia_setup192(rawKey, subkey);
1259
break;
1260
case 256:
1261
camellia_setup256(rawKey, subkey);
1262
break;
1263
default:
1264
break;
1265
}
1266
}
1267
void
1268
Camellia_EncryptBlock(const int keyBitLength,
1269
const unsigned char *plaintext,
1270
const uint32_t *subkey,
1271
unsigned char *ciphertext)
1272
{
1273
uint32_t tmp[4];
1274
1275
tmp[0] = GETU32(plaintext);
1276
tmp[1] = GETU32(plaintext + 4);
1277
tmp[2] = GETU32(plaintext + 8);
1278
tmp[3] = GETU32(plaintext + 12);
1279
1280
switch (keyBitLength) {
1281
case 128:
1282
camellia_encrypt128(subkey, tmp);
1283
break;
1284
case 192:
1285
/* fall through */
1286
case 256:
1287
camellia_encrypt256(subkey, tmp);
1288
break;
1289
default:
1290
break;
1291
}
1292
1293
PUTU32(ciphertext, tmp[0]);
1294
PUTU32(ciphertext+4, tmp[1]);
1295
PUTU32(ciphertext+8, tmp[2]);
1296
PUTU32(ciphertext+12, tmp[3]);
1297
}
1298
1299
void
1300
Camellia_DecryptBlock(const int keyBitLength,
1301
const unsigned char *ciphertext,
1302
const uint32_t *subkey,
1303
unsigned char *plaintext)
1304
{
1305
uint32_t tmp[4];
1306
1307
tmp[0] = GETU32(ciphertext);
1308
tmp[1] = GETU32(ciphertext + 4);
1309
tmp[2] = GETU32(ciphertext + 8);
1310
tmp[3] = GETU32(ciphertext + 12);
1311
1312
switch (keyBitLength) {
1313
case 128:
1314
camellia_decrypt128(subkey, tmp);
1315
break;
1316
case 192:
1317
/* fall through */
1318
case 256:
1319
camellia_decrypt256(subkey, tmp);
1320
break;
1321
default:
1322
break;
1323
}
1324
1325
PUTU32(plaintext, tmp[0]);
1326
PUTU32(plaintext+4, tmp[1]);
1327
PUTU32(plaintext+8, tmp[2]);
1328
PUTU32(plaintext+12, tmp[3]);
1329
}
1330
1331