Coverage Report

Created: 2025-07-23 06:59

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