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