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