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