xref: /openbmc/linux/arch/x86/crypto/camellia_glue.c (revision 6043d341)
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/xts.h>
34 #include <asm/crypto/camellia.h>
35 #include <asm/crypto/glue_helper.h>
36 
37 /* regular block cipher functions */
38 asmlinkage void __camellia_enc_blk(struct camellia_ctx *ctx, u8 *dst,
39 				   const u8 *src, bool xor);
40 EXPORT_SYMBOL_GPL(__camellia_enc_blk);
41 asmlinkage void camellia_dec_blk(struct camellia_ctx *ctx, u8 *dst,
42 				 const u8 *src);
43 EXPORT_SYMBOL_GPL(camellia_dec_blk);
44 
45 /* 2-way parallel cipher functions */
46 asmlinkage void __camellia_enc_blk_2way(struct camellia_ctx *ctx, u8 *dst,
47 					const u8 *src, bool xor);
48 EXPORT_SYMBOL_GPL(__camellia_enc_blk_2way);
49 asmlinkage void camellia_dec_blk_2way(struct camellia_ctx *ctx, u8 *dst,
50 				      const u8 *src);
51 EXPORT_SYMBOL_GPL(camellia_dec_blk_2way);
52 
53 static void camellia_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
54 {
55 	camellia_enc_blk(crypto_tfm_ctx(tfm), dst, src);
56 }
57 
58 static void camellia_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
59 {
60 	camellia_dec_blk(crypto_tfm_ctx(tfm), dst, src);
61 }
62 
63 /* camellia sboxes */
64 __visible const u64 camellia_sp10011110[256] = {
65 	0x7000007070707000ULL, 0x8200008282828200ULL, 0x2c00002c2c2c2c00ULL,
66 	0xec0000ecececec00ULL, 0xb30000b3b3b3b300ULL, 0x2700002727272700ULL,
67 	0xc00000c0c0c0c000ULL, 0xe50000e5e5e5e500ULL, 0xe40000e4e4e4e400ULL,
68 	0x8500008585858500ULL, 0x5700005757575700ULL, 0x3500003535353500ULL,
69 	0xea0000eaeaeaea00ULL, 0x0c00000c0c0c0c00ULL, 0xae0000aeaeaeae00ULL,
70 	0x4100004141414100ULL, 0x2300002323232300ULL, 0xef0000efefefef00ULL,
71 	0x6b00006b6b6b6b00ULL, 0x9300009393939300ULL, 0x4500004545454500ULL,
72 	0x1900001919191900ULL, 0xa50000a5a5a5a500ULL, 0x2100002121212100ULL,
73 	0xed0000edededed00ULL, 0x0e00000e0e0e0e00ULL, 0x4f00004f4f4f4f00ULL,
74 	0x4e00004e4e4e4e00ULL, 0x1d00001d1d1d1d00ULL, 0x6500006565656500ULL,
75 	0x9200009292929200ULL, 0xbd0000bdbdbdbd00ULL, 0x8600008686868600ULL,
76 	0xb80000b8b8b8b800ULL, 0xaf0000afafafaf00ULL, 0x8f00008f8f8f8f00ULL,
77 	0x7c00007c7c7c7c00ULL, 0xeb0000ebebebeb00ULL, 0x1f00001f1f1f1f00ULL,
78 	0xce0000cececece00ULL, 0x3e00003e3e3e3e00ULL, 0x3000003030303000ULL,
79 	0xdc0000dcdcdcdc00ULL, 0x5f00005f5f5f5f00ULL, 0x5e00005e5e5e5e00ULL,
80 	0xc50000c5c5c5c500ULL, 0x0b00000b0b0b0b00ULL, 0x1a00001a1a1a1a00ULL,
81 	0xa60000a6a6a6a600ULL, 0xe10000e1e1e1e100ULL, 0x3900003939393900ULL,
82 	0xca0000cacacaca00ULL, 0xd50000d5d5d5d500ULL, 0x4700004747474700ULL,
83 	0x5d00005d5d5d5d00ULL, 0x3d00003d3d3d3d00ULL, 0xd90000d9d9d9d900ULL,
84 	0x0100000101010100ULL, 0x5a00005a5a5a5a00ULL, 0xd60000d6d6d6d600ULL,
85 	0x5100005151515100ULL, 0x5600005656565600ULL, 0x6c00006c6c6c6c00ULL,
86 	0x4d00004d4d4d4d00ULL, 0x8b00008b8b8b8b00ULL, 0x0d00000d0d0d0d00ULL,
87 	0x9a00009a9a9a9a00ULL, 0x6600006666666600ULL, 0xfb0000fbfbfbfb00ULL,
88 	0xcc0000cccccccc00ULL, 0xb00000b0b0b0b000ULL, 0x2d00002d2d2d2d00ULL,
89 	0x7400007474747400ULL, 0x1200001212121200ULL, 0x2b00002b2b2b2b00ULL,
90 	0x2000002020202000ULL, 0xf00000f0f0f0f000ULL, 0xb10000b1b1b1b100ULL,
91 	0x8400008484848400ULL, 0x9900009999999900ULL, 0xdf0000dfdfdfdf00ULL,
92 	0x4c00004c4c4c4c00ULL, 0xcb0000cbcbcbcb00ULL, 0xc20000c2c2c2c200ULL,
93 	0x3400003434343400ULL, 0x7e00007e7e7e7e00ULL, 0x7600007676767600ULL,
94 	0x0500000505050500ULL, 0x6d00006d6d6d6d00ULL, 0xb70000b7b7b7b700ULL,
95 	0xa90000a9a9a9a900ULL, 0x3100003131313100ULL, 0xd10000d1d1d1d100ULL,
96 	0x1700001717171700ULL, 0x0400000404040400ULL, 0xd70000d7d7d7d700ULL,
97 	0x1400001414141400ULL, 0x5800005858585800ULL, 0x3a00003a3a3a3a00ULL,
98 	0x6100006161616100ULL, 0xde0000dededede00ULL, 0x1b00001b1b1b1b00ULL,
99 	0x1100001111111100ULL, 0x1c00001c1c1c1c00ULL, 0x3200003232323200ULL,
100 	0x0f00000f0f0f0f00ULL, 0x9c00009c9c9c9c00ULL, 0x1600001616161600ULL,
101 	0x5300005353535300ULL, 0x1800001818181800ULL, 0xf20000f2f2f2f200ULL,
102 	0x2200002222222200ULL, 0xfe0000fefefefe00ULL, 0x4400004444444400ULL,
103 	0xcf0000cfcfcfcf00ULL, 0xb20000b2b2b2b200ULL, 0xc30000c3c3c3c300ULL,
104 	0xb50000b5b5b5b500ULL, 0x7a00007a7a7a7a00ULL, 0x9100009191919100ULL,
105 	0x2400002424242400ULL, 0x0800000808080800ULL, 0xe80000e8e8e8e800ULL,
106 	0xa80000a8a8a8a800ULL, 0x6000006060606000ULL, 0xfc0000fcfcfcfc00ULL,
107 	0x6900006969696900ULL, 0x5000005050505000ULL, 0xaa0000aaaaaaaa00ULL,
108 	0xd00000d0d0d0d000ULL, 0xa00000a0a0a0a000ULL, 0x7d00007d7d7d7d00ULL,
109 	0xa10000a1a1a1a100ULL, 0x8900008989898900ULL, 0x6200006262626200ULL,
110 	0x9700009797979700ULL, 0x5400005454545400ULL, 0x5b00005b5b5b5b00ULL,
111 	0x1e00001e1e1e1e00ULL, 0x9500009595959500ULL, 0xe00000e0e0e0e000ULL,
112 	0xff0000ffffffff00ULL, 0x6400006464646400ULL, 0xd20000d2d2d2d200ULL,
113 	0x1000001010101000ULL, 0xc40000c4c4c4c400ULL, 0x0000000000000000ULL,
114 	0x4800004848484800ULL, 0xa30000a3a3a3a300ULL, 0xf70000f7f7f7f700ULL,
115 	0x7500007575757500ULL, 0xdb0000dbdbdbdb00ULL, 0x8a00008a8a8a8a00ULL,
116 	0x0300000303030300ULL, 0xe60000e6e6e6e600ULL, 0xda0000dadadada00ULL,
117 	0x0900000909090900ULL, 0x3f00003f3f3f3f00ULL, 0xdd0000dddddddd00ULL,
118 	0x9400009494949400ULL, 0x8700008787878700ULL, 0x5c00005c5c5c5c00ULL,
119 	0x8300008383838300ULL, 0x0200000202020200ULL, 0xcd0000cdcdcdcd00ULL,
120 	0x4a00004a4a4a4a00ULL, 0x9000009090909000ULL, 0x3300003333333300ULL,
121 	0x7300007373737300ULL, 0x6700006767676700ULL, 0xf60000f6f6f6f600ULL,
122 	0xf30000f3f3f3f300ULL, 0x9d00009d9d9d9d00ULL, 0x7f00007f7f7f7f00ULL,
123 	0xbf0000bfbfbfbf00ULL, 0xe20000e2e2e2e200ULL, 0x5200005252525200ULL,
124 	0x9b00009b9b9b9b00ULL, 0xd80000d8d8d8d800ULL, 0x2600002626262600ULL,
125 	0xc80000c8c8c8c800ULL, 0x3700003737373700ULL, 0xc60000c6c6c6c600ULL,
126 	0x3b00003b3b3b3b00ULL, 0x8100008181818100ULL, 0x9600009696969600ULL,
127 	0x6f00006f6f6f6f00ULL, 0x4b00004b4b4b4b00ULL, 0x1300001313131300ULL,
128 	0xbe0000bebebebe00ULL, 0x6300006363636300ULL, 0x2e00002e2e2e2e00ULL,
129 	0xe90000e9e9e9e900ULL, 0x7900007979797900ULL, 0xa70000a7a7a7a700ULL,
130 	0x8c00008c8c8c8c00ULL, 0x9f00009f9f9f9f00ULL, 0x6e00006e6e6e6e00ULL,
131 	0xbc0000bcbcbcbc00ULL, 0x8e00008e8e8e8e00ULL, 0x2900002929292900ULL,
132 	0xf50000f5f5f5f500ULL, 0xf90000f9f9f9f900ULL, 0xb60000b6b6b6b600ULL,
133 	0x2f00002f2f2f2f00ULL, 0xfd0000fdfdfdfd00ULL, 0xb40000b4b4b4b400ULL,
134 	0x5900005959595900ULL, 0x7800007878787800ULL, 0x9800009898989800ULL,
135 	0x0600000606060600ULL, 0x6a00006a6a6a6a00ULL, 0xe70000e7e7e7e700ULL,
136 	0x4600004646464600ULL, 0x7100007171717100ULL, 0xba0000babababa00ULL,
137 	0xd40000d4d4d4d400ULL, 0x2500002525252500ULL, 0xab0000abababab00ULL,
138 	0x4200004242424200ULL, 0x8800008888888800ULL, 0xa20000a2a2a2a200ULL,
139 	0x8d00008d8d8d8d00ULL, 0xfa0000fafafafa00ULL, 0x7200007272727200ULL,
140 	0x0700000707070700ULL, 0xb90000b9b9b9b900ULL, 0x5500005555555500ULL,
141 	0xf80000f8f8f8f800ULL, 0xee0000eeeeeeee00ULL, 0xac0000acacacac00ULL,
142 	0x0a00000a0a0a0a00ULL, 0x3600003636363600ULL, 0x4900004949494900ULL,
143 	0x2a00002a2a2a2a00ULL, 0x6800006868686800ULL, 0x3c00003c3c3c3c00ULL,
144 	0x3800003838383800ULL, 0xf10000f1f1f1f100ULL, 0xa40000a4a4a4a400ULL,
145 	0x4000004040404000ULL, 0x2800002828282800ULL, 0xd30000d3d3d3d300ULL,
146 	0x7b00007b7b7b7b00ULL, 0xbb0000bbbbbbbb00ULL, 0xc90000c9c9c9c900ULL,
147 	0x4300004343434300ULL, 0xc10000c1c1c1c100ULL, 0x1500001515151500ULL,
148 	0xe30000e3e3e3e300ULL, 0xad0000adadadad00ULL, 0xf40000f4f4f4f400ULL,
149 	0x7700007777777700ULL, 0xc70000c7c7c7c700ULL, 0x8000008080808000ULL,
150 	0x9e00009e9e9e9e00ULL,
151 };
152 
153 __visible const u64 camellia_sp22000222[256] = {
154 	0xe0e0000000e0e0e0ULL, 0x0505000000050505ULL, 0x5858000000585858ULL,
155 	0xd9d9000000d9d9d9ULL, 0x6767000000676767ULL, 0x4e4e0000004e4e4eULL,
156 	0x8181000000818181ULL, 0xcbcb000000cbcbcbULL, 0xc9c9000000c9c9c9ULL,
157 	0x0b0b0000000b0b0bULL, 0xaeae000000aeaeaeULL, 0x6a6a0000006a6a6aULL,
158 	0xd5d5000000d5d5d5ULL, 0x1818000000181818ULL, 0x5d5d0000005d5d5dULL,
159 	0x8282000000828282ULL, 0x4646000000464646ULL, 0xdfdf000000dfdfdfULL,
160 	0xd6d6000000d6d6d6ULL, 0x2727000000272727ULL, 0x8a8a0000008a8a8aULL,
161 	0x3232000000323232ULL, 0x4b4b0000004b4b4bULL, 0x4242000000424242ULL,
162 	0xdbdb000000dbdbdbULL, 0x1c1c0000001c1c1cULL, 0x9e9e0000009e9e9eULL,
163 	0x9c9c0000009c9c9cULL, 0x3a3a0000003a3a3aULL, 0xcaca000000cacacaULL,
164 	0x2525000000252525ULL, 0x7b7b0000007b7b7bULL, 0x0d0d0000000d0d0dULL,
165 	0x7171000000717171ULL, 0x5f5f0000005f5f5fULL, 0x1f1f0000001f1f1fULL,
166 	0xf8f8000000f8f8f8ULL, 0xd7d7000000d7d7d7ULL, 0x3e3e0000003e3e3eULL,
167 	0x9d9d0000009d9d9dULL, 0x7c7c0000007c7c7cULL, 0x6060000000606060ULL,
168 	0xb9b9000000b9b9b9ULL, 0xbebe000000bebebeULL, 0xbcbc000000bcbcbcULL,
169 	0x8b8b0000008b8b8bULL, 0x1616000000161616ULL, 0x3434000000343434ULL,
170 	0x4d4d0000004d4d4dULL, 0xc3c3000000c3c3c3ULL, 0x7272000000727272ULL,
171 	0x9595000000959595ULL, 0xabab000000abababULL, 0x8e8e0000008e8e8eULL,
172 	0xbaba000000bababaULL, 0x7a7a0000007a7a7aULL, 0xb3b3000000b3b3b3ULL,
173 	0x0202000000020202ULL, 0xb4b4000000b4b4b4ULL, 0xadad000000adadadULL,
174 	0xa2a2000000a2a2a2ULL, 0xacac000000acacacULL, 0xd8d8000000d8d8d8ULL,
175 	0x9a9a0000009a9a9aULL, 0x1717000000171717ULL, 0x1a1a0000001a1a1aULL,
176 	0x3535000000353535ULL, 0xcccc000000ccccccULL, 0xf7f7000000f7f7f7ULL,
177 	0x9999000000999999ULL, 0x6161000000616161ULL, 0x5a5a0000005a5a5aULL,
178 	0xe8e8000000e8e8e8ULL, 0x2424000000242424ULL, 0x5656000000565656ULL,
179 	0x4040000000404040ULL, 0xe1e1000000e1e1e1ULL, 0x6363000000636363ULL,
180 	0x0909000000090909ULL, 0x3333000000333333ULL, 0xbfbf000000bfbfbfULL,
181 	0x9898000000989898ULL, 0x9797000000979797ULL, 0x8585000000858585ULL,
182 	0x6868000000686868ULL, 0xfcfc000000fcfcfcULL, 0xecec000000ecececULL,
183 	0x0a0a0000000a0a0aULL, 0xdada000000dadadaULL, 0x6f6f0000006f6f6fULL,
184 	0x5353000000535353ULL, 0x6262000000626262ULL, 0xa3a3000000a3a3a3ULL,
185 	0x2e2e0000002e2e2eULL, 0x0808000000080808ULL, 0xafaf000000afafafULL,
186 	0x2828000000282828ULL, 0xb0b0000000b0b0b0ULL, 0x7474000000747474ULL,
187 	0xc2c2000000c2c2c2ULL, 0xbdbd000000bdbdbdULL, 0x3636000000363636ULL,
188 	0x2222000000222222ULL, 0x3838000000383838ULL, 0x6464000000646464ULL,
189 	0x1e1e0000001e1e1eULL, 0x3939000000393939ULL, 0x2c2c0000002c2c2cULL,
190 	0xa6a6000000a6a6a6ULL, 0x3030000000303030ULL, 0xe5e5000000e5e5e5ULL,
191 	0x4444000000444444ULL, 0xfdfd000000fdfdfdULL, 0x8888000000888888ULL,
192 	0x9f9f0000009f9f9fULL, 0x6565000000656565ULL, 0x8787000000878787ULL,
193 	0x6b6b0000006b6b6bULL, 0xf4f4000000f4f4f4ULL, 0x2323000000232323ULL,
194 	0x4848000000484848ULL, 0x1010000000101010ULL, 0xd1d1000000d1d1d1ULL,
195 	0x5151000000515151ULL, 0xc0c0000000c0c0c0ULL, 0xf9f9000000f9f9f9ULL,
196 	0xd2d2000000d2d2d2ULL, 0xa0a0000000a0a0a0ULL, 0x5555000000555555ULL,
197 	0xa1a1000000a1a1a1ULL, 0x4141000000414141ULL, 0xfafa000000fafafaULL,
198 	0x4343000000434343ULL, 0x1313000000131313ULL, 0xc4c4000000c4c4c4ULL,
199 	0x2f2f0000002f2f2fULL, 0xa8a8000000a8a8a8ULL, 0xb6b6000000b6b6b6ULL,
200 	0x3c3c0000003c3c3cULL, 0x2b2b0000002b2b2bULL, 0xc1c1000000c1c1c1ULL,
201 	0xffff000000ffffffULL, 0xc8c8000000c8c8c8ULL, 0xa5a5000000a5a5a5ULL,
202 	0x2020000000202020ULL, 0x8989000000898989ULL, 0x0000000000000000ULL,
203 	0x9090000000909090ULL, 0x4747000000474747ULL, 0xefef000000efefefULL,
204 	0xeaea000000eaeaeaULL, 0xb7b7000000b7b7b7ULL, 0x1515000000151515ULL,
205 	0x0606000000060606ULL, 0xcdcd000000cdcdcdULL, 0xb5b5000000b5b5b5ULL,
206 	0x1212000000121212ULL, 0x7e7e0000007e7e7eULL, 0xbbbb000000bbbbbbULL,
207 	0x2929000000292929ULL, 0x0f0f0000000f0f0fULL, 0xb8b8000000b8b8b8ULL,
208 	0x0707000000070707ULL, 0x0404000000040404ULL, 0x9b9b0000009b9b9bULL,
209 	0x9494000000949494ULL, 0x2121000000212121ULL, 0x6666000000666666ULL,
210 	0xe6e6000000e6e6e6ULL, 0xcece000000cececeULL, 0xeded000000edededULL,
211 	0xe7e7000000e7e7e7ULL, 0x3b3b0000003b3b3bULL, 0xfefe000000fefefeULL,
212 	0x7f7f0000007f7f7fULL, 0xc5c5000000c5c5c5ULL, 0xa4a4000000a4a4a4ULL,
213 	0x3737000000373737ULL, 0xb1b1000000b1b1b1ULL, 0x4c4c0000004c4c4cULL,
214 	0x9191000000919191ULL, 0x6e6e0000006e6e6eULL, 0x8d8d0000008d8d8dULL,
215 	0x7676000000767676ULL, 0x0303000000030303ULL, 0x2d2d0000002d2d2dULL,
216 	0xdede000000dededeULL, 0x9696000000969696ULL, 0x2626000000262626ULL,
217 	0x7d7d0000007d7d7dULL, 0xc6c6000000c6c6c6ULL, 0x5c5c0000005c5c5cULL,
218 	0xd3d3000000d3d3d3ULL, 0xf2f2000000f2f2f2ULL, 0x4f4f0000004f4f4fULL,
219 	0x1919000000191919ULL, 0x3f3f0000003f3f3fULL, 0xdcdc000000dcdcdcULL,
220 	0x7979000000797979ULL, 0x1d1d0000001d1d1dULL, 0x5252000000525252ULL,
221 	0xebeb000000ebebebULL, 0xf3f3000000f3f3f3ULL, 0x6d6d0000006d6d6dULL,
222 	0x5e5e0000005e5e5eULL, 0xfbfb000000fbfbfbULL, 0x6969000000696969ULL,
223 	0xb2b2000000b2b2b2ULL, 0xf0f0000000f0f0f0ULL, 0x3131000000313131ULL,
224 	0x0c0c0000000c0c0cULL, 0xd4d4000000d4d4d4ULL, 0xcfcf000000cfcfcfULL,
225 	0x8c8c0000008c8c8cULL, 0xe2e2000000e2e2e2ULL, 0x7575000000757575ULL,
226 	0xa9a9000000a9a9a9ULL, 0x4a4a0000004a4a4aULL, 0x5757000000575757ULL,
227 	0x8484000000848484ULL, 0x1111000000111111ULL, 0x4545000000454545ULL,
228 	0x1b1b0000001b1b1bULL, 0xf5f5000000f5f5f5ULL, 0xe4e4000000e4e4e4ULL,
229 	0x0e0e0000000e0e0eULL, 0x7373000000737373ULL, 0xaaaa000000aaaaaaULL,
230 	0xf1f1000000f1f1f1ULL, 0xdddd000000ddddddULL, 0x5959000000595959ULL,
231 	0x1414000000141414ULL, 0x6c6c0000006c6c6cULL, 0x9292000000929292ULL,
232 	0x5454000000545454ULL, 0xd0d0000000d0d0d0ULL, 0x7878000000787878ULL,
233 	0x7070000000707070ULL, 0xe3e3000000e3e3e3ULL, 0x4949000000494949ULL,
234 	0x8080000000808080ULL, 0x5050000000505050ULL, 0xa7a7000000a7a7a7ULL,
235 	0xf6f6000000f6f6f6ULL, 0x7777000000777777ULL, 0x9393000000939393ULL,
236 	0x8686000000868686ULL, 0x8383000000838383ULL, 0x2a2a0000002a2a2aULL,
237 	0xc7c7000000c7c7c7ULL, 0x5b5b0000005b5b5bULL, 0xe9e9000000e9e9e9ULL,
238 	0xeeee000000eeeeeeULL, 0x8f8f0000008f8f8fULL, 0x0101000000010101ULL,
239 	0x3d3d0000003d3d3dULL,
240 };
241 
242 __visible const u64 camellia_sp03303033[256] = {
243 	0x0038380038003838ULL, 0x0041410041004141ULL, 0x0016160016001616ULL,
244 	0x0076760076007676ULL, 0x00d9d900d900d9d9ULL, 0x0093930093009393ULL,
245 	0x0060600060006060ULL, 0x00f2f200f200f2f2ULL, 0x0072720072007272ULL,
246 	0x00c2c200c200c2c2ULL, 0x00abab00ab00ababULL, 0x009a9a009a009a9aULL,
247 	0x0075750075007575ULL, 0x0006060006000606ULL, 0x0057570057005757ULL,
248 	0x00a0a000a000a0a0ULL, 0x0091910091009191ULL, 0x00f7f700f700f7f7ULL,
249 	0x00b5b500b500b5b5ULL, 0x00c9c900c900c9c9ULL, 0x00a2a200a200a2a2ULL,
250 	0x008c8c008c008c8cULL, 0x00d2d200d200d2d2ULL, 0x0090900090009090ULL,
251 	0x00f6f600f600f6f6ULL, 0x0007070007000707ULL, 0x00a7a700a700a7a7ULL,
252 	0x0027270027002727ULL, 0x008e8e008e008e8eULL, 0x00b2b200b200b2b2ULL,
253 	0x0049490049004949ULL, 0x00dede00de00dedeULL, 0x0043430043004343ULL,
254 	0x005c5c005c005c5cULL, 0x00d7d700d700d7d7ULL, 0x00c7c700c700c7c7ULL,
255 	0x003e3e003e003e3eULL, 0x00f5f500f500f5f5ULL, 0x008f8f008f008f8fULL,
256 	0x0067670067006767ULL, 0x001f1f001f001f1fULL, 0x0018180018001818ULL,
257 	0x006e6e006e006e6eULL, 0x00afaf00af00afafULL, 0x002f2f002f002f2fULL,
258 	0x00e2e200e200e2e2ULL, 0x0085850085008585ULL, 0x000d0d000d000d0dULL,
259 	0x0053530053005353ULL, 0x00f0f000f000f0f0ULL, 0x009c9c009c009c9cULL,
260 	0x0065650065006565ULL, 0x00eaea00ea00eaeaULL, 0x00a3a300a300a3a3ULL,
261 	0x00aeae00ae00aeaeULL, 0x009e9e009e009e9eULL, 0x00ecec00ec00ececULL,
262 	0x0080800080008080ULL, 0x002d2d002d002d2dULL, 0x006b6b006b006b6bULL,
263 	0x00a8a800a800a8a8ULL, 0x002b2b002b002b2bULL, 0x0036360036003636ULL,
264 	0x00a6a600a600a6a6ULL, 0x00c5c500c500c5c5ULL, 0x0086860086008686ULL,
265 	0x004d4d004d004d4dULL, 0x0033330033003333ULL, 0x00fdfd00fd00fdfdULL,
266 	0x0066660066006666ULL, 0x0058580058005858ULL, 0x0096960096009696ULL,
267 	0x003a3a003a003a3aULL, 0x0009090009000909ULL, 0x0095950095009595ULL,
268 	0x0010100010001010ULL, 0x0078780078007878ULL, 0x00d8d800d800d8d8ULL,
269 	0x0042420042004242ULL, 0x00cccc00cc00ccccULL, 0x00efef00ef00efefULL,
270 	0x0026260026002626ULL, 0x00e5e500e500e5e5ULL, 0x0061610061006161ULL,
271 	0x001a1a001a001a1aULL, 0x003f3f003f003f3fULL, 0x003b3b003b003b3bULL,
272 	0x0082820082008282ULL, 0x00b6b600b600b6b6ULL, 0x00dbdb00db00dbdbULL,
273 	0x00d4d400d400d4d4ULL, 0x0098980098009898ULL, 0x00e8e800e800e8e8ULL,
274 	0x008b8b008b008b8bULL, 0x0002020002000202ULL, 0x00ebeb00eb00ebebULL,
275 	0x000a0a000a000a0aULL, 0x002c2c002c002c2cULL, 0x001d1d001d001d1dULL,
276 	0x00b0b000b000b0b0ULL, 0x006f6f006f006f6fULL, 0x008d8d008d008d8dULL,
277 	0x0088880088008888ULL, 0x000e0e000e000e0eULL, 0x0019190019001919ULL,
278 	0x0087870087008787ULL, 0x004e4e004e004e4eULL, 0x000b0b000b000b0bULL,
279 	0x00a9a900a900a9a9ULL, 0x000c0c000c000c0cULL, 0x0079790079007979ULL,
280 	0x0011110011001111ULL, 0x007f7f007f007f7fULL, 0x0022220022002222ULL,
281 	0x00e7e700e700e7e7ULL, 0x0059590059005959ULL, 0x00e1e100e100e1e1ULL,
282 	0x00dada00da00dadaULL, 0x003d3d003d003d3dULL, 0x00c8c800c800c8c8ULL,
283 	0x0012120012001212ULL, 0x0004040004000404ULL, 0x0074740074007474ULL,
284 	0x0054540054005454ULL, 0x0030300030003030ULL, 0x007e7e007e007e7eULL,
285 	0x00b4b400b400b4b4ULL, 0x0028280028002828ULL, 0x0055550055005555ULL,
286 	0x0068680068006868ULL, 0x0050500050005050ULL, 0x00bebe00be00bebeULL,
287 	0x00d0d000d000d0d0ULL, 0x00c4c400c400c4c4ULL, 0x0031310031003131ULL,
288 	0x00cbcb00cb00cbcbULL, 0x002a2a002a002a2aULL, 0x00adad00ad00adadULL,
289 	0x000f0f000f000f0fULL, 0x00caca00ca00cacaULL, 0x0070700070007070ULL,
290 	0x00ffff00ff00ffffULL, 0x0032320032003232ULL, 0x0069690069006969ULL,
291 	0x0008080008000808ULL, 0x0062620062006262ULL, 0x0000000000000000ULL,
292 	0x0024240024002424ULL, 0x00d1d100d100d1d1ULL, 0x00fbfb00fb00fbfbULL,
293 	0x00baba00ba00babaULL, 0x00eded00ed00ededULL, 0x0045450045004545ULL,
294 	0x0081810081008181ULL, 0x0073730073007373ULL, 0x006d6d006d006d6dULL,
295 	0x0084840084008484ULL, 0x009f9f009f009f9fULL, 0x00eeee00ee00eeeeULL,
296 	0x004a4a004a004a4aULL, 0x00c3c300c300c3c3ULL, 0x002e2e002e002e2eULL,
297 	0x00c1c100c100c1c1ULL, 0x0001010001000101ULL, 0x00e6e600e600e6e6ULL,
298 	0x0025250025002525ULL, 0x0048480048004848ULL, 0x0099990099009999ULL,
299 	0x00b9b900b900b9b9ULL, 0x00b3b300b300b3b3ULL, 0x007b7b007b007b7bULL,
300 	0x00f9f900f900f9f9ULL, 0x00cece00ce00ceceULL, 0x00bfbf00bf00bfbfULL,
301 	0x00dfdf00df00dfdfULL, 0x0071710071007171ULL, 0x0029290029002929ULL,
302 	0x00cdcd00cd00cdcdULL, 0x006c6c006c006c6cULL, 0x0013130013001313ULL,
303 	0x0064640064006464ULL, 0x009b9b009b009b9bULL, 0x0063630063006363ULL,
304 	0x009d9d009d009d9dULL, 0x00c0c000c000c0c0ULL, 0x004b4b004b004b4bULL,
305 	0x00b7b700b700b7b7ULL, 0x00a5a500a500a5a5ULL, 0x0089890089008989ULL,
306 	0x005f5f005f005f5fULL, 0x00b1b100b100b1b1ULL, 0x0017170017001717ULL,
307 	0x00f4f400f400f4f4ULL, 0x00bcbc00bc00bcbcULL, 0x00d3d300d300d3d3ULL,
308 	0x0046460046004646ULL, 0x00cfcf00cf00cfcfULL, 0x0037370037003737ULL,
309 	0x005e5e005e005e5eULL, 0x0047470047004747ULL, 0x0094940094009494ULL,
310 	0x00fafa00fa00fafaULL, 0x00fcfc00fc00fcfcULL, 0x005b5b005b005b5bULL,
311 	0x0097970097009797ULL, 0x00fefe00fe00fefeULL, 0x005a5a005a005a5aULL,
312 	0x00acac00ac00acacULL, 0x003c3c003c003c3cULL, 0x004c4c004c004c4cULL,
313 	0x0003030003000303ULL, 0x0035350035003535ULL, 0x00f3f300f300f3f3ULL,
314 	0x0023230023002323ULL, 0x00b8b800b800b8b8ULL, 0x005d5d005d005d5dULL,
315 	0x006a6a006a006a6aULL, 0x0092920092009292ULL, 0x00d5d500d500d5d5ULL,
316 	0x0021210021002121ULL, 0x0044440044004444ULL, 0x0051510051005151ULL,
317 	0x00c6c600c600c6c6ULL, 0x007d7d007d007d7dULL, 0x0039390039003939ULL,
318 	0x0083830083008383ULL, 0x00dcdc00dc00dcdcULL, 0x00aaaa00aa00aaaaULL,
319 	0x007c7c007c007c7cULL, 0x0077770077007777ULL, 0x0056560056005656ULL,
320 	0x0005050005000505ULL, 0x001b1b001b001b1bULL, 0x00a4a400a400a4a4ULL,
321 	0x0015150015001515ULL, 0x0034340034003434ULL, 0x001e1e001e001e1eULL,
322 	0x001c1c001c001c1cULL, 0x00f8f800f800f8f8ULL, 0x0052520052005252ULL,
323 	0x0020200020002020ULL, 0x0014140014001414ULL, 0x00e9e900e900e9e9ULL,
324 	0x00bdbd00bd00bdbdULL, 0x00dddd00dd00ddddULL, 0x00e4e400e400e4e4ULL,
325 	0x00a1a100a100a1a1ULL, 0x00e0e000e000e0e0ULL, 0x008a8a008a008a8aULL,
326 	0x00f1f100f100f1f1ULL, 0x00d6d600d600d6d6ULL, 0x007a7a007a007a7aULL,
327 	0x00bbbb00bb00bbbbULL, 0x00e3e300e300e3e3ULL, 0x0040400040004040ULL,
328 	0x004f4f004f004f4fULL,
329 };
330 
331 __visible const u64 camellia_sp00444404[256] = {
332 	0x0000707070700070ULL, 0x00002c2c2c2c002cULL, 0x0000b3b3b3b300b3ULL,
333 	0x0000c0c0c0c000c0ULL, 0x0000e4e4e4e400e4ULL, 0x0000575757570057ULL,
334 	0x0000eaeaeaea00eaULL, 0x0000aeaeaeae00aeULL, 0x0000232323230023ULL,
335 	0x00006b6b6b6b006bULL, 0x0000454545450045ULL, 0x0000a5a5a5a500a5ULL,
336 	0x0000edededed00edULL, 0x00004f4f4f4f004fULL, 0x00001d1d1d1d001dULL,
337 	0x0000929292920092ULL, 0x0000868686860086ULL, 0x0000afafafaf00afULL,
338 	0x00007c7c7c7c007cULL, 0x00001f1f1f1f001fULL, 0x00003e3e3e3e003eULL,
339 	0x0000dcdcdcdc00dcULL, 0x00005e5e5e5e005eULL, 0x00000b0b0b0b000bULL,
340 	0x0000a6a6a6a600a6ULL, 0x0000393939390039ULL, 0x0000d5d5d5d500d5ULL,
341 	0x00005d5d5d5d005dULL, 0x0000d9d9d9d900d9ULL, 0x00005a5a5a5a005aULL,
342 	0x0000515151510051ULL, 0x00006c6c6c6c006cULL, 0x00008b8b8b8b008bULL,
343 	0x00009a9a9a9a009aULL, 0x0000fbfbfbfb00fbULL, 0x0000b0b0b0b000b0ULL,
344 	0x0000747474740074ULL, 0x00002b2b2b2b002bULL, 0x0000f0f0f0f000f0ULL,
345 	0x0000848484840084ULL, 0x0000dfdfdfdf00dfULL, 0x0000cbcbcbcb00cbULL,
346 	0x0000343434340034ULL, 0x0000767676760076ULL, 0x00006d6d6d6d006dULL,
347 	0x0000a9a9a9a900a9ULL, 0x0000d1d1d1d100d1ULL, 0x0000040404040004ULL,
348 	0x0000141414140014ULL, 0x00003a3a3a3a003aULL, 0x0000dededede00deULL,
349 	0x0000111111110011ULL, 0x0000323232320032ULL, 0x00009c9c9c9c009cULL,
350 	0x0000535353530053ULL, 0x0000f2f2f2f200f2ULL, 0x0000fefefefe00feULL,
351 	0x0000cfcfcfcf00cfULL, 0x0000c3c3c3c300c3ULL, 0x00007a7a7a7a007aULL,
352 	0x0000242424240024ULL, 0x0000e8e8e8e800e8ULL, 0x0000606060600060ULL,
353 	0x0000696969690069ULL, 0x0000aaaaaaaa00aaULL, 0x0000a0a0a0a000a0ULL,
354 	0x0000a1a1a1a100a1ULL, 0x0000626262620062ULL, 0x0000545454540054ULL,
355 	0x00001e1e1e1e001eULL, 0x0000e0e0e0e000e0ULL, 0x0000646464640064ULL,
356 	0x0000101010100010ULL, 0x0000000000000000ULL, 0x0000a3a3a3a300a3ULL,
357 	0x0000757575750075ULL, 0x00008a8a8a8a008aULL, 0x0000e6e6e6e600e6ULL,
358 	0x0000090909090009ULL, 0x0000dddddddd00ddULL, 0x0000878787870087ULL,
359 	0x0000838383830083ULL, 0x0000cdcdcdcd00cdULL, 0x0000909090900090ULL,
360 	0x0000737373730073ULL, 0x0000f6f6f6f600f6ULL, 0x00009d9d9d9d009dULL,
361 	0x0000bfbfbfbf00bfULL, 0x0000525252520052ULL, 0x0000d8d8d8d800d8ULL,
362 	0x0000c8c8c8c800c8ULL, 0x0000c6c6c6c600c6ULL, 0x0000818181810081ULL,
363 	0x00006f6f6f6f006fULL, 0x0000131313130013ULL, 0x0000636363630063ULL,
364 	0x0000e9e9e9e900e9ULL, 0x0000a7a7a7a700a7ULL, 0x00009f9f9f9f009fULL,
365 	0x0000bcbcbcbc00bcULL, 0x0000292929290029ULL, 0x0000f9f9f9f900f9ULL,
366 	0x00002f2f2f2f002fULL, 0x0000b4b4b4b400b4ULL, 0x0000787878780078ULL,
367 	0x0000060606060006ULL, 0x0000e7e7e7e700e7ULL, 0x0000717171710071ULL,
368 	0x0000d4d4d4d400d4ULL, 0x0000abababab00abULL, 0x0000888888880088ULL,
369 	0x00008d8d8d8d008dULL, 0x0000727272720072ULL, 0x0000b9b9b9b900b9ULL,
370 	0x0000f8f8f8f800f8ULL, 0x0000acacacac00acULL, 0x0000363636360036ULL,
371 	0x00002a2a2a2a002aULL, 0x00003c3c3c3c003cULL, 0x0000f1f1f1f100f1ULL,
372 	0x0000404040400040ULL, 0x0000d3d3d3d300d3ULL, 0x0000bbbbbbbb00bbULL,
373 	0x0000434343430043ULL, 0x0000151515150015ULL, 0x0000adadadad00adULL,
374 	0x0000777777770077ULL, 0x0000808080800080ULL, 0x0000828282820082ULL,
375 	0x0000ecececec00ecULL, 0x0000272727270027ULL, 0x0000e5e5e5e500e5ULL,
376 	0x0000858585850085ULL, 0x0000353535350035ULL, 0x00000c0c0c0c000cULL,
377 	0x0000414141410041ULL, 0x0000efefefef00efULL, 0x0000939393930093ULL,
378 	0x0000191919190019ULL, 0x0000212121210021ULL, 0x00000e0e0e0e000eULL,
379 	0x00004e4e4e4e004eULL, 0x0000656565650065ULL, 0x0000bdbdbdbd00bdULL,
380 	0x0000b8b8b8b800b8ULL, 0x00008f8f8f8f008fULL, 0x0000ebebebeb00ebULL,
381 	0x0000cececece00ceULL, 0x0000303030300030ULL, 0x00005f5f5f5f005fULL,
382 	0x0000c5c5c5c500c5ULL, 0x00001a1a1a1a001aULL, 0x0000e1e1e1e100e1ULL,
383 	0x0000cacacaca00caULL, 0x0000474747470047ULL, 0x00003d3d3d3d003dULL,
384 	0x0000010101010001ULL, 0x0000d6d6d6d600d6ULL, 0x0000565656560056ULL,
385 	0x00004d4d4d4d004dULL, 0x00000d0d0d0d000dULL, 0x0000666666660066ULL,
386 	0x0000cccccccc00ccULL, 0x00002d2d2d2d002dULL, 0x0000121212120012ULL,
387 	0x0000202020200020ULL, 0x0000b1b1b1b100b1ULL, 0x0000999999990099ULL,
388 	0x00004c4c4c4c004cULL, 0x0000c2c2c2c200c2ULL, 0x00007e7e7e7e007eULL,
389 	0x0000050505050005ULL, 0x0000b7b7b7b700b7ULL, 0x0000313131310031ULL,
390 	0x0000171717170017ULL, 0x0000d7d7d7d700d7ULL, 0x0000585858580058ULL,
391 	0x0000616161610061ULL, 0x00001b1b1b1b001bULL, 0x00001c1c1c1c001cULL,
392 	0x00000f0f0f0f000fULL, 0x0000161616160016ULL, 0x0000181818180018ULL,
393 	0x0000222222220022ULL, 0x0000444444440044ULL, 0x0000b2b2b2b200b2ULL,
394 	0x0000b5b5b5b500b5ULL, 0x0000919191910091ULL, 0x0000080808080008ULL,
395 	0x0000a8a8a8a800a8ULL, 0x0000fcfcfcfc00fcULL, 0x0000505050500050ULL,
396 	0x0000d0d0d0d000d0ULL, 0x00007d7d7d7d007dULL, 0x0000898989890089ULL,
397 	0x0000979797970097ULL, 0x00005b5b5b5b005bULL, 0x0000959595950095ULL,
398 	0x0000ffffffff00ffULL, 0x0000d2d2d2d200d2ULL, 0x0000c4c4c4c400c4ULL,
399 	0x0000484848480048ULL, 0x0000f7f7f7f700f7ULL, 0x0000dbdbdbdb00dbULL,
400 	0x0000030303030003ULL, 0x0000dadadada00daULL, 0x00003f3f3f3f003fULL,
401 	0x0000949494940094ULL, 0x00005c5c5c5c005cULL, 0x0000020202020002ULL,
402 	0x00004a4a4a4a004aULL, 0x0000333333330033ULL, 0x0000676767670067ULL,
403 	0x0000f3f3f3f300f3ULL, 0x00007f7f7f7f007fULL, 0x0000e2e2e2e200e2ULL,
404 	0x00009b9b9b9b009bULL, 0x0000262626260026ULL, 0x0000373737370037ULL,
405 	0x00003b3b3b3b003bULL, 0x0000969696960096ULL, 0x00004b4b4b4b004bULL,
406 	0x0000bebebebe00beULL, 0x00002e2e2e2e002eULL, 0x0000797979790079ULL,
407 	0x00008c8c8c8c008cULL, 0x00006e6e6e6e006eULL, 0x00008e8e8e8e008eULL,
408 	0x0000f5f5f5f500f5ULL, 0x0000b6b6b6b600b6ULL, 0x0000fdfdfdfd00fdULL,
409 	0x0000595959590059ULL, 0x0000989898980098ULL, 0x00006a6a6a6a006aULL,
410 	0x0000464646460046ULL, 0x0000babababa00baULL, 0x0000252525250025ULL,
411 	0x0000424242420042ULL, 0x0000a2a2a2a200a2ULL, 0x0000fafafafa00faULL,
412 	0x0000070707070007ULL, 0x0000555555550055ULL, 0x0000eeeeeeee00eeULL,
413 	0x00000a0a0a0a000aULL, 0x0000494949490049ULL, 0x0000686868680068ULL,
414 	0x0000383838380038ULL, 0x0000a4a4a4a400a4ULL, 0x0000282828280028ULL,
415 	0x00007b7b7b7b007bULL, 0x0000c9c9c9c900c9ULL, 0x0000c1c1c1c100c1ULL,
416 	0x0000e3e3e3e300e3ULL, 0x0000f4f4f4f400f4ULL, 0x0000c7c7c7c700c7ULL,
417 	0x00009e9e9e9e009eULL,
418 };
419 
420 __visible const u64 camellia_sp02220222[256] = {
421 	0x00e0e0e000e0e0e0ULL, 0x0005050500050505ULL, 0x0058585800585858ULL,
422 	0x00d9d9d900d9d9d9ULL, 0x0067676700676767ULL, 0x004e4e4e004e4e4eULL,
423 	0x0081818100818181ULL, 0x00cbcbcb00cbcbcbULL, 0x00c9c9c900c9c9c9ULL,
424 	0x000b0b0b000b0b0bULL, 0x00aeaeae00aeaeaeULL, 0x006a6a6a006a6a6aULL,
425 	0x00d5d5d500d5d5d5ULL, 0x0018181800181818ULL, 0x005d5d5d005d5d5dULL,
426 	0x0082828200828282ULL, 0x0046464600464646ULL, 0x00dfdfdf00dfdfdfULL,
427 	0x00d6d6d600d6d6d6ULL, 0x0027272700272727ULL, 0x008a8a8a008a8a8aULL,
428 	0x0032323200323232ULL, 0x004b4b4b004b4b4bULL, 0x0042424200424242ULL,
429 	0x00dbdbdb00dbdbdbULL, 0x001c1c1c001c1c1cULL, 0x009e9e9e009e9e9eULL,
430 	0x009c9c9c009c9c9cULL, 0x003a3a3a003a3a3aULL, 0x00cacaca00cacacaULL,
431 	0x0025252500252525ULL, 0x007b7b7b007b7b7bULL, 0x000d0d0d000d0d0dULL,
432 	0x0071717100717171ULL, 0x005f5f5f005f5f5fULL, 0x001f1f1f001f1f1fULL,
433 	0x00f8f8f800f8f8f8ULL, 0x00d7d7d700d7d7d7ULL, 0x003e3e3e003e3e3eULL,
434 	0x009d9d9d009d9d9dULL, 0x007c7c7c007c7c7cULL, 0x0060606000606060ULL,
435 	0x00b9b9b900b9b9b9ULL, 0x00bebebe00bebebeULL, 0x00bcbcbc00bcbcbcULL,
436 	0x008b8b8b008b8b8bULL, 0x0016161600161616ULL, 0x0034343400343434ULL,
437 	0x004d4d4d004d4d4dULL, 0x00c3c3c300c3c3c3ULL, 0x0072727200727272ULL,
438 	0x0095959500959595ULL, 0x00ababab00abababULL, 0x008e8e8e008e8e8eULL,
439 	0x00bababa00bababaULL, 0x007a7a7a007a7a7aULL, 0x00b3b3b300b3b3b3ULL,
440 	0x0002020200020202ULL, 0x00b4b4b400b4b4b4ULL, 0x00adadad00adadadULL,
441 	0x00a2a2a200a2a2a2ULL, 0x00acacac00acacacULL, 0x00d8d8d800d8d8d8ULL,
442 	0x009a9a9a009a9a9aULL, 0x0017171700171717ULL, 0x001a1a1a001a1a1aULL,
443 	0x0035353500353535ULL, 0x00cccccc00ccccccULL, 0x00f7f7f700f7f7f7ULL,
444 	0x0099999900999999ULL, 0x0061616100616161ULL, 0x005a5a5a005a5a5aULL,
445 	0x00e8e8e800e8e8e8ULL, 0x0024242400242424ULL, 0x0056565600565656ULL,
446 	0x0040404000404040ULL, 0x00e1e1e100e1e1e1ULL, 0x0063636300636363ULL,
447 	0x0009090900090909ULL, 0x0033333300333333ULL, 0x00bfbfbf00bfbfbfULL,
448 	0x0098989800989898ULL, 0x0097979700979797ULL, 0x0085858500858585ULL,
449 	0x0068686800686868ULL, 0x00fcfcfc00fcfcfcULL, 0x00ececec00ecececULL,
450 	0x000a0a0a000a0a0aULL, 0x00dadada00dadadaULL, 0x006f6f6f006f6f6fULL,
451 	0x0053535300535353ULL, 0x0062626200626262ULL, 0x00a3a3a300a3a3a3ULL,
452 	0x002e2e2e002e2e2eULL, 0x0008080800080808ULL, 0x00afafaf00afafafULL,
453 	0x0028282800282828ULL, 0x00b0b0b000b0b0b0ULL, 0x0074747400747474ULL,
454 	0x00c2c2c200c2c2c2ULL, 0x00bdbdbd00bdbdbdULL, 0x0036363600363636ULL,
455 	0x0022222200222222ULL, 0x0038383800383838ULL, 0x0064646400646464ULL,
456 	0x001e1e1e001e1e1eULL, 0x0039393900393939ULL, 0x002c2c2c002c2c2cULL,
457 	0x00a6a6a600a6a6a6ULL, 0x0030303000303030ULL, 0x00e5e5e500e5e5e5ULL,
458 	0x0044444400444444ULL, 0x00fdfdfd00fdfdfdULL, 0x0088888800888888ULL,
459 	0x009f9f9f009f9f9fULL, 0x0065656500656565ULL, 0x0087878700878787ULL,
460 	0x006b6b6b006b6b6bULL, 0x00f4f4f400f4f4f4ULL, 0x0023232300232323ULL,
461 	0x0048484800484848ULL, 0x0010101000101010ULL, 0x00d1d1d100d1d1d1ULL,
462 	0x0051515100515151ULL, 0x00c0c0c000c0c0c0ULL, 0x00f9f9f900f9f9f9ULL,
463 	0x00d2d2d200d2d2d2ULL, 0x00a0a0a000a0a0a0ULL, 0x0055555500555555ULL,
464 	0x00a1a1a100a1a1a1ULL, 0x0041414100414141ULL, 0x00fafafa00fafafaULL,
465 	0x0043434300434343ULL, 0x0013131300131313ULL, 0x00c4c4c400c4c4c4ULL,
466 	0x002f2f2f002f2f2fULL, 0x00a8a8a800a8a8a8ULL, 0x00b6b6b600b6b6b6ULL,
467 	0x003c3c3c003c3c3cULL, 0x002b2b2b002b2b2bULL, 0x00c1c1c100c1c1c1ULL,
468 	0x00ffffff00ffffffULL, 0x00c8c8c800c8c8c8ULL, 0x00a5a5a500a5a5a5ULL,
469 	0x0020202000202020ULL, 0x0089898900898989ULL, 0x0000000000000000ULL,
470 	0x0090909000909090ULL, 0x0047474700474747ULL, 0x00efefef00efefefULL,
471 	0x00eaeaea00eaeaeaULL, 0x00b7b7b700b7b7b7ULL, 0x0015151500151515ULL,
472 	0x0006060600060606ULL, 0x00cdcdcd00cdcdcdULL, 0x00b5b5b500b5b5b5ULL,
473 	0x0012121200121212ULL, 0x007e7e7e007e7e7eULL, 0x00bbbbbb00bbbbbbULL,
474 	0x0029292900292929ULL, 0x000f0f0f000f0f0fULL, 0x00b8b8b800b8b8b8ULL,
475 	0x0007070700070707ULL, 0x0004040400040404ULL, 0x009b9b9b009b9b9bULL,
476 	0x0094949400949494ULL, 0x0021212100212121ULL, 0x0066666600666666ULL,
477 	0x00e6e6e600e6e6e6ULL, 0x00cecece00cececeULL, 0x00ededed00edededULL,
478 	0x00e7e7e700e7e7e7ULL, 0x003b3b3b003b3b3bULL, 0x00fefefe00fefefeULL,
479 	0x007f7f7f007f7f7fULL, 0x00c5c5c500c5c5c5ULL, 0x00a4a4a400a4a4a4ULL,
480 	0x0037373700373737ULL, 0x00b1b1b100b1b1b1ULL, 0x004c4c4c004c4c4cULL,
481 	0x0091919100919191ULL, 0x006e6e6e006e6e6eULL, 0x008d8d8d008d8d8dULL,
482 	0x0076767600767676ULL, 0x0003030300030303ULL, 0x002d2d2d002d2d2dULL,
483 	0x00dedede00dededeULL, 0x0096969600969696ULL, 0x0026262600262626ULL,
484 	0x007d7d7d007d7d7dULL, 0x00c6c6c600c6c6c6ULL, 0x005c5c5c005c5c5cULL,
485 	0x00d3d3d300d3d3d3ULL, 0x00f2f2f200f2f2f2ULL, 0x004f4f4f004f4f4fULL,
486 	0x0019191900191919ULL, 0x003f3f3f003f3f3fULL, 0x00dcdcdc00dcdcdcULL,
487 	0x0079797900797979ULL, 0x001d1d1d001d1d1dULL, 0x0052525200525252ULL,
488 	0x00ebebeb00ebebebULL, 0x00f3f3f300f3f3f3ULL, 0x006d6d6d006d6d6dULL,
489 	0x005e5e5e005e5e5eULL, 0x00fbfbfb00fbfbfbULL, 0x0069696900696969ULL,
490 	0x00b2b2b200b2b2b2ULL, 0x00f0f0f000f0f0f0ULL, 0x0031313100313131ULL,
491 	0x000c0c0c000c0c0cULL, 0x00d4d4d400d4d4d4ULL, 0x00cfcfcf00cfcfcfULL,
492 	0x008c8c8c008c8c8cULL, 0x00e2e2e200e2e2e2ULL, 0x0075757500757575ULL,
493 	0x00a9a9a900a9a9a9ULL, 0x004a4a4a004a4a4aULL, 0x0057575700575757ULL,
494 	0x0084848400848484ULL, 0x0011111100111111ULL, 0x0045454500454545ULL,
495 	0x001b1b1b001b1b1bULL, 0x00f5f5f500f5f5f5ULL, 0x00e4e4e400e4e4e4ULL,
496 	0x000e0e0e000e0e0eULL, 0x0073737300737373ULL, 0x00aaaaaa00aaaaaaULL,
497 	0x00f1f1f100f1f1f1ULL, 0x00dddddd00ddddddULL, 0x0059595900595959ULL,
498 	0x0014141400141414ULL, 0x006c6c6c006c6c6cULL, 0x0092929200929292ULL,
499 	0x0054545400545454ULL, 0x00d0d0d000d0d0d0ULL, 0x0078787800787878ULL,
500 	0x0070707000707070ULL, 0x00e3e3e300e3e3e3ULL, 0x0049494900494949ULL,
501 	0x0080808000808080ULL, 0x0050505000505050ULL, 0x00a7a7a700a7a7a7ULL,
502 	0x00f6f6f600f6f6f6ULL, 0x0077777700777777ULL, 0x0093939300939393ULL,
503 	0x0086868600868686ULL, 0x0083838300838383ULL, 0x002a2a2a002a2a2aULL,
504 	0x00c7c7c700c7c7c7ULL, 0x005b5b5b005b5b5bULL, 0x00e9e9e900e9e9e9ULL,
505 	0x00eeeeee00eeeeeeULL, 0x008f8f8f008f8f8fULL, 0x0001010100010101ULL,
506 	0x003d3d3d003d3d3dULL,
507 };
508 
509 __visible const u64 camellia_sp30333033[256] = {
510 	0x3800383838003838ULL, 0x4100414141004141ULL, 0x1600161616001616ULL,
511 	0x7600767676007676ULL, 0xd900d9d9d900d9d9ULL, 0x9300939393009393ULL,
512 	0x6000606060006060ULL, 0xf200f2f2f200f2f2ULL, 0x7200727272007272ULL,
513 	0xc200c2c2c200c2c2ULL, 0xab00ababab00ababULL, 0x9a009a9a9a009a9aULL,
514 	0x7500757575007575ULL, 0x0600060606000606ULL, 0x5700575757005757ULL,
515 	0xa000a0a0a000a0a0ULL, 0x9100919191009191ULL, 0xf700f7f7f700f7f7ULL,
516 	0xb500b5b5b500b5b5ULL, 0xc900c9c9c900c9c9ULL, 0xa200a2a2a200a2a2ULL,
517 	0x8c008c8c8c008c8cULL, 0xd200d2d2d200d2d2ULL, 0x9000909090009090ULL,
518 	0xf600f6f6f600f6f6ULL, 0x0700070707000707ULL, 0xa700a7a7a700a7a7ULL,
519 	0x2700272727002727ULL, 0x8e008e8e8e008e8eULL, 0xb200b2b2b200b2b2ULL,
520 	0x4900494949004949ULL, 0xde00dedede00dedeULL, 0x4300434343004343ULL,
521 	0x5c005c5c5c005c5cULL, 0xd700d7d7d700d7d7ULL, 0xc700c7c7c700c7c7ULL,
522 	0x3e003e3e3e003e3eULL, 0xf500f5f5f500f5f5ULL, 0x8f008f8f8f008f8fULL,
523 	0x6700676767006767ULL, 0x1f001f1f1f001f1fULL, 0x1800181818001818ULL,
524 	0x6e006e6e6e006e6eULL, 0xaf00afafaf00afafULL, 0x2f002f2f2f002f2fULL,
525 	0xe200e2e2e200e2e2ULL, 0x8500858585008585ULL, 0x0d000d0d0d000d0dULL,
526 	0x5300535353005353ULL, 0xf000f0f0f000f0f0ULL, 0x9c009c9c9c009c9cULL,
527 	0x6500656565006565ULL, 0xea00eaeaea00eaeaULL, 0xa300a3a3a300a3a3ULL,
528 	0xae00aeaeae00aeaeULL, 0x9e009e9e9e009e9eULL, 0xec00ececec00ececULL,
529 	0x8000808080008080ULL, 0x2d002d2d2d002d2dULL, 0x6b006b6b6b006b6bULL,
530 	0xa800a8a8a800a8a8ULL, 0x2b002b2b2b002b2bULL, 0x3600363636003636ULL,
531 	0xa600a6a6a600a6a6ULL, 0xc500c5c5c500c5c5ULL, 0x8600868686008686ULL,
532 	0x4d004d4d4d004d4dULL, 0x3300333333003333ULL, 0xfd00fdfdfd00fdfdULL,
533 	0x6600666666006666ULL, 0x5800585858005858ULL, 0x9600969696009696ULL,
534 	0x3a003a3a3a003a3aULL, 0x0900090909000909ULL, 0x9500959595009595ULL,
535 	0x1000101010001010ULL, 0x7800787878007878ULL, 0xd800d8d8d800d8d8ULL,
536 	0x4200424242004242ULL, 0xcc00cccccc00ccccULL, 0xef00efefef00efefULL,
537 	0x2600262626002626ULL, 0xe500e5e5e500e5e5ULL, 0x6100616161006161ULL,
538 	0x1a001a1a1a001a1aULL, 0x3f003f3f3f003f3fULL, 0x3b003b3b3b003b3bULL,
539 	0x8200828282008282ULL, 0xb600b6b6b600b6b6ULL, 0xdb00dbdbdb00dbdbULL,
540 	0xd400d4d4d400d4d4ULL, 0x9800989898009898ULL, 0xe800e8e8e800e8e8ULL,
541 	0x8b008b8b8b008b8bULL, 0x0200020202000202ULL, 0xeb00ebebeb00ebebULL,
542 	0x0a000a0a0a000a0aULL, 0x2c002c2c2c002c2cULL, 0x1d001d1d1d001d1dULL,
543 	0xb000b0b0b000b0b0ULL, 0x6f006f6f6f006f6fULL, 0x8d008d8d8d008d8dULL,
544 	0x8800888888008888ULL, 0x0e000e0e0e000e0eULL, 0x1900191919001919ULL,
545 	0x8700878787008787ULL, 0x4e004e4e4e004e4eULL, 0x0b000b0b0b000b0bULL,
546 	0xa900a9a9a900a9a9ULL, 0x0c000c0c0c000c0cULL, 0x7900797979007979ULL,
547 	0x1100111111001111ULL, 0x7f007f7f7f007f7fULL, 0x2200222222002222ULL,
548 	0xe700e7e7e700e7e7ULL, 0x5900595959005959ULL, 0xe100e1e1e100e1e1ULL,
549 	0xda00dadada00dadaULL, 0x3d003d3d3d003d3dULL, 0xc800c8c8c800c8c8ULL,
550 	0x1200121212001212ULL, 0x0400040404000404ULL, 0x7400747474007474ULL,
551 	0x5400545454005454ULL, 0x3000303030003030ULL, 0x7e007e7e7e007e7eULL,
552 	0xb400b4b4b400b4b4ULL, 0x2800282828002828ULL, 0x5500555555005555ULL,
553 	0x6800686868006868ULL, 0x5000505050005050ULL, 0xbe00bebebe00bebeULL,
554 	0xd000d0d0d000d0d0ULL, 0xc400c4c4c400c4c4ULL, 0x3100313131003131ULL,
555 	0xcb00cbcbcb00cbcbULL, 0x2a002a2a2a002a2aULL, 0xad00adadad00adadULL,
556 	0x0f000f0f0f000f0fULL, 0xca00cacaca00cacaULL, 0x7000707070007070ULL,
557 	0xff00ffffff00ffffULL, 0x3200323232003232ULL, 0x6900696969006969ULL,
558 	0x0800080808000808ULL, 0x6200626262006262ULL, 0x0000000000000000ULL,
559 	0x2400242424002424ULL, 0xd100d1d1d100d1d1ULL, 0xfb00fbfbfb00fbfbULL,
560 	0xba00bababa00babaULL, 0xed00ededed00ededULL, 0x4500454545004545ULL,
561 	0x8100818181008181ULL, 0x7300737373007373ULL, 0x6d006d6d6d006d6dULL,
562 	0x8400848484008484ULL, 0x9f009f9f9f009f9fULL, 0xee00eeeeee00eeeeULL,
563 	0x4a004a4a4a004a4aULL, 0xc300c3c3c300c3c3ULL, 0x2e002e2e2e002e2eULL,
564 	0xc100c1c1c100c1c1ULL, 0x0100010101000101ULL, 0xe600e6e6e600e6e6ULL,
565 	0x2500252525002525ULL, 0x4800484848004848ULL, 0x9900999999009999ULL,
566 	0xb900b9b9b900b9b9ULL, 0xb300b3b3b300b3b3ULL, 0x7b007b7b7b007b7bULL,
567 	0xf900f9f9f900f9f9ULL, 0xce00cecece00ceceULL, 0xbf00bfbfbf00bfbfULL,
568 	0xdf00dfdfdf00dfdfULL, 0x7100717171007171ULL, 0x2900292929002929ULL,
569 	0xcd00cdcdcd00cdcdULL, 0x6c006c6c6c006c6cULL, 0x1300131313001313ULL,
570 	0x6400646464006464ULL, 0x9b009b9b9b009b9bULL, 0x6300636363006363ULL,
571 	0x9d009d9d9d009d9dULL, 0xc000c0c0c000c0c0ULL, 0x4b004b4b4b004b4bULL,
572 	0xb700b7b7b700b7b7ULL, 0xa500a5a5a500a5a5ULL, 0x8900898989008989ULL,
573 	0x5f005f5f5f005f5fULL, 0xb100b1b1b100b1b1ULL, 0x1700171717001717ULL,
574 	0xf400f4f4f400f4f4ULL, 0xbc00bcbcbc00bcbcULL, 0xd300d3d3d300d3d3ULL,
575 	0x4600464646004646ULL, 0xcf00cfcfcf00cfcfULL, 0x3700373737003737ULL,
576 	0x5e005e5e5e005e5eULL, 0x4700474747004747ULL, 0x9400949494009494ULL,
577 	0xfa00fafafa00fafaULL, 0xfc00fcfcfc00fcfcULL, 0x5b005b5b5b005b5bULL,
578 	0x9700979797009797ULL, 0xfe00fefefe00fefeULL, 0x5a005a5a5a005a5aULL,
579 	0xac00acacac00acacULL, 0x3c003c3c3c003c3cULL, 0x4c004c4c4c004c4cULL,
580 	0x0300030303000303ULL, 0x3500353535003535ULL, 0xf300f3f3f300f3f3ULL,
581 	0x2300232323002323ULL, 0xb800b8b8b800b8b8ULL, 0x5d005d5d5d005d5dULL,
582 	0x6a006a6a6a006a6aULL, 0x9200929292009292ULL, 0xd500d5d5d500d5d5ULL,
583 	0x2100212121002121ULL, 0x4400444444004444ULL, 0x5100515151005151ULL,
584 	0xc600c6c6c600c6c6ULL, 0x7d007d7d7d007d7dULL, 0x3900393939003939ULL,
585 	0x8300838383008383ULL, 0xdc00dcdcdc00dcdcULL, 0xaa00aaaaaa00aaaaULL,
586 	0x7c007c7c7c007c7cULL, 0x7700777777007777ULL, 0x5600565656005656ULL,
587 	0x0500050505000505ULL, 0x1b001b1b1b001b1bULL, 0xa400a4a4a400a4a4ULL,
588 	0x1500151515001515ULL, 0x3400343434003434ULL, 0x1e001e1e1e001e1eULL,
589 	0x1c001c1c1c001c1cULL, 0xf800f8f8f800f8f8ULL, 0x5200525252005252ULL,
590 	0x2000202020002020ULL, 0x1400141414001414ULL, 0xe900e9e9e900e9e9ULL,
591 	0xbd00bdbdbd00bdbdULL, 0xdd00dddddd00ddddULL, 0xe400e4e4e400e4e4ULL,
592 	0xa100a1a1a100a1a1ULL, 0xe000e0e0e000e0e0ULL, 0x8a008a8a8a008a8aULL,
593 	0xf100f1f1f100f1f1ULL, 0xd600d6d6d600d6d6ULL, 0x7a007a7a7a007a7aULL,
594 	0xbb00bbbbbb00bbbbULL, 0xe300e3e3e300e3e3ULL, 0x4000404040004040ULL,
595 	0x4f004f4f4f004f4fULL,
596 };
597 
598 __visible const u64 camellia_sp44044404[256] = {
599 	0x7070007070700070ULL, 0x2c2c002c2c2c002cULL, 0xb3b300b3b3b300b3ULL,
600 	0xc0c000c0c0c000c0ULL, 0xe4e400e4e4e400e4ULL, 0x5757005757570057ULL,
601 	0xeaea00eaeaea00eaULL, 0xaeae00aeaeae00aeULL, 0x2323002323230023ULL,
602 	0x6b6b006b6b6b006bULL, 0x4545004545450045ULL, 0xa5a500a5a5a500a5ULL,
603 	0xeded00ededed00edULL, 0x4f4f004f4f4f004fULL, 0x1d1d001d1d1d001dULL,
604 	0x9292009292920092ULL, 0x8686008686860086ULL, 0xafaf00afafaf00afULL,
605 	0x7c7c007c7c7c007cULL, 0x1f1f001f1f1f001fULL, 0x3e3e003e3e3e003eULL,
606 	0xdcdc00dcdcdc00dcULL, 0x5e5e005e5e5e005eULL, 0x0b0b000b0b0b000bULL,
607 	0xa6a600a6a6a600a6ULL, 0x3939003939390039ULL, 0xd5d500d5d5d500d5ULL,
608 	0x5d5d005d5d5d005dULL, 0xd9d900d9d9d900d9ULL, 0x5a5a005a5a5a005aULL,
609 	0x5151005151510051ULL, 0x6c6c006c6c6c006cULL, 0x8b8b008b8b8b008bULL,
610 	0x9a9a009a9a9a009aULL, 0xfbfb00fbfbfb00fbULL, 0xb0b000b0b0b000b0ULL,
611 	0x7474007474740074ULL, 0x2b2b002b2b2b002bULL, 0xf0f000f0f0f000f0ULL,
612 	0x8484008484840084ULL, 0xdfdf00dfdfdf00dfULL, 0xcbcb00cbcbcb00cbULL,
613 	0x3434003434340034ULL, 0x7676007676760076ULL, 0x6d6d006d6d6d006dULL,
614 	0xa9a900a9a9a900a9ULL, 0xd1d100d1d1d100d1ULL, 0x0404000404040004ULL,
615 	0x1414001414140014ULL, 0x3a3a003a3a3a003aULL, 0xdede00dedede00deULL,
616 	0x1111001111110011ULL, 0x3232003232320032ULL, 0x9c9c009c9c9c009cULL,
617 	0x5353005353530053ULL, 0xf2f200f2f2f200f2ULL, 0xfefe00fefefe00feULL,
618 	0xcfcf00cfcfcf00cfULL, 0xc3c300c3c3c300c3ULL, 0x7a7a007a7a7a007aULL,
619 	0x2424002424240024ULL, 0xe8e800e8e8e800e8ULL, 0x6060006060600060ULL,
620 	0x6969006969690069ULL, 0xaaaa00aaaaaa00aaULL, 0xa0a000a0a0a000a0ULL,
621 	0xa1a100a1a1a100a1ULL, 0x6262006262620062ULL, 0x5454005454540054ULL,
622 	0x1e1e001e1e1e001eULL, 0xe0e000e0e0e000e0ULL, 0x6464006464640064ULL,
623 	0x1010001010100010ULL, 0x0000000000000000ULL, 0xa3a300a3a3a300a3ULL,
624 	0x7575007575750075ULL, 0x8a8a008a8a8a008aULL, 0xe6e600e6e6e600e6ULL,
625 	0x0909000909090009ULL, 0xdddd00dddddd00ddULL, 0x8787008787870087ULL,
626 	0x8383008383830083ULL, 0xcdcd00cdcdcd00cdULL, 0x9090009090900090ULL,
627 	0x7373007373730073ULL, 0xf6f600f6f6f600f6ULL, 0x9d9d009d9d9d009dULL,
628 	0xbfbf00bfbfbf00bfULL, 0x5252005252520052ULL, 0xd8d800d8d8d800d8ULL,
629 	0xc8c800c8c8c800c8ULL, 0xc6c600c6c6c600c6ULL, 0x8181008181810081ULL,
630 	0x6f6f006f6f6f006fULL, 0x1313001313130013ULL, 0x6363006363630063ULL,
631 	0xe9e900e9e9e900e9ULL, 0xa7a700a7a7a700a7ULL, 0x9f9f009f9f9f009fULL,
632 	0xbcbc00bcbcbc00bcULL, 0x2929002929290029ULL, 0xf9f900f9f9f900f9ULL,
633 	0x2f2f002f2f2f002fULL, 0xb4b400b4b4b400b4ULL, 0x7878007878780078ULL,
634 	0x0606000606060006ULL, 0xe7e700e7e7e700e7ULL, 0x7171007171710071ULL,
635 	0xd4d400d4d4d400d4ULL, 0xabab00ababab00abULL, 0x8888008888880088ULL,
636 	0x8d8d008d8d8d008dULL, 0x7272007272720072ULL, 0xb9b900b9b9b900b9ULL,
637 	0xf8f800f8f8f800f8ULL, 0xacac00acacac00acULL, 0x3636003636360036ULL,
638 	0x2a2a002a2a2a002aULL, 0x3c3c003c3c3c003cULL, 0xf1f100f1f1f100f1ULL,
639 	0x4040004040400040ULL, 0xd3d300d3d3d300d3ULL, 0xbbbb00bbbbbb00bbULL,
640 	0x4343004343430043ULL, 0x1515001515150015ULL, 0xadad00adadad00adULL,
641 	0x7777007777770077ULL, 0x8080008080800080ULL, 0x8282008282820082ULL,
642 	0xecec00ececec00ecULL, 0x2727002727270027ULL, 0xe5e500e5e5e500e5ULL,
643 	0x8585008585850085ULL, 0x3535003535350035ULL, 0x0c0c000c0c0c000cULL,
644 	0x4141004141410041ULL, 0xefef00efefef00efULL, 0x9393009393930093ULL,
645 	0x1919001919190019ULL, 0x2121002121210021ULL, 0x0e0e000e0e0e000eULL,
646 	0x4e4e004e4e4e004eULL, 0x6565006565650065ULL, 0xbdbd00bdbdbd00bdULL,
647 	0xb8b800b8b8b800b8ULL, 0x8f8f008f8f8f008fULL, 0xebeb00ebebeb00ebULL,
648 	0xcece00cecece00ceULL, 0x3030003030300030ULL, 0x5f5f005f5f5f005fULL,
649 	0xc5c500c5c5c500c5ULL, 0x1a1a001a1a1a001aULL, 0xe1e100e1e1e100e1ULL,
650 	0xcaca00cacaca00caULL, 0x4747004747470047ULL, 0x3d3d003d3d3d003dULL,
651 	0x0101000101010001ULL, 0xd6d600d6d6d600d6ULL, 0x5656005656560056ULL,
652 	0x4d4d004d4d4d004dULL, 0x0d0d000d0d0d000dULL, 0x6666006666660066ULL,
653 	0xcccc00cccccc00ccULL, 0x2d2d002d2d2d002dULL, 0x1212001212120012ULL,
654 	0x2020002020200020ULL, 0xb1b100b1b1b100b1ULL, 0x9999009999990099ULL,
655 	0x4c4c004c4c4c004cULL, 0xc2c200c2c2c200c2ULL, 0x7e7e007e7e7e007eULL,
656 	0x0505000505050005ULL, 0xb7b700b7b7b700b7ULL, 0x3131003131310031ULL,
657 	0x1717001717170017ULL, 0xd7d700d7d7d700d7ULL, 0x5858005858580058ULL,
658 	0x6161006161610061ULL, 0x1b1b001b1b1b001bULL, 0x1c1c001c1c1c001cULL,
659 	0x0f0f000f0f0f000fULL, 0x1616001616160016ULL, 0x1818001818180018ULL,
660 	0x2222002222220022ULL, 0x4444004444440044ULL, 0xb2b200b2b2b200b2ULL,
661 	0xb5b500b5b5b500b5ULL, 0x9191009191910091ULL, 0x0808000808080008ULL,
662 	0xa8a800a8a8a800a8ULL, 0xfcfc00fcfcfc00fcULL, 0x5050005050500050ULL,
663 	0xd0d000d0d0d000d0ULL, 0x7d7d007d7d7d007dULL, 0x8989008989890089ULL,
664 	0x9797009797970097ULL, 0x5b5b005b5b5b005bULL, 0x9595009595950095ULL,
665 	0xffff00ffffff00ffULL, 0xd2d200d2d2d200d2ULL, 0xc4c400c4c4c400c4ULL,
666 	0x4848004848480048ULL, 0xf7f700f7f7f700f7ULL, 0xdbdb00dbdbdb00dbULL,
667 	0x0303000303030003ULL, 0xdada00dadada00daULL, 0x3f3f003f3f3f003fULL,
668 	0x9494009494940094ULL, 0x5c5c005c5c5c005cULL, 0x0202000202020002ULL,
669 	0x4a4a004a4a4a004aULL, 0x3333003333330033ULL, 0x6767006767670067ULL,
670 	0xf3f300f3f3f300f3ULL, 0x7f7f007f7f7f007fULL, 0xe2e200e2e2e200e2ULL,
671 	0x9b9b009b9b9b009bULL, 0x2626002626260026ULL, 0x3737003737370037ULL,
672 	0x3b3b003b3b3b003bULL, 0x9696009696960096ULL, 0x4b4b004b4b4b004bULL,
673 	0xbebe00bebebe00beULL, 0x2e2e002e2e2e002eULL, 0x7979007979790079ULL,
674 	0x8c8c008c8c8c008cULL, 0x6e6e006e6e6e006eULL, 0x8e8e008e8e8e008eULL,
675 	0xf5f500f5f5f500f5ULL, 0xb6b600b6b6b600b6ULL, 0xfdfd00fdfdfd00fdULL,
676 	0x5959005959590059ULL, 0x9898009898980098ULL, 0x6a6a006a6a6a006aULL,
677 	0x4646004646460046ULL, 0xbaba00bababa00baULL, 0x2525002525250025ULL,
678 	0x4242004242420042ULL, 0xa2a200a2a2a200a2ULL, 0xfafa00fafafa00faULL,
679 	0x0707000707070007ULL, 0x5555005555550055ULL, 0xeeee00eeeeee00eeULL,
680 	0x0a0a000a0a0a000aULL, 0x4949004949490049ULL, 0x6868006868680068ULL,
681 	0x3838003838380038ULL, 0xa4a400a4a4a400a4ULL, 0x2828002828280028ULL,
682 	0x7b7b007b7b7b007bULL, 0xc9c900c9c9c900c9ULL, 0xc1c100c1c1c100c1ULL,
683 	0xe3e300e3e3e300e3ULL, 0xf4f400f4f4f400f4ULL, 0xc7c700c7c7c700c7ULL,
684 	0x9e9e009e9e9e009eULL,
685 };
686 
687 __visible const u64 camellia_sp11101110[256] = {
688 	0x7070700070707000ULL, 0x8282820082828200ULL, 0x2c2c2c002c2c2c00ULL,
689 	0xececec00ececec00ULL, 0xb3b3b300b3b3b300ULL, 0x2727270027272700ULL,
690 	0xc0c0c000c0c0c000ULL, 0xe5e5e500e5e5e500ULL, 0xe4e4e400e4e4e400ULL,
691 	0x8585850085858500ULL, 0x5757570057575700ULL, 0x3535350035353500ULL,
692 	0xeaeaea00eaeaea00ULL, 0x0c0c0c000c0c0c00ULL, 0xaeaeae00aeaeae00ULL,
693 	0x4141410041414100ULL, 0x2323230023232300ULL, 0xefefef00efefef00ULL,
694 	0x6b6b6b006b6b6b00ULL, 0x9393930093939300ULL, 0x4545450045454500ULL,
695 	0x1919190019191900ULL, 0xa5a5a500a5a5a500ULL, 0x2121210021212100ULL,
696 	0xededed00ededed00ULL, 0x0e0e0e000e0e0e00ULL, 0x4f4f4f004f4f4f00ULL,
697 	0x4e4e4e004e4e4e00ULL, 0x1d1d1d001d1d1d00ULL, 0x6565650065656500ULL,
698 	0x9292920092929200ULL, 0xbdbdbd00bdbdbd00ULL, 0x8686860086868600ULL,
699 	0xb8b8b800b8b8b800ULL, 0xafafaf00afafaf00ULL, 0x8f8f8f008f8f8f00ULL,
700 	0x7c7c7c007c7c7c00ULL, 0xebebeb00ebebeb00ULL, 0x1f1f1f001f1f1f00ULL,
701 	0xcecece00cecece00ULL, 0x3e3e3e003e3e3e00ULL, 0x3030300030303000ULL,
702 	0xdcdcdc00dcdcdc00ULL, 0x5f5f5f005f5f5f00ULL, 0x5e5e5e005e5e5e00ULL,
703 	0xc5c5c500c5c5c500ULL, 0x0b0b0b000b0b0b00ULL, 0x1a1a1a001a1a1a00ULL,
704 	0xa6a6a600a6a6a600ULL, 0xe1e1e100e1e1e100ULL, 0x3939390039393900ULL,
705 	0xcacaca00cacaca00ULL, 0xd5d5d500d5d5d500ULL, 0x4747470047474700ULL,
706 	0x5d5d5d005d5d5d00ULL, 0x3d3d3d003d3d3d00ULL, 0xd9d9d900d9d9d900ULL,
707 	0x0101010001010100ULL, 0x5a5a5a005a5a5a00ULL, 0xd6d6d600d6d6d600ULL,
708 	0x5151510051515100ULL, 0x5656560056565600ULL, 0x6c6c6c006c6c6c00ULL,
709 	0x4d4d4d004d4d4d00ULL, 0x8b8b8b008b8b8b00ULL, 0x0d0d0d000d0d0d00ULL,
710 	0x9a9a9a009a9a9a00ULL, 0x6666660066666600ULL, 0xfbfbfb00fbfbfb00ULL,
711 	0xcccccc00cccccc00ULL, 0xb0b0b000b0b0b000ULL, 0x2d2d2d002d2d2d00ULL,
712 	0x7474740074747400ULL, 0x1212120012121200ULL, 0x2b2b2b002b2b2b00ULL,
713 	0x2020200020202000ULL, 0xf0f0f000f0f0f000ULL, 0xb1b1b100b1b1b100ULL,
714 	0x8484840084848400ULL, 0x9999990099999900ULL, 0xdfdfdf00dfdfdf00ULL,
715 	0x4c4c4c004c4c4c00ULL, 0xcbcbcb00cbcbcb00ULL, 0xc2c2c200c2c2c200ULL,
716 	0x3434340034343400ULL, 0x7e7e7e007e7e7e00ULL, 0x7676760076767600ULL,
717 	0x0505050005050500ULL, 0x6d6d6d006d6d6d00ULL, 0xb7b7b700b7b7b700ULL,
718 	0xa9a9a900a9a9a900ULL, 0x3131310031313100ULL, 0xd1d1d100d1d1d100ULL,
719 	0x1717170017171700ULL, 0x0404040004040400ULL, 0xd7d7d700d7d7d700ULL,
720 	0x1414140014141400ULL, 0x5858580058585800ULL, 0x3a3a3a003a3a3a00ULL,
721 	0x6161610061616100ULL, 0xdedede00dedede00ULL, 0x1b1b1b001b1b1b00ULL,
722 	0x1111110011111100ULL, 0x1c1c1c001c1c1c00ULL, 0x3232320032323200ULL,
723 	0x0f0f0f000f0f0f00ULL, 0x9c9c9c009c9c9c00ULL, 0x1616160016161600ULL,
724 	0x5353530053535300ULL, 0x1818180018181800ULL, 0xf2f2f200f2f2f200ULL,
725 	0x2222220022222200ULL, 0xfefefe00fefefe00ULL, 0x4444440044444400ULL,
726 	0xcfcfcf00cfcfcf00ULL, 0xb2b2b200b2b2b200ULL, 0xc3c3c300c3c3c300ULL,
727 	0xb5b5b500b5b5b500ULL, 0x7a7a7a007a7a7a00ULL, 0x9191910091919100ULL,
728 	0x2424240024242400ULL, 0x0808080008080800ULL, 0xe8e8e800e8e8e800ULL,
729 	0xa8a8a800a8a8a800ULL, 0x6060600060606000ULL, 0xfcfcfc00fcfcfc00ULL,
730 	0x6969690069696900ULL, 0x5050500050505000ULL, 0xaaaaaa00aaaaaa00ULL,
731 	0xd0d0d000d0d0d000ULL, 0xa0a0a000a0a0a000ULL, 0x7d7d7d007d7d7d00ULL,
732 	0xa1a1a100a1a1a100ULL, 0x8989890089898900ULL, 0x6262620062626200ULL,
733 	0x9797970097979700ULL, 0x5454540054545400ULL, 0x5b5b5b005b5b5b00ULL,
734 	0x1e1e1e001e1e1e00ULL, 0x9595950095959500ULL, 0xe0e0e000e0e0e000ULL,
735 	0xffffff00ffffff00ULL, 0x6464640064646400ULL, 0xd2d2d200d2d2d200ULL,
736 	0x1010100010101000ULL, 0xc4c4c400c4c4c400ULL, 0x0000000000000000ULL,
737 	0x4848480048484800ULL, 0xa3a3a300a3a3a300ULL, 0xf7f7f700f7f7f700ULL,
738 	0x7575750075757500ULL, 0xdbdbdb00dbdbdb00ULL, 0x8a8a8a008a8a8a00ULL,
739 	0x0303030003030300ULL, 0xe6e6e600e6e6e600ULL, 0xdadada00dadada00ULL,
740 	0x0909090009090900ULL, 0x3f3f3f003f3f3f00ULL, 0xdddddd00dddddd00ULL,
741 	0x9494940094949400ULL, 0x8787870087878700ULL, 0x5c5c5c005c5c5c00ULL,
742 	0x8383830083838300ULL, 0x0202020002020200ULL, 0xcdcdcd00cdcdcd00ULL,
743 	0x4a4a4a004a4a4a00ULL, 0x9090900090909000ULL, 0x3333330033333300ULL,
744 	0x7373730073737300ULL, 0x6767670067676700ULL, 0xf6f6f600f6f6f600ULL,
745 	0xf3f3f300f3f3f300ULL, 0x9d9d9d009d9d9d00ULL, 0x7f7f7f007f7f7f00ULL,
746 	0xbfbfbf00bfbfbf00ULL, 0xe2e2e200e2e2e200ULL, 0x5252520052525200ULL,
747 	0x9b9b9b009b9b9b00ULL, 0xd8d8d800d8d8d800ULL, 0x2626260026262600ULL,
748 	0xc8c8c800c8c8c800ULL, 0x3737370037373700ULL, 0xc6c6c600c6c6c600ULL,
749 	0x3b3b3b003b3b3b00ULL, 0x8181810081818100ULL, 0x9696960096969600ULL,
750 	0x6f6f6f006f6f6f00ULL, 0x4b4b4b004b4b4b00ULL, 0x1313130013131300ULL,
751 	0xbebebe00bebebe00ULL, 0x6363630063636300ULL, 0x2e2e2e002e2e2e00ULL,
752 	0xe9e9e900e9e9e900ULL, 0x7979790079797900ULL, 0xa7a7a700a7a7a700ULL,
753 	0x8c8c8c008c8c8c00ULL, 0x9f9f9f009f9f9f00ULL, 0x6e6e6e006e6e6e00ULL,
754 	0xbcbcbc00bcbcbc00ULL, 0x8e8e8e008e8e8e00ULL, 0x2929290029292900ULL,
755 	0xf5f5f500f5f5f500ULL, 0xf9f9f900f9f9f900ULL, 0xb6b6b600b6b6b600ULL,
756 	0x2f2f2f002f2f2f00ULL, 0xfdfdfd00fdfdfd00ULL, 0xb4b4b400b4b4b400ULL,
757 	0x5959590059595900ULL, 0x7878780078787800ULL, 0x9898980098989800ULL,
758 	0x0606060006060600ULL, 0x6a6a6a006a6a6a00ULL, 0xe7e7e700e7e7e700ULL,
759 	0x4646460046464600ULL, 0x7171710071717100ULL, 0xbababa00bababa00ULL,
760 	0xd4d4d400d4d4d400ULL, 0x2525250025252500ULL, 0xababab00ababab00ULL,
761 	0x4242420042424200ULL, 0x8888880088888800ULL, 0xa2a2a200a2a2a200ULL,
762 	0x8d8d8d008d8d8d00ULL, 0xfafafa00fafafa00ULL, 0x7272720072727200ULL,
763 	0x0707070007070700ULL, 0xb9b9b900b9b9b900ULL, 0x5555550055555500ULL,
764 	0xf8f8f800f8f8f800ULL, 0xeeeeee00eeeeee00ULL, 0xacacac00acacac00ULL,
765 	0x0a0a0a000a0a0a00ULL, 0x3636360036363600ULL, 0x4949490049494900ULL,
766 	0x2a2a2a002a2a2a00ULL, 0x6868680068686800ULL, 0x3c3c3c003c3c3c00ULL,
767 	0x3838380038383800ULL, 0xf1f1f100f1f1f100ULL, 0xa4a4a400a4a4a400ULL,
768 	0x4040400040404000ULL, 0x2828280028282800ULL, 0xd3d3d300d3d3d300ULL,
769 	0x7b7b7b007b7b7b00ULL, 0xbbbbbb00bbbbbb00ULL, 0xc9c9c900c9c9c900ULL,
770 	0x4343430043434300ULL, 0xc1c1c100c1c1c100ULL, 0x1515150015151500ULL,
771 	0xe3e3e300e3e3e300ULL, 0xadadad00adadad00ULL, 0xf4f4f400f4f4f400ULL,
772 	0x7777770077777700ULL, 0xc7c7c700c7c7c700ULL, 0x8080800080808000ULL,
773 	0x9e9e9e009e9e9e00ULL,
774 };
775 
776 /* key constants */
777 #define CAMELLIA_SIGMA1L (0xA09E667FL)
778 #define CAMELLIA_SIGMA1R (0x3BCC908BL)
779 #define CAMELLIA_SIGMA2L (0xB67AE858L)
780 #define CAMELLIA_SIGMA2R (0x4CAA73B2L)
781 #define CAMELLIA_SIGMA3L (0xC6EF372FL)
782 #define CAMELLIA_SIGMA3R (0xE94F82BEL)
783 #define CAMELLIA_SIGMA4L (0x54FF53A5L)
784 #define CAMELLIA_SIGMA4R (0xF1D36F1CL)
785 #define CAMELLIA_SIGMA5L (0x10E527FAL)
786 #define CAMELLIA_SIGMA5R (0xDE682D1DL)
787 #define CAMELLIA_SIGMA6L (0xB05688C2L)
788 #define CAMELLIA_SIGMA6R (0xB3E6C1FDL)
789 
790 /* macros */
791 #define ROLDQ(l, r, bits) ({ \
792 	u64 t = l;					\
793 	l = (l << bits) | (r >> (64 - bits));		\
794 	r = (r << bits) | (t >> (64 - bits));		\
795 })
796 
797 #define CAMELLIA_F(x, kl, kr, y) ({ \
798 	u64 ii = x ^ (((u64)kl << 32) | kr);				\
799 	y = camellia_sp11101110[(uint8_t)ii];				\
800 	y ^= camellia_sp44044404[(uint8_t)(ii >> 8)];			\
801 	ii >>= 16;							\
802 	y ^= camellia_sp30333033[(uint8_t)ii];				\
803 	y ^= camellia_sp02220222[(uint8_t)(ii >> 8)];			\
804 	ii >>= 16;							\
805 	y ^= camellia_sp00444404[(uint8_t)ii];				\
806 	y ^= camellia_sp03303033[(uint8_t)(ii >> 8)];			\
807 	ii >>= 16;							\
808 	y ^= camellia_sp22000222[(uint8_t)ii];				\
809 	y ^= camellia_sp10011110[(uint8_t)(ii >> 8)];			\
810 	y = ror64(y, 32);						\
811 })
812 
813 #define SET_SUBKEY_LR(INDEX, sRL) (subkey[(INDEX)] = ror64((sRL), 32))
814 
815 static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
816 {
817 	u64 kw4, tt;
818 	u32 dw, tl, tr;
819 
820 	/* absorb kw2 to other subkeys */
821 	/* round 2 */
822 	subRL[3] ^= subRL[1];
823 	/* round 4 */
824 	subRL[5] ^= subRL[1];
825 	/* round 6 */
826 	subRL[7] ^= subRL[1];
827 
828 	subRL[1] ^= (subRL[1] & ~subRL[9]) << 32;
829 	/* modified for FLinv(kl2) */
830 	dw = (subRL[1] & subRL[9]) >> 32;
831 	subRL[1] ^= rol32(dw, 1);
832 
833 	/* round 8 */
834 	subRL[11] ^= subRL[1];
835 	/* round 10 */
836 	subRL[13] ^= subRL[1];
837 	/* round 12 */
838 	subRL[15] ^= subRL[1];
839 
840 	subRL[1] ^= (subRL[1] & ~subRL[17]) << 32;
841 	/* modified for FLinv(kl4) */
842 	dw = (subRL[1] & subRL[17]) >> 32;
843 	subRL[1] ^= rol32(dw, 1);
844 
845 	/* round 14 */
846 	subRL[19] ^= subRL[1];
847 	/* round 16 */
848 	subRL[21] ^= subRL[1];
849 	/* round 18 */
850 	subRL[23] ^= subRL[1];
851 
852 	if (max == 24) {
853 		/* kw3 */
854 		subRL[24] ^= subRL[1];
855 
856 		/* absorb kw4 to other subkeys */
857 		kw4 = subRL[25];
858 	} else {
859 		subRL[1] ^= (subRL[1] & ~subRL[25]) << 32;
860 		/* modified for FLinv(kl6) */
861 		dw = (subRL[1] & subRL[25]) >> 32;
862 		subRL[1] ^= rol32(dw, 1);
863 
864 		/* round 20 */
865 		subRL[27] ^= subRL[1];
866 		/* round 22 */
867 		subRL[29] ^= subRL[1];
868 		/* round 24 */
869 		subRL[31] ^= subRL[1];
870 		/* kw3 */
871 		subRL[32] ^= subRL[1];
872 
873 		/* absorb kw4 to other subkeys */
874 		kw4 = subRL[33];
875 		/* round 23 */
876 		subRL[30] ^= kw4;
877 		/* round 21 */
878 		subRL[28] ^= kw4;
879 		/* round 19 */
880 		subRL[26] ^= kw4;
881 
882 		kw4 ^= (kw4 & ~subRL[24]) << 32;
883 		/* modified for FL(kl5) */
884 		dw = (kw4 & subRL[24]) >> 32;
885 		kw4 ^= rol32(dw, 1);
886 	}
887 
888 	/* round 17 */
889 	subRL[22] ^= kw4;
890 	/* round 15 */
891 	subRL[20] ^= kw4;
892 	/* round 13 */
893 	subRL[18] ^= kw4;
894 
895 	kw4 ^= (kw4 & ~subRL[16]) << 32;
896 	/* modified for FL(kl3) */
897 	dw = (kw4 & subRL[16]) >> 32;
898 	kw4 ^= rol32(dw, 1);
899 
900 	/* round 11 */
901 	subRL[14] ^= kw4;
902 	/* round 9 */
903 	subRL[12] ^= kw4;
904 	/* round 7 */
905 	subRL[10] ^= kw4;
906 
907 	kw4 ^= (kw4 & ~subRL[8]) << 32;
908 	/* modified for FL(kl1) */
909 	dw = (kw4 & subRL[8]) >> 32;
910 	kw4 ^= rol32(dw, 1);
911 
912 	/* round 5 */
913 	subRL[6] ^= kw4;
914 	/* round 3 */
915 	subRL[4] ^= kw4;
916 	/* round 1 */
917 	subRL[2] ^= kw4;
918 	/* kw1 */
919 	subRL[0] ^= kw4;
920 
921 	/* key XOR is end of F-function */
922 	SET_SUBKEY_LR(0, subRL[0] ^ subRL[2]);			/* kw1 */
923 	SET_SUBKEY_LR(2, subRL[3]);				/* round 1 */
924 	SET_SUBKEY_LR(3, subRL[2] ^ subRL[4]);			/* round 2 */
925 	SET_SUBKEY_LR(4, subRL[3] ^ subRL[5]);			/* round 3 */
926 	SET_SUBKEY_LR(5, subRL[4] ^ subRL[6]);			/* round 4 */
927 	SET_SUBKEY_LR(6, subRL[5] ^ subRL[7]);			/* round 5 */
928 
929 	tl = (subRL[10] >> 32) ^ (subRL[10] & ~subRL[8]);
930 	dw = tl & (subRL[8] >> 32);				/* FL(kl1) */
931 	tr = subRL[10] ^ rol32(dw, 1);
932 	tt = (tr | ((u64)tl << 32));
933 
934 	SET_SUBKEY_LR(7, subRL[6] ^ tt);			/* round 6 */
935 	SET_SUBKEY_LR(8, subRL[8]);				/* FL(kl1) */
936 	SET_SUBKEY_LR(9, subRL[9]);				/* FLinv(kl2) */
937 
938 	tl = (subRL[7] >> 32) ^ (subRL[7] & ~subRL[9]);
939 	dw = tl & (subRL[9] >> 32);				/* FLinv(kl2) */
940 	tr = subRL[7] ^ rol32(dw, 1);
941 	tt = (tr | ((u64)tl << 32));
942 
943 	SET_SUBKEY_LR(10, subRL[11] ^ tt);			/* round 7 */
944 	SET_SUBKEY_LR(11, subRL[10] ^ subRL[12]);		/* round 8 */
945 	SET_SUBKEY_LR(12, subRL[11] ^ subRL[13]);		/* round 9 */
946 	SET_SUBKEY_LR(13, subRL[12] ^ subRL[14]);		/* round 10 */
947 	SET_SUBKEY_LR(14, subRL[13] ^ subRL[15]);		/* round 11 */
948 
949 	tl = (subRL[18] >> 32) ^ (subRL[18] & ~subRL[16]);
950 	dw = tl & (subRL[16] >> 32);				/* FL(kl3) */
951 	tr = subRL[18] ^ rol32(dw, 1);
952 	tt = (tr | ((u64)tl << 32));
953 
954 	SET_SUBKEY_LR(15, subRL[14] ^ tt);			/* round 12 */
955 	SET_SUBKEY_LR(16, subRL[16]);				/* FL(kl3) */
956 	SET_SUBKEY_LR(17, subRL[17]);				/* FLinv(kl4) */
957 
958 	tl = (subRL[15] >> 32) ^ (subRL[15] & ~subRL[17]);
959 	dw = tl & (subRL[17] >> 32);				/* FLinv(kl4) */
960 	tr = subRL[15] ^ rol32(dw, 1);
961 	tt = (tr | ((u64)tl << 32));
962 
963 	SET_SUBKEY_LR(18, subRL[19] ^ tt);			/* round 13 */
964 	SET_SUBKEY_LR(19, subRL[18] ^ subRL[20]);		/* round 14 */
965 	SET_SUBKEY_LR(20, subRL[19] ^ subRL[21]);		/* round 15 */
966 	SET_SUBKEY_LR(21, subRL[20] ^ subRL[22]);		/* round 16 */
967 	SET_SUBKEY_LR(22, subRL[21] ^ subRL[23]);		/* round 17 */
968 
969 	if (max == 24) {
970 		SET_SUBKEY_LR(23, subRL[22]);			/* round 18 */
971 		SET_SUBKEY_LR(24, subRL[24] ^ subRL[23]);	/* kw3 */
972 	} else {
973 		tl = (subRL[26] >> 32) ^ (subRL[26] & ~subRL[24]);
974 		dw = tl & (subRL[24] >> 32);			/* FL(kl5) */
975 		tr = subRL[26] ^ rol32(dw, 1);
976 		tt = (tr | ((u64)tl << 32));
977 
978 		SET_SUBKEY_LR(23, subRL[22] ^ tt);		/* round 18 */
979 		SET_SUBKEY_LR(24, subRL[24]);			/* FL(kl5) */
980 		SET_SUBKEY_LR(25, subRL[25]);			/* FLinv(kl6) */
981 
982 		tl = (subRL[23] >> 32) ^ (subRL[23] & ~subRL[25]);
983 		dw = tl & (subRL[25] >> 32);			/* FLinv(kl6) */
984 		tr = subRL[23] ^ rol32(dw, 1);
985 		tt = (tr | ((u64)tl << 32));
986 
987 		SET_SUBKEY_LR(26, subRL[27] ^ tt);		/* round 19 */
988 		SET_SUBKEY_LR(27, subRL[26] ^ subRL[28]);	/* round 20 */
989 		SET_SUBKEY_LR(28, subRL[27] ^ subRL[29]);	/* round 21 */
990 		SET_SUBKEY_LR(29, subRL[28] ^ subRL[30]);	/* round 22 */
991 		SET_SUBKEY_LR(30, subRL[29] ^ subRL[31]);	/* round 23 */
992 		SET_SUBKEY_LR(31, subRL[30]);			/* round 24 */
993 		SET_SUBKEY_LR(32, subRL[32] ^ subRL[31]);	/* kw3 */
994 	}
995 }
996 
997 static void camellia_setup128(const unsigned char *key, u64 *subkey)
998 {
999 	u64 kl, kr, ww;
1000 	u64 subRL[26];
1001 
1002 	/**
1003 	 *  k == kl || kr (|| is concatenation)
1004 	 */
1005 	kl = get_unaligned_be64(key);
1006 	kr = get_unaligned_be64(key + 8);
1007 
1008 	/* generate KL dependent subkeys */
1009 	/* kw1 */
1010 	subRL[0] = kl;
1011 	/* kw2 */
1012 	subRL[1] = kr;
1013 
1014 	/* rotation left shift 15bit */
1015 	ROLDQ(kl, kr, 15);
1016 
1017 	/* k3 */
1018 	subRL[4] = kl;
1019 	/* k4 */
1020 	subRL[5] = kr;
1021 
1022 	/* rotation left shift 15+30bit */
1023 	ROLDQ(kl, kr, 30);
1024 
1025 	/* k7 */
1026 	subRL[10] = kl;
1027 	/* k8 */
1028 	subRL[11] = kr;
1029 
1030 	/* rotation left shift 15+30+15bit */
1031 	ROLDQ(kl, kr, 15);
1032 
1033 	/* k10 */
1034 	subRL[13] = kr;
1035 	/* rotation left shift 15+30+15+17 bit */
1036 	ROLDQ(kl, kr, 17);
1037 
1038 	/* kl3 */
1039 	subRL[16] = kl;
1040 	/* kl4 */
1041 	subRL[17] = kr;
1042 
1043 	/* rotation left shift 15+30+15+17+17 bit */
1044 	ROLDQ(kl, kr, 17);
1045 
1046 	/* k13 */
1047 	subRL[18] = kl;
1048 	/* k14 */
1049 	subRL[19] = kr;
1050 
1051 	/* rotation left shift 15+30+15+17+17+17 bit */
1052 	ROLDQ(kl, kr, 17);
1053 
1054 	/* k17 */
1055 	subRL[22] = kl;
1056 	/* k18 */
1057 	subRL[23] = kr;
1058 
1059 	/* generate KA */
1060 	kl = subRL[0];
1061 	kr = subRL[1];
1062 	CAMELLIA_F(kl, CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, ww);
1063 	kr ^= ww;
1064 	CAMELLIA_F(kr, CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, kl);
1065 
1066 	/* current status == (kll, klr, w0, w1) */
1067 	CAMELLIA_F(kl, CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, kr);
1068 	kr ^= ww;
1069 	CAMELLIA_F(kr, CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, ww);
1070 	kl ^= ww;
1071 
1072 	/* generate KA dependent subkeys */
1073 	/* k1, k2 */
1074 	subRL[2] = kl;
1075 	subRL[3] = kr;
1076 	ROLDQ(kl, kr, 15);
1077 	/* k5,k6 */
1078 	subRL[6] = kl;
1079 	subRL[7] = kr;
1080 	ROLDQ(kl, kr, 15);
1081 	/* kl1, kl2 */
1082 	subRL[8] = kl;
1083 	subRL[9] = kr;
1084 	ROLDQ(kl, kr, 15);
1085 	/* k9 */
1086 	subRL[12] = kl;
1087 	ROLDQ(kl, kr, 15);
1088 	/* k11, k12 */
1089 	subRL[14] = kl;
1090 	subRL[15] = kr;
1091 	ROLDQ(kl, kr, 34);
1092 	/* k15, k16 */
1093 	subRL[20] = kl;
1094 	subRL[21] = kr;
1095 	ROLDQ(kl, kr, 17);
1096 	/* kw3, kw4 */
1097 	subRL[24] = kl;
1098 	subRL[25] = kr;
1099 
1100 	camellia_setup_tail(subkey, subRL, 24);
1101 }
1102 
1103 static void camellia_setup256(const unsigned char *key, u64 *subkey)
1104 {
1105 	u64 kl, kr;			/* left half of key */
1106 	u64 krl, krr;			/* right half of key */
1107 	u64 ww;				/* temporary variables */
1108 	u64 subRL[34];
1109 
1110 	/**
1111 	 *  key = (kl || kr || krl || krr) (|| is concatenation)
1112 	 */
1113 	kl = get_unaligned_be64(key);
1114 	kr = get_unaligned_be64(key + 8);
1115 	krl = get_unaligned_be64(key + 16);
1116 	krr = get_unaligned_be64(key + 24);
1117 
1118 	/* generate KL dependent subkeys */
1119 	/* kw1 */
1120 	subRL[0] = kl;
1121 	/* kw2 */
1122 	subRL[1] = kr;
1123 	ROLDQ(kl, kr, 45);
1124 	/* k9 */
1125 	subRL[12] = kl;
1126 	/* k10 */
1127 	subRL[13] = kr;
1128 	ROLDQ(kl, kr, 15);
1129 	/* kl3 */
1130 	subRL[16] = kl;
1131 	/* kl4 */
1132 	subRL[17] = kr;
1133 	ROLDQ(kl, kr, 17);
1134 	/* k17 */
1135 	subRL[22] = kl;
1136 	/* k18 */
1137 	subRL[23] = kr;
1138 	ROLDQ(kl, kr, 34);
1139 	/* k23 */
1140 	subRL[30] = kl;
1141 	/* k24 */
1142 	subRL[31] = kr;
1143 
1144 	/* generate KR dependent subkeys */
1145 	ROLDQ(krl, krr, 15);
1146 	/* k3 */
1147 	subRL[4] = krl;
1148 	/* k4 */
1149 	subRL[5] = krr;
1150 	ROLDQ(krl, krr, 15);
1151 	/* kl1 */
1152 	subRL[8] = krl;
1153 	/* kl2 */
1154 	subRL[9] = krr;
1155 	ROLDQ(krl, krr, 30);
1156 	/* k13 */
1157 	subRL[18] = krl;
1158 	/* k14 */
1159 	subRL[19] = krr;
1160 	ROLDQ(krl, krr, 34);
1161 	/* k19 */
1162 	subRL[26] = krl;
1163 	/* k20 */
1164 	subRL[27] = krr;
1165 	ROLDQ(krl, krr, 34);
1166 
1167 	/* generate KA */
1168 	kl = subRL[0] ^ krl;
1169 	kr = subRL[1] ^ krr;
1170 
1171 	CAMELLIA_F(kl, CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, ww);
1172 	kr ^= ww;
1173 	CAMELLIA_F(kr, CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, kl);
1174 	kl ^= krl;
1175 	CAMELLIA_F(kl, CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, kr);
1176 	kr ^= ww ^ krr;
1177 	CAMELLIA_F(kr, CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, ww);
1178 	kl ^= ww;
1179 
1180 	/* generate KB */
1181 	krl ^= kl;
1182 	krr ^= kr;
1183 	CAMELLIA_F(krl, CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R, ww);
1184 	krr ^= ww;
1185 	CAMELLIA_F(krr, CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R, ww);
1186 	krl ^= ww;
1187 
1188 	/* generate KA dependent subkeys */
1189 	ROLDQ(kl, kr, 15);
1190 	/* k5 */
1191 	subRL[6] = kl;
1192 	/* k6 */
1193 	subRL[7] = kr;
1194 	ROLDQ(kl, kr, 30);
1195 	/* k11 */
1196 	subRL[14] = kl;
1197 	/* k12 */
1198 	subRL[15] = kr;
1199 	/* rotation left shift 32bit */
1200 	ROLDQ(kl, kr, 32);
1201 	/* kl5 */
1202 	subRL[24] = kl;
1203 	/* kl6 */
1204 	subRL[25] = kr;
1205 	/* rotation left shift 17 from k11,k12 -> k21,k22 */
1206 	ROLDQ(kl, kr, 17);
1207 	/* k21 */
1208 	subRL[28] = kl;
1209 	/* k22 */
1210 	subRL[29] = kr;
1211 
1212 	/* generate KB dependent subkeys */
1213 	/* k1 */
1214 	subRL[2] = krl;
1215 	/* k2 */
1216 	subRL[3] = krr;
1217 	ROLDQ(krl, krr, 30);
1218 	/* k7 */
1219 	subRL[10] = krl;
1220 	/* k8 */
1221 	subRL[11] = krr;
1222 	ROLDQ(krl, krr, 30);
1223 	/* k15 */
1224 	subRL[20] = krl;
1225 	/* k16 */
1226 	subRL[21] = krr;
1227 	ROLDQ(krl, krr, 51);
1228 	/* kw3 */
1229 	subRL[32] = krl;
1230 	/* kw4 */
1231 	subRL[33] = krr;
1232 
1233 	camellia_setup_tail(subkey, subRL, 32);
1234 }
1235 
1236 static void camellia_setup192(const unsigned char *key, u64 *subkey)
1237 {
1238 	unsigned char kk[32];
1239 	u64 krl, krr;
1240 
1241 	memcpy(kk, key, 24);
1242 	memcpy((unsigned char *)&krl, key+16, 8);
1243 	krr = ~krl;
1244 	memcpy(kk+24, (unsigned char *)&krr, 8);
1245 	camellia_setup256(kk, subkey);
1246 }
1247 
1248 int __camellia_setkey(struct camellia_ctx *cctx, const unsigned char *key,
1249 		      unsigned int key_len, u32 *flags)
1250 {
1251 	if (key_len != 16 && key_len != 24 && key_len != 32) {
1252 		*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
1253 		return -EINVAL;
1254 	}
1255 
1256 	cctx->key_length = key_len;
1257 
1258 	switch (key_len) {
1259 	case 16:
1260 		camellia_setup128(key, cctx->key_table);
1261 		break;
1262 	case 24:
1263 		camellia_setup192(key, cctx->key_table);
1264 		break;
1265 	case 32:
1266 		camellia_setup256(key, cctx->key_table);
1267 		break;
1268 	}
1269 
1270 	return 0;
1271 }
1272 EXPORT_SYMBOL_GPL(__camellia_setkey);
1273 
1274 static int camellia_setkey(struct crypto_tfm *tfm, const u8 *in_key,
1275 			   unsigned int key_len)
1276 {
1277 	return __camellia_setkey(crypto_tfm_ctx(tfm), in_key, key_len,
1278 				 &tfm->crt_flags);
1279 }
1280 
1281 void camellia_decrypt_cbc_2way(void *ctx, u128 *dst, const u128 *src)
1282 {
1283 	u128 iv = *src;
1284 
1285 	camellia_dec_blk_2way(ctx, (u8 *)dst, (u8 *)src);
1286 
1287 	u128_xor(&dst[1], &dst[1], &iv);
1288 }
1289 EXPORT_SYMBOL_GPL(camellia_decrypt_cbc_2way);
1290 
1291 void camellia_crypt_ctr(void *ctx, u128 *dst, const u128 *src, le128 *iv)
1292 {
1293 	be128 ctrblk;
1294 
1295 	if (dst != src)
1296 		*dst = *src;
1297 
1298 	le128_to_be128(&ctrblk, iv);
1299 	le128_inc(iv);
1300 
1301 	camellia_enc_blk_xor(ctx, (u8 *)dst, (u8 *)&ctrblk);
1302 }
1303 EXPORT_SYMBOL_GPL(camellia_crypt_ctr);
1304 
1305 void camellia_crypt_ctr_2way(void *ctx, u128 *dst, const u128 *src, le128 *iv)
1306 {
1307 	be128 ctrblks[2];
1308 
1309 	if (dst != src) {
1310 		dst[0] = src[0];
1311 		dst[1] = src[1];
1312 	}
1313 
1314 	le128_to_be128(&ctrblks[0], iv);
1315 	le128_inc(iv);
1316 	le128_to_be128(&ctrblks[1], iv);
1317 	le128_inc(iv);
1318 
1319 	camellia_enc_blk_xor_2way(ctx, (u8 *)dst, (u8 *)ctrblks);
1320 }
1321 EXPORT_SYMBOL_GPL(camellia_crypt_ctr_2way);
1322 
1323 static const struct common_glue_ctx camellia_enc = {
1324 	.num_funcs = 2,
1325 	.fpu_blocks_limit = -1,
1326 
1327 	.funcs = { {
1328 		.num_blocks = 2,
1329 		.fn_u = { .ecb = GLUE_FUNC_CAST(camellia_enc_blk_2way) }
1330 	}, {
1331 		.num_blocks = 1,
1332 		.fn_u = { .ecb = GLUE_FUNC_CAST(camellia_enc_blk) }
1333 	} }
1334 };
1335 
1336 static const struct common_glue_ctx camellia_ctr = {
1337 	.num_funcs = 2,
1338 	.fpu_blocks_limit = -1,
1339 
1340 	.funcs = { {
1341 		.num_blocks = 2,
1342 		.fn_u = { .ctr = GLUE_CTR_FUNC_CAST(camellia_crypt_ctr_2way) }
1343 	}, {
1344 		.num_blocks = 1,
1345 		.fn_u = { .ctr = GLUE_CTR_FUNC_CAST(camellia_crypt_ctr) }
1346 	} }
1347 };
1348 
1349 static const struct common_glue_ctx camellia_dec = {
1350 	.num_funcs = 2,
1351 	.fpu_blocks_limit = -1,
1352 
1353 	.funcs = { {
1354 		.num_blocks = 2,
1355 		.fn_u = { .ecb = GLUE_FUNC_CAST(camellia_dec_blk_2way) }
1356 	}, {
1357 		.num_blocks = 1,
1358 		.fn_u = { .ecb = GLUE_FUNC_CAST(camellia_dec_blk) }
1359 	} }
1360 };
1361 
1362 static const struct common_glue_ctx camellia_dec_cbc = {
1363 	.num_funcs = 2,
1364 	.fpu_blocks_limit = -1,
1365 
1366 	.funcs = { {
1367 		.num_blocks = 2,
1368 		.fn_u = { .cbc = GLUE_CBC_FUNC_CAST(camellia_decrypt_cbc_2way) }
1369 	}, {
1370 		.num_blocks = 1,
1371 		.fn_u = { .cbc = GLUE_CBC_FUNC_CAST(camellia_dec_blk) }
1372 	} }
1373 };
1374 
1375 static int ecb_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1376 		       struct scatterlist *src, unsigned int nbytes)
1377 {
1378 	return glue_ecb_crypt_128bit(&camellia_enc, desc, dst, src, nbytes);
1379 }
1380 
1381 static int ecb_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1382 		       struct scatterlist *src, unsigned int nbytes)
1383 {
1384 	return glue_ecb_crypt_128bit(&camellia_dec, desc, dst, src, nbytes);
1385 }
1386 
1387 static int cbc_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1388 		       struct scatterlist *src, unsigned int nbytes)
1389 {
1390 	return glue_cbc_encrypt_128bit(GLUE_FUNC_CAST(camellia_enc_blk), desc,
1391 				       dst, src, nbytes);
1392 }
1393 
1394 static int cbc_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1395 		       struct scatterlist *src, unsigned int nbytes)
1396 {
1397 	return glue_cbc_decrypt_128bit(&camellia_dec_cbc, desc, dst, src,
1398 				       nbytes);
1399 }
1400 
1401 static int ctr_crypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1402 		     struct scatterlist *src, unsigned int nbytes)
1403 {
1404 	return glue_ctr_crypt_128bit(&camellia_ctr, desc, dst, src, nbytes);
1405 }
1406 
1407 static void encrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes)
1408 {
1409 	const unsigned int bsize = CAMELLIA_BLOCK_SIZE;
1410 	struct camellia_ctx *ctx = priv;
1411 	int i;
1412 
1413 	while (nbytes >= 2 * bsize) {
1414 		camellia_enc_blk_2way(ctx, srcdst, srcdst);
1415 		srcdst += bsize * 2;
1416 		nbytes -= bsize * 2;
1417 	}
1418 
1419 	for (i = 0; i < nbytes / bsize; i++, srcdst += bsize)
1420 		camellia_enc_blk(ctx, srcdst, srcdst);
1421 }
1422 
1423 static void decrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes)
1424 {
1425 	const unsigned int bsize = CAMELLIA_BLOCK_SIZE;
1426 	struct camellia_ctx *ctx = priv;
1427 	int i;
1428 
1429 	while (nbytes >= 2 * bsize) {
1430 		camellia_dec_blk_2way(ctx, srcdst, srcdst);
1431 		srcdst += bsize * 2;
1432 		nbytes -= bsize * 2;
1433 	}
1434 
1435 	for (i = 0; i < nbytes / bsize; i++, srcdst += bsize)
1436 		camellia_dec_blk(ctx, srcdst, srcdst);
1437 }
1438 
1439 int xts_camellia_setkey(struct crypto_tfm *tfm, const u8 *key,
1440 			unsigned int keylen)
1441 {
1442 	struct camellia_xts_ctx *ctx = crypto_tfm_ctx(tfm);
1443 	u32 *flags = &tfm->crt_flags;
1444 	int err;
1445 
1446 	err = xts_check_key(tfm, key, keylen);
1447 	if (err)
1448 		return err;
1449 
1450 	/* first half of xts-key is for crypt */
1451 	err = __camellia_setkey(&ctx->crypt_ctx, key, keylen / 2, flags);
1452 	if (err)
1453 		return err;
1454 
1455 	/* second half of xts-key is for tweak */
1456 	return __camellia_setkey(&ctx->tweak_ctx, key + keylen / 2, keylen / 2,
1457 				flags);
1458 }
1459 EXPORT_SYMBOL_GPL(xts_camellia_setkey);
1460 
1461 static int xts_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1462 		       struct scatterlist *src, unsigned int nbytes)
1463 {
1464 	struct camellia_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1465 	le128 buf[2 * 4];
1466 	struct xts_crypt_req req = {
1467 		.tbuf = buf,
1468 		.tbuflen = sizeof(buf),
1469 
1470 		.tweak_ctx = &ctx->tweak_ctx,
1471 		.tweak_fn = XTS_TWEAK_CAST(camellia_enc_blk),
1472 		.crypt_ctx = &ctx->crypt_ctx,
1473 		.crypt_fn = encrypt_callback,
1474 	};
1475 
1476 	return xts_crypt(desc, dst, src, nbytes, &req);
1477 }
1478 
1479 static int xts_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1480 		       struct scatterlist *src, unsigned int nbytes)
1481 {
1482 	struct camellia_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1483 	le128 buf[2 * 4];
1484 	struct xts_crypt_req req = {
1485 		.tbuf = buf,
1486 		.tbuflen = sizeof(buf),
1487 
1488 		.tweak_ctx = &ctx->tweak_ctx,
1489 		.tweak_fn = XTS_TWEAK_CAST(camellia_enc_blk),
1490 		.crypt_ctx = &ctx->crypt_ctx,
1491 		.crypt_fn = decrypt_callback,
1492 	};
1493 
1494 	return xts_crypt(desc, dst, src, nbytes, &req);
1495 }
1496 
1497 static struct crypto_alg camellia_algs[] = { {
1498 	.cra_name		= "camellia",
1499 	.cra_driver_name	= "camellia-asm",
1500 	.cra_priority		= 200,
1501 	.cra_flags		= CRYPTO_ALG_TYPE_CIPHER,
1502 	.cra_blocksize		= CAMELLIA_BLOCK_SIZE,
1503 	.cra_ctxsize		= sizeof(struct camellia_ctx),
1504 	.cra_alignmask		= 0,
1505 	.cra_module		= THIS_MODULE,
1506 	.cra_u			= {
1507 		.cipher = {
1508 			.cia_min_keysize = CAMELLIA_MIN_KEY_SIZE,
1509 			.cia_max_keysize = CAMELLIA_MAX_KEY_SIZE,
1510 			.cia_setkey	 = camellia_setkey,
1511 			.cia_encrypt	 = camellia_encrypt,
1512 			.cia_decrypt	 = camellia_decrypt
1513 		}
1514 	}
1515 }, {
1516 	.cra_name		= "ecb(camellia)",
1517 	.cra_driver_name	= "ecb-camellia-asm",
1518 	.cra_priority		= 300,
1519 	.cra_flags		= CRYPTO_ALG_TYPE_BLKCIPHER,
1520 	.cra_blocksize		= CAMELLIA_BLOCK_SIZE,
1521 	.cra_ctxsize		= sizeof(struct camellia_ctx),
1522 	.cra_alignmask		= 0,
1523 	.cra_type		= &crypto_blkcipher_type,
1524 	.cra_module		= THIS_MODULE,
1525 	.cra_u = {
1526 		.blkcipher = {
1527 			.min_keysize	= CAMELLIA_MIN_KEY_SIZE,
1528 			.max_keysize	= CAMELLIA_MAX_KEY_SIZE,
1529 			.setkey		= camellia_setkey,
1530 			.encrypt	= ecb_encrypt,
1531 			.decrypt	= ecb_decrypt,
1532 		},
1533 	},
1534 }, {
1535 	.cra_name		= "cbc(camellia)",
1536 	.cra_driver_name	= "cbc-camellia-asm",
1537 	.cra_priority		= 300,
1538 	.cra_flags		= CRYPTO_ALG_TYPE_BLKCIPHER,
1539 	.cra_blocksize		= CAMELLIA_BLOCK_SIZE,
1540 	.cra_ctxsize		= sizeof(struct camellia_ctx),
1541 	.cra_alignmask		= 0,
1542 	.cra_type		= &crypto_blkcipher_type,
1543 	.cra_module		= THIS_MODULE,
1544 	.cra_u = {
1545 		.blkcipher = {
1546 			.min_keysize	= CAMELLIA_MIN_KEY_SIZE,
1547 			.max_keysize	= CAMELLIA_MAX_KEY_SIZE,
1548 			.ivsize		= CAMELLIA_BLOCK_SIZE,
1549 			.setkey		= camellia_setkey,
1550 			.encrypt	= cbc_encrypt,
1551 			.decrypt	= cbc_decrypt,
1552 		},
1553 	},
1554 }, {
1555 	.cra_name		= "ctr(camellia)",
1556 	.cra_driver_name	= "ctr-camellia-asm",
1557 	.cra_priority		= 300,
1558 	.cra_flags		= CRYPTO_ALG_TYPE_BLKCIPHER,
1559 	.cra_blocksize		= 1,
1560 	.cra_ctxsize		= sizeof(struct camellia_ctx),
1561 	.cra_alignmask		= 0,
1562 	.cra_type		= &crypto_blkcipher_type,
1563 	.cra_module		= THIS_MODULE,
1564 	.cra_u = {
1565 		.blkcipher = {
1566 			.min_keysize	= CAMELLIA_MIN_KEY_SIZE,
1567 			.max_keysize	= CAMELLIA_MAX_KEY_SIZE,
1568 			.ivsize		= CAMELLIA_BLOCK_SIZE,
1569 			.setkey		= camellia_setkey,
1570 			.encrypt	= ctr_crypt,
1571 			.decrypt	= ctr_crypt,
1572 		},
1573 	},
1574 }, {
1575 	.cra_name		= "xts(camellia)",
1576 	.cra_driver_name	= "xts-camellia-asm",
1577 	.cra_priority		= 300,
1578 	.cra_flags		= CRYPTO_ALG_TYPE_BLKCIPHER,
1579 	.cra_blocksize		= CAMELLIA_BLOCK_SIZE,
1580 	.cra_ctxsize		= sizeof(struct camellia_xts_ctx),
1581 	.cra_alignmask		= 0,
1582 	.cra_type		= &crypto_blkcipher_type,
1583 	.cra_module		= THIS_MODULE,
1584 	.cra_u = {
1585 		.blkcipher = {
1586 			.min_keysize	= CAMELLIA_MIN_KEY_SIZE * 2,
1587 			.max_keysize	= CAMELLIA_MAX_KEY_SIZE * 2,
1588 			.ivsize		= CAMELLIA_BLOCK_SIZE,
1589 			.setkey		= xts_camellia_setkey,
1590 			.encrypt	= xts_encrypt,
1591 			.decrypt	= xts_decrypt,
1592 		},
1593 	},
1594 } };
1595 
1596 static bool is_blacklisted_cpu(void)
1597 {
1598 	if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL)
1599 		return false;
1600 
1601 	if (boot_cpu_data.x86 == 0x0f) {
1602 		/*
1603 		 * On Pentium 4, camellia-asm is slower than original assembler
1604 		 * implementation because excessive uses of 64bit rotate and
1605 		 * left-shifts (which are really slow on P4) needed to store and
1606 		 * handle 128bit block in two 64bit registers.
1607 		 */
1608 		return true;
1609 	}
1610 
1611 	return false;
1612 }
1613 
1614 static int force;
1615 module_param(force, int, 0);
1616 MODULE_PARM_DESC(force, "Force module load, ignore CPU blacklist");
1617 
1618 static int __init init(void)
1619 {
1620 	if (!force && is_blacklisted_cpu()) {
1621 		printk(KERN_INFO
1622 			"camellia-x86_64: performance on this CPU "
1623 			"would be suboptimal: disabling "
1624 			"camellia-x86_64.\n");
1625 		return -ENODEV;
1626 	}
1627 
1628 	return crypto_register_algs(camellia_algs, ARRAY_SIZE(camellia_algs));
1629 }
1630 
1631 static void __exit fini(void)
1632 {
1633 	crypto_unregister_algs(camellia_algs, ARRAY_SIZE(camellia_algs));
1634 }
1635 
1636 module_init(init);
1637 module_exit(fini);
1638 
1639 MODULE_LICENSE("GPL");
1640 MODULE_DESCRIPTION("Camellia Cipher Algorithm, asm optimized");
1641 MODULE_ALIAS_CRYPTO("camellia");
1642 MODULE_ALIAS_CRYPTO("camellia-asm");
1643