File Index
Files and directories
Sign in
FILE

camellia_glue.c

File preview with syntax highlighting.

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