xref: /openbmc/linux/arch/x86/crypto/camellia_glue.c (revision c40d04df)
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");
1953