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