]> git.karo-electronics.de Git - karo-tx-linux.git/blob - arch/x86/crypto/camellia_glue.c
Merge branch 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[karo-tx-linux.git] / arch / x86 / crypto / camellia_glue.c
1 /*
2  * Glue Code for assembler optimized version of Camellia
3  *
4  * Copyright (c) 2012 Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
5  *
6  * Camellia parts based on code by:
7  *  Copyright (C) 2006 NTT (Nippon Telegraph and Telephone Corporation)
8  * CBC & ECB parts based on code (crypto/cbc.c,ecb.c) by:
9  *   Copyright (c) 2006 Herbert Xu <herbert@gondor.apana.org.au>
10  * CTR part based on code (crypto/ctr.c) by:
11  *   (C) Copyright IBM Corp. 2007 - Joy Latten <latten@us.ibm.com>
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 2 of the License, or
16  * (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
26  * USA
27  *
28  */
29
30 #include <asm/processor.h>
31 #include <asm/unaligned.h>
32 #include <linux/crypto.h>
33 #include <linux/init.h>
34 #include <linux/module.h>
35 #include <linux/types.h>
36 #include <crypto/algapi.h>
37 #include <crypto/b128ops.h>
38 #include <crypto/lrw.h>
39 #include <crypto/xts.h>
40
41 #define CAMELLIA_MIN_KEY_SIZE   16
42 #define CAMELLIA_MAX_KEY_SIZE   32
43 #define CAMELLIA_BLOCK_SIZE     16
44 #define CAMELLIA_TABLE_BYTE_LEN 272
45
46 struct camellia_ctx {
47         u64 key_table[CAMELLIA_TABLE_BYTE_LEN / sizeof(u64)];
48         u32 key_length;
49 };
50
51 /* regular block cipher functions */
52 asmlinkage void __camellia_enc_blk(struct camellia_ctx *ctx, u8 *dst,
53                                    const u8 *src, bool xor);
54 asmlinkage void camellia_dec_blk(struct camellia_ctx *ctx, u8 *dst,
55                                  const u8 *src);
56
57 /* 2-way parallel cipher functions */
58 asmlinkage void __camellia_enc_blk_2way(struct camellia_ctx *ctx, u8 *dst,
59                                         const u8 *src, bool xor);
60 asmlinkage void camellia_dec_blk_2way(struct camellia_ctx *ctx, u8 *dst,
61                                       const u8 *src);
62
63 static inline void camellia_enc_blk(struct camellia_ctx *ctx, u8 *dst,
64                                     const u8 *src)
65 {
66         __camellia_enc_blk(ctx, dst, src, false);
67 }
68
69 static inline void camellia_enc_blk_xor(struct camellia_ctx *ctx, u8 *dst,
70                                         const u8 *src)
71 {
72         __camellia_enc_blk(ctx, dst, src, true);
73 }
74
75 static inline void camellia_enc_blk_2way(struct camellia_ctx *ctx, u8 *dst,
76                                          const u8 *src)
77 {
78         __camellia_enc_blk_2way(ctx, dst, src, false);
79 }
80
81 static inline void camellia_enc_blk_xor_2way(struct camellia_ctx *ctx, u8 *dst,
82                                              const u8 *src)
83 {
84         __camellia_enc_blk_2way(ctx, dst, src, true);
85 }
86
87 static void camellia_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
88 {
89         camellia_enc_blk(crypto_tfm_ctx(tfm), dst, src);
90 }
91
92 static void camellia_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
93 {
94         camellia_dec_blk(crypto_tfm_ctx(tfm), dst, src);
95 }
96
97 /* camellia sboxes */
98 const u64 camellia_sp10011110[256] = {
99         0x7000007070707000, 0x8200008282828200, 0x2c00002c2c2c2c00,
100         0xec0000ecececec00, 0xb30000b3b3b3b300, 0x2700002727272700,
101         0xc00000c0c0c0c000, 0xe50000e5e5e5e500, 0xe40000e4e4e4e400,
102         0x8500008585858500, 0x5700005757575700, 0x3500003535353500,
103         0xea0000eaeaeaea00, 0x0c00000c0c0c0c00, 0xae0000aeaeaeae00,
104         0x4100004141414100, 0x2300002323232300, 0xef0000efefefef00,
105         0x6b00006b6b6b6b00, 0x9300009393939300, 0x4500004545454500,
106         0x1900001919191900, 0xa50000a5a5a5a500, 0x2100002121212100,
107         0xed0000edededed00, 0x0e00000e0e0e0e00, 0x4f00004f4f4f4f00,
108         0x4e00004e4e4e4e00, 0x1d00001d1d1d1d00, 0x6500006565656500,
109         0x9200009292929200, 0xbd0000bdbdbdbd00, 0x8600008686868600,
110         0xb80000b8b8b8b800, 0xaf0000afafafaf00, 0x8f00008f8f8f8f00,
111         0x7c00007c7c7c7c00, 0xeb0000ebebebeb00, 0x1f00001f1f1f1f00,
112         0xce0000cececece00, 0x3e00003e3e3e3e00, 0x3000003030303000,
113         0xdc0000dcdcdcdc00, 0x5f00005f5f5f5f00, 0x5e00005e5e5e5e00,
114         0xc50000c5c5c5c500, 0x0b00000b0b0b0b00, 0x1a00001a1a1a1a00,
115         0xa60000a6a6a6a600, 0xe10000e1e1e1e100, 0x3900003939393900,
116         0xca0000cacacaca00, 0xd50000d5d5d5d500, 0x4700004747474700,
117         0x5d00005d5d5d5d00, 0x3d00003d3d3d3d00, 0xd90000d9d9d9d900,
118         0x0100000101010100, 0x5a00005a5a5a5a00, 0xd60000d6d6d6d600,
119         0x5100005151515100, 0x5600005656565600, 0x6c00006c6c6c6c00,
120         0x4d00004d4d4d4d00, 0x8b00008b8b8b8b00, 0x0d00000d0d0d0d00,
121         0x9a00009a9a9a9a00, 0x6600006666666600, 0xfb0000fbfbfbfb00,
122         0xcc0000cccccccc00, 0xb00000b0b0b0b000, 0x2d00002d2d2d2d00,
123         0x7400007474747400, 0x1200001212121200, 0x2b00002b2b2b2b00,
124         0x2000002020202000, 0xf00000f0f0f0f000, 0xb10000b1b1b1b100,
125         0x8400008484848400, 0x9900009999999900, 0xdf0000dfdfdfdf00,
126         0x4c00004c4c4c4c00, 0xcb0000cbcbcbcb00, 0xc20000c2c2c2c200,
127         0x3400003434343400, 0x7e00007e7e7e7e00, 0x7600007676767600,
128         0x0500000505050500, 0x6d00006d6d6d6d00, 0xb70000b7b7b7b700,
129         0xa90000a9a9a9a900, 0x3100003131313100, 0xd10000d1d1d1d100,
130         0x1700001717171700, 0x0400000404040400, 0xd70000d7d7d7d700,
131         0x1400001414141400, 0x5800005858585800, 0x3a00003a3a3a3a00,
132         0x6100006161616100, 0xde0000dededede00, 0x1b00001b1b1b1b00,
133         0x1100001111111100, 0x1c00001c1c1c1c00, 0x3200003232323200,
134         0x0f00000f0f0f0f00, 0x9c00009c9c9c9c00, 0x1600001616161600,
135         0x5300005353535300, 0x1800001818181800, 0xf20000f2f2f2f200,
136         0x2200002222222200, 0xfe0000fefefefe00, 0x4400004444444400,
137         0xcf0000cfcfcfcf00, 0xb20000b2b2b2b200, 0xc30000c3c3c3c300,
138         0xb50000b5b5b5b500, 0x7a00007a7a7a7a00, 0x9100009191919100,
139         0x2400002424242400, 0x0800000808080800, 0xe80000e8e8e8e800,
140         0xa80000a8a8a8a800, 0x6000006060606000, 0xfc0000fcfcfcfc00,
141         0x6900006969696900, 0x5000005050505000, 0xaa0000aaaaaaaa00,
142         0xd00000d0d0d0d000, 0xa00000a0a0a0a000, 0x7d00007d7d7d7d00,
143         0xa10000a1a1a1a100, 0x8900008989898900, 0x6200006262626200,
144         0x9700009797979700, 0x5400005454545400, 0x5b00005b5b5b5b00,
145         0x1e00001e1e1e1e00, 0x9500009595959500, 0xe00000e0e0e0e000,
146         0xff0000ffffffff00, 0x6400006464646400, 0xd20000d2d2d2d200,
147         0x1000001010101000, 0xc40000c4c4c4c400, 0x0000000000000000,
148         0x4800004848484800, 0xa30000a3a3a3a300, 0xf70000f7f7f7f700,
149         0x7500007575757500, 0xdb0000dbdbdbdb00, 0x8a00008a8a8a8a00,
150         0x0300000303030300, 0xe60000e6e6e6e600, 0xda0000dadadada00,
151         0x0900000909090900, 0x3f00003f3f3f3f00, 0xdd0000dddddddd00,
152         0x9400009494949400, 0x8700008787878700, 0x5c00005c5c5c5c00,
153         0x8300008383838300, 0x0200000202020200, 0xcd0000cdcdcdcd00,
154         0x4a00004a4a4a4a00, 0x9000009090909000, 0x3300003333333300,
155         0x7300007373737300, 0x6700006767676700, 0xf60000f6f6f6f600,
156         0xf30000f3f3f3f300, 0x9d00009d9d9d9d00, 0x7f00007f7f7f7f00,
157         0xbf0000bfbfbfbf00, 0xe20000e2e2e2e200, 0x5200005252525200,
158         0x9b00009b9b9b9b00, 0xd80000d8d8d8d800, 0x2600002626262600,
159         0xc80000c8c8c8c800, 0x3700003737373700, 0xc60000c6c6c6c600,
160         0x3b00003b3b3b3b00, 0x8100008181818100, 0x9600009696969600,
161         0x6f00006f6f6f6f00, 0x4b00004b4b4b4b00, 0x1300001313131300,
162         0xbe0000bebebebe00, 0x6300006363636300, 0x2e00002e2e2e2e00,
163         0xe90000e9e9e9e900, 0x7900007979797900, 0xa70000a7a7a7a700,
164         0x8c00008c8c8c8c00, 0x9f00009f9f9f9f00, 0x6e00006e6e6e6e00,
165         0xbc0000bcbcbcbc00, 0x8e00008e8e8e8e00, 0x2900002929292900,
166         0xf50000f5f5f5f500, 0xf90000f9f9f9f900, 0xb60000b6b6b6b600,
167         0x2f00002f2f2f2f00, 0xfd0000fdfdfdfd00, 0xb40000b4b4b4b400,
168         0x5900005959595900, 0x7800007878787800, 0x9800009898989800,
169         0x0600000606060600, 0x6a00006a6a6a6a00, 0xe70000e7e7e7e700,
170         0x4600004646464600, 0x7100007171717100, 0xba0000babababa00,
171         0xd40000d4d4d4d400, 0x2500002525252500, 0xab0000abababab00,
172         0x4200004242424200, 0x8800008888888800, 0xa20000a2a2a2a200,
173         0x8d00008d8d8d8d00, 0xfa0000fafafafa00, 0x7200007272727200,
174         0x0700000707070700, 0xb90000b9b9b9b900, 0x5500005555555500,
175         0xf80000f8f8f8f800, 0xee0000eeeeeeee00, 0xac0000acacacac00,
176         0x0a00000a0a0a0a00, 0x3600003636363600, 0x4900004949494900,
177         0x2a00002a2a2a2a00, 0x6800006868686800, 0x3c00003c3c3c3c00,
178         0x3800003838383800, 0xf10000f1f1f1f100, 0xa40000a4a4a4a400,
179         0x4000004040404000, 0x2800002828282800, 0xd30000d3d3d3d300,
180         0x7b00007b7b7b7b00, 0xbb0000bbbbbbbb00, 0xc90000c9c9c9c900,
181         0x4300004343434300, 0xc10000c1c1c1c100, 0x1500001515151500,
182         0xe30000e3e3e3e300, 0xad0000adadadad00, 0xf40000f4f4f4f400,
183         0x7700007777777700, 0xc70000c7c7c7c700, 0x8000008080808000,
184         0x9e00009e9e9e9e00,
185 };
186
187 const u64 camellia_sp22000222[256] = {
188         0xe0e0000000e0e0e0, 0x0505000000050505, 0x5858000000585858,
189         0xd9d9000000d9d9d9, 0x6767000000676767, 0x4e4e0000004e4e4e,
190         0x8181000000818181, 0xcbcb000000cbcbcb, 0xc9c9000000c9c9c9,
191         0x0b0b0000000b0b0b, 0xaeae000000aeaeae, 0x6a6a0000006a6a6a,
192         0xd5d5000000d5d5d5, 0x1818000000181818, 0x5d5d0000005d5d5d,
193         0x8282000000828282, 0x4646000000464646, 0xdfdf000000dfdfdf,
194         0xd6d6000000d6d6d6, 0x2727000000272727, 0x8a8a0000008a8a8a,
195         0x3232000000323232, 0x4b4b0000004b4b4b, 0x4242000000424242,
196         0xdbdb000000dbdbdb, 0x1c1c0000001c1c1c, 0x9e9e0000009e9e9e,
197         0x9c9c0000009c9c9c, 0x3a3a0000003a3a3a, 0xcaca000000cacaca,
198         0x2525000000252525, 0x7b7b0000007b7b7b, 0x0d0d0000000d0d0d,
199         0x7171000000717171, 0x5f5f0000005f5f5f, 0x1f1f0000001f1f1f,
200         0xf8f8000000f8f8f8, 0xd7d7000000d7d7d7, 0x3e3e0000003e3e3e,
201         0x9d9d0000009d9d9d, 0x7c7c0000007c7c7c, 0x6060000000606060,
202         0xb9b9000000b9b9b9, 0xbebe000000bebebe, 0xbcbc000000bcbcbc,
203         0x8b8b0000008b8b8b, 0x1616000000161616, 0x3434000000343434,
204         0x4d4d0000004d4d4d, 0xc3c3000000c3c3c3, 0x7272000000727272,
205         0x9595000000959595, 0xabab000000ababab, 0x8e8e0000008e8e8e,
206         0xbaba000000bababa, 0x7a7a0000007a7a7a, 0xb3b3000000b3b3b3,
207         0x0202000000020202, 0xb4b4000000b4b4b4, 0xadad000000adadad,
208         0xa2a2000000a2a2a2, 0xacac000000acacac, 0xd8d8000000d8d8d8,
209         0x9a9a0000009a9a9a, 0x1717000000171717, 0x1a1a0000001a1a1a,
210         0x3535000000353535, 0xcccc000000cccccc, 0xf7f7000000f7f7f7,
211         0x9999000000999999, 0x6161000000616161, 0x5a5a0000005a5a5a,
212         0xe8e8000000e8e8e8, 0x2424000000242424, 0x5656000000565656,
213         0x4040000000404040, 0xe1e1000000e1e1e1, 0x6363000000636363,
214         0x0909000000090909, 0x3333000000333333, 0xbfbf000000bfbfbf,
215         0x9898000000989898, 0x9797000000979797, 0x8585000000858585,
216         0x6868000000686868, 0xfcfc000000fcfcfc, 0xecec000000ececec,
217         0x0a0a0000000a0a0a, 0xdada000000dadada, 0x6f6f0000006f6f6f,
218         0x5353000000535353, 0x6262000000626262, 0xa3a3000000a3a3a3,
219         0x2e2e0000002e2e2e, 0x0808000000080808, 0xafaf000000afafaf,
220         0x2828000000282828, 0xb0b0000000b0b0b0, 0x7474000000747474,
221         0xc2c2000000c2c2c2, 0xbdbd000000bdbdbd, 0x3636000000363636,
222         0x2222000000222222, 0x3838000000383838, 0x6464000000646464,
223         0x1e1e0000001e1e1e, 0x3939000000393939, 0x2c2c0000002c2c2c,
224         0xa6a6000000a6a6a6, 0x3030000000303030, 0xe5e5000000e5e5e5,
225         0x4444000000444444, 0xfdfd000000fdfdfd, 0x8888000000888888,
226         0x9f9f0000009f9f9f, 0x6565000000656565, 0x8787000000878787,
227         0x6b6b0000006b6b6b, 0xf4f4000000f4f4f4, 0x2323000000232323,
228         0x4848000000484848, 0x1010000000101010, 0xd1d1000000d1d1d1,
229         0x5151000000515151, 0xc0c0000000c0c0c0, 0xf9f9000000f9f9f9,
230         0xd2d2000000d2d2d2, 0xa0a0000000a0a0a0, 0x5555000000555555,
231         0xa1a1000000a1a1a1, 0x4141000000414141, 0xfafa000000fafafa,
232         0x4343000000434343, 0x1313000000131313, 0xc4c4000000c4c4c4,
233         0x2f2f0000002f2f2f, 0xa8a8000000a8a8a8, 0xb6b6000000b6b6b6,
234         0x3c3c0000003c3c3c, 0x2b2b0000002b2b2b, 0xc1c1000000c1c1c1,
235         0xffff000000ffffff, 0xc8c8000000c8c8c8, 0xa5a5000000a5a5a5,
236         0x2020000000202020, 0x8989000000898989, 0x0000000000000000,
237         0x9090000000909090, 0x4747000000474747, 0xefef000000efefef,
238         0xeaea000000eaeaea, 0xb7b7000000b7b7b7, 0x1515000000151515,
239         0x0606000000060606, 0xcdcd000000cdcdcd, 0xb5b5000000b5b5b5,
240         0x1212000000121212, 0x7e7e0000007e7e7e, 0xbbbb000000bbbbbb,
241         0x2929000000292929, 0x0f0f0000000f0f0f, 0xb8b8000000b8b8b8,
242         0x0707000000070707, 0x0404000000040404, 0x9b9b0000009b9b9b,
243         0x9494000000949494, 0x2121000000212121, 0x6666000000666666,
244         0xe6e6000000e6e6e6, 0xcece000000cecece, 0xeded000000ededed,
245         0xe7e7000000e7e7e7, 0x3b3b0000003b3b3b, 0xfefe000000fefefe,
246         0x7f7f0000007f7f7f, 0xc5c5000000c5c5c5, 0xa4a4000000a4a4a4,
247         0x3737000000373737, 0xb1b1000000b1b1b1, 0x4c4c0000004c4c4c,
248         0x9191000000919191, 0x6e6e0000006e6e6e, 0x8d8d0000008d8d8d,
249         0x7676000000767676, 0x0303000000030303, 0x2d2d0000002d2d2d,
250         0xdede000000dedede, 0x9696000000969696, 0x2626000000262626,
251         0x7d7d0000007d7d7d, 0xc6c6000000c6c6c6, 0x5c5c0000005c5c5c,
252         0xd3d3000000d3d3d3, 0xf2f2000000f2f2f2, 0x4f4f0000004f4f4f,
253         0x1919000000191919, 0x3f3f0000003f3f3f, 0xdcdc000000dcdcdc,
254         0x7979000000797979, 0x1d1d0000001d1d1d, 0x5252000000525252,
255         0xebeb000000ebebeb, 0xf3f3000000f3f3f3, 0x6d6d0000006d6d6d,
256         0x5e5e0000005e5e5e, 0xfbfb000000fbfbfb, 0x6969000000696969,
257         0xb2b2000000b2b2b2, 0xf0f0000000f0f0f0, 0x3131000000313131,
258         0x0c0c0000000c0c0c, 0xd4d4000000d4d4d4, 0xcfcf000000cfcfcf,
259         0x8c8c0000008c8c8c, 0xe2e2000000e2e2e2, 0x7575000000757575,
260         0xa9a9000000a9a9a9, 0x4a4a0000004a4a4a, 0x5757000000575757,
261         0x8484000000848484, 0x1111000000111111, 0x4545000000454545,
262         0x1b1b0000001b1b1b, 0xf5f5000000f5f5f5, 0xe4e4000000e4e4e4,
263         0x0e0e0000000e0e0e, 0x7373000000737373, 0xaaaa000000aaaaaa,
264         0xf1f1000000f1f1f1, 0xdddd000000dddddd, 0x5959000000595959,
265         0x1414000000141414, 0x6c6c0000006c6c6c, 0x9292000000929292,
266         0x5454000000545454, 0xd0d0000000d0d0d0, 0x7878000000787878,
267         0x7070000000707070, 0xe3e3000000e3e3e3, 0x4949000000494949,
268         0x8080000000808080, 0x5050000000505050, 0xa7a7000000a7a7a7,
269         0xf6f6000000f6f6f6, 0x7777000000777777, 0x9393000000939393,
270         0x8686000000868686, 0x8383000000838383, 0x2a2a0000002a2a2a,
271         0xc7c7000000c7c7c7, 0x5b5b0000005b5b5b, 0xe9e9000000e9e9e9,
272         0xeeee000000eeeeee, 0x8f8f0000008f8f8f, 0x0101000000010101,
273         0x3d3d0000003d3d3d,
274 };
275
276 const u64 camellia_sp03303033[256] = {
277         0x0038380038003838, 0x0041410041004141, 0x0016160016001616,
278         0x0076760076007676, 0x00d9d900d900d9d9, 0x0093930093009393,
279         0x0060600060006060, 0x00f2f200f200f2f2, 0x0072720072007272,
280         0x00c2c200c200c2c2, 0x00abab00ab00abab, 0x009a9a009a009a9a,
281         0x0075750075007575, 0x0006060006000606, 0x0057570057005757,
282         0x00a0a000a000a0a0, 0x0091910091009191, 0x00f7f700f700f7f7,
283         0x00b5b500b500b5b5, 0x00c9c900c900c9c9, 0x00a2a200a200a2a2,
284         0x008c8c008c008c8c, 0x00d2d200d200d2d2, 0x0090900090009090,
285         0x00f6f600f600f6f6, 0x0007070007000707, 0x00a7a700a700a7a7,
286         0x0027270027002727, 0x008e8e008e008e8e, 0x00b2b200b200b2b2,
287         0x0049490049004949, 0x00dede00de00dede, 0x0043430043004343,
288         0x005c5c005c005c5c, 0x00d7d700d700d7d7, 0x00c7c700c700c7c7,
289         0x003e3e003e003e3e, 0x00f5f500f500f5f5, 0x008f8f008f008f8f,
290         0x0067670067006767, 0x001f1f001f001f1f, 0x0018180018001818,
291         0x006e6e006e006e6e, 0x00afaf00af00afaf, 0x002f2f002f002f2f,
292         0x00e2e200e200e2e2, 0x0085850085008585, 0x000d0d000d000d0d,
293         0x0053530053005353, 0x00f0f000f000f0f0, 0x009c9c009c009c9c,
294         0x0065650065006565, 0x00eaea00ea00eaea, 0x00a3a300a300a3a3,
295         0x00aeae00ae00aeae, 0x009e9e009e009e9e, 0x00ecec00ec00ecec,
296         0x0080800080008080, 0x002d2d002d002d2d, 0x006b6b006b006b6b,
297         0x00a8a800a800a8a8, 0x002b2b002b002b2b, 0x0036360036003636,
298         0x00a6a600a600a6a6, 0x00c5c500c500c5c5, 0x0086860086008686,
299         0x004d4d004d004d4d, 0x0033330033003333, 0x00fdfd00fd00fdfd,
300         0x0066660066006666, 0x0058580058005858, 0x0096960096009696,
301         0x003a3a003a003a3a, 0x0009090009000909, 0x0095950095009595,
302         0x0010100010001010, 0x0078780078007878, 0x00d8d800d800d8d8,
303         0x0042420042004242, 0x00cccc00cc00cccc, 0x00efef00ef00efef,
304         0x0026260026002626, 0x00e5e500e500e5e5, 0x0061610061006161,
305         0x001a1a001a001a1a, 0x003f3f003f003f3f, 0x003b3b003b003b3b,
306         0x0082820082008282, 0x00b6b600b600b6b6, 0x00dbdb00db00dbdb,
307         0x00d4d400d400d4d4, 0x0098980098009898, 0x00e8e800e800e8e8,
308         0x008b8b008b008b8b, 0x0002020002000202, 0x00ebeb00eb00ebeb,
309         0x000a0a000a000a0a, 0x002c2c002c002c2c, 0x001d1d001d001d1d,
310         0x00b0b000b000b0b0, 0x006f6f006f006f6f, 0x008d8d008d008d8d,
311         0x0088880088008888, 0x000e0e000e000e0e, 0x0019190019001919,
312         0x0087870087008787, 0x004e4e004e004e4e, 0x000b0b000b000b0b,
313         0x00a9a900a900a9a9, 0x000c0c000c000c0c, 0x0079790079007979,
314         0x0011110011001111, 0x007f7f007f007f7f, 0x0022220022002222,
315         0x00e7e700e700e7e7, 0x0059590059005959, 0x00e1e100e100e1e1,
316         0x00dada00da00dada, 0x003d3d003d003d3d, 0x00c8c800c800c8c8,
317         0x0012120012001212, 0x0004040004000404, 0x0074740074007474,
318         0x0054540054005454, 0x0030300030003030, 0x007e7e007e007e7e,
319         0x00b4b400b400b4b4, 0x0028280028002828, 0x0055550055005555,
320         0x0068680068006868, 0x0050500050005050, 0x00bebe00be00bebe,
321         0x00d0d000d000d0d0, 0x00c4c400c400c4c4, 0x0031310031003131,
322         0x00cbcb00cb00cbcb, 0x002a2a002a002a2a, 0x00adad00ad00adad,
323         0x000f0f000f000f0f, 0x00caca00ca00caca, 0x0070700070007070,
324         0x00ffff00ff00ffff, 0x0032320032003232, 0x0069690069006969,
325         0x0008080008000808, 0x0062620062006262, 0x0000000000000000,
326         0x0024240024002424, 0x00d1d100d100d1d1, 0x00fbfb00fb00fbfb,
327         0x00baba00ba00baba, 0x00eded00ed00eded, 0x0045450045004545,
328         0x0081810081008181, 0x0073730073007373, 0x006d6d006d006d6d,
329         0x0084840084008484, 0x009f9f009f009f9f, 0x00eeee00ee00eeee,
330         0x004a4a004a004a4a, 0x00c3c300c300c3c3, 0x002e2e002e002e2e,
331         0x00c1c100c100c1c1, 0x0001010001000101, 0x00e6e600e600e6e6,
332         0x0025250025002525, 0x0048480048004848, 0x0099990099009999,
333         0x00b9b900b900b9b9, 0x00b3b300b300b3b3, 0x007b7b007b007b7b,
334         0x00f9f900f900f9f9, 0x00cece00ce00cece, 0x00bfbf00bf00bfbf,
335         0x00dfdf00df00dfdf, 0x0071710071007171, 0x0029290029002929,
336         0x00cdcd00cd00cdcd, 0x006c6c006c006c6c, 0x0013130013001313,
337         0x0064640064006464, 0x009b9b009b009b9b, 0x0063630063006363,
338         0x009d9d009d009d9d, 0x00c0c000c000c0c0, 0x004b4b004b004b4b,
339         0x00b7b700b700b7b7, 0x00a5a500a500a5a5, 0x0089890089008989,
340         0x005f5f005f005f5f, 0x00b1b100b100b1b1, 0x0017170017001717,
341         0x00f4f400f400f4f4, 0x00bcbc00bc00bcbc, 0x00d3d300d300d3d3,
342         0x0046460046004646, 0x00cfcf00cf00cfcf, 0x0037370037003737,
343         0x005e5e005e005e5e, 0x0047470047004747, 0x0094940094009494,
344         0x00fafa00fa00fafa, 0x00fcfc00fc00fcfc, 0x005b5b005b005b5b,
345         0x0097970097009797, 0x00fefe00fe00fefe, 0x005a5a005a005a5a,
346         0x00acac00ac00acac, 0x003c3c003c003c3c, 0x004c4c004c004c4c,
347         0x0003030003000303, 0x0035350035003535, 0x00f3f300f300f3f3,
348         0x0023230023002323, 0x00b8b800b800b8b8, 0x005d5d005d005d5d,
349         0x006a6a006a006a6a, 0x0092920092009292, 0x00d5d500d500d5d5,
350         0x0021210021002121, 0x0044440044004444, 0x0051510051005151,
351         0x00c6c600c600c6c6, 0x007d7d007d007d7d, 0x0039390039003939,
352         0x0083830083008383, 0x00dcdc00dc00dcdc, 0x00aaaa00aa00aaaa,
353         0x007c7c007c007c7c, 0x0077770077007777, 0x0056560056005656,
354         0x0005050005000505, 0x001b1b001b001b1b, 0x00a4a400a400a4a4,
355         0x0015150015001515, 0x0034340034003434, 0x001e1e001e001e1e,
356         0x001c1c001c001c1c, 0x00f8f800f800f8f8, 0x0052520052005252,
357         0x0020200020002020, 0x0014140014001414, 0x00e9e900e900e9e9,
358         0x00bdbd00bd00bdbd, 0x00dddd00dd00dddd, 0x00e4e400e400e4e4,
359         0x00a1a100a100a1a1, 0x00e0e000e000e0e0, 0x008a8a008a008a8a,
360         0x00f1f100f100f1f1, 0x00d6d600d600d6d6, 0x007a7a007a007a7a,
361         0x00bbbb00bb00bbbb, 0x00e3e300e300e3e3, 0x0040400040004040,
362         0x004f4f004f004f4f,
363 };
364
365 const u64 camellia_sp00444404[256] = {
366         0x0000707070700070, 0x00002c2c2c2c002c, 0x0000b3b3b3b300b3,
367         0x0000c0c0c0c000c0, 0x0000e4e4e4e400e4, 0x0000575757570057,
368         0x0000eaeaeaea00ea, 0x0000aeaeaeae00ae, 0x0000232323230023,
369         0x00006b6b6b6b006b, 0x0000454545450045, 0x0000a5a5a5a500a5,
370         0x0000edededed00ed, 0x00004f4f4f4f004f, 0x00001d1d1d1d001d,
371         0x0000929292920092, 0x0000868686860086, 0x0000afafafaf00af,
372         0x00007c7c7c7c007c, 0x00001f1f1f1f001f, 0x00003e3e3e3e003e,
373         0x0000dcdcdcdc00dc, 0x00005e5e5e5e005e, 0x00000b0b0b0b000b,
374         0x0000a6a6a6a600a6, 0x0000393939390039, 0x0000d5d5d5d500d5,
375         0x00005d5d5d5d005d, 0x0000d9d9d9d900d9, 0x00005a5a5a5a005a,
376         0x0000515151510051, 0x00006c6c6c6c006c, 0x00008b8b8b8b008b,
377         0x00009a9a9a9a009a, 0x0000fbfbfbfb00fb, 0x0000b0b0b0b000b0,
378         0x0000747474740074, 0x00002b2b2b2b002b, 0x0000f0f0f0f000f0,
379         0x0000848484840084, 0x0000dfdfdfdf00df, 0x0000cbcbcbcb00cb,
380         0x0000343434340034, 0x0000767676760076, 0x00006d6d6d6d006d,
381         0x0000a9a9a9a900a9, 0x0000d1d1d1d100d1, 0x0000040404040004,
382         0x0000141414140014, 0x00003a3a3a3a003a, 0x0000dededede00de,
383         0x0000111111110011, 0x0000323232320032, 0x00009c9c9c9c009c,
384         0x0000535353530053, 0x0000f2f2f2f200f2, 0x0000fefefefe00fe,
385         0x0000cfcfcfcf00cf, 0x0000c3c3c3c300c3, 0x00007a7a7a7a007a,
386         0x0000242424240024, 0x0000e8e8e8e800e8, 0x0000606060600060,
387         0x0000696969690069, 0x0000aaaaaaaa00aa, 0x0000a0a0a0a000a0,
388         0x0000a1a1a1a100a1, 0x0000626262620062, 0x0000545454540054,
389         0x00001e1e1e1e001e, 0x0000e0e0e0e000e0, 0x0000646464640064,
390         0x0000101010100010, 0x0000000000000000, 0x0000a3a3a3a300a3,
391         0x0000757575750075, 0x00008a8a8a8a008a, 0x0000e6e6e6e600e6,
392         0x0000090909090009, 0x0000dddddddd00dd, 0x0000878787870087,
393         0x0000838383830083, 0x0000cdcdcdcd00cd, 0x0000909090900090,
394         0x0000737373730073, 0x0000f6f6f6f600f6, 0x00009d9d9d9d009d,
395         0x0000bfbfbfbf00bf, 0x0000525252520052, 0x0000d8d8d8d800d8,
396         0x0000c8c8c8c800c8, 0x0000c6c6c6c600c6, 0x0000818181810081,
397         0x00006f6f6f6f006f, 0x0000131313130013, 0x0000636363630063,
398         0x0000e9e9e9e900e9, 0x0000a7a7a7a700a7, 0x00009f9f9f9f009f,
399         0x0000bcbcbcbc00bc, 0x0000292929290029, 0x0000f9f9f9f900f9,
400         0x00002f2f2f2f002f, 0x0000b4b4b4b400b4, 0x0000787878780078,
401         0x0000060606060006, 0x0000e7e7e7e700e7, 0x0000717171710071,
402         0x0000d4d4d4d400d4, 0x0000abababab00ab, 0x0000888888880088,
403         0x00008d8d8d8d008d, 0x0000727272720072, 0x0000b9b9b9b900b9,
404         0x0000f8f8f8f800f8, 0x0000acacacac00ac, 0x0000363636360036,
405         0x00002a2a2a2a002a, 0x00003c3c3c3c003c, 0x0000f1f1f1f100f1,
406         0x0000404040400040, 0x0000d3d3d3d300d3, 0x0000bbbbbbbb00bb,
407         0x0000434343430043, 0x0000151515150015, 0x0000adadadad00ad,
408         0x0000777777770077, 0x0000808080800080, 0x0000828282820082,
409         0x0000ecececec00ec, 0x0000272727270027, 0x0000e5e5e5e500e5,
410         0x0000858585850085, 0x0000353535350035, 0x00000c0c0c0c000c,
411         0x0000414141410041, 0x0000efefefef00ef, 0x0000939393930093,
412         0x0000191919190019, 0x0000212121210021, 0x00000e0e0e0e000e,
413         0x00004e4e4e4e004e, 0x0000656565650065, 0x0000bdbdbdbd00bd,
414         0x0000b8b8b8b800b8, 0x00008f8f8f8f008f, 0x0000ebebebeb00eb,
415         0x0000cececece00ce, 0x0000303030300030, 0x00005f5f5f5f005f,
416         0x0000c5c5c5c500c5, 0x00001a1a1a1a001a, 0x0000e1e1e1e100e1,
417         0x0000cacacaca00ca, 0x0000474747470047, 0x00003d3d3d3d003d,
418         0x0000010101010001, 0x0000d6d6d6d600d6, 0x0000565656560056,
419         0x00004d4d4d4d004d, 0x00000d0d0d0d000d, 0x0000666666660066,
420         0x0000cccccccc00cc, 0x00002d2d2d2d002d, 0x0000121212120012,
421         0x0000202020200020, 0x0000b1b1b1b100b1, 0x0000999999990099,
422         0x00004c4c4c4c004c, 0x0000c2c2c2c200c2, 0x00007e7e7e7e007e,
423         0x0000050505050005, 0x0000b7b7b7b700b7, 0x0000313131310031,
424         0x0000171717170017, 0x0000d7d7d7d700d7, 0x0000585858580058,
425         0x0000616161610061, 0x00001b1b1b1b001b, 0x00001c1c1c1c001c,
426         0x00000f0f0f0f000f, 0x0000161616160016, 0x0000181818180018,
427         0x0000222222220022, 0x0000444444440044, 0x0000b2b2b2b200b2,
428         0x0000b5b5b5b500b5, 0x0000919191910091, 0x0000080808080008,
429         0x0000a8a8a8a800a8, 0x0000fcfcfcfc00fc, 0x0000505050500050,
430         0x0000d0d0d0d000d0, 0x00007d7d7d7d007d, 0x0000898989890089,
431         0x0000979797970097, 0x00005b5b5b5b005b, 0x0000959595950095,
432         0x0000ffffffff00ff, 0x0000d2d2d2d200d2, 0x0000c4c4c4c400c4,
433         0x0000484848480048, 0x0000f7f7f7f700f7, 0x0000dbdbdbdb00db,
434         0x0000030303030003, 0x0000dadadada00da, 0x00003f3f3f3f003f,
435         0x0000949494940094, 0x00005c5c5c5c005c, 0x0000020202020002,
436         0x00004a4a4a4a004a, 0x0000333333330033, 0x0000676767670067,
437         0x0000f3f3f3f300f3, 0x00007f7f7f7f007f, 0x0000e2e2e2e200e2,
438         0x00009b9b9b9b009b, 0x0000262626260026, 0x0000373737370037,
439         0x00003b3b3b3b003b, 0x0000969696960096, 0x00004b4b4b4b004b,
440         0x0000bebebebe00be, 0x00002e2e2e2e002e, 0x0000797979790079,
441         0x00008c8c8c8c008c, 0x00006e6e6e6e006e, 0x00008e8e8e8e008e,
442         0x0000f5f5f5f500f5, 0x0000b6b6b6b600b6, 0x0000fdfdfdfd00fd,
443         0x0000595959590059, 0x0000989898980098, 0x00006a6a6a6a006a,
444         0x0000464646460046, 0x0000babababa00ba, 0x0000252525250025,
445         0x0000424242420042, 0x0000a2a2a2a200a2, 0x0000fafafafa00fa,
446         0x0000070707070007, 0x0000555555550055, 0x0000eeeeeeee00ee,
447         0x00000a0a0a0a000a, 0x0000494949490049, 0x0000686868680068,
448         0x0000383838380038, 0x0000a4a4a4a400a4, 0x0000282828280028,
449         0x00007b7b7b7b007b, 0x0000c9c9c9c900c9, 0x0000c1c1c1c100c1,
450         0x0000e3e3e3e300e3, 0x0000f4f4f4f400f4, 0x0000c7c7c7c700c7,
451         0x00009e9e9e9e009e,
452 };
453
454 const u64 camellia_sp02220222[256] = {
455         0x00e0e0e000e0e0e0, 0x0005050500050505, 0x0058585800585858,
456         0x00d9d9d900d9d9d9, 0x0067676700676767, 0x004e4e4e004e4e4e,
457         0x0081818100818181, 0x00cbcbcb00cbcbcb, 0x00c9c9c900c9c9c9,
458         0x000b0b0b000b0b0b, 0x00aeaeae00aeaeae, 0x006a6a6a006a6a6a,
459         0x00d5d5d500d5d5d5, 0x0018181800181818, 0x005d5d5d005d5d5d,
460         0x0082828200828282, 0x0046464600464646, 0x00dfdfdf00dfdfdf,
461         0x00d6d6d600d6d6d6, 0x0027272700272727, 0x008a8a8a008a8a8a,
462         0x0032323200323232, 0x004b4b4b004b4b4b, 0x0042424200424242,
463         0x00dbdbdb00dbdbdb, 0x001c1c1c001c1c1c, 0x009e9e9e009e9e9e,
464         0x009c9c9c009c9c9c, 0x003a3a3a003a3a3a, 0x00cacaca00cacaca,
465         0x0025252500252525, 0x007b7b7b007b7b7b, 0x000d0d0d000d0d0d,
466         0x0071717100717171, 0x005f5f5f005f5f5f, 0x001f1f1f001f1f1f,
467         0x00f8f8f800f8f8f8, 0x00d7d7d700d7d7d7, 0x003e3e3e003e3e3e,
468         0x009d9d9d009d9d9d, 0x007c7c7c007c7c7c, 0x0060606000606060,
469         0x00b9b9b900b9b9b9, 0x00bebebe00bebebe, 0x00bcbcbc00bcbcbc,
470         0x008b8b8b008b8b8b, 0x0016161600161616, 0x0034343400343434,
471         0x004d4d4d004d4d4d, 0x00c3c3c300c3c3c3, 0x0072727200727272,
472         0x0095959500959595, 0x00ababab00ababab, 0x008e8e8e008e8e8e,
473         0x00bababa00bababa, 0x007a7a7a007a7a7a, 0x00b3b3b300b3b3b3,
474         0x0002020200020202, 0x00b4b4b400b4b4b4, 0x00adadad00adadad,
475         0x00a2a2a200a2a2a2, 0x00acacac00acacac, 0x00d8d8d800d8d8d8,
476         0x009a9a9a009a9a9a, 0x0017171700171717, 0x001a1a1a001a1a1a,
477         0x0035353500353535, 0x00cccccc00cccccc, 0x00f7f7f700f7f7f7,
478         0x0099999900999999, 0x0061616100616161, 0x005a5a5a005a5a5a,
479         0x00e8e8e800e8e8e8, 0x0024242400242424, 0x0056565600565656,
480         0x0040404000404040, 0x00e1e1e100e1e1e1, 0x0063636300636363,
481         0x0009090900090909, 0x0033333300333333, 0x00bfbfbf00bfbfbf,
482         0x0098989800989898, 0x0097979700979797, 0x0085858500858585,
483         0x0068686800686868, 0x00fcfcfc00fcfcfc, 0x00ececec00ececec,
484         0x000a0a0a000a0a0a, 0x00dadada00dadada, 0x006f6f6f006f6f6f,
485         0x0053535300535353, 0x0062626200626262, 0x00a3a3a300a3a3a3,
486         0x002e2e2e002e2e2e, 0x0008080800080808, 0x00afafaf00afafaf,
487         0x0028282800282828, 0x00b0b0b000b0b0b0, 0x0074747400747474,
488         0x00c2c2c200c2c2c2, 0x00bdbdbd00bdbdbd, 0x0036363600363636,
489         0x0022222200222222, 0x0038383800383838, 0x0064646400646464,
490         0x001e1e1e001e1e1e, 0x0039393900393939, 0x002c2c2c002c2c2c,
491         0x00a6a6a600a6a6a6, 0x0030303000303030, 0x00e5e5e500e5e5e5,
492         0x0044444400444444, 0x00fdfdfd00fdfdfd, 0x0088888800888888,
493         0x009f9f9f009f9f9f, 0x0065656500656565, 0x0087878700878787,
494         0x006b6b6b006b6b6b, 0x00f4f4f400f4f4f4, 0x0023232300232323,
495         0x0048484800484848, 0x0010101000101010, 0x00d1d1d100d1d1d1,
496         0x0051515100515151, 0x00c0c0c000c0c0c0, 0x00f9f9f900f9f9f9,
497         0x00d2d2d200d2d2d2, 0x00a0a0a000a0a0a0, 0x0055555500555555,
498         0x00a1a1a100a1a1a1, 0x0041414100414141, 0x00fafafa00fafafa,
499         0x0043434300434343, 0x0013131300131313, 0x00c4c4c400c4c4c4,
500         0x002f2f2f002f2f2f, 0x00a8a8a800a8a8a8, 0x00b6b6b600b6b6b6,
501         0x003c3c3c003c3c3c, 0x002b2b2b002b2b2b, 0x00c1c1c100c1c1c1,
502         0x00ffffff00ffffff, 0x00c8c8c800c8c8c8, 0x00a5a5a500a5a5a5,
503         0x0020202000202020, 0x0089898900898989, 0x0000000000000000,
504         0x0090909000909090, 0x0047474700474747, 0x00efefef00efefef,
505         0x00eaeaea00eaeaea, 0x00b7b7b700b7b7b7, 0x0015151500151515,
506         0x0006060600060606, 0x00cdcdcd00cdcdcd, 0x00b5b5b500b5b5b5,
507         0x0012121200121212, 0x007e7e7e007e7e7e, 0x00bbbbbb00bbbbbb,
508         0x0029292900292929, 0x000f0f0f000f0f0f, 0x00b8b8b800b8b8b8,
509         0x0007070700070707, 0x0004040400040404, 0x009b9b9b009b9b9b,
510         0x0094949400949494, 0x0021212100212121, 0x0066666600666666,
511         0x00e6e6e600e6e6e6, 0x00cecece00cecece, 0x00ededed00ededed,
512         0x00e7e7e700e7e7e7, 0x003b3b3b003b3b3b, 0x00fefefe00fefefe,
513         0x007f7f7f007f7f7f, 0x00c5c5c500c5c5c5, 0x00a4a4a400a4a4a4,
514         0x0037373700373737, 0x00b1b1b100b1b1b1, 0x004c4c4c004c4c4c,
515         0x0091919100919191, 0x006e6e6e006e6e6e, 0x008d8d8d008d8d8d,
516         0x0076767600767676, 0x0003030300030303, 0x002d2d2d002d2d2d,
517         0x00dedede00dedede, 0x0096969600969696, 0x0026262600262626,
518         0x007d7d7d007d7d7d, 0x00c6c6c600c6c6c6, 0x005c5c5c005c5c5c,
519         0x00d3d3d300d3d3d3, 0x00f2f2f200f2f2f2, 0x004f4f4f004f4f4f,
520         0x0019191900191919, 0x003f3f3f003f3f3f, 0x00dcdcdc00dcdcdc,
521         0x0079797900797979, 0x001d1d1d001d1d1d, 0x0052525200525252,
522         0x00ebebeb00ebebeb, 0x00f3f3f300f3f3f3, 0x006d6d6d006d6d6d,
523         0x005e5e5e005e5e5e, 0x00fbfbfb00fbfbfb, 0x0069696900696969,
524         0x00b2b2b200b2b2b2, 0x00f0f0f000f0f0f0, 0x0031313100313131,
525         0x000c0c0c000c0c0c, 0x00d4d4d400d4d4d4, 0x00cfcfcf00cfcfcf,
526         0x008c8c8c008c8c8c, 0x00e2e2e200e2e2e2, 0x0075757500757575,
527         0x00a9a9a900a9a9a9, 0x004a4a4a004a4a4a, 0x0057575700575757,
528         0x0084848400848484, 0x0011111100111111, 0x0045454500454545,
529         0x001b1b1b001b1b1b, 0x00f5f5f500f5f5f5, 0x00e4e4e400e4e4e4,
530         0x000e0e0e000e0e0e, 0x0073737300737373, 0x00aaaaaa00aaaaaa,
531         0x00f1f1f100f1f1f1, 0x00dddddd00dddddd, 0x0059595900595959,
532         0x0014141400141414, 0x006c6c6c006c6c6c, 0x0092929200929292,
533         0x0054545400545454, 0x00d0d0d000d0d0d0, 0x0078787800787878,
534         0x0070707000707070, 0x00e3e3e300e3e3e3, 0x0049494900494949,
535         0x0080808000808080, 0x0050505000505050, 0x00a7a7a700a7a7a7,
536         0x00f6f6f600f6f6f6, 0x0077777700777777, 0x0093939300939393,
537         0x0086868600868686, 0x0083838300838383, 0x002a2a2a002a2a2a,
538         0x00c7c7c700c7c7c7, 0x005b5b5b005b5b5b, 0x00e9e9e900e9e9e9,
539         0x00eeeeee00eeeeee, 0x008f8f8f008f8f8f, 0x0001010100010101,
540         0x003d3d3d003d3d3d,
541 };
542
543 const u64 camellia_sp30333033[256] = {
544         0x3800383838003838, 0x4100414141004141, 0x1600161616001616,
545         0x7600767676007676, 0xd900d9d9d900d9d9, 0x9300939393009393,
546         0x6000606060006060, 0xf200f2f2f200f2f2, 0x7200727272007272,
547         0xc200c2c2c200c2c2, 0xab00ababab00abab, 0x9a009a9a9a009a9a,
548         0x7500757575007575, 0x0600060606000606, 0x5700575757005757,
549         0xa000a0a0a000a0a0, 0x9100919191009191, 0xf700f7f7f700f7f7,
550         0xb500b5b5b500b5b5, 0xc900c9c9c900c9c9, 0xa200a2a2a200a2a2,
551         0x8c008c8c8c008c8c, 0xd200d2d2d200d2d2, 0x9000909090009090,
552         0xf600f6f6f600f6f6, 0x0700070707000707, 0xa700a7a7a700a7a7,
553         0x2700272727002727, 0x8e008e8e8e008e8e, 0xb200b2b2b200b2b2,
554         0x4900494949004949, 0xde00dedede00dede, 0x4300434343004343,
555         0x5c005c5c5c005c5c, 0xd700d7d7d700d7d7, 0xc700c7c7c700c7c7,
556         0x3e003e3e3e003e3e, 0xf500f5f5f500f5f5, 0x8f008f8f8f008f8f,
557         0x6700676767006767, 0x1f001f1f1f001f1f, 0x1800181818001818,
558         0x6e006e6e6e006e6e, 0xaf00afafaf00afaf, 0x2f002f2f2f002f2f,
559         0xe200e2e2e200e2e2, 0x8500858585008585, 0x0d000d0d0d000d0d,
560         0x5300535353005353, 0xf000f0f0f000f0f0, 0x9c009c9c9c009c9c,
561         0x6500656565006565, 0xea00eaeaea00eaea, 0xa300a3a3a300a3a3,
562         0xae00aeaeae00aeae, 0x9e009e9e9e009e9e, 0xec00ececec00ecec,
563         0x8000808080008080, 0x2d002d2d2d002d2d, 0x6b006b6b6b006b6b,
564         0xa800a8a8a800a8a8, 0x2b002b2b2b002b2b, 0x3600363636003636,
565         0xa600a6a6a600a6a6, 0xc500c5c5c500c5c5, 0x8600868686008686,
566         0x4d004d4d4d004d4d, 0x3300333333003333, 0xfd00fdfdfd00fdfd,
567         0x6600666666006666, 0x5800585858005858, 0x9600969696009696,
568         0x3a003a3a3a003a3a, 0x0900090909000909, 0x9500959595009595,
569         0x1000101010001010, 0x7800787878007878, 0xd800d8d8d800d8d8,
570         0x4200424242004242, 0xcc00cccccc00cccc, 0xef00efefef00efef,
571         0x2600262626002626, 0xe500e5e5e500e5e5, 0x6100616161006161,
572         0x1a001a1a1a001a1a, 0x3f003f3f3f003f3f, 0x3b003b3b3b003b3b,
573         0x8200828282008282, 0xb600b6b6b600b6b6, 0xdb00dbdbdb00dbdb,
574         0xd400d4d4d400d4d4, 0x9800989898009898, 0xe800e8e8e800e8e8,
575         0x8b008b8b8b008b8b, 0x0200020202000202, 0xeb00ebebeb00ebeb,
576         0x0a000a0a0a000a0a, 0x2c002c2c2c002c2c, 0x1d001d1d1d001d1d,
577         0xb000b0b0b000b0b0, 0x6f006f6f6f006f6f, 0x8d008d8d8d008d8d,
578         0x8800888888008888, 0x0e000e0e0e000e0e, 0x1900191919001919,
579         0x8700878787008787, 0x4e004e4e4e004e4e, 0x0b000b0b0b000b0b,
580         0xa900a9a9a900a9a9, 0x0c000c0c0c000c0c, 0x7900797979007979,
581         0x1100111111001111, 0x7f007f7f7f007f7f, 0x2200222222002222,
582         0xe700e7e7e700e7e7, 0x5900595959005959, 0xe100e1e1e100e1e1,
583         0xda00dadada00dada, 0x3d003d3d3d003d3d, 0xc800c8c8c800c8c8,
584         0x1200121212001212, 0x0400040404000404, 0x7400747474007474,
585         0x5400545454005454, 0x3000303030003030, 0x7e007e7e7e007e7e,
586         0xb400b4b4b400b4b4, 0x2800282828002828, 0x5500555555005555,
587         0x6800686868006868, 0x5000505050005050, 0xbe00bebebe00bebe,
588         0xd000d0d0d000d0d0, 0xc400c4c4c400c4c4, 0x3100313131003131,
589         0xcb00cbcbcb00cbcb, 0x2a002a2a2a002a2a, 0xad00adadad00adad,
590         0x0f000f0f0f000f0f, 0xca00cacaca00caca, 0x7000707070007070,
591         0xff00ffffff00ffff, 0x3200323232003232, 0x6900696969006969,
592         0x0800080808000808, 0x6200626262006262, 0x0000000000000000,
593         0x2400242424002424, 0xd100d1d1d100d1d1, 0xfb00fbfbfb00fbfb,
594         0xba00bababa00baba, 0xed00ededed00eded, 0x4500454545004545,
595         0x8100818181008181, 0x7300737373007373, 0x6d006d6d6d006d6d,
596         0x8400848484008484, 0x9f009f9f9f009f9f, 0xee00eeeeee00eeee,
597         0x4a004a4a4a004a4a, 0xc300c3c3c300c3c3, 0x2e002e2e2e002e2e,
598         0xc100c1c1c100c1c1, 0x0100010101000101, 0xe600e6e6e600e6e6,
599         0x2500252525002525, 0x4800484848004848, 0x9900999999009999,
600         0xb900b9b9b900b9b9, 0xb300b3b3b300b3b3, 0x7b007b7b7b007b7b,
601         0xf900f9f9f900f9f9, 0xce00cecece00cece, 0xbf00bfbfbf00bfbf,
602         0xdf00dfdfdf00dfdf, 0x7100717171007171, 0x2900292929002929,
603         0xcd00cdcdcd00cdcd, 0x6c006c6c6c006c6c, 0x1300131313001313,
604         0x6400646464006464, 0x9b009b9b9b009b9b, 0x6300636363006363,
605         0x9d009d9d9d009d9d, 0xc000c0c0c000c0c0, 0x4b004b4b4b004b4b,
606         0xb700b7b7b700b7b7, 0xa500a5a5a500a5a5, 0x8900898989008989,
607         0x5f005f5f5f005f5f, 0xb100b1b1b100b1b1, 0x1700171717001717,
608         0xf400f4f4f400f4f4, 0xbc00bcbcbc00bcbc, 0xd300d3d3d300d3d3,
609         0x4600464646004646, 0xcf00cfcfcf00cfcf, 0x3700373737003737,
610         0x5e005e5e5e005e5e, 0x4700474747004747, 0x9400949494009494,
611         0xfa00fafafa00fafa, 0xfc00fcfcfc00fcfc, 0x5b005b5b5b005b5b,
612         0x9700979797009797, 0xfe00fefefe00fefe, 0x5a005a5a5a005a5a,
613         0xac00acacac00acac, 0x3c003c3c3c003c3c, 0x4c004c4c4c004c4c,
614         0x0300030303000303, 0x3500353535003535, 0xf300f3f3f300f3f3,
615         0x2300232323002323, 0xb800b8b8b800b8b8, 0x5d005d5d5d005d5d,
616         0x6a006a6a6a006a6a, 0x9200929292009292, 0xd500d5d5d500d5d5,
617         0x2100212121002121, 0x4400444444004444, 0x5100515151005151,
618         0xc600c6c6c600c6c6, 0x7d007d7d7d007d7d, 0x3900393939003939,
619         0x8300838383008383, 0xdc00dcdcdc00dcdc, 0xaa00aaaaaa00aaaa,
620         0x7c007c7c7c007c7c, 0x7700777777007777, 0x5600565656005656,
621         0x0500050505000505, 0x1b001b1b1b001b1b, 0xa400a4a4a400a4a4,
622         0x1500151515001515, 0x3400343434003434, 0x1e001e1e1e001e1e,
623         0x1c001c1c1c001c1c, 0xf800f8f8f800f8f8, 0x5200525252005252,
624         0x2000202020002020, 0x1400141414001414, 0xe900e9e9e900e9e9,
625         0xbd00bdbdbd00bdbd, 0xdd00dddddd00dddd, 0xe400e4e4e400e4e4,
626         0xa100a1a1a100a1a1, 0xe000e0e0e000e0e0, 0x8a008a8a8a008a8a,
627         0xf100f1f1f100f1f1, 0xd600d6d6d600d6d6, 0x7a007a7a7a007a7a,
628         0xbb00bbbbbb00bbbb, 0xe300e3e3e300e3e3, 0x4000404040004040,
629         0x4f004f4f4f004f4f,
630 };
631
632 const u64 camellia_sp44044404[256] = {
633         0x7070007070700070, 0x2c2c002c2c2c002c, 0xb3b300b3b3b300b3,
634         0xc0c000c0c0c000c0, 0xe4e400e4e4e400e4, 0x5757005757570057,
635         0xeaea00eaeaea00ea, 0xaeae00aeaeae00ae, 0x2323002323230023,
636         0x6b6b006b6b6b006b, 0x4545004545450045, 0xa5a500a5a5a500a5,
637         0xeded00ededed00ed, 0x4f4f004f4f4f004f, 0x1d1d001d1d1d001d,
638         0x9292009292920092, 0x8686008686860086, 0xafaf00afafaf00af,
639         0x7c7c007c7c7c007c, 0x1f1f001f1f1f001f, 0x3e3e003e3e3e003e,
640         0xdcdc00dcdcdc00dc, 0x5e5e005e5e5e005e, 0x0b0b000b0b0b000b,
641         0xa6a600a6a6a600a6, 0x3939003939390039, 0xd5d500d5d5d500d5,
642         0x5d5d005d5d5d005d, 0xd9d900d9d9d900d9, 0x5a5a005a5a5a005a,
643         0x5151005151510051, 0x6c6c006c6c6c006c, 0x8b8b008b8b8b008b,
644         0x9a9a009a9a9a009a, 0xfbfb00fbfbfb00fb, 0xb0b000b0b0b000b0,
645         0x7474007474740074, 0x2b2b002b2b2b002b, 0xf0f000f0f0f000f0,
646         0x8484008484840084, 0xdfdf00dfdfdf00df, 0xcbcb00cbcbcb00cb,
647         0x3434003434340034, 0x7676007676760076, 0x6d6d006d6d6d006d,
648         0xa9a900a9a9a900a9, 0xd1d100d1d1d100d1, 0x0404000404040004,
649         0x1414001414140014, 0x3a3a003a3a3a003a, 0xdede00dedede00de,
650         0x1111001111110011, 0x3232003232320032, 0x9c9c009c9c9c009c,
651         0x5353005353530053, 0xf2f200f2f2f200f2, 0xfefe00fefefe00fe,
652         0xcfcf00cfcfcf00cf, 0xc3c300c3c3c300c3, 0x7a7a007a7a7a007a,
653         0x2424002424240024, 0xe8e800e8e8e800e8, 0x6060006060600060,
654         0x6969006969690069, 0xaaaa00aaaaaa00aa, 0xa0a000a0a0a000a0,
655         0xa1a100a1a1a100a1, 0x6262006262620062, 0x5454005454540054,
656         0x1e1e001e1e1e001e, 0xe0e000e0e0e000e0, 0x6464006464640064,
657         0x1010001010100010, 0x0000000000000000, 0xa3a300a3a3a300a3,
658         0x7575007575750075, 0x8a8a008a8a8a008a, 0xe6e600e6e6e600e6,
659         0x0909000909090009, 0xdddd00dddddd00dd, 0x8787008787870087,
660         0x8383008383830083, 0xcdcd00cdcdcd00cd, 0x9090009090900090,
661         0x7373007373730073, 0xf6f600f6f6f600f6, 0x9d9d009d9d9d009d,
662         0xbfbf00bfbfbf00bf, 0x5252005252520052, 0xd8d800d8d8d800d8,
663         0xc8c800c8c8c800c8, 0xc6c600c6c6c600c6, 0x8181008181810081,
664         0x6f6f006f6f6f006f, 0x1313001313130013, 0x6363006363630063,
665         0xe9e900e9e9e900e9, 0xa7a700a7a7a700a7, 0x9f9f009f9f9f009f,
666         0xbcbc00bcbcbc00bc, 0x2929002929290029, 0xf9f900f9f9f900f9,
667         0x2f2f002f2f2f002f, 0xb4b400b4b4b400b4, 0x7878007878780078,
668         0x0606000606060006, 0xe7e700e7e7e700e7, 0x7171007171710071,
669         0xd4d400d4d4d400d4, 0xabab00ababab00ab, 0x8888008888880088,
670         0x8d8d008d8d8d008d, 0x7272007272720072, 0xb9b900b9b9b900b9,
671         0xf8f800f8f8f800f8, 0xacac00acacac00ac, 0x3636003636360036,
672         0x2a2a002a2a2a002a, 0x3c3c003c3c3c003c, 0xf1f100f1f1f100f1,
673         0x4040004040400040, 0xd3d300d3d3d300d3, 0xbbbb00bbbbbb00bb,
674         0x4343004343430043, 0x1515001515150015, 0xadad00adadad00ad,
675         0x7777007777770077, 0x8080008080800080, 0x8282008282820082,
676         0xecec00ececec00ec, 0x2727002727270027, 0xe5e500e5e5e500e5,
677         0x8585008585850085, 0x3535003535350035, 0x0c0c000c0c0c000c,
678         0x4141004141410041, 0xefef00efefef00ef, 0x9393009393930093,
679         0x1919001919190019, 0x2121002121210021, 0x0e0e000e0e0e000e,
680         0x4e4e004e4e4e004e, 0x6565006565650065, 0xbdbd00bdbdbd00bd,
681         0xb8b800b8b8b800b8, 0x8f8f008f8f8f008f, 0xebeb00ebebeb00eb,
682         0xcece00cecece00ce, 0x3030003030300030, 0x5f5f005f5f5f005f,
683         0xc5c500c5c5c500c5, 0x1a1a001a1a1a001a, 0xe1e100e1e1e100e1,
684         0xcaca00cacaca00ca, 0x4747004747470047, 0x3d3d003d3d3d003d,
685         0x0101000101010001, 0xd6d600d6d6d600d6, 0x5656005656560056,
686         0x4d4d004d4d4d004d, 0x0d0d000d0d0d000d, 0x6666006666660066,
687         0xcccc00cccccc00cc, 0x2d2d002d2d2d002d, 0x1212001212120012,
688         0x2020002020200020, 0xb1b100b1b1b100b1, 0x9999009999990099,
689         0x4c4c004c4c4c004c, 0xc2c200c2c2c200c2, 0x7e7e007e7e7e007e,
690         0x0505000505050005, 0xb7b700b7b7b700b7, 0x3131003131310031,
691         0x1717001717170017, 0xd7d700d7d7d700d7, 0x5858005858580058,
692         0x6161006161610061, 0x1b1b001b1b1b001b, 0x1c1c001c1c1c001c,
693         0x0f0f000f0f0f000f, 0x1616001616160016, 0x1818001818180018,
694         0x2222002222220022, 0x4444004444440044, 0xb2b200b2b2b200b2,
695         0xb5b500b5b5b500b5, 0x9191009191910091, 0x0808000808080008,
696         0xa8a800a8a8a800a8, 0xfcfc00fcfcfc00fc, 0x5050005050500050,
697         0xd0d000d0d0d000d0, 0x7d7d007d7d7d007d, 0x8989008989890089,
698         0x9797009797970097, 0x5b5b005b5b5b005b, 0x9595009595950095,
699         0xffff00ffffff00ff, 0xd2d200d2d2d200d2, 0xc4c400c4c4c400c4,
700         0x4848004848480048, 0xf7f700f7f7f700f7, 0xdbdb00dbdbdb00db,
701         0x0303000303030003, 0xdada00dadada00da, 0x3f3f003f3f3f003f,
702         0x9494009494940094, 0x5c5c005c5c5c005c, 0x0202000202020002,
703         0x4a4a004a4a4a004a, 0x3333003333330033, 0x6767006767670067,
704         0xf3f300f3f3f300f3, 0x7f7f007f7f7f007f, 0xe2e200e2e2e200e2,
705         0x9b9b009b9b9b009b, 0x2626002626260026, 0x3737003737370037,
706         0x3b3b003b3b3b003b, 0x9696009696960096, 0x4b4b004b4b4b004b,
707         0xbebe00bebebe00be, 0x2e2e002e2e2e002e, 0x7979007979790079,
708         0x8c8c008c8c8c008c, 0x6e6e006e6e6e006e, 0x8e8e008e8e8e008e,
709         0xf5f500f5f5f500f5, 0xb6b600b6b6b600b6, 0xfdfd00fdfdfd00fd,
710         0x5959005959590059, 0x9898009898980098, 0x6a6a006a6a6a006a,
711         0x4646004646460046, 0xbaba00bababa00ba, 0x2525002525250025,
712         0x4242004242420042, 0xa2a200a2a2a200a2, 0xfafa00fafafa00fa,
713         0x0707000707070007, 0x5555005555550055, 0xeeee00eeeeee00ee,
714         0x0a0a000a0a0a000a, 0x4949004949490049, 0x6868006868680068,
715         0x3838003838380038, 0xa4a400a4a4a400a4, 0x2828002828280028,
716         0x7b7b007b7b7b007b, 0xc9c900c9c9c900c9, 0xc1c100c1c1c100c1,
717         0xe3e300e3e3e300e3, 0xf4f400f4f4f400f4, 0xc7c700c7c7c700c7,
718         0x9e9e009e9e9e009e,
719 };
720
721 const u64 camellia_sp11101110[256] = {
722         0x7070700070707000, 0x8282820082828200, 0x2c2c2c002c2c2c00,
723         0xececec00ececec00, 0xb3b3b300b3b3b300, 0x2727270027272700,
724         0xc0c0c000c0c0c000, 0xe5e5e500e5e5e500, 0xe4e4e400e4e4e400,
725         0x8585850085858500, 0x5757570057575700, 0x3535350035353500,
726         0xeaeaea00eaeaea00, 0x0c0c0c000c0c0c00, 0xaeaeae00aeaeae00,
727         0x4141410041414100, 0x2323230023232300, 0xefefef00efefef00,
728         0x6b6b6b006b6b6b00, 0x9393930093939300, 0x4545450045454500,
729         0x1919190019191900, 0xa5a5a500a5a5a500, 0x2121210021212100,
730         0xededed00ededed00, 0x0e0e0e000e0e0e00, 0x4f4f4f004f4f4f00,
731         0x4e4e4e004e4e4e00, 0x1d1d1d001d1d1d00, 0x6565650065656500,
732         0x9292920092929200, 0xbdbdbd00bdbdbd00, 0x8686860086868600,
733         0xb8b8b800b8b8b800, 0xafafaf00afafaf00, 0x8f8f8f008f8f8f00,
734         0x7c7c7c007c7c7c00, 0xebebeb00ebebeb00, 0x1f1f1f001f1f1f00,
735         0xcecece00cecece00, 0x3e3e3e003e3e3e00, 0x3030300030303000,
736         0xdcdcdc00dcdcdc00, 0x5f5f5f005f5f5f00, 0x5e5e5e005e5e5e00,
737         0xc5c5c500c5c5c500, 0x0b0b0b000b0b0b00, 0x1a1a1a001a1a1a00,
738         0xa6a6a600a6a6a600, 0xe1e1e100e1e1e100, 0x3939390039393900,
739         0xcacaca00cacaca00, 0xd5d5d500d5d5d500, 0x4747470047474700,
740         0x5d5d5d005d5d5d00, 0x3d3d3d003d3d3d00, 0xd9d9d900d9d9d900,
741         0x0101010001010100, 0x5a5a5a005a5a5a00, 0xd6d6d600d6d6d600,
742         0x5151510051515100, 0x5656560056565600, 0x6c6c6c006c6c6c00,
743         0x4d4d4d004d4d4d00, 0x8b8b8b008b8b8b00, 0x0d0d0d000d0d0d00,
744         0x9a9a9a009a9a9a00, 0x6666660066666600, 0xfbfbfb00fbfbfb00,
745         0xcccccc00cccccc00, 0xb0b0b000b0b0b000, 0x2d2d2d002d2d2d00,
746         0x7474740074747400, 0x1212120012121200, 0x2b2b2b002b2b2b00,
747         0x2020200020202000, 0xf0f0f000f0f0f000, 0xb1b1b100b1b1b100,
748         0x8484840084848400, 0x9999990099999900, 0xdfdfdf00dfdfdf00,
749         0x4c4c4c004c4c4c00, 0xcbcbcb00cbcbcb00, 0xc2c2c200c2c2c200,
750         0x3434340034343400, 0x7e7e7e007e7e7e00, 0x7676760076767600,
751         0x0505050005050500, 0x6d6d6d006d6d6d00, 0xb7b7b700b7b7b700,
752         0xa9a9a900a9a9a900, 0x3131310031313100, 0xd1d1d100d1d1d100,
753         0x1717170017171700, 0x0404040004040400, 0xd7d7d700d7d7d700,
754         0x1414140014141400, 0x5858580058585800, 0x3a3a3a003a3a3a00,
755         0x6161610061616100, 0xdedede00dedede00, 0x1b1b1b001b1b1b00,
756         0x1111110011111100, 0x1c1c1c001c1c1c00, 0x3232320032323200,
757         0x0f0f0f000f0f0f00, 0x9c9c9c009c9c9c00, 0x1616160016161600,
758         0x5353530053535300, 0x1818180018181800, 0xf2f2f200f2f2f200,
759         0x2222220022222200, 0xfefefe00fefefe00, 0x4444440044444400,
760         0xcfcfcf00cfcfcf00, 0xb2b2b200b2b2b200, 0xc3c3c300c3c3c300,
761         0xb5b5b500b5b5b500, 0x7a7a7a007a7a7a00, 0x9191910091919100,
762         0x2424240024242400, 0x0808080008080800, 0xe8e8e800e8e8e800,
763         0xa8a8a800a8a8a800, 0x6060600060606000, 0xfcfcfc00fcfcfc00,
764         0x6969690069696900, 0x5050500050505000, 0xaaaaaa00aaaaaa00,
765         0xd0d0d000d0d0d000, 0xa0a0a000a0a0a000, 0x7d7d7d007d7d7d00,
766         0xa1a1a100a1a1a100, 0x8989890089898900, 0x6262620062626200,
767         0x9797970097979700, 0x5454540054545400, 0x5b5b5b005b5b5b00,
768         0x1e1e1e001e1e1e00, 0x9595950095959500, 0xe0e0e000e0e0e000,
769         0xffffff00ffffff00, 0x6464640064646400, 0xd2d2d200d2d2d200,
770         0x1010100010101000, 0xc4c4c400c4c4c400, 0x0000000000000000,
771         0x4848480048484800, 0xa3a3a300a3a3a300, 0xf7f7f700f7f7f700,
772         0x7575750075757500, 0xdbdbdb00dbdbdb00, 0x8a8a8a008a8a8a00,
773         0x0303030003030300, 0xe6e6e600e6e6e600, 0xdadada00dadada00,
774         0x0909090009090900, 0x3f3f3f003f3f3f00, 0xdddddd00dddddd00,
775         0x9494940094949400, 0x8787870087878700, 0x5c5c5c005c5c5c00,
776         0x8383830083838300, 0x0202020002020200, 0xcdcdcd00cdcdcd00,
777         0x4a4a4a004a4a4a00, 0x9090900090909000, 0x3333330033333300,
778         0x7373730073737300, 0x6767670067676700, 0xf6f6f600f6f6f600,
779         0xf3f3f300f3f3f300, 0x9d9d9d009d9d9d00, 0x7f7f7f007f7f7f00,
780         0xbfbfbf00bfbfbf00, 0xe2e2e200e2e2e200, 0x5252520052525200,
781         0x9b9b9b009b9b9b00, 0xd8d8d800d8d8d800, 0x2626260026262600,
782         0xc8c8c800c8c8c800, 0x3737370037373700, 0xc6c6c600c6c6c600,
783         0x3b3b3b003b3b3b00, 0x8181810081818100, 0x9696960096969600,
784         0x6f6f6f006f6f6f00, 0x4b4b4b004b4b4b00, 0x1313130013131300,
785         0xbebebe00bebebe00, 0x6363630063636300, 0x2e2e2e002e2e2e00,
786         0xe9e9e900e9e9e900, 0x7979790079797900, 0xa7a7a700a7a7a700,
787         0x8c8c8c008c8c8c00, 0x9f9f9f009f9f9f00, 0x6e6e6e006e6e6e00,
788         0xbcbcbc00bcbcbc00, 0x8e8e8e008e8e8e00, 0x2929290029292900,
789         0xf5f5f500f5f5f500, 0xf9f9f900f9f9f900, 0xb6b6b600b6b6b600,
790         0x2f2f2f002f2f2f00, 0xfdfdfd00fdfdfd00, 0xb4b4b400b4b4b400,
791         0x5959590059595900, 0x7878780078787800, 0x9898980098989800,
792         0x0606060006060600, 0x6a6a6a006a6a6a00, 0xe7e7e700e7e7e700,
793         0x4646460046464600, 0x7171710071717100, 0xbababa00bababa00,
794         0xd4d4d400d4d4d400, 0x2525250025252500, 0xababab00ababab00,
795         0x4242420042424200, 0x8888880088888800, 0xa2a2a200a2a2a200,
796         0x8d8d8d008d8d8d00, 0xfafafa00fafafa00, 0x7272720072727200,
797         0x0707070007070700, 0xb9b9b900b9b9b900, 0x5555550055555500,
798         0xf8f8f800f8f8f800, 0xeeeeee00eeeeee00, 0xacacac00acacac00,
799         0x0a0a0a000a0a0a00, 0x3636360036363600, 0x4949490049494900,
800         0x2a2a2a002a2a2a00, 0x6868680068686800, 0x3c3c3c003c3c3c00,
801         0x3838380038383800, 0xf1f1f100f1f1f100, 0xa4a4a400a4a4a400,
802         0x4040400040404000, 0x2828280028282800, 0xd3d3d300d3d3d300,
803         0x7b7b7b007b7b7b00, 0xbbbbbb00bbbbbb00, 0xc9c9c900c9c9c900,
804         0x4343430043434300, 0xc1c1c100c1c1c100, 0x1515150015151500,
805         0xe3e3e300e3e3e300, 0xadadad00adadad00, 0xf4f4f400f4f4f400,
806         0x7777770077777700, 0xc7c7c700c7c7c700, 0x8080800080808000,
807         0x9e9e9e009e9e9e00,
808 };
809
810 /* key constants */
811 #define CAMELLIA_SIGMA1L (0xA09E667FL)
812 #define CAMELLIA_SIGMA1R (0x3BCC908BL)
813 #define CAMELLIA_SIGMA2L (0xB67AE858L)
814 #define CAMELLIA_SIGMA2R (0x4CAA73B2L)
815 #define CAMELLIA_SIGMA3L (0xC6EF372FL)
816 #define CAMELLIA_SIGMA3R (0xE94F82BEL)
817 #define CAMELLIA_SIGMA4L (0x54FF53A5L)
818 #define CAMELLIA_SIGMA4R (0xF1D36F1CL)
819 #define CAMELLIA_SIGMA5L (0x10E527FAL)
820 #define CAMELLIA_SIGMA5R (0xDE682D1DL)
821 #define CAMELLIA_SIGMA6L (0xB05688C2L)
822 #define CAMELLIA_SIGMA6R (0xB3E6C1FDL)
823
824 /* macros */
825 #define ROLDQ(l, r, bits) ({ \
826         u64 t = l;                                      \
827         l = (l << bits) | (r >> (64 - bits));           \
828         r = (r << bits) | (t >> (64 - bits));           \
829 })
830
831 #define CAMELLIA_F(x, kl, kr, y) ({ \
832         u64 ii = x ^ (((u64)kl << 32) | kr);                            \
833         y = camellia_sp11101110[(uint8_t)ii];                           \
834         y ^= camellia_sp44044404[(uint8_t)(ii >> 8)];                   \
835         ii >>= 16;                                                      \
836         y ^= camellia_sp30333033[(uint8_t)ii];                          \
837         y ^= camellia_sp02220222[(uint8_t)(ii >> 8)];                   \
838         ii >>= 16;                                                      \
839         y ^= camellia_sp00444404[(uint8_t)ii];                          \
840         y ^= camellia_sp03303033[(uint8_t)(ii >> 8)];                   \
841         ii >>= 16;                                                      \
842         y ^= camellia_sp22000222[(uint8_t)ii];                          \
843         y ^= camellia_sp10011110[(uint8_t)(ii >> 8)];                   \
844         y = ror64(y, 32);                                               \
845 })
846
847 #define SET_SUBKEY_LR(INDEX, sRL) (subkey[(INDEX)] = ror64((sRL), 32))
848
849 static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
850 {
851         u64 kw4, tt;
852         u32 dw, tl, tr;
853
854         /* absorb kw2 to other subkeys */
855         /* round 2 */
856         subRL[3] ^= subRL[1];
857         /* round 4 */
858         subRL[5] ^= subRL[1];
859         /* round 6 */
860         subRL[7] ^= subRL[1];
861
862         subRL[1] ^= (subRL[1] & ~subRL[9]) << 32;
863         /* modified for FLinv(kl2) */
864         dw = (subRL[1] & subRL[9]) >> 32,
865                 subRL[1] ^= rol32(dw, 1);
866
867         /* round 8 */
868         subRL[11] ^= subRL[1];
869         /* round 10 */
870         subRL[13] ^= subRL[1];
871         /* round 12 */
872         subRL[15] ^= subRL[1];
873
874         subRL[1] ^= (subRL[1] & ~subRL[17]) << 32;
875         /* modified for FLinv(kl4) */
876         dw = (subRL[1] & subRL[17]) >> 32,
877                 subRL[1] ^= rol32(dw, 1);
878
879         /* round 14 */
880         subRL[19] ^= subRL[1];
881         /* round 16 */
882         subRL[21] ^= subRL[1];
883         /* round 18 */
884         subRL[23] ^= subRL[1];
885
886         if (max == 24) {
887                 /* kw3 */
888                 subRL[24] ^= subRL[1];
889
890                 /* absorb kw4 to other subkeys */
891                 kw4 = subRL[25];
892         } else {
893                 subRL[1] ^= (subRL[1] & ~subRL[25]) << 32;
894                 /* modified for FLinv(kl6) */
895                 dw = (subRL[1] & subRL[25]) >> 32,
896                         subRL[1] ^= rol32(dw, 1);
897
898                 /* round 20 */
899                 subRL[27] ^= subRL[1];
900                 /* round 22 */
901                 subRL[29] ^= subRL[1];
902                 /* round 24 */
903                 subRL[31] ^= subRL[1];
904                 /* kw3 */
905                 subRL[32] ^= subRL[1];
906
907                 /* absorb kw4 to other subkeys */
908                 kw4 = subRL[33];
909                 /* round 23 */
910                 subRL[30] ^= kw4;
911                 /* round 21 */
912                 subRL[28] ^= kw4;
913                 /* round 19 */
914                 subRL[26] ^= kw4;
915
916                 kw4 ^= (kw4 & ~subRL[24]) << 32;
917                 /* modified for FL(kl5) */
918                 dw = (kw4 & subRL[24]) >> 32,
919                         kw4 ^= rol32(dw, 1);
920         }
921
922         /* round 17 */
923         subRL[22] ^= kw4;
924         /* round 15 */
925         subRL[20] ^= kw4;
926         /* round 13 */
927         subRL[18] ^= kw4;
928
929         kw4 ^= (kw4 & ~subRL[16]) << 32;
930         /* modified for FL(kl3) */
931         dw = (kw4 & subRL[16]) >> 32,
932                 kw4 ^= rol32(dw, 1);
933
934         /* round 11 */
935         subRL[14] ^= kw4;
936         /* round 9 */
937         subRL[12] ^= kw4;
938         /* round 7 */
939         subRL[10] ^= kw4;
940
941         kw4 ^= (kw4 & ~subRL[8]) << 32;
942         /* modified for FL(kl1) */
943         dw = (kw4 & subRL[8]) >> 32,
944                 kw4 ^= rol32(dw, 1);
945
946         /* round 5 */
947         subRL[6] ^= kw4;
948         /* round 3 */
949         subRL[4] ^= kw4;
950         /* round 1 */
951         subRL[2] ^= kw4;
952         /* kw1 */
953         subRL[0] ^= kw4;
954
955         /* key XOR is end of F-function */
956         SET_SUBKEY_LR(0, subRL[0] ^ subRL[2]);                  /* kw1 */
957         SET_SUBKEY_LR(2, subRL[3]);                             /* round 1 */
958         SET_SUBKEY_LR(3, subRL[2] ^ subRL[4]);                  /* round 2 */
959         SET_SUBKEY_LR(4, subRL[3] ^ subRL[5]);                  /* round 3 */
960         SET_SUBKEY_LR(5, subRL[4] ^ subRL[6]);                  /* round 4 */
961         SET_SUBKEY_LR(6, subRL[5] ^ subRL[7]);                  /* round 5 */
962
963         tl = (subRL[10] >> 32) ^ (subRL[10] & ~subRL[8]);
964         dw = tl & (subRL[8] >> 32),                             /* FL(kl1) */
965                 tr = subRL[10] ^ rol32(dw, 1);
966         tt = (tr | ((u64)tl << 32));
967
968         SET_SUBKEY_LR(7, subRL[6] ^ tt);                        /* round 6 */
969         SET_SUBKEY_LR(8, subRL[8]);                             /* FL(kl1) */
970         SET_SUBKEY_LR(9, subRL[9]);                             /* FLinv(kl2) */
971
972         tl = (subRL[7] >> 32) ^ (subRL[7] & ~subRL[9]);
973         dw = tl & (subRL[9] >> 32),                             /* FLinv(kl2) */
974                 tr = subRL[7] ^ rol32(dw, 1);
975         tt = (tr | ((u64)tl << 32));
976
977         SET_SUBKEY_LR(10, subRL[11] ^ tt);                      /* round 7 */
978         SET_SUBKEY_LR(11, subRL[10] ^ subRL[12]);               /* round 8 */
979         SET_SUBKEY_LR(12, subRL[11] ^ subRL[13]);               /* round 9 */
980         SET_SUBKEY_LR(13, subRL[12] ^ subRL[14]);               /* round 10 */
981         SET_SUBKEY_LR(14, subRL[13] ^ subRL[15]);               /* round 11 */
982
983         tl = (subRL[18] >> 32) ^ (subRL[18] & ~subRL[16]);
984         dw = tl & (subRL[16] >> 32),                            /* FL(kl3) */
985                 tr = subRL[18] ^ rol32(dw, 1);
986         tt = (tr | ((u64)tl << 32));
987
988         SET_SUBKEY_LR(15, subRL[14] ^ tt);                      /* round 12 */
989         SET_SUBKEY_LR(16, subRL[16]);                           /* FL(kl3) */
990         SET_SUBKEY_LR(17, subRL[17]);                           /* FLinv(kl4) */
991
992         tl = (subRL[15] >> 32) ^ (subRL[15] & ~subRL[17]);
993         dw = tl & (subRL[17] >> 32),                            /* FLinv(kl4) */
994                 tr = subRL[15] ^ rol32(dw, 1);
995         tt = (tr | ((u64)tl << 32));
996
997         SET_SUBKEY_LR(18, subRL[19] ^ tt);                      /* round 13 */
998         SET_SUBKEY_LR(19, subRL[18] ^ subRL[20]);               /* round 14 */
999         SET_SUBKEY_LR(20, subRL[19] ^ subRL[21]);               /* round 15 */
1000         SET_SUBKEY_LR(21, subRL[20] ^ subRL[22]);               /* round 16 */
1001         SET_SUBKEY_LR(22, subRL[21] ^ subRL[23]);               /* round 17 */
1002
1003         if (max == 24) {
1004                 SET_SUBKEY_LR(23, subRL[22]);                   /* round 18 */
1005                 SET_SUBKEY_LR(24, subRL[24] ^ subRL[23]);       /* kw3 */
1006         } else {
1007                 tl = (subRL[26] >> 32) ^ (subRL[26] & ~subRL[24]);
1008                 dw = tl & (subRL[24] >> 32),                    /* FL(kl5) */
1009                         tr = subRL[26] ^ rol32(dw, 1);
1010                 tt = (tr | ((u64)tl << 32));
1011
1012                 SET_SUBKEY_LR(23, subRL[22] ^ tt);              /* round 18 */
1013                 SET_SUBKEY_LR(24, subRL[24]);                   /* FL(kl5) */
1014                 SET_SUBKEY_LR(25, subRL[25]);                   /* FLinv(kl6) */
1015
1016                 tl = (subRL[23] >> 32) ^ (subRL[23] & ~subRL[25]);
1017                 dw = tl & (subRL[25] >> 32),                    /* FLinv(kl6) */
1018                         tr = subRL[23] ^ rol32(dw, 1);
1019                 tt = (tr | ((u64)tl << 32));
1020
1021                 SET_SUBKEY_LR(26, subRL[27] ^ tt);              /* round 19 */
1022                 SET_SUBKEY_LR(27, subRL[26] ^ subRL[28]);       /* round 20 */
1023                 SET_SUBKEY_LR(28, subRL[27] ^ subRL[29]);       /* round 21 */
1024                 SET_SUBKEY_LR(29, subRL[28] ^ subRL[30]);       /* round 22 */
1025                 SET_SUBKEY_LR(30, subRL[29] ^ subRL[31]);       /* round 23 */
1026                 SET_SUBKEY_LR(31, subRL[30]);                   /* round 24 */
1027                 SET_SUBKEY_LR(32, subRL[32] ^ subRL[31]);       /* kw3 */
1028         }
1029 }
1030
1031 static void camellia_setup128(const unsigned char *key, u64 *subkey)
1032 {
1033         u64 kl, kr, ww;
1034         u64 subRL[26];
1035
1036         /**
1037          *  k == kl || kr (|| is concatenation)
1038          */
1039         kl = get_unaligned_be64(key);
1040         kr = get_unaligned_be64(key + 8);
1041
1042         /* generate KL dependent subkeys */
1043         /* kw1 */
1044         subRL[0] = kl;
1045         /* kw2 */
1046         subRL[1] = kr;
1047
1048         /* rotation left shift 15bit */
1049         ROLDQ(kl, kr, 15);
1050
1051         /* k3 */
1052         subRL[4] = kl;
1053         /* k4 */
1054         subRL[5] = kr;
1055
1056         /* rotation left shift 15+30bit */
1057         ROLDQ(kl, kr, 30);
1058
1059         /* k7 */
1060         subRL[10] = kl;
1061         /* k8 */
1062         subRL[11] = kr;
1063
1064         /* rotation left shift 15+30+15bit */
1065         ROLDQ(kl, kr, 15);
1066
1067         /* k10 */
1068         subRL[13] = kr;
1069         /* rotation left shift 15+30+15+17 bit */
1070         ROLDQ(kl, kr, 17);
1071
1072         /* kl3 */
1073         subRL[16] = kl;
1074         /* kl4 */
1075         subRL[17] = kr;
1076
1077         /* rotation left shift 15+30+15+17+17 bit */
1078         ROLDQ(kl, kr, 17);
1079
1080         /* k13 */
1081         subRL[18] = kl;
1082         /* k14 */
1083         subRL[19] = kr;
1084
1085         /* rotation left shift 15+30+15+17+17+17 bit */
1086         ROLDQ(kl, kr, 17);
1087
1088         /* k17 */
1089         subRL[22] = kl;
1090         /* k18 */
1091         subRL[23] = kr;
1092
1093         /* generate KA */
1094         kl = subRL[0];
1095         kr = subRL[1];
1096         CAMELLIA_F(kl, CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, ww);
1097         kr ^= ww;
1098         CAMELLIA_F(kr, CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, kl);
1099
1100         /* current status == (kll, klr, w0, w1) */
1101         CAMELLIA_F(kl, CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, kr);
1102         kr ^= ww;
1103         CAMELLIA_F(kr, CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, ww);
1104         kl ^= ww;
1105
1106         /* generate KA dependent subkeys */
1107         /* k1, k2 */
1108         subRL[2] = kl;
1109         subRL[3] = kr;
1110         ROLDQ(kl, kr, 15);
1111         /* k5,k6 */
1112         subRL[6] = kl;
1113         subRL[7] = kr;
1114         ROLDQ(kl, kr, 15);
1115         /* kl1, kl2 */
1116         subRL[8] = kl;
1117         subRL[9] = kr;
1118         ROLDQ(kl, kr, 15);
1119         /* k9 */
1120         subRL[12] = kl;
1121         ROLDQ(kl, kr, 15);
1122         /* k11, k12 */
1123         subRL[14] = kl;
1124         subRL[15] = kr;
1125         ROLDQ(kl, kr, 34);
1126         /* k15, k16 */
1127         subRL[20] = kl;
1128         subRL[21] = kr;
1129         ROLDQ(kl, kr, 17);
1130         /* kw3, kw4 */
1131         subRL[24] = kl;
1132         subRL[25] = kr;
1133
1134         camellia_setup_tail(subkey, subRL, 24);
1135 }
1136
1137 static void camellia_setup256(const unsigned char *key, u64 *subkey)
1138 {
1139         u64 kl, kr;                     /* left half of key */
1140         u64 krl, krr;                   /* right half of key */
1141         u64 ww;                         /* temporary variables */
1142         u64 subRL[34];
1143
1144         /**
1145          *  key = (kl || kr || krl || krr) (|| is concatenation)
1146          */
1147         kl = get_unaligned_be64(key);
1148         kr = get_unaligned_be64(key + 8);
1149         krl = get_unaligned_be64(key + 16);
1150         krr = get_unaligned_be64(key + 24);
1151
1152         /* generate KL dependent subkeys */
1153         /* kw1 */
1154         subRL[0] = kl;
1155         /* kw2 */
1156         subRL[1] = kr;
1157         ROLDQ(kl, kr, 45);
1158         /* k9 */
1159         subRL[12] = kl;
1160         /* k10 */
1161         subRL[13] = kr;
1162         ROLDQ(kl, kr, 15);
1163         /* kl3 */
1164         subRL[16] = kl;
1165         /* kl4 */
1166         subRL[17] = kr;
1167         ROLDQ(kl, kr, 17);
1168         /* k17 */
1169         subRL[22] = kl;
1170         /* k18 */
1171         subRL[23] = kr;
1172         ROLDQ(kl, kr, 34);
1173         /* k23 */
1174         subRL[30] = kl;
1175         /* k24 */
1176         subRL[31] = kr;
1177
1178         /* generate KR dependent subkeys */
1179         ROLDQ(krl, krr, 15);
1180         /* k3 */
1181         subRL[4] = krl;
1182         /* k4 */
1183         subRL[5] = krr;
1184         ROLDQ(krl, krr, 15);
1185         /* kl1 */
1186         subRL[8] = krl;
1187         /* kl2 */
1188         subRL[9] = krr;
1189         ROLDQ(krl, krr, 30);
1190         /* k13 */
1191         subRL[18] = krl;
1192         /* k14 */
1193         subRL[19] = krr;
1194         ROLDQ(krl, krr, 34);
1195         /* k19 */
1196         subRL[26] = krl;
1197         /* k20 */
1198         subRL[27] = krr;
1199         ROLDQ(krl, krr, 34);
1200
1201         /* generate KA */
1202         kl = subRL[0] ^ krl;
1203         kr = subRL[1] ^ krr;
1204
1205         CAMELLIA_F(kl, CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, ww);
1206         kr ^= ww;
1207         CAMELLIA_F(kr, CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, kl);
1208         kl ^= krl;
1209         CAMELLIA_F(kl, CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, kr);
1210         kr ^= ww ^ krr;
1211         CAMELLIA_F(kr, CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, ww);
1212         kl ^= ww;
1213
1214         /* generate KB */
1215         krl ^= kl;
1216         krr ^= kr;
1217         CAMELLIA_F(krl, CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R, ww);
1218         krr ^= ww;
1219         CAMELLIA_F(krr, CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R, ww);
1220         krl ^= ww;
1221
1222         /* generate KA dependent subkeys */
1223         ROLDQ(kl, kr, 15);
1224         /* k5 */
1225         subRL[6] = kl;
1226         /* k6 */
1227         subRL[7] = kr;
1228         ROLDQ(kl, kr, 30);
1229         /* k11 */
1230         subRL[14] = kl;
1231         /* k12 */
1232         subRL[15] = kr;
1233         /* rotation left shift 32bit */
1234         ROLDQ(kl, kr, 32);
1235         /* kl5 */
1236         subRL[24] = kl;
1237         /* kl6 */
1238         subRL[25] = kr;
1239         /* rotation left shift 17 from k11,k12 -> k21,k22 */
1240         ROLDQ(kl, kr, 17);
1241         /* k21 */
1242         subRL[28] = kl;
1243         /* k22 */
1244         subRL[29] = kr;
1245
1246         /* generate KB dependent subkeys */
1247         /* k1 */
1248         subRL[2] = krl;
1249         /* k2 */
1250         subRL[3] = krr;
1251         ROLDQ(krl, krr, 30);
1252         /* k7 */
1253         subRL[10] = krl;
1254         /* k8 */
1255         subRL[11] = krr;
1256         ROLDQ(krl, krr, 30);
1257         /* k15 */
1258         subRL[20] = krl;
1259         /* k16 */
1260         subRL[21] = krr;
1261         ROLDQ(krl, krr, 51);
1262         /* kw3 */
1263         subRL[32] = krl;
1264         /* kw4 */
1265         subRL[33] = krr;
1266
1267         camellia_setup_tail(subkey, subRL, 32);
1268 }
1269
1270 static void camellia_setup192(const unsigned char *key, u64 *subkey)
1271 {
1272         unsigned char kk[32];
1273         u64 krl, krr;
1274
1275         memcpy(kk, key, 24);
1276         memcpy((unsigned char *)&krl, key+16, 8);
1277         krr = ~krl;
1278         memcpy(kk+24, (unsigned char *)&krr, 8);
1279         camellia_setup256(kk, subkey);
1280 }
1281
1282 static int __camellia_setkey(struct camellia_ctx *cctx,
1283                              const unsigned char *key,
1284                              unsigned int key_len, u32 *flags)
1285 {
1286         if (key_len != 16 && key_len != 24 && key_len != 32) {
1287                 *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
1288                 return -EINVAL;
1289         }
1290
1291         cctx->key_length = key_len;
1292
1293         switch (key_len) {
1294         case 16:
1295                 camellia_setup128(key, cctx->key_table);
1296                 break;
1297         case 24:
1298                 camellia_setup192(key, cctx->key_table);
1299                 break;
1300         case 32:
1301                 camellia_setup256(key, cctx->key_table);
1302                 break;
1303         }
1304
1305         return 0;
1306 }
1307
1308 static int camellia_setkey(struct crypto_tfm *tfm, const u8 *in_key,
1309                            unsigned int key_len)
1310 {
1311         return __camellia_setkey(crypto_tfm_ctx(tfm), in_key, key_len,
1312                                  &tfm->crt_flags);
1313 }
1314
1315 static int ecb_crypt(struct blkcipher_desc *desc, struct blkcipher_walk *walk,
1316                      void (*fn)(struct camellia_ctx *, u8 *, const u8 *),
1317                      void (*fn_2way)(struct camellia_ctx *, u8 *, const u8 *))
1318 {
1319         struct camellia_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1320         unsigned int bsize = CAMELLIA_BLOCK_SIZE;
1321         unsigned int nbytes;
1322         int err;
1323
1324         err = blkcipher_walk_virt(desc, walk);
1325
1326         while ((nbytes = walk->nbytes)) {
1327                 u8 *wsrc = walk->src.virt.addr;
1328                 u8 *wdst = walk->dst.virt.addr;
1329
1330                 /* Process two block batch */
1331                 if (nbytes >= bsize * 2) {
1332                         do {
1333                                 fn_2way(ctx, wdst, wsrc);
1334
1335                                 wsrc += bsize * 2;
1336                                 wdst += bsize * 2;
1337                                 nbytes -= bsize * 2;
1338                         } while (nbytes >= bsize * 2);
1339
1340                         if (nbytes < bsize)
1341                                 goto done;
1342                 }
1343
1344                 /* Handle leftovers */
1345                 do {
1346                         fn(ctx, wdst, wsrc);
1347
1348                         wsrc += bsize;
1349                         wdst += bsize;
1350                         nbytes -= bsize;
1351                 } while (nbytes >= bsize);
1352
1353 done:
1354                 err = blkcipher_walk_done(desc, walk, nbytes);
1355         }
1356
1357         return err;
1358 }
1359
1360 static int ecb_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1361                        struct scatterlist *src, unsigned int nbytes)
1362 {
1363         struct blkcipher_walk walk;
1364
1365         blkcipher_walk_init(&walk, dst, src, nbytes);
1366         return ecb_crypt(desc, &walk, camellia_enc_blk, camellia_enc_blk_2way);
1367 }
1368
1369 static int ecb_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1370                        struct scatterlist *src, unsigned int nbytes)
1371 {
1372         struct blkcipher_walk walk;
1373
1374         blkcipher_walk_init(&walk, dst, src, nbytes);
1375         return ecb_crypt(desc, &walk, camellia_dec_blk, camellia_dec_blk_2way);
1376 }
1377
1378 static unsigned int __cbc_encrypt(struct blkcipher_desc *desc,
1379                                   struct blkcipher_walk *walk)
1380 {
1381         struct camellia_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1382         unsigned int bsize = CAMELLIA_BLOCK_SIZE;
1383         unsigned int nbytes = walk->nbytes;
1384         u128 *src = (u128 *)walk->src.virt.addr;
1385         u128 *dst = (u128 *)walk->dst.virt.addr;
1386         u128 *iv = (u128 *)walk->iv;
1387
1388         do {
1389                 u128_xor(dst, src, iv);
1390                 camellia_enc_blk(ctx, (u8 *)dst, (u8 *)dst);
1391                 iv = dst;
1392
1393                 src += 1;
1394                 dst += 1;
1395                 nbytes -= bsize;
1396         } while (nbytes >= bsize);
1397
1398         u128_xor((u128 *)walk->iv, (u128 *)walk->iv, iv);
1399         return nbytes;
1400 }
1401
1402 static int cbc_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1403                        struct scatterlist *src, unsigned int nbytes)
1404 {
1405         struct blkcipher_walk walk;
1406         int err;
1407
1408         blkcipher_walk_init(&walk, dst, src, nbytes);
1409         err = blkcipher_walk_virt(desc, &walk);
1410
1411         while ((nbytes = walk.nbytes)) {
1412                 nbytes = __cbc_encrypt(desc, &walk);
1413                 err = blkcipher_walk_done(desc, &walk, nbytes);
1414         }
1415
1416         return err;
1417 }
1418
1419 static unsigned int __cbc_decrypt(struct blkcipher_desc *desc,
1420                                   struct blkcipher_walk *walk)
1421 {
1422         struct camellia_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1423         unsigned int bsize = CAMELLIA_BLOCK_SIZE;
1424         unsigned int nbytes = walk->nbytes;
1425         u128 *src = (u128 *)walk->src.virt.addr;
1426         u128 *dst = (u128 *)walk->dst.virt.addr;
1427         u128 ivs[2 - 1];
1428         u128 last_iv;
1429
1430         /* Start of the last block. */
1431         src += nbytes / bsize - 1;
1432         dst += nbytes / bsize - 1;
1433
1434         last_iv = *src;
1435
1436         /* Process two block batch */
1437         if (nbytes >= bsize * 2) {
1438                 do {
1439                         nbytes -= bsize * (2 - 1);
1440                         src -= 2 - 1;
1441                         dst -= 2 - 1;
1442
1443                         ivs[0] = src[0];
1444
1445                         camellia_dec_blk_2way(ctx, (u8 *)dst, (u8 *)src);
1446
1447                         u128_xor(dst + 1, dst + 1, ivs + 0);
1448
1449                         nbytes -= bsize;
1450                         if (nbytes < bsize)
1451                                 goto done;
1452
1453                         u128_xor(dst, dst, src - 1);
1454                         src -= 1;
1455                         dst -= 1;
1456                 } while (nbytes >= bsize * 2);
1457
1458                 if (nbytes < bsize)
1459                         goto done;
1460         }
1461
1462         /* Handle leftovers */
1463         for (;;) {
1464                 camellia_dec_blk(ctx, (u8 *)dst, (u8 *)src);
1465
1466                 nbytes -= bsize;
1467                 if (nbytes < bsize)
1468                         break;
1469
1470                 u128_xor(dst, dst, src - 1);
1471                 src -= 1;
1472                 dst -= 1;
1473         }
1474
1475 done:
1476         u128_xor(dst, dst, (u128 *)walk->iv);
1477         *(u128 *)walk->iv = last_iv;
1478
1479         return nbytes;
1480 }
1481
1482 static int cbc_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1483                        struct scatterlist *src, unsigned int nbytes)
1484 {
1485         struct blkcipher_walk walk;
1486         int err;
1487
1488         blkcipher_walk_init(&walk, dst, src, nbytes);
1489         err = blkcipher_walk_virt(desc, &walk);
1490
1491         while ((nbytes = walk.nbytes)) {
1492                 nbytes = __cbc_decrypt(desc, &walk);
1493                 err = blkcipher_walk_done(desc, &walk, nbytes);
1494         }
1495
1496         return err;
1497 }
1498
1499 static inline void u128_to_be128(be128 *dst, const u128 *src)
1500 {
1501         dst->a = cpu_to_be64(src->a);
1502         dst->b = cpu_to_be64(src->b);
1503 }
1504
1505 static inline void be128_to_u128(u128 *dst, const be128 *src)
1506 {
1507         dst->a = be64_to_cpu(src->a);
1508         dst->b = be64_to_cpu(src->b);
1509 }
1510
1511 static inline void u128_inc(u128 *i)
1512 {
1513         i->b++;
1514         if (!i->b)
1515                 i->a++;
1516 }
1517
1518 static void ctr_crypt_final(struct blkcipher_desc *desc,
1519                             struct blkcipher_walk *walk)
1520 {
1521         struct camellia_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1522         u8 keystream[CAMELLIA_BLOCK_SIZE];
1523         u8 *src = walk->src.virt.addr;
1524         u8 *dst = walk->dst.virt.addr;
1525         unsigned int nbytes = walk->nbytes;
1526         u128 ctrblk;
1527
1528         memcpy(keystream, src, nbytes);
1529         camellia_enc_blk_xor(ctx, keystream, walk->iv);
1530         memcpy(dst, keystream, nbytes);
1531
1532         be128_to_u128(&ctrblk, (be128 *)walk->iv);
1533         u128_inc(&ctrblk);
1534         u128_to_be128((be128 *)walk->iv, &ctrblk);
1535 }
1536
1537 static unsigned int __ctr_crypt(struct blkcipher_desc *desc,
1538                                 struct blkcipher_walk *walk)
1539 {
1540         struct camellia_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1541         unsigned int bsize = CAMELLIA_BLOCK_SIZE;
1542         unsigned int nbytes = walk->nbytes;
1543         u128 *src = (u128 *)walk->src.virt.addr;
1544         u128 *dst = (u128 *)walk->dst.virt.addr;
1545         u128 ctrblk;
1546         be128 ctrblocks[2];
1547
1548         be128_to_u128(&ctrblk, (be128 *)walk->iv);
1549
1550         /* Process two block batch */
1551         if (nbytes >= bsize * 2) {
1552                 do {
1553                         if (dst != src) {
1554                                 dst[0] = src[0];
1555                                 dst[1] = src[1];
1556                         }
1557
1558                         /* create ctrblks for parallel encrypt */
1559                         u128_to_be128(&ctrblocks[0], &ctrblk);
1560                         u128_inc(&ctrblk);
1561                         u128_to_be128(&ctrblocks[1], &ctrblk);
1562                         u128_inc(&ctrblk);
1563
1564                         camellia_enc_blk_xor_2way(ctx, (u8 *)dst,
1565                                                  (u8 *)ctrblocks);
1566
1567                         src += 2;
1568                         dst += 2;
1569                         nbytes -= bsize * 2;
1570                 } while (nbytes >= bsize * 2);
1571
1572                 if (nbytes < bsize)
1573                         goto done;
1574         }
1575
1576         /* Handle leftovers */
1577         do {
1578                 if (dst != src)
1579                         *dst = *src;
1580
1581                 u128_to_be128(&ctrblocks[0], &ctrblk);
1582                 u128_inc(&ctrblk);
1583
1584                 camellia_enc_blk_xor(ctx, (u8 *)dst, (u8 *)ctrblocks);
1585
1586                 src += 1;
1587                 dst += 1;
1588                 nbytes -= bsize;
1589         } while (nbytes >= bsize);
1590
1591 done:
1592         u128_to_be128((be128 *)walk->iv, &ctrblk);
1593         return nbytes;
1594 }
1595
1596 static int ctr_crypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1597                      struct scatterlist *src, unsigned int nbytes)
1598 {
1599         struct blkcipher_walk walk;
1600         int err;
1601
1602         blkcipher_walk_init(&walk, dst, src, nbytes);
1603         err = blkcipher_walk_virt_block(desc, &walk, CAMELLIA_BLOCK_SIZE);
1604
1605         while ((nbytes = walk.nbytes) >= CAMELLIA_BLOCK_SIZE) {
1606                 nbytes = __ctr_crypt(desc, &walk);
1607                 err = blkcipher_walk_done(desc, &walk, nbytes);
1608         }
1609
1610         if (walk.nbytes) {
1611                 ctr_crypt_final(desc, &walk);
1612                 err = blkcipher_walk_done(desc, &walk, 0);
1613         }
1614
1615         return err;
1616 }
1617
1618 static void encrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes)
1619 {
1620         const unsigned int bsize = CAMELLIA_BLOCK_SIZE;
1621         struct camellia_ctx *ctx = priv;
1622         int i;
1623
1624         while (nbytes >= 2 * bsize) {
1625                 camellia_enc_blk_2way(ctx, srcdst, srcdst);
1626                 srcdst += bsize * 2;
1627                 nbytes -= bsize * 2;
1628         }
1629
1630         for (i = 0; i < nbytes / bsize; i++, srcdst += bsize)
1631                 camellia_enc_blk(ctx, srcdst, srcdst);
1632 }
1633
1634 static void decrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes)
1635 {
1636         const unsigned int bsize = CAMELLIA_BLOCK_SIZE;
1637         struct camellia_ctx *ctx = priv;
1638         int i;
1639
1640         while (nbytes >= 2 * bsize) {
1641                 camellia_dec_blk_2way(ctx, srcdst, srcdst);
1642                 srcdst += bsize * 2;
1643                 nbytes -= bsize * 2;
1644         }
1645
1646         for (i = 0; i < nbytes / bsize; i++, srcdst += bsize)
1647                 camellia_dec_blk(ctx, srcdst, srcdst);
1648 }
1649
1650 struct camellia_lrw_ctx {
1651         struct lrw_table_ctx lrw_table;
1652         struct camellia_ctx camellia_ctx;
1653 };
1654
1655 static int lrw_camellia_setkey(struct crypto_tfm *tfm, const u8 *key,
1656                               unsigned int keylen)
1657 {
1658         struct camellia_lrw_ctx *ctx = crypto_tfm_ctx(tfm);
1659         int err;
1660
1661         err = __camellia_setkey(&ctx->camellia_ctx, key,
1662                                 keylen - CAMELLIA_BLOCK_SIZE,
1663                                 &tfm->crt_flags);
1664         if (err)
1665                 return err;
1666
1667         return lrw_init_table(&ctx->lrw_table,
1668                               key + keylen - CAMELLIA_BLOCK_SIZE);
1669 }
1670
1671 static int lrw_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1672                        struct scatterlist *src, unsigned int nbytes)
1673 {
1674         struct camellia_lrw_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1675         be128 buf[2 * 4];
1676         struct lrw_crypt_req req = {
1677                 .tbuf = buf,
1678                 .tbuflen = sizeof(buf),
1679
1680                 .table_ctx = &ctx->lrw_table,
1681                 .crypt_ctx = &ctx->camellia_ctx,
1682                 .crypt_fn = encrypt_callback,
1683         };
1684
1685         return lrw_crypt(desc, dst, src, nbytes, &req);
1686 }
1687
1688 static int lrw_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1689                        struct scatterlist *src, unsigned int nbytes)
1690 {
1691         struct camellia_lrw_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1692         be128 buf[2 * 4];
1693         struct lrw_crypt_req req = {
1694                 .tbuf = buf,
1695                 .tbuflen = sizeof(buf),
1696
1697                 .table_ctx = &ctx->lrw_table,
1698                 .crypt_ctx = &ctx->camellia_ctx,
1699                 .crypt_fn = decrypt_callback,
1700         };
1701
1702         return lrw_crypt(desc, dst, src, nbytes, &req);
1703 }
1704
1705 static void lrw_exit_tfm(struct crypto_tfm *tfm)
1706 {
1707         struct camellia_lrw_ctx *ctx = crypto_tfm_ctx(tfm);
1708
1709         lrw_free_table(&ctx->lrw_table);
1710 }
1711
1712 struct camellia_xts_ctx {
1713         struct camellia_ctx tweak_ctx;
1714         struct camellia_ctx crypt_ctx;
1715 };
1716
1717 static int xts_camellia_setkey(struct crypto_tfm *tfm, const u8 *key,
1718                               unsigned int keylen)
1719 {
1720         struct camellia_xts_ctx *ctx = crypto_tfm_ctx(tfm);
1721         u32 *flags = &tfm->crt_flags;
1722         int err;
1723
1724         /* key consists of keys of equal size concatenated, therefore
1725          * the length must be even
1726          */
1727         if (keylen % 2) {
1728                 *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
1729                 return -EINVAL;
1730         }
1731
1732         /* first half of xts-key is for crypt */
1733         err = __camellia_setkey(&ctx->crypt_ctx, key, keylen / 2, flags);
1734         if (err)
1735                 return err;
1736
1737         /* second half of xts-key is for tweak */
1738         return __camellia_setkey(&ctx->tweak_ctx, key + keylen / 2, keylen / 2,
1739                                 flags);
1740 }
1741
1742 static int xts_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1743                        struct scatterlist *src, unsigned int nbytes)
1744 {
1745         struct camellia_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1746         be128 buf[2 * 4];
1747         struct xts_crypt_req req = {
1748                 .tbuf = buf,
1749                 .tbuflen = sizeof(buf),
1750
1751                 .tweak_ctx = &ctx->tweak_ctx,
1752                 .tweak_fn = XTS_TWEAK_CAST(camellia_enc_blk),
1753                 .crypt_ctx = &ctx->crypt_ctx,
1754                 .crypt_fn = encrypt_callback,
1755         };
1756
1757         return xts_crypt(desc, dst, src, nbytes, &req);
1758 }
1759
1760 static int xts_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1761                        struct scatterlist *src, unsigned int nbytes)
1762 {
1763         struct camellia_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1764         be128 buf[2 * 4];
1765         struct xts_crypt_req req = {
1766                 .tbuf = buf,
1767                 .tbuflen = sizeof(buf),
1768
1769                 .tweak_ctx = &ctx->tweak_ctx,
1770                 .tweak_fn = XTS_TWEAK_CAST(camellia_enc_blk),
1771                 .crypt_ctx = &ctx->crypt_ctx,
1772                 .crypt_fn = decrypt_callback,
1773         };
1774
1775         return xts_crypt(desc, dst, src, nbytes, &req);
1776 }
1777
1778 static struct crypto_alg camellia_algs[6] = { {
1779         .cra_name               = "camellia",
1780         .cra_driver_name        = "camellia-asm",
1781         .cra_priority           = 200,
1782         .cra_flags              = CRYPTO_ALG_TYPE_CIPHER,
1783         .cra_blocksize          = CAMELLIA_BLOCK_SIZE,
1784         .cra_ctxsize            = sizeof(struct camellia_ctx),
1785         .cra_alignmask          = 0,
1786         .cra_module             = THIS_MODULE,
1787         .cra_list               = LIST_HEAD_INIT(camellia_algs[0].cra_list),
1788         .cra_u                  = {
1789                 .cipher = {
1790                         .cia_min_keysize = CAMELLIA_MIN_KEY_SIZE,
1791                         .cia_max_keysize = CAMELLIA_MAX_KEY_SIZE,
1792                         .cia_setkey      = camellia_setkey,
1793                         .cia_encrypt     = camellia_encrypt,
1794                         .cia_decrypt     = camellia_decrypt
1795                 }
1796         }
1797 }, {
1798         .cra_name               = "ecb(camellia)",
1799         .cra_driver_name        = "ecb-camellia-asm",
1800         .cra_priority           = 300,
1801         .cra_flags              = CRYPTO_ALG_TYPE_BLKCIPHER,
1802         .cra_blocksize          = CAMELLIA_BLOCK_SIZE,
1803         .cra_ctxsize            = sizeof(struct camellia_ctx),
1804         .cra_alignmask          = 0,
1805         .cra_type               = &crypto_blkcipher_type,
1806         .cra_module             = THIS_MODULE,
1807         .cra_list               = LIST_HEAD_INIT(camellia_algs[1].cra_list),
1808         .cra_u = {
1809                 .blkcipher = {
1810                         .min_keysize    = CAMELLIA_MIN_KEY_SIZE,
1811                         .max_keysize    = CAMELLIA_MAX_KEY_SIZE,
1812                         .setkey         = camellia_setkey,
1813                         .encrypt        = ecb_encrypt,
1814                         .decrypt        = ecb_decrypt,
1815                 },
1816         },
1817 }, {
1818         .cra_name               = "cbc(camellia)",
1819         .cra_driver_name        = "cbc-camellia-asm",
1820         .cra_priority           = 300,
1821         .cra_flags              = CRYPTO_ALG_TYPE_BLKCIPHER,
1822         .cra_blocksize          = CAMELLIA_BLOCK_SIZE,
1823         .cra_ctxsize            = sizeof(struct camellia_ctx),
1824         .cra_alignmask          = 0,
1825         .cra_type               = &crypto_blkcipher_type,
1826         .cra_module             = THIS_MODULE,
1827         .cra_list               = LIST_HEAD_INIT(camellia_algs[2].cra_list),
1828         .cra_u = {
1829                 .blkcipher = {
1830                         .min_keysize    = CAMELLIA_MIN_KEY_SIZE,
1831                         .max_keysize    = CAMELLIA_MAX_KEY_SIZE,
1832                         .ivsize         = CAMELLIA_BLOCK_SIZE,
1833                         .setkey         = camellia_setkey,
1834                         .encrypt        = cbc_encrypt,
1835                         .decrypt        = cbc_decrypt,
1836                 },
1837         },
1838 }, {
1839         .cra_name               = "ctr(camellia)",
1840         .cra_driver_name        = "ctr-camellia-asm",
1841         .cra_priority           = 300,
1842         .cra_flags              = CRYPTO_ALG_TYPE_BLKCIPHER,
1843         .cra_blocksize          = 1,
1844         .cra_ctxsize            = sizeof(struct camellia_ctx),
1845         .cra_alignmask          = 0,
1846         .cra_type               = &crypto_blkcipher_type,
1847         .cra_module             = THIS_MODULE,
1848         .cra_list               = LIST_HEAD_INIT(camellia_algs[3].cra_list),
1849         .cra_u = {
1850                 .blkcipher = {
1851                         .min_keysize    = CAMELLIA_MIN_KEY_SIZE,
1852                         .max_keysize    = CAMELLIA_MAX_KEY_SIZE,
1853                         .ivsize         = CAMELLIA_BLOCK_SIZE,
1854                         .setkey         = camellia_setkey,
1855                         .encrypt        = ctr_crypt,
1856                         .decrypt        = ctr_crypt,
1857                 },
1858         },
1859 }, {
1860         .cra_name               = "lrw(camellia)",
1861         .cra_driver_name        = "lrw-camellia-asm",
1862         .cra_priority           = 300,
1863         .cra_flags              = CRYPTO_ALG_TYPE_BLKCIPHER,
1864         .cra_blocksize          = CAMELLIA_BLOCK_SIZE,
1865         .cra_ctxsize            = sizeof(struct camellia_lrw_ctx),
1866         .cra_alignmask          = 0,
1867         .cra_type               = &crypto_blkcipher_type,
1868         .cra_module             = THIS_MODULE,
1869         .cra_list               = LIST_HEAD_INIT(camellia_algs[4].cra_list),
1870         .cra_exit               = lrw_exit_tfm,
1871         .cra_u = {
1872                 .blkcipher = {
1873                         .min_keysize    = CAMELLIA_MIN_KEY_SIZE +
1874                                                 CAMELLIA_BLOCK_SIZE,
1875                         .max_keysize    = CAMELLIA_MAX_KEY_SIZE +
1876                                                 CAMELLIA_BLOCK_SIZE,
1877                         .ivsize         = CAMELLIA_BLOCK_SIZE,
1878                         .setkey         = lrw_camellia_setkey,
1879                         .encrypt        = lrw_encrypt,
1880                         .decrypt        = lrw_decrypt,
1881                 },
1882         },
1883 }, {
1884         .cra_name               = "xts(camellia)",
1885         .cra_driver_name        = "xts-camellia-asm",
1886         .cra_priority           = 300,
1887         .cra_flags              = CRYPTO_ALG_TYPE_BLKCIPHER,
1888         .cra_blocksize          = CAMELLIA_BLOCK_SIZE,
1889         .cra_ctxsize            = sizeof(struct camellia_xts_ctx),
1890         .cra_alignmask          = 0,
1891         .cra_type               = &crypto_blkcipher_type,
1892         .cra_module             = THIS_MODULE,
1893         .cra_list               = LIST_HEAD_INIT(camellia_algs[5].cra_list),
1894         .cra_u = {
1895                 .blkcipher = {
1896                         .min_keysize    = CAMELLIA_MIN_KEY_SIZE * 2,
1897                         .max_keysize    = CAMELLIA_MAX_KEY_SIZE * 2,
1898                         .ivsize         = CAMELLIA_BLOCK_SIZE,
1899                         .setkey         = xts_camellia_setkey,
1900                         .encrypt        = xts_encrypt,
1901                         .decrypt        = xts_decrypt,
1902                 },
1903         },
1904 } };
1905
1906 static bool is_blacklisted_cpu(void)
1907 {
1908         if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL)
1909                 return false;
1910
1911         if (boot_cpu_data.x86 == 0x0f) {
1912                 /*
1913                  * On Pentium 4, camellia-asm is slower than original assembler
1914                  * implementation because excessive uses of 64bit rotate and
1915                  * left-shifts (which are really slow on P4) needed to store and
1916                  * handle 128bit block in two 64bit registers.
1917                  */
1918                 return true;
1919         }
1920
1921         return false;
1922 }
1923
1924 static int force;
1925 module_param(force, int, 0);
1926 MODULE_PARM_DESC(force, "Force module load, ignore CPU blacklist");
1927
1928 static int __init init(void)
1929 {
1930         if (!force && is_blacklisted_cpu()) {
1931                 printk(KERN_INFO
1932                         "camellia-x86_64: performance on this CPU "
1933                         "would be suboptimal: disabling "
1934                         "camellia-x86_64.\n");
1935                 return -ENODEV;
1936         }
1937
1938         return crypto_register_algs(camellia_algs, ARRAY_SIZE(camellia_algs));
1939 }
1940
1941 static void __exit fini(void)
1942 {
1943         crypto_unregister_algs(camellia_algs, ARRAY_SIZE(camellia_algs));
1944 }
1945
1946 module_init(init);
1947 module_exit(fini);
1948
1949 MODULE_LICENSE("GPL");
1950 MODULE_DESCRIPTION("Camellia Cipher Algorithm, asm optimized");
1951 MODULE_ALIAS("camellia");
1952 MODULE_ALIAS("camellia-asm");