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