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