Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * Glue Code for assembler optimized version of Camellia
0004  *
0005  * Copyright (c) 2012 Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
0006  *
0007  * Camellia parts based on code by:
0008  *  Copyright (C) 2006 NTT (Nippon Telegraph and Telephone Corporation)
0009  */
0010 
0011 #include <asm/unaligned.h>
0012 #include <linux/crypto.h>
0013 #include <linux/init.h>
0014 #include <linux/module.h>
0015 #include <linux/types.h>
0016 #include <crypto/algapi.h>
0017 
0018 #include "camellia.h"
0019 #include "ecb_cbc_helpers.h"
0020 
0021 /* regular block cipher functions */
0022 asmlinkage void __camellia_enc_blk(const void *ctx, u8 *dst, const u8 *src,
0023                    bool xor);
0024 EXPORT_SYMBOL_GPL(__camellia_enc_blk);
0025 asmlinkage void camellia_dec_blk(const void *ctx, u8 *dst, const u8 *src);
0026 EXPORT_SYMBOL_GPL(camellia_dec_blk);
0027 
0028 /* 2-way parallel cipher functions */
0029 asmlinkage void __camellia_enc_blk_2way(const void *ctx, u8 *dst, const u8 *src,
0030                     bool xor);
0031 EXPORT_SYMBOL_GPL(__camellia_enc_blk_2way);
0032 asmlinkage void camellia_dec_blk_2way(const void *ctx, u8 *dst, const u8 *src);
0033 EXPORT_SYMBOL_GPL(camellia_dec_blk_2way);
0034 
0035 static void camellia_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
0036 {
0037     camellia_enc_blk(crypto_tfm_ctx(tfm), dst, src);
0038 }
0039 
0040 static void camellia_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
0041 {
0042     camellia_dec_blk(crypto_tfm_ctx(tfm), dst, src);
0043 }
0044 
0045 /* camellia sboxes */
0046 __visible const u64 camellia_sp10011110[256] = {
0047     0x7000007070707000ULL, 0x8200008282828200ULL, 0x2c00002c2c2c2c00ULL,
0048     0xec0000ecececec00ULL, 0xb30000b3b3b3b300ULL, 0x2700002727272700ULL,
0049     0xc00000c0c0c0c000ULL, 0xe50000e5e5e5e500ULL, 0xe40000e4e4e4e400ULL,
0050     0x8500008585858500ULL, 0x5700005757575700ULL, 0x3500003535353500ULL,
0051     0xea0000eaeaeaea00ULL, 0x0c00000c0c0c0c00ULL, 0xae0000aeaeaeae00ULL,
0052     0x4100004141414100ULL, 0x2300002323232300ULL, 0xef0000efefefef00ULL,
0053     0x6b00006b6b6b6b00ULL, 0x9300009393939300ULL, 0x4500004545454500ULL,
0054     0x1900001919191900ULL, 0xa50000a5a5a5a500ULL, 0x2100002121212100ULL,
0055     0xed0000edededed00ULL, 0x0e00000e0e0e0e00ULL, 0x4f00004f4f4f4f00ULL,
0056     0x4e00004e4e4e4e00ULL, 0x1d00001d1d1d1d00ULL, 0x6500006565656500ULL,
0057     0x9200009292929200ULL, 0xbd0000bdbdbdbd00ULL, 0x8600008686868600ULL,
0058     0xb80000b8b8b8b800ULL, 0xaf0000afafafaf00ULL, 0x8f00008f8f8f8f00ULL,
0059     0x7c00007c7c7c7c00ULL, 0xeb0000ebebebeb00ULL, 0x1f00001f1f1f1f00ULL,
0060     0xce0000cececece00ULL, 0x3e00003e3e3e3e00ULL, 0x3000003030303000ULL,
0061     0xdc0000dcdcdcdc00ULL, 0x5f00005f5f5f5f00ULL, 0x5e00005e5e5e5e00ULL,
0062     0xc50000c5c5c5c500ULL, 0x0b00000b0b0b0b00ULL, 0x1a00001a1a1a1a00ULL,
0063     0xa60000a6a6a6a600ULL, 0xe10000e1e1e1e100ULL, 0x3900003939393900ULL,
0064     0xca0000cacacaca00ULL, 0xd50000d5d5d5d500ULL, 0x4700004747474700ULL,
0065     0x5d00005d5d5d5d00ULL, 0x3d00003d3d3d3d00ULL, 0xd90000d9d9d9d900ULL,
0066     0x0100000101010100ULL, 0x5a00005a5a5a5a00ULL, 0xd60000d6d6d6d600ULL,
0067     0x5100005151515100ULL, 0x5600005656565600ULL, 0x6c00006c6c6c6c00ULL,
0068     0x4d00004d4d4d4d00ULL, 0x8b00008b8b8b8b00ULL, 0x0d00000d0d0d0d00ULL,
0069     0x9a00009a9a9a9a00ULL, 0x6600006666666600ULL, 0xfb0000fbfbfbfb00ULL,
0070     0xcc0000cccccccc00ULL, 0xb00000b0b0b0b000ULL, 0x2d00002d2d2d2d00ULL,
0071     0x7400007474747400ULL, 0x1200001212121200ULL, 0x2b00002b2b2b2b00ULL,
0072     0x2000002020202000ULL, 0xf00000f0f0f0f000ULL, 0xb10000b1b1b1b100ULL,
0073     0x8400008484848400ULL, 0x9900009999999900ULL, 0xdf0000dfdfdfdf00ULL,
0074     0x4c00004c4c4c4c00ULL, 0xcb0000cbcbcbcb00ULL, 0xc20000c2c2c2c200ULL,
0075     0x3400003434343400ULL, 0x7e00007e7e7e7e00ULL, 0x7600007676767600ULL,
0076     0x0500000505050500ULL, 0x6d00006d6d6d6d00ULL, 0xb70000b7b7b7b700ULL,
0077     0xa90000a9a9a9a900ULL, 0x3100003131313100ULL, 0xd10000d1d1d1d100ULL,
0078     0x1700001717171700ULL, 0x0400000404040400ULL, 0xd70000d7d7d7d700ULL,
0079     0x1400001414141400ULL, 0x5800005858585800ULL, 0x3a00003a3a3a3a00ULL,
0080     0x6100006161616100ULL, 0xde0000dededede00ULL, 0x1b00001b1b1b1b00ULL,
0081     0x1100001111111100ULL, 0x1c00001c1c1c1c00ULL, 0x3200003232323200ULL,
0082     0x0f00000f0f0f0f00ULL, 0x9c00009c9c9c9c00ULL, 0x1600001616161600ULL,
0083     0x5300005353535300ULL, 0x1800001818181800ULL, 0xf20000f2f2f2f200ULL,
0084     0x2200002222222200ULL, 0xfe0000fefefefe00ULL, 0x4400004444444400ULL,
0085     0xcf0000cfcfcfcf00ULL, 0xb20000b2b2b2b200ULL, 0xc30000c3c3c3c300ULL,
0086     0xb50000b5b5b5b500ULL, 0x7a00007a7a7a7a00ULL, 0x9100009191919100ULL,
0087     0x2400002424242400ULL, 0x0800000808080800ULL, 0xe80000e8e8e8e800ULL,
0088     0xa80000a8a8a8a800ULL, 0x6000006060606000ULL, 0xfc0000fcfcfcfc00ULL,
0089     0x6900006969696900ULL, 0x5000005050505000ULL, 0xaa0000aaaaaaaa00ULL,
0090     0xd00000d0d0d0d000ULL, 0xa00000a0a0a0a000ULL, 0x7d00007d7d7d7d00ULL,
0091     0xa10000a1a1a1a100ULL, 0x8900008989898900ULL, 0x6200006262626200ULL,
0092     0x9700009797979700ULL, 0x5400005454545400ULL, 0x5b00005b5b5b5b00ULL,
0093     0x1e00001e1e1e1e00ULL, 0x9500009595959500ULL, 0xe00000e0e0e0e000ULL,
0094     0xff0000ffffffff00ULL, 0x6400006464646400ULL, 0xd20000d2d2d2d200ULL,
0095     0x1000001010101000ULL, 0xc40000c4c4c4c400ULL, 0x0000000000000000ULL,
0096     0x4800004848484800ULL, 0xa30000a3a3a3a300ULL, 0xf70000f7f7f7f700ULL,
0097     0x7500007575757500ULL, 0xdb0000dbdbdbdb00ULL, 0x8a00008a8a8a8a00ULL,
0098     0x0300000303030300ULL, 0xe60000e6e6e6e600ULL, 0xda0000dadadada00ULL,
0099     0x0900000909090900ULL, 0x3f00003f3f3f3f00ULL, 0xdd0000dddddddd00ULL,
0100     0x9400009494949400ULL, 0x8700008787878700ULL, 0x5c00005c5c5c5c00ULL,
0101     0x8300008383838300ULL, 0x0200000202020200ULL, 0xcd0000cdcdcdcd00ULL,
0102     0x4a00004a4a4a4a00ULL, 0x9000009090909000ULL, 0x3300003333333300ULL,
0103     0x7300007373737300ULL, 0x6700006767676700ULL, 0xf60000f6f6f6f600ULL,
0104     0xf30000f3f3f3f300ULL, 0x9d00009d9d9d9d00ULL, 0x7f00007f7f7f7f00ULL,
0105     0xbf0000bfbfbfbf00ULL, 0xe20000e2e2e2e200ULL, 0x5200005252525200ULL,
0106     0x9b00009b9b9b9b00ULL, 0xd80000d8d8d8d800ULL, 0x2600002626262600ULL,
0107     0xc80000c8c8c8c800ULL, 0x3700003737373700ULL, 0xc60000c6c6c6c600ULL,
0108     0x3b00003b3b3b3b00ULL, 0x8100008181818100ULL, 0x9600009696969600ULL,
0109     0x6f00006f6f6f6f00ULL, 0x4b00004b4b4b4b00ULL, 0x1300001313131300ULL,
0110     0xbe0000bebebebe00ULL, 0x6300006363636300ULL, 0x2e00002e2e2e2e00ULL,
0111     0xe90000e9e9e9e900ULL, 0x7900007979797900ULL, 0xa70000a7a7a7a700ULL,
0112     0x8c00008c8c8c8c00ULL, 0x9f00009f9f9f9f00ULL, 0x6e00006e6e6e6e00ULL,
0113     0xbc0000bcbcbcbc00ULL, 0x8e00008e8e8e8e00ULL, 0x2900002929292900ULL,
0114     0xf50000f5f5f5f500ULL, 0xf90000f9f9f9f900ULL, 0xb60000b6b6b6b600ULL,
0115     0x2f00002f2f2f2f00ULL, 0xfd0000fdfdfdfd00ULL, 0xb40000b4b4b4b400ULL,
0116     0x5900005959595900ULL, 0x7800007878787800ULL, 0x9800009898989800ULL,
0117     0x0600000606060600ULL, 0x6a00006a6a6a6a00ULL, 0xe70000e7e7e7e700ULL,
0118     0x4600004646464600ULL, 0x7100007171717100ULL, 0xba0000babababa00ULL,
0119     0xd40000d4d4d4d400ULL, 0x2500002525252500ULL, 0xab0000abababab00ULL,
0120     0x4200004242424200ULL, 0x8800008888888800ULL, 0xa20000a2a2a2a200ULL,
0121     0x8d00008d8d8d8d00ULL, 0xfa0000fafafafa00ULL, 0x7200007272727200ULL,
0122     0x0700000707070700ULL, 0xb90000b9b9b9b900ULL, 0x5500005555555500ULL,
0123     0xf80000f8f8f8f800ULL, 0xee0000eeeeeeee00ULL, 0xac0000acacacac00ULL,
0124     0x0a00000a0a0a0a00ULL, 0x3600003636363600ULL, 0x4900004949494900ULL,
0125     0x2a00002a2a2a2a00ULL, 0x6800006868686800ULL, 0x3c00003c3c3c3c00ULL,
0126     0x3800003838383800ULL, 0xf10000f1f1f1f100ULL, 0xa40000a4a4a4a400ULL,
0127     0x4000004040404000ULL, 0x2800002828282800ULL, 0xd30000d3d3d3d300ULL,
0128     0x7b00007b7b7b7b00ULL, 0xbb0000bbbbbbbb00ULL, 0xc90000c9c9c9c900ULL,
0129     0x4300004343434300ULL, 0xc10000c1c1c1c100ULL, 0x1500001515151500ULL,
0130     0xe30000e3e3e3e300ULL, 0xad0000adadadad00ULL, 0xf40000f4f4f4f400ULL,
0131     0x7700007777777700ULL, 0xc70000c7c7c7c700ULL, 0x8000008080808000ULL,
0132     0x9e00009e9e9e9e00ULL,
0133 };
0134 
0135 __visible const u64 camellia_sp22000222[256] = {
0136     0xe0e0000000e0e0e0ULL, 0x0505000000050505ULL, 0x5858000000585858ULL,
0137     0xd9d9000000d9d9d9ULL, 0x6767000000676767ULL, 0x4e4e0000004e4e4eULL,
0138     0x8181000000818181ULL, 0xcbcb000000cbcbcbULL, 0xc9c9000000c9c9c9ULL,
0139     0x0b0b0000000b0b0bULL, 0xaeae000000aeaeaeULL, 0x6a6a0000006a6a6aULL,
0140     0xd5d5000000d5d5d5ULL, 0x1818000000181818ULL, 0x5d5d0000005d5d5dULL,
0141     0x8282000000828282ULL, 0x4646000000464646ULL, 0xdfdf000000dfdfdfULL,
0142     0xd6d6000000d6d6d6ULL, 0x2727000000272727ULL, 0x8a8a0000008a8a8aULL,
0143     0x3232000000323232ULL, 0x4b4b0000004b4b4bULL, 0x4242000000424242ULL,
0144     0xdbdb000000dbdbdbULL, 0x1c1c0000001c1c1cULL, 0x9e9e0000009e9e9eULL,
0145     0x9c9c0000009c9c9cULL, 0x3a3a0000003a3a3aULL, 0xcaca000000cacacaULL,
0146     0x2525000000252525ULL, 0x7b7b0000007b7b7bULL, 0x0d0d0000000d0d0dULL,
0147     0x7171000000717171ULL, 0x5f5f0000005f5f5fULL, 0x1f1f0000001f1f1fULL,
0148     0xf8f8000000f8f8f8ULL, 0xd7d7000000d7d7d7ULL, 0x3e3e0000003e3e3eULL,
0149     0x9d9d0000009d9d9dULL, 0x7c7c0000007c7c7cULL, 0x6060000000606060ULL,
0150     0xb9b9000000b9b9b9ULL, 0xbebe000000bebebeULL, 0xbcbc000000bcbcbcULL,
0151     0x8b8b0000008b8b8bULL, 0x1616000000161616ULL, 0x3434000000343434ULL,
0152     0x4d4d0000004d4d4dULL, 0xc3c3000000c3c3c3ULL, 0x7272000000727272ULL,
0153     0x9595000000959595ULL, 0xabab000000abababULL, 0x8e8e0000008e8e8eULL,
0154     0xbaba000000bababaULL, 0x7a7a0000007a7a7aULL, 0xb3b3000000b3b3b3ULL,
0155     0x0202000000020202ULL, 0xb4b4000000b4b4b4ULL, 0xadad000000adadadULL,
0156     0xa2a2000000a2a2a2ULL, 0xacac000000acacacULL, 0xd8d8000000d8d8d8ULL,
0157     0x9a9a0000009a9a9aULL, 0x1717000000171717ULL, 0x1a1a0000001a1a1aULL,
0158     0x3535000000353535ULL, 0xcccc000000ccccccULL, 0xf7f7000000f7f7f7ULL,
0159     0x9999000000999999ULL, 0x6161000000616161ULL, 0x5a5a0000005a5a5aULL,
0160     0xe8e8000000e8e8e8ULL, 0x2424000000242424ULL, 0x5656000000565656ULL,
0161     0x4040000000404040ULL, 0xe1e1000000e1e1e1ULL, 0x6363000000636363ULL,
0162     0x0909000000090909ULL, 0x3333000000333333ULL, 0xbfbf000000bfbfbfULL,
0163     0x9898000000989898ULL, 0x9797000000979797ULL, 0x8585000000858585ULL,
0164     0x6868000000686868ULL, 0xfcfc000000fcfcfcULL, 0xecec000000ecececULL,
0165     0x0a0a0000000a0a0aULL, 0xdada000000dadadaULL, 0x6f6f0000006f6f6fULL,
0166     0x5353000000535353ULL, 0x6262000000626262ULL, 0xa3a3000000a3a3a3ULL,
0167     0x2e2e0000002e2e2eULL, 0x0808000000080808ULL, 0xafaf000000afafafULL,
0168     0x2828000000282828ULL, 0xb0b0000000b0b0b0ULL, 0x7474000000747474ULL,
0169     0xc2c2000000c2c2c2ULL, 0xbdbd000000bdbdbdULL, 0x3636000000363636ULL,
0170     0x2222000000222222ULL, 0x3838000000383838ULL, 0x6464000000646464ULL,
0171     0x1e1e0000001e1e1eULL, 0x3939000000393939ULL, 0x2c2c0000002c2c2cULL,
0172     0xa6a6000000a6a6a6ULL, 0x3030000000303030ULL, 0xe5e5000000e5e5e5ULL,
0173     0x4444000000444444ULL, 0xfdfd000000fdfdfdULL, 0x8888000000888888ULL,
0174     0x9f9f0000009f9f9fULL, 0x6565000000656565ULL, 0x8787000000878787ULL,
0175     0x6b6b0000006b6b6bULL, 0xf4f4000000f4f4f4ULL, 0x2323000000232323ULL,
0176     0x4848000000484848ULL, 0x1010000000101010ULL, 0xd1d1000000d1d1d1ULL,
0177     0x5151000000515151ULL, 0xc0c0000000c0c0c0ULL, 0xf9f9000000f9f9f9ULL,
0178     0xd2d2000000d2d2d2ULL, 0xa0a0000000a0a0a0ULL, 0x5555000000555555ULL,
0179     0xa1a1000000a1a1a1ULL, 0x4141000000414141ULL, 0xfafa000000fafafaULL,
0180     0x4343000000434343ULL, 0x1313000000131313ULL, 0xc4c4000000c4c4c4ULL,
0181     0x2f2f0000002f2f2fULL, 0xa8a8000000a8a8a8ULL, 0xb6b6000000b6b6b6ULL,
0182     0x3c3c0000003c3c3cULL, 0x2b2b0000002b2b2bULL, 0xc1c1000000c1c1c1ULL,
0183     0xffff000000ffffffULL, 0xc8c8000000c8c8c8ULL, 0xa5a5000000a5a5a5ULL,
0184     0x2020000000202020ULL, 0x8989000000898989ULL, 0x0000000000000000ULL,
0185     0x9090000000909090ULL, 0x4747000000474747ULL, 0xefef000000efefefULL,
0186     0xeaea000000eaeaeaULL, 0xb7b7000000b7b7b7ULL, 0x1515000000151515ULL,
0187     0x0606000000060606ULL, 0xcdcd000000cdcdcdULL, 0xb5b5000000b5b5b5ULL,
0188     0x1212000000121212ULL, 0x7e7e0000007e7e7eULL, 0xbbbb000000bbbbbbULL,
0189     0x2929000000292929ULL, 0x0f0f0000000f0f0fULL, 0xb8b8000000b8b8b8ULL,
0190     0x0707000000070707ULL, 0x0404000000040404ULL, 0x9b9b0000009b9b9bULL,
0191     0x9494000000949494ULL, 0x2121000000212121ULL, 0x6666000000666666ULL,
0192     0xe6e6000000e6e6e6ULL, 0xcece000000cececeULL, 0xeded000000edededULL,
0193     0xe7e7000000e7e7e7ULL, 0x3b3b0000003b3b3bULL, 0xfefe000000fefefeULL,
0194     0x7f7f0000007f7f7fULL, 0xc5c5000000c5c5c5ULL, 0xa4a4000000a4a4a4ULL,
0195     0x3737000000373737ULL, 0xb1b1000000b1b1b1ULL, 0x4c4c0000004c4c4cULL,
0196     0x9191000000919191ULL, 0x6e6e0000006e6e6eULL, 0x8d8d0000008d8d8dULL,
0197     0x7676000000767676ULL, 0x0303000000030303ULL, 0x2d2d0000002d2d2dULL,
0198     0xdede000000dededeULL, 0x9696000000969696ULL, 0x2626000000262626ULL,
0199     0x7d7d0000007d7d7dULL, 0xc6c6000000c6c6c6ULL, 0x5c5c0000005c5c5cULL,
0200     0xd3d3000000d3d3d3ULL, 0xf2f2000000f2f2f2ULL, 0x4f4f0000004f4f4fULL,
0201     0x1919000000191919ULL, 0x3f3f0000003f3f3fULL, 0xdcdc000000dcdcdcULL,
0202     0x7979000000797979ULL, 0x1d1d0000001d1d1dULL, 0x5252000000525252ULL,
0203     0xebeb000000ebebebULL, 0xf3f3000000f3f3f3ULL, 0x6d6d0000006d6d6dULL,
0204     0x5e5e0000005e5e5eULL, 0xfbfb000000fbfbfbULL, 0x6969000000696969ULL,
0205     0xb2b2000000b2b2b2ULL, 0xf0f0000000f0f0f0ULL, 0x3131000000313131ULL,
0206     0x0c0c0000000c0c0cULL, 0xd4d4000000d4d4d4ULL, 0xcfcf000000cfcfcfULL,
0207     0x8c8c0000008c8c8cULL, 0xe2e2000000e2e2e2ULL, 0x7575000000757575ULL,
0208     0xa9a9000000a9a9a9ULL, 0x4a4a0000004a4a4aULL, 0x5757000000575757ULL,
0209     0x8484000000848484ULL, 0x1111000000111111ULL, 0x4545000000454545ULL,
0210     0x1b1b0000001b1b1bULL, 0xf5f5000000f5f5f5ULL, 0xe4e4000000e4e4e4ULL,
0211     0x0e0e0000000e0e0eULL, 0x7373000000737373ULL, 0xaaaa000000aaaaaaULL,
0212     0xf1f1000000f1f1f1ULL, 0xdddd000000ddddddULL, 0x5959000000595959ULL,
0213     0x1414000000141414ULL, 0x6c6c0000006c6c6cULL, 0x9292000000929292ULL,
0214     0x5454000000545454ULL, 0xd0d0000000d0d0d0ULL, 0x7878000000787878ULL,
0215     0x7070000000707070ULL, 0xe3e3000000e3e3e3ULL, 0x4949000000494949ULL,
0216     0x8080000000808080ULL, 0x5050000000505050ULL, 0xa7a7000000a7a7a7ULL,
0217     0xf6f6000000f6f6f6ULL, 0x7777000000777777ULL, 0x9393000000939393ULL,
0218     0x8686000000868686ULL, 0x8383000000838383ULL, 0x2a2a0000002a2a2aULL,
0219     0xc7c7000000c7c7c7ULL, 0x5b5b0000005b5b5bULL, 0xe9e9000000e9e9e9ULL,
0220     0xeeee000000eeeeeeULL, 0x8f8f0000008f8f8fULL, 0x0101000000010101ULL,
0221     0x3d3d0000003d3d3dULL,
0222 };
0223 
0224 __visible const u64 camellia_sp03303033[256] = {
0225     0x0038380038003838ULL, 0x0041410041004141ULL, 0x0016160016001616ULL,
0226     0x0076760076007676ULL, 0x00d9d900d900d9d9ULL, 0x0093930093009393ULL,
0227     0x0060600060006060ULL, 0x00f2f200f200f2f2ULL, 0x0072720072007272ULL,
0228     0x00c2c200c200c2c2ULL, 0x00abab00ab00ababULL, 0x009a9a009a009a9aULL,
0229     0x0075750075007575ULL, 0x0006060006000606ULL, 0x0057570057005757ULL,
0230     0x00a0a000a000a0a0ULL, 0x0091910091009191ULL, 0x00f7f700f700f7f7ULL,
0231     0x00b5b500b500b5b5ULL, 0x00c9c900c900c9c9ULL, 0x00a2a200a200a2a2ULL,
0232     0x008c8c008c008c8cULL, 0x00d2d200d200d2d2ULL, 0x0090900090009090ULL,
0233     0x00f6f600f600f6f6ULL, 0x0007070007000707ULL, 0x00a7a700a700a7a7ULL,
0234     0x0027270027002727ULL, 0x008e8e008e008e8eULL, 0x00b2b200b200b2b2ULL,
0235     0x0049490049004949ULL, 0x00dede00de00dedeULL, 0x0043430043004343ULL,
0236     0x005c5c005c005c5cULL, 0x00d7d700d700d7d7ULL, 0x00c7c700c700c7c7ULL,
0237     0x003e3e003e003e3eULL, 0x00f5f500f500f5f5ULL, 0x008f8f008f008f8fULL,
0238     0x0067670067006767ULL, 0x001f1f001f001f1fULL, 0x0018180018001818ULL,
0239     0x006e6e006e006e6eULL, 0x00afaf00af00afafULL, 0x002f2f002f002f2fULL,
0240     0x00e2e200e200e2e2ULL, 0x0085850085008585ULL, 0x000d0d000d000d0dULL,
0241     0x0053530053005353ULL, 0x00f0f000f000f0f0ULL, 0x009c9c009c009c9cULL,
0242     0x0065650065006565ULL, 0x00eaea00ea00eaeaULL, 0x00a3a300a300a3a3ULL,
0243     0x00aeae00ae00aeaeULL, 0x009e9e009e009e9eULL, 0x00ecec00ec00ececULL,
0244     0x0080800080008080ULL, 0x002d2d002d002d2dULL, 0x006b6b006b006b6bULL,
0245     0x00a8a800a800a8a8ULL, 0x002b2b002b002b2bULL, 0x0036360036003636ULL,
0246     0x00a6a600a600a6a6ULL, 0x00c5c500c500c5c5ULL, 0x0086860086008686ULL,
0247     0x004d4d004d004d4dULL, 0x0033330033003333ULL, 0x00fdfd00fd00fdfdULL,
0248     0x0066660066006666ULL, 0x0058580058005858ULL, 0x0096960096009696ULL,
0249     0x003a3a003a003a3aULL, 0x0009090009000909ULL, 0x0095950095009595ULL,
0250     0x0010100010001010ULL, 0x0078780078007878ULL, 0x00d8d800d800d8d8ULL,
0251     0x0042420042004242ULL, 0x00cccc00cc00ccccULL, 0x00efef00ef00efefULL,
0252     0x0026260026002626ULL, 0x00e5e500e500e5e5ULL, 0x0061610061006161ULL,
0253     0x001a1a001a001a1aULL, 0x003f3f003f003f3fULL, 0x003b3b003b003b3bULL,
0254     0x0082820082008282ULL, 0x00b6b600b600b6b6ULL, 0x00dbdb00db00dbdbULL,
0255     0x00d4d400d400d4d4ULL, 0x0098980098009898ULL, 0x00e8e800e800e8e8ULL,
0256     0x008b8b008b008b8bULL, 0x0002020002000202ULL, 0x00ebeb00eb00ebebULL,
0257     0x000a0a000a000a0aULL, 0x002c2c002c002c2cULL, 0x001d1d001d001d1dULL,
0258     0x00b0b000b000b0b0ULL, 0x006f6f006f006f6fULL, 0x008d8d008d008d8dULL,
0259     0x0088880088008888ULL, 0x000e0e000e000e0eULL, 0x0019190019001919ULL,
0260     0x0087870087008787ULL, 0x004e4e004e004e4eULL, 0x000b0b000b000b0bULL,
0261     0x00a9a900a900a9a9ULL, 0x000c0c000c000c0cULL, 0x0079790079007979ULL,
0262     0x0011110011001111ULL, 0x007f7f007f007f7fULL, 0x0022220022002222ULL,
0263     0x00e7e700e700e7e7ULL, 0x0059590059005959ULL, 0x00e1e100e100e1e1ULL,
0264     0x00dada00da00dadaULL, 0x003d3d003d003d3dULL, 0x00c8c800c800c8c8ULL,
0265     0x0012120012001212ULL, 0x0004040004000404ULL, 0x0074740074007474ULL,
0266     0x0054540054005454ULL, 0x0030300030003030ULL, 0x007e7e007e007e7eULL,
0267     0x00b4b400b400b4b4ULL, 0x0028280028002828ULL, 0x0055550055005555ULL,
0268     0x0068680068006868ULL, 0x0050500050005050ULL, 0x00bebe00be00bebeULL,
0269     0x00d0d000d000d0d0ULL, 0x00c4c400c400c4c4ULL, 0x0031310031003131ULL,
0270     0x00cbcb00cb00cbcbULL, 0x002a2a002a002a2aULL, 0x00adad00ad00adadULL,
0271     0x000f0f000f000f0fULL, 0x00caca00ca00cacaULL, 0x0070700070007070ULL,
0272     0x00ffff00ff00ffffULL, 0x0032320032003232ULL, 0x0069690069006969ULL,
0273     0x0008080008000808ULL, 0x0062620062006262ULL, 0x0000000000000000ULL,
0274     0x0024240024002424ULL, 0x00d1d100d100d1d1ULL, 0x00fbfb00fb00fbfbULL,
0275     0x00baba00ba00babaULL, 0x00eded00ed00ededULL, 0x0045450045004545ULL,
0276     0x0081810081008181ULL, 0x0073730073007373ULL, 0x006d6d006d006d6dULL,
0277     0x0084840084008484ULL, 0x009f9f009f009f9fULL, 0x00eeee00ee00eeeeULL,
0278     0x004a4a004a004a4aULL, 0x00c3c300c300c3c3ULL, 0x002e2e002e002e2eULL,
0279     0x00c1c100c100c1c1ULL, 0x0001010001000101ULL, 0x00e6e600e600e6e6ULL,
0280     0x0025250025002525ULL, 0x0048480048004848ULL, 0x0099990099009999ULL,
0281     0x00b9b900b900b9b9ULL, 0x00b3b300b300b3b3ULL, 0x007b7b007b007b7bULL,
0282     0x00f9f900f900f9f9ULL, 0x00cece00ce00ceceULL, 0x00bfbf00bf00bfbfULL,
0283     0x00dfdf00df00dfdfULL, 0x0071710071007171ULL, 0x0029290029002929ULL,
0284     0x00cdcd00cd00cdcdULL, 0x006c6c006c006c6cULL, 0x0013130013001313ULL,
0285     0x0064640064006464ULL, 0x009b9b009b009b9bULL, 0x0063630063006363ULL,
0286     0x009d9d009d009d9dULL, 0x00c0c000c000c0c0ULL, 0x004b4b004b004b4bULL,
0287     0x00b7b700b700b7b7ULL, 0x00a5a500a500a5a5ULL, 0x0089890089008989ULL,
0288     0x005f5f005f005f5fULL, 0x00b1b100b100b1b1ULL, 0x0017170017001717ULL,
0289     0x00f4f400f400f4f4ULL, 0x00bcbc00bc00bcbcULL, 0x00d3d300d300d3d3ULL,
0290     0x0046460046004646ULL, 0x00cfcf00cf00cfcfULL, 0x0037370037003737ULL,
0291     0x005e5e005e005e5eULL, 0x0047470047004747ULL, 0x0094940094009494ULL,
0292     0x00fafa00fa00fafaULL, 0x00fcfc00fc00fcfcULL, 0x005b5b005b005b5bULL,
0293     0x0097970097009797ULL, 0x00fefe00fe00fefeULL, 0x005a5a005a005a5aULL,
0294     0x00acac00ac00acacULL, 0x003c3c003c003c3cULL, 0x004c4c004c004c4cULL,
0295     0x0003030003000303ULL, 0x0035350035003535ULL, 0x00f3f300f300f3f3ULL,
0296     0x0023230023002323ULL, 0x00b8b800b800b8b8ULL, 0x005d5d005d005d5dULL,
0297     0x006a6a006a006a6aULL, 0x0092920092009292ULL, 0x00d5d500d500d5d5ULL,
0298     0x0021210021002121ULL, 0x0044440044004444ULL, 0x0051510051005151ULL,
0299     0x00c6c600c600c6c6ULL, 0x007d7d007d007d7dULL, 0x0039390039003939ULL,
0300     0x0083830083008383ULL, 0x00dcdc00dc00dcdcULL, 0x00aaaa00aa00aaaaULL,
0301     0x007c7c007c007c7cULL, 0x0077770077007777ULL, 0x0056560056005656ULL,
0302     0x0005050005000505ULL, 0x001b1b001b001b1bULL, 0x00a4a400a400a4a4ULL,
0303     0x0015150015001515ULL, 0x0034340034003434ULL, 0x001e1e001e001e1eULL,
0304     0x001c1c001c001c1cULL, 0x00f8f800f800f8f8ULL, 0x0052520052005252ULL,
0305     0x0020200020002020ULL, 0x0014140014001414ULL, 0x00e9e900e900e9e9ULL,
0306     0x00bdbd00bd00bdbdULL, 0x00dddd00dd00ddddULL, 0x00e4e400e400e4e4ULL,
0307     0x00a1a100a100a1a1ULL, 0x00e0e000e000e0e0ULL, 0x008a8a008a008a8aULL,
0308     0x00f1f100f100f1f1ULL, 0x00d6d600d600d6d6ULL, 0x007a7a007a007a7aULL,
0309     0x00bbbb00bb00bbbbULL, 0x00e3e300e300e3e3ULL, 0x0040400040004040ULL,
0310     0x004f4f004f004f4fULL,
0311 };
0312 
0313 __visible const u64 camellia_sp00444404[256] = {
0314     0x0000707070700070ULL, 0x00002c2c2c2c002cULL, 0x0000b3b3b3b300b3ULL,
0315     0x0000c0c0c0c000c0ULL, 0x0000e4e4e4e400e4ULL, 0x0000575757570057ULL,
0316     0x0000eaeaeaea00eaULL, 0x0000aeaeaeae00aeULL, 0x0000232323230023ULL,
0317     0x00006b6b6b6b006bULL, 0x0000454545450045ULL, 0x0000a5a5a5a500a5ULL,
0318     0x0000edededed00edULL, 0x00004f4f4f4f004fULL, 0x00001d1d1d1d001dULL,
0319     0x0000929292920092ULL, 0x0000868686860086ULL, 0x0000afafafaf00afULL,
0320     0x00007c7c7c7c007cULL, 0x00001f1f1f1f001fULL, 0x00003e3e3e3e003eULL,
0321     0x0000dcdcdcdc00dcULL, 0x00005e5e5e5e005eULL, 0x00000b0b0b0b000bULL,
0322     0x0000a6a6a6a600a6ULL, 0x0000393939390039ULL, 0x0000d5d5d5d500d5ULL,
0323     0x00005d5d5d5d005dULL, 0x0000d9d9d9d900d9ULL, 0x00005a5a5a5a005aULL,
0324     0x0000515151510051ULL, 0x00006c6c6c6c006cULL, 0x00008b8b8b8b008bULL,
0325     0x00009a9a9a9a009aULL, 0x0000fbfbfbfb00fbULL, 0x0000b0b0b0b000b0ULL,
0326     0x0000747474740074ULL, 0x00002b2b2b2b002bULL, 0x0000f0f0f0f000f0ULL,
0327     0x0000848484840084ULL, 0x0000dfdfdfdf00dfULL, 0x0000cbcbcbcb00cbULL,
0328     0x0000343434340034ULL, 0x0000767676760076ULL, 0x00006d6d6d6d006dULL,
0329     0x0000a9a9a9a900a9ULL, 0x0000d1d1d1d100d1ULL, 0x0000040404040004ULL,
0330     0x0000141414140014ULL, 0x00003a3a3a3a003aULL, 0x0000dededede00deULL,
0331     0x0000111111110011ULL, 0x0000323232320032ULL, 0x00009c9c9c9c009cULL,
0332     0x0000535353530053ULL, 0x0000f2f2f2f200f2ULL, 0x0000fefefefe00feULL,
0333     0x0000cfcfcfcf00cfULL, 0x0000c3c3c3c300c3ULL, 0x00007a7a7a7a007aULL,
0334     0x0000242424240024ULL, 0x0000e8e8e8e800e8ULL, 0x0000606060600060ULL,
0335     0x0000696969690069ULL, 0x0000aaaaaaaa00aaULL, 0x0000a0a0a0a000a0ULL,
0336     0x0000a1a1a1a100a1ULL, 0x0000626262620062ULL, 0x0000545454540054ULL,
0337     0x00001e1e1e1e001eULL, 0x0000e0e0e0e000e0ULL, 0x0000646464640064ULL,
0338     0x0000101010100010ULL, 0x0000000000000000ULL, 0x0000a3a3a3a300a3ULL,
0339     0x0000757575750075ULL, 0x00008a8a8a8a008aULL, 0x0000e6e6e6e600e6ULL,
0340     0x0000090909090009ULL, 0x0000dddddddd00ddULL, 0x0000878787870087ULL,
0341     0x0000838383830083ULL, 0x0000cdcdcdcd00cdULL, 0x0000909090900090ULL,
0342     0x0000737373730073ULL, 0x0000f6f6f6f600f6ULL, 0x00009d9d9d9d009dULL,
0343     0x0000bfbfbfbf00bfULL, 0x0000525252520052ULL, 0x0000d8d8d8d800d8ULL,
0344     0x0000c8c8c8c800c8ULL, 0x0000c6c6c6c600c6ULL, 0x0000818181810081ULL,
0345     0x00006f6f6f6f006fULL, 0x0000131313130013ULL, 0x0000636363630063ULL,
0346     0x0000e9e9e9e900e9ULL, 0x0000a7a7a7a700a7ULL, 0x00009f9f9f9f009fULL,
0347     0x0000bcbcbcbc00bcULL, 0x0000292929290029ULL, 0x0000f9f9f9f900f9ULL,
0348     0x00002f2f2f2f002fULL, 0x0000b4b4b4b400b4ULL, 0x0000787878780078ULL,
0349     0x0000060606060006ULL, 0x0000e7e7e7e700e7ULL, 0x0000717171710071ULL,
0350     0x0000d4d4d4d400d4ULL, 0x0000abababab00abULL, 0x0000888888880088ULL,
0351     0x00008d8d8d8d008dULL, 0x0000727272720072ULL, 0x0000b9b9b9b900b9ULL,
0352     0x0000f8f8f8f800f8ULL, 0x0000acacacac00acULL, 0x0000363636360036ULL,
0353     0x00002a2a2a2a002aULL, 0x00003c3c3c3c003cULL, 0x0000f1f1f1f100f1ULL,
0354     0x0000404040400040ULL, 0x0000d3d3d3d300d3ULL, 0x0000bbbbbbbb00bbULL,
0355     0x0000434343430043ULL, 0x0000151515150015ULL, 0x0000adadadad00adULL,
0356     0x0000777777770077ULL, 0x0000808080800080ULL, 0x0000828282820082ULL,
0357     0x0000ecececec00ecULL, 0x0000272727270027ULL, 0x0000e5e5e5e500e5ULL,
0358     0x0000858585850085ULL, 0x0000353535350035ULL, 0x00000c0c0c0c000cULL,
0359     0x0000414141410041ULL, 0x0000efefefef00efULL, 0x0000939393930093ULL,
0360     0x0000191919190019ULL, 0x0000212121210021ULL, 0x00000e0e0e0e000eULL,
0361     0x00004e4e4e4e004eULL, 0x0000656565650065ULL, 0x0000bdbdbdbd00bdULL,
0362     0x0000b8b8b8b800b8ULL, 0x00008f8f8f8f008fULL, 0x0000ebebebeb00ebULL,
0363     0x0000cececece00ceULL, 0x0000303030300030ULL, 0x00005f5f5f5f005fULL,
0364     0x0000c5c5c5c500c5ULL, 0x00001a1a1a1a001aULL, 0x0000e1e1e1e100e1ULL,
0365     0x0000cacacaca00caULL, 0x0000474747470047ULL, 0x00003d3d3d3d003dULL,
0366     0x0000010101010001ULL, 0x0000d6d6d6d600d6ULL, 0x0000565656560056ULL,
0367     0x00004d4d4d4d004dULL, 0x00000d0d0d0d000dULL, 0x0000666666660066ULL,
0368     0x0000cccccccc00ccULL, 0x00002d2d2d2d002dULL, 0x0000121212120012ULL,
0369     0x0000202020200020ULL, 0x0000b1b1b1b100b1ULL, 0x0000999999990099ULL,
0370     0x00004c4c4c4c004cULL, 0x0000c2c2c2c200c2ULL, 0x00007e7e7e7e007eULL,
0371     0x0000050505050005ULL, 0x0000b7b7b7b700b7ULL, 0x0000313131310031ULL,
0372     0x0000171717170017ULL, 0x0000d7d7d7d700d7ULL, 0x0000585858580058ULL,
0373     0x0000616161610061ULL, 0x00001b1b1b1b001bULL, 0x00001c1c1c1c001cULL,
0374     0x00000f0f0f0f000fULL, 0x0000161616160016ULL, 0x0000181818180018ULL,
0375     0x0000222222220022ULL, 0x0000444444440044ULL, 0x0000b2b2b2b200b2ULL,
0376     0x0000b5b5b5b500b5ULL, 0x0000919191910091ULL, 0x0000080808080008ULL,
0377     0x0000a8a8a8a800a8ULL, 0x0000fcfcfcfc00fcULL, 0x0000505050500050ULL,
0378     0x0000d0d0d0d000d0ULL, 0x00007d7d7d7d007dULL, 0x0000898989890089ULL,
0379     0x0000979797970097ULL, 0x00005b5b5b5b005bULL, 0x0000959595950095ULL,
0380     0x0000ffffffff00ffULL, 0x0000d2d2d2d200d2ULL, 0x0000c4c4c4c400c4ULL,
0381     0x0000484848480048ULL, 0x0000f7f7f7f700f7ULL, 0x0000dbdbdbdb00dbULL,
0382     0x0000030303030003ULL, 0x0000dadadada00daULL, 0x00003f3f3f3f003fULL,
0383     0x0000949494940094ULL, 0x00005c5c5c5c005cULL, 0x0000020202020002ULL,
0384     0x00004a4a4a4a004aULL, 0x0000333333330033ULL, 0x0000676767670067ULL,
0385     0x0000f3f3f3f300f3ULL, 0x00007f7f7f7f007fULL, 0x0000e2e2e2e200e2ULL,
0386     0x00009b9b9b9b009bULL, 0x0000262626260026ULL, 0x0000373737370037ULL,
0387     0x00003b3b3b3b003bULL, 0x0000969696960096ULL, 0x00004b4b4b4b004bULL,
0388     0x0000bebebebe00beULL, 0x00002e2e2e2e002eULL, 0x0000797979790079ULL,
0389     0x00008c8c8c8c008cULL, 0x00006e6e6e6e006eULL, 0x00008e8e8e8e008eULL,
0390     0x0000f5f5f5f500f5ULL, 0x0000b6b6b6b600b6ULL, 0x0000fdfdfdfd00fdULL,
0391     0x0000595959590059ULL, 0x0000989898980098ULL, 0x00006a6a6a6a006aULL,
0392     0x0000464646460046ULL, 0x0000babababa00baULL, 0x0000252525250025ULL,
0393     0x0000424242420042ULL, 0x0000a2a2a2a200a2ULL, 0x0000fafafafa00faULL,
0394     0x0000070707070007ULL, 0x0000555555550055ULL, 0x0000eeeeeeee00eeULL,
0395     0x00000a0a0a0a000aULL, 0x0000494949490049ULL, 0x0000686868680068ULL,
0396     0x0000383838380038ULL, 0x0000a4a4a4a400a4ULL, 0x0000282828280028ULL,
0397     0x00007b7b7b7b007bULL, 0x0000c9c9c9c900c9ULL, 0x0000c1c1c1c100c1ULL,
0398     0x0000e3e3e3e300e3ULL, 0x0000f4f4f4f400f4ULL, 0x0000c7c7c7c700c7ULL,
0399     0x00009e9e9e9e009eULL,
0400 };
0401 
0402 __visible const u64 camellia_sp02220222[256] = {
0403     0x00e0e0e000e0e0e0ULL, 0x0005050500050505ULL, 0x0058585800585858ULL,
0404     0x00d9d9d900d9d9d9ULL, 0x0067676700676767ULL, 0x004e4e4e004e4e4eULL,
0405     0x0081818100818181ULL, 0x00cbcbcb00cbcbcbULL, 0x00c9c9c900c9c9c9ULL,
0406     0x000b0b0b000b0b0bULL, 0x00aeaeae00aeaeaeULL, 0x006a6a6a006a6a6aULL,
0407     0x00d5d5d500d5d5d5ULL, 0x0018181800181818ULL, 0x005d5d5d005d5d5dULL,
0408     0x0082828200828282ULL, 0x0046464600464646ULL, 0x00dfdfdf00dfdfdfULL,
0409     0x00d6d6d600d6d6d6ULL, 0x0027272700272727ULL, 0x008a8a8a008a8a8aULL,
0410     0x0032323200323232ULL, 0x004b4b4b004b4b4bULL, 0x0042424200424242ULL,
0411     0x00dbdbdb00dbdbdbULL, 0x001c1c1c001c1c1cULL, 0x009e9e9e009e9e9eULL,
0412     0x009c9c9c009c9c9cULL, 0x003a3a3a003a3a3aULL, 0x00cacaca00cacacaULL,
0413     0x0025252500252525ULL, 0x007b7b7b007b7b7bULL, 0x000d0d0d000d0d0dULL,
0414     0x0071717100717171ULL, 0x005f5f5f005f5f5fULL, 0x001f1f1f001f1f1fULL,
0415     0x00f8f8f800f8f8f8ULL, 0x00d7d7d700d7d7d7ULL, 0x003e3e3e003e3e3eULL,
0416     0x009d9d9d009d9d9dULL, 0x007c7c7c007c7c7cULL, 0x0060606000606060ULL,
0417     0x00b9b9b900b9b9b9ULL, 0x00bebebe00bebebeULL, 0x00bcbcbc00bcbcbcULL,
0418     0x008b8b8b008b8b8bULL, 0x0016161600161616ULL, 0x0034343400343434ULL,
0419     0x004d4d4d004d4d4dULL, 0x00c3c3c300c3c3c3ULL, 0x0072727200727272ULL,
0420     0x0095959500959595ULL, 0x00ababab00abababULL, 0x008e8e8e008e8e8eULL,
0421     0x00bababa00bababaULL, 0x007a7a7a007a7a7aULL, 0x00b3b3b300b3b3b3ULL,
0422     0x0002020200020202ULL, 0x00b4b4b400b4b4b4ULL, 0x00adadad00adadadULL,
0423     0x00a2a2a200a2a2a2ULL, 0x00acacac00acacacULL, 0x00d8d8d800d8d8d8ULL,
0424     0x009a9a9a009a9a9aULL, 0x0017171700171717ULL, 0x001a1a1a001a1a1aULL,
0425     0x0035353500353535ULL, 0x00cccccc00ccccccULL, 0x00f7f7f700f7f7f7ULL,
0426     0x0099999900999999ULL, 0x0061616100616161ULL, 0x005a5a5a005a5a5aULL,
0427     0x00e8e8e800e8e8e8ULL, 0x0024242400242424ULL, 0x0056565600565656ULL,
0428     0x0040404000404040ULL, 0x00e1e1e100e1e1e1ULL, 0x0063636300636363ULL,
0429     0x0009090900090909ULL, 0x0033333300333333ULL, 0x00bfbfbf00bfbfbfULL,
0430     0x0098989800989898ULL, 0x0097979700979797ULL, 0x0085858500858585ULL,
0431     0x0068686800686868ULL, 0x00fcfcfc00fcfcfcULL, 0x00ececec00ecececULL,
0432     0x000a0a0a000a0a0aULL, 0x00dadada00dadadaULL, 0x006f6f6f006f6f6fULL,
0433     0x0053535300535353ULL, 0x0062626200626262ULL, 0x00a3a3a300a3a3a3ULL,
0434     0x002e2e2e002e2e2eULL, 0x0008080800080808ULL, 0x00afafaf00afafafULL,
0435     0x0028282800282828ULL, 0x00b0b0b000b0b0b0ULL, 0x0074747400747474ULL,
0436     0x00c2c2c200c2c2c2ULL, 0x00bdbdbd00bdbdbdULL, 0x0036363600363636ULL,
0437     0x0022222200222222ULL, 0x0038383800383838ULL, 0x0064646400646464ULL,
0438     0x001e1e1e001e1e1eULL, 0x0039393900393939ULL, 0x002c2c2c002c2c2cULL,
0439     0x00a6a6a600a6a6a6ULL, 0x0030303000303030ULL, 0x00e5e5e500e5e5e5ULL,
0440     0x0044444400444444ULL, 0x00fdfdfd00fdfdfdULL, 0x0088888800888888ULL,
0441     0x009f9f9f009f9f9fULL, 0x0065656500656565ULL, 0x0087878700878787ULL,
0442     0x006b6b6b006b6b6bULL, 0x00f4f4f400f4f4f4ULL, 0x0023232300232323ULL,
0443     0x0048484800484848ULL, 0x0010101000101010ULL, 0x00d1d1d100d1d1d1ULL,
0444     0x0051515100515151ULL, 0x00c0c0c000c0c0c0ULL, 0x00f9f9f900f9f9f9ULL,
0445     0x00d2d2d200d2d2d2ULL, 0x00a0a0a000a0a0a0ULL, 0x0055555500555555ULL,
0446     0x00a1a1a100a1a1a1ULL, 0x0041414100414141ULL, 0x00fafafa00fafafaULL,
0447     0x0043434300434343ULL, 0x0013131300131313ULL, 0x00c4c4c400c4c4c4ULL,
0448     0x002f2f2f002f2f2fULL, 0x00a8a8a800a8a8a8ULL, 0x00b6b6b600b6b6b6ULL,
0449     0x003c3c3c003c3c3cULL, 0x002b2b2b002b2b2bULL, 0x00c1c1c100c1c1c1ULL,
0450     0x00ffffff00ffffffULL, 0x00c8c8c800c8c8c8ULL, 0x00a5a5a500a5a5a5ULL,
0451     0x0020202000202020ULL, 0x0089898900898989ULL, 0x0000000000000000ULL,
0452     0x0090909000909090ULL, 0x0047474700474747ULL, 0x00efefef00efefefULL,
0453     0x00eaeaea00eaeaeaULL, 0x00b7b7b700b7b7b7ULL, 0x0015151500151515ULL,
0454     0x0006060600060606ULL, 0x00cdcdcd00cdcdcdULL, 0x00b5b5b500b5b5b5ULL,
0455     0x0012121200121212ULL, 0x007e7e7e007e7e7eULL, 0x00bbbbbb00bbbbbbULL,
0456     0x0029292900292929ULL, 0x000f0f0f000f0f0fULL, 0x00b8b8b800b8b8b8ULL,
0457     0x0007070700070707ULL, 0x0004040400040404ULL, 0x009b9b9b009b9b9bULL,
0458     0x0094949400949494ULL, 0x0021212100212121ULL, 0x0066666600666666ULL,
0459     0x00e6e6e600e6e6e6ULL, 0x00cecece00cececeULL, 0x00ededed00edededULL,
0460     0x00e7e7e700e7e7e7ULL, 0x003b3b3b003b3b3bULL, 0x00fefefe00fefefeULL,
0461     0x007f7f7f007f7f7fULL, 0x00c5c5c500c5c5c5ULL, 0x00a4a4a400a4a4a4ULL,
0462     0x0037373700373737ULL, 0x00b1b1b100b1b1b1ULL, 0x004c4c4c004c4c4cULL,
0463     0x0091919100919191ULL, 0x006e6e6e006e6e6eULL, 0x008d8d8d008d8d8dULL,
0464     0x0076767600767676ULL, 0x0003030300030303ULL, 0x002d2d2d002d2d2dULL,
0465     0x00dedede00dededeULL, 0x0096969600969696ULL, 0x0026262600262626ULL,
0466     0x007d7d7d007d7d7dULL, 0x00c6c6c600c6c6c6ULL, 0x005c5c5c005c5c5cULL,
0467     0x00d3d3d300d3d3d3ULL, 0x00f2f2f200f2f2f2ULL, 0x004f4f4f004f4f4fULL,
0468     0x0019191900191919ULL, 0x003f3f3f003f3f3fULL, 0x00dcdcdc00dcdcdcULL,
0469     0x0079797900797979ULL, 0x001d1d1d001d1d1dULL, 0x0052525200525252ULL,
0470     0x00ebebeb00ebebebULL, 0x00f3f3f300f3f3f3ULL, 0x006d6d6d006d6d6dULL,
0471     0x005e5e5e005e5e5eULL, 0x00fbfbfb00fbfbfbULL, 0x0069696900696969ULL,
0472     0x00b2b2b200b2b2b2ULL, 0x00f0f0f000f0f0f0ULL, 0x0031313100313131ULL,
0473     0x000c0c0c000c0c0cULL, 0x00d4d4d400d4d4d4ULL, 0x00cfcfcf00cfcfcfULL,
0474     0x008c8c8c008c8c8cULL, 0x00e2e2e200e2e2e2ULL, 0x0075757500757575ULL,
0475     0x00a9a9a900a9a9a9ULL, 0x004a4a4a004a4a4aULL, 0x0057575700575757ULL,
0476     0x0084848400848484ULL, 0x0011111100111111ULL, 0x0045454500454545ULL,
0477     0x001b1b1b001b1b1bULL, 0x00f5f5f500f5f5f5ULL, 0x00e4e4e400e4e4e4ULL,
0478     0x000e0e0e000e0e0eULL, 0x0073737300737373ULL, 0x00aaaaaa00aaaaaaULL,
0479     0x00f1f1f100f1f1f1ULL, 0x00dddddd00ddddddULL, 0x0059595900595959ULL,
0480     0x0014141400141414ULL, 0x006c6c6c006c6c6cULL, 0x0092929200929292ULL,
0481     0x0054545400545454ULL, 0x00d0d0d000d0d0d0ULL, 0x0078787800787878ULL,
0482     0x0070707000707070ULL, 0x00e3e3e300e3e3e3ULL, 0x0049494900494949ULL,
0483     0x0080808000808080ULL, 0x0050505000505050ULL, 0x00a7a7a700a7a7a7ULL,
0484     0x00f6f6f600f6f6f6ULL, 0x0077777700777777ULL, 0x0093939300939393ULL,
0485     0x0086868600868686ULL, 0x0083838300838383ULL, 0x002a2a2a002a2a2aULL,
0486     0x00c7c7c700c7c7c7ULL, 0x005b5b5b005b5b5bULL, 0x00e9e9e900e9e9e9ULL,
0487     0x00eeeeee00eeeeeeULL, 0x008f8f8f008f8f8fULL, 0x0001010100010101ULL,
0488     0x003d3d3d003d3d3dULL,
0489 };
0490 
0491 __visible const u64 camellia_sp30333033[256] = {
0492     0x3800383838003838ULL, 0x4100414141004141ULL, 0x1600161616001616ULL,
0493     0x7600767676007676ULL, 0xd900d9d9d900d9d9ULL, 0x9300939393009393ULL,
0494     0x6000606060006060ULL, 0xf200f2f2f200f2f2ULL, 0x7200727272007272ULL,
0495     0xc200c2c2c200c2c2ULL, 0xab00ababab00ababULL, 0x9a009a9a9a009a9aULL,
0496     0x7500757575007575ULL, 0x0600060606000606ULL, 0x5700575757005757ULL,
0497     0xa000a0a0a000a0a0ULL, 0x9100919191009191ULL, 0xf700f7f7f700f7f7ULL,
0498     0xb500b5b5b500b5b5ULL, 0xc900c9c9c900c9c9ULL, 0xa200a2a2a200a2a2ULL,
0499     0x8c008c8c8c008c8cULL, 0xd200d2d2d200d2d2ULL, 0x9000909090009090ULL,
0500     0xf600f6f6f600f6f6ULL, 0x0700070707000707ULL, 0xa700a7a7a700a7a7ULL,
0501     0x2700272727002727ULL, 0x8e008e8e8e008e8eULL, 0xb200b2b2b200b2b2ULL,
0502     0x4900494949004949ULL, 0xde00dedede00dedeULL, 0x4300434343004343ULL,
0503     0x5c005c5c5c005c5cULL, 0xd700d7d7d700d7d7ULL, 0xc700c7c7c700c7c7ULL,
0504     0x3e003e3e3e003e3eULL, 0xf500f5f5f500f5f5ULL, 0x8f008f8f8f008f8fULL,
0505     0x6700676767006767ULL, 0x1f001f1f1f001f1fULL, 0x1800181818001818ULL,
0506     0x6e006e6e6e006e6eULL, 0xaf00afafaf00afafULL, 0x2f002f2f2f002f2fULL,
0507     0xe200e2e2e200e2e2ULL, 0x8500858585008585ULL, 0x0d000d0d0d000d0dULL,
0508     0x5300535353005353ULL, 0xf000f0f0f000f0f0ULL, 0x9c009c9c9c009c9cULL,
0509     0x6500656565006565ULL, 0xea00eaeaea00eaeaULL, 0xa300a3a3a300a3a3ULL,
0510     0xae00aeaeae00aeaeULL, 0x9e009e9e9e009e9eULL, 0xec00ececec00ececULL,
0511     0x8000808080008080ULL, 0x2d002d2d2d002d2dULL, 0x6b006b6b6b006b6bULL,
0512     0xa800a8a8a800a8a8ULL, 0x2b002b2b2b002b2bULL, 0x3600363636003636ULL,
0513     0xa600a6a6a600a6a6ULL, 0xc500c5c5c500c5c5ULL, 0x8600868686008686ULL,
0514     0x4d004d4d4d004d4dULL, 0x3300333333003333ULL, 0xfd00fdfdfd00fdfdULL,
0515     0x6600666666006666ULL, 0x5800585858005858ULL, 0x9600969696009696ULL,
0516     0x3a003a3a3a003a3aULL, 0x0900090909000909ULL, 0x9500959595009595ULL,
0517     0x1000101010001010ULL, 0x7800787878007878ULL, 0xd800d8d8d800d8d8ULL,
0518     0x4200424242004242ULL, 0xcc00cccccc00ccccULL, 0xef00efefef00efefULL,
0519     0x2600262626002626ULL, 0xe500e5e5e500e5e5ULL, 0x6100616161006161ULL,
0520     0x1a001a1a1a001a1aULL, 0x3f003f3f3f003f3fULL, 0x3b003b3b3b003b3bULL,
0521     0x8200828282008282ULL, 0xb600b6b6b600b6b6ULL, 0xdb00dbdbdb00dbdbULL,
0522     0xd400d4d4d400d4d4ULL, 0x9800989898009898ULL, 0xe800e8e8e800e8e8ULL,
0523     0x8b008b8b8b008b8bULL, 0x0200020202000202ULL, 0xeb00ebebeb00ebebULL,
0524     0x0a000a0a0a000a0aULL, 0x2c002c2c2c002c2cULL, 0x1d001d1d1d001d1dULL,
0525     0xb000b0b0b000b0b0ULL, 0x6f006f6f6f006f6fULL, 0x8d008d8d8d008d8dULL,
0526     0x8800888888008888ULL, 0x0e000e0e0e000e0eULL, 0x1900191919001919ULL,
0527     0x8700878787008787ULL, 0x4e004e4e4e004e4eULL, 0x0b000b0b0b000b0bULL,
0528     0xa900a9a9a900a9a9ULL, 0x0c000c0c0c000c0cULL, 0x7900797979007979ULL,
0529     0x1100111111001111ULL, 0x7f007f7f7f007f7fULL, 0x2200222222002222ULL,
0530     0xe700e7e7e700e7e7ULL, 0x5900595959005959ULL, 0xe100e1e1e100e1e1ULL,
0531     0xda00dadada00dadaULL, 0x3d003d3d3d003d3dULL, 0xc800c8c8c800c8c8ULL,
0532     0x1200121212001212ULL, 0x0400040404000404ULL, 0x7400747474007474ULL,
0533     0x5400545454005454ULL, 0x3000303030003030ULL, 0x7e007e7e7e007e7eULL,
0534     0xb400b4b4b400b4b4ULL, 0x2800282828002828ULL, 0x5500555555005555ULL,
0535     0x6800686868006868ULL, 0x5000505050005050ULL, 0xbe00bebebe00bebeULL,
0536     0xd000d0d0d000d0d0ULL, 0xc400c4c4c400c4c4ULL, 0x3100313131003131ULL,
0537     0xcb00cbcbcb00cbcbULL, 0x2a002a2a2a002a2aULL, 0xad00adadad00adadULL,
0538     0x0f000f0f0f000f0fULL, 0xca00cacaca00cacaULL, 0x7000707070007070ULL,
0539     0xff00ffffff00ffffULL, 0x3200323232003232ULL, 0x6900696969006969ULL,
0540     0x0800080808000808ULL, 0x6200626262006262ULL, 0x0000000000000000ULL,
0541     0x2400242424002424ULL, 0xd100d1d1d100d1d1ULL, 0xfb00fbfbfb00fbfbULL,
0542     0xba00bababa00babaULL, 0xed00ededed00ededULL, 0x4500454545004545ULL,
0543     0x8100818181008181ULL, 0x7300737373007373ULL, 0x6d006d6d6d006d6dULL,
0544     0x8400848484008484ULL, 0x9f009f9f9f009f9fULL, 0xee00eeeeee00eeeeULL,
0545     0x4a004a4a4a004a4aULL, 0xc300c3c3c300c3c3ULL, 0x2e002e2e2e002e2eULL,
0546     0xc100c1c1c100c1c1ULL, 0x0100010101000101ULL, 0xe600e6e6e600e6e6ULL,
0547     0x2500252525002525ULL, 0x4800484848004848ULL, 0x9900999999009999ULL,
0548     0xb900b9b9b900b9b9ULL, 0xb300b3b3b300b3b3ULL, 0x7b007b7b7b007b7bULL,
0549     0xf900f9f9f900f9f9ULL, 0xce00cecece00ceceULL, 0xbf00bfbfbf00bfbfULL,
0550     0xdf00dfdfdf00dfdfULL, 0x7100717171007171ULL, 0x2900292929002929ULL,
0551     0xcd00cdcdcd00cdcdULL, 0x6c006c6c6c006c6cULL, 0x1300131313001313ULL,
0552     0x6400646464006464ULL, 0x9b009b9b9b009b9bULL, 0x6300636363006363ULL,
0553     0x9d009d9d9d009d9dULL, 0xc000c0c0c000c0c0ULL, 0x4b004b4b4b004b4bULL,
0554     0xb700b7b7b700b7b7ULL, 0xa500a5a5a500a5a5ULL, 0x8900898989008989ULL,
0555     0x5f005f5f5f005f5fULL, 0xb100b1b1b100b1b1ULL, 0x1700171717001717ULL,
0556     0xf400f4f4f400f4f4ULL, 0xbc00bcbcbc00bcbcULL, 0xd300d3d3d300d3d3ULL,
0557     0x4600464646004646ULL, 0xcf00cfcfcf00cfcfULL, 0x3700373737003737ULL,
0558     0x5e005e5e5e005e5eULL, 0x4700474747004747ULL, 0x9400949494009494ULL,
0559     0xfa00fafafa00fafaULL, 0xfc00fcfcfc00fcfcULL, 0x5b005b5b5b005b5bULL,
0560     0x9700979797009797ULL, 0xfe00fefefe00fefeULL, 0x5a005a5a5a005a5aULL,
0561     0xac00acacac00acacULL, 0x3c003c3c3c003c3cULL, 0x4c004c4c4c004c4cULL,
0562     0x0300030303000303ULL, 0x3500353535003535ULL, 0xf300f3f3f300f3f3ULL,
0563     0x2300232323002323ULL, 0xb800b8b8b800b8b8ULL, 0x5d005d5d5d005d5dULL,
0564     0x6a006a6a6a006a6aULL, 0x9200929292009292ULL, 0xd500d5d5d500d5d5ULL,
0565     0x2100212121002121ULL, 0x4400444444004444ULL, 0x5100515151005151ULL,
0566     0xc600c6c6c600c6c6ULL, 0x7d007d7d7d007d7dULL, 0x3900393939003939ULL,
0567     0x8300838383008383ULL, 0xdc00dcdcdc00dcdcULL, 0xaa00aaaaaa00aaaaULL,
0568     0x7c007c7c7c007c7cULL, 0x7700777777007777ULL, 0x5600565656005656ULL,
0569     0x0500050505000505ULL, 0x1b001b1b1b001b1bULL, 0xa400a4a4a400a4a4ULL,
0570     0x1500151515001515ULL, 0x3400343434003434ULL, 0x1e001e1e1e001e1eULL,
0571     0x1c001c1c1c001c1cULL, 0xf800f8f8f800f8f8ULL, 0x5200525252005252ULL,
0572     0x2000202020002020ULL, 0x1400141414001414ULL, 0xe900e9e9e900e9e9ULL,
0573     0xbd00bdbdbd00bdbdULL, 0xdd00dddddd00ddddULL, 0xe400e4e4e400e4e4ULL,
0574     0xa100a1a1a100a1a1ULL, 0xe000e0e0e000e0e0ULL, 0x8a008a8a8a008a8aULL,
0575     0xf100f1f1f100f1f1ULL, 0xd600d6d6d600d6d6ULL, 0x7a007a7a7a007a7aULL,
0576     0xbb00bbbbbb00bbbbULL, 0xe300e3e3e300e3e3ULL, 0x4000404040004040ULL,
0577     0x4f004f4f4f004f4fULL,
0578 };
0579 
0580 __visible const u64 camellia_sp44044404[256] = {
0581     0x7070007070700070ULL, 0x2c2c002c2c2c002cULL, 0xb3b300b3b3b300b3ULL,
0582     0xc0c000c0c0c000c0ULL, 0xe4e400e4e4e400e4ULL, 0x5757005757570057ULL,
0583     0xeaea00eaeaea00eaULL, 0xaeae00aeaeae00aeULL, 0x2323002323230023ULL,
0584     0x6b6b006b6b6b006bULL, 0x4545004545450045ULL, 0xa5a500a5a5a500a5ULL,
0585     0xeded00ededed00edULL, 0x4f4f004f4f4f004fULL, 0x1d1d001d1d1d001dULL,
0586     0x9292009292920092ULL, 0x8686008686860086ULL, 0xafaf00afafaf00afULL,
0587     0x7c7c007c7c7c007cULL, 0x1f1f001f1f1f001fULL, 0x3e3e003e3e3e003eULL,
0588     0xdcdc00dcdcdc00dcULL, 0x5e5e005e5e5e005eULL, 0x0b0b000b0b0b000bULL,
0589     0xa6a600a6a6a600a6ULL, 0x3939003939390039ULL, 0xd5d500d5d5d500d5ULL,
0590     0x5d5d005d5d5d005dULL, 0xd9d900d9d9d900d9ULL, 0x5a5a005a5a5a005aULL,
0591     0x5151005151510051ULL, 0x6c6c006c6c6c006cULL, 0x8b8b008b8b8b008bULL,
0592     0x9a9a009a9a9a009aULL, 0xfbfb00fbfbfb00fbULL, 0xb0b000b0b0b000b0ULL,
0593     0x7474007474740074ULL, 0x2b2b002b2b2b002bULL, 0xf0f000f0f0f000f0ULL,
0594     0x8484008484840084ULL, 0xdfdf00dfdfdf00dfULL, 0xcbcb00cbcbcb00cbULL,
0595     0x3434003434340034ULL, 0x7676007676760076ULL, 0x6d6d006d6d6d006dULL,
0596     0xa9a900a9a9a900a9ULL, 0xd1d100d1d1d100d1ULL, 0x0404000404040004ULL,
0597     0x1414001414140014ULL, 0x3a3a003a3a3a003aULL, 0xdede00dedede00deULL,
0598     0x1111001111110011ULL, 0x3232003232320032ULL, 0x9c9c009c9c9c009cULL,
0599     0x5353005353530053ULL, 0xf2f200f2f2f200f2ULL, 0xfefe00fefefe00feULL,
0600     0xcfcf00cfcfcf00cfULL, 0xc3c300c3c3c300c3ULL, 0x7a7a007a7a7a007aULL,
0601     0x2424002424240024ULL, 0xe8e800e8e8e800e8ULL, 0x6060006060600060ULL,
0602     0x6969006969690069ULL, 0xaaaa00aaaaaa00aaULL, 0xa0a000a0a0a000a0ULL,
0603     0xa1a100a1a1a100a1ULL, 0x6262006262620062ULL, 0x5454005454540054ULL,
0604     0x1e1e001e1e1e001eULL, 0xe0e000e0e0e000e0ULL, 0x6464006464640064ULL,
0605     0x1010001010100010ULL, 0x0000000000000000ULL, 0xa3a300a3a3a300a3ULL,
0606     0x7575007575750075ULL, 0x8a8a008a8a8a008aULL, 0xe6e600e6e6e600e6ULL,
0607     0x0909000909090009ULL, 0xdddd00dddddd00ddULL, 0x8787008787870087ULL,
0608     0x8383008383830083ULL, 0xcdcd00cdcdcd00cdULL, 0x9090009090900090ULL,
0609     0x7373007373730073ULL, 0xf6f600f6f6f600f6ULL, 0x9d9d009d9d9d009dULL,
0610     0xbfbf00bfbfbf00bfULL, 0x5252005252520052ULL, 0xd8d800d8d8d800d8ULL,
0611     0xc8c800c8c8c800c8ULL, 0xc6c600c6c6c600c6ULL, 0x8181008181810081ULL,
0612     0x6f6f006f6f6f006fULL, 0x1313001313130013ULL, 0x6363006363630063ULL,
0613     0xe9e900e9e9e900e9ULL, 0xa7a700a7a7a700a7ULL, 0x9f9f009f9f9f009fULL,
0614     0xbcbc00bcbcbc00bcULL, 0x2929002929290029ULL, 0xf9f900f9f9f900f9ULL,
0615     0x2f2f002f2f2f002fULL, 0xb4b400b4b4b400b4ULL, 0x7878007878780078ULL,
0616     0x0606000606060006ULL, 0xe7e700e7e7e700e7ULL, 0x7171007171710071ULL,
0617     0xd4d400d4d4d400d4ULL, 0xabab00ababab00abULL, 0x8888008888880088ULL,
0618     0x8d8d008d8d8d008dULL, 0x7272007272720072ULL, 0xb9b900b9b9b900b9ULL,
0619     0xf8f800f8f8f800f8ULL, 0xacac00acacac00acULL, 0x3636003636360036ULL,
0620     0x2a2a002a2a2a002aULL, 0x3c3c003c3c3c003cULL, 0xf1f100f1f1f100f1ULL,
0621     0x4040004040400040ULL, 0xd3d300d3d3d300d3ULL, 0xbbbb00bbbbbb00bbULL,
0622     0x4343004343430043ULL, 0x1515001515150015ULL, 0xadad00adadad00adULL,
0623     0x7777007777770077ULL, 0x8080008080800080ULL, 0x8282008282820082ULL,
0624     0xecec00ececec00ecULL, 0x2727002727270027ULL, 0xe5e500e5e5e500e5ULL,
0625     0x8585008585850085ULL, 0x3535003535350035ULL, 0x0c0c000c0c0c000cULL,
0626     0x4141004141410041ULL, 0xefef00efefef00efULL, 0x9393009393930093ULL,
0627     0x1919001919190019ULL, 0x2121002121210021ULL, 0x0e0e000e0e0e000eULL,
0628     0x4e4e004e4e4e004eULL, 0x6565006565650065ULL, 0xbdbd00bdbdbd00bdULL,
0629     0xb8b800b8b8b800b8ULL, 0x8f8f008f8f8f008fULL, 0xebeb00ebebeb00ebULL,
0630     0xcece00cecece00ceULL, 0x3030003030300030ULL, 0x5f5f005f5f5f005fULL,
0631     0xc5c500c5c5c500c5ULL, 0x1a1a001a1a1a001aULL, 0xe1e100e1e1e100e1ULL,
0632     0xcaca00cacaca00caULL, 0x4747004747470047ULL, 0x3d3d003d3d3d003dULL,
0633     0x0101000101010001ULL, 0xd6d600d6d6d600d6ULL, 0x5656005656560056ULL,
0634     0x4d4d004d4d4d004dULL, 0x0d0d000d0d0d000dULL, 0x6666006666660066ULL,
0635     0xcccc00cccccc00ccULL, 0x2d2d002d2d2d002dULL, 0x1212001212120012ULL,
0636     0x2020002020200020ULL, 0xb1b100b1b1b100b1ULL, 0x9999009999990099ULL,
0637     0x4c4c004c4c4c004cULL, 0xc2c200c2c2c200c2ULL, 0x7e7e007e7e7e007eULL,
0638     0x0505000505050005ULL, 0xb7b700b7b7b700b7ULL, 0x3131003131310031ULL,
0639     0x1717001717170017ULL, 0xd7d700d7d7d700d7ULL, 0x5858005858580058ULL,
0640     0x6161006161610061ULL, 0x1b1b001b1b1b001bULL, 0x1c1c001c1c1c001cULL,
0641     0x0f0f000f0f0f000fULL, 0x1616001616160016ULL, 0x1818001818180018ULL,
0642     0x2222002222220022ULL, 0x4444004444440044ULL, 0xb2b200b2b2b200b2ULL,
0643     0xb5b500b5b5b500b5ULL, 0x9191009191910091ULL, 0x0808000808080008ULL,
0644     0xa8a800a8a8a800a8ULL, 0xfcfc00fcfcfc00fcULL, 0x5050005050500050ULL,
0645     0xd0d000d0d0d000d0ULL, 0x7d7d007d7d7d007dULL, 0x8989008989890089ULL,
0646     0x9797009797970097ULL, 0x5b5b005b5b5b005bULL, 0x9595009595950095ULL,
0647     0xffff00ffffff00ffULL, 0xd2d200d2d2d200d2ULL, 0xc4c400c4c4c400c4ULL,
0648     0x4848004848480048ULL, 0xf7f700f7f7f700f7ULL, 0xdbdb00dbdbdb00dbULL,
0649     0x0303000303030003ULL, 0xdada00dadada00daULL, 0x3f3f003f3f3f003fULL,
0650     0x9494009494940094ULL, 0x5c5c005c5c5c005cULL, 0x0202000202020002ULL,
0651     0x4a4a004a4a4a004aULL, 0x3333003333330033ULL, 0x6767006767670067ULL,
0652     0xf3f300f3f3f300f3ULL, 0x7f7f007f7f7f007fULL, 0xe2e200e2e2e200e2ULL,
0653     0x9b9b009b9b9b009bULL, 0x2626002626260026ULL, 0x3737003737370037ULL,
0654     0x3b3b003b3b3b003bULL, 0x9696009696960096ULL, 0x4b4b004b4b4b004bULL,
0655     0xbebe00bebebe00beULL, 0x2e2e002e2e2e002eULL, 0x7979007979790079ULL,
0656     0x8c8c008c8c8c008cULL, 0x6e6e006e6e6e006eULL, 0x8e8e008e8e8e008eULL,
0657     0xf5f500f5f5f500f5ULL, 0xb6b600b6b6b600b6ULL, 0xfdfd00fdfdfd00fdULL,
0658     0x5959005959590059ULL, 0x9898009898980098ULL, 0x6a6a006a6a6a006aULL,
0659     0x4646004646460046ULL, 0xbaba00bababa00baULL, 0x2525002525250025ULL,
0660     0x4242004242420042ULL, 0xa2a200a2a2a200a2ULL, 0xfafa00fafafa00faULL,
0661     0x0707000707070007ULL, 0x5555005555550055ULL, 0xeeee00eeeeee00eeULL,
0662     0x0a0a000a0a0a000aULL, 0x4949004949490049ULL, 0x6868006868680068ULL,
0663     0x3838003838380038ULL, 0xa4a400a4a4a400a4ULL, 0x2828002828280028ULL,
0664     0x7b7b007b7b7b007bULL, 0xc9c900c9c9c900c9ULL, 0xc1c100c1c1c100c1ULL,
0665     0xe3e300e3e3e300e3ULL, 0xf4f400f4f4f400f4ULL, 0xc7c700c7c7c700c7ULL,
0666     0x9e9e009e9e9e009eULL,
0667 };
0668 
0669 __visible const u64 camellia_sp11101110[256] = {
0670     0x7070700070707000ULL, 0x8282820082828200ULL, 0x2c2c2c002c2c2c00ULL,
0671     0xececec00ececec00ULL, 0xb3b3b300b3b3b300ULL, 0x2727270027272700ULL,
0672     0xc0c0c000c0c0c000ULL, 0xe5e5e500e5e5e500ULL, 0xe4e4e400e4e4e400ULL,
0673     0x8585850085858500ULL, 0x5757570057575700ULL, 0x3535350035353500ULL,
0674     0xeaeaea00eaeaea00ULL, 0x0c0c0c000c0c0c00ULL, 0xaeaeae00aeaeae00ULL,
0675     0x4141410041414100ULL, 0x2323230023232300ULL, 0xefefef00efefef00ULL,
0676     0x6b6b6b006b6b6b00ULL, 0x9393930093939300ULL, 0x4545450045454500ULL,
0677     0x1919190019191900ULL, 0xa5a5a500a5a5a500ULL, 0x2121210021212100ULL,
0678     0xededed00ededed00ULL, 0x0e0e0e000e0e0e00ULL, 0x4f4f4f004f4f4f00ULL,
0679     0x4e4e4e004e4e4e00ULL, 0x1d1d1d001d1d1d00ULL, 0x6565650065656500ULL,
0680     0x9292920092929200ULL, 0xbdbdbd00bdbdbd00ULL, 0x8686860086868600ULL,
0681     0xb8b8b800b8b8b800ULL, 0xafafaf00afafaf00ULL, 0x8f8f8f008f8f8f00ULL,
0682     0x7c7c7c007c7c7c00ULL, 0xebebeb00ebebeb00ULL, 0x1f1f1f001f1f1f00ULL,
0683     0xcecece00cecece00ULL, 0x3e3e3e003e3e3e00ULL, 0x3030300030303000ULL,
0684     0xdcdcdc00dcdcdc00ULL, 0x5f5f5f005f5f5f00ULL, 0x5e5e5e005e5e5e00ULL,
0685     0xc5c5c500c5c5c500ULL, 0x0b0b0b000b0b0b00ULL, 0x1a1a1a001a1a1a00ULL,
0686     0xa6a6a600a6a6a600ULL, 0xe1e1e100e1e1e100ULL, 0x3939390039393900ULL,
0687     0xcacaca00cacaca00ULL, 0xd5d5d500d5d5d500ULL, 0x4747470047474700ULL,
0688     0x5d5d5d005d5d5d00ULL, 0x3d3d3d003d3d3d00ULL, 0xd9d9d900d9d9d900ULL,
0689     0x0101010001010100ULL, 0x5a5a5a005a5a5a00ULL, 0xd6d6d600d6d6d600ULL,
0690     0x5151510051515100ULL, 0x5656560056565600ULL, 0x6c6c6c006c6c6c00ULL,
0691     0x4d4d4d004d4d4d00ULL, 0x8b8b8b008b8b8b00ULL, 0x0d0d0d000d0d0d00ULL,
0692     0x9a9a9a009a9a9a00ULL, 0x6666660066666600ULL, 0xfbfbfb00fbfbfb00ULL,
0693     0xcccccc00cccccc00ULL, 0xb0b0b000b0b0b000ULL, 0x2d2d2d002d2d2d00ULL,
0694     0x7474740074747400ULL, 0x1212120012121200ULL, 0x2b2b2b002b2b2b00ULL,
0695     0x2020200020202000ULL, 0xf0f0f000f0f0f000ULL, 0xb1b1b100b1b1b100ULL,
0696     0x8484840084848400ULL, 0x9999990099999900ULL, 0xdfdfdf00dfdfdf00ULL,
0697     0x4c4c4c004c4c4c00ULL, 0xcbcbcb00cbcbcb00ULL, 0xc2c2c200c2c2c200ULL,
0698     0x3434340034343400ULL, 0x7e7e7e007e7e7e00ULL, 0x7676760076767600ULL,
0699     0x0505050005050500ULL, 0x6d6d6d006d6d6d00ULL, 0xb7b7b700b7b7b700ULL,
0700     0xa9a9a900a9a9a900ULL, 0x3131310031313100ULL, 0xd1d1d100d1d1d100ULL,
0701     0x1717170017171700ULL, 0x0404040004040400ULL, 0xd7d7d700d7d7d700ULL,
0702     0x1414140014141400ULL, 0x5858580058585800ULL, 0x3a3a3a003a3a3a00ULL,
0703     0x6161610061616100ULL, 0xdedede00dedede00ULL, 0x1b1b1b001b1b1b00ULL,
0704     0x1111110011111100ULL, 0x1c1c1c001c1c1c00ULL, 0x3232320032323200ULL,
0705     0x0f0f0f000f0f0f00ULL, 0x9c9c9c009c9c9c00ULL, 0x1616160016161600ULL,
0706     0x5353530053535300ULL, 0x1818180018181800ULL, 0xf2f2f200f2f2f200ULL,
0707     0x2222220022222200ULL, 0xfefefe00fefefe00ULL, 0x4444440044444400ULL,
0708     0xcfcfcf00cfcfcf00ULL, 0xb2b2b200b2b2b200ULL, 0xc3c3c300c3c3c300ULL,
0709     0xb5b5b500b5b5b500ULL, 0x7a7a7a007a7a7a00ULL, 0x9191910091919100ULL,
0710     0x2424240024242400ULL, 0x0808080008080800ULL, 0xe8e8e800e8e8e800ULL,
0711     0xa8a8a800a8a8a800ULL, 0x6060600060606000ULL, 0xfcfcfc00fcfcfc00ULL,
0712     0x6969690069696900ULL, 0x5050500050505000ULL, 0xaaaaaa00aaaaaa00ULL,
0713     0xd0d0d000d0d0d000ULL, 0xa0a0a000a0a0a000ULL, 0x7d7d7d007d7d7d00ULL,
0714     0xa1a1a100a1a1a100ULL, 0x8989890089898900ULL, 0x6262620062626200ULL,
0715     0x9797970097979700ULL, 0x5454540054545400ULL, 0x5b5b5b005b5b5b00ULL,
0716     0x1e1e1e001e1e1e00ULL, 0x9595950095959500ULL, 0xe0e0e000e0e0e000ULL,
0717     0xffffff00ffffff00ULL, 0x6464640064646400ULL, 0xd2d2d200d2d2d200ULL,
0718     0x1010100010101000ULL, 0xc4c4c400c4c4c400ULL, 0x0000000000000000ULL,
0719     0x4848480048484800ULL, 0xa3a3a300a3a3a300ULL, 0xf7f7f700f7f7f700ULL,
0720     0x7575750075757500ULL, 0xdbdbdb00dbdbdb00ULL, 0x8a8a8a008a8a8a00ULL,
0721     0x0303030003030300ULL, 0xe6e6e600e6e6e600ULL, 0xdadada00dadada00ULL,
0722     0x0909090009090900ULL, 0x3f3f3f003f3f3f00ULL, 0xdddddd00dddddd00ULL,
0723     0x9494940094949400ULL, 0x8787870087878700ULL, 0x5c5c5c005c5c5c00ULL,
0724     0x8383830083838300ULL, 0x0202020002020200ULL, 0xcdcdcd00cdcdcd00ULL,
0725     0x4a4a4a004a4a4a00ULL, 0x9090900090909000ULL, 0x3333330033333300ULL,
0726     0x7373730073737300ULL, 0x6767670067676700ULL, 0xf6f6f600f6f6f600ULL,
0727     0xf3f3f300f3f3f300ULL, 0x9d9d9d009d9d9d00ULL, 0x7f7f7f007f7f7f00ULL,
0728     0xbfbfbf00bfbfbf00ULL, 0xe2e2e200e2e2e200ULL, 0x5252520052525200ULL,
0729     0x9b9b9b009b9b9b00ULL, 0xd8d8d800d8d8d800ULL, 0x2626260026262600ULL,
0730     0xc8c8c800c8c8c800ULL, 0x3737370037373700ULL, 0xc6c6c600c6c6c600ULL,
0731     0x3b3b3b003b3b3b00ULL, 0x8181810081818100ULL, 0x9696960096969600ULL,
0732     0x6f6f6f006f6f6f00ULL, 0x4b4b4b004b4b4b00ULL, 0x1313130013131300ULL,
0733     0xbebebe00bebebe00ULL, 0x6363630063636300ULL, 0x2e2e2e002e2e2e00ULL,
0734     0xe9e9e900e9e9e900ULL, 0x7979790079797900ULL, 0xa7a7a700a7a7a700ULL,
0735     0x8c8c8c008c8c8c00ULL, 0x9f9f9f009f9f9f00ULL, 0x6e6e6e006e6e6e00ULL,
0736     0xbcbcbc00bcbcbc00ULL, 0x8e8e8e008e8e8e00ULL, 0x2929290029292900ULL,
0737     0xf5f5f500f5f5f500ULL, 0xf9f9f900f9f9f900ULL, 0xb6b6b600b6b6b600ULL,
0738     0x2f2f2f002f2f2f00ULL, 0xfdfdfd00fdfdfd00ULL, 0xb4b4b400b4b4b400ULL,
0739     0x5959590059595900ULL, 0x7878780078787800ULL, 0x9898980098989800ULL,
0740     0x0606060006060600ULL, 0x6a6a6a006a6a6a00ULL, 0xe7e7e700e7e7e700ULL,
0741     0x4646460046464600ULL, 0x7171710071717100ULL, 0xbababa00bababa00ULL,
0742     0xd4d4d400d4d4d400ULL, 0x2525250025252500ULL, 0xababab00ababab00ULL,
0743     0x4242420042424200ULL, 0x8888880088888800ULL, 0xa2a2a200a2a2a200ULL,
0744     0x8d8d8d008d8d8d00ULL, 0xfafafa00fafafa00ULL, 0x7272720072727200ULL,
0745     0x0707070007070700ULL, 0xb9b9b900b9b9b900ULL, 0x5555550055555500ULL,
0746     0xf8f8f800f8f8f800ULL, 0xeeeeee00eeeeee00ULL, 0xacacac00acacac00ULL,
0747     0x0a0a0a000a0a0a00ULL, 0x3636360036363600ULL, 0x4949490049494900ULL,
0748     0x2a2a2a002a2a2a00ULL, 0x6868680068686800ULL, 0x3c3c3c003c3c3c00ULL,
0749     0x3838380038383800ULL, 0xf1f1f100f1f1f100ULL, 0xa4a4a400a4a4a400ULL,
0750     0x4040400040404000ULL, 0x2828280028282800ULL, 0xd3d3d300d3d3d300ULL,
0751     0x7b7b7b007b7b7b00ULL, 0xbbbbbb00bbbbbb00ULL, 0xc9c9c900c9c9c900ULL,
0752     0x4343430043434300ULL, 0xc1c1c100c1c1c100ULL, 0x1515150015151500ULL,
0753     0xe3e3e300e3e3e300ULL, 0xadadad00adadad00ULL, 0xf4f4f400f4f4f400ULL,
0754     0x7777770077777700ULL, 0xc7c7c700c7c7c700ULL, 0x8080800080808000ULL,
0755     0x9e9e9e009e9e9e00ULL,
0756 };
0757 
0758 /* key constants */
0759 #define CAMELLIA_SIGMA1L (0xA09E667FL)
0760 #define CAMELLIA_SIGMA1R (0x3BCC908BL)
0761 #define CAMELLIA_SIGMA2L (0xB67AE858L)
0762 #define CAMELLIA_SIGMA2R (0x4CAA73B2L)
0763 #define CAMELLIA_SIGMA3L (0xC6EF372FL)
0764 #define CAMELLIA_SIGMA3R (0xE94F82BEL)
0765 #define CAMELLIA_SIGMA4L (0x54FF53A5L)
0766 #define CAMELLIA_SIGMA4R (0xF1D36F1CL)
0767 #define CAMELLIA_SIGMA5L (0x10E527FAL)
0768 #define CAMELLIA_SIGMA5R (0xDE682D1DL)
0769 #define CAMELLIA_SIGMA6L (0xB05688C2L)
0770 #define CAMELLIA_SIGMA6R (0xB3E6C1FDL)
0771 
0772 /* macros */
0773 #define ROLDQ(l, r, bits) ({ \
0774     u64 t = l;                  \
0775     l = (l << bits) | (r >> (64 - bits));       \
0776     r = (r << bits) | (t >> (64 - bits));       \
0777 })
0778 
0779 #define CAMELLIA_F(x, kl, kr, y) ({ \
0780     u64 ii = x ^ (((u64)kl << 32) | kr);                \
0781     y = camellia_sp11101110[(uint8_t)ii];               \
0782     y ^= camellia_sp44044404[(uint8_t)(ii >> 8)];           \
0783     ii >>= 16;                          \
0784     y ^= camellia_sp30333033[(uint8_t)ii];              \
0785     y ^= camellia_sp02220222[(uint8_t)(ii >> 8)];           \
0786     ii >>= 16;                          \
0787     y ^= camellia_sp00444404[(uint8_t)ii];              \
0788     y ^= camellia_sp03303033[(uint8_t)(ii >> 8)];           \
0789     ii >>= 16;                          \
0790     y ^= camellia_sp22000222[(uint8_t)ii];              \
0791     y ^= camellia_sp10011110[(uint8_t)(ii >> 8)];           \
0792     y = ror64(y, 32);                       \
0793 })
0794 
0795 #define SET_SUBKEY_LR(INDEX, sRL) (subkey[(INDEX)] = ror64((sRL), 32))
0796 
0797 static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
0798 {
0799     u64 kw4, tt;
0800     u32 dw, tl, tr;
0801 
0802     /* absorb kw2 to other subkeys */
0803     /* round 2 */
0804     subRL[3] ^= subRL[1];
0805     /* round 4 */
0806     subRL[5] ^= subRL[1];
0807     /* round 6 */
0808     subRL[7] ^= subRL[1];
0809 
0810     subRL[1] ^= (subRL[1] & ~subRL[9]) << 32;
0811     /* modified for FLinv(kl2) */
0812     dw = (subRL[1] & subRL[9]) >> 32;
0813     subRL[1] ^= rol32(dw, 1);
0814 
0815     /* round 8 */
0816     subRL[11] ^= subRL[1];
0817     /* round 10 */
0818     subRL[13] ^= subRL[1];
0819     /* round 12 */
0820     subRL[15] ^= subRL[1];
0821 
0822     subRL[1] ^= (subRL[1] & ~subRL[17]) << 32;
0823     /* modified for FLinv(kl4) */
0824     dw = (subRL[1] & subRL[17]) >> 32;
0825     subRL[1] ^= rol32(dw, 1);
0826 
0827     /* round 14 */
0828     subRL[19] ^= subRL[1];
0829     /* round 16 */
0830     subRL[21] ^= subRL[1];
0831     /* round 18 */
0832     subRL[23] ^= subRL[1];
0833 
0834     if (max == 24) {
0835         /* kw3 */
0836         subRL[24] ^= subRL[1];
0837 
0838         /* absorb kw4 to other subkeys */
0839         kw4 = subRL[25];
0840     } else {
0841         subRL[1] ^= (subRL[1] & ~subRL[25]) << 32;
0842         /* modified for FLinv(kl6) */
0843         dw = (subRL[1] & subRL[25]) >> 32;
0844         subRL[1] ^= rol32(dw, 1);
0845 
0846         /* round 20 */
0847         subRL[27] ^= subRL[1];
0848         /* round 22 */
0849         subRL[29] ^= subRL[1];
0850         /* round 24 */
0851         subRL[31] ^= subRL[1];
0852         /* kw3 */
0853         subRL[32] ^= subRL[1];
0854 
0855         /* absorb kw4 to other subkeys */
0856         kw4 = subRL[33];
0857         /* round 23 */
0858         subRL[30] ^= kw4;
0859         /* round 21 */
0860         subRL[28] ^= kw4;
0861         /* round 19 */
0862         subRL[26] ^= kw4;
0863 
0864         kw4 ^= (kw4 & ~subRL[24]) << 32;
0865         /* modified for FL(kl5) */
0866         dw = (kw4 & subRL[24]) >> 32;
0867         kw4 ^= rol32(dw, 1);
0868     }
0869 
0870     /* round 17 */
0871     subRL[22] ^= kw4;
0872     /* round 15 */
0873     subRL[20] ^= kw4;
0874     /* round 13 */
0875     subRL[18] ^= kw4;
0876 
0877     kw4 ^= (kw4 & ~subRL[16]) << 32;
0878     /* modified for FL(kl3) */
0879     dw = (kw4 & subRL[16]) >> 32;
0880     kw4 ^= rol32(dw, 1);
0881 
0882     /* round 11 */
0883     subRL[14] ^= kw4;
0884     /* round 9 */
0885     subRL[12] ^= kw4;
0886     /* round 7 */
0887     subRL[10] ^= kw4;
0888 
0889     kw4 ^= (kw4 & ~subRL[8]) << 32;
0890     /* modified for FL(kl1) */
0891     dw = (kw4 & subRL[8]) >> 32;
0892     kw4 ^= rol32(dw, 1);
0893 
0894     /* round 5 */
0895     subRL[6] ^= kw4;
0896     /* round 3 */
0897     subRL[4] ^= kw4;
0898     /* round 1 */
0899     subRL[2] ^= kw4;
0900     /* kw1 */
0901     subRL[0] ^= kw4;
0902 
0903     /* key XOR is end of F-function */
0904     SET_SUBKEY_LR(0, subRL[0] ^ subRL[2]);          /* kw1 */
0905     SET_SUBKEY_LR(2, subRL[3]);             /* round 1 */
0906     SET_SUBKEY_LR(3, subRL[2] ^ subRL[4]);          /* round 2 */
0907     SET_SUBKEY_LR(4, subRL[3] ^ subRL[5]);          /* round 3 */
0908     SET_SUBKEY_LR(5, subRL[4] ^ subRL[6]);          /* round 4 */
0909     SET_SUBKEY_LR(6, subRL[5] ^ subRL[7]);          /* round 5 */
0910 
0911     tl = (subRL[10] >> 32) ^ (subRL[10] & ~subRL[8]);
0912     dw = tl & (subRL[8] >> 32);             /* FL(kl1) */
0913     tr = subRL[10] ^ rol32(dw, 1);
0914     tt = (tr | ((u64)tl << 32));
0915 
0916     SET_SUBKEY_LR(7, subRL[6] ^ tt);            /* round 6 */
0917     SET_SUBKEY_LR(8, subRL[8]);             /* FL(kl1) */
0918     SET_SUBKEY_LR(9, subRL[9]);             /* FLinv(kl2) */
0919 
0920     tl = (subRL[7] >> 32) ^ (subRL[7] & ~subRL[9]);
0921     dw = tl & (subRL[9] >> 32);             /* FLinv(kl2) */
0922     tr = subRL[7] ^ rol32(dw, 1);
0923     tt = (tr | ((u64)tl << 32));
0924 
0925     SET_SUBKEY_LR(10, subRL[11] ^ tt);          /* round 7 */
0926     SET_SUBKEY_LR(11, subRL[10] ^ subRL[12]);       /* round 8 */
0927     SET_SUBKEY_LR(12, subRL[11] ^ subRL[13]);       /* round 9 */
0928     SET_SUBKEY_LR(13, subRL[12] ^ subRL[14]);       /* round 10 */
0929     SET_SUBKEY_LR(14, subRL[13] ^ subRL[15]);       /* round 11 */
0930 
0931     tl = (subRL[18] >> 32) ^ (subRL[18] & ~subRL[16]);
0932     dw = tl & (subRL[16] >> 32);                /* FL(kl3) */
0933     tr = subRL[18] ^ rol32(dw, 1);
0934     tt = (tr | ((u64)tl << 32));
0935 
0936     SET_SUBKEY_LR(15, subRL[14] ^ tt);          /* round 12 */
0937     SET_SUBKEY_LR(16, subRL[16]);               /* FL(kl3) */
0938     SET_SUBKEY_LR(17, subRL[17]);               /* FLinv(kl4) */
0939 
0940     tl = (subRL[15] >> 32) ^ (subRL[15] & ~subRL[17]);
0941     dw = tl & (subRL[17] >> 32);                /* FLinv(kl4) */
0942     tr = subRL[15] ^ rol32(dw, 1);
0943     tt = (tr | ((u64)tl << 32));
0944 
0945     SET_SUBKEY_LR(18, subRL[19] ^ tt);          /* round 13 */
0946     SET_SUBKEY_LR(19, subRL[18] ^ subRL[20]);       /* round 14 */
0947     SET_SUBKEY_LR(20, subRL[19] ^ subRL[21]);       /* round 15 */
0948     SET_SUBKEY_LR(21, subRL[20] ^ subRL[22]);       /* round 16 */
0949     SET_SUBKEY_LR(22, subRL[21] ^ subRL[23]);       /* round 17 */
0950 
0951     if (max == 24) {
0952         SET_SUBKEY_LR(23, subRL[22]);           /* round 18 */
0953         SET_SUBKEY_LR(24, subRL[24] ^ subRL[23]);   /* kw3 */
0954     } else {
0955         tl = (subRL[26] >> 32) ^ (subRL[26] & ~subRL[24]);
0956         dw = tl & (subRL[24] >> 32);            /* FL(kl5) */
0957         tr = subRL[26] ^ rol32(dw, 1);
0958         tt = (tr | ((u64)tl << 32));
0959 
0960         SET_SUBKEY_LR(23, subRL[22] ^ tt);      /* round 18 */
0961         SET_SUBKEY_LR(24, subRL[24]);           /* FL(kl5) */
0962         SET_SUBKEY_LR(25, subRL[25]);           /* FLinv(kl6) */
0963 
0964         tl = (subRL[23] >> 32) ^ (subRL[23] & ~subRL[25]);
0965         dw = tl & (subRL[25] >> 32);            /* FLinv(kl6) */
0966         tr = subRL[23] ^ rol32(dw, 1);
0967         tt = (tr | ((u64)tl << 32));
0968 
0969         SET_SUBKEY_LR(26, subRL[27] ^ tt);      /* round 19 */
0970         SET_SUBKEY_LR(27, subRL[26] ^ subRL[28]);   /* round 20 */
0971         SET_SUBKEY_LR(28, subRL[27] ^ subRL[29]);   /* round 21 */
0972         SET_SUBKEY_LR(29, subRL[28] ^ subRL[30]);   /* round 22 */
0973         SET_SUBKEY_LR(30, subRL[29] ^ subRL[31]);   /* round 23 */
0974         SET_SUBKEY_LR(31, subRL[30]);           /* round 24 */
0975         SET_SUBKEY_LR(32, subRL[32] ^ subRL[31]);   /* kw3 */
0976     }
0977 }
0978 
0979 static void camellia_setup128(const unsigned char *key, u64 *subkey)
0980 {
0981     u64 kl, kr, ww;
0982     u64 subRL[26];
0983 
0984     /**
0985      *  k == kl || kr (|| is concatenation)
0986      */
0987     kl = get_unaligned_be64(key);
0988     kr = get_unaligned_be64(key + 8);
0989 
0990     /* generate KL dependent subkeys */
0991     /* kw1 */
0992     subRL[0] = kl;
0993     /* kw2 */
0994     subRL[1] = kr;
0995 
0996     /* rotation left shift 15bit */
0997     ROLDQ(kl, kr, 15);
0998 
0999     /* 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 
1085 static 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 
1218 static 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 
1230 int __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 }
1252 EXPORT_SYMBOL_GPL(__camellia_setkey);
1253 
1254 static 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 
1260 static 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 
1266 void 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 }
1276 EXPORT_SYMBOL_GPL(camellia_decrypt_cbc_2way);
1277 
1278 static 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 
1286 static 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 
1294 static 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 
1301 static 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 
1309 static 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 
1329 static 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 
1358 static 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 
1376 static int force;
1377 module_param(force, int, 0);
1378 MODULE_PARM_DESC(force, "Force module load, ignore CPU blacklist");
1379 
1380 static 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 
1404 static 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 
1411 module_init(camellia_init);
1412 module_exit(camellia_fini);
1413 
1414 MODULE_LICENSE("GPL");
1415 MODULE_DESCRIPTION("Camellia Cipher Algorithm, asm optimized");
1416 MODULE_ALIAS_CRYPTO("camellia");
1417 MODULE_ALIAS_CRYPTO("camellia-asm");