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