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