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