Coverage Report

Created: 2025-11-19 06:34

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