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