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