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