root/arch/x86/crypto/camellia_glue.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. camellia_encrypt
  2. camellia_decrypt
  3. camellia_setup_tail
  4. camellia_setup128
  5. camellia_setup256
  6. camellia_setup192
  7. __camellia_setkey
  8. camellia_setkey
  9. camellia_setkey_skcipher
  10. camellia_decrypt_cbc_2way
  11. camellia_crypt_ctr
  12. camellia_crypt_ctr_2way
  13. ecb_encrypt
  14. ecb_decrypt
  15. cbc_encrypt
  16. cbc_decrypt
  17. ctr_crypt
  18. is_blacklisted_cpu
  19. fini

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

/* [<][>][^][v][top][bottom][index][help] */