Linux Audio

Check our new training course

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