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