blob: 42ffd2bbab5bb9e18de2695d1f5814e4c5b43958 [file] [log] [blame]
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001/*
2 * Glue Code for assembler optimized version of Camellia
3 *
4 * Copyright (c) 2012 Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
5 *
6 * Camellia parts based on code by:
7 * Copyright (C) 2006 NTT (Nippon Telegraph and Telephone Corporation)
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02008 *
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>
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +020033#include <crypto/lrw.h>
34#include <crypto/xts.h>
Jussi Kivilinna964263a2012-06-18 14:07:29 +030035#include <asm/crypto/glue_helper.h>
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +020036
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
42struct camellia_ctx {
43 u64 key_table[CAMELLIA_TABLE_BYTE_LEN / sizeof(u64)];
44 u32 key_length;
45};
46
47/* regular block cipher functions */
48asmlinkage void __camellia_enc_blk(struct camellia_ctx *ctx, u8 *dst,
49 const u8 *src, bool xor);
50asmlinkage void camellia_dec_blk(struct camellia_ctx *ctx, u8 *dst,
51 const u8 *src);
52
53/* 2-way parallel cipher functions */
54asmlinkage void __camellia_enc_blk_2way(struct camellia_ctx *ctx, u8 *dst,
55 const u8 *src, bool xor);
56asmlinkage void camellia_dec_blk_2way(struct camellia_ctx *ctx, u8 *dst,
57 const u8 *src);
58
59static 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
65static 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
71static 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
77static 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
83static 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
88static 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 */
94const u64 camellia_sp10011110[256] = {
Jussi Kivilinna1ffb72a2012-08-28 16:46:59 +030095 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,
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +0200181};
182
183const u64 camellia_sp22000222[256] = {
Jussi Kivilinna1ffb72a2012-08-28 16:46:59 +0300184 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,
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +0200270};
271
272const u64 camellia_sp03303033[256] = {
Jussi Kivilinna1ffb72a2012-08-28 16:46:59 +0300273 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,
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +0200359};
360
361const u64 camellia_sp00444404[256] = {
Jussi Kivilinna1ffb72a2012-08-28 16:46:59 +0300362 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,
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +0200448};
449
450const u64 camellia_sp02220222[256] = {
Jussi Kivilinna1ffb72a2012-08-28 16:46:59 +0300451 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,
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +0200537};
538
539const u64 camellia_sp30333033[256] = {
Jussi Kivilinna1ffb72a2012-08-28 16:46:59 +0300540 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,
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +0200626};
627
628const u64 camellia_sp44044404[256] = {
Jussi Kivilinna1ffb72a2012-08-28 16:46:59 +0300629 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,
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +0200715};
716
717const u64 camellia_sp11101110[256] = {
Jussi Kivilinna1ffb72a2012-08-28 16:46:59 +0300718 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,
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +0200804};
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
845static 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
1027static void camellia_setup128(const unsigned char *key, u64 *subkey)
1028{
1029 u64 kl, kr, ww;
1030 u64 subRL[26];
1031
1032 /**
1033 * k == kl || kr (|| is concatenation)
1034 */
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];
1092 CAMELLIA_F(kl, CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, ww);
1093 kr ^= ww;
1094 CAMELLIA_F(kr, CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, kl);
1095
1096 /* current status == (kll, klr, w0, w1) */
1097 CAMELLIA_F(kl, CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, kr);
1098 kr ^= ww;
1099 CAMELLIA_F(kr, CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, 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
1133static 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
1140 /**
1141 * key = (kl || kr || krl || krr) (|| is concatenation)
1142 */
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
1201 CAMELLIA_F(kl, CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, ww);
1202 kr ^= ww;
1203 CAMELLIA_F(kr, CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, kl);
1204 kl ^= krl;
1205 CAMELLIA_F(kl, CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, kr);
1206 kr ^= ww ^ krr;
1207 CAMELLIA_F(kr, CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, ww);
1208 kl ^= ww;
1209
1210 /* generate KB */
1211 krl ^= kl;
1212 krr ^= kr;
1213 CAMELLIA_F(krl, CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R, ww);
1214 krr ^= ww;
1215 CAMELLIA_F(krr, CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R, 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
1266static 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
1278static 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
1304static 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
Jussi Kivilinna964263a2012-06-18 14:07:29 +03001311static void camellia_decrypt_cbc_2way(void *ctx, u128 *dst, const u128 *src)
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001312{
Jussi Kivilinna964263a2012-06-18 14:07:29 +03001313 u128 iv = *src;
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001314
Jussi Kivilinna964263a2012-06-18 14:07:29 +03001315 camellia_dec_blk_2way(ctx, (u8 *)dst, (u8 *)src);
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001316
Jussi Kivilinna964263a2012-06-18 14:07:29 +03001317 u128_xor(&dst[1], &dst[1], &iv);
1318}
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001319
Jussi Kivilinna964263a2012-06-18 14:07:29 +03001320static void camellia_crypt_ctr(void *ctx, u128 *dst, const u128 *src, u128 *iv)
1321{
1322 be128 ctrblk;
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001323
Jussi Kivilinna964263a2012-06-18 14:07:29 +03001324 if (dst != src)
1325 *dst = *src;
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001326
Jussi Kivilinna964263a2012-06-18 14:07:29 +03001327 u128_to_be128(&ctrblk, iv);
1328 u128_inc(iv);
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001329
Jussi Kivilinna964263a2012-06-18 14:07:29 +03001330 camellia_enc_blk_xor(ctx, (u8 *)dst, (u8 *)&ctrblk);
1331}
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001332
Jussi Kivilinna964263a2012-06-18 14:07:29 +03001333static void camellia_crypt_ctr_2way(void *ctx, u128 *dst, const u128 *src,
1334 u128 *iv)
1335{
1336 be128 ctrblks[2];
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001337
Jussi Kivilinna964263a2012-06-18 14:07:29 +03001338 if (dst != src) {
1339 dst[0] = src[0];
1340 dst[1] = src[1];
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001341 }
1342
Jussi Kivilinna964263a2012-06-18 14:07:29 +03001343 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);
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001349}
1350
Jussi Kivilinna964263a2012-06-18 14:07:29 +03001351static 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
1364static 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
1377static 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
1390static 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
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001403static int ecb_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1404 struct scatterlist *src, unsigned int nbytes)
1405{
Jussi Kivilinna964263a2012-06-18 14:07:29 +03001406 return glue_ecb_crypt_128bit(&camellia_enc, desc, dst, src, nbytes);
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001407}
1408
1409static int ecb_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1410 struct scatterlist *src, unsigned int nbytes)
1411{
Jussi Kivilinna964263a2012-06-18 14:07:29 +03001412 return glue_ecb_crypt_128bit(&camellia_dec, desc, dst, src, nbytes);
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001413}
1414
1415static int cbc_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1416 struct scatterlist *src, unsigned int nbytes)
1417{
Jussi Kivilinna964263a2012-06-18 14:07:29 +03001418 return glue_cbc_encrypt_128bit(GLUE_FUNC_CAST(camellia_enc_blk), desc,
1419 dst, src, nbytes);
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001420}
1421
1422static int cbc_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1423 struct scatterlist *src, unsigned int nbytes)
1424{
Jussi Kivilinna964263a2012-06-18 14:07:29 +03001425 return glue_cbc_decrypt_128bit(&camellia_dec_cbc, desc, dst, src,
1426 nbytes);
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001427}
1428
1429static int ctr_crypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1430 struct scatterlist *src, unsigned int nbytes)
1431{
Jussi Kivilinna964263a2012-06-18 14:07:29 +03001432 return glue_ctr_crypt_128bit(&camellia_ctr, desc, dst, src, nbytes);
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001433}
1434
1435static 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
1451static 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
1467struct camellia_lrw_ctx {
1468 struct lrw_table_ctx lrw_table;
1469 struct camellia_ctx camellia_ctx;
1470};
1471
1472static 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
1488static 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
1505static 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
1522static 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
1529struct camellia_xts_ctx {
1530 struct camellia_ctx tweak_ctx;
1531 struct camellia_ctx crypt_ctx;
1532};
1533
1534static 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
1559static 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
1577static 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
1595static 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,
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001604 .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,
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001623 .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,
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001642 .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,
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001662 .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,
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001682 .cra_exit = lrw_exit_tfm,
1683 .cra_u = {
1684 .blkcipher = {
1685 .min_keysize = CAMELLIA_MIN_KEY_SIZE +
1686 CAMELLIA_BLOCK_SIZE,
1687 .max_keysize = CAMELLIA_MAX_KEY_SIZE +
1688 CAMELLIA_BLOCK_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,
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001705 .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
1717static 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
1735static int force;
1736module_param(force, int, 0);
1737MODULE_PARM_DESC(force, "Force module load, ignore CPU blacklist");
1738
Jussi Kivilinna676a3802012-03-15 22:11:51 +02001739static int __init init(void)
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001740{
1741 if (!force && is_blacklisted_cpu()) {
1742 printk(KERN_INFO
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
Jussi Kivilinna676a3802012-03-15 22:11:51 +02001752static void __exit fini(void)
Jussi Kivilinna0b95ec52012-03-05 20:26:47 +02001753{
1754 crypto_unregister_algs(camellia_algs, ARRAY_SIZE(camellia_algs));
1755}
1756
1757module_init(init);
1758module_exit(fini);
1759
1760MODULE_LICENSE("GPL");
1761MODULE_DESCRIPTION("Camellia Cipher Algorithm, asm optimized");
1762MODULE_ALIAS("camellia");
1763MODULE_ALIAS("camellia-asm");