10b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna/*
20b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna * Glue Code for assembler optimized version of Camellia
30b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna *
40b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna * Copyright (c) 2012 Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
50b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna *
60b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna * Camellia parts based on code by:
70b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna *  Copyright (C) 2006 NTT (Nippon Telegraph and Telephone Corporation)
80b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna *
90b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna * This program is free software; you can redistribute it and/or modify
100b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna * it under the terms of the GNU General Public License as published by
110b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna * the Free Software Foundation; either version 2 of the License, or
120b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna * (at your option) any later version.
130b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna *
140b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna * This program is distributed in the hope that it will be useful,
150b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna * but WITHOUT ANY WARRANTY; without even the implied warranty of
160b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
170b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna * GNU General Public License for more details.
180b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna *
190b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna * You should have received a copy of the GNU General Public License
200b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna * along with this program; if not, write to the Free Software
210b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
220b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna * USA
230b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna *
240b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna */
250b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
260b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#include <asm/processor.h>
270b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#include <asm/unaligned.h>
280b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#include <linux/crypto.h>
290b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#include <linux/init.h>
300b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#include <linux/module.h>
310b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#include <linux/types.h>
320b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#include <crypto/algapi.h>
330b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#include <crypto/lrw.h>
340b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#include <crypto/xts.h>
35cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi Kivilinna#include <asm/crypto/camellia.h>
36964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna#include <asm/crypto/glue_helper.h>
370b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
380b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna/* regular block cipher functions */
390b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnaasmlinkage void __camellia_enc_blk(struct camellia_ctx *ctx, u8 *dst,
400b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna				   const u8 *src, bool xor);
41cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi KivilinnaEXPORT_SYMBOL_GPL(__camellia_enc_blk);
420b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnaasmlinkage void camellia_dec_blk(struct camellia_ctx *ctx, u8 *dst,
430b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna				 const u8 *src);
44cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi KivilinnaEXPORT_SYMBOL_GPL(camellia_dec_blk);
450b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
460b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna/* 2-way parallel cipher functions */
470b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnaasmlinkage void __camellia_enc_blk_2way(struct camellia_ctx *ctx, u8 *dst,
480b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna					const u8 *src, bool xor);
49cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi KivilinnaEXPORT_SYMBOL_GPL(__camellia_enc_blk_2way);
500b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnaasmlinkage void camellia_dec_blk_2way(struct camellia_ctx *ctx, u8 *dst,
510b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna				      const u8 *src);
52cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi KivilinnaEXPORT_SYMBOL_GPL(camellia_dec_blk_2way);
530b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
540b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnastatic void camellia_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
550b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
560b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	camellia_enc_blk(crypto_tfm_ctx(tfm), dst, src);
570b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
580b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
590b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnastatic void camellia_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
600b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
610b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	camellia_dec_blk(crypto_tfm_ctx(tfm), dst, src);
620b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
630b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
640b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna/* camellia sboxes */
65f22d08111a1d23f7432ee8d9c2dd637deb6963bdAndi Kleen__visible const u64 camellia_sp10011110[256] = {
661ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7000007070707000ULL, 0x8200008282828200ULL, 0x2c00002c2c2c2c00ULL,
671ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xec0000ecececec00ULL, 0xb30000b3b3b3b300ULL, 0x2700002727272700ULL,
681ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xc00000c0c0c0c000ULL, 0xe50000e5e5e5e500ULL, 0xe40000e4e4e4e400ULL,
691ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8500008585858500ULL, 0x5700005757575700ULL, 0x3500003535353500ULL,
701ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xea0000eaeaeaea00ULL, 0x0c00000c0c0c0c00ULL, 0xae0000aeaeaeae00ULL,
711ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4100004141414100ULL, 0x2300002323232300ULL, 0xef0000efefefef00ULL,
721ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6b00006b6b6b6b00ULL, 0x9300009393939300ULL, 0x4500004545454500ULL,
731ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1900001919191900ULL, 0xa50000a5a5a5a500ULL, 0x2100002121212100ULL,
741ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xed0000edededed00ULL, 0x0e00000e0e0e0e00ULL, 0x4f00004f4f4f4f00ULL,
751ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4e00004e4e4e4e00ULL, 0x1d00001d1d1d1d00ULL, 0x6500006565656500ULL,
761ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9200009292929200ULL, 0xbd0000bdbdbdbd00ULL, 0x8600008686868600ULL,
771ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xb80000b8b8b8b800ULL, 0xaf0000afafafaf00ULL, 0x8f00008f8f8f8f00ULL,
781ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7c00007c7c7c7c00ULL, 0xeb0000ebebebeb00ULL, 0x1f00001f1f1f1f00ULL,
791ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xce0000cececece00ULL, 0x3e00003e3e3e3e00ULL, 0x3000003030303000ULL,
801ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xdc0000dcdcdcdc00ULL, 0x5f00005f5f5f5f00ULL, 0x5e00005e5e5e5e00ULL,
811ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xc50000c5c5c5c500ULL, 0x0b00000b0b0b0b00ULL, 0x1a00001a1a1a1a00ULL,
821ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa60000a6a6a6a600ULL, 0xe10000e1e1e1e100ULL, 0x3900003939393900ULL,
831ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xca0000cacacaca00ULL, 0xd50000d5d5d5d500ULL, 0x4700004747474700ULL,
841ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5d00005d5d5d5d00ULL, 0x3d00003d3d3d3d00ULL, 0xd90000d9d9d9d900ULL,
851ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0100000101010100ULL, 0x5a00005a5a5a5a00ULL, 0xd60000d6d6d6d600ULL,
861ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5100005151515100ULL, 0x5600005656565600ULL, 0x6c00006c6c6c6c00ULL,
871ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4d00004d4d4d4d00ULL, 0x8b00008b8b8b8b00ULL, 0x0d00000d0d0d0d00ULL,
881ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9a00009a9a9a9a00ULL, 0x6600006666666600ULL, 0xfb0000fbfbfbfb00ULL,
891ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xcc0000cccccccc00ULL, 0xb00000b0b0b0b000ULL, 0x2d00002d2d2d2d00ULL,
901ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7400007474747400ULL, 0x1200001212121200ULL, 0x2b00002b2b2b2b00ULL,
911ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2000002020202000ULL, 0xf00000f0f0f0f000ULL, 0xb10000b1b1b1b100ULL,
921ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8400008484848400ULL, 0x9900009999999900ULL, 0xdf0000dfdfdfdf00ULL,
931ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4c00004c4c4c4c00ULL, 0xcb0000cbcbcbcb00ULL, 0xc20000c2c2c2c200ULL,
941ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x3400003434343400ULL, 0x7e00007e7e7e7e00ULL, 0x7600007676767600ULL,
951ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0500000505050500ULL, 0x6d00006d6d6d6d00ULL, 0xb70000b7b7b7b700ULL,
961ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa90000a9a9a9a900ULL, 0x3100003131313100ULL, 0xd10000d1d1d1d100ULL,
971ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1700001717171700ULL, 0x0400000404040400ULL, 0xd70000d7d7d7d700ULL,
981ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1400001414141400ULL, 0x5800005858585800ULL, 0x3a00003a3a3a3a00ULL,
991ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6100006161616100ULL, 0xde0000dededede00ULL, 0x1b00001b1b1b1b00ULL,
1001ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1100001111111100ULL, 0x1c00001c1c1c1c00ULL, 0x3200003232323200ULL,
1011ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0f00000f0f0f0f00ULL, 0x9c00009c9c9c9c00ULL, 0x1600001616161600ULL,
1021ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5300005353535300ULL, 0x1800001818181800ULL, 0xf20000f2f2f2f200ULL,
1031ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2200002222222200ULL, 0xfe0000fefefefe00ULL, 0x4400004444444400ULL,
1041ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xcf0000cfcfcfcf00ULL, 0xb20000b2b2b2b200ULL, 0xc30000c3c3c3c300ULL,
1051ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xb50000b5b5b5b500ULL, 0x7a00007a7a7a7a00ULL, 0x9100009191919100ULL,
1061ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2400002424242400ULL, 0x0800000808080800ULL, 0xe80000e8e8e8e800ULL,
1071ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa80000a8a8a8a800ULL, 0x6000006060606000ULL, 0xfc0000fcfcfcfc00ULL,
1081ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6900006969696900ULL, 0x5000005050505000ULL, 0xaa0000aaaaaaaa00ULL,
1091ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xd00000d0d0d0d000ULL, 0xa00000a0a0a0a000ULL, 0x7d00007d7d7d7d00ULL,
1101ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa10000a1a1a1a100ULL, 0x8900008989898900ULL, 0x6200006262626200ULL,
1111ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9700009797979700ULL, 0x5400005454545400ULL, 0x5b00005b5b5b5b00ULL,
1121ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1e00001e1e1e1e00ULL, 0x9500009595959500ULL, 0xe00000e0e0e0e000ULL,
1131ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xff0000ffffffff00ULL, 0x6400006464646400ULL, 0xd20000d2d2d2d200ULL,
1141ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1000001010101000ULL, 0xc40000c4c4c4c400ULL, 0x0000000000000000ULL,
1151ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4800004848484800ULL, 0xa30000a3a3a3a300ULL, 0xf70000f7f7f7f700ULL,
1161ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7500007575757500ULL, 0xdb0000dbdbdbdb00ULL, 0x8a00008a8a8a8a00ULL,
1171ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0300000303030300ULL, 0xe60000e6e6e6e600ULL, 0xda0000dadadada00ULL,
1181ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0900000909090900ULL, 0x3f00003f3f3f3f00ULL, 0xdd0000dddddddd00ULL,
1191ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9400009494949400ULL, 0x8700008787878700ULL, 0x5c00005c5c5c5c00ULL,
1201ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8300008383838300ULL, 0x0200000202020200ULL, 0xcd0000cdcdcdcd00ULL,
1211ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4a00004a4a4a4a00ULL, 0x9000009090909000ULL, 0x3300003333333300ULL,
1221ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7300007373737300ULL, 0x6700006767676700ULL, 0xf60000f6f6f6f600ULL,
1231ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xf30000f3f3f3f300ULL, 0x9d00009d9d9d9d00ULL, 0x7f00007f7f7f7f00ULL,
1241ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xbf0000bfbfbfbf00ULL, 0xe20000e2e2e2e200ULL, 0x5200005252525200ULL,
1251ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9b00009b9b9b9b00ULL, 0xd80000d8d8d8d800ULL, 0x2600002626262600ULL,
1261ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xc80000c8c8c8c800ULL, 0x3700003737373700ULL, 0xc60000c6c6c6c600ULL,
1271ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x3b00003b3b3b3b00ULL, 0x8100008181818100ULL, 0x9600009696969600ULL,
1281ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6f00006f6f6f6f00ULL, 0x4b00004b4b4b4b00ULL, 0x1300001313131300ULL,
1291ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xbe0000bebebebe00ULL, 0x6300006363636300ULL, 0x2e00002e2e2e2e00ULL,
1301ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xe90000e9e9e9e900ULL, 0x7900007979797900ULL, 0xa70000a7a7a7a700ULL,
1311ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8c00008c8c8c8c00ULL, 0x9f00009f9f9f9f00ULL, 0x6e00006e6e6e6e00ULL,
1321ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xbc0000bcbcbcbc00ULL, 0x8e00008e8e8e8e00ULL, 0x2900002929292900ULL,
1331ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xf50000f5f5f5f500ULL, 0xf90000f9f9f9f900ULL, 0xb60000b6b6b6b600ULL,
1341ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2f00002f2f2f2f00ULL, 0xfd0000fdfdfdfd00ULL, 0xb40000b4b4b4b400ULL,
1351ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5900005959595900ULL, 0x7800007878787800ULL, 0x9800009898989800ULL,
1361ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0600000606060600ULL, 0x6a00006a6a6a6a00ULL, 0xe70000e7e7e7e700ULL,
1371ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4600004646464600ULL, 0x7100007171717100ULL, 0xba0000babababa00ULL,
1381ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xd40000d4d4d4d400ULL, 0x2500002525252500ULL, 0xab0000abababab00ULL,
1391ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4200004242424200ULL, 0x8800008888888800ULL, 0xa20000a2a2a2a200ULL,
1401ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8d00008d8d8d8d00ULL, 0xfa0000fafafafa00ULL, 0x7200007272727200ULL,
1411ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0700000707070700ULL, 0xb90000b9b9b9b900ULL, 0x5500005555555500ULL,
1421ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xf80000f8f8f8f800ULL, 0xee0000eeeeeeee00ULL, 0xac0000acacacac00ULL,
1431ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0a00000a0a0a0a00ULL, 0x3600003636363600ULL, 0x4900004949494900ULL,
1441ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2a00002a2a2a2a00ULL, 0x6800006868686800ULL, 0x3c00003c3c3c3c00ULL,
1451ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x3800003838383800ULL, 0xf10000f1f1f1f100ULL, 0xa40000a4a4a4a400ULL,
1461ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4000004040404000ULL, 0x2800002828282800ULL, 0xd30000d3d3d3d300ULL,
1471ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7b00007b7b7b7b00ULL, 0xbb0000bbbbbbbb00ULL, 0xc90000c9c9c9c900ULL,
1481ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4300004343434300ULL, 0xc10000c1c1c1c100ULL, 0x1500001515151500ULL,
1491ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xe30000e3e3e3e300ULL, 0xad0000adadadad00ULL, 0xf40000f4f4f4f400ULL,
1501ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7700007777777700ULL, 0xc70000c7c7c7c700ULL, 0x8000008080808000ULL,
1511ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9e00009e9e9e9e00ULL,
1520b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna};
1530b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
154f22d08111a1d23f7432ee8d9c2dd637deb6963bdAndi Kleen__visible const u64 camellia_sp22000222[256] = {
1551ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xe0e0000000e0e0e0ULL, 0x0505000000050505ULL, 0x5858000000585858ULL,
1561ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xd9d9000000d9d9d9ULL, 0x6767000000676767ULL, 0x4e4e0000004e4e4eULL,
1571ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8181000000818181ULL, 0xcbcb000000cbcbcbULL, 0xc9c9000000c9c9c9ULL,
1581ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0b0b0000000b0b0bULL, 0xaeae000000aeaeaeULL, 0x6a6a0000006a6a6aULL,
1591ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xd5d5000000d5d5d5ULL, 0x1818000000181818ULL, 0x5d5d0000005d5d5dULL,
1601ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8282000000828282ULL, 0x4646000000464646ULL, 0xdfdf000000dfdfdfULL,
1611ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xd6d6000000d6d6d6ULL, 0x2727000000272727ULL, 0x8a8a0000008a8a8aULL,
1621ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x3232000000323232ULL, 0x4b4b0000004b4b4bULL, 0x4242000000424242ULL,
1631ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xdbdb000000dbdbdbULL, 0x1c1c0000001c1c1cULL, 0x9e9e0000009e9e9eULL,
1641ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9c9c0000009c9c9cULL, 0x3a3a0000003a3a3aULL, 0xcaca000000cacacaULL,
1651ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2525000000252525ULL, 0x7b7b0000007b7b7bULL, 0x0d0d0000000d0d0dULL,
1661ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7171000000717171ULL, 0x5f5f0000005f5f5fULL, 0x1f1f0000001f1f1fULL,
1671ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xf8f8000000f8f8f8ULL, 0xd7d7000000d7d7d7ULL, 0x3e3e0000003e3e3eULL,
1681ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9d9d0000009d9d9dULL, 0x7c7c0000007c7c7cULL, 0x6060000000606060ULL,
1691ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xb9b9000000b9b9b9ULL, 0xbebe000000bebebeULL, 0xbcbc000000bcbcbcULL,
1701ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8b8b0000008b8b8bULL, 0x1616000000161616ULL, 0x3434000000343434ULL,
1711ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4d4d0000004d4d4dULL, 0xc3c3000000c3c3c3ULL, 0x7272000000727272ULL,
1721ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9595000000959595ULL, 0xabab000000abababULL, 0x8e8e0000008e8e8eULL,
1731ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xbaba000000bababaULL, 0x7a7a0000007a7a7aULL, 0xb3b3000000b3b3b3ULL,
1741ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0202000000020202ULL, 0xb4b4000000b4b4b4ULL, 0xadad000000adadadULL,
1751ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa2a2000000a2a2a2ULL, 0xacac000000acacacULL, 0xd8d8000000d8d8d8ULL,
1761ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9a9a0000009a9a9aULL, 0x1717000000171717ULL, 0x1a1a0000001a1a1aULL,
1771ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x3535000000353535ULL, 0xcccc000000ccccccULL, 0xf7f7000000f7f7f7ULL,
1781ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9999000000999999ULL, 0x6161000000616161ULL, 0x5a5a0000005a5a5aULL,
1791ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xe8e8000000e8e8e8ULL, 0x2424000000242424ULL, 0x5656000000565656ULL,
1801ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4040000000404040ULL, 0xe1e1000000e1e1e1ULL, 0x6363000000636363ULL,
1811ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0909000000090909ULL, 0x3333000000333333ULL, 0xbfbf000000bfbfbfULL,
1821ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9898000000989898ULL, 0x9797000000979797ULL, 0x8585000000858585ULL,
1831ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6868000000686868ULL, 0xfcfc000000fcfcfcULL, 0xecec000000ecececULL,
1841ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0a0a0000000a0a0aULL, 0xdada000000dadadaULL, 0x6f6f0000006f6f6fULL,
1851ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5353000000535353ULL, 0x6262000000626262ULL, 0xa3a3000000a3a3a3ULL,
1861ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2e2e0000002e2e2eULL, 0x0808000000080808ULL, 0xafaf000000afafafULL,
1871ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2828000000282828ULL, 0xb0b0000000b0b0b0ULL, 0x7474000000747474ULL,
1881ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xc2c2000000c2c2c2ULL, 0xbdbd000000bdbdbdULL, 0x3636000000363636ULL,
1891ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2222000000222222ULL, 0x3838000000383838ULL, 0x6464000000646464ULL,
1901ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1e1e0000001e1e1eULL, 0x3939000000393939ULL, 0x2c2c0000002c2c2cULL,
1911ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa6a6000000a6a6a6ULL, 0x3030000000303030ULL, 0xe5e5000000e5e5e5ULL,
1921ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4444000000444444ULL, 0xfdfd000000fdfdfdULL, 0x8888000000888888ULL,
1931ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9f9f0000009f9f9fULL, 0x6565000000656565ULL, 0x8787000000878787ULL,
1941ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6b6b0000006b6b6bULL, 0xf4f4000000f4f4f4ULL, 0x2323000000232323ULL,
1951ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4848000000484848ULL, 0x1010000000101010ULL, 0xd1d1000000d1d1d1ULL,
1961ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5151000000515151ULL, 0xc0c0000000c0c0c0ULL, 0xf9f9000000f9f9f9ULL,
1971ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xd2d2000000d2d2d2ULL, 0xa0a0000000a0a0a0ULL, 0x5555000000555555ULL,
1981ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa1a1000000a1a1a1ULL, 0x4141000000414141ULL, 0xfafa000000fafafaULL,
1991ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4343000000434343ULL, 0x1313000000131313ULL, 0xc4c4000000c4c4c4ULL,
2001ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2f2f0000002f2f2fULL, 0xa8a8000000a8a8a8ULL, 0xb6b6000000b6b6b6ULL,
2011ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x3c3c0000003c3c3cULL, 0x2b2b0000002b2b2bULL, 0xc1c1000000c1c1c1ULL,
2021ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xffff000000ffffffULL, 0xc8c8000000c8c8c8ULL, 0xa5a5000000a5a5a5ULL,
2031ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2020000000202020ULL, 0x8989000000898989ULL, 0x0000000000000000ULL,
2041ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9090000000909090ULL, 0x4747000000474747ULL, 0xefef000000efefefULL,
2051ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xeaea000000eaeaeaULL, 0xb7b7000000b7b7b7ULL, 0x1515000000151515ULL,
2061ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0606000000060606ULL, 0xcdcd000000cdcdcdULL, 0xb5b5000000b5b5b5ULL,
2071ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1212000000121212ULL, 0x7e7e0000007e7e7eULL, 0xbbbb000000bbbbbbULL,
2081ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2929000000292929ULL, 0x0f0f0000000f0f0fULL, 0xb8b8000000b8b8b8ULL,
2091ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0707000000070707ULL, 0x0404000000040404ULL, 0x9b9b0000009b9b9bULL,
2101ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9494000000949494ULL, 0x2121000000212121ULL, 0x6666000000666666ULL,
2111ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xe6e6000000e6e6e6ULL, 0xcece000000cececeULL, 0xeded000000edededULL,
2121ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xe7e7000000e7e7e7ULL, 0x3b3b0000003b3b3bULL, 0xfefe000000fefefeULL,
2131ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7f7f0000007f7f7fULL, 0xc5c5000000c5c5c5ULL, 0xa4a4000000a4a4a4ULL,
2141ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x3737000000373737ULL, 0xb1b1000000b1b1b1ULL, 0x4c4c0000004c4c4cULL,
2151ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9191000000919191ULL, 0x6e6e0000006e6e6eULL, 0x8d8d0000008d8d8dULL,
2161ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7676000000767676ULL, 0x0303000000030303ULL, 0x2d2d0000002d2d2dULL,
2171ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xdede000000dededeULL, 0x9696000000969696ULL, 0x2626000000262626ULL,
2181ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7d7d0000007d7d7dULL, 0xc6c6000000c6c6c6ULL, 0x5c5c0000005c5c5cULL,
2191ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xd3d3000000d3d3d3ULL, 0xf2f2000000f2f2f2ULL, 0x4f4f0000004f4f4fULL,
2201ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1919000000191919ULL, 0x3f3f0000003f3f3fULL, 0xdcdc000000dcdcdcULL,
2211ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7979000000797979ULL, 0x1d1d0000001d1d1dULL, 0x5252000000525252ULL,
2221ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xebeb000000ebebebULL, 0xf3f3000000f3f3f3ULL, 0x6d6d0000006d6d6dULL,
2231ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5e5e0000005e5e5eULL, 0xfbfb000000fbfbfbULL, 0x6969000000696969ULL,
2241ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xb2b2000000b2b2b2ULL, 0xf0f0000000f0f0f0ULL, 0x3131000000313131ULL,
2251ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0c0c0000000c0c0cULL, 0xd4d4000000d4d4d4ULL, 0xcfcf000000cfcfcfULL,
2261ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8c8c0000008c8c8cULL, 0xe2e2000000e2e2e2ULL, 0x7575000000757575ULL,
2271ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa9a9000000a9a9a9ULL, 0x4a4a0000004a4a4aULL, 0x5757000000575757ULL,
2281ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8484000000848484ULL, 0x1111000000111111ULL, 0x4545000000454545ULL,
2291ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1b1b0000001b1b1bULL, 0xf5f5000000f5f5f5ULL, 0xe4e4000000e4e4e4ULL,
2301ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0e0e0000000e0e0eULL, 0x7373000000737373ULL, 0xaaaa000000aaaaaaULL,
2311ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xf1f1000000f1f1f1ULL, 0xdddd000000ddddddULL, 0x5959000000595959ULL,
2321ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1414000000141414ULL, 0x6c6c0000006c6c6cULL, 0x9292000000929292ULL,
2331ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5454000000545454ULL, 0xd0d0000000d0d0d0ULL, 0x7878000000787878ULL,
2341ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7070000000707070ULL, 0xe3e3000000e3e3e3ULL, 0x4949000000494949ULL,
2351ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8080000000808080ULL, 0x5050000000505050ULL, 0xa7a7000000a7a7a7ULL,
2361ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xf6f6000000f6f6f6ULL, 0x7777000000777777ULL, 0x9393000000939393ULL,
2371ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8686000000868686ULL, 0x8383000000838383ULL, 0x2a2a0000002a2a2aULL,
2381ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xc7c7000000c7c7c7ULL, 0x5b5b0000005b5b5bULL, 0xe9e9000000e9e9e9ULL,
2391ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xeeee000000eeeeeeULL, 0x8f8f0000008f8f8fULL, 0x0101000000010101ULL,
2401ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x3d3d0000003d3d3dULL,
2410b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna};
2420b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
243f22d08111a1d23f7432ee8d9c2dd637deb6963bdAndi Kleen__visible const u64 camellia_sp03303033[256] = {
2441ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0038380038003838ULL, 0x0041410041004141ULL, 0x0016160016001616ULL,
2451ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0076760076007676ULL, 0x00d9d900d900d9d9ULL, 0x0093930093009393ULL,
2461ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0060600060006060ULL, 0x00f2f200f200f2f2ULL, 0x0072720072007272ULL,
2471ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00c2c200c200c2c2ULL, 0x00abab00ab00ababULL, 0x009a9a009a009a9aULL,
2481ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0075750075007575ULL, 0x0006060006000606ULL, 0x0057570057005757ULL,
2491ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00a0a000a000a0a0ULL, 0x0091910091009191ULL, 0x00f7f700f700f7f7ULL,
2501ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00b5b500b500b5b5ULL, 0x00c9c900c900c9c9ULL, 0x00a2a200a200a2a2ULL,
2511ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x008c8c008c008c8cULL, 0x00d2d200d200d2d2ULL, 0x0090900090009090ULL,
2521ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00f6f600f600f6f6ULL, 0x0007070007000707ULL, 0x00a7a700a700a7a7ULL,
2531ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0027270027002727ULL, 0x008e8e008e008e8eULL, 0x00b2b200b200b2b2ULL,
2541ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0049490049004949ULL, 0x00dede00de00dedeULL, 0x0043430043004343ULL,
2551ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x005c5c005c005c5cULL, 0x00d7d700d700d7d7ULL, 0x00c7c700c700c7c7ULL,
2561ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x003e3e003e003e3eULL, 0x00f5f500f500f5f5ULL, 0x008f8f008f008f8fULL,
2571ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0067670067006767ULL, 0x001f1f001f001f1fULL, 0x0018180018001818ULL,
2581ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x006e6e006e006e6eULL, 0x00afaf00af00afafULL, 0x002f2f002f002f2fULL,
2591ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00e2e200e200e2e2ULL, 0x0085850085008585ULL, 0x000d0d000d000d0dULL,
2601ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0053530053005353ULL, 0x00f0f000f000f0f0ULL, 0x009c9c009c009c9cULL,
2611ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0065650065006565ULL, 0x00eaea00ea00eaeaULL, 0x00a3a300a300a3a3ULL,
2621ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00aeae00ae00aeaeULL, 0x009e9e009e009e9eULL, 0x00ecec00ec00ececULL,
2631ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0080800080008080ULL, 0x002d2d002d002d2dULL, 0x006b6b006b006b6bULL,
2641ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00a8a800a800a8a8ULL, 0x002b2b002b002b2bULL, 0x0036360036003636ULL,
2651ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00a6a600a600a6a6ULL, 0x00c5c500c500c5c5ULL, 0x0086860086008686ULL,
2661ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x004d4d004d004d4dULL, 0x0033330033003333ULL, 0x00fdfd00fd00fdfdULL,
2671ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0066660066006666ULL, 0x0058580058005858ULL, 0x0096960096009696ULL,
2681ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x003a3a003a003a3aULL, 0x0009090009000909ULL, 0x0095950095009595ULL,
2691ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0010100010001010ULL, 0x0078780078007878ULL, 0x00d8d800d800d8d8ULL,
2701ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0042420042004242ULL, 0x00cccc00cc00ccccULL, 0x00efef00ef00efefULL,
2711ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0026260026002626ULL, 0x00e5e500e500e5e5ULL, 0x0061610061006161ULL,
2721ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x001a1a001a001a1aULL, 0x003f3f003f003f3fULL, 0x003b3b003b003b3bULL,
2731ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0082820082008282ULL, 0x00b6b600b600b6b6ULL, 0x00dbdb00db00dbdbULL,
2741ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00d4d400d400d4d4ULL, 0x0098980098009898ULL, 0x00e8e800e800e8e8ULL,
2751ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x008b8b008b008b8bULL, 0x0002020002000202ULL, 0x00ebeb00eb00ebebULL,
2761ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x000a0a000a000a0aULL, 0x002c2c002c002c2cULL, 0x001d1d001d001d1dULL,
2771ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00b0b000b000b0b0ULL, 0x006f6f006f006f6fULL, 0x008d8d008d008d8dULL,
2781ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0088880088008888ULL, 0x000e0e000e000e0eULL, 0x0019190019001919ULL,
2791ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0087870087008787ULL, 0x004e4e004e004e4eULL, 0x000b0b000b000b0bULL,
2801ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00a9a900a900a9a9ULL, 0x000c0c000c000c0cULL, 0x0079790079007979ULL,
2811ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0011110011001111ULL, 0x007f7f007f007f7fULL, 0x0022220022002222ULL,
2821ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00e7e700e700e7e7ULL, 0x0059590059005959ULL, 0x00e1e100e100e1e1ULL,
2831ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00dada00da00dadaULL, 0x003d3d003d003d3dULL, 0x00c8c800c800c8c8ULL,
2841ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0012120012001212ULL, 0x0004040004000404ULL, 0x0074740074007474ULL,
2851ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0054540054005454ULL, 0x0030300030003030ULL, 0x007e7e007e007e7eULL,
2861ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00b4b400b400b4b4ULL, 0x0028280028002828ULL, 0x0055550055005555ULL,
2871ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0068680068006868ULL, 0x0050500050005050ULL, 0x00bebe00be00bebeULL,
2881ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00d0d000d000d0d0ULL, 0x00c4c400c400c4c4ULL, 0x0031310031003131ULL,
2891ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00cbcb00cb00cbcbULL, 0x002a2a002a002a2aULL, 0x00adad00ad00adadULL,
2901ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x000f0f000f000f0fULL, 0x00caca00ca00cacaULL, 0x0070700070007070ULL,
2911ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00ffff00ff00ffffULL, 0x0032320032003232ULL, 0x0069690069006969ULL,
2921ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0008080008000808ULL, 0x0062620062006262ULL, 0x0000000000000000ULL,
2931ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0024240024002424ULL, 0x00d1d100d100d1d1ULL, 0x00fbfb00fb00fbfbULL,
2941ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00baba00ba00babaULL, 0x00eded00ed00ededULL, 0x0045450045004545ULL,
2951ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0081810081008181ULL, 0x0073730073007373ULL, 0x006d6d006d006d6dULL,
2961ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0084840084008484ULL, 0x009f9f009f009f9fULL, 0x00eeee00ee00eeeeULL,
2971ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x004a4a004a004a4aULL, 0x00c3c300c300c3c3ULL, 0x002e2e002e002e2eULL,
2981ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00c1c100c100c1c1ULL, 0x0001010001000101ULL, 0x00e6e600e600e6e6ULL,
2991ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0025250025002525ULL, 0x0048480048004848ULL, 0x0099990099009999ULL,
3001ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00b9b900b900b9b9ULL, 0x00b3b300b300b3b3ULL, 0x007b7b007b007b7bULL,
3011ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00f9f900f900f9f9ULL, 0x00cece00ce00ceceULL, 0x00bfbf00bf00bfbfULL,
3021ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00dfdf00df00dfdfULL, 0x0071710071007171ULL, 0x0029290029002929ULL,
3031ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00cdcd00cd00cdcdULL, 0x006c6c006c006c6cULL, 0x0013130013001313ULL,
3041ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0064640064006464ULL, 0x009b9b009b009b9bULL, 0x0063630063006363ULL,
3051ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x009d9d009d009d9dULL, 0x00c0c000c000c0c0ULL, 0x004b4b004b004b4bULL,
3061ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00b7b700b700b7b7ULL, 0x00a5a500a500a5a5ULL, 0x0089890089008989ULL,
3071ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x005f5f005f005f5fULL, 0x00b1b100b100b1b1ULL, 0x0017170017001717ULL,
3081ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00f4f400f400f4f4ULL, 0x00bcbc00bc00bcbcULL, 0x00d3d300d300d3d3ULL,
3091ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0046460046004646ULL, 0x00cfcf00cf00cfcfULL, 0x0037370037003737ULL,
3101ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x005e5e005e005e5eULL, 0x0047470047004747ULL, 0x0094940094009494ULL,
3111ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00fafa00fa00fafaULL, 0x00fcfc00fc00fcfcULL, 0x005b5b005b005b5bULL,
3121ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0097970097009797ULL, 0x00fefe00fe00fefeULL, 0x005a5a005a005a5aULL,
3131ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00acac00ac00acacULL, 0x003c3c003c003c3cULL, 0x004c4c004c004c4cULL,
3141ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0003030003000303ULL, 0x0035350035003535ULL, 0x00f3f300f300f3f3ULL,
3151ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0023230023002323ULL, 0x00b8b800b800b8b8ULL, 0x005d5d005d005d5dULL,
3161ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x006a6a006a006a6aULL, 0x0092920092009292ULL, 0x00d5d500d500d5d5ULL,
3171ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0021210021002121ULL, 0x0044440044004444ULL, 0x0051510051005151ULL,
3181ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00c6c600c600c6c6ULL, 0x007d7d007d007d7dULL, 0x0039390039003939ULL,
3191ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0083830083008383ULL, 0x00dcdc00dc00dcdcULL, 0x00aaaa00aa00aaaaULL,
3201ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x007c7c007c007c7cULL, 0x0077770077007777ULL, 0x0056560056005656ULL,
3211ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0005050005000505ULL, 0x001b1b001b001b1bULL, 0x00a4a400a400a4a4ULL,
3221ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0015150015001515ULL, 0x0034340034003434ULL, 0x001e1e001e001e1eULL,
3231ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x001c1c001c001c1cULL, 0x00f8f800f800f8f8ULL, 0x0052520052005252ULL,
3241ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0020200020002020ULL, 0x0014140014001414ULL, 0x00e9e900e900e9e9ULL,
3251ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00bdbd00bd00bdbdULL, 0x00dddd00dd00ddddULL, 0x00e4e400e400e4e4ULL,
3261ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00a1a100a100a1a1ULL, 0x00e0e000e000e0e0ULL, 0x008a8a008a008a8aULL,
3271ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00f1f100f100f1f1ULL, 0x00d6d600d600d6d6ULL, 0x007a7a007a007a7aULL,
3281ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00bbbb00bb00bbbbULL, 0x00e3e300e300e3e3ULL, 0x0040400040004040ULL,
3291ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x004f4f004f004f4fULL,
3300b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna};
3310b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
332f22d08111a1d23f7432ee8d9c2dd637deb6963bdAndi Kleen__visible const u64 camellia_sp00444404[256] = {
3331ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000707070700070ULL, 0x00002c2c2c2c002cULL, 0x0000b3b3b3b300b3ULL,
3341ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000c0c0c0c000c0ULL, 0x0000e4e4e4e400e4ULL, 0x0000575757570057ULL,
3351ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000eaeaeaea00eaULL, 0x0000aeaeaeae00aeULL, 0x0000232323230023ULL,
3361ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00006b6b6b6b006bULL, 0x0000454545450045ULL, 0x0000a5a5a5a500a5ULL,
3371ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000edededed00edULL, 0x00004f4f4f4f004fULL, 0x00001d1d1d1d001dULL,
3381ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000929292920092ULL, 0x0000868686860086ULL, 0x0000afafafaf00afULL,
3391ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00007c7c7c7c007cULL, 0x00001f1f1f1f001fULL, 0x00003e3e3e3e003eULL,
3401ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000dcdcdcdc00dcULL, 0x00005e5e5e5e005eULL, 0x00000b0b0b0b000bULL,
3411ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000a6a6a6a600a6ULL, 0x0000393939390039ULL, 0x0000d5d5d5d500d5ULL,
3421ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00005d5d5d5d005dULL, 0x0000d9d9d9d900d9ULL, 0x00005a5a5a5a005aULL,
3431ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000515151510051ULL, 0x00006c6c6c6c006cULL, 0x00008b8b8b8b008bULL,
3441ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00009a9a9a9a009aULL, 0x0000fbfbfbfb00fbULL, 0x0000b0b0b0b000b0ULL,
3451ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000747474740074ULL, 0x00002b2b2b2b002bULL, 0x0000f0f0f0f000f0ULL,
3461ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000848484840084ULL, 0x0000dfdfdfdf00dfULL, 0x0000cbcbcbcb00cbULL,
3471ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000343434340034ULL, 0x0000767676760076ULL, 0x00006d6d6d6d006dULL,
3481ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000a9a9a9a900a9ULL, 0x0000d1d1d1d100d1ULL, 0x0000040404040004ULL,
3491ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000141414140014ULL, 0x00003a3a3a3a003aULL, 0x0000dededede00deULL,
3501ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000111111110011ULL, 0x0000323232320032ULL, 0x00009c9c9c9c009cULL,
3511ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000535353530053ULL, 0x0000f2f2f2f200f2ULL, 0x0000fefefefe00feULL,
3521ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000cfcfcfcf00cfULL, 0x0000c3c3c3c300c3ULL, 0x00007a7a7a7a007aULL,
3531ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000242424240024ULL, 0x0000e8e8e8e800e8ULL, 0x0000606060600060ULL,
3541ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000696969690069ULL, 0x0000aaaaaaaa00aaULL, 0x0000a0a0a0a000a0ULL,
3551ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000a1a1a1a100a1ULL, 0x0000626262620062ULL, 0x0000545454540054ULL,
3561ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00001e1e1e1e001eULL, 0x0000e0e0e0e000e0ULL, 0x0000646464640064ULL,
3571ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000101010100010ULL, 0x0000000000000000ULL, 0x0000a3a3a3a300a3ULL,
3581ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000757575750075ULL, 0x00008a8a8a8a008aULL, 0x0000e6e6e6e600e6ULL,
3591ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000090909090009ULL, 0x0000dddddddd00ddULL, 0x0000878787870087ULL,
3601ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000838383830083ULL, 0x0000cdcdcdcd00cdULL, 0x0000909090900090ULL,
3611ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000737373730073ULL, 0x0000f6f6f6f600f6ULL, 0x00009d9d9d9d009dULL,
3621ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000bfbfbfbf00bfULL, 0x0000525252520052ULL, 0x0000d8d8d8d800d8ULL,
3631ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000c8c8c8c800c8ULL, 0x0000c6c6c6c600c6ULL, 0x0000818181810081ULL,
3641ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00006f6f6f6f006fULL, 0x0000131313130013ULL, 0x0000636363630063ULL,
3651ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000e9e9e9e900e9ULL, 0x0000a7a7a7a700a7ULL, 0x00009f9f9f9f009fULL,
3661ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000bcbcbcbc00bcULL, 0x0000292929290029ULL, 0x0000f9f9f9f900f9ULL,
3671ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00002f2f2f2f002fULL, 0x0000b4b4b4b400b4ULL, 0x0000787878780078ULL,
3681ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000060606060006ULL, 0x0000e7e7e7e700e7ULL, 0x0000717171710071ULL,
3691ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000d4d4d4d400d4ULL, 0x0000abababab00abULL, 0x0000888888880088ULL,
3701ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00008d8d8d8d008dULL, 0x0000727272720072ULL, 0x0000b9b9b9b900b9ULL,
3711ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000f8f8f8f800f8ULL, 0x0000acacacac00acULL, 0x0000363636360036ULL,
3721ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00002a2a2a2a002aULL, 0x00003c3c3c3c003cULL, 0x0000f1f1f1f100f1ULL,
3731ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000404040400040ULL, 0x0000d3d3d3d300d3ULL, 0x0000bbbbbbbb00bbULL,
3741ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000434343430043ULL, 0x0000151515150015ULL, 0x0000adadadad00adULL,
3751ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000777777770077ULL, 0x0000808080800080ULL, 0x0000828282820082ULL,
3761ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000ecececec00ecULL, 0x0000272727270027ULL, 0x0000e5e5e5e500e5ULL,
3771ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000858585850085ULL, 0x0000353535350035ULL, 0x00000c0c0c0c000cULL,
3781ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000414141410041ULL, 0x0000efefefef00efULL, 0x0000939393930093ULL,
3791ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000191919190019ULL, 0x0000212121210021ULL, 0x00000e0e0e0e000eULL,
3801ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00004e4e4e4e004eULL, 0x0000656565650065ULL, 0x0000bdbdbdbd00bdULL,
3811ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000b8b8b8b800b8ULL, 0x00008f8f8f8f008fULL, 0x0000ebebebeb00ebULL,
3821ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000cececece00ceULL, 0x0000303030300030ULL, 0x00005f5f5f5f005fULL,
3831ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000c5c5c5c500c5ULL, 0x00001a1a1a1a001aULL, 0x0000e1e1e1e100e1ULL,
3841ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000cacacaca00caULL, 0x0000474747470047ULL, 0x00003d3d3d3d003dULL,
3851ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000010101010001ULL, 0x0000d6d6d6d600d6ULL, 0x0000565656560056ULL,
3861ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00004d4d4d4d004dULL, 0x00000d0d0d0d000dULL, 0x0000666666660066ULL,
3871ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000cccccccc00ccULL, 0x00002d2d2d2d002dULL, 0x0000121212120012ULL,
3881ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000202020200020ULL, 0x0000b1b1b1b100b1ULL, 0x0000999999990099ULL,
3891ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00004c4c4c4c004cULL, 0x0000c2c2c2c200c2ULL, 0x00007e7e7e7e007eULL,
3901ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000050505050005ULL, 0x0000b7b7b7b700b7ULL, 0x0000313131310031ULL,
3911ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000171717170017ULL, 0x0000d7d7d7d700d7ULL, 0x0000585858580058ULL,
3921ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000616161610061ULL, 0x00001b1b1b1b001bULL, 0x00001c1c1c1c001cULL,
3931ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00000f0f0f0f000fULL, 0x0000161616160016ULL, 0x0000181818180018ULL,
3941ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000222222220022ULL, 0x0000444444440044ULL, 0x0000b2b2b2b200b2ULL,
3951ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000b5b5b5b500b5ULL, 0x0000919191910091ULL, 0x0000080808080008ULL,
3961ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000a8a8a8a800a8ULL, 0x0000fcfcfcfc00fcULL, 0x0000505050500050ULL,
3971ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000d0d0d0d000d0ULL, 0x00007d7d7d7d007dULL, 0x0000898989890089ULL,
3981ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000979797970097ULL, 0x00005b5b5b5b005bULL, 0x0000959595950095ULL,
3991ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000ffffffff00ffULL, 0x0000d2d2d2d200d2ULL, 0x0000c4c4c4c400c4ULL,
4001ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000484848480048ULL, 0x0000f7f7f7f700f7ULL, 0x0000dbdbdbdb00dbULL,
4011ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000030303030003ULL, 0x0000dadadada00daULL, 0x00003f3f3f3f003fULL,
4021ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000949494940094ULL, 0x00005c5c5c5c005cULL, 0x0000020202020002ULL,
4031ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00004a4a4a4a004aULL, 0x0000333333330033ULL, 0x0000676767670067ULL,
4041ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000f3f3f3f300f3ULL, 0x00007f7f7f7f007fULL, 0x0000e2e2e2e200e2ULL,
4051ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00009b9b9b9b009bULL, 0x0000262626260026ULL, 0x0000373737370037ULL,
4061ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00003b3b3b3b003bULL, 0x0000969696960096ULL, 0x00004b4b4b4b004bULL,
4071ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000bebebebe00beULL, 0x00002e2e2e2e002eULL, 0x0000797979790079ULL,
4081ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00008c8c8c8c008cULL, 0x00006e6e6e6e006eULL, 0x00008e8e8e8e008eULL,
4091ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000f5f5f5f500f5ULL, 0x0000b6b6b6b600b6ULL, 0x0000fdfdfdfd00fdULL,
4101ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000595959590059ULL, 0x0000989898980098ULL, 0x00006a6a6a6a006aULL,
4111ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000464646460046ULL, 0x0000babababa00baULL, 0x0000252525250025ULL,
4121ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000424242420042ULL, 0x0000a2a2a2a200a2ULL, 0x0000fafafafa00faULL,
4131ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000070707070007ULL, 0x0000555555550055ULL, 0x0000eeeeeeee00eeULL,
4141ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00000a0a0a0a000aULL, 0x0000494949490049ULL, 0x0000686868680068ULL,
4151ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000383838380038ULL, 0x0000a4a4a4a400a4ULL, 0x0000282828280028ULL,
4161ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00007b7b7b7b007bULL, 0x0000c9c9c9c900c9ULL, 0x0000c1c1c1c100c1ULL,
4171ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0000e3e3e3e300e3ULL, 0x0000f4f4f4f400f4ULL, 0x0000c7c7c7c700c7ULL,
4181ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00009e9e9e9e009eULL,
4190b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna};
4200b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
421f22d08111a1d23f7432ee8d9c2dd637deb6963bdAndi Kleen__visible const u64 camellia_sp02220222[256] = {
4221ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00e0e0e000e0e0e0ULL, 0x0005050500050505ULL, 0x0058585800585858ULL,
4231ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00d9d9d900d9d9d9ULL, 0x0067676700676767ULL, 0x004e4e4e004e4e4eULL,
4241ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0081818100818181ULL, 0x00cbcbcb00cbcbcbULL, 0x00c9c9c900c9c9c9ULL,
4251ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x000b0b0b000b0b0bULL, 0x00aeaeae00aeaeaeULL, 0x006a6a6a006a6a6aULL,
4261ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00d5d5d500d5d5d5ULL, 0x0018181800181818ULL, 0x005d5d5d005d5d5dULL,
4271ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0082828200828282ULL, 0x0046464600464646ULL, 0x00dfdfdf00dfdfdfULL,
4281ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00d6d6d600d6d6d6ULL, 0x0027272700272727ULL, 0x008a8a8a008a8a8aULL,
4291ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0032323200323232ULL, 0x004b4b4b004b4b4bULL, 0x0042424200424242ULL,
4301ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00dbdbdb00dbdbdbULL, 0x001c1c1c001c1c1cULL, 0x009e9e9e009e9e9eULL,
4311ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x009c9c9c009c9c9cULL, 0x003a3a3a003a3a3aULL, 0x00cacaca00cacacaULL,
4321ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0025252500252525ULL, 0x007b7b7b007b7b7bULL, 0x000d0d0d000d0d0dULL,
4331ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0071717100717171ULL, 0x005f5f5f005f5f5fULL, 0x001f1f1f001f1f1fULL,
4341ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00f8f8f800f8f8f8ULL, 0x00d7d7d700d7d7d7ULL, 0x003e3e3e003e3e3eULL,
4351ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x009d9d9d009d9d9dULL, 0x007c7c7c007c7c7cULL, 0x0060606000606060ULL,
4361ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00b9b9b900b9b9b9ULL, 0x00bebebe00bebebeULL, 0x00bcbcbc00bcbcbcULL,
4371ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x008b8b8b008b8b8bULL, 0x0016161600161616ULL, 0x0034343400343434ULL,
4381ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x004d4d4d004d4d4dULL, 0x00c3c3c300c3c3c3ULL, 0x0072727200727272ULL,
4391ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0095959500959595ULL, 0x00ababab00abababULL, 0x008e8e8e008e8e8eULL,
4401ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00bababa00bababaULL, 0x007a7a7a007a7a7aULL, 0x00b3b3b300b3b3b3ULL,
4411ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0002020200020202ULL, 0x00b4b4b400b4b4b4ULL, 0x00adadad00adadadULL,
4421ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00a2a2a200a2a2a2ULL, 0x00acacac00acacacULL, 0x00d8d8d800d8d8d8ULL,
4431ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x009a9a9a009a9a9aULL, 0x0017171700171717ULL, 0x001a1a1a001a1a1aULL,
4441ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0035353500353535ULL, 0x00cccccc00ccccccULL, 0x00f7f7f700f7f7f7ULL,
4451ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0099999900999999ULL, 0x0061616100616161ULL, 0x005a5a5a005a5a5aULL,
4461ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00e8e8e800e8e8e8ULL, 0x0024242400242424ULL, 0x0056565600565656ULL,
4471ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0040404000404040ULL, 0x00e1e1e100e1e1e1ULL, 0x0063636300636363ULL,
4481ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0009090900090909ULL, 0x0033333300333333ULL, 0x00bfbfbf00bfbfbfULL,
4491ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0098989800989898ULL, 0x0097979700979797ULL, 0x0085858500858585ULL,
4501ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0068686800686868ULL, 0x00fcfcfc00fcfcfcULL, 0x00ececec00ecececULL,
4511ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x000a0a0a000a0a0aULL, 0x00dadada00dadadaULL, 0x006f6f6f006f6f6fULL,
4521ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0053535300535353ULL, 0x0062626200626262ULL, 0x00a3a3a300a3a3a3ULL,
4531ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x002e2e2e002e2e2eULL, 0x0008080800080808ULL, 0x00afafaf00afafafULL,
4541ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0028282800282828ULL, 0x00b0b0b000b0b0b0ULL, 0x0074747400747474ULL,
4551ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00c2c2c200c2c2c2ULL, 0x00bdbdbd00bdbdbdULL, 0x0036363600363636ULL,
4561ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0022222200222222ULL, 0x0038383800383838ULL, 0x0064646400646464ULL,
4571ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x001e1e1e001e1e1eULL, 0x0039393900393939ULL, 0x002c2c2c002c2c2cULL,
4581ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00a6a6a600a6a6a6ULL, 0x0030303000303030ULL, 0x00e5e5e500e5e5e5ULL,
4591ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0044444400444444ULL, 0x00fdfdfd00fdfdfdULL, 0x0088888800888888ULL,
4601ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x009f9f9f009f9f9fULL, 0x0065656500656565ULL, 0x0087878700878787ULL,
4611ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x006b6b6b006b6b6bULL, 0x00f4f4f400f4f4f4ULL, 0x0023232300232323ULL,
4621ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0048484800484848ULL, 0x0010101000101010ULL, 0x00d1d1d100d1d1d1ULL,
4631ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0051515100515151ULL, 0x00c0c0c000c0c0c0ULL, 0x00f9f9f900f9f9f9ULL,
4641ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00d2d2d200d2d2d2ULL, 0x00a0a0a000a0a0a0ULL, 0x0055555500555555ULL,
4651ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00a1a1a100a1a1a1ULL, 0x0041414100414141ULL, 0x00fafafa00fafafaULL,
4661ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0043434300434343ULL, 0x0013131300131313ULL, 0x00c4c4c400c4c4c4ULL,
4671ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x002f2f2f002f2f2fULL, 0x00a8a8a800a8a8a8ULL, 0x00b6b6b600b6b6b6ULL,
4681ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x003c3c3c003c3c3cULL, 0x002b2b2b002b2b2bULL, 0x00c1c1c100c1c1c1ULL,
4691ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00ffffff00ffffffULL, 0x00c8c8c800c8c8c8ULL, 0x00a5a5a500a5a5a5ULL,
4701ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0020202000202020ULL, 0x0089898900898989ULL, 0x0000000000000000ULL,
4711ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0090909000909090ULL, 0x0047474700474747ULL, 0x00efefef00efefefULL,
4721ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00eaeaea00eaeaeaULL, 0x00b7b7b700b7b7b7ULL, 0x0015151500151515ULL,
4731ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0006060600060606ULL, 0x00cdcdcd00cdcdcdULL, 0x00b5b5b500b5b5b5ULL,
4741ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0012121200121212ULL, 0x007e7e7e007e7e7eULL, 0x00bbbbbb00bbbbbbULL,
4751ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0029292900292929ULL, 0x000f0f0f000f0f0fULL, 0x00b8b8b800b8b8b8ULL,
4761ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0007070700070707ULL, 0x0004040400040404ULL, 0x009b9b9b009b9b9bULL,
4771ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0094949400949494ULL, 0x0021212100212121ULL, 0x0066666600666666ULL,
4781ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00e6e6e600e6e6e6ULL, 0x00cecece00cececeULL, 0x00ededed00edededULL,
4791ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00e7e7e700e7e7e7ULL, 0x003b3b3b003b3b3bULL, 0x00fefefe00fefefeULL,
4801ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x007f7f7f007f7f7fULL, 0x00c5c5c500c5c5c5ULL, 0x00a4a4a400a4a4a4ULL,
4811ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0037373700373737ULL, 0x00b1b1b100b1b1b1ULL, 0x004c4c4c004c4c4cULL,
4821ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0091919100919191ULL, 0x006e6e6e006e6e6eULL, 0x008d8d8d008d8d8dULL,
4831ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0076767600767676ULL, 0x0003030300030303ULL, 0x002d2d2d002d2d2dULL,
4841ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00dedede00dededeULL, 0x0096969600969696ULL, 0x0026262600262626ULL,
4851ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x007d7d7d007d7d7dULL, 0x00c6c6c600c6c6c6ULL, 0x005c5c5c005c5c5cULL,
4861ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00d3d3d300d3d3d3ULL, 0x00f2f2f200f2f2f2ULL, 0x004f4f4f004f4f4fULL,
4871ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0019191900191919ULL, 0x003f3f3f003f3f3fULL, 0x00dcdcdc00dcdcdcULL,
4881ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0079797900797979ULL, 0x001d1d1d001d1d1dULL, 0x0052525200525252ULL,
4891ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00ebebeb00ebebebULL, 0x00f3f3f300f3f3f3ULL, 0x006d6d6d006d6d6dULL,
4901ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x005e5e5e005e5e5eULL, 0x00fbfbfb00fbfbfbULL, 0x0069696900696969ULL,
4911ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00b2b2b200b2b2b2ULL, 0x00f0f0f000f0f0f0ULL, 0x0031313100313131ULL,
4921ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x000c0c0c000c0c0cULL, 0x00d4d4d400d4d4d4ULL, 0x00cfcfcf00cfcfcfULL,
4931ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x008c8c8c008c8c8cULL, 0x00e2e2e200e2e2e2ULL, 0x0075757500757575ULL,
4941ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00a9a9a900a9a9a9ULL, 0x004a4a4a004a4a4aULL, 0x0057575700575757ULL,
4951ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0084848400848484ULL, 0x0011111100111111ULL, 0x0045454500454545ULL,
4961ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x001b1b1b001b1b1bULL, 0x00f5f5f500f5f5f5ULL, 0x00e4e4e400e4e4e4ULL,
4971ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x000e0e0e000e0e0eULL, 0x0073737300737373ULL, 0x00aaaaaa00aaaaaaULL,
4981ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00f1f1f100f1f1f1ULL, 0x00dddddd00ddddddULL, 0x0059595900595959ULL,
4991ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0014141400141414ULL, 0x006c6c6c006c6c6cULL, 0x0092929200929292ULL,
5001ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0054545400545454ULL, 0x00d0d0d000d0d0d0ULL, 0x0078787800787878ULL,
5011ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0070707000707070ULL, 0x00e3e3e300e3e3e3ULL, 0x0049494900494949ULL,
5021ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0080808000808080ULL, 0x0050505000505050ULL, 0x00a7a7a700a7a7a7ULL,
5031ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00f6f6f600f6f6f6ULL, 0x0077777700777777ULL, 0x0093939300939393ULL,
5041ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0086868600868686ULL, 0x0083838300838383ULL, 0x002a2a2a002a2a2aULL,
5051ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00c7c7c700c7c7c7ULL, 0x005b5b5b005b5b5bULL, 0x00e9e9e900e9e9e9ULL,
5061ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x00eeeeee00eeeeeeULL, 0x008f8f8f008f8f8fULL, 0x0001010100010101ULL,
5071ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x003d3d3d003d3d3dULL,
5080b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna};
5090b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
510f22d08111a1d23f7432ee8d9c2dd637deb6963bdAndi Kleen__visible const u64 camellia_sp30333033[256] = {
5111ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x3800383838003838ULL, 0x4100414141004141ULL, 0x1600161616001616ULL,
5121ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7600767676007676ULL, 0xd900d9d9d900d9d9ULL, 0x9300939393009393ULL,
5131ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6000606060006060ULL, 0xf200f2f2f200f2f2ULL, 0x7200727272007272ULL,
5141ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xc200c2c2c200c2c2ULL, 0xab00ababab00ababULL, 0x9a009a9a9a009a9aULL,
5151ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7500757575007575ULL, 0x0600060606000606ULL, 0x5700575757005757ULL,
5161ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa000a0a0a000a0a0ULL, 0x9100919191009191ULL, 0xf700f7f7f700f7f7ULL,
5171ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xb500b5b5b500b5b5ULL, 0xc900c9c9c900c9c9ULL, 0xa200a2a2a200a2a2ULL,
5181ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8c008c8c8c008c8cULL, 0xd200d2d2d200d2d2ULL, 0x9000909090009090ULL,
5191ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xf600f6f6f600f6f6ULL, 0x0700070707000707ULL, 0xa700a7a7a700a7a7ULL,
5201ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2700272727002727ULL, 0x8e008e8e8e008e8eULL, 0xb200b2b2b200b2b2ULL,
5211ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4900494949004949ULL, 0xde00dedede00dedeULL, 0x4300434343004343ULL,
5221ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5c005c5c5c005c5cULL, 0xd700d7d7d700d7d7ULL, 0xc700c7c7c700c7c7ULL,
5231ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x3e003e3e3e003e3eULL, 0xf500f5f5f500f5f5ULL, 0x8f008f8f8f008f8fULL,
5241ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6700676767006767ULL, 0x1f001f1f1f001f1fULL, 0x1800181818001818ULL,
5251ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6e006e6e6e006e6eULL, 0xaf00afafaf00afafULL, 0x2f002f2f2f002f2fULL,
5261ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xe200e2e2e200e2e2ULL, 0x8500858585008585ULL, 0x0d000d0d0d000d0dULL,
5271ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5300535353005353ULL, 0xf000f0f0f000f0f0ULL, 0x9c009c9c9c009c9cULL,
5281ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6500656565006565ULL, 0xea00eaeaea00eaeaULL, 0xa300a3a3a300a3a3ULL,
5291ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xae00aeaeae00aeaeULL, 0x9e009e9e9e009e9eULL, 0xec00ececec00ececULL,
5301ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8000808080008080ULL, 0x2d002d2d2d002d2dULL, 0x6b006b6b6b006b6bULL,
5311ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa800a8a8a800a8a8ULL, 0x2b002b2b2b002b2bULL, 0x3600363636003636ULL,
5321ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa600a6a6a600a6a6ULL, 0xc500c5c5c500c5c5ULL, 0x8600868686008686ULL,
5331ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4d004d4d4d004d4dULL, 0x3300333333003333ULL, 0xfd00fdfdfd00fdfdULL,
5341ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6600666666006666ULL, 0x5800585858005858ULL, 0x9600969696009696ULL,
5351ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x3a003a3a3a003a3aULL, 0x0900090909000909ULL, 0x9500959595009595ULL,
5361ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1000101010001010ULL, 0x7800787878007878ULL, 0xd800d8d8d800d8d8ULL,
5371ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4200424242004242ULL, 0xcc00cccccc00ccccULL, 0xef00efefef00efefULL,
5381ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2600262626002626ULL, 0xe500e5e5e500e5e5ULL, 0x6100616161006161ULL,
5391ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1a001a1a1a001a1aULL, 0x3f003f3f3f003f3fULL, 0x3b003b3b3b003b3bULL,
5401ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8200828282008282ULL, 0xb600b6b6b600b6b6ULL, 0xdb00dbdbdb00dbdbULL,
5411ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xd400d4d4d400d4d4ULL, 0x9800989898009898ULL, 0xe800e8e8e800e8e8ULL,
5421ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8b008b8b8b008b8bULL, 0x0200020202000202ULL, 0xeb00ebebeb00ebebULL,
5431ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0a000a0a0a000a0aULL, 0x2c002c2c2c002c2cULL, 0x1d001d1d1d001d1dULL,
5441ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xb000b0b0b000b0b0ULL, 0x6f006f6f6f006f6fULL, 0x8d008d8d8d008d8dULL,
5451ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8800888888008888ULL, 0x0e000e0e0e000e0eULL, 0x1900191919001919ULL,
5461ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8700878787008787ULL, 0x4e004e4e4e004e4eULL, 0x0b000b0b0b000b0bULL,
5471ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa900a9a9a900a9a9ULL, 0x0c000c0c0c000c0cULL, 0x7900797979007979ULL,
5481ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1100111111001111ULL, 0x7f007f7f7f007f7fULL, 0x2200222222002222ULL,
5491ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xe700e7e7e700e7e7ULL, 0x5900595959005959ULL, 0xe100e1e1e100e1e1ULL,
5501ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xda00dadada00dadaULL, 0x3d003d3d3d003d3dULL, 0xc800c8c8c800c8c8ULL,
5511ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1200121212001212ULL, 0x0400040404000404ULL, 0x7400747474007474ULL,
5521ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5400545454005454ULL, 0x3000303030003030ULL, 0x7e007e7e7e007e7eULL,
5531ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xb400b4b4b400b4b4ULL, 0x2800282828002828ULL, 0x5500555555005555ULL,
5541ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6800686868006868ULL, 0x5000505050005050ULL, 0xbe00bebebe00bebeULL,
5551ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xd000d0d0d000d0d0ULL, 0xc400c4c4c400c4c4ULL, 0x3100313131003131ULL,
5561ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xcb00cbcbcb00cbcbULL, 0x2a002a2a2a002a2aULL, 0xad00adadad00adadULL,
5571ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0f000f0f0f000f0fULL, 0xca00cacaca00cacaULL, 0x7000707070007070ULL,
5581ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xff00ffffff00ffffULL, 0x3200323232003232ULL, 0x6900696969006969ULL,
5591ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0800080808000808ULL, 0x6200626262006262ULL, 0x0000000000000000ULL,
5601ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2400242424002424ULL, 0xd100d1d1d100d1d1ULL, 0xfb00fbfbfb00fbfbULL,
5611ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xba00bababa00babaULL, 0xed00ededed00ededULL, 0x4500454545004545ULL,
5621ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8100818181008181ULL, 0x7300737373007373ULL, 0x6d006d6d6d006d6dULL,
5631ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8400848484008484ULL, 0x9f009f9f9f009f9fULL, 0xee00eeeeee00eeeeULL,
5641ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4a004a4a4a004a4aULL, 0xc300c3c3c300c3c3ULL, 0x2e002e2e2e002e2eULL,
5651ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xc100c1c1c100c1c1ULL, 0x0100010101000101ULL, 0xe600e6e6e600e6e6ULL,
5661ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2500252525002525ULL, 0x4800484848004848ULL, 0x9900999999009999ULL,
5671ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xb900b9b9b900b9b9ULL, 0xb300b3b3b300b3b3ULL, 0x7b007b7b7b007b7bULL,
5681ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xf900f9f9f900f9f9ULL, 0xce00cecece00ceceULL, 0xbf00bfbfbf00bfbfULL,
5691ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xdf00dfdfdf00dfdfULL, 0x7100717171007171ULL, 0x2900292929002929ULL,
5701ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xcd00cdcdcd00cdcdULL, 0x6c006c6c6c006c6cULL, 0x1300131313001313ULL,
5711ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6400646464006464ULL, 0x9b009b9b9b009b9bULL, 0x6300636363006363ULL,
5721ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9d009d9d9d009d9dULL, 0xc000c0c0c000c0c0ULL, 0x4b004b4b4b004b4bULL,
5731ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xb700b7b7b700b7b7ULL, 0xa500a5a5a500a5a5ULL, 0x8900898989008989ULL,
5741ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5f005f5f5f005f5fULL, 0xb100b1b1b100b1b1ULL, 0x1700171717001717ULL,
5751ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xf400f4f4f400f4f4ULL, 0xbc00bcbcbc00bcbcULL, 0xd300d3d3d300d3d3ULL,
5761ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4600464646004646ULL, 0xcf00cfcfcf00cfcfULL, 0x3700373737003737ULL,
5771ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5e005e5e5e005e5eULL, 0x4700474747004747ULL, 0x9400949494009494ULL,
5781ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xfa00fafafa00fafaULL, 0xfc00fcfcfc00fcfcULL, 0x5b005b5b5b005b5bULL,
5791ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9700979797009797ULL, 0xfe00fefefe00fefeULL, 0x5a005a5a5a005a5aULL,
5801ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xac00acacac00acacULL, 0x3c003c3c3c003c3cULL, 0x4c004c4c4c004c4cULL,
5811ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0300030303000303ULL, 0x3500353535003535ULL, 0xf300f3f3f300f3f3ULL,
5821ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2300232323002323ULL, 0xb800b8b8b800b8b8ULL, 0x5d005d5d5d005d5dULL,
5831ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6a006a6a6a006a6aULL, 0x9200929292009292ULL, 0xd500d5d5d500d5d5ULL,
5841ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2100212121002121ULL, 0x4400444444004444ULL, 0x5100515151005151ULL,
5851ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xc600c6c6c600c6c6ULL, 0x7d007d7d7d007d7dULL, 0x3900393939003939ULL,
5861ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8300838383008383ULL, 0xdc00dcdcdc00dcdcULL, 0xaa00aaaaaa00aaaaULL,
5871ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7c007c7c7c007c7cULL, 0x7700777777007777ULL, 0x5600565656005656ULL,
5881ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0500050505000505ULL, 0x1b001b1b1b001b1bULL, 0xa400a4a4a400a4a4ULL,
5891ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1500151515001515ULL, 0x3400343434003434ULL, 0x1e001e1e1e001e1eULL,
5901ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1c001c1c1c001c1cULL, 0xf800f8f8f800f8f8ULL, 0x5200525252005252ULL,
5911ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2000202020002020ULL, 0x1400141414001414ULL, 0xe900e9e9e900e9e9ULL,
5921ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xbd00bdbdbd00bdbdULL, 0xdd00dddddd00ddddULL, 0xe400e4e4e400e4e4ULL,
5931ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa100a1a1a100a1a1ULL, 0xe000e0e0e000e0e0ULL, 0x8a008a8a8a008a8aULL,
5941ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xf100f1f1f100f1f1ULL, 0xd600d6d6d600d6d6ULL, 0x7a007a7a7a007a7aULL,
5951ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xbb00bbbbbb00bbbbULL, 0xe300e3e3e300e3e3ULL, 0x4000404040004040ULL,
5961ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4f004f4f4f004f4fULL,
5970b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna};
5980b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
599f22d08111a1d23f7432ee8d9c2dd637deb6963bdAndi Kleen__visible const u64 camellia_sp44044404[256] = {
6001ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7070007070700070ULL, 0x2c2c002c2c2c002cULL, 0xb3b300b3b3b300b3ULL,
6011ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xc0c000c0c0c000c0ULL, 0xe4e400e4e4e400e4ULL, 0x5757005757570057ULL,
6021ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xeaea00eaeaea00eaULL, 0xaeae00aeaeae00aeULL, 0x2323002323230023ULL,
6031ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6b6b006b6b6b006bULL, 0x4545004545450045ULL, 0xa5a500a5a5a500a5ULL,
6041ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xeded00ededed00edULL, 0x4f4f004f4f4f004fULL, 0x1d1d001d1d1d001dULL,
6051ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9292009292920092ULL, 0x8686008686860086ULL, 0xafaf00afafaf00afULL,
6061ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7c7c007c7c7c007cULL, 0x1f1f001f1f1f001fULL, 0x3e3e003e3e3e003eULL,
6071ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xdcdc00dcdcdc00dcULL, 0x5e5e005e5e5e005eULL, 0x0b0b000b0b0b000bULL,
6081ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa6a600a6a6a600a6ULL, 0x3939003939390039ULL, 0xd5d500d5d5d500d5ULL,
6091ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5d5d005d5d5d005dULL, 0xd9d900d9d9d900d9ULL, 0x5a5a005a5a5a005aULL,
6101ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5151005151510051ULL, 0x6c6c006c6c6c006cULL, 0x8b8b008b8b8b008bULL,
6111ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9a9a009a9a9a009aULL, 0xfbfb00fbfbfb00fbULL, 0xb0b000b0b0b000b0ULL,
6121ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7474007474740074ULL, 0x2b2b002b2b2b002bULL, 0xf0f000f0f0f000f0ULL,
6131ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8484008484840084ULL, 0xdfdf00dfdfdf00dfULL, 0xcbcb00cbcbcb00cbULL,
6141ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x3434003434340034ULL, 0x7676007676760076ULL, 0x6d6d006d6d6d006dULL,
6151ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa9a900a9a9a900a9ULL, 0xd1d100d1d1d100d1ULL, 0x0404000404040004ULL,
6161ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1414001414140014ULL, 0x3a3a003a3a3a003aULL, 0xdede00dedede00deULL,
6171ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1111001111110011ULL, 0x3232003232320032ULL, 0x9c9c009c9c9c009cULL,
6181ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5353005353530053ULL, 0xf2f200f2f2f200f2ULL, 0xfefe00fefefe00feULL,
6191ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xcfcf00cfcfcf00cfULL, 0xc3c300c3c3c300c3ULL, 0x7a7a007a7a7a007aULL,
6201ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2424002424240024ULL, 0xe8e800e8e8e800e8ULL, 0x6060006060600060ULL,
6211ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6969006969690069ULL, 0xaaaa00aaaaaa00aaULL, 0xa0a000a0a0a000a0ULL,
6221ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa1a100a1a1a100a1ULL, 0x6262006262620062ULL, 0x5454005454540054ULL,
6231ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1e1e001e1e1e001eULL, 0xe0e000e0e0e000e0ULL, 0x6464006464640064ULL,
6241ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1010001010100010ULL, 0x0000000000000000ULL, 0xa3a300a3a3a300a3ULL,
6251ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7575007575750075ULL, 0x8a8a008a8a8a008aULL, 0xe6e600e6e6e600e6ULL,
6261ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0909000909090009ULL, 0xdddd00dddddd00ddULL, 0x8787008787870087ULL,
6271ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8383008383830083ULL, 0xcdcd00cdcdcd00cdULL, 0x9090009090900090ULL,
6281ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7373007373730073ULL, 0xf6f600f6f6f600f6ULL, 0x9d9d009d9d9d009dULL,
6291ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xbfbf00bfbfbf00bfULL, 0x5252005252520052ULL, 0xd8d800d8d8d800d8ULL,
6301ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xc8c800c8c8c800c8ULL, 0xc6c600c6c6c600c6ULL, 0x8181008181810081ULL,
6311ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6f6f006f6f6f006fULL, 0x1313001313130013ULL, 0x6363006363630063ULL,
6321ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xe9e900e9e9e900e9ULL, 0xa7a700a7a7a700a7ULL, 0x9f9f009f9f9f009fULL,
6331ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xbcbc00bcbcbc00bcULL, 0x2929002929290029ULL, 0xf9f900f9f9f900f9ULL,
6341ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2f2f002f2f2f002fULL, 0xb4b400b4b4b400b4ULL, 0x7878007878780078ULL,
6351ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0606000606060006ULL, 0xe7e700e7e7e700e7ULL, 0x7171007171710071ULL,
6361ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xd4d400d4d4d400d4ULL, 0xabab00ababab00abULL, 0x8888008888880088ULL,
6371ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8d8d008d8d8d008dULL, 0x7272007272720072ULL, 0xb9b900b9b9b900b9ULL,
6381ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xf8f800f8f8f800f8ULL, 0xacac00acacac00acULL, 0x3636003636360036ULL,
6391ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2a2a002a2a2a002aULL, 0x3c3c003c3c3c003cULL, 0xf1f100f1f1f100f1ULL,
6401ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4040004040400040ULL, 0xd3d300d3d3d300d3ULL, 0xbbbb00bbbbbb00bbULL,
6411ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4343004343430043ULL, 0x1515001515150015ULL, 0xadad00adadad00adULL,
6421ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7777007777770077ULL, 0x8080008080800080ULL, 0x8282008282820082ULL,
6431ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xecec00ececec00ecULL, 0x2727002727270027ULL, 0xe5e500e5e5e500e5ULL,
6441ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8585008585850085ULL, 0x3535003535350035ULL, 0x0c0c000c0c0c000cULL,
6451ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4141004141410041ULL, 0xefef00efefef00efULL, 0x9393009393930093ULL,
6461ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1919001919190019ULL, 0x2121002121210021ULL, 0x0e0e000e0e0e000eULL,
6471ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4e4e004e4e4e004eULL, 0x6565006565650065ULL, 0xbdbd00bdbdbd00bdULL,
6481ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xb8b800b8b8b800b8ULL, 0x8f8f008f8f8f008fULL, 0xebeb00ebebeb00ebULL,
6491ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xcece00cecece00ceULL, 0x3030003030300030ULL, 0x5f5f005f5f5f005fULL,
6501ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xc5c500c5c5c500c5ULL, 0x1a1a001a1a1a001aULL, 0xe1e100e1e1e100e1ULL,
6511ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xcaca00cacaca00caULL, 0x4747004747470047ULL, 0x3d3d003d3d3d003dULL,
6521ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0101000101010001ULL, 0xd6d600d6d6d600d6ULL, 0x5656005656560056ULL,
6531ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4d4d004d4d4d004dULL, 0x0d0d000d0d0d000dULL, 0x6666006666660066ULL,
6541ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xcccc00cccccc00ccULL, 0x2d2d002d2d2d002dULL, 0x1212001212120012ULL,
6551ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2020002020200020ULL, 0xb1b100b1b1b100b1ULL, 0x9999009999990099ULL,
6561ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4c4c004c4c4c004cULL, 0xc2c200c2c2c200c2ULL, 0x7e7e007e7e7e007eULL,
6571ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0505000505050005ULL, 0xb7b700b7b7b700b7ULL, 0x3131003131310031ULL,
6581ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1717001717170017ULL, 0xd7d700d7d7d700d7ULL, 0x5858005858580058ULL,
6591ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6161006161610061ULL, 0x1b1b001b1b1b001bULL, 0x1c1c001c1c1c001cULL,
6601ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0f0f000f0f0f000fULL, 0x1616001616160016ULL, 0x1818001818180018ULL,
6611ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2222002222220022ULL, 0x4444004444440044ULL, 0xb2b200b2b2b200b2ULL,
6621ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xb5b500b5b5b500b5ULL, 0x9191009191910091ULL, 0x0808000808080008ULL,
6631ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa8a800a8a8a800a8ULL, 0xfcfc00fcfcfc00fcULL, 0x5050005050500050ULL,
6641ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xd0d000d0d0d000d0ULL, 0x7d7d007d7d7d007dULL, 0x8989008989890089ULL,
6651ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9797009797970097ULL, 0x5b5b005b5b5b005bULL, 0x9595009595950095ULL,
6661ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xffff00ffffff00ffULL, 0xd2d200d2d2d200d2ULL, 0xc4c400c4c4c400c4ULL,
6671ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4848004848480048ULL, 0xf7f700f7f7f700f7ULL, 0xdbdb00dbdbdb00dbULL,
6681ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0303000303030003ULL, 0xdada00dadada00daULL, 0x3f3f003f3f3f003fULL,
6691ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9494009494940094ULL, 0x5c5c005c5c5c005cULL, 0x0202000202020002ULL,
6701ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4a4a004a4a4a004aULL, 0x3333003333330033ULL, 0x6767006767670067ULL,
6711ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xf3f300f3f3f300f3ULL, 0x7f7f007f7f7f007fULL, 0xe2e200e2e2e200e2ULL,
6721ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9b9b009b9b9b009bULL, 0x2626002626260026ULL, 0x3737003737370037ULL,
6731ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x3b3b003b3b3b003bULL, 0x9696009696960096ULL, 0x4b4b004b4b4b004bULL,
6741ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xbebe00bebebe00beULL, 0x2e2e002e2e2e002eULL, 0x7979007979790079ULL,
6751ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8c8c008c8c8c008cULL, 0x6e6e006e6e6e006eULL, 0x8e8e008e8e8e008eULL,
6761ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xf5f500f5f5f500f5ULL, 0xb6b600b6b6b600b6ULL, 0xfdfd00fdfdfd00fdULL,
6771ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5959005959590059ULL, 0x9898009898980098ULL, 0x6a6a006a6a6a006aULL,
6781ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4646004646460046ULL, 0xbaba00bababa00baULL, 0x2525002525250025ULL,
6791ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4242004242420042ULL, 0xa2a200a2a2a200a2ULL, 0xfafa00fafafa00faULL,
6801ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0707000707070007ULL, 0x5555005555550055ULL, 0xeeee00eeeeee00eeULL,
6811ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0a0a000a0a0a000aULL, 0x4949004949490049ULL, 0x6868006868680068ULL,
6821ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x3838003838380038ULL, 0xa4a400a4a4a400a4ULL, 0x2828002828280028ULL,
6831ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7b7b007b7b7b007bULL, 0xc9c900c9c9c900c9ULL, 0xc1c100c1c1c100c1ULL,
6841ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xe3e300e3e3e300e3ULL, 0xf4f400f4f4f400f4ULL, 0xc7c700c7c7c700c7ULL,
6851ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9e9e009e9e9e009eULL,
6860b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna};
6870b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
688f22d08111a1d23f7432ee8d9c2dd637deb6963bdAndi Kleen__visible const u64 camellia_sp11101110[256] = {
6891ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7070700070707000ULL, 0x8282820082828200ULL, 0x2c2c2c002c2c2c00ULL,
6901ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xececec00ececec00ULL, 0xb3b3b300b3b3b300ULL, 0x2727270027272700ULL,
6911ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xc0c0c000c0c0c000ULL, 0xe5e5e500e5e5e500ULL, 0xe4e4e400e4e4e400ULL,
6921ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8585850085858500ULL, 0x5757570057575700ULL, 0x3535350035353500ULL,
6931ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xeaeaea00eaeaea00ULL, 0x0c0c0c000c0c0c00ULL, 0xaeaeae00aeaeae00ULL,
6941ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4141410041414100ULL, 0x2323230023232300ULL, 0xefefef00efefef00ULL,
6951ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6b6b6b006b6b6b00ULL, 0x9393930093939300ULL, 0x4545450045454500ULL,
6961ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1919190019191900ULL, 0xa5a5a500a5a5a500ULL, 0x2121210021212100ULL,
6971ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xededed00ededed00ULL, 0x0e0e0e000e0e0e00ULL, 0x4f4f4f004f4f4f00ULL,
6981ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4e4e4e004e4e4e00ULL, 0x1d1d1d001d1d1d00ULL, 0x6565650065656500ULL,
6991ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9292920092929200ULL, 0xbdbdbd00bdbdbd00ULL, 0x8686860086868600ULL,
7001ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xb8b8b800b8b8b800ULL, 0xafafaf00afafaf00ULL, 0x8f8f8f008f8f8f00ULL,
7011ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7c7c7c007c7c7c00ULL, 0xebebeb00ebebeb00ULL, 0x1f1f1f001f1f1f00ULL,
7021ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xcecece00cecece00ULL, 0x3e3e3e003e3e3e00ULL, 0x3030300030303000ULL,
7031ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xdcdcdc00dcdcdc00ULL, 0x5f5f5f005f5f5f00ULL, 0x5e5e5e005e5e5e00ULL,
7041ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xc5c5c500c5c5c500ULL, 0x0b0b0b000b0b0b00ULL, 0x1a1a1a001a1a1a00ULL,
7051ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa6a6a600a6a6a600ULL, 0xe1e1e100e1e1e100ULL, 0x3939390039393900ULL,
7061ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xcacaca00cacaca00ULL, 0xd5d5d500d5d5d500ULL, 0x4747470047474700ULL,
7071ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5d5d5d005d5d5d00ULL, 0x3d3d3d003d3d3d00ULL, 0xd9d9d900d9d9d900ULL,
7081ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0101010001010100ULL, 0x5a5a5a005a5a5a00ULL, 0xd6d6d600d6d6d600ULL,
7091ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5151510051515100ULL, 0x5656560056565600ULL, 0x6c6c6c006c6c6c00ULL,
7101ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4d4d4d004d4d4d00ULL, 0x8b8b8b008b8b8b00ULL, 0x0d0d0d000d0d0d00ULL,
7111ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9a9a9a009a9a9a00ULL, 0x6666660066666600ULL, 0xfbfbfb00fbfbfb00ULL,
7121ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xcccccc00cccccc00ULL, 0xb0b0b000b0b0b000ULL, 0x2d2d2d002d2d2d00ULL,
7131ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7474740074747400ULL, 0x1212120012121200ULL, 0x2b2b2b002b2b2b00ULL,
7141ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2020200020202000ULL, 0xf0f0f000f0f0f000ULL, 0xb1b1b100b1b1b100ULL,
7151ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8484840084848400ULL, 0x9999990099999900ULL, 0xdfdfdf00dfdfdf00ULL,
7161ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4c4c4c004c4c4c00ULL, 0xcbcbcb00cbcbcb00ULL, 0xc2c2c200c2c2c200ULL,
7171ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x3434340034343400ULL, 0x7e7e7e007e7e7e00ULL, 0x7676760076767600ULL,
7181ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0505050005050500ULL, 0x6d6d6d006d6d6d00ULL, 0xb7b7b700b7b7b700ULL,
7191ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa9a9a900a9a9a900ULL, 0x3131310031313100ULL, 0xd1d1d100d1d1d100ULL,
7201ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1717170017171700ULL, 0x0404040004040400ULL, 0xd7d7d700d7d7d700ULL,
7211ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1414140014141400ULL, 0x5858580058585800ULL, 0x3a3a3a003a3a3a00ULL,
7221ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6161610061616100ULL, 0xdedede00dedede00ULL, 0x1b1b1b001b1b1b00ULL,
7231ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1111110011111100ULL, 0x1c1c1c001c1c1c00ULL, 0x3232320032323200ULL,
7241ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0f0f0f000f0f0f00ULL, 0x9c9c9c009c9c9c00ULL, 0x1616160016161600ULL,
7251ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5353530053535300ULL, 0x1818180018181800ULL, 0xf2f2f200f2f2f200ULL,
7261ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2222220022222200ULL, 0xfefefe00fefefe00ULL, 0x4444440044444400ULL,
7271ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xcfcfcf00cfcfcf00ULL, 0xb2b2b200b2b2b200ULL, 0xc3c3c300c3c3c300ULL,
7281ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xb5b5b500b5b5b500ULL, 0x7a7a7a007a7a7a00ULL, 0x9191910091919100ULL,
7291ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2424240024242400ULL, 0x0808080008080800ULL, 0xe8e8e800e8e8e800ULL,
7301ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa8a8a800a8a8a800ULL, 0x6060600060606000ULL, 0xfcfcfc00fcfcfc00ULL,
7311ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6969690069696900ULL, 0x5050500050505000ULL, 0xaaaaaa00aaaaaa00ULL,
7321ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xd0d0d000d0d0d000ULL, 0xa0a0a000a0a0a000ULL, 0x7d7d7d007d7d7d00ULL,
7331ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xa1a1a100a1a1a100ULL, 0x8989890089898900ULL, 0x6262620062626200ULL,
7341ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9797970097979700ULL, 0x5454540054545400ULL, 0x5b5b5b005b5b5b00ULL,
7351ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1e1e1e001e1e1e00ULL, 0x9595950095959500ULL, 0xe0e0e000e0e0e000ULL,
7361ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xffffff00ffffff00ULL, 0x6464640064646400ULL, 0xd2d2d200d2d2d200ULL,
7371ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x1010100010101000ULL, 0xc4c4c400c4c4c400ULL, 0x0000000000000000ULL,
7381ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4848480048484800ULL, 0xa3a3a300a3a3a300ULL, 0xf7f7f700f7f7f700ULL,
7391ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7575750075757500ULL, 0xdbdbdb00dbdbdb00ULL, 0x8a8a8a008a8a8a00ULL,
7401ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0303030003030300ULL, 0xe6e6e600e6e6e600ULL, 0xdadada00dadada00ULL,
7411ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0909090009090900ULL, 0x3f3f3f003f3f3f00ULL, 0xdddddd00dddddd00ULL,
7421ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9494940094949400ULL, 0x8787870087878700ULL, 0x5c5c5c005c5c5c00ULL,
7431ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8383830083838300ULL, 0x0202020002020200ULL, 0xcdcdcd00cdcdcd00ULL,
7441ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4a4a4a004a4a4a00ULL, 0x9090900090909000ULL, 0x3333330033333300ULL,
7451ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7373730073737300ULL, 0x6767670067676700ULL, 0xf6f6f600f6f6f600ULL,
7461ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xf3f3f300f3f3f300ULL, 0x9d9d9d009d9d9d00ULL, 0x7f7f7f007f7f7f00ULL,
7471ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xbfbfbf00bfbfbf00ULL, 0xe2e2e200e2e2e200ULL, 0x5252520052525200ULL,
7481ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9b9b9b009b9b9b00ULL, 0xd8d8d800d8d8d800ULL, 0x2626260026262600ULL,
7491ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xc8c8c800c8c8c800ULL, 0x3737370037373700ULL, 0xc6c6c600c6c6c600ULL,
7501ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x3b3b3b003b3b3b00ULL, 0x8181810081818100ULL, 0x9696960096969600ULL,
7511ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x6f6f6f006f6f6f00ULL, 0x4b4b4b004b4b4b00ULL, 0x1313130013131300ULL,
7521ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xbebebe00bebebe00ULL, 0x6363630063636300ULL, 0x2e2e2e002e2e2e00ULL,
7531ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xe9e9e900e9e9e900ULL, 0x7979790079797900ULL, 0xa7a7a700a7a7a700ULL,
7541ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8c8c8c008c8c8c00ULL, 0x9f9f9f009f9f9f00ULL, 0x6e6e6e006e6e6e00ULL,
7551ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xbcbcbc00bcbcbc00ULL, 0x8e8e8e008e8e8e00ULL, 0x2929290029292900ULL,
7561ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xf5f5f500f5f5f500ULL, 0xf9f9f900f9f9f900ULL, 0xb6b6b600b6b6b600ULL,
7571ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2f2f2f002f2f2f00ULL, 0xfdfdfd00fdfdfd00ULL, 0xb4b4b400b4b4b400ULL,
7581ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x5959590059595900ULL, 0x7878780078787800ULL, 0x9898980098989800ULL,
7591ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0606060006060600ULL, 0x6a6a6a006a6a6a00ULL, 0xe7e7e700e7e7e700ULL,
7601ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4646460046464600ULL, 0x7171710071717100ULL, 0xbababa00bababa00ULL,
7611ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xd4d4d400d4d4d400ULL, 0x2525250025252500ULL, 0xababab00ababab00ULL,
7621ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4242420042424200ULL, 0x8888880088888800ULL, 0xa2a2a200a2a2a200ULL,
7631ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x8d8d8d008d8d8d00ULL, 0xfafafa00fafafa00ULL, 0x7272720072727200ULL,
7641ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0707070007070700ULL, 0xb9b9b900b9b9b900ULL, 0x5555550055555500ULL,
7651ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xf8f8f800f8f8f800ULL, 0xeeeeee00eeeeee00ULL, 0xacacac00acacac00ULL,
7661ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x0a0a0a000a0a0a00ULL, 0x3636360036363600ULL, 0x4949490049494900ULL,
7671ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x2a2a2a002a2a2a00ULL, 0x6868680068686800ULL, 0x3c3c3c003c3c3c00ULL,
7681ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x3838380038383800ULL, 0xf1f1f100f1f1f100ULL, 0xa4a4a400a4a4a400ULL,
7691ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4040400040404000ULL, 0x2828280028282800ULL, 0xd3d3d300d3d3d300ULL,
7701ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7b7b7b007b7b7b00ULL, 0xbbbbbb00bbbbbb00ULL, 0xc9c9c900c9c9c900ULL,
7711ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x4343430043434300ULL, 0xc1c1c100c1c1c100ULL, 0x1515150015151500ULL,
7721ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0xe3e3e300e3e3e300ULL, 0xadadad00adadad00ULL, 0xf4f4f400f4f4f400ULL,
7731ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x7777770077777700ULL, 0xc7c7c700c7c7c700ULL, 0x8080800080808000ULL,
7741ffb72a39a92c1a03b3c732280e924c02c509cd3Jussi Kivilinna	0x9e9e9e009e9e9e00ULL,
7750b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna};
7760b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
7770b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna/* key constants */
7780b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#define CAMELLIA_SIGMA1L (0xA09E667FL)
7790b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#define CAMELLIA_SIGMA1R (0x3BCC908BL)
7800b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#define CAMELLIA_SIGMA2L (0xB67AE858L)
7810b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#define CAMELLIA_SIGMA2R (0x4CAA73B2L)
7820b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#define CAMELLIA_SIGMA3L (0xC6EF372FL)
7830b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#define CAMELLIA_SIGMA3R (0xE94F82BEL)
7840b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#define CAMELLIA_SIGMA4L (0x54FF53A5L)
7850b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#define CAMELLIA_SIGMA4R (0xF1D36F1CL)
7860b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#define CAMELLIA_SIGMA5L (0x10E527FAL)
7870b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#define CAMELLIA_SIGMA5R (0xDE682D1DL)
7880b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#define CAMELLIA_SIGMA6L (0xB05688C2L)
7890b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#define CAMELLIA_SIGMA6R (0xB3E6C1FDL)
7900b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
7910b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna/* macros */
7920b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#define ROLDQ(l, r, bits) ({ \
7930b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	u64 t = l;					\
7940b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	l = (l << bits) | (r >> (64 - bits));		\
7950b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	r = (r << bits) | (t >> (64 - bits));		\
7960b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna})
7970b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
7980b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#define CAMELLIA_F(x, kl, kr, y) ({ \
7990b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	u64 ii = x ^ (((u64)kl << 32) | kr);				\
8000b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	y = camellia_sp11101110[(uint8_t)ii];				\
8010b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	y ^= camellia_sp44044404[(uint8_t)(ii >> 8)];			\
8020b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ii >>= 16;							\
8030b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	y ^= camellia_sp30333033[(uint8_t)ii];				\
8040b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	y ^= camellia_sp02220222[(uint8_t)(ii >> 8)];			\
8050b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ii >>= 16;							\
8060b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	y ^= camellia_sp00444404[(uint8_t)ii];				\
8070b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	y ^= camellia_sp03303033[(uint8_t)(ii >> 8)];			\
8080b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ii >>= 16;							\
8090b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	y ^= camellia_sp22000222[(uint8_t)ii];				\
8100b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	y ^= camellia_sp10011110[(uint8_t)(ii >> 8)];			\
8110b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	y = ror64(y, 32);						\
8120b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna})
8130b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
8140b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna#define SET_SUBKEY_LR(INDEX, sRL) (subkey[(INDEX)] = ror64((sRL), 32))
8150b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
8160b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnastatic void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
8170b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
8180b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	u64 kw4, tt;
8190b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	u32 dw, tl, tr;
8200b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
8210b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* absorb kw2 to other subkeys */
8220b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 2 */
8230b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[3] ^= subRL[1];
8240b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 4 */
8250b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[5] ^= subRL[1];
8260b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 6 */
8270b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[7] ^= subRL[1];
8280b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
8290b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[1] ^= (subRL[1] & ~subRL[9]) << 32;
8300b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* modified for FLinv(kl2) */
8312a128b4b74e559e585028d0205e9729271530637Julia Lawall	dw = (subRL[1] & subRL[9]) >> 32;
8322a128b4b74e559e585028d0205e9729271530637Julia Lawall	subRL[1] ^= rol32(dw, 1);
8330b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
8340b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 8 */
8350b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[11] ^= subRL[1];
8360b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 10 */
8370b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[13] ^= subRL[1];
8380b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 12 */
8390b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[15] ^= subRL[1];
8400b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
8410b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[1] ^= (subRL[1] & ~subRL[17]) << 32;
8420b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* modified for FLinv(kl4) */
8432a128b4b74e559e585028d0205e9729271530637Julia Lawall	dw = (subRL[1] & subRL[17]) >> 32;
8442a128b4b74e559e585028d0205e9729271530637Julia Lawall	subRL[1] ^= rol32(dw, 1);
8450b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
8460b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 14 */
8470b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[19] ^= subRL[1];
8480b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 16 */
8490b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[21] ^= subRL[1];
8500b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 18 */
8510b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[23] ^= subRL[1];
8520b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
8530b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	if (max == 24) {
8540b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		/* kw3 */
8550b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		subRL[24] ^= subRL[1];
8560b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
8570b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		/* absorb kw4 to other subkeys */
8580b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		kw4 = subRL[25];
8590b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	} else {
8600b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		subRL[1] ^= (subRL[1] & ~subRL[25]) << 32;
8610b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		/* modified for FLinv(kl6) */
8622a128b4b74e559e585028d0205e9729271530637Julia Lawall		dw = (subRL[1] & subRL[25]) >> 32;
8632a128b4b74e559e585028d0205e9729271530637Julia Lawall		subRL[1] ^= rol32(dw, 1);
8640b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
8650b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		/* round 20 */
8660b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		subRL[27] ^= subRL[1];
8670b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		/* round 22 */
8680b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		subRL[29] ^= subRL[1];
8690b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		/* round 24 */
8700b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		subRL[31] ^= subRL[1];
8710b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		/* kw3 */
8720b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		subRL[32] ^= subRL[1];
8730b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
8740b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		/* absorb kw4 to other subkeys */
8750b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		kw4 = subRL[33];
8760b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		/* round 23 */
8770b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		subRL[30] ^= kw4;
8780b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		/* round 21 */
8790b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		subRL[28] ^= kw4;
8800b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		/* round 19 */
8810b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		subRL[26] ^= kw4;
8820b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
8830b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		kw4 ^= (kw4 & ~subRL[24]) << 32;
8840b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		/* modified for FL(kl5) */
8852a128b4b74e559e585028d0205e9729271530637Julia Lawall		dw = (kw4 & subRL[24]) >> 32;
8862a128b4b74e559e585028d0205e9729271530637Julia Lawall		kw4 ^= rol32(dw, 1);
8870b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	}
8880b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
8890b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 17 */
8900b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[22] ^= kw4;
8910b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 15 */
8920b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[20] ^= kw4;
8930b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 13 */
8940b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[18] ^= kw4;
8950b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
8960b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	kw4 ^= (kw4 & ~subRL[16]) << 32;
8970b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* modified for FL(kl3) */
8982a128b4b74e559e585028d0205e9729271530637Julia Lawall	dw = (kw4 & subRL[16]) >> 32;
8992a128b4b74e559e585028d0205e9729271530637Julia Lawall	kw4 ^= rol32(dw, 1);
9000b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
9010b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 11 */
9020b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[14] ^= kw4;
9030b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 9 */
9040b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[12] ^= kw4;
9050b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 7 */
9060b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[10] ^= kw4;
9070b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
9080b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	kw4 ^= (kw4 & ~subRL[8]) << 32;
9090b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* modified for FL(kl1) */
9102a128b4b74e559e585028d0205e9729271530637Julia Lawall	dw = (kw4 & subRL[8]) >> 32;
9112a128b4b74e559e585028d0205e9729271530637Julia Lawall	kw4 ^= rol32(dw, 1);
9120b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
9130b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 5 */
9140b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[6] ^= kw4;
9150b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 3 */
9160b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[4] ^= kw4;
9170b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* round 1 */
9180b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[2] ^= kw4;
9190b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* kw1 */
9200b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[0] ^= kw4;
9210b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
9220b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* key XOR is end of F-function */
9230b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(0, subRL[0] ^ subRL[2]);			/* kw1 */
9240b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(2, subRL[3]);				/* round 1 */
9250b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(3, subRL[2] ^ subRL[4]);			/* round 2 */
9260b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(4, subRL[3] ^ subRL[5]);			/* round 3 */
9270b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(5, subRL[4] ^ subRL[6]);			/* round 4 */
9280b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(6, subRL[5] ^ subRL[7]);			/* round 5 */
9290b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
9300b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	tl = (subRL[10] >> 32) ^ (subRL[10] & ~subRL[8]);
9312a128b4b74e559e585028d0205e9729271530637Julia Lawall	dw = tl & (subRL[8] >> 32);				/* FL(kl1) */
9322a128b4b74e559e585028d0205e9729271530637Julia Lawall	tr = subRL[10] ^ rol32(dw, 1);
9330b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	tt = (tr | ((u64)tl << 32));
9340b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
9350b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(7, subRL[6] ^ tt);			/* round 6 */
9360b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(8, subRL[8]);				/* FL(kl1) */
9370b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(9, subRL[9]);				/* FLinv(kl2) */
9380b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
9390b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	tl = (subRL[7] >> 32) ^ (subRL[7] & ~subRL[9]);
9402a128b4b74e559e585028d0205e9729271530637Julia Lawall	dw = tl & (subRL[9] >> 32);				/* FLinv(kl2) */
9412a128b4b74e559e585028d0205e9729271530637Julia Lawall	tr = subRL[7] ^ rol32(dw, 1);
9420b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	tt = (tr | ((u64)tl << 32));
9430b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
9440b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(10, subRL[11] ^ tt);			/* round 7 */
9450b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(11, subRL[10] ^ subRL[12]);		/* round 8 */
9460b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(12, subRL[11] ^ subRL[13]);		/* round 9 */
9470b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(13, subRL[12] ^ subRL[14]);		/* round 10 */
9480b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(14, subRL[13] ^ subRL[15]);		/* round 11 */
9490b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
9500b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	tl = (subRL[18] >> 32) ^ (subRL[18] & ~subRL[16]);
9512a128b4b74e559e585028d0205e9729271530637Julia Lawall	dw = tl & (subRL[16] >> 32);				/* FL(kl3) */
9522a128b4b74e559e585028d0205e9729271530637Julia Lawall	tr = subRL[18] ^ rol32(dw, 1);
9530b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	tt = (tr | ((u64)tl << 32));
9540b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
9550b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(15, subRL[14] ^ tt);			/* round 12 */
9560b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(16, subRL[16]);				/* FL(kl3) */
9570b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(17, subRL[17]);				/* FLinv(kl4) */
9580b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
9590b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	tl = (subRL[15] >> 32) ^ (subRL[15] & ~subRL[17]);
9602a128b4b74e559e585028d0205e9729271530637Julia Lawall	dw = tl & (subRL[17] >> 32);				/* FLinv(kl4) */
9612a128b4b74e559e585028d0205e9729271530637Julia Lawall	tr = subRL[15] ^ rol32(dw, 1);
9620b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	tt = (tr | ((u64)tl << 32));
9630b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
9640b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(18, subRL[19] ^ tt);			/* round 13 */
9650b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(19, subRL[18] ^ subRL[20]);		/* round 14 */
9660b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(20, subRL[19] ^ subRL[21]);		/* round 15 */
9670b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(21, subRL[20] ^ subRL[22]);		/* round 16 */
9680b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	SET_SUBKEY_LR(22, subRL[21] ^ subRL[23]);		/* round 17 */
9690b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
9700b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	if (max == 24) {
9710b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		SET_SUBKEY_LR(23, subRL[22]);			/* round 18 */
9720b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		SET_SUBKEY_LR(24, subRL[24] ^ subRL[23]);	/* kw3 */
9730b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	} else {
9740b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		tl = (subRL[26] >> 32) ^ (subRL[26] & ~subRL[24]);
9752a128b4b74e559e585028d0205e9729271530637Julia Lawall		dw = tl & (subRL[24] >> 32);			/* FL(kl5) */
9762a128b4b74e559e585028d0205e9729271530637Julia Lawall		tr = subRL[26] ^ rol32(dw, 1);
9770b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		tt = (tr | ((u64)tl << 32));
9780b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
9790b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		SET_SUBKEY_LR(23, subRL[22] ^ tt);		/* round 18 */
9800b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		SET_SUBKEY_LR(24, subRL[24]);			/* FL(kl5) */
9810b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		SET_SUBKEY_LR(25, subRL[25]);			/* FLinv(kl6) */
9820b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
9830b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		tl = (subRL[23] >> 32) ^ (subRL[23] & ~subRL[25]);
9842a128b4b74e559e585028d0205e9729271530637Julia Lawall		dw = tl & (subRL[25] >> 32);			/* FLinv(kl6) */
9852a128b4b74e559e585028d0205e9729271530637Julia Lawall		tr = subRL[23] ^ rol32(dw, 1);
9860b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		tt = (tr | ((u64)tl << 32));
9870b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
9880b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		SET_SUBKEY_LR(26, subRL[27] ^ tt);		/* round 19 */
9890b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		SET_SUBKEY_LR(27, subRL[26] ^ subRL[28]);	/* round 20 */
9900b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		SET_SUBKEY_LR(28, subRL[27] ^ subRL[29]);	/* round 21 */
9910b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		SET_SUBKEY_LR(29, subRL[28] ^ subRL[30]);	/* round 22 */
9920b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		SET_SUBKEY_LR(30, subRL[29] ^ subRL[31]);	/* round 23 */
9930b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		SET_SUBKEY_LR(31, subRL[30]);			/* round 24 */
9940b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		SET_SUBKEY_LR(32, subRL[32] ^ subRL[31]);	/* kw3 */
9950b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	}
9960b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
9970b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
9980b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnastatic void camellia_setup128(const unsigned char *key, u64 *subkey)
9990b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
10000b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	u64 kl, kr, ww;
10010b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	u64 subRL[26];
10020b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
10030b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/**
10040b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	 *  k == kl || kr (|| is concatenation)
10050b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	 */
10060b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	kl = get_unaligned_be64(key);
10070b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	kr = get_unaligned_be64(key + 8);
10080b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
10090b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* generate KL dependent subkeys */
10100b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* kw1 */
10110b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[0] = kl;
10120b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* kw2 */
10130b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[1] = kr;
10140b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
10150b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* rotation left shift 15bit */
10160b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 15);
10170b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
10180b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k3 */
10190b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[4] = kl;
10200b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k4 */
10210b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[5] = kr;
10220b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
10230b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* rotation left shift 15+30bit */
10240b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 30);
10250b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
10260b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k7 */
10270b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[10] = kl;
10280b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k8 */
10290b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[11] = kr;
10300b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
10310b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* rotation left shift 15+30+15bit */
10320b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 15);
10330b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
10340b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k10 */
10350b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[13] = kr;
10360b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* rotation left shift 15+30+15+17 bit */
10370b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 17);
10380b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
10390b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* kl3 */
10400b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[16] = kl;
10410b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* kl4 */
10420b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[17] = kr;
10430b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
10440b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* rotation left shift 15+30+15+17+17 bit */
10450b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 17);
10460b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
10470b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k13 */
10480b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[18] = kl;
10490b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k14 */
10500b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[19] = kr;
10510b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
10520b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* rotation left shift 15+30+15+17+17+17 bit */
10530b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 17);
10540b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
10550b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k17 */
10560b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[22] = kl;
10570b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k18 */
10580b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[23] = kr;
10590b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
10600b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* generate KA */
10610b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	kl = subRL[0];
10620b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	kr = subRL[1];
10630b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	CAMELLIA_F(kl, CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, ww);
10640b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	kr ^= ww;
10650b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	CAMELLIA_F(kr, CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, kl);
10660b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
10670b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* current status == (kll, klr, w0, w1) */
10680b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	CAMELLIA_F(kl, CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, kr);
10690b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	kr ^= ww;
10700b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	CAMELLIA_F(kr, CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, ww);
10710b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	kl ^= ww;
10720b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
10730b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* generate KA dependent subkeys */
10740b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k1, k2 */
10750b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[2] = kl;
10760b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[3] = kr;
10770b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 15);
10780b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k5,k6 */
10790b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[6] = kl;
10800b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[7] = kr;
10810b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 15);
10820b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* kl1, kl2 */
10830b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[8] = kl;
10840b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[9] = kr;
10850b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 15);
10860b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k9 */
10870b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[12] = kl;
10880b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 15);
10890b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k11, k12 */
10900b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[14] = kl;
10910b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[15] = kr;
10920b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 34);
10930b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k15, k16 */
10940b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[20] = kl;
10950b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[21] = kr;
10960b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 17);
10970b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* kw3, kw4 */
10980b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[24] = kl;
10990b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[25] = kr;
11000b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
11010b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	camellia_setup_tail(subkey, subRL, 24);
11020b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
11030b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
11040b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnastatic void camellia_setup256(const unsigned char *key, u64 *subkey)
11050b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
11060b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	u64 kl, kr;			/* left half of key */
11070b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	u64 krl, krr;			/* right half of key */
11080b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	u64 ww;				/* temporary variables */
11090b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	u64 subRL[34];
11100b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
11110b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/**
11120b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	 *  key = (kl || kr || krl || krr) (|| is concatenation)
11130b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	 */
11140b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	kl = get_unaligned_be64(key);
11150b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	kr = get_unaligned_be64(key + 8);
11160b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	krl = get_unaligned_be64(key + 16);
11170b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	krr = get_unaligned_be64(key + 24);
11180b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
11190b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* generate KL dependent subkeys */
11200b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* kw1 */
11210b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[0] = kl;
11220b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* kw2 */
11230b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[1] = kr;
11240b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 45);
11250b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k9 */
11260b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[12] = kl;
11270b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k10 */
11280b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[13] = kr;
11290b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 15);
11300b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* kl3 */
11310b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[16] = kl;
11320b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* kl4 */
11330b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[17] = kr;
11340b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 17);
11350b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k17 */
11360b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[22] = kl;
11370b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k18 */
11380b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[23] = kr;
11390b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 34);
11400b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k23 */
11410b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[30] = kl;
11420b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k24 */
11430b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[31] = kr;
11440b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
11450b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* generate KR dependent subkeys */
11460b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(krl, krr, 15);
11470b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k3 */
11480b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[4] = krl;
11490b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k4 */
11500b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[5] = krr;
11510b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(krl, krr, 15);
11520b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* kl1 */
11530b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[8] = krl;
11540b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* kl2 */
11550b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[9] = krr;
11560b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(krl, krr, 30);
11570b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k13 */
11580b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[18] = krl;
11590b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k14 */
11600b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[19] = krr;
11610b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(krl, krr, 34);
11620b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k19 */
11630b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[26] = krl;
11640b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k20 */
11650b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[27] = krr;
11660b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(krl, krr, 34);
11670b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
11680b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* generate KA */
11690b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	kl = subRL[0] ^ krl;
11700b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	kr = subRL[1] ^ krr;
11710b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
11720b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	CAMELLIA_F(kl, CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, ww);
11730b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	kr ^= ww;
11740b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	CAMELLIA_F(kr, CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, kl);
11750b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	kl ^= krl;
11760b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	CAMELLIA_F(kl, CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, kr);
11770b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	kr ^= ww ^ krr;
11780b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	CAMELLIA_F(kr, CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, ww);
11790b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	kl ^= ww;
11800b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
11810b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* generate KB */
11820b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	krl ^= kl;
11830b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	krr ^= kr;
11840b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	CAMELLIA_F(krl, CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R, ww);
11850b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	krr ^= ww;
11860b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	CAMELLIA_F(krr, CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R, ww);
11870b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	krl ^= ww;
11880b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
11890b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* generate KA dependent subkeys */
11900b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 15);
11910b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k5 */
11920b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[6] = kl;
11930b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k6 */
11940b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[7] = kr;
11950b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 30);
11960b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k11 */
11970b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[14] = kl;
11980b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k12 */
11990b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[15] = kr;
12000b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* rotation left shift 32bit */
12010b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 32);
12020b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* kl5 */
12030b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[24] = kl;
12040b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* kl6 */
12050b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[25] = kr;
12060b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* rotation left shift 17 from k11,k12 -> k21,k22 */
12070b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(kl, kr, 17);
12080b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k21 */
12090b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[28] = kl;
12100b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k22 */
12110b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[29] = kr;
12120b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
12130b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* generate KB dependent subkeys */
12140b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k1 */
12150b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[2] = krl;
12160b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k2 */
12170b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[3] = krr;
12180b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(krl, krr, 30);
12190b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k7 */
12200b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[10] = krl;
12210b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k8 */
12220b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[11] = krr;
12230b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(krl, krr, 30);
12240b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k15 */
12250b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[20] = krl;
12260b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* k16 */
12270b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[21] = krr;
12280b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	ROLDQ(krl, krr, 51);
12290b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* kw3 */
12300b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[32] = krl;
12310b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* kw4 */
12320b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	subRL[33] = krr;
12330b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
12340b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	camellia_setup_tail(subkey, subRL, 32);
12350b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
12360b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
12370b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnastatic void camellia_setup192(const unsigned char *key, u64 *subkey)
12380b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
12390b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	unsigned char kk[32];
12400b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	u64 krl, krr;
12410b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
12420b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	memcpy(kk, key, 24);
12430b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	memcpy((unsigned char *)&krl, key+16, 8);
12440b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	krr = ~krl;
12450b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	memcpy(kk+24, (unsigned char *)&krr, 8);
12460b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	camellia_setup256(kk, subkey);
12470b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
12480b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1249cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi Kivilinnaint __camellia_setkey(struct camellia_ctx *cctx, const unsigned char *key,
1250cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi Kivilinna		      unsigned int key_len, u32 *flags)
12510b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
12520b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	if (key_len != 16 && key_len != 24 && key_len != 32) {
12530b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
12540b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		return -EINVAL;
12550b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	}
12560b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
12570b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	cctx->key_length = key_len;
12580b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
12590b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	switch (key_len) {
12600b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	case 16:
12610b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		camellia_setup128(key, cctx->key_table);
12620b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		break;
12630b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	case 24:
12640b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		camellia_setup192(key, cctx->key_table);
12650b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		break;
12660b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	case 32:
12670b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		camellia_setup256(key, cctx->key_table);
12680b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		break;
12690b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	}
12700b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
12710b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	return 0;
12720b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
1273cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi KivilinnaEXPORT_SYMBOL_GPL(__camellia_setkey);
12740b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
12750b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnastatic int camellia_setkey(struct crypto_tfm *tfm, const u8 *in_key,
12760b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			   unsigned int key_len)
12770b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
12780b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	return __camellia_setkey(crypto_tfm_ctx(tfm), in_key, key_len,
12790b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna				 &tfm->crt_flags);
12800b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
12810b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1282cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi Kivilinnavoid camellia_decrypt_cbc_2way(void *ctx, u128 *dst, const u128 *src)
12830b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
1284964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	u128 iv = *src;
12850b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1286964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	camellia_dec_blk_2way(ctx, (u8 *)dst, (u8 *)src);
12870b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1288964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	u128_xor(&dst[1], &dst[1], &iv);
12890b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
1290cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi KivilinnaEXPORT_SYMBOL_GPL(camellia_decrypt_cbc_2way);
12910b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1292cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi Kivilinnavoid camellia_crypt_ctr(void *ctx, u128 *dst, const u128 *src, le128 *iv)
12930b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
1294964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	be128 ctrblk;
12950b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1296964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	if (dst != src)
1297964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		*dst = *src;
12980b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
129958990986f1cba40c23c0c10592ace08616de3ffaJussi Kivilinna	le128_to_be128(&ctrblk, iv);
130058990986f1cba40c23c0c10592ace08616de3ffaJussi Kivilinna	le128_inc(iv);
13010b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1302964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	camellia_enc_blk_xor(ctx, (u8 *)dst, (u8 *)&ctrblk);
13030b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
1304cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi KivilinnaEXPORT_SYMBOL_GPL(camellia_crypt_ctr);
13050b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1306cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi Kivilinnavoid camellia_crypt_ctr_2way(void *ctx, u128 *dst, const u128 *src, le128 *iv)
13070b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
1308964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	be128 ctrblks[2];
13090b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1310964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	if (dst != src) {
1311964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		dst[0] = src[0];
1312964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		dst[1] = src[1];
13130b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	}
13140b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
131558990986f1cba40c23c0c10592ace08616de3ffaJussi Kivilinna	le128_to_be128(&ctrblks[0], iv);
131658990986f1cba40c23c0c10592ace08616de3ffaJussi Kivilinna	le128_inc(iv);
131758990986f1cba40c23c0c10592ace08616de3ffaJussi Kivilinna	le128_to_be128(&ctrblks[1], iv);
131858990986f1cba40c23c0c10592ace08616de3ffaJussi Kivilinna	le128_inc(iv);
13190b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1320964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	camellia_enc_blk_xor_2way(ctx, (u8 *)dst, (u8 *)ctrblks);
13210b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
1322cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi KivilinnaEXPORT_SYMBOL_GPL(camellia_crypt_ctr_2way);
13230b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1324964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinnastatic const struct common_glue_ctx camellia_enc = {
1325964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	.num_funcs = 2,
1326964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	.fpu_blocks_limit = -1,
1327964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna
1328964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	.funcs = { {
1329964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		.num_blocks = 2,
1330964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		.fn_u = { .ecb = GLUE_FUNC_CAST(camellia_enc_blk_2way) }
1331964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	}, {
1332964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		.num_blocks = 1,
1333964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		.fn_u = { .ecb = GLUE_FUNC_CAST(camellia_enc_blk) }
1334964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	} }
1335964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna};
13360b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1337964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinnastatic const struct common_glue_ctx camellia_ctr = {
1338964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	.num_funcs = 2,
1339964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	.fpu_blocks_limit = -1,
1340964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna
1341964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	.funcs = { {
1342964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		.num_blocks = 2,
1343964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		.fn_u = { .ctr = GLUE_CTR_FUNC_CAST(camellia_crypt_ctr_2way) }
1344964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	}, {
1345964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		.num_blocks = 1,
1346964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		.fn_u = { .ctr = GLUE_CTR_FUNC_CAST(camellia_crypt_ctr) }
1347964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	} }
1348964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna};
13490b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1350964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinnastatic const struct common_glue_ctx camellia_dec = {
1351964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	.num_funcs = 2,
1352964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	.fpu_blocks_limit = -1,
1353964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna
1354964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	.funcs = { {
1355964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		.num_blocks = 2,
1356964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		.fn_u = { .ecb = GLUE_FUNC_CAST(camellia_dec_blk_2way) }
1357964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	}, {
1358964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		.num_blocks = 1,
1359964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		.fn_u = { .ecb = GLUE_FUNC_CAST(camellia_dec_blk) }
1360964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	} }
1361964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna};
13620b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1363964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinnastatic const struct common_glue_ctx camellia_dec_cbc = {
1364964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	.num_funcs = 2,
1365964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	.fpu_blocks_limit = -1,
1366964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna
1367964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	.funcs = { {
1368964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		.num_blocks = 2,
1369964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		.fn_u = { .cbc = GLUE_CBC_FUNC_CAST(camellia_decrypt_cbc_2way) }
1370964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	}, {
1371964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		.num_blocks = 1,
1372964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		.fn_u = { .cbc = GLUE_CBC_FUNC_CAST(camellia_dec_blk) }
1373964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	} }
1374964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna};
13750b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1376964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinnastatic int ecb_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1377964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		       struct scatterlist *src, unsigned int nbytes)
13780b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
1379964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	return glue_ecb_crypt_128bit(&camellia_enc, desc, dst, src, nbytes);
13800b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
13810b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1382964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinnastatic int ecb_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1383964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		       struct scatterlist *src, unsigned int nbytes)
13840b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
1385964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	return glue_ecb_crypt_128bit(&camellia_dec, desc, dst, src, nbytes);
13860b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
13870b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1388964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinnastatic int cbc_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1389964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		       struct scatterlist *src, unsigned int nbytes)
13900b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
1391964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	return glue_cbc_encrypt_128bit(GLUE_FUNC_CAST(camellia_enc_blk), desc,
1392964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna				       dst, src, nbytes);
13930b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
13940b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1395964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinnastatic int cbc_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1396964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna		       struct scatterlist *src, unsigned int nbytes)
13970b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
1398964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	return glue_cbc_decrypt_128bit(&camellia_dec_cbc, desc, dst, src,
1399964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna				       nbytes);
14000b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
14010b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
14020b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnastatic int ctr_crypt(struct blkcipher_desc *desc, struct scatterlist *dst,
14030b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		     struct scatterlist *src, unsigned int nbytes)
14040b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
1405964263afdcbf9d1e85c021acfff0cc68dd168475Jussi Kivilinna	return glue_ctr_crypt_128bit(&camellia_ctr, desc, dst, src, nbytes);
14060b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
14070b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
14080b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnastatic void encrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes)
14090b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
14100b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	const unsigned int bsize = CAMELLIA_BLOCK_SIZE;
14110b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	struct camellia_ctx *ctx = priv;
14120b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	int i;
14130b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
14140b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	while (nbytes >= 2 * bsize) {
14150b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		camellia_enc_blk_2way(ctx, srcdst, srcdst);
14160b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		srcdst += bsize * 2;
14170b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		nbytes -= bsize * 2;
14180b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	}
14190b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
14200b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	for (i = 0; i < nbytes / bsize; i++, srcdst += bsize)
14210b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		camellia_enc_blk(ctx, srcdst, srcdst);
14220b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
14230b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
14240b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnastatic void decrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes)
14250b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
14260b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	const unsigned int bsize = CAMELLIA_BLOCK_SIZE;
14270b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	struct camellia_ctx *ctx = priv;
14280b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	int i;
14290b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
14300b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	while (nbytes >= 2 * bsize) {
14310b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		camellia_dec_blk_2way(ctx, srcdst, srcdst);
14320b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		srcdst += bsize * 2;
14330b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		nbytes -= bsize * 2;
14340b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	}
14350b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
14360b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	for (i = 0; i < nbytes / bsize; i++, srcdst += bsize)
14370b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		camellia_dec_blk(ctx, srcdst, srcdst);
14380b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
14390b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1440cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi Kivilinnaint lrw_camellia_setkey(struct crypto_tfm *tfm, const u8 *key,
1441cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi Kivilinna			unsigned int keylen)
14420b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
14430b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	struct camellia_lrw_ctx *ctx = crypto_tfm_ctx(tfm);
14440b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	int err;
14450b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
14460b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	err = __camellia_setkey(&ctx->camellia_ctx, key,
14470b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna				keylen - CAMELLIA_BLOCK_SIZE,
14480b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna				&tfm->crt_flags);
14490b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	if (err)
14500b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		return err;
14510b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
14520b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	return lrw_init_table(&ctx->lrw_table,
14530b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			      key + keylen - CAMELLIA_BLOCK_SIZE);
14540b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
1455cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi KivilinnaEXPORT_SYMBOL_GPL(lrw_camellia_setkey);
14560b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
14570b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnastatic int lrw_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
14580b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		       struct scatterlist *src, unsigned int nbytes)
14590b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
14600b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	struct camellia_lrw_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
14610b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	be128 buf[2 * 4];
14620b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	struct lrw_crypt_req req = {
14630b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.tbuf = buf,
14640b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.tbuflen = sizeof(buf),
14650b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
14660b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.table_ctx = &ctx->lrw_table,
14670b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.crypt_ctx = &ctx->camellia_ctx,
14680b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.crypt_fn = encrypt_callback,
14690b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	};
14700b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
14710b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	return lrw_crypt(desc, dst, src, nbytes, &req);
14720b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
14730b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
14740b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnastatic int lrw_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
14750b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		       struct scatterlist *src, unsigned int nbytes)
14760b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
14770b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	struct camellia_lrw_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
14780b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	be128 buf[2 * 4];
14790b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	struct lrw_crypt_req req = {
14800b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.tbuf = buf,
14810b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.tbuflen = sizeof(buf),
14820b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
14830b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.table_ctx = &ctx->lrw_table,
14840b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.crypt_ctx = &ctx->camellia_ctx,
14850b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.crypt_fn = decrypt_callback,
14860b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	};
14870b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
14880b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	return lrw_crypt(desc, dst, src, nbytes, &req);
14890b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
14900b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1491cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi Kivilinnavoid lrw_camellia_exit_tfm(struct crypto_tfm *tfm)
14920b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
14930b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	struct camellia_lrw_ctx *ctx = crypto_tfm_ctx(tfm);
14940b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
14950b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	lrw_free_table(&ctx->lrw_table);
14960b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
1497cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi KivilinnaEXPORT_SYMBOL_GPL(lrw_camellia_exit_tfm);
14980b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1499cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi Kivilinnaint xts_camellia_setkey(struct crypto_tfm *tfm, const u8 *key,
1500cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi Kivilinna			unsigned int keylen)
15010b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
15020b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	struct camellia_xts_ctx *ctx = crypto_tfm_ctx(tfm);
15030b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	u32 *flags = &tfm->crt_flags;
15040b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	int err;
15050b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
15060b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* key consists of keys of equal size concatenated, therefore
15070b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	 * the length must be even
15080b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	 */
15090b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	if (keylen % 2) {
15100b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
15110b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		return -EINVAL;
15120b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	}
15130b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
15140b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* first half of xts-key is for crypt */
15150b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	err = __camellia_setkey(&ctx->crypt_ctx, key, keylen / 2, flags);
15160b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	if (err)
15170b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		return err;
15180b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
15190b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	/* second half of xts-key is for tweak */
15200b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	return __camellia_setkey(&ctx->tweak_ctx, key + keylen / 2, keylen / 2,
15210b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna				flags);
15220b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
1523cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi KivilinnaEXPORT_SYMBOL_GPL(xts_camellia_setkey);
15240b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
15250b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnastatic int xts_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
15260b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		       struct scatterlist *src, unsigned int nbytes)
15270b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
15280b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	struct camellia_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
15290b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	be128 buf[2 * 4];
15300b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	struct xts_crypt_req req = {
15310b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.tbuf = buf,
15320b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.tbuflen = sizeof(buf),
15330b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
15340b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.tweak_ctx = &ctx->tweak_ctx,
15350b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.tweak_fn = XTS_TWEAK_CAST(camellia_enc_blk),
15360b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.crypt_ctx = &ctx->crypt_ctx,
15370b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.crypt_fn = encrypt_callback,
15380b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	};
15390b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
15400b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	return xts_crypt(desc, dst, src, nbytes, &req);
15410b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
15420b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
15430b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnastatic int xts_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
15440b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		       struct scatterlist *src, unsigned int nbytes)
15450b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
15460b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	struct camellia_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
15470b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	be128 buf[2 * 4];
15480b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	struct xts_crypt_req req = {
15490b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.tbuf = buf,
15500b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.tbuflen = sizeof(buf),
15510b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
15520b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.tweak_ctx = &ctx->tweak_ctx,
15530b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.tweak_fn = XTS_TWEAK_CAST(camellia_enc_blk),
15540b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.crypt_ctx = &ctx->crypt_ctx,
15550b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.crypt_fn = decrypt_callback,
15560b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	};
15570b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
15580b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	return xts_crypt(desc, dst, src, nbytes, &req);
15590b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
15600b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
15610b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnastatic struct crypto_alg camellia_algs[6] = { {
15620b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_name		= "camellia",
15630b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_driver_name	= "camellia-asm",
15640b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_priority		= 200,
15650b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_flags		= CRYPTO_ALG_TYPE_CIPHER,
15660b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_blocksize		= CAMELLIA_BLOCK_SIZE,
15670b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_ctxsize		= sizeof(struct camellia_ctx),
15680b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_alignmask		= 0,
15690b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_module		= THIS_MODULE,
15700b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_u			= {
15710b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.cipher = {
15720b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.cia_min_keysize = CAMELLIA_MIN_KEY_SIZE,
15730b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.cia_max_keysize = CAMELLIA_MAX_KEY_SIZE,
15740b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.cia_setkey	 = camellia_setkey,
15750b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.cia_encrypt	 = camellia_encrypt,
15760b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.cia_decrypt	 = camellia_decrypt
15770b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		}
15780b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	}
15790b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}, {
15800b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_name		= "ecb(camellia)",
15810b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_driver_name	= "ecb-camellia-asm",
15820b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_priority		= 300,
15830b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_flags		= CRYPTO_ALG_TYPE_BLKCIPHER,
15840b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_blocksize		= CAMELLIA_BLOCK_SIZE,
15850b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_ctxsize		= sizeof(struct camellia_ctx),
15860b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_alignmask		= 0,
15870b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_type		= &crypto_blkcipher_type,
15880b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_module		= THIS_MODULE,
15890b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_u = {
15900b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.blkcipher = {
15910b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.min_keysize	= CAMELLIA_MIN_KEY_SIZE,
15920b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.max_keysize	= CAMELLIA_MAX_KEY_SIZE,
15930b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.setkey		= camellia_setkey,
15940b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.encrypt	= ecb_encrypt,
15950b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.decrypt	= ecb_decrypt,
15960b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		},
15970b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	},
15980b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}, {
15990b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_name		= "cbc(camellia)",
16000b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_driver_name	= "cbc-camellia-asm",
16010b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_priority		= 300,
16020b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_flags		= CRYPTO_ALG_TYPE_BLKCIPHER,
16030b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_blocksize		= CAMELLIA_BLOCK_SIZE,
16040b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_ctxsize		= sizeof(struct camellia_ctx),
16050b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_alignmask		= 0,
16060b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_type		= &crypto_blkcipher_type,
16070b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_module		= THIS_MODULE,
16080b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_u = {
16090b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.blkcipher = {
16100b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.min_keysize	= CAMELLIA_MIN_KEY_SIZE,
16110b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.max_keysize	= CAMELLIA_MAX_KEY_SIZE,
16120b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.ivsize		= CAMELLIA_BLOCK_SIZE,
16130b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.setkey		= camellia_setkey,
16140b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.encrypt	= cbc_encrypt,
16150b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.decrypt	= cbc_decrypt,
16160b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		},
16170b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	},
16180b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}, {
16190b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_name		= "ctr(camellia)",
16200b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_driver_name	= "ctr-camellia-asm",
16210b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_priority		= 300,
16220b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_flags		= CRYPTO_ALG_TYPE_BLKCIPHER,
16230b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_blocksize		= 1,
16240b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_ctxsize		= sizeof(struct camellia_ctx),
16250b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_alignmask		= 0,
16260b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_type		= &crypto_blkcipher_type,
16270b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_module		= THIS_MODULE,
16280b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_u = {
16290b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.blkcipher = {
16300b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.min_keysize	= CAMELLIA_MIN_KEY_SIZE,
16310b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.max_keysize	= CAMELLIA_MAX_KEY_SIZE,
16320b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.ivsize		= CAMELLIA_BLOCK_SIZE,
16330b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.setkey		= camellia_setkey,
16340b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.encrypt	= ctr_crypt,
16350b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.decrypt	= ctr_crypt,
16360b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		},
16370b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	},
16380b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}, {
16390b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_name		= "lrw(camellia)",
16400b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_driver_name	= "lrw-camellia-asm",
16410b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_priority		= 300,
16420b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_flags		= CRYPTO_ALG_TYPE_BLKCIPHER,
16430b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_blocksize		= CAMELLIA_BLOCK_SIZE,
16440b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_ctxsize		= sizeof(struct camellia_lrw_ctx),
16450b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_alignmask		= 0,
16460b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_type		= &crypto_blkcipher_type,
16470b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_module		= THIS_MODULE,
1648cf582ccedad02eb9bfdcdb25adfc800dd117b428Jussi Kivilinna	.cra_exit		= lrw_camellia_exit_tfm,
16490b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_u = {
16500b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.blkcipher = {
16510b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.min_keysize	= CAMELLIA_MIN_KEY_SIZE +
16520b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna						CAMELLIA_BLOCK_SIZE,
16530b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.max_keysize	= CAMELLIA_MAX_KEY_SIZE +
16540b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna						CAMELLIA_BLOCK_SIZE,
16550b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.ivsize		= CAMELLIA_BLOCK_SIZE,
16560b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.setkey		= lrw_camellia_setkey,
16570b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.encrypt	= lrw_encrypt,
16580b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.decrypt	= lrw_decrypt,
16590b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		},
16600b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	},
16610b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}, {
16620b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_name		= "xts(camellia)",
16630b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_driver_name	= "xts-camellia-asm",
16640b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_priority		= 300,
16650b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_flags		= CRYPTO_ALG_TYPE_BLKCIPHER,
16660b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_blocksize		= CAMELLIA_BLOCK_SIZE,
16670b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_ctxsize		= sizeof(struct camellia_xts_ctx),
16680b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_alignmask		= 0,
16690b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_type		= &crypto_blkcipher_type,
16700b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_module		= THIS_MODULE,
16710b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	.cra_u = {
16720b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		.blkcipher = {
16730b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.min_keysize	= CAMELLIA_MIN_KEY_SIZE * 2,
16740b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.max_keysize	= CAMELLIA_MAX_KEY_SIZE * 2,
16750b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.ivsize		= CAMELLIA_BLOCK_SIZE,
16760b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.setkey		= xts_camellia_setkey,
16770b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.encrypt	= xts_encrypt,
16780b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			.decrypt	= xts_decrypt,
16790b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		},
16800b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	},
16810b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna} };
16820b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
16830b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnastatic bool is_blacklisted_cpu(void)
16840b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
16850b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL)
16860b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		return false;
16870b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
16880b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	if (boot_cpu_data.x86 == 0x0f) {
16890b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		/*
16900b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		 * On Pentium 4, camellia-asm is slower than original assembler
16910b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		 * implementation because excessive uses of 64bit rotate and
16920b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		 * left-shifts (which are really slow on P4) needed to store and
16930b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		 * handle 128bit block in two 64bit registers.
16940b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		 */
16950b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		return true;
16960b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	}
16970b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
16980b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	return false;
16990b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
17000b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
17010b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnastatic int force;
17020b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnamodule_param(force, int, 0);
17030b95ec56ae19f61ca664e83766a2180057f0e351Jussi KivilinnaMODULE_PARM_DESC(force, "Force module load, ignore CPU blacklist");
17040b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1705676a38046f4fba4e7418756c6f6fc25cf5976312Jussi Kivilinnastatic int __init init(void)
17060b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
17070b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	if (!force && is_blacklisted_cpu()) {
17080b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		printk(KERN_INFO
17090b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			"camellia-x86_64: performance on this CPU "
17100b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			"would be suboptimal: disabling "
17110b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna			"camellia-x86_64.\n");
17120b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna		return -ENODEV;
17130b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	}
17140b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
17150b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	return crypto_register_algs(camellia_algs, ARRAY_SIZE(camellia_algs));
17160b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
17170b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
1718676a38046f4fba4e7418756c6f6fc25cf5976312Jussi Kivilinnastatic void __exit fini(void)
17190b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna{
17200b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna	crypto_unregister_algs(camellia_algs, ARRAY_SIZE(camellia_algs));
17210b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna}
17220b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
17230b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnamodule_init(init);
17240b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinnamodule_exit(fini);
17250b95ec56ae19f61ca664e83766a2180057f0e351Jussi Kivilinna
17260b95ec56ae19f61ca664e83766a2180057f0e351Jussi KivilinnaMODULE_LICENSE("GPL");
17270b95ec56ae19f61ca664e83766a2180057f0e351Jussi KivilinnaMODULE_DESCRIPTION("Camellia Cipher Algorithm, asm optimized");
17280b95ec56ae19f61ca664e83766a2180057f0e351Jussi KivilinnaMODULE_ALIAS("camellia");
17290b95ec56ae19f61ca664e83766a2180057f0e351Jussi KivilinnaMODULE_ALIAS("camellia-asm");
1730