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