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