Linux Audio

Check our new training course

Loading...
v3.5.6
   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 * CBC & ECB parts based on code (crypto/cbc.c,ecb.c) by:
   9 *   Copyright (c) 2006 Herbert Xu <herbert@gondor.apana.org.au>
  10 * CTR part based on code (crypto/ctr.c) by:
  11 *   (C) Copyright IBM Corp. 2007 - Joy Latten <latten@us.ibm.com>
  12 *
  13 * This program is free software; you can redistribute it and/or modify
  14 * it under the terms of the GNU General Public License as published by
  15 * the Free Software Foundation; either version 2 of the License, or
  16 * (at your option) any later version.
  17 *
  18 * This program is distributed in the hope that it will be useful,
  19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21 * GNU General Public License for more details.
  22 *
  23 * You should have received a copy of the GNU General Public License
  24 * along with this program; if not, write to the Free Software
  25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
  26 * USA
  27 *
  28 */
  29
  30#include <asm/processor.h>
  31#include <asm/unaligned.h>
  32#include <linux/crypto.h>
  33#include <linux/init.h>
  34#include <linux/module.h>
  35#include <linux/types.h>
  36#include <crypto/algapi.h>
  37#include <crypto/b128ops.h>
  38#include <crypto/lrw.h>
  39#include <crypto/xts.h>
  40
  41#define CAMELLIA_MIN_KEY_SIZE	16
  42#define CAMELLIA_MAX_KEY_SIZE	32
  43#define CAMELLIA_BLOCK_SIZE	16
  44#define CAMELLIA_TABLE_BYTE_LEN	272
  45
  46struct camellia_ctx {
  47	u64 key_table[CAMELLIA_TABLE_BYTE_LEN / sizeof(u64)];
  48	u32 key_length;
  49};
  50
  51/* regular block cipher functions */
  52asmlinkage void __camellia_enc_blk(struct camellia_ctx *ctx, u8 *dst,
  53				   const u8 *src, bool xor);
 
  54asmlinkage void camellia_dec_blk(struct camellia_ctx *ctx, u8 *dst,
  55				 const u8 *src);
 
  56
  57/* 2-way parallel cipher functions */
  58asmlinkage void __camellia_enc_blk_2way(struct camellia_ctx *ctx, u8 *dst,
  59					const u8 *src, bool xor);
 
  60asmlinkage void camellia_dec_blk_2way(struct camellia_ctx *ctx, u8 *dst,
  61				      const u8 *src);
  62
  63static inline void camellia_enc_blk(struct camellia_ctx *ctx, u8 *dst,
  64				    const u8 *src)
  65{
  66	__camellia_enc_blk(ctx, dst, src, false);
  67}
  68
  69static inline void camellia_enc_blk_xor(struct camellia_ctx *ctx, u8 *dst,
  70					const u8 *src)
  71{
  72	__camellia_enc_blk(ctx, dst, src, true);
  73}
  74
  75static inline void camellia_enc_blk_2way(struct camellia_ctx *ctx, u8 *dst,
  76					 const u8 *src)
  77{
  78	__camellia_enc_blk_2way(ctx, dst, src, false);
  79}
  80
  81static inline void camellia_enc_blk_xor_2way(struct camellia_ctx *ctx, u8 *dst,
  82					     const u8 *src)
  83{
  84	__camellia_enc_blk_2way(ctx, dst, src, true);
  85}
  86
  87static void camellia_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
  88{
  89	camellia_enc_blk(crypto_tfm_ctx(tfm), dst, src);
  90}
  91
  92static void camellia_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
  93{
  94	camellia_dec_blk(crypto_tfm_ctx(tfm), dst, src);
  95}
  96
  97/* camellia sboxes */
  98const u64 camellia_sp10011110[256] = {
  99	0x7000007070707000, 0x8200008282828200, 0x2c00002c2c2c2c00,
 100	0xec0000ecececec00, 0xb30000b3b3b3b300, 0x2700002727272700,
 101	0xc00000c0c0c0c000, 0xe50000e5e5e5e500, 0xe40000e4e4e4e400,
 102	0x8500008585858500, 0x5700005757575700, 0x3500003535353500,
 103	0xea0000eaeaeaea00, 0x0c00000c0c0c0c00, 0xae0000aeaeaeae00,
 104	0x4100004141414100, 0x2300002323232300, 0xef0000efefefef00,
 105	0x6b00006b6b6b6b00, 0x9300009393939300, 0x4500004545454500,
 106	0x1900001919191900, 0xa50000a5a5a5a500, 0x2100002121212100,
 107	0xed0000edededed00, 0x0e00000e0e0e0e00, 0x4f00004f4f4f4f00,
 108	0x4e00004e4e4e4e00, 0x1d00001d1d1d1d00, 0x6500006565656500,
 109	0x9200009292929200, 0xbd0000bdbdbdbd00, 0x8600008686868600,
 110	0xb80000b8b8b8b800, 0xaf0000afafafaf00, 0x8f00008f8f8f8f00,
 111	0x7c00007c7c7c7c00, 0xeb0000ebebebeb00, 0x1f00001f1f1f1f00,
 112	0xce0000cececece00, 0x3e00003e3e3e3e00, 0x3000003030303000,
 113	0xdc0000dcdcdcdc00, 0x5f00005f5f5f5f00, 0x5e00005e5e5e5e00,
 114	0xc50000c5c5c5c500, 0x0b00000b0b0b0b00, 0x1a00001a1a1a1a00,
 115	0xa60000a6a6a6a600, 0xe10000e1e1e1e100, 0x3900003939393900,
 116	0xca0000cacacaca00, 0xd50000d5d5d5d500, 0x4700004747474700,
 117	0x5d00005d5d5d5d00, 0x3d00003d3d3d3d00, 0xd90000d9d9d9d900,
 118	0x0100000101010100, 0x5a00005a5a5a5a00, 0xd60000d6d6d6d600,
 119	0x5100005151515100, 0x5600005656565600, 0x6c00006c6c6c6c00,
 120	0x4d00004d4d4d4d00, 0x8b00008b8b8b8b00, 0x0d00000d0d0d0d00,
 121	0x9a00009a9a9a9a00, 0x6600006666666600, 0xfb0000fbfbfbfb00,
 122	0xcc0000cccccccc00, 0xb00000b0b0b0b000, 0x2d00002d2d2d2d00,
 123	0x7400007474747400, 0x1200001212121200, 0x2b00002b2b2b2b00,
 124	0x2000002020202000, 0xf00000f0f0f0f000, 0xb10000b1b1b1b100,
 125	0x8400008484848400, 0x9900009999999900, 0xdf0000dfdfdfdf00,
 126	0x4c00004c4c4c4c00, 0xcb0000cbcbcbcb00, 0xc20000c2c2c2c200,
 127	0x3400003434343400, 0x7e00007e7e7e7e00, 0x7600007676767600,
 128	0x0500000505050500, 0x6d00006d6d6d6d00, 0xb70000b7b7b7b700,
 129	0xa90000a9a9a9a900, 0x3100003131313100, 0xd10000d1d1d1d100,
 130	0x1700001717171700, 0x0400000404040400, 0xd70000d7d7d7d700,
 131	0x1400001414141400, 0x5800005858585800, 0x3a00003a3a3a3a00,
 132	0x6100006161616100, 0xde0000dededede00, 0x1b00001b1b1b1b00,
 133	0x1100001111111100, 0x1c00001c1c1c1c00, 0x3200003232323200,
 134	0x0f00000f0f0f0f00, 0x9c00009c9c9c9c00, 0x1600001616161600,
 135	0x5300005353535300, 0x1800001818181800, 0xf20000f2f2f2f200,
 136	0x2200002222222200, 0xfe0000fefefefe00, 0x4400004444444400,
 137	0xcf0000cfcfcfcf00, 0xb20000b2b2b2b200, 0xc30000c3c3c3c300,
 138	0xb50000b5b5b5b500, 0x7a00007a7a7a7a00, 0x9100009191919100,
 139	0x2400002424242400, 0x0800000808080800, 0xe80000e8e8e8e800,
 140	0xa80000a8a8a8a800, 0x6000006060606000, 0xfc0000fcfcfcfc00,
 141	0x6900006969696900, 0x5000005050505000, 0xaa0000aaaaaaaa00,
 142	0xd00000d0d0d0d000, 0xa00000a0a0a0a000, 0x7d00007d7d7d7d00,
 143	0xa10000a1a1a1a100, 0x8900008989898900, 0x6200006262626200,
 144	0x9700009797979700, 0x5400005454545400, 0x5b00005b5b5b5b00,
 145	0x1e00001e1e1e1e00, 0x9500009595959500, 0xe00000e0e0e0e000,
 146	0xff0000ffffffff00, 0x6400006464646400, 0xd20000d2d2d2d200,
 147	0x1000001010101000, 0xc40000c4c4c4c400, 0x0000000000000000,
 148	0x4800004848484800, 0xa30000a3a3a3a300, 0xf70000f7f7f7f700,
 149	0x7500007575757500, 0xdb0000dbdbdbdb00, 0x8a00008a8a8a8a00,
 150	0x0300000303030300, 0xe60000e6e6e6e600, 0xda0000dadadada00,
 151	0x0900000909090900, 0x3f00003f3f3f3f00, 0xdd0000dddddddd00,
 152	0x9400009494949400, 0x8700008787878700, 0x5c00005c5c5c5c00,
 153	0x8300008383838300, 0x0200000202020200, 0xcd0000cdcdcdcd00,
 154	0x4a00004a4a4a4a00, 0x9000009090909000, 0x3300003333333300,
 155	0x7300007373737300, 0x6700006767676700, 0xf60000f6f6f6f600,
 156	0xf30000f3f3f3f300, 0x9d00009d9d9d9d00, 0x7f00007f7f7f7f00,
 157	0xbf0000bfbfbfbf00, 0xe20000e2e2e2e200, 0x5200005252525200,
 158	0x9b00009b9b9b9b00, 0xd80000d8d8d8d800, 0x2600002626262600,
 159	0xc80000c8c8c8c800, 0x3700003737373700, 0xc60000c6c6c6c600,
 160	0x3b00003b3b3b3b00, 0x8100008181818100, 0x9600009696969600,
 161	0x6f00006f6f6f6f00, 0x4b00004b4b4b4b00, 0x1300001313131300,
 162	0xbe0000bebebebe00, 0x6300006363636300, 0x2e00002e2e2e2e00,
 163	0xe90000e9e9e9e900, 0x7900007979797900, 0xa70000a7a7a7a700,
 164	0x8c00008c8c8c8c00, 0x9f00009f9f9f9f00, 0x6e00006e6e6e6e00,
 165	0xbc0000bcbcbcbc00, 0x8e00008e8e8e8e00, 0x2900002929292900,
 166	0xf50000f5f5f5f500, 0xf90000f9f9f9f900, 0xb60000b6b6b6b600,
 167	0x2f00002f2f2f2f00, 0xfd0000fdfdfdfd00, 0xb40000b4b4b4b400,
 168	0x5900005959595900, 0x7800007878787800, 0x9800009898989800,
 169	0x0600000606060600, 0x6a00006a6a6a6a00, 0xe70000e7e7e7e700,
 170	0x4600004646464600, 0x7100007171717100, 0xba0000babababa00,
 171	0xd40000d4d4d4d400, 0x2500002525252500, 0xab0000abababab00,
 172	0x4200004242424200, 0x8800008888888800, 0xa20000a2a2a2a200,
 173	0x8d00008d8d8d8d00, 0xfa0000fafafafa00, 0x7200007272727200,
 174	0x0700000707070700, 0xb90000b9b9b9b900, 0x5500005555555500,
 175	0xf80000f8f8f8f800, 0xee0000eeeeeeee00, 0xac0000acacacac00,
 176	0x0a00000a0a0a0a00, 0x3600003636363600, 0x4900004949494900,
 177	0x2a00002a2a2a2a00, 0x6800006868686800, 0x3c00003c3c3c3c00,
 178	0x3800003838383800, 0xf10000f1f1f1f100, 0xa40000a4a4a4a400,
 179	0x4000004040404000, 0x2800002828282800, 0xd30000d3d3d3d300,
 180	0x7b00007b7b7b7b00, 0xbb0000bbbbbbbb00, 0xc90000c9c9c9c900,
 181	0x4300004343434300, 0xc10000c1c1c1c100, 0x1500001515151500,
 182	0xe30000e3e3e3e300, 0xad0000adadadad00, 0xf40000f4f4f4f400,
 183	0x7700007777777700, 0xc70000c7c7c7c700, 0x8000008080808000,
 184	0x9e00009e9e9e9e00,
 185};
 186
 187const u64 camellia_sp22000222[256] = {
 188	0xe0e0000000e0e0e0, 0x0505000000050505, 0x5858000000585858,
 189	0xd9d9000000d9d9d9, 0x6767000000676767, 0x4e4e0000004e4e4e,
 190	0x8181000000818181, 0xcbcb000000cbcbcb, 0xc9c9000000c9c9c9,
 191	0x0b0b0000000b0b0b, 0xaeae000000aeaeae, 0x6a6a0000006a6a6a,
 192	0xd5d5000000d5d5d5, 0x1818000000181818, 0x5d5d0000005d5d5d,
 193	0x8282000000828282, 0x4646000000464646, 0xdfdf000000dfdfdf,
 194	0xd6d6000000d6d6d6, 0x2727000000272727, 0x8a8a0000008a8a8a,
 195	0x3232000000323232, 0x4b4b0000004b4b4b, 0x4242000000424242,
 196	0xdbdb000000dbdbdb, 0x1c1c0000001c1c1c, 0x9e9e0000009e9e9e,
 197	0x9c9c0000009c9c9c, 0x3a3a0000003a3a3a, 0xcaca000000cacaca,
 198	0x2525000000252525, 0x7b7b0000007b7b7b, 0x0d0d0000000d0d0d,
 199	0x7171000000717171, 0x5f5f0000005f5f5f, 0x1f1f0000001f1f1f,
 200	0xf8f8000000f8f8f8, 0xd7d7000000d7d7d7, 0x3e3e0000003e3e3e,
 201	0x9d9d0000009d9d9d, 0x7c7c0000007c7c7c, 0x6060000000606060,
 202	0xb9b9000000b9b9b9, 0xbebe000000bebebe, 0xbcbc000000bcbcbc,
 203	0x8b8b0000008b8b8b, 0x1616000000161616, 0x3434000000343434,
 204	0x4d4d0000004d4d4d, 0xc3c3000000c3c3c3, 0x7272000000727272,
 205	0x9595000000959595, 0xabab000000ababab, 0x8e8e0000008e8e8e,
 206	0xbaba000000bababa, 0x7a7a0000007a7a7a, 0xb3b3000000b3b3b3,
 207	0x0202000000020202, 0xb4b4000000b4b4b4, 0xadad000000adadad,
 208	0xa2a2000000a2a2a2, 0xacac000000acacac, 0xd8d8000000d8d8d8,
 209	0x9a9a0000009a9a9a, 0x1717000000171717, 0x1a1a0000001a1a1a,
 210	0x3535000000353535, 0xcccc000000cccccc, 0xf7f7000000f7f7f7,
 211	0x9999000000999999, 0x6161000000616161, 0x5a5a0000005a5a5a,
 212	0xe8e8000000e8e8e8, 0x2424000000242424, 0x5656000000565656,
 213	0x4040000000404040, 0xe1e1000000e1e1e1, 0x6363000000636363,
 214	0x0909000000090909, 0x3333000000333333, 0xbfbf000000bfbfbf,
 215	0x9898000000989898, 0x9797000000979797, 0x8585000000858585,
 216	0x6868000000686868, 0xfcfc000000fcfcfc, 0xecec000000ececec,
 217	0x0a0a0000000a0a0a, 0xdada000000dadada, 0x6f6f0000006f6f6f,
 218	0x5353000000535353, 0x6262000000626262, 0xa3a3000000a3a3a3,
 219	0x2e2e0000002e2e2e, 0x0808000000080808, 0xafaf000000afafaf,
 220	0x2828000000282828, 0xb0b0000000b0b0b0, 0x7474000000747474,
 221	0xc2c2000000c2c2c2, 0xbdbd000000bdbdbd, 0x3636000000363636,
 222	0x2222000000222222, 0x3838000000383838, 0x6464000000646464,
 223	0x1e1e0000001e1e1e, 0x3939000000393939, 0x2c2c0000002c2c2c,
 224	0xa6a6000000a6a6a6, 0x3030000000303030, 0xe5e5000000e5e5e5,
 225	0x4444000000444444, 0xfdfd000000fdfdfd, 0x8888000000888888,
 226	0x9f9f0000009f9f9f, 0x6565000000656565, 0x8787000000878787,
 227	0x6b6b0000006b6b6b, 0xf4f4000000f4f4f4, 0x2323000000232323,
 228	0x4848000000484848, 0x1010000000101010, 0xd1d1000000d1d1d1,
 229	0x5151000000515151, 0xc0c0000000c0c0c0, 0xf9f9000000f9f9f9,
 230	0xd2d2000000d2d2d2, 0xa0a0000000a0a0a0, 0x5555000000555555,
 231	0xa1a1000000a1a1a1, 0x4141000000414141, 0xfafa000000fafafa,
 232	0x4343000000434343, 0x1313000000131313, 0xc4c4000000c4c4c4,
 233	0x2f2f0000002f2f2f, 0xa8a8000000a8a8a8, 0xb6b6000000b6b6b6,
 234	0x3c3c0000003c3c3c, 0x2b2b0000002b2b2b, 0xc1c1000000c1c1c1,
 235	0xffff000000ffffff, 0xc8c8000000c8c8c8, 0xa5a5000000a5a5a5,
 236	0x2020000000202020, 0x8989000000898989, 0x0000000000000000,
 237	0x9090000000909090, 0x4747000000474747, 0xefef000000efefef,
 238	0xeaea000000eaeaea, 0xb7b7000000b7b7b7, 0x1515000000151515,
 239	0x0606000000060606, 0xcdcd000000cdcdcd, 0xb5b5000000b5b5b5,
 240	0x1212000000121212, 0x7e7e0000007e7e7e, 0xbbbb000000bbbbbb,
 241	0x2929000000292929, 0x0f0f0000000f0f0f, 0xb8b8000000b8b8b8,
 242	0x0707000000070707, 0x0404000000040404, 0x9b9b0000009b9b9b,
 243	0x9494000000949494, 0x2121000000212121, 0x6666000000666666,
 244	0xe6e6000000e6e6e6, 0xcece000000cecece, 0xeded000000ededed,
 245	0xe7e7000000e7e7e7, 0x3b3b0000003b3b3b, 0xfefe000000fefefe,
 246	0x7f7f0000007f7f7f, 0xc5c5000000c5c5c5, 0xa4a4000000a4a4a4,
 247	0x3737000000373737, 0xb1b1000000b1b1b1, 0x4c4c0000004c4c4c,
 248	0x9191000000919191, 0x6e6e0000006e6e6e, 0x8d8d0000008d8d8d,
 249	0x7676000000767676, 0x0303000000030303, 0x2d2d0000002d2d2d,
 250	0xdede000000dedede, 0x9696000000969696, 0x2626000000262626,
 251	0x7d7d0000007d7d7d, 0xc6c6000000c6c6c6, 0x5c5c0000005c5c5c,
 252	0xd3d3000000d3d3d3, 0xf2f2000000f2f2f2, 0x4f4f0000004f4f4f,
 253	0x1919000000191919, 0x3f3f0000003f3f3f, 0xdcdc000000dcdcdc,
 254	0x7979000000797979, 0x1d1d0000001d1d1d, 0x5252000000525252,
 255	0xebeb000000ebebeb, 0xf3f3000000f3f3f3, 0x6d6d0000006d6d6d,
 256	0x5e5e0000005e5e5e, 0xfbfb000000fbfbfb, 0x6969000000696969,
 257	0xb2b2000000b2b2b2, 0xf0f0000000f0f0f0, 0x3131000000313131,
 258	0x0c0c0000000c0c0c, 0xd4d4000000d4d4d4, 0xcfcf000000cfcfcf,
 259	0x8c8c0000008c8c8c, 0xe2e2000000e2e2e2, 0x7575000000757575,
 260	0xa9a9000000a9a9a9, 0x4a4a0000004a4a4a, 0x5757000000575757,
 261	0x8484000000848484, 0x1111000000111111, 0x4545000000454545,
 262	0x1b1b0000001b1b1b, 0xf5f5000000f5f5f5, 0xe4e4000000e4e4e4,
 263	0x0e0e0000000e0e0e, 0x7373000000737373, 0xaaaa000000aaaaaa,
 264	0xf1f1000000f1f1f1, 0xdddd000000dddddd, 0x5959000000595959,
 265	0x1414000000141414, 0x6c6c0000006c6c6c, 0x9292000000929292,
 266	0x5454000000545454, 0xd0d0000000d0d0d0, 0x7878000000787878,
 267	0x7070000000707070, 0xe3e3000000e3e3e3, 0x4949000000494949,
 268	0x8080000000808080, 0x5050000000505050, 0xa7a7000000a7a7a7,
 269	0xf6f6000000f6f6f6, 0x7777000000777777, 0x9393000000939393,
 270	0x8686000000868686, 0x8383000000838383, 0x2a2a0000002a2a2a,
 271	0xc7c7000000c7c7c7, 0x5b5b0000005b5b5b, 0xe9e9000000e9e9e9,
 272	0xeeee000000eeeeee, 0x8f8f0000008f8f8f, 0x0101000000010101,
 273	0x3d3d0000003d3d3d,
 274};
 275
 276const u64 camellia_sp03303033[256] = {
 277	0x0038380038003838, 0x0041410041004141, 0x0016160016001616,
 278	0x0076760076007676, 0x00d9d900d900d9d9, 0x0093930093009393,
 279	0x0060600060006060, 0x00f2f200f200f2f2, 0x0072720072007272,
 280	0x00c2c200c200c2c2, 0x00abab00ab00abab, 0x009a9a009a009a9a,
 281	0x0075750075007575, 0x0006060006000606, 0x0057570057005757,
 282	0x00a0a000a000a0a0, 0x0091910091009191, 0x00f7f700f700f7f7,
 283	0x00b5b500b500b5b5, 0x00c9c900c900c9c9, 0x00a2a200a200a2a2,
 284	0x008c8c008c008c8c, 0x00d2d200d200d2d2, 0x0090900090009090,
 285	0x00f6f600f600f6f6, 0x0007070007000707, 0x00a7a700a700a7a7,
 286	0x0027270027002727, 0x008e8e008e008e8e, 0x00b2b200b200b2b2,
 287	0x0049490049004949, 0x00dede00de00dede, 0x0043430043004343,
 288	0x005c5c005c005c5c, 0x00d7d700d700d7d7, 0x00c7c700c700c7c7,
 289	0x003e3e003e003e3e, 0x00f5f500f500f5f5, 0x008f8f008f008f8f,
 290	0x0067670067006767, 0x001f1f001f001f1f, 0x0018180018001818,
 291	0x006e6e006e006e6e, 0x00afaf00af00afaf, 0x002f2f002f002f2f,
 292	0x00e2e200e200e2e2, 0x0085850085008585, 0x000d0d000d000d0d,
 293	0x0053530053005353, 0x00f0f000f000f0f0, 0x009c9c009c009c9c,
 294	0x0065650065006565, 0x00eaea00ea00eaea, 0x00a3a300a300a3a3,
 295	0x00aeae00ae00aeae, 0x009e9e009e009e9e, 0x00ecec00ec00ecec,
 296	0x0080800080008080, 0x002d2d002d002d2d, 0x006b6b006b006b6b,
 297	0x00a8a800a800a8a8, 0x002b2b002b002b2b, 0x0036360036003636,
 298	0x00a6a600a600a6a6, 0x00c5c500c500c5c5, 0x0086860086008686,
 299	0x004d4d004d004d4d, 0x0033330033003333, 0x00fdfd00fd00fdfd,
 300	0x0066660066006666, 0x0058580058005858, 0x0096960096009696,
 301	0x003a3a003a003a3a, 0x0009090009000909, 0x0095950095009595,
 302	0x0010100010001010, 0x0078780078007878, 0x00d8d800d800d8d8,
 303	0x0042420042004242, 0x00cccc00cc00cccc, 0x00efef00ef00efef,
 304	0x0026260026002626, 0x00e5e500e500e5e5, 0x0061610061006161,
 305	0x001a1a001a001a1a, 0x003f3f003f003f3f, 0x003b3b003b003b3b,
 306	0x0082820082008282, 0x00b6b600b600b6b6, 0x00dbdb00db00dbdb,
 307	0x00d4d400d400d4d4, 0x0098980098009898, 0x00e8e800e800e8e8,
 308	0x008b8b008b008b8b, 0x0002020002000202, 0x00ebeb00eb00ebeb,
 309	0x000a0a000a000a0a, 0x002c2c002c002c2c, 0x001d1d001d001d1d,
 310	0x00b0b000b000b0b0, 0x006f6f006f006f6f, 0x008d8d008d008d8d,
 311	0x0088880088008888, 0x000e0e000e000e0e, 0x0019190019001919,
 312	0x0087870087008787, 0x004e4e004e004e4e, 0x000b0b000b000b0b,
 313	0x00a9a900a900a9a9, 0x000c0c000c000c0c, 0x0079790079007979,
 314	0x0011110011001111, 0x007f7f007f007f7f, 0x0022220022002222,
 315	0x00e7e700e700e7e7, 0x0059590059005959, 0x00e1e100e100e1e1,
 316	0x00dada00da00dada, 0x003d3d003d003d3d, 0x00c8c800c800c8c8,
 317	0x0012120012001212, 0x0004040004000404, 0x0074740074007474,
 318	0x0054540054005454, 0x0030300030003030, 0x007e7e007e007e7e,
 319	0x00b4b400b400b4b4, 0x0028280028002828, 0x0055550055005555,
 320	0x0068680068006868, 0x0050500050005050, 0x00bebe00be00bebe,
 321	0x00d0d000d000d0d0, 0x00c4c400c400c4c4, 0x0031310031003131,
 322	0x00cbcb00cb00cbcb, 0x002a2a002a002a2a, 0x00adad00ad00adad,
 323	0x000f0f000f000f0f, 0x00caca00ca00caca, 0x0070700070007070,
 324	0x00ffff00ff00ffff, 0x0032320032003232, 0x0069690069006969,
 325	0x0008080008000808, 0x0062620062006262, 0x0000000000000000,
 326	0x0024240024002424, 0x00d1d100d100d1d1, 0x00fbfb00fb00fbfb,
 327	0x00baba00ba00baba, 0x00eded00ed00eded, 0x0045450045004545,
 328	0x0081810081008181, 0x0073730073007373, 0x006d6d006d006d6d,
 329	0x0084840084008484, 0x009f9f009f009f9f, 0x00eeee00ee00eeee,
 330	0x004a4a004a004a4a, 0x00c3c300c300c3c3, 0x002e2e002e002e2e,
 331	0x00c1c100c100c1c1, 0x0001010001000101, 0x00e6e600e600e6e6,
 332	0x0025250025002525, 0x0048480048004848, 0x0099990099009999,
 333	0x00b9b900b900b9b9, 0x00b3b300b300b3b3, 0x007b7b007b007b7b,
 334	0x00f9f900f900f9f9, 0x00cece00ce00cece, 0x00bfbf00bf00bfbf,
 335	0x00dfdf00df00dfdf, 0x0071710071007171, 0x0029290029002929,
 336	0x00cdcd00cd00cdcd, 0x006c6c006c006c6c, 0x0013130013001313,
 337	0x0064640064006464, 0x009b9b009b009b9b, 0x0063630063006363,
 338	0x009d9d009d009d9d, 0x00c0c000c000c0c0, 0x004b4b004b004b4b,
 339	0x00b7b700b700b7b7, 0x00a5a500a500a5a5, 0x0089890089008989,
 340	0x005f5f005f005f5f, 0x00b1b100b100b1b1, 0x0017170017001717,
 341	0x00f4f400f400f4f4, 0x00bcbc00bc00bcbc, 0x00d3d300d300d3d3,
 342	0x0046460046004646, 0x00cfcf00cf00cfcf, 0x0037370037003737,
 343	0x005e5e005e005e5e, 0x0047470047004747, 0x0094940094009494,
 344	0x00fafa00fa00fafa, 0x00fcfc00fc00fcfc, 0x005b5b005b005b5b,
 345	0x0097970097009797, 0x00fefe00fe00fefe, 0x005a5a005a005a5a,
 346	0x00acac00ac00acac, 0x003c3c003c003c3c, 0x004c4c004c004c4c,
 347	0x0003030003000303, 0x0035350035003535, 0x00f3f300f300f3f3,
 348	0x0023230023002323, 0x00b8b800b800b8b8, 0x005d5d005d005d5d,
 349	0x006a6a006a006a6a, 0x0092920092009292, 0x00d5d500d500d5d5,
 350	0x0021210021002121, 0x0044440044004444, 0x0051510051005151,
 351	0x00c6c600c600c6c6, 0x007d7d007d007d7d, 0x0039390039003939,
 352	0x0083830083008383, 0x00dcdc00dc00dcdc, 0x00aaaa00aa00aaaa,
 353	0x007c7c007c007c7c, 0x0077770077007777, 0x0056560056005656,
 354	0x0005050005000505, 0x001b1b001b001b1b, 0x00a4a400a400a4a4,
 355	0x0015150015001515, 0x0034340034003434, 0x001e1e001e001e1e,
 356	0x001c1c001c001c1c, 0x00f8f800f800f8f8, 0x0052520052005252,
 357	0x0020200020002020, 0x0014140014001414, 0x00e9e900e900e9e9,
 358	0x00bdbd00bd00bdbd, 0x00dddd00dd00dddd, 0x00e4e400e400e4e4,
 359	0x00a1a100a100a1a1, 0x00e0e000e000e0e0, 0x008a8a008a008a8a,
 360	0x00f1f100f100f1f1, 0x00d6d600d600d6d6, 0x007a7a007a007a7a,
 361	0x00bbbb00bb00bbbb, 0x00e3e300e300e3e3, 0x0040400040004040,
 362	0x004f4f004f004f4f,
 363};
 364
 365const u64 camellia_sp00444404[256] = {
 366	0x0000707070700070, 0x00002c2c2c2c002c, 0x0000b3b3b3b300b3,
 367	0x0000c0c0c0c000c0, 0x0000e4e4e4e400e4, 0x0000575757570057,
 368	0x0000eaeaeaea00ea, 0x0000aeaeaeae00ae, 0x0000232323230023,
 369	0x00006b6b6b6b006b, 0x0000454545450045, 0x0000a5a5a5a500a5,
 370	0x0000edededed00ed, 0x00004f4f4f4f004f, 0x00001d1d1d1d001d,
 371	0x0000929292920092, 0x0000868686860086, 0x0000afafafaf00af,
 372	0x00007c7c7c7c007c, 0x00001f1f1f1f001f, 0x00003e3e3e3e003e,
 373	0x0000dcdcdcdc00dc, 0x00005e5e5e5e005e, 0x00000b0b0b0b000b,
 374	0x0000a6a6a6a600a6, 0x0000393939390039, 0x0000d5d5d5d500d5,
 375	0x00005d5d5d5d005d, 0x0000d9d9d9d900d9, 0x00005a5a5a5a005a,
 376	0x0000515151510051, 0x00006c6c6c6c006c, 0x00008b8b8b8b008b,
 377	0x00009a9a9a9a009a, 0x0000fbfbfbfb00fb, 0x0000b0b0b0b000b0,
 378	0x0000747474740074, 0x00002b2b2b2b002b, 0x0000f0f0f0f000f0,
 379	0x0000848484840084, 0x0000dfdfdfdf00df, 0x0000cbcbcbcb00cb,
 380	0x0000343434340034, 0x0000767676760076, 0x00006d6d6d6d006d,
 381	0x0000a9a9a9a900a9, 0x0000d1d1d1d100d1, 0x0000040404040004,
 382	0x0000141414140014, 0x00003a3a3a3a003a, 0x0000dededede00de,
 383	0x0000111111110011, 0x0000323232320032, 0x00009c9c9c9c009c,
 384	0x0000535353530053, 0x0000f2f2f2f200f2, 0x0000fefefefe00fe,
 385	0x0000cfcfcfcf00cf, 0x0000c3c3c3c300c3, 0x00007a7a7a7a007a,
 386	0x0000242424240024, 0x0000e8e8e8e800e8, 0x0000606060600060,
 387	0x0000696969690069, 0x0000aaaaaaaa00aa, 0x0000a0a0a0a000a0,
 388	0x0000a1a1a1a100a1, 0x0000626262620062, 0x0000545454540054,
 389	0x00001e1e1e1e001e, 0x0000e0e0e0e000e0, 0x0000646464640064,
 390	0x0000101010100010, 0x0000000000000000, 0x0000a3a3a3a300a3,
 391	0x0000757575750075, 0x00008a8a8a8a008a, 0x0000e6e6e6e600e6,
 392	0x0000090909090009, 0x0000dddddddd00dd, 0x0000878787870087,
 393	0x0000838383830083, 0x0000cdcdcdcd00cd, 0x0000909090900090,
 394	0x0000737373730073, 0x0000f6f6f6f600f6, 0x00009d9d9d9d009d,
 395	0x0000bfbfbfbf00bf, 0x0000525252520052, 0x0000d8d8d8d800d8,
 396	0x0000c8c8c8c800c8, 0x0000c6c6c6c600c6, 0x0000818181810081,
 397	0x00006f6f6f6f006f, 0x0000131313130013, 0x0000636363630063,
 398	0x0000e9e9e9e900e9, 0x0000a7a7a7a700a7, 0x00009f9f9f9f009f,
 399	0x0000bcbcbcbc00bc, 0x0000292929290029, 0x0000f9f9f9f900f9,
 400	0x00002f2f2f2f002f, 0x0000b4b4b4b400b4, 0x0000787878780078,
 401	0x0000060606060006, 0x0000e7e7e7e700e7, 0x0000717171710071,
 402	0x0000d4d4d4d400d4, 0x0000abababab00ab, 0x0000888888880088,
 403	0x00008d8d8d8d008d, 0x0000727272720072, 0x0000b9b9b9b900b9,
 404	0x0000f8f8f8f800f8, 0x0000acacacac00ac, 0x0000363636360036,
 405	0x00002a2a2a2a002a, 0x00003c3c3c3c003c, 0x0000f1f1f1f100f1,
 406	0x0000404040400040, 0x0000d3d3d3d300d3, 0x0000bbbbbbbb00bb,
 407	0x0000434343430043, 0x0000151515150015, 0x0000adadadad00ad,
 408	0x0000777777770077, 0x0000808080800080, 0x0000828282820082,
 409	0x0000ecececec00ec, 0x0000272727270027, 0x0000e5e5e5e500e5,
 410	0x0000858585850085, 0x0000353535350035, 0x00000c0c0c0c000c,
 411	0x0000414141410041, 0x0000efefefef00ef, 0x0000939393930093,
 412	0x0000191919190019, 0x0000212121210021, 0x00000e0e0e0e000e,
 413	0x00004e4e4e4e004e, 0x0000656565650065, 0x0000bdbdbdbd00bd,
 414	0x0000b8b8b8b800b8, 0x00008f8f8f8f008f, 0x0000ebebebeb00eb,
 415	0x0000cececece00ce, 0x0000303030300030, 0x00005f5f5f5f005f,
 416	0x0000c5c5c5c500c5, 0x00001a1a1a1a001a, 0x0000e1e1e1e100e1,
 417	0x0000cacacaca00ca, 0x0000474747470047, 0x00003d3d3d3d003d,
 418	0x0000010101010001, 0x0000d6d6d6d600d6, 0x0000565656560056,
 419	0x00004d4d4d4d004d, 0x00000d0d0d0d000d, 0x0000666666660066,
 420	0x0000cccccccc00cc, 0x00002d2d2d2d002d, 0x0000121212120012,
 421	0x0000202020200020, 0x0000b1b1b1b100b1, 0x0000999999990099,
 422	0x00004c4c4c4c004c, 0x0000c2c2c2c200c2, 0x00007e7e7e7e007e,
 423	0x0000050505050005, 0x0000b7b7b7b700b7, 0x0000313131310031,
 424	0x0000171717170017, 0x0000d7d7d7d700d7, 0x0000585858580058,
 425	0x0000616161610061, 0x00001b1b1b1b001b, 0x00001c1c1c1c001c,
 426	0x00000f0f0f0f000f, 0x0000161616160016, 0x0000181818180018,
 427	0x0000222222220022, 0x0000444444440044, 0x0000b2b2b2b200b2,
 428	0x0000b5b5b5b500b5, 0x0000919191910091, 0x0000080808080008,
 429	0x0000a8a8a8a800a8, 0x0000fcfcfcfc00fc, 0x0000505050500050,
 430	0x0000d0d0d0d000d0, 0x00007d7d7d7d007d, 0x0000898989890089,
 431	0x0000979797970097, 0x00005b5b5b5b005b, 0x0000959595950095,
 432	0x0000ffffffff00ff, 0x0000d2d2d2d200d2, 0x0000c4c4c4c400c4,
 433	0x0000484848480048, 0x0000f7f7f7f700f7, 0x0000dbdbdbdb00db,
 434	0x0000030303030003, 0x0000dadadada00da, 0x00003f3f3f3f003f,
 435	0x0000949494940094, 0x00005c5c5c5c005c, 0x0000020202020002,
 436	0x00004a4a4a4a004a, 0x0000333333330033, 0x0000676767670067,
 437	0x0000f3f3f3f300f3, 0x00007f7f7f7f007f, 0x0000e2e2e2e200e2,
 438	0x00009b9b9b9b009b, 0x0000262626260026, 0x0000373737370037,
 439	0x00003b3b3b3b003b, 0x0000969696960096, 0x00004b4b4b4b004b,
 440	0x0000bebebebe00be, 0x00002e2e2e2e002e, 0x0000797979790079,
 441	0x00008c8c8c8c008c, 0x00006e6e6e6e006e, 0x00008e8e8e8e008e,
 442	0x0000f5f5f5f500f5, 0x0000b6b6b6b600b6, 0x0000fdfdfdfd00fd,
 443	0x0000595959590059, 0x0000989898980098, 0x00006a6a6a6a006a,
 444	0x0000464646460046, 0x0000babababa00ba, 0x0000252525250025,
 445	0x0000424242420042, 0x0000a2a2a2a200a2, 0x0000fafafafa00fa,
 446	0x0000070707070007, 0x0000555555550055, 0x0000eeeeeeee00ee,
 447	0x00000a0a0a0a000a, 0x0000494949490049, 0x0000686868680068,
 448	0x0000383838380038, 0x0000a4a4a4a400a4, 0x0000282828280028,
 449	0x00007b7b7b7b007b, 0x0000c9c9c9c900c9, 0x0000c1c1c1c100c1,
 450	0x0000e3e3e3e300e3, 0x0000f4f4f4f400f4, 0x0000c7c7c7c700c7,
 451	0x00009e9e9e9e009e,
 452};
 453
 454const u64 camellia_sp02220222[256] = {
 455	0x00e0e0e000e0e0e0, 0x0005050500050505, 0x0058585800585858,
 456	0x00d9d9d900d9d9d9, 0x0067676700676767, 0x004e4e4e004e4e4e,
 457	0x0081818100818181, 0x00cbcbcb00cbcbcb, 0x00c9c9c900c9c9c9,
 458	0x000b0b0b000b0b0b, 0x00aeaeae00aeaeae, 0x006a6a6a006a6a6a,
 459	0x00d5d5d500d5d5d5, 0x0018181800181818, 0x005d5d5d005d5d5d,
 460	0x0082828200828282, 0x0046464600464646, 0x00dfdfdf00dfdfdf,
 461	0x00d6d6d600d6d6d6, 0x0027272700272727, 0x008a8a8a008a8a8a,
 462	0x0032323200323232, 0x004b4b4b004b4b4b, 0x0042424200424242,
 463	0x00dbdbdb00dbdbdb, 0x001c1c1c001c1c1c, 0x009e9e9e009e9e9e,
 464	0x009c9c9c009c9c9c, 0x003a3a3a003a3a3a, 0x00cacaca00cacaca,
 465	0x0025252500252525, 0x007b7b7b007b7b7b, 0x000d0d0d000d0d0d,
 466	0x0071717100717171, 0x005f5f5f005f5f5f, 0x001f1f1f001f1f1f,
 467	0x00f8f8f800f8f8f8, 0x00d7d7d700d7d7d7, 0x003e3e3e003e3e3e,
 468	0x009d9d9d009d9d9d, 0x007c7c7c007c7c7c, 0x0060606000606060,
 469	0x00b9b9b900b9b9b9, 0x00bebebe00bebebe, 0x00bcbcbc00bcbcbc,
 470	0x008b8b8b008b8b8b, 0x0016161600161616, 0x0034343400343434,
 471	0x004d4d4d004d4d4d, 0x00c3c3c300c3c3c3, 0x0072727200727272,
 472	0x0095959500959595, 0x00ababab00ababab, 0x008e8e8e008e8e8e,
 473	0x00bababa00bababa, 0x007a7a7a007a7a7a, 0x00b3b3b300b3b3b3,
 474	0x0002020200020202, 0x00b4b4b400b4b4b4, 0x00adadad00adadad,
 475	0x00a2a2a200a2a2a2, 0x00acacac00acacac, 0x00d8d8d800d8d8d8,
 476	0x009a9a9a009a9a9a, 0x0017171700171717, 0x001a1a1a001a1a1a,
 477	0x0035353500353535, 0x00cccccc00cccccc, 0x00f7f7f700f7f7f7,
 478	0x0099999900999999, 0x0061616100616161, 0x005a5a5a005a5a5a,
 479	0x00e8e8e800e8e8e8, 0x0024242400242424, 0x0056565600565656,
 480	0x0040404000404040, 0x00e1e1e100e1e1e1, 0x0063636300636363,
 481	0x0009090900090909, 0x0033333300333333, 0x00bfbfbf00bfbfbf,
 482	0x0098989800989898, 0x0097979700979797, 0x0085858500858585,
 483	0x0068686800686868, 0x00fcfcfc00fcfcfc, 0x00ececec00ececec,
 484	0x000a0a0a000a0a0a, 0x00dadada00dadada, 0x006f6f6f006f6f6f,
 485	0x0053535300535353, 0x0062626200626262, 0x00a3a3a300a3a3a3,
 486	0x002e2e2e002e2e2e, 0x0008080800080808, 0x00afafaf00afafaf,
 487	0x0028282800282828, 0x00b0b0b000b0b0b0, 0x0074747400747474,
 488	0x00c2c2c200c2c2c2, 0x00bdbdbd00bdbdbd, 0x0036363600363636,
 489	0x0022222200222222, 0x0038383800383838, 0x0064646400646464,
 490	0x001e1e1e001e1e1e, 0x0039393900393939, 0x002c2c2c002c2c2c,
 491	0x00a6a6a600a6a6a6, 0x0030303000303030, 0x00e5e5e500e5e5e5,
 492	0x0044444400444444, 0x00fdfdfd00fdfdfd, 0x0088888800888888,
 493	0x009f9f9f009f9f9f, 0x0065656500656565, 0x0087878700878787,
 494	0x006b6b6b006b6b6b, 0x00f4f4f400f4f4f4, 0x0023232300232323,
 495	0x0048484800484848, 0x0010101000101010, 0x00d1d1d100d1d1d1,
 496	0x0051515100515151, 0x00c0c0c000c0c0c0, 0x00f9f9f900f9f9f9,
 497	0x00d2d2d200d2d2d2, 0x00a0a0a000a0a0a0, 0x0055555500555555,
 498	0x00a1a1a100a1a1a1, 0x0041414100414141, 0x00fafafa00fafafa,
 499	0x0043434300434343, 0x0013131300131313, 0x00c4c4c400c4c4c4,
 500	0x002f2f2f002f2f2f, 0x00a8a8a800a8a8a8, 0x00b6b6b600b6b6b6,
 501	0x003c3c3c003c3c3c, 0x002b2b2b002b2b2b, 0x00c1c1c100c1c1c1,
 502	0x00ffffff00ffffff, 0x00c8c8c800c8c8c8, 0x00a5a5a500a5a5a5,
 503	0x0020202000202020, 0x0089898900898989, 0x0000000000000000,
 504	0x0090909000909090, 0x0047474700474747, 0x00efefef00efefef,
 505	0x00eaeaea00eaeaea, 0x00b7b7b700b7b7b7, 0x0015151500151515,
 506	0x0006060600060606, 0x00cdcdcd00cdcdcd, 0x00b5b5b500b5b5b5,
 507	0x0012121200121212, 0x007e7e7e007e7e7e, 0x00bbbbbb00bbbbbb,
 508	0x0029292900292929, 0x000f0f0f000f0f0f, 0x00b8b8b800b8b8b8,
 509	0x0007070700070707, 0x0004040400040404, 0x009b9b9b009b9b9b,
 510	0x0094949400949494, 0x0021212100212121, 0x0066666600666666,
 511	0x00e6e6e600e6e6e6, 0x00cecece00cecece, 0x00ededed00ededed,
 512	0x00e7e7e700e7e7e7, 0x003b3b3b003b3b3b, 0x00fefefe00fefefe,
 513	0x007f7f7f007f7f7f, 0x00c5c5c500c5c5c5, 0x00a4a4a400a4a4a4,
 514	0x0037373700373737, 0x00b1b1b100b1b1b1, 0x004c4c4c004c4c4c,
 515	0x0091919100919191, 0x006e6e6e006e6e6e, 0x008d8d8d008d8d8d,
 516	0x0076767600767676, 0x0003030300030303, 0x002d2d2d002d2d2d,
 517	0x00dedede00dedede, 0x0096969600969696, 0x0026262600262626,
 518	0x007d7d7d007d7d7d, 0x00c6c6c600c6c6c6, 0x005c5c5c005c5c5c,
 519	0x00d3d3d300d3d3d3, 0x00f2f2f200f2f2f2, 0x004f4f4f004f4f4f,
 520	0x0019191900191919, 0x003f3f3f003f3f3f, 0x00dcdcdc00dcdcdc,
 521	0x0079797900797979, 0x001d1d1d001d1d1d, 0x0052525200525252,
 522	0x00ebebeb00ebebeb, 0x00f3f3f300f3f3f3, 0x006d6d6d006d6d6d,
 523	0x005e5e5e005e5e5e, 0x00fbfbfb00fbfbfb, 0x0069696900696969,
 524	0x00b2b2b200b2b2b2, 0x00f0f0f000f0f0f0, 0x0031313100313131,
 525	0x000c0c0c000c0c0c, 0x00d4d4d400d4d4d4, 0x00cfcfcf00cfcfcf,
 526	0x008c8c8c008c8c8c, 0x00e2e2e200e2e2e2, 0x0075757500757575,
 527	0x00a9a9a900a9a9a9, 0x004a4a4a004a4a4a, 0x0057575700575757,
 528	0x0084848400848484, 0x0011111100111111, 0x0045454500454545,
 529	0x001b1b1b001b1b1b, 0x00f5f5f500f5f5f5, 0x00e4e4e400e4e4e4,
 530	0x000e0e0e000e0e0e, 0x0073737300737373, 0x00aaaaaa00aaaaaa,
 531	0x00f1f1f100f1f1f1, 0x00dddddd00dddddd, 0x0059595900595959,
 532	0x0014141400141414, 0x006c6c6c006c6c6c, 0x0092929200929292,
 533	0x0054545400545454, 0x00d0d0d000d0d0d0, 0x0078787800787878,
 534	0x0070707000707070, 0x00e3e3e300e3e3e3, 0x0049494900494949,
 535	0x0080808000808080, 0x0050505000505050, 0x00a7a7a700a7a7a7,
 536	0x00f6f6f600f6f6f6, 0x0077777700777777, 0x0093939300939393,
 537	0x0086868600868686, 0x0083838300838383, 0x002a2a2a002a2a2a,
 538	0x00c7c7c700c7c7c7, 0x005b5b5b005b5b5b, 0x00e9e9e900e9e9e9,
 539	0x00eeeeee00eeeeee, 0x008f8f8f008f8f8f, 0x0001010100010101,
 540	0x003d3d3d003d3d3d,
 541};
 542
 543const u64 camellia_sp30333033[256] = {
 544	0x3800383838003838, 0x4100414141004141, 0x1600161616001616,
 545	0x7600767676007676, 0xd900d9d9d900d9d9, 0x9300939393009393,
 546	0x6000606060006060, 0xf200f2f2f200f2f2, 0x7200727272007272,
 547	0xc200c2c2c200c2c2, 0xab00ababab00abab, 0x9a009a9a9a009a9a,
 548	0x7500757575007575, 0x0600060606000606, 0x5700575757005757,
 549	0xa000a0a0a000a0a0, 0x9100919191009191, 0xf700f7f7f700f7f7,
 550	0xb500b5b5b500b5b5, 0xc900c9c9c900c9c9, 0xa200a2a2a200a2a2,
 551	0x8c008c8c8c008c8c, 0xd200d2d2d200d2d2, 0x9000909090009090,
 552	0xf600f6f6f600f6f6, 0x0700070707000707, 0xa700a7a7a700a7a7,
 553	0x2700272727002727, 0x8e008e8e8e008e8e, 0xb200b2b2b200b2b2,
 554	0x4900494949004949, 0xde00dedede00dede, 0x4300434343004343,
 555	0x5c005c5c5c005c5c, 0xd700d7d7d700d7d7, 0xc700c7c7c700c7c7,
 556	0x3e003e3e3e003e3e, 0xf500f5f5f500f5f5, 0x8f008f8f8f008f8f,
 557	0x6700676767006767, 0x1f001f1f1f001f1f, 0x1800181818001818,
 558	0x6e006e6e6e006e6e, 0xaf00afafaf00afaf, 0x2f002f2f2f002f2f,
 559	0xe200e2e2e200e2e2, 0x8500858585008585, 0x0d000d0d0d000d0d,
 560	0x5300535353005353, 0xf000f0f0f000f0f0, 0x9c009c9c9c009c9c,
 561	0x6500656565006565, 0xea00eaeaea00eaea, 0xa300a3a3a300a3a3,
 562	0xae00aeaeae00aeae, 0x9e009e9e9e009e9e, 0xec00ececec00ecec,
 563	0x8000808080008080, 0x2d002d2d2d002d2d, 0x6b006b6b6b006b6b,
 564	0xa800a8a8a800a8a8, 0x2b002b2b2b002b2b, 0x3600363636003636,
 565	0xa600a6a6a600a6a6, 0xc500c5c5c500c5c5, 0x8600868686008686,
 566	0x4d004d4d4d004d4d, 0x3300333333003333, 0xfd00fdfdfd00fdfd,
 567	0x6600666666006666, 0x5800585858005858, 0x9600969696009696,
 568	0x3a003a3a3a003a3a, 0x0900090909000909, 0x9500959595009595,
 569	0x1000101010001010, 0x7800787878007878, 0xd800d8d8d800d8d8,
 570	0x4200424242004242, 0xcc00cccccc00cccc, 0xef00efefef00efef,
 571	0x2600262626002626, 0xe500e5e5e500e5e5, 0x6100616161006161,
 572	0x1a001a1a1a001a1a, 0x3f003f3f3f003f3f, 0x3b003b3b3b003b3b,
 573	0x8200828282008282, 0xb600b6b6b600b6b6, 0xdb00dbdbdb00dbdb,
 574	0xd400d4d4d400d4d4, 0x9800989898009898, 0xe800e8e8e800e8e8,
 575	0x8b008b8b8b008b8b, 0x0200020202000202, 0xeb00ebebeb00ebeb,
 576	0x0a000a0a0a000a0a, 0x2c002c2c2c002c2c, 0x1d001d1d1d001d1d,
 577	0xb000b0b0b000b0b0, 0x6f006f6f6f006f6f, 0x8d008d8d8d008d8d,
 578	0x8800888888008888, 0x0e000e0e0e000e0e, 0x1900191919001919,
 579	0x8700878787008787, 0x4e004e4e4e004e4e, 0x0b000b0b0b000b0b,
 580	0xa900a9a9a900a9a9, 0x0c000c0c0c000c0c, 0x7900797979007979,
 581	0x1100111111001111, 0x7f007f7f7f007f7f, 0x2200222222002222,
 582	0xe700e7e7e700e7e7, 0x5900595959005959, 0xe100e1e1e100e1e1,
 583	0xda00dadada00dada, 0x3d003d3d3d003d3d, 0xc800c8c8c800c8c8,
 584	0x1200121212001212, 0x0400040404000404, 0x7400747474007474,
 585	0x5400545454005454, 0x3000303030003030, 0x7e007e7e7e007e7e,
 586	0xb400b4b4b400b4b4, 0x2800282828002828, 0x5500555555005555,
 587	0x6800686868006868, 0x5000505050005050, 0xbe00bebebe00bebe,
 588	0xd000d0d0d000d0d0, 0xc400c4c4c400c4c4, 0x3100313131003131,
 589	0xcb00cbcbcb00cbcb, 0x2a002a2a2a002a2a, 0xad00adadad00adad,
 590	0x0f000f0f0f000f0f, 0xca00cacaca00caca, 0x7000707070007070,
 591	0xff00ffffff00ffff, 0x3200323232003232, 0x6900696969006969,
 592	0x0800080808000808, 0x6200626262006262, 0x0000000000000000,
 593	0x2400242424002424, 0xd100d1d1d100d1d1, 0xfb00fbfbfb00fbfb,
 594	0xba00bababa00baba, 0xed00ededed00eded, 0x4500454545004545,
 595	0x8100818181008181, 0x7300737373007373, 0x6d006d6d6d006d6d,
 596	0x8400848484008484, 0x9f009f9f9f009f9f, 0xee00eeeeee00eeee,
 597	0x4a004a4a4a004a4a, 0xc300c3c3c300c3c3, 0x2e002e2e2e002e2e,
 598	0xc100c1c1c100c1c1, 0x0100010101000101, 0xe600e6e6e600e6e6,
 599	0x2500252525002525, 0x4800484848004848, 0x9900999999009999,
 600	0xb900b9b9b900b9b9, 0xb300b3b3b300b3b3, 0x7b007b7b7b007b7b,
 601	0xf900f9f9f900f9f9, 0xce00cecece00cece, 0xbf00bfbfbf00bfbf,
 602	0xdf00dfdfdf00dfdf, 0x7100717171007171, 0x2900292929002929,
 603	0xcd00cdcdcd00cdcd, 0x6c006c6c6c006c6c, 0x1300131313001313,
 604	0x6400646464006464, 0x9b009b9b9b009b9b, 0x6300636363006363,
 605	0x9d009d9d9d009d9d, 0xc000c0c0c000c0c0, 0x4b004b4b4b004b4b,
 606	0xb700b7b7b700b7b7, 0xa500a5a5a500a5a5, 0x8900898989008989,
 607	0x5f005f5f5f005f5f, 0xb100b1b1b100b1b1, 0x1700171717001717,
 608	0xf400f4f4f400f4f4, 0xbc00bcbcbc00bcbc, 0xd300d3d3d300d3d3,
 609	0x4600464646004646, 0xcf00cfcfcf00cfcf, 0x3700373737003737,
 610	0x5e005e5e5e005e5e, 0x4700474747004747, 0x9400949494009494,
 611	0xfa00fafafa00fafa, 0xfc00fcfcfc00fcfc, 0x5b005b5b5b005b5b,
 612	0x9700979797009797, 0xfe00fefefe00fefe, 0x5a005a5a5a005a5a,
 613	0xac00acacac00acac, 0x3c003c3c3c003c3c, 0x4c004c4c4c004c4c,
 614	0x0300030303000303, 0x3500353535003535, 0xf300f3f3f300f3f3,
 615	0x2300232323002323, 0xb800b8b8b800b8b8, 0x5d005d5d5d005d5d,
 616	0x6a006a6a6a006a6a, 0x9200929292009292, 0xd500d5d5d500d5d5,
 617	0x2100212121002121, 0x4400444444004444, 0x5100515151005151,
 618	0xc600c6c6c600c6c6, 0x7d007d7d7d007d7d, 0x3900393939003939,
 619	0x8300838383008383, 0xdc00dcdcdc00dcdc, 0xaa00aaaaaa00aaaa,
 620	0x7c007c7c7c007c7c, 0x7700777777007777, 0x5600565656005656,
 621	0x0500050505000505, 0x1b001b1b1b001b1b, 0xa400a4a4a400a4a4,
 622	0x1500151515001515, 0x3400343434003434, 0x1e001e1e1e001e1e,
 623	0x1c001c1c1c001c1c, 0xf800f8f8f800f8f8, 0x5200525252005252,
 624	0x2000202020002020, 0x1400141414001414, 0xe900e9e9e900e9e9,
 625	0xbd00bdbdbd00bdbd, 0xdd00dddddd00dddd, 0xe400e4e4e400e4e4,
 626	0xa100a1a1a100a1a1, 0xe000e0e0e000e0e0, 0x8a008a8a8a008a8a,
 627	0xf100f1f1f100f1f1, 0xd600d6d6d600d6d6, 0x7a007a7a7a007a7a,
 628	0xbb00bbbbbb00bbbb, 0xe300e3e3e300e3e3, 0x4000404040004040,
 629	0x4f004f4f4f004f4f,
 630};
 631
 632const u64 camellia_sp44044404[256] = {
 633	0x7070007070700070, 0x2c2c002c2c2c002c, 0xb3b300b3b3b300b3,
 634	0xc0c000c0c0c000c0, 0xe4e400e4e4e400e4, 0x5757005757570057,
 635	0xeaea00eaeaea00ea, 0xaeae00aeaeae00ae, 0x2323002323230023,
 636	0x6b6b006b6b6b006b, 0x4545004545450045, 0xa5a500a5a5a500a5,
 637	0xeded00ededed00ed, 0x4f4f004f4f4f004f, 0x1d1d001d1d1d001d,
 638	0x9292009292920092, 0x8686008686860086, 0xafaf00afafaf00af,
 639	0x7c7c007c7c7c007c, 0x1f1f001f1f1f001f, 0x3e3e003e3e3e003e,
 640	0xdcdc00dcdcdc00dc, 0x5e5e005e5e5e005e, 0x0b0b000b0b0b000b,
 641	0xa6a600a6a6a600a6, 0x3939003939390039, 0xd5d500d5d5d500d5,
 642	0x5d5d005d5d5d005d, 0xd9d900d9d9d900d9, 0x5a5a005a5a5a005a,
 643	0x5151005151510051, 0x6c6c006c6c6c006c, 0x8b8b008b8b8b008b,
 644	0x9a9a009a9a9a009a, 0xfbfb00fbfbfb00fb, 0xb0b000b0b0b000b0,
 645	0x7474007474740074, 0x2b2b002b2b2b002b, 0xf0f000f0f0f000f0,
 646	0x8484008484840084, 0xdfdf00dfdfdf00df, 0xcbcb00cbcbcb00cb,
 647	0x3434003434340034, 0x7676007676760076, 0x6d6d006d6d6d006d,
 648	0xa9a900a9a9a900a9, 0xd1d100d1d1d100d1, 0x0404000404040004,
 649	0x1414001414140014, 0x3a3a003a3a3a003a, 0xdede00dedede00de,
 650	0x1111001111110011, 0x3232003232320032, 0x9c9c009c9c9c009c,
 651	0x5353005353530053, 0xf2f200f2f2f200f2, 0xfefe00fefefe00fe,
 652	0xcfcf00cfcfcf00cf, 0xc3c300c3c3c300c3, 0x7a7a007a7a7a007a,
 653	0x2424002424240024, 0xe8e800e8e8e800e8, 0x6060006060600060,
 654	0x6969006969690069, 0xaaaa00aaaaaa00aa, 0xa0a000a0a0a000a0,
 655	0xa1a100a1a1a100a1, 0x6262006262620062, 0x5454005454540054,
 656	0x1e1e001e1e1e001e, 0xe0e000e0e0e000e0, 0x6464006464640064,
 657	0x1010001010100010, 0x0000000000000000, 0xa3a300a3a3a300a3,
 658	0x7575007575750075, 0x8a8a008a8a8a008a, 0xe6e600e6e6e600e6,
 659	0x0909000909090009, 0xdddd00dddddd00dd, 0x8787008787870087,
 660	0x8383008383830083, 0xcdcd00cdcdcd00cd, 0x9090009090900090,
 661	0x7373007373730073, 0xf6f600f6f6f600f6, 0x9d9d009d9d9d009d,
 662	0xbfbf00bfbfbf00bf, 0x5252005252520052, 0xd8d800d8d8d800d8,
 663	0xc8c800c8c8c800c8, 0xc6c600c6c6c600c6, 0x8181008181810081,
 664	0x6f6f006f6f6f006f, 0x1313001313130013, 0x6363006363630063,
 665	0xe9e900e9e9e900e9, 0xa7a700a7a7a700a7, 0x9f9f009f9f9f009f,
 666	0xbcbc00bcbcbc00bc, 0x2929002929290029, 0xf9f900f9f9f900f9,
 667	0x2f2f002f2f2f002f, 0xb4b400b4b4b400b4, 0x7878007878780078,
 668	0x0606000606060006, 0xe7e700e7e7e700e7, 0x7171007171710071,
 669	0xd4d400d4d4d400d4, 0xabab00ababab00ab, 0x8888008888880088,
 670	0x8d8d008d8d8d008d, 0x7272007272720072, 0xb9b900b9b9b900b9,
 671	0xf8f800f8f8f800f8, 0xacac00acacac00ac, 0x3636003636360036,
 672	0x2a2a002a2a2a002a, 0x3c3c003c3c3c003c, 0xf1f100f1f1f100f1,
 673	0x4040004040400040, 0xd3d300d3d3d300d3, 0xbbbb00bbbbbb00bb,
 674	0x4343004343430043, 0x1515001515150015, 0xadad00adadad00ad,
 675	0x7777007777770077, 0x8080008080800080, 0x8282008282820082,
 676	0xecec00ececec00ec, 0x2727002727270027, 0xe5e500e5e5e500e5,
 677	0x8585008585850085, 0x3535003535350035, 0x0c0c000c0c0c000c,
 678	0x4141004141410041, 0xefef00efefef00ef, 0x9393009393930093,
 679	0x1919001919190019, 0x2121002121210021, 0x0e0e000e0e0e000e,
 680	0x4e4e004e4e4e004e, 0x6565006565650065, 0xbdbd00bdbdbd00bd,
 681	0xb8b800b8b8b800b8, 0x8f8f008f8f8f008f, 0xebeb00ebebeb00eb,
 682	0xcece00cecece00ce, 0x3030003030300030, 0x5f5f005f5f5f005f,
 683	0xc5c500c5c5c500c5, 0x1a1a001a1a1a001a, 0xe1e100e1e1e100e1,
 684	0xcaca00cacaca00ca, 0x4747004747470047, 0x3d3d003d3d3d003d,
 685	0x0101000101010001, 0xd6d600d6d6d600d6, 0x5656005656560056,
 686	0x4d4d004d4d4d004d, 0x0d0d000d0d0d000d, 0x6666006666660066,
 687	0xcccc00cccccc00cc, 0x2d2d002d2d2d002d, 0x1212001212120012,
 688	0x2020002020200020, 0xb1b100b1b1b100b1, 0x9999009999990099,
 689	0x4c4c004c4c4c004c, 0xc2c200c2c2c200c2, 0x7e7e007e7e7e007e,
 690	0x0505000505050005, 0xb7b700b7b7b700b7, 0x3131003131310031,
 691	0x1717001717170017, 0xd7d700d7d7d700d7, 0x5858005858580058,
 692	0x6161006161610061, 0x1b1b001b1b1b001b, 0x1c1c001c1c1c001c,
 693	0x0f0f000f0f0f000f, 0x1616001616160016, 0x1818001818180018,
 694	0x2222002222220022, 0x4444004444440044, 0xb2b200b2b2b200b2,
 695	0xb5b500b5b5b500b5, 0x9191009191910091, 0x0808000808080008,
 696	0xa8a800a8a8a800a8, 0xfcfc00fcfcfc00fc, 0x5050005050500050,
 697	0xd0d000d0d0d000d0, 0x7d7d007d7d7d007d, 0x8989008989890089,
 698	0x9797009797970097, 0x5b5b005b5b5b005b, 0x9595009595950095,
 699	0xffff00ffffff00ff, 0xd2d200d2d2d200d2, 0xc4c400c4c4c400c4,
 700	0x4848004848480048, 0xf7f700f7f7f700f7, 0xdbdb00dbdbdb00db,
 701	0x0303000303030003, 0xdada00dadada00da, 0x3f3f003f3f3f003f,
 702	0x9494009494940094, 0x5c5c005c5c5c005c, 0x0202000202020002,
 703	0x4a4a004a4a4a004a, 0x3333003333330033, 0x6767006767670067,
 704	0xf3f300f3f3f300f3, 0x7f7f007f7f7f007f, 0xe2e200e2e2e200e2,
 705	0x9b9b009b9b9b009b, 0x2626002626260026, 0x3737003737370037,
 706	0x3b3b003b3b3b003b, 0x9696009696960096, 0x4b4b004b4b4b004b,
 707	0xbebe00bebebe00be, 0x2e2e002e2e2e002e, 0x7979007979790079,
 708	0x8c8c008c8c8c008c, 0x6e6e006e6e6e006e, 0x8e8e008e8e8e008e,
 709	0xf5f500f5f5f500f5, 0xb6b600b6b6b600b6, 0xfdfd00fdfdfd00fd,
 710	0x5959005959590059, 0x9898009898980098, 0x6a6a006a6a6a006a,
 711	0x4646004646460046, 0xbaba00bababa00ba, 0x2525002525250025,
 712	0x4242004242420042, 0xa2a200a2a2a200a2, 0xfafa00fafafa00fa,
 713	0x0707000707070007, 0x5555005555550055, 0xeeee00eeeeee00ee,
 714	0x0a0a000a0a0a000a, 0x4949004949490049, 0x6868006868680068,
 715	0x3838003838380038, 0xa4a400a4a4a400a4, 0x2828002828280028,
 716	0x7b7b007b7b7b007b, 0xc9c900c9c9c900c9, 0xc1c100c1c1c100c1,
 717	0xe3e300e3e3e300e3, 0xf4f400f4f4f400f4, 0xc7c700c7c7c700c7,
 718	0x9e9e009e9e9e009e,
 719};
 720
 721const u64 camellia_sp11101110[256] = {
 722	0x7070700070707000, 0x8282820082828200, 0x2c2c2c002c2c2c00,
 723	0xececec00ececec00, 0xb3b3b300b3b3b300, 0x2727270027272700,
 724	0xc0c0c000c0c0c000, 0xe5e5e500e5e5e500, 0xe4e4e400e4e4e400,
 725	0x8585850085858500, 0x5757570057575700, 0x3535350035353500,
 726	0xeaeaea00eaeaea00, 0x0c0c0c000c0c0c00, 0xaeaeae00aeaeae00,
 727	0x4141410041414100, 0x2323230023232300, 0xefefef00efefef00,
 728	0x6b6b6b006b6b6b00, 0x9393930093939300, 0x4545450045454500,
 729	0x1919190019191900, 0xa5a5a500a5a5a500, 0x2121210021212100,
 730	0xededed00ededed00, 0x0e0e0e000e0e0e00, 0x4f4f4f004f4f4f00,
 731	0x4e4e4e004e4e4e00, 0x1d1d1d001d1d1d00, 0x6565650065656500,
 732	0x9292920092929200, 0xbdbdbd00bdbdbd00, 0x8686860086868600,
 733	0xb8b8b800b8b8b800, 0xafafaf00afafaf00, 0x8f8f8f008f8f8f00,
 734	0x7c7c7c007c7c7c00, 0xebebeb00ebebeb00, 0x1f1f1f001f1f1f00,
 735	0xcecece00cecece00, 0x3e3e3e003e3e3e00, 0x3030300030303000,
 736	0xdcdcdc00dcdcdc00, 0x5f5f5f005f5f5f00, 0x5e5e5e005e5e5e00,
 737	0xc5c5c500c5c5c500, 0x0b0b0b000b0b0b00, 0x1a1a1a001a1a1a00,
 738	0xa6a6a600a6a6a600, 0xe1e1e100e1e1e100, 0x3939390039393900,
 739	0xcacaca00cacaca00, 0xd5d5d500d5d5d500, 0x4747470047474700,
 740	0x5d5d5d005d5d5d00, 0x3d3d3d003d3d3d00, 0xd9d9d900d9d9d900,
 741	0x0101010001010100, 0x5a5a5a005a5a5a00, 0xd6d6d600d6d6d600,
 742	0x5151510051515100, 0x5656560056565600, 0x6c6c6c006c6c6c00,
 743	0x4d4d4d004d4d4d00, 0x8b8b8b008b8b8b00, 0x0d0d0d000d0d0d00,
 744	0x9a9a9a009a9a9a00, 0x6666660066666600, 0xfbfbfb00fbfbfb00,
 745	0xcccccc00cccccc00, 0xb0b0b000b0b0b000, 0x2d2d2d002d2d2d00,
 746	0x7474740074747400, 0x1212120012121200, 0x2b2b2b002b2b2b00,
 747	0x2020200020202000, 0xf0f0f000f0f0f000, 0xb1b1b100b1b1b100,
 748	0x8484840084848400, 0x9999990099999900, 0xdfdfdf00dfdfdf00,
 749	0x4c4c4c004c4c4c00, 0xcbcbcb00cbcbcb00, 0xc2c2c200c2c2c200,
 750	0x3434340034343400, 0x7e7e7e007e7e7e00, 0x7676760076767600,
 751	0x0505050005050500, 0x6d6d6d006d6d6d00, 0xb7b7b700b7b7b700,
 752	0xa9a9a900a9a9a900, 0x3131310031313100, 0xd1d1d100d1d1d100,
 753	0x1717170017171700, 0x0404040004040400, 0xd7d7d700d7d7d700,
 754	0x1414140014141400, 0x5858580058585800, 0x3a3a3a003a3a3a00,
 755	0x6161610061616100, 0xdedede00dedede00, 0x1b1b1b001b1b1b00,
 756	0x1111110011111100, 0x1c1c1c001c1c1c00, 0x3232320032323200,
 757	0x0f0f0f000f0f0f00, 0x9c9c9c009c9c9c00, 0x1616160016161600,
 758	0x5353530053535300, 0x1818180018181800, 0xf2f2f200f2f2f200,
 759	0x2222220022222200, 0xfefefe00fefefe00, 0x4444440044444400,
 760	0xcfcfcf00cfcfcf00, 0xb2b2b200b2b2b200, 0xc3c3c300c3c3c300,
 761	0xb5b5b500b5b5b500, 0x7a7a7a007a7a7a00, 0x9191910091919100,
 762	0x2424240024242400, 0x0808080008080800, 0xe8e8e800e8e8e800,
 763	0xa8a8a800a8a8a800, 0x6060600060606000, 0xfcfcfc00fcfcfc00,
 764	0x6969690069696900, 0x5050500050505000, 0xaaaaaa00aaaaaa00,
 765	0xd0d0d000d0d0d000, 0xa0a0a000a0a0a000, 0x7d7d7d007d7d7d00,
 766	0xa1a1a100a1a1a100, 0x8989890089898900, 0x6262620062626200,
 767	0x9797970097979700, 0x5454540054545400, 0x5b5b5b005b5b5b00,
 768	0x1e1e1e001e1e1e00, 0x9595950095959500, 0xe0e0e000e0e0e000,
 769	0xffffff00ffffff00, 0x6464640064646400, 0xd2d2d200d2d2d200,
 770	0x1010100010101000, 0xc4c4c400c4c4c400, 0x0000000000000000,
 771	0x4848480048484800, 0xa3a3a300a3a3a300, 0xf7f7f700f7f7f700,
 772	0x7575750075757500, 0xdbdbdb00dbdbdb00, 0x8a8a8a008a8a8a00,
 773	0x0303030003030300, 0xe6e6e600e6e6e600, 0xdadada00dadada00,
 774	0x0909090009090900, 0x3f3f3f003f3f3f00, 0xdddddd00dddddd00,
 775	0x9494940094949400, 0x8787870087878700, 0x5c5c5c005c5c5c00,
 776	0x8383830083838300, 0x0202020002020200, 0xcdcdcd00cdcdcd00,
 777	0x4a4a4a004a4a4a00, 0x9090900090909000, 0x3333330033333300,
 778	0x7373730073737300, 0x6767670067676700, 0xf6f6f600f6f6f600,
 779	0xf3f3f300f3f3f300, 0x9d9d9d009d9d9d00, 0x7f7f7f007f7f7f00,
 780	0xbfbfbf00bfbfbf00, 0xe2e2e200e2e2e200, 0x5252520052525200,
 781	0x9b9b9b009b9b9b00, 0xd8d8d800d8d8d800, 0x2626260026262600,
 782	0xc8c8c800c8c8c800, 0x3737370037373700, 0xc6c6c600c6c6c600,
 783	0x3b3b3b003b3b3b00, 0x8181810081818100, 0x9696960096969600,
 784	0x6f6f6f006f6f6f00, 0x4b4b4b004b4b4b00, 0x1313130013131300,
 785	0xbebebe00bebebe00, 0x6363630063636300, 0x2e2e2e002e2e2e00,
 786	0xe9e9e900e9e9e900, 0x7979790079797900, 0xa7a7a700a7a7a700,
 787	0x8c8c8c008c8c8c00, 0x9f9f9f009f9f9f00, 0x6e6e6e006e6e6e00,
 788	0xbcbcbc00bcbcbc00, 0x8e8e8e008e8e8e00, 0x2929290029292900,
 789	0xf5f5f500f5f5f500, 0xf9f9f900f9f9f900, 0xb6b6b600b6b6b600,
 790	0x2f2f2f002f2f2f00, 0xfdfdfd00fdfdfd00, 0xb4b4b400b4b4b400,
 791	0x5959590059595900, 0x7878780078787800, 0x9898980098989800,
 792	0x0606060006060600, 0x6a6a6a006a6a6a00, 0xe7e7e700e7e7e700,
 793	0x4646460046464600, 0x7171710071717100, 0xbababa00bababa00,
 794	0xd4d4d400d4d4d400, 0x2525250025252500, 0xababab00ababab00,
 795	0x4242420042424200, 0x8888880088888800, 0xa2a2a200a2a2a200,
 796	0x8d8d8d008d8d8d00, 0xfafafa00fafafa00, 0x7272720072727200,
 797	0x0707070007070700, 0xb9b9b900b9b9b900, 0x5555550055555500,
 798	0xf8f8f800f8f8f800, 0xeeeeee00eeeeee00, 0xacacac00acacac00,
 799	0x0a0a0a000a0a0a00, 0x3636360036363600, 0x4949490049494900,
 800	0x2a2a2a002a2a2a00, 0x6868680068686800, 0x3c3c3c003c3c3c00,
 801	0x3838380038383800, 0xf1f1f100f1f1f100, 0xa4a4a400a4a4a400,
 802	0x4040400040404000, 0x2828280028282800, 0xd3d3d300d3d3d300,
 803	0x7b7b7b007b7b7b00, 0xbbbbbb00bbbbbb00, 0xc9c9c900c9c9c900,
 804	0x4343430043434300, 0xc1c1c100c1c1c100, 0x1515150015151500,
 805	0xe3e3e300e3e3e300, 0xadadad00adadad00, 0xf4f4f400f4f4f400,
 806	0x7777770077777700, 0xc7c7c700c7c7c700, 0x8080800080808000,
 807	0x9e9e9e009e9e9e00,
 808};
 809
 810/* key constants */
 811#define CAMELLIA_SIGMA1L (0xA09E667FL)
 812#define CAMELLIA_SIGMA1R (0x3BCC908BL)
 813#define CAMELLIA_SIGMA2L (0xB67AE858L)
 814#define CAMELLIA_SIGMA2R (0x4CAA73B2L)
 815#define CAMELLIA_SIGMA3L (0xC6EF372FL)
 816#define CAMELLIA_SIGMA3R (0xE94F82BEL)
 817#define CAMELLIA_SIGMA4L (0x54FF53A5L)
 818#define CAMELLIA_SIGMA4R (0xF1D36F1CL)
 819#define CAMELLIA_SIGMA5L (0x10E527FAL)
 820#define CAMELLIA_SIGMA5R (0xDE682D1DL)
 821#define CAMELLIA_SIGMA6L (0xB05688C2L)
 822#define CAMELLIA_SIGMA6R (0xB3E6C1FDL)
 823
 824/* macros */
 825#define ROLDQ(l, r, bits) ({ \
 826	u64 t = l;					\
 827	l = (l << bits) | (r >> (64 - bits));		\
 828	r = (r << bits) | (t >> (64 - bits));		\
 829})
 830
 831#define CAMELLIA_F(x, kl, kr, y) ({ \
 832	u64 ii = x ^ (((u64)kl << 32) | kr);				\
 833	y = camellia_sp11101110[(uint8_t)ii];				\
 834	y ^= camellia_sp44044404[(uint8_t)(ii >> 8)];			\
 835	ii >>= 16;							\
 836	y ^= camellia_sp30333033[(uint8_t)ii];				\
 837	y ^= camellia_sp02220222[(uint8_t)(ii >> 8)];			\
 838	ii >>= 16;							\
 839	y ^= camellia_sp00444404[(uint8_t)ii];				\
 840	y ^= camellia_sp03303033[(uint8_t)(ii >> 8)];			\
 841	ii >>= 16;							\
 842	y ^= camellia_sp22000222[(uint8_t)ii];				\
 843	y ^= camellia_sp10011110[(uint8_t)(ii >> 8)];			\
 844	y = ror64(y, 32);						\
 845})
 846
 847#define SET_SUBKEY_LR(INDEX, sRL) (subkey[(INDEX)] = ror64((sRL), 32))
 848
 849static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
 850{
 851	u64 kw4, tt;
 852	u32 dw, tl, tr;
 853
 854	/* absorb kw2 to other subkeys */
 855	/* round 2 */
 856	subRL[3] ^= subRL[1];
 857	/* round 4 */
 858	subRL[5] ^= subRL[1];
 859	/* round 6 */
 860	subRL[7] ^= subRL[1];
 861
 862	subRL[1] ^= (subRL[1] & ~subRL[9]) << 32;
 863	/* modified for FLinv(kl2) */
 864	dw = (subRL[1] & subRL[9]) >> 32,
 865		subRL[1] ^= rol32(dw, 1);
 866
 867	/* round 8 */
 868	subRL[11] ^= subRL[1];
 869	/* round 10 */
 870	subRL[13] ^= subRL[1];
 871	/* round 12 */
 872	subRL[15] ^= subRL[1];
 873
 874	subRL[1] ^= (subRL[1] & ~subRL[17]) << 32;
 875	/* modified for FLinv(kl4) */
 876	dw = (subRL[1] & subRL[17]) >> 32,
 877		subRL[1] ^= rol32(dw, 1);
 878
 879	/* round 14 */
 880	subRL[19] ^= subRL[1];
 881	/* round 16 */
 882	subRL[21] ^= subRL[1];
 883	/* round 18 */
 884	subRL[23] ^= subRL[1];
 885
 886	if (max == 24) {
 887		/* kw3 */
 888		subRL[24] ^= subRL[1];
 889
 890		/* absorb kw4 to other subkeys */
 891		kw4 = subRL[25];
 892	} else {
 893		subRL[1] ^= (subRL[1] & ~subRL[25]) << 32;
 894		/* modified for FLinv(kl6) */
 895		dw = (subRL[1] & subRL[25]) >> 32,
 896			subRL[1] ^= rol32(dw, 1);
 897
 898		/* round 20 */
 899		subRL[27] ^= subRL[1];
 900		/* round 22 */
 901		subRL[29] ^= subRL[1];
 902		/* round 24 */
 903		subRL[31] ^= subRL[1];
 904		/* kw3 */
 905		subRL[32] ^= subRL[1];
 906
 907		/* absorb kw4 to other subkeys */
 908		kw4 = subRL[33];
 909		/* round 23 */
 910		subRL[30] ^= kw4;
 911		/* round 21 */
 912		subRL[28] ^= kw4;
 913		/* round 19 */
 914		subRL[26] ^= kw4;
 915
 916		kw4 ^= (kw4 & ~subRL[24]) << 32;
 917		/* modified for FL(kl5) */
 918		dw = (kw4 & subRL[24]) >> 32,
 919			kw4 ^= rol32(dw, 1);
 920	}
 921
 922	/* round 17 */
 923	subRL[22] ^= kw4;
 924	/* round 15 */
 925	subRL[20] ^= kw4;
 926	/* round 13 */
 927	subRL[18] ^= kw4;
 928
 929	kw4 ^= (kw4 & ~subRL[16]) << 32;
 930	/* modified for FL(kl3) */
 931	dw = (kw4 & subRL[16]) >> 32,
 932		kw4 ^= rol32(dw, 1);
 933
 934	/* round 11 */
 935	subRL[14] ^= kw4;
 936	/* round 9 */
 937	subRL[12] ^= kw4;
 938	/* round 7 */
 939	subRL[10] ^= kw4;
 940
 941	kw4 ^= (kw4 & ~subRL[8]) << 32;
 942	/* modified for FL(kl1) */
 943	dw = (kw4 & subRL[8]) >> 32,
 944		kw4 ^= rol32(dw, 1);
 945
 946	/* round 5 */
 947	subRL[6] ^= kw4;
 948	/* round 3 */
 949	subRL[4] ^= kw4;
 950	/* round 1 */
 951	subRL[2] ^= kw4;
 952	/* kw1 */
 953	subRL[0] ^= kw4;
 954
 955	/* key XOR is end of F-function */
 956	SET_SUBKEY_LR(0, subRL[0] ^ subRL[2]);			/* kw1 */
 957	SET_SUBKEY_LR(2, subRL[3]);				/* round 1 */
 958	SET_SUBKEY_LR(3, subRL[2] ^ subRL[4]);			/* round 2 */
 959	SET_SUBKEY_LR(4, subRL[3] ^ subRL[5]);			/* round 3 */
 960	SET_SUBKEY_LR(5, subRL[4] ^ subRL[6]);			/* round 4 */
 961	SET_SUBKEY_LR(6, subRL[5] ^ subRL[7]);			/* round 5 */
 962
 963	tl = (subRL[10] >> 32) ^ (subRL[10] & ~subRL[8]);
 964	dw = tl & (subRL[8] >> 32),				/* FL(kl1) */
 965		tr = subRL[10] ^ rol32(dw, 1);
 966	tt = (tr | ((u64)tl << 32));
 967
 968	SET_SUBKEY_LR(7, subRL[6] ^ tt);			/* round 6 */
 969	SET_SUBKEY_LR(8, subRL[8]);				/* FL(kl1) */
 970	SET_SUBKEY_LR(9, subRL[9]);				/* FLinv(kl2) */
 971
 972	tl = (subRL[7] >> 32) ^ (subRL[7] & ~subRL[9]);
 973	dw = tl & (subRL[9] >> 32),				/* FLinv(kl2) */
 974		tr = subRL[7] ^ rol32(dw, 1);
 975	tt = (tr | ((u64)tl << 32));
 976
 977	SET_SUBKEY_LR(10, subRL[11] ^ tt);			/* round 7 */
 978	SET_SUBKEY_LR(11, subRL[10] ^ subRL[12]);		/* round 8 */
 979	SET_SUBKEY_LR(12, subRL[11] ^ subRL[13]);		/* round 9 */
 980	SET_SUBKEY_LR(13, subRL[12] ^ subRL[14]);		/* round 10 */
 981	SET_SUBKEY_LR(14, subRL[13] ^ subRL[15]);		/* round 11 */
 982
 983	tl = (subRL[18] >> 32) ^ (subRL[18] & ~subRL[16]);
 984	dw = tl & (subRL[16] >> 32),				/* FL(kl3) */
 985		tr = subRL[18] ^ rol32(dw, 1);
 986	tt = (tr | ((u64)tl << 32));
 987
 988	SET_SUBKEY_LR(15, subRL[14] ^ tt);			/* round 12 */
 989	SET_SUBKEY_LR(16, subRL[16]);				/* FL(kl3) */
 990	SET_SUBKEY_LR(17, subRL[17]);				/* FLinv(kl4) */
 991
 992	tl = (subRL[15] >> 32) ^ (subRL[15] & ~subRL[17]);
 993	dw = tl & (subRL[17] >> 32),				/* FLinv(kl4) */
 994		tr = subRL[15] ^ rol32(dw, 1);
 995	tt = (tr | ((u64)tl << 32));
 996
 997	SET_SUBKEY_LR(18, subRL[19] ^ tt);			/* round 13 */
 998	SET_SUBKEY_LR(19, subRL[18] ^ subRL[20]);		/* round 14 */
 999	SET_SUBKEY_LR(20, subRL[19] ^ subRL[21]);		/* round 15 */
1000	SET_SUBKEY_LR(21, subRL[20] ^ subRL[22]);		/* round 16 */
1001	SET_SUBKEY_LR(22, subRL[21] ^ subRL[23]);		/* round 17 */
1002
1003	if (max == 24) {
1004		SET_SUBKEY_LR(23, subRL[22]);			/* round 18 */
1005		SET_SUBKEY_LR(24, subRL[24] ^ subRL[23]);	/* kw3 */
1006	} else {
1007		tl = (subRL[26] >> 32) ^ (subRL[26] & ~subRL[24]);
1008		dw = tl & (subRL[24] >> 32),			/* FL(kl5) */
1009			tr = subRL[26] ^ rol32(dw, 1);
1010		tt = (tr | ((u64)tl << 32));
1011
1012		SET_SUBKEY_LR(23, subRL[22] ^ tt);		/* round 18 */
1013		SET_SUBKEY_LR(24, subRL[24]);			/* FL(kl5) */
1014		SET_SUBKEY_LR(25, subRL[25]);			/* FLinv(kl6) */
1015
1016		tl = (subRL[23] >> 32) ^ (subRL[23] & ~subRL[25]);
1017		dw = tl & (subRL[25] >> 32),			/* FLinv(kl6) */
1018			tr = subRL[23] ^ rol32(dw, 1);
1019		tt = (tr | ((u64)tl << 32));
1020
1021		SET_SUBKEY_LR(26, subRL[27] ^ tt);		/* round 19 */
1022		SET_SUBKEY_LR(27, subRL[26] ^ subRL[28]);	/* round 20 */
1023		SET_SUBKEY_LR(28, subRL[27] ^ subRL[29]);	/* round 21 */
1024		SET_SUBKEY_LR(29, subRL[28] ^ subRL[30]);	/* round 22 */
1025		SET_SUBKEY_LR(30, subRL[29] ^ subRL[31]);	/* round 23 */
1026		SET_SUBKEY_LR(31, subRL[30]);			/* round 24 */
1027		SET_SUBKEY_LR(32, subRL[32] ^ subRL[31]);	/* kw3 */
1028	}
1029}
1030
1031static void camellia_setup128(const unsigned char *key, u64 *subkey)
1032{
1033	u64 kl, kr, ww;
1034	u64 subRL[26];
1035
1036	/**
1037	 *  k == kl || kr (|| is concatenation)
1038	 */
1039	kl = get_unaligned_be64(key);
1040	kr = get_unaligned_be64(key + 8);
1041
1042	/* generate KL dependent subkeys */
1043	/* kw1 */
1044	subRL[0] = kl;
1045	/* kw2 */
1046	subRL[1] = kr;
1047
1048	/* rotation left shift 15bit */
1049	ROLDQ(kl, kr, 15);
1050
1051	/* k3 */
1052	subRL[4] = kl;
1053	/* k4 */
1054	subRL[5] = kr;
1055
1056	/* rotation left shift 15+30bit */
1057	ROLDQ(kl, kr, 30);
1058
1059	/* k7 */
1060	subRL[10] = kl;
1061	/* k8 */
1062	subRL[11] = kr;
1063
1064	/* rotation left shift 15+30+15bit */
1065	ROLDQ(kl, kr, 15);
1066
1067	/* k10 */
1068	subRL[13] = kr;
1069	/* rotation left shift 15+30+15+17 bit */
1070	ROLDQ(kl, kr, 17);
1071
1072	/* kl3 */
1073	subRL[16] = kl;
1074	/* kl4 */
1075	subRL[17] = kr;
1076
1077	/* rotation left shift 15+30+15+17+17 bit */
1078	ROLDQ(kl, kr, 17);
1079
1080	/* k13 */
1081	subRL[18] = kl;
1082	/* k14 */
1083	subRL[19] = kr;
1084
1085	/* rotation left shift 15+30+15+17+17+17 bit */
1086	ROLDQ(kl, kr, 17);
1087
1088	/* k17 */
1089	subRL[22] = kl;
1090	/* k18 */
1091	subRL[23] = kr;
1092
1093	/* generate KA */
1094	kl = subRL[0];
1095	kr = subRL[1];
1096	CAMELLIA_F(kl, CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, ww);
1097	kr ^= ww;
1098	CAMELLIA_F(kr, CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, kl);
1099
1100	/* current status == (kll, klr, w0, w1) */
1101	CAMELLIA_F(kl, CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, kr);
1102	kr ^= ww;
1103	CAMELLIA_F(kr, CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, ww);
1104	kl ^= ww;
1105
1106	/* generate KA dependent subkeys */
1107	/* k1, k2 */
1108	subRL[2] = kl;
1109	subRL[3] = kr;
1110	ROLDQ(kl, kr, 15);
1111	/* k5,k6 */
1112	subRL[6] = kl;
1113	subRL[7] = kr;
1114	ROLDQ(kl, kr, 15);
1115	/* kl1, kl2 */
1116	subRL[8] = kl;
1117	subRL[9] = kr;
1118	ROLDQ(kl, kr, 15);
1119	/* k9 */
1120	subRL[12] = kl;
1121	ROLDQ(kl, kr, 15);
1122	/* k11, k12 */
1123	subRL[14] = kl;
1124	subRL[15] = kr;
1125	ROLDQ(kl, kr, 34);
1126	/* k15, k16 */
1127	subRL[20] = kl;
1128	subRL[21] = kr;
1129	ROLDQ(kl, kr, 17);
1130	/* kw3, kw4 */
1131	subRL[24] = kl;
1132	subRL[25] = kr;
1133
1134	camellia_setup_tail(subkey, subRL, 24);
1135}
1136
1137static void camellia_setup256(const unsigned char *key, u64 *subkey)
1138{
1139	u64 kl, kr;			/* left half of key */
1140	u64 krl, krr;			/* right half of key */
1141	u64 ww;				/* temporary variables */
1142	u64 subRL[34];
1143
1144	/**
1145	 *  key = (kl || kr || krl || krr) (|| is concatenation)
1146	 */
1147	kl = get_unaligned_be64(key);
1148	kr = get_unaligned_be64(key + 8);
1149	krl = get_unaligned_be64(key + 16);
1150	krr = get_unaligned_be64(key + 24);
1151
1152	/* generate KL dependent subkeys */
1153	/* kw1 */
1154	subRL[0] = kl;
1155	/* kw2 */
1156	subRL[1] = kr;
1157	ROLDQ(kl, kr, 45);
1158	/* k9 */
1159	subRL[12] = kl;
1160	/* k10 */
1161	subRL[13] = kr;
1162	ROLDQ(kl, kr, 15);
1163	/* kl3 */
1164	subRL[16] = kl;
1165	/* kl4 */
1166	subRL[17] = kr;
1167	ROLDQ(kl, kr, 17);
1168	/* k17 */
1169	subRL[22] = kl;
1170	/* k18 */
1171	subRL[23] = kr;
1172	ROLDQ(kl, kr, 34);
1173	/* k23 */
1174	subRL[30] = kl;
1175	/* k24 */
1176	subRL[31] = kr;
1177
1178	/* generate KR dependent subkeys */
1179	ROLDQ(krl, krr, 15);
1180	/* k3 */
1181	subRL[4] = krl;
1182	/* k4 */
1183	subRL[5] = krr;
1184	ROLDQ(krl, krr, 15);
1185	/* kl1 */
1186	subRL[8] = krl;
1187	/* kl2 */
1188	subRL[9] = krr;
1189	ROLDQ(krl, krr, 30);
1190	/* k13 */
1191	subRL[18] = krl;
1192	/* k14 */
1193	subRL[19] = krr;
1194	ROLDQ(krl, krr, 34);
1195	/* k19 */
1196	subRL[26] = krl;
1197	/* k20 */
1198	subRL[27] = krr;
1199	ROLDQ(krl, krr, 34);
1200
1201	/* generate KA */
1202	kl = subRL[0] ^ krl;
1203	kr = subRL[1] ^ krr;
1204
1205	CAMELLIA_F(kl, CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, ww);
1206	kr ^= ww;
1207	CAMELLIA_F(kr, CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, kl);
1208	kl ^= krl;
1209	CAMELLIA_F(kl, CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, kr);
1210	kr ^= ww ^ krr;
1211	CAMELLIA_F(kr, CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, ww);
1212	kl ^= ww;
1213
1214	/* generate KB */
1215	krl ^= kl;
1216	krr ^= kr;
1217	CAMELLIA_F(krl, CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R, ww);
1218	krr ^= ww;
1219	CAMELLIA_F(krr, CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R, ww);
1220	krl ^= ww;
1221
1222	/* generate KA dependent subkeys */
1223	ROLDQ(kl, kr, 15);
1224	/* k5 */
1225	subRL[6] = kl;
1226	/* k6 */
1227	subRL[7] = kr;
1228	ROLDQ(kl, kr, 30);
1229	/* k11 */
1230	subRL[14] = kl;
1231	/* k12 */
1232	subRL[15] = kr;
1233	/* rotation left shift 32bit */
1234	ROLDQ(kl, kr, 32);
1235	/* kl5 */
1236	subRL[24] = kl;
1237	/* kl6 */
1238	subRL[25] = kr;
1239	/* rotation left shift 17 from k11,k12 -> k21,k22 */
1240	ROLDQ(kl, kr, 17);
1241	/* k21 */
1242	subRL[28] = kl;
1243	/* k22 */
1244	subRL[29] = kr;
1245
1246	/* generate KB dependent subkeys */
1247	/* k1 */
1248	subRL[2] = krl;
1249	/* k2 */
1250	subRL[3] = krr;
1251	ROLDQ(krl, krr, 30);
1252	/* k7 */
1253	subRL[10] = krl;
1254	/* k8 */
1255	subRL[11] = krr;
1256	ROLDQ(krl, krr, 30);
1257	/* k15 */
1258	subRL[20] = krl;
1259	/* k16 */
1260	subRL[21] = krr;
1261	ROLDQ(krl, krr, 51);
1262	/* kw3 */
1263	subRL[32] = krl;
1264	/* kw4 */
1265	subRL[33] = krr;
1266
1267	camellia_setup_tail(subkey, subRL, 32);
1268}
1269
1270static void camellia_setup192(const unsigned char *key, u64 *subkey)
1271{
1272	unsigned char kk[32];
1273	u64 krl, krr;
1274
1275	memcpy(kk, key, 24);
1276	memcpy((unsigned char *)&krl, key+16, 8);
1277	krr = ~krl;
1278	memcpy(kk+24, (unsigned char *)&krr, 8);
1279	camellia_setup256(kk, subkey);
1280}
1281
1282static int __camellia_setkey(struct camellia_ctx *cctx,
1283			     const unsigned char *key,
1284			     unsigned int key_len, u32 *flags)
1285{
1286	if (key_len != 16 && key_len != 24 && key_len != 32) {
1287		*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
1288		return -EINVAL;
1289	}
1290
1291	cctx->key_length = key_len;
1292
1293	switch (key_len) {
1294	case 16:
1295		camellia_setup128(key, cctx->key_table);
1296		break;
1297	case 24:
1298		camellia_setup192(key, cctx->key_table);
1299		break;
1300	case 32:
1301		camellia_setup256(key, cctx->key_table);
1302		break;
1303	}
1304
1305	return 0;
1306}
 
1307
1308static int camellia_setkey(struct crypto_tfm *tfm, const u8 *in_key,
1309			   unsigned int key_len)
1310{
1311	return __camellia_setkey(crypto_tfm_ctx(tfm), in_key, key_len,
1312				 &tfm->crt_flags);
1313}
1314
1315static int ecb_crypt(struct blkcipher_desc *desc, struct blkcipher_walk *walk,
1316		     void (*fn)(struct camellia_ctx *, u8 *, const u8 *),
1317		     void (*fn_2way)(struct camellia_ctx *, u8 *, const u8 *))
1318{
1319	struct camellia_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1320	unsigned int bsize = CAMELLIA_BLOCK_SIZE;
1321	unsigned int nbytes;
1322	int err;
1323
1324	err = blkcipher_walk_virt(desc, walk);
1325
1326	while ((nbytes = walk->nbytes)) {
1327		u8 *wsrc = walk->src.virt.addr;
1328		u8 *wdst = walk->dst.virt.addr;
1329
1330		/* Process two block batch */
1331		if (nbytes >= bsize * 2) {
1332			do {
1333				fn_2way(ctx, wdst, wsrc);
1334
1335				wsrc += bsize * 2;
1336				wdst += bsize * 2;
1337				nbytes -= bsize * 2;
1338			} while (nbytes >= bsize * 2);
1339
1340			if (nbytes < bsize)
1341				goto done;
1342		}
1343
1344		/* Handle leftovers */
1345		do {
1346			fn(ctx, wdst, wsrc);
1347
1348			wsrc += bsize;
1349			wdst += bsize;
1350			nbytes -= bsize;
1351		} while (nbytes >= bsize);
1352
1353done:
1354		err = blkcipher_walk_done(desc, walk, nbytes);
1355	}
1356
1357	return err;
1358}
1359
1360static int ecb_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1361		       struct scatterlist *src, unsigned int nbytes)
1362{
1363	struct blkcipher_walk walk;
1364
1365	blkcipher_walk_init(&walk, dst, src, nbytes);
1366	return ecb_crypt(desc, &walk, camellia_enc_blk, camellia_enc_blk_2way);
1367}
1368
1369static int ecb_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1370		       struct scatterlist *src, unsigned int nbytes)
1371{
1372	struct blkcipher_walk walk;
1373
1374	blkcipher_walk_init(&walk, dst, src, nbytes);
1375	return ecb_crypt(desc, &walk, camellia_dec_blk, camellia_dec_blk_2way);
1376}
 
1377
1378static unsigned int __cbc_encrypt(struct blkcipher_desc *desc,
1379				  struct blkcipher_walk *walk)
1380{
1381	struct camellia_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1382	unsigned int bsize = CAMELLIA_BLOCK_SIZE;
1383	unsigned int nbytes = walk->nbytes;
1384	u128 *src = (u128 *)walk->src.virt.addr;
1385	u128 *dst = (u128 *)walk->dst.virt.addr;
1386	u128 *iv = (u128 *)walk->iv;
1387
1388	do {
1389		u128_xor(dst, src, iv);
1390		camellia_enc_blk(ctx, (u8 *)dst, (u8 *)dst);
1391		iv = dst;
1392
1393		src += 1;
1394		dst += 1;
1395		nbytes -= bsize;
1396	} while (nbytes >= bsize);
1397
1398	u128_xor((u128 *)walk->iv, (u128 *)walk->iv, iv);
1399	return nbytes;
1400}
1401
1402static int cbc_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1403		       struct scatterlist *src, unsigned int nbytes)
1404{
1405	struct blkcipher_walk walk;
1406	int err;
1407
1408	blkcipher_walk_init(&walk, dst, src, nbytes);
1409	err = blkcipher_walk_virt(desc, &walk);
1410
1411	while ((nbytes = walk.nbytes)) {
1412		nbytes = __cbc_encrypt(desc, &walk);
1413		err = blkcipher_walk_done(desc, &walk, nbytes);
1414	}
1415
1416	return err;
1417}
 
1418
1419static unsigned int __cbc_decrypt(struct blkcipher_desc *desc,
1420				  struct blkcipher_walk *walk)
1421{
1422	struct camellia_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1423	unsigned int bsize = CAMELLIA_BLOCK_SIZE;
1424	unsigned int nbytes = walk->nbytes;
1425	u128 *src = (u128 *)walk->src.virt.addr;
1426	u128 *dst = (u128 *)walk->dst.virt.addr;
1427	u128 ivs[2 - 1];
1428	u128 last_iv;
1429
1430	/* Start of the last block. */
1431	src += nbytes / bsize - 1;
1432	dst += nbytes / bsize - 1;
1433
1434	last_iv = *src;
1435
1436	/* Process two block batch */
1437	if (nbytes >= bsize * 2) {
1438		do {
1439			nbytes -= bsize * (2 - 1);
1440			src -= 2 - 1;
1441			dst -= 2 - 1;
1442
1443			ivs[0] = src[0];
1444
1445			camellia_dec_blk_2way(ctx, (u8 *)dst, (u8 *)src);
1446
1447			u128_xor(dst + 1, dst + 1, ivs + 0);
1448
1449			nbytes -= bsize;
1450			if (nbytes < bsize)
1451				goto done;
1452
1453			u128_xor(dst, dst, src - 1);
1454			src -= 1;
1455			dst -= 1;
1456		} while (nbytes >= bsize * 2);
1457
1458		if (nbytes < bsize)
1459			goto done;
1460	}
1461
1462	/* Handle leftovers */
1463	for (;;) {
1464		camellia_dec_blk(ctx, (u8 *)dst, (u8 *)src);
1465
1466		nbytes -= bsize;
1467		if (nbytes < bsize)
1468			break;
1469
1470		u128_xor(dst, dst, src - 1);
1471		src -= 1;
1472		dst -= 1;
1473	}
1474
1475done:
1476	u128_xor(dst, dst, (u128 *)walk->iv);
1477	*(u128 *)walk->iv = last_iv;
1478
1479	return nbytes;
1480}
1481
1482static int cbc_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1483		       struct scatterlist *src, unsigned int nbytes)
1484{
1485	struct blkcipher_walk walk;
1486	int err;
1487
1488	blkcipher_walk_init(&walk, dst, src, nbytes);
1489	err = blkcipher_walk_virt(desc, &walk);
1490
1491	while ((nbytes = walk.nbytes)) {
1492		nbytes = __cbc_decrypt(desc, &walk);
1493		err = blkcipher_walk_done(desc, &walk, nbytes);
1494	}
1495
1496	return err;
1497}
1498
1499static inline void u128_to_be128(be128 *dst, const u128 *src)
1500{
1501	dst->a = cpu_to_be64(src->a);
1502	dst->b = cpu_to_be64(src->b);
1503}
1504
1505static inline void be128_to_u128(u128 *dst, const be128 *src)
1506{
1507	dst->a = be64_to_cpu(src->a);
1508	dst->b = be64_to_cpu(src->b);
1509}
1510
1511static inline void u128_inc(u128 *i)
1512{
1513	i->b++;
1514	if (!i->b)
1515		i->a++;
1516}
1517
1518static void ctr_crypt_final(struct blkcipher_desc *desc,
1519			    struct blkcipher_walk *walk)
1520{
1521	struct camellia_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1522	u8 keystream[CAMELLIA_BLOCK_SIZE];
1523	u8 *src = walk->src.virt.addr;
1524	u8 *dst = walk->dst.virt.addr;
1525	unsigned int nbytes = walk->nbytes;
1526	u128 ctrblk;
1527
1528	memcpy(keystream, src, nbytes);
1529	camellia_enc_blk_xor(ctx, keystream, walk->iv);
1530	memcpy(dst, keystream, nbytes);
1531
1532	be128_to_u128(&ctrblk, (be128 *)walk->iv);
1533	u128_inc(&ctrblk);
1534	u128_to_be128((be128 *)walk->iv, &ctrblk);
1535}
1536
1537static unsigned int __ctr_crypt(struct blkcipher_desc *desc,
1538				struct blkcipher_walk *walk)
1539{
1540	struct camellia_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1541	unsigned int bsize = CAMELLIA_BLOCK_SIZE;
1542	unsigned int nbytes = walk->nbytes;
1543	u128 *src = (u128 *)walk->src.virt.addr;
1544	u128 *dst = (u128 *)walk->dst.virt.addr;
1545	u128 ctrblk;
1546	be128 ctrblocks[2];
1547
1548	be128_to_u128(&ctrblk, (be128 *)walk->iv);
1549
1550	/* Process two block batch */
1551	if (nbytes >= bsize * 2) {
1552		do {
1553			if (dst != src) {
1554				dst[0] = src[0];
1555				dst[1] = src[1];
1556			}
1557
1558			/* create ctrblks for parallel encrypt */
1559			u128_to_be128(&ctrblocks[0], &ctrblk);
1560			u128_inc(&ctrblk);
1561			u128_to_be128(&ctrblocks[1], &ctrblk);
1562			u128_inc(&ctrblk);
1563
1564			camellia_enc_blk_xor_2way(ctx, (u8 *)dst,
1565						 (u8 *)ctrblocks);
1566
1567			src += 2;
1568			dst += 2;
1569			nbytes -= bsize * 2;
1570		} while (nbytes >= bsize * 2);
1571
1572		if (nbytes < bsize)
1573			goto done;
1574	}
1575
1576	/* Handle leftovers */
1577	do {
1578		if (dst != src)
1579			*dst = *src;
1580
1581		u128_to_be128(&ctrblocks[0], &ctrblk);
1582		u128_inc(&ctrblk);
1583
1584		camellia_enc_blk_xor(ctx, (u8 *)dst, (u8 *)ctrblocks);
1585
1586		src += 1;
1587		dst += 1;
1588		nbytes -= bsize;
1589	} while (nbytes >= bsize);
1590
1591done:
1592	u128_to_be128((be128 *)walk->iv, &ctrblk);
1593	return nbytes;
1594}
1595
1596static int ctr_crypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1597		     struct scatterlist *src, unsigned int nbytes)
1598{
1599	struct blkcipher_walk walk;
1600	int err;
1601
1602	blkcipher_walk_init(&walk, dst, src, nbytes);
1603	err = blkcipher_walk_virt_block(desc, &walk, CAMELLIA_BLOCK_SIZE);
1604
1605	while ((nbytes = walk.nbytes) >= CAMELLIA_BLOCK_SIZE) {
1606		nbytes = __ctr_crypt(desc, &walk);
1607		err = blkcipher_walk_done(desc, &walk, nbytes);
1608	}
1609
1610	if (walk.nbytes) {
1611		ctr_crypt_final(desc, &walk);
1612		err = blkcipher_walk_done(desc, &walk, 0);
1613	}
1614
1615	return err;
1616}
1617
1618static void encrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes)
1619{
1620	const unsigned int bsize = CAMELLIA_BLOCK_SIZE;
1621	struct camellia_ctx *ctx = priv;
1622	int i;
1623
1624	while (nbytes >= 2 * bsize) {
1625		camellia_enc_blk_2way(ctx, srcdst, srcdst);
1626		srcdst += bsize * 2;
1627		nbytes -= bsize * 2;
1628	}
1629
1630	for (i = 0; i < nbytes / bsize; i++, srcdst += bsize)
1631		camellia_enc_blk(ctx, srcdst, srcdst);
1632}
1633
1634static void decrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes)
1635{
1636	const unsigned int bsize = CAMELLIA_BLOCK_SIZE;
1637	struct camellia_ctx *ctx = priv;
1638	int i;
1639
1640	while (nbytes >= 2 * bsize) {
1641		camellia_dec_blk_2way(ctx, srcdst, srcdst);
1642		srcdst += bsize * 2;
1643		nbytes -= bsize * 2;
1644	}
1645
1646	for (i = 0; i < nbytes / bsize; i++, srcdst += bsize)
1647		camellia_dec_blk(ctx, srcdst, srcdst);
1648}
1649
1650struct camellia_lrw_ctx {
1651	struct lrw_table_ctx lrw_table;
1652	struct camellia_ctx camellia_ctx;
1653};
1654
1655static int lrw_camellia_setkey(struct crypto_tfm *tfm, const u8 *key,
1656			      unsigned int keylen)
1657{
1658	struct camellia_lrw_ctx *ctx = crypto_tfm_ctx(tfm);
1659	int err;
1660
1661	err = __camellia_setkey(&ctx->camellia_ctx, key,
1662				keylen - CAMELLIA_BLOCK_SIZE,
1663				&tfm->crt_flags);
1664	if (err)
1665		return err;
1666
1667	return lrw_init_table(&ctx->lrw_table,
1668			      key + keylen - CAMELLIA_BLOCK_SIZE);
1669}
1670
1671static int lrw_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1672		       struct scatterlist *src, unsigned int nbytes)
1673{
1674	struct camellia_lrw_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1675	be128 buf[2 * 4];
1676	struct lrw_crypt_req req = {
1677		.tbuf = buf,
1678		.tbuflen = sizeof(buf),
1679
1680		.table_ctx = &ctx->lrw_table,
1681		.crypt_ctx = &ctx->camellia_ctx,
1682		.crypt_fn = encrypt_callback,
1683	};
1684
1685	return lrw_crypt(desc, dst, src, nbytes, &req);
1686}
 
 
 
 
 
 
 
 
 
 
1687
1688static int lrw_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1689		       struct scatterlist *src, unsigned int nbytes)
1690{
1691	struct camellia_lrw_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1692	be128 buf[2 * 4];
1693	struct lrw_crypt_req req = {
1694		.tbuf = buf,
1695		.tbuflen = sizeof(buf),
1696
1697		.table_ctx = &ctx->lrw_table,
1698		.crypt_ctx = &ctx->camellia_ctx,
1699		.crypt_fn = decrypt_callback,
1700	};
1701
1702	return lrw_crypt(desc, dst, src, nbytes, &req);
1703}
1704
1705static void lrw_exit_tfm(struct crypto_tfm *tfm)
1706{
1707	struct camellia_lrw_ctx *ctx = crypto_tfm_ctx(tfm);
1708
1709	lrw_free_table(&ctx->lrw_table);
1710}
1711
1712struct camellia_xts_ctx {
1713	struct camellia_ctx tweak_ctx;
1714	struct camellia_ctx crypt_ctx;
1715};
1716
1717static int xts_camellia_setkey(struct crypto_tfm *tfm, const u8 *key,
1718			      unsigned int keylen)
1719{
1720	struct camellia_xts_ctx *ctx = crypto_tfm_ctx(tfm);
1721	u32 *flags = &tfm->crt_flags;
1722	int err;
1723
1724	/* key consists of keys of equal size concatenated, therefore
1725	 * the length must be even
1726	 */
1727	if (keylen % 2) {
1728		*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
1729		return -EINVAL;
1730	}
1731
1732	/* first half of xts-key is for crypt */
1733	err = __camellia_setkey(&ctx->crypt_ctx, key, keylen / 2, flags);
1734	if (err)
1735		return err;
1736
1737	/* second half of xts-key is for tweak */
1738	return __camellia_setkey(&ctx->tweak_ctx, key + keylen / 2, keylen / 2,
1739				flags);
1740}
1741
1742static int xts_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1743		       struct scatterlist *src, unsigned int nbytes)
1744{
1745	struct camellia_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1746	be128 buf[2 * 4];
1747	struct xts_crypt_req req = {
1748		.tbuf = buf,
1749		.tbuflen = sizeof(buf),
1750
1751		.tweak_ctx = &ctx->tweak_ctx,
1752		.tweak_fn = XTS_TWEAK_CAST(camellia_enc_blk),
1753		.crypt_ctx = &ctx->crypt_ctx,
1754		.crypt_fn = encrypt_callback,
1755	};
1756
1757	return xts_crypt(desc, dst, src, nbytes, &req);
1758}
1759
1760static int xts_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
1761		       struct scatterlist *src, unsigned int nbytes)
1762{
1763	struct camellia_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
1764	be128 buf[2 * 4];
1765	struct xts_crypt_req req = {
1766		.tbuf = buf,
1767		.tbuflen = sizeof(buf),
1768
1769		.tweak_ctx = &ctx->tweak_ctx,
1770		.tweak_fn = XTS_TWEAK_CAST(camellia_enc_blk),
1771		.crypt_ctx = &ctx->crypt_ctx,
1772		.crypt_fn = decrypt_callback,
1773	};
1774
1775	return xts_crypt(desc, dst, src, nbytes, &req);
1776}
1777
1778static struct crypto_alg camellia_algs[6] = { {
1779	.cra_name		= "camellia",
1780	.cra_driver_name	= "camellia-asm",
1781	.cra_priority		= 200,
1782	.cra_flags		= CRYPTO_ALG_TYPE_CIPHER,
1783	.cra_blocksize		= CAMELLIA_BLOCK_SIZE,
1784	.cra_ctxsize		= sizeof(struct camellia_ctx),
1785	.cra_alignmask		= 0,
1786	.cra_module		= THIS_MODULE,
1787	.cra_list		= LIST_HEAD_INIT(camellia_algs[0].cra_list),
1788	.cra_u			= {
1789		.cipher = {
1790			.cia_min_keysize = CAMELLIA_MIN_KEY_SIZE,
1791			.cia_max_keysize = CAMELLIA_MAX_KEY_SIZE,
1792			.cia_setkey	 = camellia_setkey,
1793			.cia_encrypt	 = camellia_encrypt,
1794			.cia_decrypt	 = camellia_decrypt
1795		}
1796	}
1797}, {
1798	.cra_name		= "ecb(camellia)",
1799	.cra_driver_name	= "ecb-camellia-asm",
1800	.cra_priority		= 300,
1801	.cra_flags		= CRYPTO_ALG_TYPE_BLKCIPHER,
1802	.cra_blocksize		= CAMELLIA_BLOCK_SIZE,
1803	.cra_ctxsize		= sizeof(struct camellia_ctx),
1804	.cra_alignmask		= 0,
1805	.cra_type		= &crypto_blkcipher_type,
1806	.cra_module		= THIS_MODULE,
1807	.cra_list		= LIST_HEAD_INIT(camellia_algs[1].cra_list),
1808	.cra_u = {
1809		.blkcipher = {
1810			.min_keysize	= CAMELLIA_MIN_KEY_SIZE,
1811			.max_keysize	= CAMELLIA_MAX_KEY_SIZE,
1812			.setkey		= camellia_setkey,
1813			.encrypt	= ecb_encrypt,
1814			.decrypt	= ecb_decrypt,
1815		},
1816	},
1817}, {
1818	.cra_name		= "cbc(camellia)",
1819	.cra_driver_name	= "cbc-camellia-asm",
1820	.cra_priority		= 300,
1821	.cra_flags		= CRYPTO_ALG_TYPE_BLKCIPHER,
1822	.cra_blocksize		= CAMELLIA_BLOCK_SIZE,
1823	.cra_ctxsize		= sizeof(struct camellia_ctx),
1824	.cra_alignmask		= 0,
1825	.cra_type		= &crypto_blkcipher_type,
1826	.cra_module		= THIS_MODULE,
1827	.cra_list		= LIST_HEAD_INIT(camellia_algs[2].cra_list),
1828	.cra_u = {
1829		.blkcipher = {
1830			.min_keysize	= CAMELLIA_MIN_KEY_SIZE,
1831			.max_keysize	= CAMELLIA_MAX_KEY_SIZE,
1832			.ivsize		= CAMELLIA_BLOCK_SIZE,
1833			.setkey		= camellia_setkey,
1834			.encrypt	= cbc_encrypt,
1835			.decrypt	= cbc_decrypt,
1836		},
1837	},
1838}, {
1839	.cra_name		= "ctr(camellia)",
1840	.cra_driver_name	= "ctr-camellia-asm",
1841	.cra_priority		= 300,
1842	.cra_flags		= CRYPTO_ALG_TYPE_BLKCIPHER,
1843	.cra_blocksize		= 1,
1844	.cra_ctxsize		= sizeof(struct camellia_ctx),
1845	.cra_alignmask		= 0,
1846	.cra_type		= &crypto_blkcipher_type,
1847	.cra_module		= THIS_MODULE,
1848	.cra_list		= LIST_HEAD_INIT(camellia_algs[3].cra_list),
1849	.cra_u = {
1850		.blkcipher = {
1851			.min_keysize	= CAMELLIA_MIN_KEY_SIZE,
1852			.max_keysize	= CAMELLIA_MAX_KEY_SIZE,
1853			.ivsize		= CAMELLIA_BLOCK_SIZE,
1854			.setkey		= camellia_setkey,
1855			.encrypt	= ctr_crypt,
1856			.decrypt	= ctr_crypt,
1857		},
1858	},
1859}, {
1860	.cra_name		= "lrw(camellia)",
1861	.cra_driver_name	= "lrw-camellia-asm",
1862	.cra_priority		= 300,
1863	.cra_flags		= CRYPTO_ALG_TYPE_BLKCIPHER,
1864	.cra_blocksize		= CAMELLIA_BLOCK_SIZE,
1865	.cra_ctxsize		= sizeof(struct camellia_lrw_ctx),
1866	.cra_alignmask		= 0,
1867	.cra_type		= &crypto_blkcipher_type,
1868	.cra_module		= THIS_MODULE,
1869	.cra_list		= LIST_HEAD_INIT(camellia_algs[4].cra_list),
1870	.cra_exit		= lrw_exit_tfm,
1871	.cra_u = {
1872		.blkcipher = {
1873			.min_keysize	= CAMELLIA_MIN_KEY_SIZE +
1874						CAMELLIA_BLOCK_SIZE,
1875			.max_keysize	= CAMELLIA_MAX_KEY_SIZE +
1876						CAMELLIA_BLOCK_SIZE,
1877			.ivsize		= CAMELLIA_BLOCK_SIZE,
1878			.setkey		= lrw_camellia_setkey,
1879			.encrypt	= lrw_encrypt,
1880			.decrypt	= lrw_decrypt,
1881		},
1882	},
1883}, {
1884	.cra_name		= "xts(camellia)",
1885	.cra_driver_name	= "xts-camellia-asm",
1886	.cra_priority		= 300,
1887	.cra_flags		= CRYPTO_ALG_TYPE_BLKCIPHER,
1888	.cra_blocksize		= CAMELLIA_BLOCK_SIZE,
1889	.cra_ctxsize		= sizeof(struct camellia_xts_ctx),
1890	.cra_alignmask		= 0,
1891	.cra_type		= &crypto_blkcipher_type,
1892	.cra_module		= THIS_MODULE,
1893	.cra_list		= LIST_HEAD_INIT(camellia_algs[5].cra_list),
1894	.cra_u = {
1895		.blkcipher = {
1896			.min_keysize	= CAMELLIA_MIN_KEY_SIZE * 2,
1897			.max_keysize	= CAMELLIA_MAX_KEY_SIZE * 2,
1898			.ivsize		= CAMELLIA_BLOCK_SIZE,
1899			.setkey		= xts_camellia_setkey,
1900			.encrypt	= xts_encrypt,
1901			.decrypt	= xts_decrypt,
1902		},
1903	},
1904} };
1905
1906static bool is_blacklisted_cpu(void)
1907{
1908	if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL)
1909		return false;
1910
1911	if (boot_cpu_data.x86 == 0x0f) {
1912		/*
1913		 * On Pentium 4, camellia-asm is slower than original assembler
1914		 * implementation because excessive uses of 64bit rotate and
1915		 * left-shifts (which are really slow on P4) needed to store and
1916		 * handle 128bit block in two 64bit registers.
1917		 */
1918		return true;
1919	}
1920
1921	return false;
1922}
1923
1924static int force;
1925module_param(force, int, 0);
1926MODULE_PARM_DESC(force, "Force module load, ignore CPU blacklist");
1927
1928static int __init init(void)
1929{
 
 
1930	if (!force && is_blacklisted_cpu()) {
1931		printk(KERN_INFO
1932			"camellia-x86_64: performance on this CPU "
1933			"would be suboptimal: disabling "
1934			"camellia-x86_64.\n");
1935		return -ENODEV;
1936	}
1937
1938	return crypto_register_algs(camellia_algs, ARRAY_SIZE(camellia_algs));
 
 
 
 
 
 
 
 
 
1939}
1940
1941static void __exit fini(void)
1942{
1943	crypto_unregister_algs(camellia_algs, ARRAY_SIZE(camellia_algs));
 
 
1944}
1945
1946module_init(init);
1947module_exit(fini);
1948
1949MODULE_LICENSE("GPL");
1950MODULE_DESCRIPTION("Camellia Cipher Algorithm, asm optimized");
1951MODULE_ALIAS("camellia");
1952MODULE_ALIAS("camellia-asm");
v4.17
   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/unaligned.h>
  27#include <linux/crypto.h>
  28#include <linux/init.h>
  29#include <linux/module.h>
  30#include <linux/types.h>
  31#include <crypto/algapi.h>
  32#include <asm/crypto/camellia.h>
  33#include <asm/crypto/glue_helper.h>
 
 
 
 
 
 
 
 
 
 
 
  34
  35/* regular block cipher functions */
  36asmlinkage void __camellia_enc_blk(struct camellia_ctx *ctx, u8 *dst,
  37				   const u8 *src, bool xor);
  38EXPORT_SYMBOL_GPL(__camellia_enc_blk);
  39asmlinkage void camellia_dec_blk(struct camellia_ctx *ctx, u8 *dst,
  40				 const u8 *src);
  41EXPORT_SYMBOL_GPL(camellia_dec_blk);
  42
  43/* 2-way parallel cipher functions */
  44asmlinkage void __camellia_enc_blk_2way(struct camellia_ctx *ctx, u8 *dst,
  45					const u8 *src, bool xor);
  46EXPORT_SYMBOL_GPL(__camellia_enc_blk_2way);
  47asmlinkage void camellia_dec_blk_2way(struct camellia_ctx *ctx, u8 *dst,
  48				      const u8 *src);
  49EXPORT_SYMBOL_GPL(camellia_dec_blk_2way);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  50
  51static void camellia_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
  52{
  53	camellia_enc_blk(crypto_tfm_ctx(tfm), dst, src);
  54}
  55
  56static void camellia_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
  57{
  58	camellia_dec_blk(crypto_tfm_ctx(tfm), dst, src);
  59}
  60
  61/* camellia sboxes */
  62__visible const u64 camellia_sp10011110[256] = {
  63	0x7000007070707000ULL, 0x8200008282828200ULL, 0x2c00002c2c2c2c00ULL,
  64	0xec0000ecececec00ULL, 0xb30000b3b3b3b300ULL, 0x2700002727272700ULL,
  65	0xc00000c0c0c0c000ULL, 0xe50000e5e5e5e500ULL, 0xe40000e4e4e4e400ULL,
  66	0x8500008585858500ULL, 0x5700005757575700ULL, 0x3500003535353500ULL,
  67	0xea0000eaeaeaea00ULL, 0x0c00000c0c0c0c00ULL, 0xae0000aeaeaeae00ULL,
  68	0x4100004141414100ULL, 0x2300002323232300ULL, 0xef0000efefefef00ULL,
  69	0x6b00006b6b6b6b00ULL, 0x9300009393939300ULL, 0x4500004545454500ULL,
  70	0x1900001919191900ULL, 0xa50000a5a5a5a500ULL, 0x2100002121212100ULL,
  71	0xed0000edededed00ULL, 0x0e00000e0e0e0e00ULL, 0x4f00004f4f4f4f00ULL,
  72	0x4e00004e4e4e4e00ULL, 0x1d00001d1d1d1d00ULL, 0x6500006565656500ULL,
  73	0x9200009292929200ULL, 0xbd0000bdbdbdbd00ULL, 0x8600008686868600ULL,
  74	0xb80000b8b8b8b800ULL, 0xaf0000afafafaf00ULL, 0x8f00008f8f8f8f00ULL,
  75	0x7c00007c7c7c7c00ULL, 0xeb0000ebebebeb00ULL, 0x1f00001f1f1f1f00ULL,
  76	0xce0000cececece00ULL, 0x3e00003e3e3e3e00ULL, 0x3000003030303000ULL,
  77	0xdc0000dcdcdcdc00ULL, 0x5f00005f5f5f5f00ULL, 0x5e00005e5e5e5e00ULL,
  78	0xc50000c5c5c5c500ULL, 0x0b00000b0b0b0b00ULL, 0x1a00001a1a1a1a00ULL,
  79	0xa60000a6a6a6a600ULL, 0xe10000e1e1e1e100ULL, 0x3900003939393900ULL,
  80	0xca0000cacacaca00ULL, 0xd50000d5d5d5d500ULL, 0x4700004747474700ULL,
  81	0x5d00005d5d5d5d00ULL, 0x3d00003d3d3d3d00ULL, 0xd90000d9d9d9d900ULL,
  82	0x0100000101010100ULL, 0x5a00005a5a5a5a00ULL, 0xd60000d6d6d6d600ULL,
  83	0x5100005151515100ULL, 0x5600005656565600ULL, 0x6c00006c6c6c6c00ULL,
  84	0x4d00004d4d4d4d00ULL, 0x8b00008b8b8b8b00ULL, 0x0d00000d0d0d0d00ULL,
  85	0x9a00009a9a9a9a00ULL, 0x6600006666666600ULL, 0xfb0000fbfbfbfb00ULL,
  86	0xcc0000cccccccc00ULL, 0xb00000b0b0b0b000ULL, 0x2d00002d2d2d2d00ULL,
  87	0x7400007474747400ULL, 0x1200001212121200ULL, 0x2b00002b2b2b2b00ULL,
  88	0x2000002020202000ULL, 0xf00000f0f0f0f000ULL, 0xb10000b1b1b1b100ULL,
  89	0x8400008484848400ULL, 0x9900009999999900ULL, 0xdf0000dfdfdfdf00ULL,
  90	0x4c00004c4c4c4c00ULL, 0xcb0000cbcbcbcb00ULL, 0xc20000c2c2c2c200ULL,
  91	0x3400003434343400ULL, 0x7e00007e7e7e7e00ULL, 0x7600007676767600ULL,
  92	0x0500000505050500ULL, 0x6d00006d6d6d6d00ULL, 0xb70000b7b7b7b700ULL,
  93	0xa90000a9a9a9a900ULL, 0x3100003131313100ULL, 0xd10000d1d1d1d100ULL,
  94	0x1700001717171700ULL, 0x0400000404040400ULL, 0xd70000d7d7d7d700ULL,
  95	0x1400001414141400ULL, 0x5800005858585800ULL, 0x3a00003a3a3a3a00ULL,
  96	0x6100006161616100ULL, 0xde0000dededede00ULL, 0x1b00001b1b1b1b00ULL,
  97	0x1100001111111100ULL, 0x1c00001c1c1c1c00ULL, 0x3200003232323200ULL,
  98	0x0f00000f0f0f0f00ULL, 0x9c00009c9c9c9c00ULL, 0x1600001616161600ULL,
  99	0x5300005353535300ULL, 0x1800001818181800ULL, 0xf20000f2f2f2f200ULL,
 100	0x2200002222222200ULL, 0xfe0000fefefefe00ULL, 0x4400004444444400ULL,
 101	0xcf0000cfcfcfcf00ULL, 0xb20000b2b2b2b200ULL, 0xc30000c3c3c3c300ULL,
 102	0xb50000b5b5b5b500ULL, 0x7a00007a7a7a7a00ULL, 0x9100009191919100ULL,
 103	0x2400002424242400ULL, 0x0800000808080800ULL, 0xe80000e8e8e8e800ULL,
 104	0xa80000a8a8a8a800ULL, 0x6000006060606000ULL, 0xfc0000fcfcfcfc00ULL,
 105	0x6900006969696900ULL, 0x5000005050505000ULL, 0xaa0000aaaaaaaa00ULL,
 106	0xd00000d0d0d0d000ULL, 0xa00000a0a0a0a000ULL, 0x7d00007d7d7d7d00ULL,
 107	0xa10000a1a1a1a100ULL, 0x8900008989898900ULL, 0x6200006262626200ULL,
 108	0x9700009797979700ULL, 0x5400005454545400ULL, 0x5b00005b5b5b5b00ULL,
 109	0x1e00001e1e1e1e00ULL, 0x9500009595959500ULL, 0xe00000e0e0e0e000ULL,
 110	0xff0000ffffffff00ULL, 0x6400006464646400ULL, 0xd20000d2d2d2d200ULL,
 111	0x1000001010101000ULL, 0xc40000c4c4c4c400ULL, 0x0000000000000000ULL,
 112	0x4800004848484800ULL, 0xa30000a3a3a3a300ULL, 0xf70000f7f7f7f700ULL,
 113	0x7500007575757500ULL, 0xdb0000dbdbdbdb00ULL, 0x8a00008a8a8a8a00ULL,
 114	0x0300000303030300ULL, 0xe60000e6e6e6e600ULL, 0xda0000dadadada00ULL,
 115	0x0900000909090900ULL, 0x3f00003f3f3f3f00ULL, 0xdd0000dddddddd00ULL,
 116	0x9400009494949400ULL, 0x8700008787878700ULL, 0x5c00005c5c5c5c00ULL,
 117	0x8300008383838300ULL, 0x0200000202020200ULL, 0xcd0000cdcdcdcd00ULL,
 118	0x4a00004a4a4a4a00ULL, 0x9000009090909000ULL, 0x3300003333333300ULL,
 119	0x7300007373737300ULL, 0x6700006767676700ULL, 0xf60000f6f6f6f600ULL,
 120	0xf30000f3f3f3f300ULL, 0x9d00009d9d9d9d00ULL, 0x7f00007f7f7f7f00ULL,
 121	0xbf0000bfbfbfbf00ULL, 0xe20000e2e2e2e200ULL, 0x5200005252525200ULL,
 122	0x9b00009b9b9b9b00ULL, 0xd80000d8d8d8d800ULL, 0x2600002626262600ULL,
 123	0xc80000c8c8c8c800ULL, 0x3700003737373700ULL, 0xc60000c6c6c6c600ULL,
 124	0x3b00003b3b3b3b00ULL, 0x8100008181818100ULL, 0x9600009696969600ULL,
 125	0x6f00006f6f6f6f00ULL, 0x4b00004b4b4b4b00ULL, 0x1300001313131300ULL,
 126	0xbe0000bebebebe00ULL, 0x6300006363636300ULL, 0x2e00002e2e2e2e00ULL,
 127	0xe90000e9e9e9e900ULL, 0x7900007979797900ULL, 0xa70000a7a7a7a700ULL,
 128	0x8c00008c8c8c8c00ULL, 0x9f00009f9f9f9f00ULL, 0x6e00006e6e6e6e00ULL,
 129	0xbc0000bcbcbcbc00ULL, 0x8e00008e8e8e8e00ULL, 0x2900002929292900ULL,
 130	0xf50000f5f5f5f500ULL, 0xf90000f9f9f9f900ULL, 0xb60000b6b6b6b600ULL,
 131	0x2f00002f2f2f2f00ULL, 0xfd0000fdfdfdfd00ULL, 0xb40000b4b4b4b400ULL,
 132	0x5900005959595900ULL, 0x7800007878787800ULL, 0x9800009898989800ULL,
 133	0x0600000606060600ULL, 0x6a00006a6a6a6a00ULL, 0xe70000e7e7e7e700ULL,
 134	0x4600004646464600ULL, 0x7100007171717100ULL, 0xba0000babababa00ULL,
 135	0xd40000d4d4d4d400ULL, 0x2500002525252500ULL, 0xab0000abababab00ULL,
 136	0x4200004242424200ULL, 0x8800008888888800ULL, 0xa20000a2a2a2a200ULL,
 137	0x8d00008d8d8d8d00ULL, 0xfa0000fafafafa00ULL, 0x7200007272727200ULL,
 138	0x0700000707070700ULL, 0xb90000b9b9b9b900ULL, 0x5500005555555500ULL,
 139	0xf80000f8f8f8f800ULL, 0xee0000eeeeeeee00ULL, 0xac0000acacacac00ULL,
 140	0x0a00000a0a0a0a00ULL, 0x3600003636363600ULL, 0x4900004949494900ULL,
 141	0x2a00002a2a2a2a00ULL, 0x6800006868686800ULL, 0x3c00003c3c3c3c00ULL,
 142	0x3800003838383800ULL, 0xf10000f1f1f1f100ULL, 0xa40000a4a4a4a400ULL,
 143	0x4000004040404000ULL, 0x2800002828282800ULL, 0xd30000d3d3d3d300ULL,
 144	0x7b00007b7b7b7b00ULL, 0xbb0000bbbbbbbb00ULL, 0xc90000c9c9c9c900ULL,
 145	0x4300004343434300ULL, 0xc10000c1c1c1c100ULL, 0x1500001515151500ULL,
 146	0xe30000e3e3e3e300ULL, 0xad0000adadadad00ULL, 0xf40000f4f4f4f400ULL,
 147	0x7700007777777700ULL, 0xc70000c7c7c7c700ULL, 0x8000008080808000ULL,
 148	0x9e00009e9e9e9e00ULL,
 149};
 150
 151__visible const u64 camellia_sp22000222[256] = {
 152	0xe0e0000000e0e0e0ULL, 0x0505000000050505ULL, 0x5858000000585858ULL,
 153	0xd9d9000000d9d9d9ULL, 0x6767000000676767ULL, 0x4e4e0000004e4e4eULL,
 154	0x8181000000818181ULL, 0xcbcb000000cbcbcbULL, 0xc9c9000000c9c9c9ULL,
 155	0x0b0b0000000b0b0bULL, 0xaeae000000aeaeaeULL, 0x6a6a0000006a6a6aULL,
 156	0xd5d5000000d5d5d5ULL, 0x1818000000181818ULL, 0x5d5d0000005d5d5dULL,
 157	0x8282000000828282ULL, 0x4646000000464646ULL, 0xdfdf000000dfdfdfULL,
 158	0xd6d6000000d6d6d6ULL, 0x2727000000272727ULL, 0x8a8a0000008a8a8aULL,
 159	0x3232000000323232ULL, 0x4b4b0000004b4b4bULL, 0x4242000000424242ULL,
 160	0xdbdb000000dbdbdbULL, 0x1c1c0000001c1c1cULL, 0x9e9e0000009e9e9eULL,
 161	0x9c9c0000009c9c9cULL, 0x3a3a0000003a3a3aULL, 0xcaca000000cacacaULL,
 162	0x2525000000252525ULL, 0x7b7b0000007b7b7bULL, 0x0d0d0000000d0d0dULL,
 163	0x7171000000717171ULL, 0x5f5f0000005f5f5fULL, 0x1f1f0000001f1f1fULL,
 164	0xf8f8000000f8f8f8ULL, 0xd7d7000000d7d7d7ULL, 0x3e3e0000003e3e3eULL,
 165	0x9d9d0000009d9d9dULL, 0x7c7c0000007c7c7cULL, 0x6060000000606060ULL,
 166	0xb9b9000000b9b9b9ULL, 0xbebe000000bebebeULL, 0xbcbc000000bcbcbcULL,
 167	0x8b8b0000008b8b8bULL, 0x1616000000161616ULL, 0x3434000000343434ULL,
 168	0x4d4d0000004d4d4dULL, 0xc3c3000000c3c3c3ULL, 0x7272000000727272ULL,
 169	0x9595000000959595ULL, 0xabab000000abababULL, 0x8e8e0000008e8e8eULL,
 170	0xbaba000000bababaULL, 0x7a7a0000007a7a7aULL, 0xb3b3000000b3b3b3ULL,
 171	0x0202000000020202ULL, 0xb4b4000000b4b4b4ULL, 0xadad000000adadadULL,
 172	0xa2a2000000a2a2a2ULL, 0xacac000000acacacULL, 0xd8d8000000d8d8d8ULL,
 173	0x9a9a0000009a9a9aULL, 0x1717000000171717ULL, 0x1a1a0000001a1a1aULL,
 174	0x3535000000353535ULL, 0xcccc000000ccccccULL, 0xf7f7000000f7f7f7ULL,
 175	0x9999000000999999ULL, 0x6161000000616161ULL, 0x5a5a0000005a5a5aULL,
 176	0xe8e8000000e8e8e8ULL, 0x2424000000242424ULL, 0x5656000000565656ULL,
 177	0x4040000000404040ULL, 0xe1e1000000e1e1e1ULL, 0x6363000000636363ULL,
 178	0x0909000000090909ULL, 0x3333000000333333ULL, 0xbfbf000000bfbfbfULL,
 179	0x9898000000989898ULL, 0x9797000000979797ULL, 0x8585000000858585ULL,
 180	0x6868000000686868ULL, 0xfcfc000000fcfcfcULL, 0xecec000000ecececULL,
 181	0x0a0a0000000a0a0aULL, 0xdada000000dadadaULL, 0x6f6f0000006f6f6fULL,
 182	0x5353000000535353ULL, 0x6262000000626262ULL, 0xa3a3000000a3a3a3ULL,
 183	0x2e2e0000002e2e2eULL, 0x0808000000080808ULL, 0xafaf000000afafafULL,
 184	0x2828000000282828ULL, 0xb0b0000000b0b0b0ULL, 0x7474000000747474ULL,
 185	0xc2c2000000c2c2c2ULL, 0xbdbd000000bdbdbdULL, 0x3636000000363636ULL,
 186	0x2222000000222222ULL, 0x3838000000383838ULL, 0x6464000000646464ULL,
 187	0x1e1e0000001e1e1eULL, 0x3939000000393939ULL, 0x2c2c0000002c2c2cULL,
 188	0xa6a6000000a6a6a6ULL, 0x3030000000303030ULL, 0xe5e5000000e5e5e5ULL,
 189	0x4444000000444444ULL, 0xfdfd000000fdfdfdULL, 0x8888000000888888ULL,
 190	0x9f9f0000009f9f9fULL, 0x6565000000656565ULL, 0x8787000000878787ULL,
 191	0x6b6b0000006b6b6bULL, 0xf4f4000000f4f4f4ULL, 0x2323000000232323ULL,
 192	0x4848000000484848ULL, 0x1010000000101010ULL, 0xd1d1000000d1d1d1ULL,
 193	0x5151000000515151ULL, 0xc0c0000000c0c0c0ULL, 0xf9f9000000f9f9f9ULL,
 194	0xd2d2000000d2d2d2ULL, 0xa0a0000000a0a0a0ULL, 0x5555000000555555ULL,
 195	0xa1a1000000a1a1a1ULL, 0x4141000000414141ULL, 0xfafa000000fafafaULL,
 196	0x4343000000434343ULL, 0x1313000000131313ULL, 0xc4c4000000c4c4c4ULL,
 197	0x2f2f0000002f2f2fULL, 0xa8a8000000a8a8a8ULL, 0xb6b6000000b6b6b6ULL,
 198	0x3c3c0000003c3c3cULL, 0x2b2b0000002b2b2bULL, 0xc1c1000000c1c1c1ULL,
 199	0xffff000000ffffffULL, 0xc8c8000000c8c8c8ULL, 0xa5a5000000a5a5a5ULL,
 200	0x2020000000202020ULL, 0x8989000000898989ULL, 0x0000000000000000ULL,
 201	0x9090000000909090ULL, 0x4747000000474747ULL, 0xefef000000efefefULL,
 202	0xeaea000000eaeaeaULL, 0xb7b7000000b7b7b7ULL, 0x1515000000151515ULL,
 203	0x0606000000060606ULL, 0xcdcd000000cdcdcdULL, 0xb5b5000000b5b5b5ULL,
 204	0x1212000000121212ULL, 0x7e7e0000007e7e7eULL, 0xbbbb000000bbbbbbULL,
 205	0x2929000000292929ULL, 0x0f0f0000000f0f0fULL, 0xb8b8000000b8b8b8ULL,
 206	0x0707000000070707ULL, 0x0404000000040404ULL, 0x9b9b0000009b9b9bULL,
 207	0x9494000000949494ULL, 0x2121000000212121ULL, 0x6666000000666666ULL,
 208	0xe6e6000000e6e6e6ULL, 0xcece000000cececeULL, 0xeded000000edededULL,
 209	0xe7e7000000e7e7e7ULL, 0x3b3b0000003b3b3bULL, 0xfefe000000fefefeULL,
 210	0x7f7f0000007f7f7fULL, 0xc5c5000000c5c5c5ULL, 0xa4a4000000a4a4a4ULL,
 211	0x3737000000373737ULL, 0xb1b1000000b1b1b1ULL, 0x4c4c0000004c4c4cULL,
 212	0x9191000000919191ULL, 0x6e6e0000006e6e6eULL, 0x8d8d0000008d8d8dULL,
 213	0x7676000000767676ULL, 0x0303000000030303ULL, 0x2d2d0000002d2d2dULL,
 214	0xdede000000dededeULL, 0x9696000000969696ULL, 0x2626000000262626ULL,
 215	0x7d7d0000007d7d7dULL, 0xc6c6000000c6c6c6ULL, 0x5c5c0000005c5c5cULL,
 216	0xd3d3000000d3d3d3ULL, 0xf2f2000000f2f2f2ULL, 0x4f4f0000004f4f4fULL,
 217	0x1919000000191919ULL, 0x3f3f0000003f3f3fULL, 0xdcdc000000dcdcdcULL,
 218	0x7979000000797979ULL, 0x1d1d0000001d1d1dULL, 0x5252000000525252ULL,
 219	0xebeb000000ebebebULL, 0xf3f3000000f3f3f3ULL, 0x6d6d0000006d6d6dULL,
 220	0x5e5e0000005e5e5eULL, 0xfbfb000000fbfbfbULL, 0x6969000000696969ULL,
 221	0xb2b2000000b2b2b2ULL, 0xf0f0000000f0f0f0ULL, 0x3131000000313131ULL,
 222	0x0c0c0000000c0c0cULL, 0xd4d4000000d4d4d4ULL, 0xcfcf000000cfcfcfULL,
 223	0x8c8c0000008c8c8cULL, 0xe2e2000000e2e2e2ULL, 0x7575000000757575ULL,
 224	0xa9a9000000a9a9a9ULL, 0x4a4a0000004a4a4aULL, 0x5757000000575757ULL,
 225	0x8484000000848484ULL, 0x1111000000111111ULL, 0x4545000000454545ULL,
 226	0x1b1b0000001b1b1bULL, 0xf5f5000000f5f5f5ULL, 0xe4e4000000e4e4e4ULL,
 227	0x0e0e0000000e0e0eULL, 0x7373000000737373ULL, 0xaaaa000000aaaaaaULL,
 228	0xf1f1000000f1f1f1ULL, 0xdddd000000ddddddULL, 0x5959000000595959ULL,
 229	0x1414000000141414ULL, 0x6c6c0000006c6c6cULL, 0x9292000000929292ULL,
 230	0x5454000000545454ULL, 0xd0d0000000d0d0d0ULL, 0x7878000000787878ULL,
 231	0x7070000000707070ULL, 0xe3e3000000e3e3e3ULL, 0x4949000000494949ULL,
 232	0x8080000000808080ULL, 0x5050000000505050ULL, 0xa7a7000000a7a7a7ULL,
 233	0xf6f6000000f6f6f6ULL, 0x7777000000777777ULL, 0x9393000000939393ULL,
 234	0x8686000000868686ULL, 0x8383000000838383ULL, 0x2a2a0000002a2a2aULL,
 235	0xc7c7000000c7c7c7ULL, 0x5b5b0000005b5b5bULL, 0xe9e9000000e9e9e9ULL,
 236	0xeeee000000eeeeeeULL, 0x8f8f0000008f8f8fULL, 0x0101000000010101ULL,
 237	0x3d3d0000003d3d3dULL,
 238};
 239
 240__visible const u64 camellia_sp03303033[256] = {
 241	0x0038380038003838ULL, 0x0041410041004141ULL, 0x0016160016001616ULL,
 242	0x0076760076007676ULL, 0x00d9d900d900d9d9ULL, 0x0093930093009393ULL,
 243	0x0060600060006060ULL, 0x00f2f200f200f2f2ULL, 0x0072720072007272ULL,
 244	0x00c2c200c200c2c2ULL, 0x00abab00ab00ababULL, 0x009a9a009a009a9aULL,
 245	0x0075750075007575ULL, 0x0006060006000606ULL, 0x0057570057005757ULL,
 246	0x00a0a000a000a0a0ULL, 0x0091910091009191ULL, 0x00f7f700f700f7f7ULL,
 247	0x00b5b500b500b5b5ULL, 0x00c9c900c900c9c9ULL, 0x00a2a200a200a2a2ULL,
 248	0x008c8c008c008c8cULL, 0x00d2d200d200d2d2ULL, 0x0090900090009090ULL,
 249	0x00f6f600f600f6f6ULL, 0x0007070007000707ULL, 0x00a7a700a700a7a7ULL,
 250	0x0027270027002727ULL, 0x008e8e008e008e8eULL, 0x00b2b200b200b2b2ULL,
 251	0x0049490049004949ULL, 0x00dede00de00dedeULL, 0x0043430043004343ULL,
 252	0x005c5c005c005c5cULL, 0x00d7d700d700d7d7ULL, 0x00c7c700c700c7c7ULL,
 253	0x003e3e003e003e3eULL, 0x00f5f500f500f5f5ULL, 0x008f8f008f008f8fULL,
 254	0x0067670067006767ULL, 0x001f1f001f001f1fULL, 0x0018180018001818ULL,
 255	0x006e6e006e006e6eULL, 0x00afaf00af00afafULL, 0x002f2f002f002f2fULL,
 256	0x00e2e200e200e2e2ULL, 0x0085850085008585ULL, 0x000d0d000d000d0dULL,
 257	0x0053530053005353ULL, 0x00f0f000f000f0f0ULL, 0x009c9c009c009c9cULL,
 258	0x0065650065006565ULL, 0x00eaea00ea00eaeaULL, 0x00a3a300a300a3a3ULL,
 259	0x00aeae00ae00aeaeULL, 0x009e9e009e009e9eULL, 0x00ecec00ec00ececULL,
 260	0x0080800080008080ULL, 0x002d2d002d002d2dULL, 0x006b6b006b006b6bULL,
 261	0x00a8a800a800a8a8ULL, 0x002b2b002b002b2bULL, 0x0036360036003636ULL,
 262	0x00a6a600a600a6a6ULL, 0x00c5c500c500c5c5ULL, 0x0086860086008686ULL,
 263	0x004d4d004d004d4dULL, 0x0033330033003333ULL, 0x00fdfd00fd00fdfdULL,
 264	0x0066660066006666ULL, 0x0058580058005858ULL, 0x0096960096009696ULL,
 265	0x003a3a003a003a3aULL, 0x0009090009000909ULL, 0x0095950095009595ULL,
 266	0x0010100010001010ULL, 0x0078780078007878ULL, 0x00d8d800d800d8d8ULL,
 267	0x0042420042004242ULL, 0x00cccc00cc00ccccULL, 0x00efef00ef00efefULL,
 268	0x0026260026002626ULL, 0x00e5e500e500e5e5ULL, 0x0061610061006161ULL,
 269	0x001a1a001a001a1aULL, 0x003f3f003f003f3fULL, 0x003b3b003b003b3bULL,
 270	0x0082820082008282ULL, 0x00b6b600b600b6b6ULL, 0x00dbdb00db00dbdbULL,
 271	0x00d4d400d400d4d4ULL, 0x0098980098009898ULL, 0x00e8e800e800e8e8ULL,
 272	0x008b8b008b008b8bULL, 0x0002020002000202ULL, 0x00ebeb00eb00ebebULL,
 273	0x000a0a000a000a0aULL, 0x002c2c002c002c2cULL, 0x001d1d001d001d1dULL,
 274	0x00b0b000b000b0b0ULL, 0x006f6f006f006f6fULL, 0x008d8d008d008d8dULL,
 275	0x0088880088008888ULL, 0x000e0e000e000e0eULL, 0x0019190019001919ULL,
 276	0x0087870087008787ULL, 0x004e4e004e004e4eULL, 0x000b0b000b000b0bULL,
 277	0x00a9a900a900a9a9ULL, 0x000c0c000c000c0cULL, 0x0079790079007979ULL,
 278	0x0011110011001111ULL, 0x007f7f007f007f7fULL, 0x0022220022002222ULL,
 279	0x00e7e700e700e7e7ULL, 0x0059590059005959ULL, 0x00e1e100e100e1e1ULL,
 280	0x00dada00da00dadaULL, 0x003d3d003d003d3dULL, 0x00c8c800c800c8c8ULL,
 281	0x0012120012001212ULL, 0x0004040004000404ULL, 0x0074740074007474ULL,
 282	0x0054540054005454ULL, 0x0030300030003030ULL, 0x007e7e007e007e7eULL,
 283	0x00b4b400b400b4b4ULL, 0x0028280028002828ULL, 0x0055550055005555ULL,
 284	0x0068680068006868ULL, 0x0050500050005050ULL, 0x00bebe00be00bebeULL,
 285	0x00d0d000d000d0d0ULL, 0x00c4c400c400c4c4ULL, 0x0031310031003131ULL,
 286	0x00cbcb00cb00cbcbULL, 0x002a2a002a002a2aULL, 0x00adad00ad00adadULL,
 287	0x000f0f000f000f0fULL, 0x00caca00ca00cacaULL, 0x0070700070007070ULL,
 288	0x00ffff00ff00ffffULL, 0x0032320032003232ULL, 0x0069690069006969ULL,
 289	0x0008080008000808ULL, 0x0062620062006262ULL, 0x0000000000000000ULL,
 290	0x0024240024002424ULL, 0x00d1d100d100d1d1ULL, 0x00fbfb00fb00fbfbULL,
 291	0x00baba00ba00babaULL, 0x00eded00ed00ededULL, 0x0045450045004545ULL,
 292	0x0081810081008181ULL, 0x0073730073007373ULL, 0x006d6d006d006d6dULL,
 293	0x0084840084008484ULL, 0x009f9f009f009f9fULL, 0x00eeee00ee00eeeeULL,
 294	0x004a4a004a004a4aULL, 0x00c3c300c300c3c3ULL, 0x002e2e002e002e2eULL,
 295	0x00c1c100c100c1c1ULL, 0x0001010001000101ULL, 0x00e6e600e600e6e6ULL,
 296	0x0025250025002525ULL, 0x0048480048004848ULL, 0x0099990099009999ULL,
 297	0x00b9b900b900b9b9ULL, 0x00b3b300b300b3b3ULL, 0x007b7b007b007b7bULL,
 298	0x00f9f900f900f9f9ULL, 0x00cece00ce00ceceULL, 0x00bfbf00bf00bfbfULL,
 299	0x00dfdf00df00dfdfULL, 0x0071710071007171ULL, 0x0029290029002929ULL,
 300	0x00cdcd00cd00cdcdULL, 0x006c6c006c006c6cULL, 0x0013130013001313ULL,
 301	0x0064640064006464ULL, 0x009b9b009b009b9bULL, 0x0063630063006363ULL,
 302	0x009d9d009d009d9dULL, 0x00c0c000c000c0c0ULL, 0x004b4b004b004b4bULL,
 303	0x00b7b700b700b7b7ULL, 0x00a5a500a500a5a5ULL, 0x0089890089008989ULL,
 304	0x005f5f005f005f5fULL, 0x00b1b100b100b1b1ULL, 0x0017170017001717ULL,
 305	0x00f4f400f400f4f4ULL, 0x00bcbc00bc00bcbcULL, 0x00d3d300d300d3d3ULL,
 306	0x0046460046004646ULL, 0x00cfcf00cf00cfcfULL, 0x0037370037003737ULL,
 307	0x005e5e005e005e5eULL, 0x0047470047004747ULL, 0x0094940094009494ULL,
 308	0x00fafa00fa00fafaULL, 0x00fcfc00fc00fcfcULL, 0x005b5b005b005b5bULL,
 309	0x0097970097009797ULL, 0x00fefe00fe00fefeULL, 0x005a5a005a005a5aULL,
 310	0x00acac00ac00acacULL, 0x003c3c003c003c3cULL, 0x004c4c004c004c4cULL,
 311	0x0003030003000303ULL, 0x0035350035003535ULL, 0x00f3f300f300f3f3ULL,
 312	0x0023230023002323ULL, 0x00b8b800b800b8b8ULL, 0x005d5d005d005d5dULL,
 313	0x006a6a006a006a6aULL, 0x0092920092009292ULL, 0x00d5d500d500d5d5ULL,
 314	0x0021210021002121ULL, 0x0044440044004444ULL, 0x0051510051005151ULL,
 315	0x00c6c600c600c6c6ULL, 0x007d7d007d007d7dULL, 0x0039390039003939ULL,
 316	0x0083830083008383ULL, 0x00dcdc00dc00dcdcULL, 0x00aaaa00aa00aaaaULL,
 317	0x007c7c007c007c7cULL, 0x0077770077007777ULL, 0x0056560056005656ULL,
 318	0x0005050005000505ULL, 0x001b1b001b001b1bULL, 0x00a4a400a400a4a4ULL,
 319	0x0015150015001515ULL, 0x0034340034003434ULL, 0x001e1e001e001e1eULL,
 320	0x001c1c001c001c1cULL, 0x00f8f800f800f8f8ULL, 0x0052520052005252ULL,
 321	0x0020200020002020ULL, 0x0014140014001414ULL, 0x00e9e900e900e9e9ULL,
 322	0x00bdbd00bd00bdbdULL, 0x00dddd00dd00ddddULL, 0x00e4e400e400e4e4ULL,
 323	0x00a1a100a100a1a1ULL, 0x00e0e000e000e0e0ULL, 0x008a8a008a008a8aULL,
 324	0x00f1f100f100f1f1ULL, 0x00d6d600d600d6d6ULL, 0x007a7a007a007a7aULL,
 325	0x00bbbb00bb00bbbbULL, 0x00e3e300e300e3e3ULL, 0x0040400040004040ULL,
 326	0x004f4f004f004f4fULL,
 327};
 328
 329__visible const u64 camellia_sp00444404[256] = {
 330	0x0000707070700070ULL, 0x00002c2c2c2c002cULL, 0x0000b3b3b3b300b3ULL,
 331	0x0000c0c0c0c000c0ULL, 0x0000e4e4e4e400e4ULL, 0x0000575757570057ULL,
 332	0x0000eaeaeaea00eaULL, 0x0000aeaeaeae00aeULL, 0x0000232323230023ULL,
 333	0x00006b6b6b6b006bULL, 0x0000454545450045ULL, 0x0000a5a5a5a500a5ULL,
 334	0x0000edededed00edULL, 0x00004f4f4f4f004fULL, 0x00001d1d1d1d001dULL,
 335	0x0000929292920092ULL, 0x0000868686860086ULL, 0x0000afafafaf00afULL,
 336	0x00007c7c7c7c007cULL, 0x00001f1f1f1f001fULL, 0x00003e3e3e3e003eULL,
 337	0x0000dcdcdcdc00dcULL, 0x00005e5e5e5e005eULL, 0x00000b0b0b0b000bULL,
 338	0x0000a6a6a6a600a6ULL, 0x0000393939390039ULL, 0x0000d5d5d5d500d5ULL,
 339	0x00005d5d5d5d005dULL, 0x0000d9d9d9d900d9ULL, 0x00005a5a5a5a005aULL,
 340	0x0000515151510051ULL, 0x00006c6c6c6c006cULL, 0x00008b8b8b8b008bULL,
 341	0x00009a9a9a9a009aULL, 0x0000fbfbfbfb00fbULL, 0x0000b0b0b0b000b0ULL,
 342	0x0000747474740074ULL, 0x00002b2b2b2b002bULL, 0x0000f0f0f0f000f0ULL,
 343	0x0000848484840084ULL, 0x0000dfdfdfdf00dfULL, 0x0000cbcbcbcb00cbULL,
 344	0x0000343434340034ULL, 0x0000767676760076ULL, 0x00006d6d6d6d006dULL,
 345	0x0000a9a9a9a900a9ULL, 0x0000d1d1d1d100d1ULL, 0x0000040404040004ULL,
 346	0x0000141414140014ULL, 0x00003a3a3a3a003aULL, 0x0000dededede00deULL,
 347	0x0000111111110011ULL, 0x0000323232320032ULL, 0x00009c9c9c9c009cULL,
 348	0x0000535353530053ULL, 0x0000f2f2f2f200f2ULL, 0x0000fefefefe00feULL,
 349	0x0000cfcfcfcf00cfULL, 0x0000c3c3c3c300c3ULL, 0x00007a7a7a7a007aULL,
 350	0x0000242424240024ULL, 0x0000e8e8e8e800e8ULL, 0x0000606060600060ULL,
 351	0x0000696969690069ULL, 0x0000aaaaaaaa00aaULL, 0x0000a0a0a0a000a0ULL,
 352	0x0000a1a1a1a100a1ULL, 0x0000626262620062ULL, 0x0000545454540054ULL,
 353	0x00001e1e1e1e001eULL, 0x0000e0e0e0e000e0ULL, 0x0000646464640064ULL,
 354	0x0000101010100010ULL, 0x0000000000000000ULL, 0x0000a3a3a3a300a3ULL,
 355	0x0000757575750075ULL, 0x00008a8a8a8a008aULL, 0x0000e6e6e6e600e6ULL,
 356	0x0000090909090009ULL, 0x0000dddddddd00ddULL, 0x0000878787870087ULL,
 357	0x0000838383830083ULL, 0x0000cdcdcdcd00cdULL, 0x0000909090900090ULL,
 358	0x0000737373730073ULL, 0x0000f6f6f6f600f6ULL, 0x00009d9d9d9d009dULL,
 359	0x0000bfbfbfbf00bfULL, 0x0000525252520052ULL, 0x0000d8d8d8d800d8ULL,
 360	0x0000c8c8c8c800c8ULL, 0x0000c6c6c6c600c6ULL, 0x0000818181810081ULL,
 361	0x00006f6f6f6f006fULL, 0x0000131313130013ULL, 0x0000636363630063ULL,
 362	0x0000e9e9e9e900e9ULL, 0x0000a7a7a7a700a7ULL, 0x00009f9f9f9f009fULL,
 363	0x0000bcbcbcbc00bcULL, 0x0000292929290029ULL, 0x0000f9f9f9f900f9ULL,
 364	0x00002f2f2f2f002fULL, 0x0000b4b4b4b400b4ULL, 0x0000787878780078ULL,
 365	0x0000060606060006ULL, 0x0000e7e7e7e700e7ULL, 0x0000717171710071ULL,
 366	0x0000d4d4d4d400d4ULL, 0x0000abababab00abULL, 0x0000888888880088ULL,
 367	0x00008d8d8d8d008dULL, 0x0000727272720072ULL, 0x0000b9b9b9b900b9ULL,
 368	0x0000f8f8f8f800f8ULL, 0x0000acacacac00acULL, 0x0000363636360036ULL,
 369	0x00002a2a2a2a002aULL, 0x00003c3c3c3c003cULL, 0x0000f1f1f1f100f1ULL,
 370	0x0000404040400040ULL, 0x0000d3d3d3d300d3ULL, 0x0000bbbbbbbb00bbULL,
 371	0x0000434343430043ULL, 0x0000151515150015ULL, 0x0000adadadad00adULL,
 372	0x0000777777770077ULL, 0x0000808080800080ULL, 0x0000828282820082ULL,
 373	0x0000ecececec00ecULL, 0x0000272727270027ULL, 0x0000e5e5e5e500e5ULL,
 374	0x0000858585850085ULL, 0x0000353535350035ULL, 0x00000c0c0c0c000cULL,
 375	0x0000414141410041ULL, 0x0000efefefef00efULL, 0x0000939393930093ULL,
 376	0x0000191919190019ULL, 0x0000212121210021ULL, 0x00000e0e0e0e000eULL,
 377	0x00004e4e4e4e004eULL, 0x0000656565650065ULL, 0x0000bdbdbdbd00bdULL,
 378	0x0000b8b8b8b800b8ULL, 0x00008f8f8f8f008fULL, 0x0000ebebebeb00ebULL,
 379	0x0000cececece00ceULL, 0x0000303030300030ULL, 0x00005f5f5f5f005fULL,
 380	0x0000c5c5c5c500c5ULL, 0x00001a1a1a1a001aULL, 0x0000e1e1e1e100e1ULL,
 381	0x0000cacacaca00caULL, 0x0000474747470047ULL, 0x00003d3d3d3d003dULL,
 382	0x0000010101010001ULL, 0x0000d6d6d6d600d6ULL, 0x0000565656560056ULL,
 383	0x00004d4d4d4d004dULL, 0x00000d0d0d0d000dULL, 0x0000666666660066ULL,
 384	0x0000cccccccc00ccULL, 0x00002d2d2d2d002dULL, 0x0000121212120012ULL,
 385	0x0000202020200020ULL, 0x0000b1b1b1b100b1ULL, 0x0000999999990099ULL,
 386	0x00004c4c4c4c004cULL, 0x0000c2c2c2c200c2ULL, 0x00007e7e7e7e007eULL,
 387	0x0000050505050005ULL, 0x0000b7b7b7b700b7ULL, 0x0000313131310031ULL,
 388	0x0000171717170017ULL, 0x0000d7d7d7d700d7ULL, 0x0000585858580058ULL,
 389	0x0000616161610061ULL, 0x00001b1b1b1b001bULL, 0x00001c1c1c1c001cULL,
 390	0x00000f0f0f0f000fULL, 0x0000161616160016ULL, 0x0000181818180018ULL,
 391	0x0000222222220022ULL, 0x0000444444440044ULL, 0x0000b2b2b2b200b2ULL,
 392	0x0000b5b5b5b500b5ULL, 0x0000919191910091ULL, 0x0000080808080008ULL,
 393	0x0000a8a8a8a800a8ULL, 0x0000fcfcfcfc00fcULL, 0x0000505050500050ULL,
 394	0x0000d0d0d0d000d0ULL, 0x00007d7d7d7d007dULL, 0x0000898989890089ULL,
 395	0x0000979797970097ULL, 0x00005b5b5b5b005bULL, 0x0000959595950095ULL,
 396	0x0000ffffffff00ffULL, 0x0000d2d2d2d200d2ULL, 0x0000c4c4c4c400c4ULL,
 397	0x0000484848480048ULL, 0x0000f7f7f7f700f7ULL, 0x0000dbdbdbdb00dbULL,
 398	0x0000030303030003ULL, 0x0000dadadada00daULL, 0x00003f3f3f3f003fULL,
 399	0x0000949494940094ULL, 0x00005c5c5c5c005cULL, 0x0000020202020002ULL,
 400	0x00004a4a4a4a004aULL, 0x0000333333330033ULL, 0x0000676767670067ULL,
 401	0x0000f3f3f3f300f3ULL, 0x00007f7f7f7f007fULL, 0x0000e2e2e2e200e2ULL,
 402	0x00009b9b9b9b009bULL, 0x0000262626260026ULL, 0x0000373737370037ULL,
 403	0x00003b3b3b3b003bULL, 0x0000969696960096ULL, 0x00004b4b4b4b004bULL,
 404	0x0000bebebebe00beULL, 0x00002e2e2e2e002eULL, 0x0000797979790079ULL,
 405	0x00008c8c8c8c008cULL, 0x00006e6e6e6e006eULL, 0x00008e8e8e8e008eULL,
 406	0x0000f5f5f5f500f5ULL, 0x0000b6b6b6b600b6ULL, 0x0000fdfdfdfd00fdULL,
 407	0x0000595959590059ULL, 0x0000989898980098ULL, 0x00006a6a6a6a006aULL,
 408	0x0000464646460046ULL, 0x0000babababa00baULL, 0x0000252525250025ULL,
 409	0x0000424242420042ULL, 0x0000a2a2a2a200a2ULL, 0x0000fafafafa00faULL,
 410	0x0000070707070007ULL, 0x0000555555550055ULL, 0x0000eeeeeeee00eeULL,
 411	0x00000a0a0a0a000aULL, 0x0000494949490049ULL, 0x0000686868680068ULL,
 412	0x0000383838380038ULL, 0x0000a4a4a4a400a4ULL, 0x0000282828280028ULL,
 413	0x00007b7b7b7b007bULL, 0x0000c9c9c9c900c9ULL, 0x0000c1c1c1c100c1ULL,
 414	0x0000e3e3e3e300e3ULL, 0x0000f4f4f4f400f4ULL, 0x0000c7c7c7c700c7ULL,
 415	0x00009e9e9e9e009eULL,
 416};
 417
 418__visible const u64 camellia_sp02220222[256] = {
 419	0x00e0e0e000e0e0e0ULL, 0x0005050500050505ULL, 0x0058585800585858ULL,
 420	0x00d9d9d900d9d9d9ULL, 0x0067676700676767ULL, 0x004e4e4e004e4e4eULL,
 421	0x0081818100818181ULL, 0x00cbcbcb00cbcbcbULL, 0x00c9c9c900c9c9c9ULL,
 422	0x000b0b0b000b0b0bULL, 0x00aeaeae00aeaeaeULL, 0x006a6a6a006a6a6aULL,
 423	0x00d5d5d500d5d5d5ULL, 0x0018181800181818ULL, 0x005d5d5d005d5d5dULL,
 424	0x0082828200828282ULL, 0x0046464600464646ULL, 0x00dfdfdf00dfdfdfULL,
 425	0x00d6d6d600d6d6d6ULL, 0x0027272700272727ULL, 0x008a8a8a008a8a8aULL,
 426	0x0032323200323232ULL, 0x004b4b4b004b4b4bULL, 0x0042424200424242ULL,
 427	0x00dbdbdb00dbdbdbULL, 0x001c1c1c001c1c1cULL, 0x009e9e9e009e9e9eULL,
 428	0x009c9c9c009c9c9cULL, 0x003a3a3a003a3a3aULL, 0x00cacaca00cacacaULL,
 429	0x0025252500252525ULL, 0x007b7b7b007b7b7bULL, 0x000d0d0d000d0d0dULL,
 430	0x0071717100717171ULL, 0x005f5f5f005f5f5fULL, 0x001f1f1f001f1f1fULL,
 431	0x00f8f8f800f8f8f8ULL, 0x00d7d7d700d7d7d7ULL, 0x003e3e3e003e3e3eULL,
 432	0x009d9d9d009d9d9dULL, 0x007c7c7c007c7c7cULL, 0x0060606000606060ULL,
 433	0x00b9b9b900b9b9b9ULL, 0x00bebebe00bebebeULL, 0x00bcbcbc00bcbcbcULL,
 434	0x008b8b8b008b8b8bULL, 0x0016161600161616ULL, 0x0034343400343434ULL,
 435	0x004d4d4d004d4d4dULL, 0x00c3c3c300c3c3c3ULL, 0x0072727200727272ULL,
 436	0x0095959500959595ULL, 0x00ababab00abababULL, 0x008e8e8e008e8e8eULL,
 437	0x00bababa00bababaULL, 0x007a7a7a007a7a7aULL, 0x00b3b3b300b3b3b3ULL,
 438	0x0002020200020202ULL, 0x00b4b4b400b4b4b4ULL, 0x00adadad00adadadULL,
 439	0x00a2a2a200a2a2a2ULL, 0x00acacac00acacacULL, 0x00d8d8d800d8d8d8ULL,
 440	0x009a9a9a009a9a9aULL, 0x0017171700171717ULL, 0x001a1a1a001a1a1aULL,
 441	0x0035353500353535ULL, 0x00cccccc00ccccccULL, 0x00f7f7f700f7f7f7ULL,
 442	0x0099999900999999ULL, 0x0061616100616161ULL, 0x005a5a5a005a5a5aULL,
 443	0x00e8e8e800e8e8e8ULL, 0x0024242400242424ULL, 0x0056565600565656ULL,
 444	0x0040404000404040ULL, 0x00e1e1e100e1e1e1ULL, 0x0063636300636363ULL,
 445	0x0009090900090909ULL, 0x0033333300333333ULL, 0x00bfbfbf00bfbfbfULL,
 446	0x0098989800989898ULL, 0x0097979700979797ULL, 0x0085858500858585ULL,
 447	0x0068686800686868ULL, 0x00fcfcfc00fcfcfcULL, 0x00ececec00ecececULL,
 448	0x000a0a0a000a0a0aULL, 0x00dadada00dadadaULL, 0x006f6f6f006f6f6fULL,
 449	0x0053535300535353ULL, 0x0062626200626262ULL, 0x00a3a3a300a3a3a3ULL,
 450	0x002e2e2e002e2e2eULL, 0x0008080800080808ULL, 0x00afafaf00afafafULL,
 451	0x0028282800282828ULL, 0x00b0b0b000b0b0b0ULL, 0x0074747400747474ULL,
 452	0x00c2c2c200c2c2c2ULL, 0x00bdbdbd00bdbdbdULL, 0x0036363600363636ULL,
 453	0x0022222200222222ULL, 0x0038383800383838ULL, 0x0064646400646464ULL,
 454	0x001e1e1e001e1e1eULL, 0x0039393900393939ULL, 0x002c2c2c002c2c2cULL,
 455	0x00a6a6a600a6a6a6ULL, 0x0030303000303030ULL, 0x00e5e5e500e5e5e5ULL,
 456	0x0044444400444444ULL, 0x00fdfdfd00fdfdfdULL, 0x0088888800888888ULL,
 457	0x009f9f9f009f9f9fULL, 0x0065656500656565ULL, 0x0087878700878787ULL,
 458	0x006b6b6b006b6b6bULL, 0x00f4f4f400f4f4f4ULL, 0x0023232300232323ULL,
 459	0x0048484800484848ULL, 0x0010101000101010ULL, 0x00d1d1d100d1d1d1ULL,
 460	0x0051515100515151ULL, 0x00c0c0c000c0c0c0ULL, 0x00f9f9f900f9f9f9ULL,
 461	0x00d2d2d200d2d2d2ULL, 0x00a0a0a000a0a0a0ULL, 0x0055555500555555ULL,
 462	0x00a1a1a100a1a1a1ULL, 0x0041414100414141ULL, 0x00fafafa00fafafaULL,
 463	0x0043434300434343ULL, 0x0013131300131313ULL, 0x00c4c4c400c4c4c4ULL,
 464	0x002f2f2f002f2f2fULL, 0x00a8a8a800a8a8a8ULL, 0x00b6b6b600b6b6b6ULL,
 465	0x003c3c3c003c3c3cULL, 0x002b2b2b002b2b2bULL, 0x00c1c1c100c1c1c1ULL,
 466	0x00ffffff00ffffffULL, 0x00c8c8c800c8c8c8ULL, 0x00a5a5a500a5a5a5ULL,
 467	0x0020202000202020ULL, 0x0089898900898989ULL, 0x0000000000000000ULL,
 468	0x0090909000909090ULL, 0x0047474700474747ULL, 0x00efefef00efefefULL,
 469	0x00eaeaea00eaeaeaULL, 0x00b7b7b700b7b7b7ULL, 0x0015151500151515ULL,
 470	0x0006060600060606ULL, 0x00cdcdcd00cdcdcdULL, 0x00b5b5b500b5b5b5ULL,
 471	0x0012121200121212ULL, 0x007e7e7e007e7e7eULL, 0x00bbbbbb00bbbbbbULL,
 472	0x0029292900292929ULL, 0x000f0f0f000f0f0fULL, 0x00b8b8b800b8b8b8ULL,
 473	0x0007070700070707ULL, 0x0004040400040404ULL, 0x009b9b9b009b9b9bULL,
 474	0x0094949400949494ULL, 0x0021212100212121ULL, 0x0066666600666666ULL,
 475	0x00e6e6e600e6e6e6ULL, 0x00cecece00cececeULL, 0x00ededed00edededULL,
 476	0x00e7e7e700e7e7e7ULL, 0x003b3b3b003b3b3bULL, 0x00fefefe00fefefeULL,
 477	0x007f7f7f007f7f7fULL, 0x00c5c5c500c5c5c5ULL, 0x00a4a4a400a4a4a4ULL,
 478	0x0037373700373737ULL, 0x00b1b1b100b1b1b1ULL, 0x004c4c4c004c4c4cULL,
 479	0x0091919100919191ULL, 0x006e6e6e006e6e6eULL, 0x008d8d8d008d8d8dULL,
 480	0x0076767600767676ULL, 0x0003030300030303ULL, 0x002d2d2d002d2d2dULL,
 481	0x00dedede00dededeULL, 0x0096969600969696ULL, 0x0026262600262626ULL,
 482	0x007d7d7d007d7d7dULL, 0x00c6c6c600c6c6c6ULL, 0x005c5c5c005c5c5cULL,
 483	0x00d3d3d300d3d3d3ULL, 0x00f2f2f200f2f2f2ULL, 0x004f4f4f004f4f4fULL,
 484	0x0019191900191919ULL, 0x003f3f3f003f3f3fULL, 0x00dcdcdc00dcdcdcULL,
 485	0x0079797900797979ULL, 0x001d1d1d001d1d1dULL, 0x0052525200525252ULL,
 486	0x00ebebeb00ebebebULL, 0x00f3f3f300f3f3f3ULL, 0x006d6d6d006d6d6dULL,
 487	0x005e5e5e005e5e5eULL, 0x00fbfbfb00fbfbfbULL, 0x0069696900696969ULL,
 488	0x00b2b2b200b2b2b2ULL, 0x00f0f0f000f0f0f0ULL, 0x0031313100313131ULL,
 489	0x000c0c0c000c0c0cULL, 0x00d4d4d400d4d4d4ULL, 0x00cfcfcf00cfcfcfULL,
 490	0x008c8c8c008c8c8cULL, 0x00e2e2e200e2e2e2ULL, 0x0075757500757575ULL,
 491	0x00a9a9a900a9a9a9ULL, 0x004a4a4a004a4a4aULL, 0x0057575700575757ULL,
 492	0x0084848400848484ULL, 0x0011111100111111ULL, 0x0045454500454545ULL,
 493	0x001b1b1b001b1b1bULL, 0x00f5f5f500f5f5f5ULL, 0x00e4e4e400e4e4e4ULL,
 494	0x000e0e0e000e0e0eULL, 0x0073737300737373ULL, 0x00aaaaaa00aaaaaaULL,
 495	0x00f1f1f100f1f1f1ULL, 0x00dddddd00ddddddULL, 0x0059595900595959ULL,
 496	0x0014141400141414ULL, 0x006c6c6c006c6c6cULL, 0x0092929200929292ULL,
 497	0x0054545400545454ULL, 0x00d0d0d000d0d0d0ULL, 0x0078787800787878ULL,
 498	0x0070707000707070ULL, 0x00e3e3e300e3e3e3ULL, 0x0049494900494949ULL,
 499	0x0080808000808080ULL, 0x0050505000505050ULL, 0x00a7a7a700a7a7a7ULL,
 500	0x00f6f6f600f6f6f6ULL, 0x0077777700777777ULL, 0x0093939300939393ULL,
 501	0x0086868600868686ULL, 0x0083838300838383ULL, 0x002a2a2a002a2a2aULL,
 502	0x00c7c7c700c7c7c7ULL, 0x005b5b5b005b5b5bULL, 0x00e9e9e900e9e9e9ULL,
 503	0x00eeeeee00eeeeeeULL, 0x008f8f8f008f8f8fULL, 0x0001010100010101ULL,
 504	0x003d3d3d003d3d3dULL,
 505};
 506
 507__visible const u64 camellia_sp30333033[256] = {
 508	0x3800383838003838ULL, 0x4100414141004141ULL, 0x1600161616001616ULL,
 509	0x7600767676007676ULL, 0xd900d9d9d900d9d9ULL, 0x9300939393009393ULL,
 510	0x6000606060006060ULL, 0xf200f2f2f200f2f2ULL, 0x7200727272007272ULL,
 511	0xc200c2c2c200c2c2ULL, 0xab00ababab00ababULL, 0x9a009a9a9a009a9aULL,
 512	0x7500757575007575ULL, 0x0600060606000606ULL, 0x5700575757005757ULL,
 513	0xa000a0a0a000a0a0ULL, 0x9100919191009191ULL, 0xf700f7f7f700f7f7ULL,
 514	0xb500b5b5b500b5b5ULL, 0xc900c9c9c900c9c9ULL, 0xa200a2a2a200a2a2ULL,
 515	0x8c008c8c8c008c8cULL, 0xd200d2d2d200d2d2ULL, 0x9000909090009090ULL,
 516	0xf600f6f6f600f6f6ULL, 0x0700070707000707ULL, 0xa700a7a7a700a7a7ULL,
 517	0x2700272727002727ULL, 0x8e008e8e8e008e8eULL, 0xb200b2b2b200b2b2ULL,
 518	0x4900494949004949ULL, 0xde00dedede00dedeULL, 0x4300434343004343ULL,
 519	0x5c005c5c5c005c5cULL, 0xd700d7d7d700d7d7ULL, 0xc700c7c7c700c7c7ULL,
 520	0x3e003e3e3e003e3eULL, 0xf500f5f5f500f5f5ULL, 0x8f008f8f8f008f8fULL,
 521	0x6700676767006767ULL, 0x1f001f1f1f001f1fULL, 0x1800181818001818ULL,
 522	0x6e006e6e6e006e6eULL, 0xaf00afafaf00afafULL, 0x2f002f2f2f002f2fULL,
 523	0xe200e2e2e200e2e2ULL, 0x8500858585008585ULL, 0x0d000d0d0d000d0dULL,
 524	0x5300535353005353ULL, 0xf000f0f0f000f0f0ULL, 0x9c009c9c9c009c9cULL,
 525	0x6500656565006565ULL, 0xea00eaeaea00eaeaULL, 0xa300a3a3a300a3a3ULL,
 526	0xae00aeaeae00aeaeULL, 0x9e009e9e9e009e9eULL, 0xec00ececec00ececULL,
 527	0x8000808080008080ULL, 0x2d002d2d2d002d2dULL, 0x6b006b6b6b006b6bULL,
 528	0xa800a8a8a800a8a8ULL, 0x2b002b2b2b002b2bULL, 0x3600363636003636ULL,
 529	0xa600a6a6a600a6a6ULL, 0xc500c5c5c500c5c5ULL, 0x8600868686008686ULL,
 530	0x4d004d4d4d004d4dULL, 0x3300333333003333ULL, 0xfd00fdfdfd00fdfdULL,
 531	0x6600666666006666ULL, 0x5800585858005858ULL, 0x9600969696009696ULL,
 532	0x3a003a3a3a003a3aULL, 0x0900090909000909ULL, 0x9500959595009595ULL,
 533	0x1000101010001010ULL, 0x7800787878007878ULL, 0xd800d8d8d800d8d8ULL,
 534	0x4200424242004242ULL, 0xcc00cccccc00ccccULL, 0xef00efefef00efefULL,
 535	0x2600262626002626ULL, 0xe500e5e5e500e5e5ULL, 0x6100616161006161ULL,
 536	0x1a001a1a1a001a1aULL, 0x3f003f3f3f003f3fULL, 0x3b003b3b3b003b3bULL,
 537	0x8200828282008282ULL, 0xb600b6b6b600b6b6ULL, 0xdb00dbdbdb00dbdbULL,
 538	0xd400d4d4d400d4d4ULL, 0x9800989898009898ULL, 0xe800e8e8e800e8e8ULL,
 539	0x8b008b8b8b008b8bULL, 0x0200020202000202ULL, 0xeb00ebebeb00ebebULL,
 540	0x0a000a0a0a000a0aULL, 0x2c002c2c2c002c2cULL, 0x1d001d1d1d001d1dULL,
 541	0xb000b0b0b000b0b0ULL, 0x6f006f6f6f006f6fULL, 0x8d008d8d8d008d8dULL,
 542	0x8800888888008888ULL, 0x0e000e0e0e000e0eULL, 0x1900191919001919ULL,
 543	0x8700878787008787ULL, 0x4e004e4e4e004e4eULL, 0x0b000b0b0b000b0bULL,
 544	0xa900a9a9a900a9a9ULL, 0x0c000c0c0c000c0cULL, 0x7900797979007979ULL,
 545	0x1100111111001111ULL, 0x7f007f7f7f007f7fULL, 0x2200222222002222ULL,
 546	0xe700e7e7e700e7e7ULL, 0x5900595959005959ULL, 0xe100e1e1e100e1e1ULL,
 547	0xda00dadada00dadaULL, 0x3d003d3d3d003d3dULL, 0xc800c8c8c800c8c8ULL,
 548	0x1200121212001212ULL, 0x0400040404000404ULL, 0x7400747474007474ULL,
 549	0x5400545454005454ULL, 0x3000303030003030ULL, 0x7e007e7e7e007e7eULL,
 550	0xb400b4b4b400b4b4ULL, 0x2800282828002828ULL, 0x5500555555005555ULL,
 551	0x6800686868006868ULL, 0x5000505050005050ULL, 0xbe00bebebe00bebeULL,
 552	0xd000d0d0d000d0d0ULL, 0xc400c4c4c400c4c4ULL, 0x3100313131003131ULL,
 553	0xcb00cbcbcb00cbcbULL, 0x2a002a2a2a002a2aULL, 0xad00adadad00adadULL,
 554	0x0f000f0f0f000f0fULL, 0xca00cacaca00cacaULL, 0x7000707070007070ULL,
 555	0xff00ffffff00ffffULL, 0x3200323232003232ULL, 0x6900696969006969ULL,
 556	0x0800080808000808ULL, 0x6200626262006262ULL, 0x0000000000000000ULL,
 557	0x2400242424002424ULL, 0xd100d1d1d100d1d1ULL, 0xfb00fbfbfb00fbfbULL,
 558	0xba00bababa00babaULL, 0xed00ededed00ededULL, 0x4500454545004545ULL,
 559	0x8100818181008181ULL, 0x7300737373007373ULL, 0x6d006d6d6d006d6dULL,
 560	0x8400848484008484ULL, 0x9f009f9f9f009f9fULL, 0xee00eeeeee00eeeeULL,
 561	0x4a004a4a4a004a4aULL, 0xc300c3c3c300c3c3ULL, 0x2e002e2e2e002e2eULL,
 562	0xc100c1c1c100c1c1ULL, 0x0100010101000101ULL, 0xe600e6e6e600e6e6ULL,
 563	0x2500252525002525ULL, 0x4800484848004848ULL, 0x9900999999009999ULL,
 564	0xb900b9b9b900b9b9ULL, 0xb300b3b3b300b3b3ULL, 0x7b007b7b7b007b7bULL,
 565	0xf900f9f9f900f9f9ULL, 0xce00cecece00ceceULL, 0xbf00bfbfbf00bfbfULL,
 566	0xdf00dfdfdf00dfdfULL, 0x7100717171007171ULL, 0x2900292929002929ULL,
 567	0xcd00cdcdcd00cdcdULL, 0x6c006c6c6c006c6cULL, 0x1300131313001313ULL,
 568	0x6400646464006464ULL, 0x9b009b9b9b009b9bULL, 0x6300636363006363ULL,
 569	0x9d009d9d9d009d9dULL, 0xc000c0c0c000c0c0ULL, 0x4b004b4b4b004b4bULL,
 570	0xb700b7b7b700b7b7ULL, 0xa500a5a5a500a5a5ULL, 0x8900898989008989ULL,
 571	0x5f005f5f5f005f5fULL, 0xb100b1b1b100b1b1ULL, 0x1700171717001717ULL,
 572	0xf400f4f4f400f4f4ULL, 0xbc00bcbcbc00bcbcULL, 0xd300d3d3d300d3d3ULL,
 573	0x4600464646004646ULL, 0xcf00cfcfcf00cfcfULL, 0x3700373737003737ULL,
 574	0x5e005e5e5e005e5eULL, 0x4700474747004747ULL, 0x9400949494009494ULL,
 575	0xfa00fafafa00fafaULL, 0xfc00fcfcfc00fcfcULL, 0x5b005b5b5b005b5bULL,
 576	0x9700979797009797ULL, 0xfe00fefefe00fefeULL, 0x5a005a5a5a005a5aULL,
 577	0xac00acacac00acacULL, 0x3c003c3c3c003c3cULL, 0x4c004c4c4c004c4cULL,
 578	0x0300030303000303ULL, 0x3500353535003535ULL, 0xf300f3f3f300f3f3ULL,
 579	0x2300232323002323ULL, 0xb800b8b8b800b8b8ULL, 0x5d005d5d5d005d5dULL,
 580	0x6a006a6a6a006a6aULL, 0x9200929292009292ULL, 0xd500d5d5d500d5d5ULL,
 581	0x2100212121002121ULL, 0x4400444444004444ULL, 0x5100515151005151ULL,
 582	0xc600c6c6c600c6c6ULL, 0x7d007d7d7d007d7dULL, 0x3900393939003939ULL,
 583	0x8300838383008383ULL, 0xdc00dcdcdc00dcdcULL, 0xaa00aaaaaa00aaaaULL,
 584	0x7c007c7c7c007c7cULL, 0x7700777777007777ULL, 0x5600565656005656ULL,
 585	0x0500050505000505ULL, 0x1b001b1b1b001b1bULL, 0xa400a4a4a400a4a4ULL,
 586	0x1500151515001515ULL, 0x3400343434003434ULL, 0x1e001e1e1e001e1eULL,
 587	0x1c001c1c1c001c1cULL, 0xf800f8f8f800f8f8ULL, 0x5200525252005252ULL,
 588	0x2000202020002020ULL, 0x1400141414001414ULL, 0xe900e9e9e900e9e9ULL,
 589	0xbd00bdbdbd00bdbdULL, 0xdd00dddddd00ddddULL, 0xe400e4e4e400e4e4ULL,
 590	0xa100a1a1a100a1a1ULL, 0xe000e0e0e000e0e0ULL, 0x8a008a8a8a008a8aULL,
 591	0xf100f1f1f100f1f1ULL, 0xd600d6d6d600d6d6ULL, 0x7a007a7a7a007a7aULL,
 592	0xbb00bbbbbb00bbbbULL, 0xe300e3e3e300e3e3ULL, 0x4000404040004040ULL,
 593	0x4f004f4f4f004f4fULL,
 594};
 595
 596__visible const u64 camellia_sp44044404[256] = {
 597	0x7070007070700070ULL, 0x2c2c002c2c2c002cULL, 0xb3b300b3b3b300b3ULL,
 598	0xc0c000c0c0c000c0ULL, 0xe4e400e4e4e400e4ULL, 0x5757005757570057ULL,
 599	0xeaea00eaeaea00eaULL, 0xaeae00aeaeae00aeULL, 0x2323002323230023ULL,
 600	0x6b6b006b6b6b006bULL, 0x4545004545450045ULL, 0xa5a500a5a5a500a5ULL,
 601	0xeded00ededed00edULL, 0x4f4f004f4f4f004fULL, 0x1d1d001d1d1d001dULL,
 602	0x9292009292920092ULL, 0x8686008686860086ULL, 0xafaf00afafaf00afULL,
 603	0x7c7c007c7c7c007cULL, 0x1f1f001f1f1f001fULL, 0x3e3e003e3e3e003eULL,
 604	0xdcdc00dcdcdc00dcULL, 0x5e5e005e5e5e005eULL, 0x0b0b000b0b0b000bULL,
 605	0xa6a600a6a6a600a6ULL, 0x3939003939390039ULL, 0xd5d500d5d5d500d5ULL,
 606	0x5d5d005d5d5d005dULL, 0xd9d900d9d9d900d9ULL, 0x5a5a005a5a5a005aULL,
 607	0x5151005151510051ULL, 0x6c6c006c6c6c006cULL, 0x8b8b008b8b8b008bULL,
 608	0x9a9a009a9a9a009aULL, 0xfbfb00fbfbfb00fbULL, 0xb0b000b0b0b000b0ULL,
 609	0x7474007474740074ULL, 0x2b2b002b2b2b002bULL, 0xf0f000f0f0f000f0ULL,
 610	0x8484008484840084ULL, 0xdfdf00dfdfdf00dfULL, 0xcbcb00cbcbcb00cbULL,
 611	0x3434003434340034ULL, 0x7676007676760076ULL, 0x6d6d006d6d6d006dULL,
 612	0xa9a900a9a9a900a9ULL, 0xd1d100d1d1d100d1ULL, 0x0404000404040004ULL,
 613	0x1414001414140014ULL, 0x3a3a003a3a3a003aULL, 0xdede00dedede00deULL,
 614	0x1111001111110011ULL, 0x3232003232320032ULL, 0x9c9c009c9c9c009cULL,
 615	0x5353005353530053ULL, 0xf2f200f2f2f200f2ULL, 0xfefe00fefefe00feULL,
 616	0xcfcf00cfcfcf00cfULL, 0xc3c300c3c3c300c3ULL, 0x7a7a007a7a7a007aULL,
 617	0x2424002424240024ULL, 0xe8e800e8e8e800e8ULL, 0x6060006060600060ULL,
 618	0x6969006969690069ULL, 0xaaaa00aaaaaa00aaULL, 0xa0a000a0a0a000a0ULL,
 619	0xa1a100a1a1a100a1ULL, 0x6262006262620062ULL, 0x5454005454540054ULL,
 620	0x1e1e001e1e1e001eULL, 0xe0e000e0e0e000e0ULL, 0x6464006464640064ULL,
 621	0x1010001010100010ULL, 0x0000000000000000ULL, 0xa3a300a3a3a300a3ULL,
 622	0x7575007575750075ULL, 0x8a8a008a8a8a008aULL, 0xe6e600e6e6e600e6ULL,
 623	0x0909000909090009ULL, 0xdddd00dddddd00ddULL, 0x8787008787870087ULL,
 624	0x8383008383830083ULL, 0xcdcd00cdcdcd00cdULL, 0x9090009090900090ULL,
 625	0x7373007373730073ULL, 0xf6f600f6f6f600f6ULL, 0x9d9d009d9d9d009dULL,
 626	0xbfbf00bfbfbf00bfULL, 0x5252005252520052ULL, 0xd8d800d8d8d800d8ULL,
 627	0xc8c800c8c8c800c8ULL, 0xc6c600c6c6c600c6ULL, 0x8181008181810081ULL,
 628	0x6f6f006f6f6f006fULL, 0x1313001313130013ULL, 0x6363006363630063ULL,
 629	0xe9e900e9e9e900e9ULL, 0xa7a700a7a7a700a7ULL, 0x9f9f009f9f9f009fULL,
 630	0xbcbc00bcbcbc00bcULL, 0x2929002929290029ULL, 0xf9f900f9f9f900f9ULL,
 631	0x2f2f002f2f2f002fULL, 0xb4b400b4b4b400b4ULL, 0x7878007878780078ULL,
 632	0x0606000606060006ULL, 0xe7e700e7e7e700e7ULL, 0x7171007171710071ULL,
 633	0xd4d400d4d4d400d4ULL, 0xabab00ababab00abULL, 0x8888008888880088ULL,
 634	0x8d8d008d8d8d008dULL, 0x7272007272720072ULL, 0xb9b900b9b9b900b9ULL,
 635	0xf8f800f8f8f800f8ULL, 0xacac00acacac00acULL, 0x3636003636360036ULL,
 636	0x2a2a002a2a2a002aULL, 0x3c3c003c3c3c003cULL, 0xf1f100f1f1f100f1ULL,
 637	0x4040004040400040ULL, 0xd3d300d3d3d300d3ULL, 0xbbbb00bbbbbb00bbULL,
 638	0x4343004343430043ULL, 0x1515001515150015ULL, 0xadad00adadad00adULL,
 639	0x7777007777770077ULL, 0x8080008080800080ULL, 0x8282008282820082ULL,
 640	0xecec00ececec00ecULL, 0x2727002727270027ULL, 0xe5e500e5e5e500e5ULL,
 641	0x8585008585850085ULL, 0x3535003535350035ULL, 0x0c0c000c0c0c000cULL,
 642	0x4141004141410041ULL, 0xefef00efefef00efULL, 0x9393009393930093ULL,
 643	0x1919001919190019ULL, 0x2121002121210021ULL, 0x0e0e000e0e0e000eULL,
 644	0x4e4e004e4e4e004eULL, 0x6565006565650065ULL, 0xbdbd00bdbdbd00bdULL,
 645	0xb8b800b8b8b800b8ULL, 0x8f8f008f8f8f008fULL, 0xebeb00ebebeb00ebULL,
 646	0xcece00cecece00ceULL, 0x3030003030300030ULL, 0x5f5f005f5f5f005fULL,
 647	0xc5c500c5c5c500c5ULL, 0x1a1a001a1a1a001aULL, 0xe1e100e1e1e100e1ULL,
 648	0xcaca00cacaca00caULL, 0x4747004747470047ULL, 0x3d3d003d3d3d003dULL,
 649	0x0101000101010001ULL, 0xd6d600d6d6d600d6ULL, 0x5656005656560056ULL,
 650	0x4d4d004d4d4d004dULL, 0x0d0d000d0d0d000dULL, 0x6666006666660066ULL,
 651	0xcccc00cccccc00ccULL, 0x2d2d002d2d2d002dULL, 0x1212001212120012ULL,
 652	0x2020002020200020ULL, 0xb1b100b1b1b100b1ULL, 0x9999009999990099ULL,
 653	0x4c4c004c4c4c004cULL, 0xc2c200c2c2c200c2ULL, 0x7e7e007e7e7e007eULL,
 654	0x0505000505050005ULL, 0xb7b700b7b7b700b7ULL, 0x3131003131310031ULL,
 655	0x1717001717170017ULL, 0xd7d700d7d7d700d7ULL, 0x5858005858580058ULL,
 656	0x6161006161610061ULL, 0x1b1b001b1b1b001bULL, 0x1c1c001c1c1c001cULL,
 657	0x0f0f000f0f0f000fULL, 0x1616001616160016ULL, 0x1818001818180018ULL,
 658	0x2222002222220022ULL, 0x4444004444440044ULL, 0xb2b200b2b2b200b2ULL,
 659	0xb5b500b5b5b500b5ULL, 0x9191009191910091ULL, 0x0808000808080008ULL,
 660	0xa8a800a8a8a800a8ULL, 0xfcfc00fcfcfc00fcULL, 0x5050005050500050ULL,
 661	0xd0d000d0d0d000d0ULL, 0x7d7d007d7d7d007dULL, 0x8989008989890089ULL,
 662	0x9797009797970097ULL, 0x5b5b005b5b5b005bULL, 0x9595009595950095ULL,
 663	0xffff00ffffff00ffULL, 0xd2d200d2d2d200d2ULL, 0xc4c400c4c4c400c4ULL,
 664	0x4848004848480048ULL, 0xf7f700f7f7f700f7ULL, 0xdbdb00dbdbdb00dbULL,
 665	0x0303000303030003ULL, 0xdada00dadada00daULL, 0x3f3f003f3f3f003fULL,
 666	0x9494009494940094ULL, 0x5c5c005c5c5c005cULL, 0x0202000202020002ULL,
 667	0x4a4a004a4a4a004aULL, 0x3333003333330033ULL, 0x6767006767670067ULL,
 668	0xf3f300f3f3f300f3ULL, 0x7f7f007f7f7f007fULL, 0xe2e200e2e2e200e2ULL,
 669	0x9b9b009b9b9b009bULL, 0x2626002626260026ULL, 0x3737003737370037ULL,
 670	0x3b3b003b3b3b003bULL, 0x9696009696960096ULL, 0x4b4b004b4b4b004bULL,
 671	0xbebe00bebebe00beULL, 0x2e2e002e2e2e002eULL, 0x7979007979790079ULL,
 672	0x8c8c008c8c8c008cULL, 0x6e6e006e6e6e006eULL, 0x8e8e008e8e8e008eULL,
 673	0xf5f500f5f5f500f5ULL, 0xb6b600b6b6b600b6ULL, 0xfdfd00fdfdfd00fdULL,
 674	0x5959005959590059ULL, 0x9898009898980098ULL, 0x6a6a006a6a6a006aULL,
 675	0x4646004646460046ULL, 0xbaba00bababa00baULL, 0x2525002525250025ULL,
 676	0x4242004242420042ULL, 0xa2a200a2a2a200a2ULL, 0xfafa00fafafa00faULL,
 677	0x0707000707070007ULL, 0x5555005555550055ULL, 0xeeee00eeeeee00eeULL,
 678	0x0a0a000a0a0a000aULL, 0x4949004949490049ULL, 0x6868006868680068ULL,
 679	0x3838003838380038ULL, 0xa4a400a4a4a400a4ULL, 0x2828002828280028ULL,
 680	0x7b7b007b7b7b007bULL, 0xc9c900c9c9c900c9ULL, 0xc1c100c1c1c100c1ULL,
 681	0xe3e300e3e3e300e3ULL, 0xf4f400f4f4f400f4ULL, 0xc7c700c7c7c700c7ULL,
 682	0x9e9e009e9e9e009eULL,
 683};
 684
 685__visible const u64 camellia_sp11101110[256] = {
 686	0x7070700070707000ULL, 0x8282820082828200ULL, 0x2c2c2c002c2c2c00ULL,
 687	0xececec00ececec00ULL, 0xb3b3b300b3b3b300ULL, 0x2727270027272700ULL,
 688	0xc0c0c000c0c0c000ULL, 0xe5e5e500e5e5e500ULL, 0xe4e4e400e4e4e400ULL,
 689	0x8585850085858500ULL, 0x5757570057575700ULL, 0x3535350035353500ULL,
 690	0xeaeaea00eaeaea00ULL, 0x0c0c0c000c0c0c00ULL, 0xaeaeae00aeaeae00ULL,
 691	0x4141410041414100ULL, 0x2323230023232300ULL, 0xefefef00efefef00ULL,
 692	0x6b6b6b006b6b6b00ULL, 0x9393930093939300ULL, 0x4545450045454500ULL,
 693	0x1919190019191900ULL, 0xa5a5a500a5a5a500ULL, 0x2121210021212100ULL,
 694	0xededed00ededed00ULL, 0x0e0e0e000e0e0e00ULL, 0x4f4f4f004f4f4f00ULL,
 695	0x4e4e4e004e4e4e00ULL, 0x1d1d1d001d1d1d00ULL, 0x6565650065656500ULL,
 696	0x9292920092929200ULL, 0xbdbdbd00bdbdbd00ULL, 0x8686860086868600ULL,
 697	0xb8b8b800b8b8b800ULL, 0xafafaf00afafaf00ULL, 0x8f8f8f008f8f8f00ULL,
 698	0x7c7c7c007c7c7c00ULL, 0xebebeb00ebebeb00ULL, 0x1f1f1f001f1f1f00ULL,
 699	0xcecece00cecece00ULL, 0x3e3e3e003e3e3e00ULL, 0x3030300030303000ULL,
 700	0xdcdcdc00dcdcdc00ULL, 0x5f5f5f005f5f5f00ULL, 0x5e5e5e005e5e5e00ULL,
 701	0xc5c5c500c5c5c500ULL, 0x0b0b0b000b0b0b00ULL, 0x1a1a1a001a1a1a00ULL,
 702	0xa6a6a600a6a6a600ULL, 0xe1e1e100e1e1e100ULL, 0x3939390039393900ULL,
 703	0xcacaca00cacaca00ULL, 0xd5d5d500d5d5d500ULL, 0x4747470047474700ULL,
 704	0x5d5d5d005d5d5d00ULL, 0x3d3d3d003d3d3d00ULL, 0xd9d9d900d9d9d900ULL,
 705	0x0101010001010100ULL, 0x5a5a5a005a5a5a00ULL, 0xd6d6d600d6d6d600ULL,
 706	0x5151510051515100ULL, 0x5656560056565600ULL, 0x6c6c6c006c6c6c00ULL,
 707	0x4d4d4d004d4d4d00ULL, 0x8b8b8b008b8b8b00ULL, 0x0d0d0d000d0d0d00ULL,
 708	0x9a9a9a009a9a9a00ULL, 0x6666660066666600ULL, 0xfbfbfb00fbfbfb00ULL,
 709	0xcccccc00cccccc00ULL, 0xb0b0b000b0b0b000ULL, 0x2d2d2d002d2d2d00ULL,
 710	0x7474740074747400ULL, 0x1212120012121200ULL, 0x2b2b2b002b2b2b00ULL,
 711	0x2020200020202000ULL, 0xf0f0f000f0f0f000ULL, 0xb1b1b100b1b1b100ULL,
 712	0x8484840084848400ULL, 0x9999990099999900ULL, 0xdfdfdf00dfdfdf00ULL,
 713	0x4c4c4c004c4c4c00ULL, 0xcbcbcb00cbcbcb00ULL, 0xc2c2c200c2c2c200ULL,
 714	0x3434340034343400ULL, 0x7e7e7e007e7e7e00ULL, 0x7676760076767600ULL,
 715	0x0505050005050500ULL, 0x6d6d6d006d6d6d00ULL, 0xb7b7b700b7b7b700ULL,
 716	0xa9a9a900a9a9a900ULL, 0x3131310031313100ULL, 0xd1d1d100d1d1d100ULL,
 717	0x1717170017171700ULL, 0x0404040004040400ULL, 0xd7d7d700d7d7d700ULL,
 718	0x1414140014141400ULL, 0x5858580058585800ULL, 0x3a3a3a003a3a3a00ULL,
 719	0x6161610061616100ULL, 0xdedede00dedede00ULL, 0x1b1b1b001b1b1b00ULL,
 720	0x1111110011111100ULL, 0x1c1c1c001c1c1c00ULL, 0x3232320032323200ULL,
 721	0x0f0f0f000f0f0f00ULL, 0x9c9c9c009c9c9c00ULL, 0x1616160016161600ULL,
 722	0x5353530053535300ULL, 0x1818180018181800ULL, 0xf2f2f200f2f2f200ULL,
 723	0x2222220022222200ULL, 0xfefefe00fefefe00ULL, 0x4444440044444400ULL,
 724	0xcfcfcf00cfcfcf00ULL, 0xb2b2b200b2b2b200ULL, 0xc3c3c300c3c3c300ULL,
 725	0xb5b5b500b5b5b500ULL, 0x7a7a7a007a7a7a00ULL, 0x9191910091919100ULL,
 726	0x2424240024242400ULL, 0x0808080008080800ULL, 0xe8e8e800e8e8e800ULL,
 727	0xa8a8a800a8a8a800ULL, 0x6060600060606000ULL, 0xfcfcfc00fcfcfc00ULL,
 728	0x6969690069696900ULL, 0x5050500050505000ULL, 0xaaaaaa00aaaaaa00ULL,
 729	0xd0d0d000d0d0d000ULL, 0xa0a0a000a0a0a000ULL, 0x7d7d7d007d7d7d00ULL,
 730	0xa1a1a100a1a1a100ULL, 0x8989890089898900ULL, 0x6262620062626200ULL,
 731	0x9797970097979700ULL, 0x5454540054545400ULL, 0x5b5b5b005b5b5b00ULL,
 732	0x1e1e1e001e1e1e00ULL, 0x9595950095959500ULL, 0xe0e0e000e0e0e000ULL,
 733	0xffffff00ffffff00ULL, 0x6464640064646400ULL, 0xd2d2d200d2d2d200ULL,
 734	0x1010100010101000ULL, 0xc4c4c400c4c4c400ULL, 0x0000000000000000ULL,
 735	0x4848480048484800ULL, 0xa3a3a300a3a3a300ULL, 0xf7f7f700f7f7f700ULL,
 736	0x7575750075757500ULL, 0xdbdbdb00dbdbdb00ULL, 0x8a8a8a008a8a8a00ULL,
 737	0x0303030003030300ULL, 0xe6e6e600e6e6e600ULL, 0xdadada00dadada00ULL,
 738	0x0909090009090900ULL, 0x3f3f3f003f3f3f00ULL, 0xdddddd00dddddd00ULL,
 739	0x9494940094949400ULL, 0x8787870087878700ULL, 0x5c5c5c005c5c5c00ULL,
 740	0x8383830083838300ULL, 0x0202020002020200ULL, 0xcdcdcd00cdcdcd00ULL,
 741	0x4a4a4a004a4a4a00ULL, 0x9090900090909000ULL, 0x3333330033333300ULL,
 742	0x7373730073737300ULL, 0x6767670067676700ULL, 0xf6f6f600f6f6f600ULL,
 743	0xf3f3f300f3f3f300ULL, 0x9d9d9d009d9d9d00ULL, 0x7f7f7f007f7f7f00ULL,
 744	0xbfbfbf00bfbfbf00ULL, 0xe2e2e200e2e2e200ULL, 0x5252520052525200ULL,
 745	0x9b9b9b009b9b9b00ULL, 0xd8d8d800d8d8d800ULL, 0x2626260026262600ULL,
 746	0xc8c8c800c8c8c800ULL, 0x3737370037373700ULL, 0xc6c6c600c6c6c600ULL,
 747	0x3b3b3b003b3b3b00ULL, 0x8181810081818100ULL, 0x9696960096969600ULL,
 748	0x6f6f6f006f6f6f00ULL, 0x4b4b4b004b4b4b00ULL, 0x1313130013131300ULL,
 749	0xbebebe00bebebe00ULL, 0x6363630063636300ULL, 0x2e2e2e002e2e2e00ULL,
 750	0xe9e9e900e9e9e900ULL, 0x7979790079797900ULL, 0xa7a7a700a7a7a700ULL,
 751	0x8c8c8c008c8c8c00ULL, 0x9f9f9f009f9f9f00ULL, 0x6e6e6e006e6e6e00ULL,
 752	0xbcbcbc00bcbcbc00ULL, 0x8e8e8e008e8e8e00ULL, 0x2929290029292900ULL,
 753	0xf5f5f500f5f5f500ULL, 0xf9f9f900f9f9f900ULL, 0xb6b6b600b6b6b600ULL,
 754	0x2f2f2f002f2f2f00ULL, 0xfdfdfd00fdfdfd00ULL, 0xb4b4b400b4b4b400ULL,
 755	0x5959590059595900ULL, 0x7878780078787800ULL, 0x9898980098989800ULL,
 756	0x0606060006060600ULL, 0x6a6a6a006a6a6a00ULL, 0xe7e7e700e7e7e700ULL,
 757	0x4646460046464600ULL, 0x7171710071717100ULL, 0xbababa00bababa00ULL,
 758	0xd4d4d400d4d4d400ULL, 0x2525250025252500ULL, 0xababab00ababab00ULL,
 759	0x4242420042424200ULL, 0x8888880088888800ULL, 0xa2a2a200a2a2a200ULL,
 760	0x8d8d8d008d8d8d00ULL, 0xfafafa00fafafa00ULL, 0x7272720072727200ULL,
 761	0x0707070007070700ULL, 0xb9b9b900b9b9b900ULL, 0x5555550055555500ULL,
 762	0xf8f8f800f8f8f800ULL, 0xeeeeee00eeeeee00ULL, 0xacacac00acacac00ULL,
 763	0x0a0a0a000a0a0a00ULL, 0x3636360036363600ULL, 0x4949490049494900ULL,
 764	0x2a2a2a002a2a2a00ULL, 0x6868680068686800ULL, 0x3c3c3c003c3c3c00ULL,
 765	0x3838380038383800ULL, 0xf1f1f100f1f1f100ULL, 0xa4a4a400a4a4a400ULL,
 766	0x4040400040404000ULL, 0x2828280028282800ULL, 0xd3d3d300d3d3d300ULL,
 767	0x7b7b7b007b7b7b00ULL, 0xbbbbbb00bbbbbb00ULL, 0xc9c9c900c9c9c900ULL,
 768	0x4343430043434300ULL, 0xc1c1c100c1c1c100ULL, 0x1515150015151500ULL,
 769	0xe3e3e300e3e3e300ULL, 0xadadad00adadad00ULL, 0xf4f4f400f4f4f400ULL,
 770	0x7777770077777700ULL, 0xc7c7c700c7c7c700ULL, 0x8080800080808000ULL,
 771	0x9e9e9e009e9e9e00ULL,
 772};
 773
 774/* key constants */
 775#define CAMELLIA_SIGMA1L (0xA09E667FL)
 776#define CAMELLIA_SIGMA1R (0x3BCC908BL)
 777#define CAMELLIA_SIGMA2L (0xB67AE858L)
 778#define CAMELLIA_SIGMA2R (0x4CAA73B2L)
 779#define CAMELLIA_SIGMA3L (0xC6EF372FL)
 780#define CAMELLIA_SIGMA3R (0xE94F82BEL)
 781#define CAMELLIA_SIGMA4L (0x54FF53A5L)
 782#define CAMELLIA_SIGMA4R (0xF1D36F1CL)
 783#define CAMELLIA_SIGMA5L (0x10E527FAL)
 784#define CAMELLIA_SIGMA5R (0xDE682D1DL)
 785#define CAMELLIA_SIGMA6L (0xB05688C2L)
 786#define CAMELLIA_SIGMA6R (0xB3E6C1FDL)
 787
 788/* macros */
 789#define ROLDQ(l, r, bits) ({ \
 790	u64 t = l;					\
 791	l = (l << bits) | (r >> (64 - bits));		\
 792	r = (r << bits) | (t >> (64 - bits));		\
 793})
 794
 795#define CAMELLIA_F(x, kl, kr, y) ({ \
 796	u64 ii = x ^ (((u64)kl << 32) | kr);				\
 797	y = camellia_sp11101110[(uint8_t)ii];				\
 798	y ^= camellia_sp44044404[(uint8_t)(ii >> 8)];			\
 799	ii >>= 16;							\
 800	y ^= camellia_sp30333033[(uint8_t)ii];				\
 801	y ^= camellia_sp02220222[(uint8_t)(ii >> 8)];			\
 802	ii >>= 16;							\
 803	y ^= camellia_sp00444404[(uint8_t)ii];				\
 804	y ^= camellia_sp03303033[(uint8_t)(ii >> 8)];			\
 805	ii >>= 16;							\
 806	y ^= camellia_sp22000222[(uint8_t)ii];				\
 807	y ^= camellia_sp10011110[(uint8_t)(ii >> 8)];			\
 808	y = ror64(y, 32);						\
 809})
 810
 811#define SET_SUBKEY_LR(INDEX, sRL) (subkey[(INDEX)] = ror64((sRL), 32))
 812
 813static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
 814{
 815	u64 kw4, tt;
 816	u32 dw, tl, tr;
 817
 818	/* absorb kw2 to other subkeys */
 819	/* round 2 */
 820	subRL[3] ^= subRL[1];
 821	/* round 4 */
 822	subRL[5] ^= subRL[1];
 823	/* round 6 */
 824	subRL[7] ^= subRL[1];
 825
 826	subRL[1] ^= (subRL[1] & ~subRL[9]) << 32;
 827	/* modified for FLinv(kl2) */
 828	dw = (subRL[1] & subRL[9]) >> 32;
 829	subRL[1] ^= rol32(dw, 1);
 830
 831	/* round 8 */
 832	subRL[11] ^= subRL[1];
 833	/* round 10 */
 834	subRL[13] ^= subRL[1];
 835	/* round 12 */
 836	subRL[15] ^= subRL[1];
 837
 838	subRL[1] ^= (subRL[1] & ~subRL[17]) << 32;
 839	/* modified for FLinv(kl4) */
 840	dw = (subRL[1] & subRL[17]) >> 32;
 841	subRL[1] ^= rol32(dw, 1);
 842
 843	/* round 14 */
 844	subRL[19] ^= subRL[1];
 845	/* round 16 */
 846	subRL[21] ^= subRL[1];
 847	/* round 18 */
 848	subRL[23] ^= subRL[1];
 849
 850	if (max == 24) {
 851		/* kw3 */
 852		subRL[24] ^= subRL[1];
 853
 854		/* absorb kw4 to other subkeys */
 855		kw4 = subRL[25];
 856	} else {
 857		subRL[1] ^= (subRL[1] & ~subRL[25]) << 32;
 858		/* modified for FLinv(kl6) */
 859		dw = (subRL[1] & subRL[25]) >> 32;
 860		subRL[1] ^= rol32(dw, 1);
 861
 862		/* round 20 */
 863		subRL[27] ^= subRL[1];
 864		/* round 22 */
 865		subRL[29] ^= subRL[1];
 866		/* round 24 */
 867		subRL[31] ^= subRL[1];
 868		/* kw3 */
 869		subRL[32] ^= subRL[1];
 870
 871		/* absorb kw4 to other subkeys */
 872		kw4 = subRL[33];
 873		/* round 23 */
 874		subRL[30] ^= kw4;
 875		/* round 21 */
 876		subRL[28] ^= kw4;
 877		/* round 19 */
 878		subRL[26] ^= kw4;
 879
 880		kw4 ^= (kw4 & ~subRL[24]) << 32;
 881		/* modified for FL(kl5) */
 882		dw = (kw4 & subRL[24]) >> 32;
 883		kw4 ^= rol32(dw, 1);
 884	}
 885
 886	/* round 17 */
 887	subRL[22] ^= kw4;
 888	/* round 15 */
 889	subRL[20] ^= kw4;
 890	/* round 13 */
 891	subRL[18] ^= kw4;
 892
 893	kw4 ^= (kw4 & ~subRL[16]) << 32;
 894	/* modified for FL(kl3) */
 895	dw = (kw4 & subRL[16]) >> 32;
 896	kw4 ^= rol32(dw, 1);
 897
 898	/* round 11 */
 899	subRL[14] ^= kw4;
 900	/* round 9 */
 901	subRL[12] ^= kw4;
 902	/* round 7 */
 903	subRL[10] ^= kw4;
 904
 905	kw4 ^= (kw4 & ~subRL[8]) << 32;
 906	/* modified for FL(kl1) */
 907	dw = (kw4 & subRL[8]) >> 32;
 908	kw4 ^= rol32(dw, 1);
 909
 910	/* round 5 */
 911	subRL[6] ^= kw4;
 912	/* round 3 */
 913	subRL[4] ^= kw4;
 914	/* round 1 */
 915	subRL[2] ^= kw4;
 916	/* kw1 */
 917	subRL[0] ^= kw4;
 918
 919	/* key XOR is end of F-function */
 920	SET_SUBKEY_LR(0, subRL[0] ^ subRL[2]);			/* kw1 */
 921	SET_SUBKEY_LR(2, subRL[3]);				/* round 1 */
 922	SET_SUBKEY_LR(3, subRL[2] ^ subRL[4]);			/* round 2 */
 923	SET_SUBKEY_LR(4, subRL[3] ^ subRL[5]);			/* round 3 */
 924	SET_SUBKEY_LR(5, subRL[4] ^ subRL[6]);			/* round 4 */
 925	SET_SUBKEY_LR(6, subRL[5] ^ subRL[7]);			/* round 5 */
 926
 927	tl = (subRL[10] >> 32) ^ (subRL[10] & ~subRL[8]);
 928	dw = tl & (subRL[8] >> 32);				/* FL(kl1) */
 929	tr = subRL[10] ^ rol32(dw, 1);
 930	tt = (tr | ((u64)tl << 32));
 931
 932	SET_SUBKEY_LR(7, subRL[6] ^ tt);			/* round 6 */
 933	SET_SUBKEY_LR(8, subRL[8]);				/* FL(kl1) */
 934	SET_SUBKEY_LR(9, subRL[9]);				/* FLinv(kl2) */
 935
 936	tl = (subRL[7] >> 32) ^ (subRL[7] & ~subRL[9]);
 937	dw = tl & (subRL[9] >> 32);				/* FLinv(kl2) */
 938	tr = subRL[7] ^ rol32(dw, 1);
 939	tt = (tr | ((u64)tl << 32));
 940
 941	SET_SUBKEY_LR(10, subRL[11] ^ tt);			/* round 7 */
 942	SET_SUBKEY_LR(11, subRL[10] ^ subRL[12]);		/* round 8 */
 943	SET_SUBKEY_LR(12, subRL[11] ^ subRL[13]);		/* round 9 */
 944	SET_SUBKEY_LR(13, subRL[12] ^ subRL[14]);		/* round 10 */
 945	SET_SUBKEY_LR(14, subRL[13] ^ subRL[15]);		/* round 11 */
 946
 947	tl = (subRL[18] >> 32) ^ (subRL[18] & ~subRL[16]);
 948	dw = tl & (subRL[16] >> 32);				/* FL(kl3) */
 949	tr = subRL[18] ^ rol32(dw, 1);
 950	tt = (tr | ((u64)tl << 32));
 951
 952	SET_SUBKEY_LR(15, subRL[14] ^ tt);			/* round 12 */
 953	SET_SUBKEY_LR(16, subRL[16]);				/* FL(kl3) */
 954	SET_SUBKEY_LR(17, subRL[17]);				/* FLinv(kl4) */
 955
 956	tl = (subRL[15] >> 32) ^ (subRL[15] & ~subRL[17]);
 957	dw = tl & (subRL[17] >> 32);				/* FLinv(kl4) */
 958	tr = subRL[15] ^ rol32(dw, 1);
 959	tt = (tr | ((u64)tl << 32));
 960
 961	SET_SUBKEY_LR(18, subRL[19] ^ tt);			/* round 13 */
 962	SET_SUBKEY_LR(19, subRL[18] ^ subRL[20]);		/* round 14 */
 963	SET_SUBKEY_LR(20, subRL[19] ^ subRL[21]);		/* round 15 */
 964	SET_SUBKEY_LR(21, subRL[20] ^ subRL[22]);		/* round 16 */
 965	SET_SUBKEY_LR(22, subRL[21] ^ subRL[23]);		/* round 17 */
 966
 967	if (max == 24) {
 968		SET_SUBKEY_LR(23, subRL[22]);			/* round 18 */
 969		SET_SUBKEY_LR(24, subRL[24] ^ subRL[23]);	/* kw3 */
 970	} else {
 971		tl = (subRL[26] >> 32) ^ (subRL[26] & ~subRL[24]);
 972		dw = tl & (subRL[24] >> 32);			/* FL(kl5) */
 973		tr = subRL[26] ^ rol32(dw, 1);
 974		tt = (tr | ((u64)tl << 32));
 975
 976		SET_SUBKEY_LR(23, subRL[22] ^ tt);		/* round 18 */
 977		SET_SUBKEY_LR(24, subRL[24]);			/* FL(kl5) */
 978		SET_SUBKEY_LR(25, subRL[25]);			/* FLinv(kl6) */
 979
 980		tl = (subRL[23] >> 32) ^ (subRL[23] & ~subRL[25]);
 981		dw = tl & (subRL[25] >> 32);			/* FLinv(kl6) */
 982		tr = subRL[23] ^ rol32(dw, 1);
 983		tt = (tr | ((u64)tl << 32));
 984
 985		SET_SUBKEY_LR(26, subRL[27] ^ tt);		/* round 19 */
 986		SET_SUBKEY_LR(27, subRL[26] ^ subRL[28]);	/* round 20 */
 987		SET_SUBKEY_LR(28, subRL[27] ^ subRL[29]);	/* round 21 */
 988		SET_SUBKEY_LR(29, subRL[28] ^ subRL[30]);	/* round 22 */
 989		SET_SUBKEY_LR(30, subRL[29] ^ subRL[31]);	/* round 23 */
 990		SET_SUBKEY_LR(31, subRL[30]);			/* round 24 */
 991		SET_SUBKEY_LR(32, subRL[32] ^ subRL[31]);	/* kw3 */
 992	}
 993}
 994
 995static void camellia_setup128(const unsigned char *key, u64 *subkey)
 996{
 997	u64 kl, kr, ww;
 998	u64 subRL[26];
 999
1000	/**
1001	 *  k == kl || kr (|| is concatenation)
1002	 */
1003	kl = get_unaligned_be64(key);
1004	kr = get_unaligned_be64(key + 8);
1005
1006	/* generate KL dependent subkeys */
1007	/* kw1 */
1008	subRL[0] = kl;
1009	/* kw2 */
1010	subRL[1] = kr;
1011
1012	/* rotation left shift 15bit */
1013	ROLDQ(kl, kr, 15);
1014
1015	/* k3 */
1016	subRL[4] = kl;
1017	/* k4 */
1018	subRL[5] = kr;
1019
1020	/* rotation left shift 15+30bit */
1021	ROLDQ(kl, kr, 30);
1022
1023	/* k7 */
1024	subRL[10] = kl;
1025	/* k8 */
1026	subRL[11] = kr;
1027
1028	/* rotation left shift 15+30+15bit */
1029	ROLDQ(kl, kr, 15);
1030
1031	/* k10 */
1032	subRL[13] = kr;
1033	/* rotation left shift 15+30+15+17 bit */
1034	ROLDQ(kl, kr, 17);
1035
1036	/* kl3 */
1037	subRL[16] = kl;
1038	/* kl4 */
1039	subRL[17] = kr;
1040
1041	/* rotation left shift 15+30+15+17+17 bit */
1042	ROLDQ(kl, kr, 17);
1043
1044	/* k13 */
1045	subRL[18] = kl;
1046	/* k14 */
1047	subRL[19] = kr;
1048
1049	/* rotation left shift 15+30+15+17+17+17 bit */
1050	ROLDQ(kl, kr, 17);
1051
1052	/* k17 */
1053	subRL[22] = kl;
1054	/* k18 */
1055	subRL[23] = kr;
1056
1057	/* generate KA */
1058	kl = subRL[0];
1059	kr = subRL[1];
1060	CAMELLIA_F(kl, CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, ww);
1061	kr ^= ww;
1062	CAMELLIA_F(kr, CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, kl);
1063
1064	/* current status == (kll, klr, w0, w1) */
1065	CAMELLIA_F(kl, CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, kr);
1066	kr ^= ww;
1067	CAMELLIA_F(kr, CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, ww);
1068	kl ^= ww;
1069
1070	/* generate KA dependent subkeys */
1071	/* k1, k2 */
1072	subRL[2] = kl;
1073	subRL[3] = kr;
1074	ROLDQ(kl, kr, 15);
1075	/* k5,k6 */
1076	subRL[6] = kl;
1077	subRL[7] = kr;
1078	ROLDQ(kl, kr, 15);
1079	/* kl1, kl2 */
1080	subRL[8] = kl;
1081	subRL[9] = kr;
1082	ROLDQ(kl, kr, 15);
1083	/* k9 */
1084	subRL[12] = kl;
1085	ROLDQ(kl, kr, 15);
1086	/* k11, k12 */
1087	subRL[14] = kl;
1088	subRL[15] = kr;
1089	ROLDQ(kl, kr, 34);
1090	/* k15, k16 */
1091	subRL[20] = kl;
1092	subRL[21] = kr;
1093	ROLDQ(kl, kr, 17);
1094	/* kw3, kw4 */
1095	subRL[24] = kl;
1096	subRL[25] = kr;
1097
1098	camellia_setup_tail(subkey, subRL, 24);
1099}
1100
1101static void camellia_setup256(const unsigned char *key, u64 *subkey)
1102{
1103	u64 kl, kr;			/* left half of key */
1104	u64 krl, krr;			/* right half of key */
1105	u64 ww;				/* temporary variables */
1106	u64 subRL[34];
1107
1108	/**
1109	 *  key = (kl || kr || krl || krr) (|| is concatenation)
1110	 */
1111	kl = get_unaligned_be64(key);
1112	kr = get_unaligned_be64(key + 8);
1113	krl = get_unaligned_be64(key + 16);
1114	krr = get_unaligned_be64(key + 24);
1115
1116	/* generate KL dependent subkeys */
1117	/* kw1 */
1118	subRL[0] = kl;
1119	/* kw2 */
1120	subRL[1] = kr;
1121	ROLDQ(kl, kr, 45);
1122	/* k9 */
1123	subRL[12] = kl;
1124	/* k10 */
1125	subRL[13] = kr;
1126	ROLDQ(kl, kr, 15);
1127	/* kl3 */
1128	subRL[16] = kl;
1129	/* kl4 */
1130	subRL[17] = kr;
1131	ROLDQ(kl, kr, 17);
1132	/* k17 */
1133	subRL[22] = kl;
1134	/* k18 */
1135	subRL[23] = kr;
1136	ROLDQ(kl, kr, 34);
1137	/* k23 */
1138	subRL[30] = kl;
1139	/* k24 */
1140	subRL[31] = kr;
1141
1142	/* generate KR dependent subkeys */
1143	ROLDQ(krl, krr, 15);
1144	/* k3 */
1145	subRL[4] = krl;
1146	/* k4 */
1147	subRL[5] = krr;
1148	ROLDQ(krl, krr, 15);
1149	/* kl1 */
1150	subRL[8] = krl;
1151	/* kl2 */
1152	subRL[9] = krr;
1153	ROLDQ(krl, krr, 30);
1154	/* k13 */
1155	subRL[18] = krl;
1156	/* k14 */
1157	subRL[19] = krr;
1158	ROLDQ(krl, krr, 34);
1159	/* k19 */
1160	subRL[26] = krl;
1161	/* k20 */
1162	subRL[27] = krr;
1163	ROLDQ(krl, krr, 34);
1164
1165	/* generate KA */
1166	kl = subRL[0] ^ krl;
1167	kr = subRL[1] ^ krr;
1168
1169	CAMELLIA_F(kl, CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, ww);
1170	kr ^= ww;
1171	CAMELLIA_F(kr, CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, kl);
1172	kl ^= krl;
1173	CAMELLIA_F(kl, CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, kr);
1174	kr ^= ww ^ krr;
1175	CAMELLIA_F(kr, CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, ww);
1176	kl ^= ww;
1177
1178	/* generate KB */
1179	krl ^= kl;
1180	krr ^= kr;
1181	CAMELLIA_F(krl, CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R, ww);
1182	krr ^= ww;
1183	CAMELLIA_F(krr, CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R, ww);
1184	krl ^= ww;
1185
1186	/* generate KA dependent subkeys */
1187	ROLDQ(kl, kr, 15);
1188	/* k5 */
1189	subRL[6] = kl;
1190	/* k6 */
1191	subRL[7] = kr;
1192	ROLDQ(kl, kr, 30);
1193	/* k11 */
1194	subRL[14] = kl;
1195	/* k12 */
1196	subRL[15] = kr;
1197	/* rotation left shift 32bit */
1198	ROLDQ(kl, kr, 32);
1199	/* kl5 */
1200	subRL[24] = kl;
1201	/* kl6 */
1202	subRL[25] = kr;
1203	/* rotation left shift 17 from k11,k12 -> k21,k22 */
1204	ROLDQ(kl, kr, 17);
1205	/* k21 */
1206	subRL[28] = kl;
1207	/* k22 */
1208	subRL[29] = kr;
1209
1210	/* generate KB dependent subkeys */
1211	/* k1 */
1212	subRL[2] = krl;
1213	/* k2 */
1214	subRL[3] = krr;
1215	ROLDQ(krl, krr, 30);
1216	/* k7 */
1217	subRL[10] = krl;
1218	/* k8 */
1219	subRL[11] = krr;
1220	ROLDQ(krl, krr, 30);
1221	/* k15 */
1222	subRL[20] = krl;
1223	/* k16 */
1224	subRL[21] = krr;
1225	ROLDQ(krl, krr, 51);
1226	/* kw3 */
1227	subRL[32] = krl;
1228	/* kw4 */
1229	subRL[33] = krr;
1230
1231	camellia_setup_tail(subkey, subRL, 32);
1232}
1233
1234static void camellia_setup192(const unsigned char *key, u64 *subkey)
1235{
1236	unsigned char kk[32];
1237	u64 krl, krr;
1238
1239	memcpy(kk, key, 24);
1240	memcpy((unsigned char *)&krl, key+16, 8);
1241	krr = ~krl;
1242	memcpy(kk+24, (unsigned char *)&krr, 8);
1243	camellia_setup256(kk, subkey);
1244}
1245
1246int __camellia_setkey(struct camellia_ctx *cctx, const unsigned char *key,
1247		      unsigned int key_len, u32 *flags)
 
1248{
1249	if (key_len != 16 && key_len != 24 && key_len != 32) {
1250		*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
1251		return -EINVAL;
1252	}
1253
1254	cctx->key_length = key_len;
1255
1256	switch (key_len) {
1257	case 16:
1258		camellia_setup128(key, cctx->key_table);
1259		break;
1260	case 24:
1261		camellia_setup192(key, cctx->key_table);
1262		break;
1263	case 32:
1264		camellia_setup256(key, cctx->key_table);
1265		break;
1266	}
1267
1268	return 0;
1269}
1270EXPORT_SYMBOL_GPL(__camellia_setkey);
1271
1272static int camellia_setkey(struct crypto_tfm *tfm, const u8 *key,
1273			   unsigned int key_len)
1274{
1275	return __camellia_setkey(crypto_tfm_ctx(tfm), key, key_len,
1276				 &tfm->crt_flags);
1277}
1278
1279static int camellia_setkey_skcipher(struct crypto_skcipher *tfm, const u8 *key,
1280				    unsigned int key_len)
 
1281{
1282	return camellia_setkey(&tfm->base, key, key_len);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1283}
1284
1285void camellia_decrypt_cbc_2way(void *ctx, u128 *dst, const u128 *src)
 
1286{
1287	u128 iv = *src;
1288
1289	camellia_dec_blk_2way(ctx, (u8 *)dst, (u8 *)src);
 
 
 
 
 
 
 
1290
1291	u128_xor(&dst[1], &dst[1], &iv);
 
1292}
1293EXPORT_SYMBOL_GPL(camellia_decrypt_cbc_2way);
1294
1295void camellia_crypt_ctr(void *ctx, u128 *dst, const u128 *src, le128 *iv)
 
1296{
1297	be128 ctrblk;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1298
1299	if (dst != src)
1300		*dst = *src;
 
1301
1302	le128_to_be128(&ctrblk, iv);
1303	le128_inc(iv);
 
 
 
 
 
 
 
 
 
 
 
1304
1305	camellia_enc_blk_xor(ctx, (u8 *)dst, (u8 *)&ctrblk);
1306}
1307EXPORT_SYMBOL_GPL(camellia_crypt_ctr);
1308
1309void camellia_crypt_ctr_2way(void *ctx, u128 *dst, const u128 *src, le128 *iv)
 
1310{
1311	be128 ctrblks[2];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1312
1313	if (dst != src) {
1314		dst[0] = src[0];
1315		dst[1] = src[1];
 
 
 
 
 
 
 
 
1316	}
1317
1318	le128_to_be128(&ctrblks[0], iv);
1319	le128_inc(iv);
1320	le128_to_be128(&ctrblks[1], iv);
1321	le128_inc(iv);
1322
1323	camellia_enc_blk_xor_2way(ctx, (u8 *)dst, (u8 *)ctrblks);
1324}
1325EXPORT_SYMBOL_GPL(camellia_crypt_ctr_2way);
1326
1327static const struct common_glue_ctx camellia_enc = {
1328	.num_funcs = 2,
1329	.fpu_blocks_limit = -1,
1330
1331	.funcs = { {
1332		.num_blocks = 2,
1333		.fn_u = { .ecb = GLUE_FUNC_CAST(camellia_enc_blk_2way) }
1334	}, {
1335		.num_blocks = 1,
1336		.fn_u = { .ecb = GLUE_FUNC_CAST(camellia_enc_blk) }
1337	} }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1338};
1339
1340static const struct common_glue_ctx camellia_ctr = {
1341	.num_funcs = 2,
1342	.fpu_blocks_limit = -1,
1343
1344	.funcs = { {
1345		.num_blocks = 2,
1346		.fn_u = { .ctr = GLUE_CTR_FUNC_CAST(camellia_crypt_ctr_2way) }
1347	}, {
1348		.num_blocks = 1,
1349		.fn_u = { .ctr = GLUE_CTR_FUNC_CAST(camellia_crypt_ctr) }
1350	} }
1351};
 
 
 
1352
1353static const struct common_glue_ctx camellia_dec = {
1354	.num_funcs = 2,
1355	.fpu_blocks_limit = -1,
1356
1357	.funcs = { {
1358		.num_blocks = 2,
1359		.fn_u = { .ecb = GLUE_FUNC_CAST(camellia_dec_blk_2way) }
1360	}, {
1361		.num_blocks = 1,
1362		.fn_u = { .ecb = GLUE_FUNC_CAST(camellia_dec_blk) }
1363	} }
1364};
 
1365
1366static const struct common_glue_ctx camellia_dec_cbc = {
1367	.num_funcs = 2,
1368	.fpu_blocks_limit = -1,
1369
1370	.funcs = { {
1371		.num_blocks = 2,
1372		.fn_u = { .cbc = GLUE_CBC_FUNC_CAST(camellia_decrypt_cbc_2way) }
1373	}, {
1374		.num_blocks = 1,
1375		.fn_u = { .cbc = GLUE_CBC_FUNC_CAST(camellia_dec_blk) }
1376	} }
1377};
1378
1379static int ecb_encrypt(struct skcipher_request *req)
 
1380{
1381	return glue_ecb_req_128bit(&camellia_enc, req);
 
 
 
 
 
 
 
 
 
 
 
1382}
1383
1384static int ecb_decrypt(struct skcipher_request *req)
1385{
1386	return glue_ecb_req_128bit(&camellia_dec, req);
 
 
1387}
1388
1389static int cbc_encrypt(struct skcipher_request *req)
 
 
 
 
 
 
1390{
1391	return glue_cbc_encrypt_req_128bit(GLUE_FUNC_CAST(camellia_enc_blk),
1392					   req);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1393}
1394
1395static int cbc_decrypt(struct skcipher_request *req)
 
1396{
1397	return glue_cbc_decrypt_req_128bit(&camellia_dec_cbc, req);
 
 
 
 
 
 
 
 
 
 
 
 
1398}
1399
1400static int ctr_crypt(struct skcipher_request *req)
 
1401{
1402	return glue_ctr_req_128bit(&camellia_ctr, req);
 
 
 
 
 
 
 
 
 
 
 
 
1403}
1404
1405static struct crypto_alg camellia_cipher_alg = {
1406	.cra_name		= "camellia",
1407	.cra_driver_name	= "camellia-asm",
1408	.cra_priority		= 200,
1409	.cra_flags		= CRYPTO_ALG_TYPE_CIPHER,
1410	.cra_blocksize		= CAMELLIA_BLOCK_SIZE,
1411	.cra_ctxsize		= sizeof(struct camellia_ctx),
1412	.cra_alignmask		= 0,
1413	.cra_module		= THIS_MODULE,
 
1414	.cra_u			= {
1415		.cipher = {
1416			.cia_min_keysize = CAMELLIA_MIN_KEY_SIZE,
1417			.cia_max_keysize = CAMELLIA_MAX_KEY_SIZE,
1418			.cia_setkey	 = camellia_setkey,
1419			.cia_encrypt	 = camellia_encrypt,
1420			.cia_decrypt	 = camellia_decrypt
1421		}
1422	}
1423};
1424
1425static struct skcipher_alg camellia_skcipher_algs[] = {
1426	{
1427		.base.cra_name		= "ecb(camellia)",
1428		.base.cra_driver_name	= "ecb-camellia-asm",
1429		.base.cra_priority	= 300,
1430		.base.cra_blocksize	= CAMELLIA_BLOCK_SIZE,
1431		.base.cra_ctxsize	= sizeof(struct camellia_ctx),
1432		.base.cra_module	= THIS_MODULE,
1433		.min_keysize		= CAMELLIA_MIN_KEY_SIZE,
1434		.max_keysize		= CAMELLIA_MAX_KEY_SIZE,
1435		.setkey			= camellia_setkey_skcipher,
1436		.encrypt		= ecb_encrypt,
1437		.decrypt		= ecb_decrypt,
1438	}, {
1439		.base.cra_name		= "cbc(camellia)",
1440		.base.cra_driver_name	= "cbc-camellia-asm",
1441		.base.cra_priority	= 300,
1442		.base.cra_blocksize	= CAMELLIA_BLOCK_SIZE,
1443		.base.cra_ctxsize	= sizeof(struct camellia_ctx),
1444		.base.cra_module	= THIS_MODULE,
1445		.min_keysize		= CAMELLIA_MIN_KEY_SIZE,
1446		.max_keysize		= CAMELLIA_MAX_KEY_SIZE,
1447		.ivsize			= CAMELLIA_BLOCK_SIZE,
1448		.setkey			= camellia_setkey_skcipher,
1449		.encrypt		= cbc_encrypt,
1450		.decrypt		= cbc_decrypt,
1451	}, {
1452		.base.cra_name		= "ctr(camellia)",
1453		.base.cra_driver_name	= "ctr-camellia-asm",
1454		.base.cra_priority	= 300,
1455		.base.cra_blocksize	= 1,
1456		.base.cra_ctxsize	= sizeof(struct camellia_ctx),
1457		.base.cra_module	= THIS_MODULE,
1458		.min_keysize		= CAMELLIA_MIN_KEY_SIZE,
1459		.max_keysize		= CAMELLIA_MAX_KEY_SIZE,
1460		.ivsize			= CAMELLIA_BLOCK_SIZE,
1461		.chunksize		= CAMELLIA_BLOCK_SIZE,
1462		.setkey			= camellia_setkey_skcipher,
1463		.encrypt		= ctr_crypt,
1464		.decrypt		= ctr_crypt,
1465	}
1466};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1467
1468static bool is_blacklisted_cpu(void)
1469{
1470	if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL)
1471		return false;
1472
1473	if (boot_cpu_data.x86 == 0x0f) {
1474		/*
1475		 * On Pentium 4, camellia-asm is slower than original assembler
1476		 * implementation because excessive uses of 64bit rotate and
1477		 * left-shifts (which are really slow on P4) needed to store and
1478		 * handle 128bit block in two 64bit registers.
1479		 */
1480		return true;
1481	}
1482
1483	return false;
1484}
1485
1486static int force;
1487module_param(force, int, 0);
1488MODULE_PARM_DESC(force, "Force module load, ignore CPU blacklist");
1489
1490static int __init init(void)
1491{
1492	int err;
1493
1494	if (!force && is_blacklisted_cpu()) {
1495		printk(KERN_INFO
1496			"camellia-x86_64: performance on this CPU "
1497			"would be suboptimal: disabling "
1498			"camellia-x86_64.\n");
1499		return -ENODEV;
1500	}
1501
1502	err = crypto_register_alg(&camellia_cipher_alg);
1503	if (err)
1504		return err;
1505
1506	err = crypto_register_skciphers(camellia_skcipher_algs,
1507					ARRAY_SIZE(camellia_skcipher_algs));
1508	if (err)
1509		crypto_unregister_alg(&camellia_cipher_alg);
1510
1511	return err;
1512}
1513
1514static void __exit fini(void)
1515{
1516	crypto_unregister_alg(&camellia_cipher_alg);
1517	crypto_unregister_skciphers(camellia_skcipher_algs,
1518				    ARRAY_SIZE(camellia_skcipher_algs));
1519}
1520
1521module_init(init);
1522module_exit(fini);
1523
1524MODULE_LICENSE("GPL");
1525MODULE_DESCRIPTION("Camellia Cipher Algorithm, asm optimized");
1526MODULE_ALIAS_CRYPTO("camellia");
1527MODULE_ALIAS_CRYPTO("camellia-asm");