Coverage Report

Created: 2024-11-21 07:03

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