cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

camellia_glue.c (65253B)


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