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