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