Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame^] | 1 | /* |
| 2 | * Cryptographic API. |
| 3 | * |
| 4 | * Whirlpool hashing Algorithm |
| 5 | * |
| 6 | * The Whirlpool algorithm was developed by Paulo S. L. M. Barreto and |
| 7 | * Vincent Rijmen. It has been selected as one of cryptographic |
| 8 | * primitives by the NESSIE project http://www.cryptonessie.org/ |
| 9 | * |
| 10 | * The original authors have disclaimed all copyright interest in this |
| 11 | * code and thus put it in the public domain. The subsequent authors |
| 12 | * have put this under the GNU General Public License. |
| 13 | * |
| 14 | * By Aaron Grothe ajgrothe@yahoo.com, August 23, 2004 |
| 15 | * |
| 16 | * This program is free software; you can redistribute it and/or modify |
| 17 | * it under the terms of the GNU General Public License as published by |
| 18 | * the Free Software Foundation; either version 2 of the License, or |
| 19 | * (at your option) any later version. |
| 20 | * |
| 21 | */ |
| 22 | #include <linux/init.h> |
| 23 | #include <linux/module.h> |
| 24 | #include <linux/mm.h> |
| 25 | #include <asm/scatterlist.h> |
| 26 | #include <linux/crypto.h> |
| 27 | |
| 28 | #define WP512_DIGEST_SIZE 64 |
| 29 | #define WP384_DIGEST_SIZE 48 |
| 30 | #define WP256_DIGEST_SIZE 32 |
| 31 | |
| 32 | #define WP512_BLOCK_SIZE 64 |
| 33 | #define WP512_LENGTHBYTES 32 |
| 34 | |
| 35 | #define WHIRLPOOL_ROUNDS 10 |
| 36 | |
| 37 | struct wp512_ctx { |
| 38 | u8 bitLength[WP512_LENGTHBYTES]; |
| 39 | u8 buffer[WP512_BLOCK_SIZE]; |
| 40 | int bufferBits; |
| 41 | int bufferPos; |
| 42 | u64 hash[WP512_DIGEST_SIZE/8]; |
| 43 | }; |
| 44 | |
| 45 | /* |
| 46 | * Though Whirlpool is endianness-neutral, the encryption tables are listed |
| 47 | * in BIG-ENDIAN format, which is adopted throughout this implementation |
| 48 | * (but little-endian notation would be equally suitable if consistently |
| 49 | * employed). |
| 50 | */ |
| 51 | |
| 52 | static const u64 C0[256] = { |
| 53 | 0x18186018c07830d8ULL, 0x23238c2305af4626ULL, 0xc6c63fc67ef991b8ULL, |
| 54 | 0xe8e887e8136fcdfbULL, 0x878726874ca113cbULL, 0xb8b8dab8a9626d11ULL, |
| 55 | 0x0101040108050209ULL, 0x4f4f214f426e9e0dULL, 0x3636d836adee6c9bULL, |
| 56 | 0xa6a6a2a6590451ffULL, 0xd2d26fd2debdb90cULL, 0xf5f5f3f5fb06f70eULL, |
| 57 | 0x7979f979ef80f296ULL, 0x6f6fa16f5fcede30ULL, 0x91917e91fcef3f6dULL, |
| 58 | 0x52525552aa07a4f8ULL, 0x60609d6027fdc047ULL, 0xbcbccabc89766535ULL, |
| 59 | 0x9b9b569baccd2b37ULL, 0x8e8e028e048c018aULL, 0xa3a3b6a371155bd2ULL, |
| 60 | 0x0c0c300c603c186cULL, 0x7b7bf17bff8af684ULL, 0x3535d435b5e16a80ULL, |
| 61 | 0x1d1d741de8693af5ULL, 0xe0e0a7e05347ddb3ULL, 0xd7d77bd7f6acb321ULL, |
| 62 | 0xc2c22fc25eed999cULL, 0x2e2eb82e6d965c43ULL, 0x4b4b314b627a9629ULL, |
| 63 | 0xfefedffea321e15dULL, 0x575741578216aed5ULL, 0x15155415a8412abdULL, |
| 64 | 0x7777c1779fb6eee8ULL, 0x3737dc37a5eb6e92ULL, 0xe5e5b3e57b56d79eULL, |
| 65 | 0x9f9f469f8cd92313ULL, 0xf0f0e7f0d317fd23ULL, 0x4a4a354a6a7f9420ULL, |
| 66 | 0xdada4fda9e95a944ULL, 0x58587d58fa25b0a2ULL, 0xc9c903c906ca8fcfULL, |
| 67 | 0x2929a429558d527cULL, 0x0a0a280a5022145aULL, 0xb1b1feb1e14f7f50ULL, |
| 68 | 0xa0a0baa0691a5dc9ULL, 0x6b6bb16b7fdad614ULL, 0x85852e855cab17d9ULL, |
| 69 | 0xbdbdcebd8173673cULL, 0x5d5d695dd234ba8fULL, 0x1010401080502090ULL, |
| 70 | 0xf4f4f7f4f303f507ULL, 0xcbcb0bcb16c08bddULL, 0x3e3ef83eedc67cd3ULL, |
| 71 | 0x0505140528110a2dULL, 0x676781671fe6ce78ULL, 0xe4e4b7e47353d597ULL, |
| 72 | 0x27279c2725bb4e02ULL, 0x4141194132588273ULL, 0x8b8b168b2c9d0ba7ULL, |
| 73 | 0xa7a7a6a7510153f6ULL, 0x7d7de97dcf94fab2ULL, 0x95956e95dcfb3749ULL, |
| 74 | 0xd8d847d88e9fad56ULL, 0xfbfbcbfb8b30eb70ULL, 0xeeee9fee2371c1cdULL, |
| 75 | 0x7c7ced7cc791f8bbULL, 0x6666856617e3cc71ULL, 0xdddd53dda68ea77bULL, |
| 76 | 0x17175c17b84b2eafULL, 0x4747014702468e45ULL, 0x9e9e429e84dc211aULL, |
| 77 | 0xcaca0fca1ec589d4ULL, 0x2d2db42d75995a58ULL, 0xbfbfc6bf9179632eULL, |
| 78 | 0x07071c07381b0e3fULL, 0xadad8ead012347acULL, 0x5a5a755aea2fb4b0ULL, |
| 79 | 0x838336836cb51befULL, 0x3333cc3385ff66b6ULL, 0x636391633ff2c65cULL, |
| 80 | 0x02020802100a0412ULL, 0xaaaa92aa39384993ULL, 0x7171d971afa8e2deULL, |
| 81 | 0xc8c807c80ecf8dc6ULL, 0x19196419c87d32d1ULL, 0x494939497270923bULL, |
| 82 | 0xd9d943d9869aaf5fULL, 0xf2f2eff2c31df931ULL, 0xe3e3abe34b48dba8ULL, |
| 83 | 0x5b5b715be22ab6b9ULL, 0x88881a8834920dbcULL, 0x9a9a529aa4c8293eULL, |
| 84 | 0x262698262dbe4c0bULL, 0x3232c8328dfa64bfULL, 0xb0b0fab0e94a7d59ULL, |
| 85 | 0xe9e983e91b6acff2ULL, 0x0f0f3c0f78331e77ULL, 0xd5d573d5e6a6b733ULL, |
| 86 | 0x80803a8074ba1df4ULL, 0xbebec2be997c6127ULL, 0xcdcd13cd26de87ebULL, |
| 87 | 0x3434d034bde46889ULL, 0x48483d487a759032ULL, 0xffffdbffab24e354ULL, |
| 88 | 0x7a7af57af78ff48dULL, 0x90907a90f4ea3d64ULL, 0x5f5f615fc23ebe9dULL, |
| 89 | 0x202080201da0403dULL, 0x6868bd6867d5d00fULL, 0x1a1a681ad07234caULL, |
| 90 | 0xaeae82ae192c41b7ULL, 0xb4b4eab4c95e757dULL, 0x54544d549a19a8ceULL, |
| 91 | 0x93937693ece53b7fULL, 0x222288220daa442fULL, 0x64648d6407e9c863ULL, |
| 92 | 0xf1f1e3f1db12ff2aULL, 0x7373d173bfa2e6ccULL, 0x12124812905a2482ULL, |
| 93 | 0x40401d403a5d807aULL, 0x0808200840281048ULL, 0xc3c32bc356e89b95ULL, |
| 94 | 0xecec97ec337bc5dfULL, 0xdbdb4bdb9690ab4dULL, 0xa1a1bea1611f5fc0ULL, |
| 95 | 0x8d8d0e8d1c830791ULL, 0x3d3df43df5c97ac8ULL, 0x97976697ccf1335bULL, |
| 96 | 0x0000000000000000ULL, 0xcfcf1bcf36d483f9ULL, 0x2b2bac2b4587566eULL, |
| 97 | 0x7676c57697b3ece1ULL, 0x8282328264b019e6ULL, 0xd6d67fd6fea9b128ULL, |
| 98 | 0x1b1b6c1bd87736c3ULL, 0xb5b5eeb5c15b7774ULL, 0xafaf86af112943beULL, |
| 99 | 0x6a6ab56a77dfd41dULL, 0x50505d50ba0da0eaULL, 0x45450945124c8a57ULL, |
| 100 | 0xf3f3ebf3cb18fb38ULL, 0x3030c0309df060adULL, 0xefef9bef2b74c3c4ULL, |
| 101 | 0x3f3ffc3fe5c37edaULL, 0x55554955921caac7ULL, 0xa2a2b2a2791059dbULL, |
| 102 | 0xeaea8fea0365c9e9ULL, 0x656589650fecca6aULL, 0xbabad2bab9686903ULL, |
| 103 | 0x2f2fbc2f65935e4aULL, 0xc0c027c04ee79d8eULL, 0xdede5fdebe81a160ULL, |
| 104 | 0x1c1c701ce06c38fcULL, 0xfdfdd3fdbb2ee746ULL, 0x4d4d294d52649a1fULL, |
| 105 | 0x92927292e4e03976ULL, 0x7575c9758fbceafaULL, 0x06061806301e0c36ULL, |
| 106 | 0x8a8a128a249809aeULL, 0xb2b2f2b2f940794bULL, 0xe6e6bfe66359d185ULL, |
| 107 | 0x0e0e380e70361c7eULL, 0x1f1f7c1ff8633ee7ULL, 0x6262956237f7c455ULL, |
| 108 | 0xd4d477d4eea3b53aULL, 0xa8a89aa829324d81ULL, 0x96966296c4f43152ULL, |
| 109 | 0xf9f9c3f99b3aef62ULL, 0xc5c533c566f697a3ULL, 0x2525942535b14a10ULL, |
| 110 | 0x59597959f220b2abULL, 0x84842a8454ae15d0ULL, 0x7272d572b7a7e4c5ULL, |
| 111 | 0x3939e439d5dd72ecULL, 0x4c4c2d4c5a619816ULL, 0x5e5e655eca3bbc94ULL, |
| 112 | 0x7878fd78e785f09fULL, 0x3838e038ddd870e5ULL, 0x8c8c0a8c14860598ULL, |
| 113 | 0xd1d163d1c6b2bf17ULL, 0xa5a5aea5410b57e4ULL, 0xe2e2afe2434dd9a1ULL, |
| 114 | 0x616199612ff8c24eULL, 0xb3b3f6b3f1457b42ULL, 0x2121842115a54234ULL, |
| 115 | 0x9c9c4a9c94d62508ULL, 0x1e1e781ef0663ceeULL, 0x4343114322528661ULL, |
| 116 | 0xc7c73bc776fc93b1ULL, 0xfcfcd7fcb32be54fULL, 0x0404100420140824ULL, |
| 117 | 0x51515951b208a2e3ULL, 0x99995e99bcc72f25ULL, 0x6d6da96d4fc4da22ULL, |
| 118 | 0x0d0d340d68391a65ULL, 0xfafacffa8335e979ULL, 0xdfdf5bdfb684a369ULL, |
| 119 | 0x7e7ee57ed79bfca9ULL, 0x242490243db44819ULL, 0x3b3bec3bc5d776feULL, |
| 120 | 0xabab96ab313d4b9aULL, 0xcece1fce3ed181f0ULL, 0x1111441188552299ULL, |
| 121 | 0x8f8f068f0c890383ULL, 0x4e4e254e4a6b9c04ULL, 0xb7b7e6b7d1517366ULL, |
| 122 | 0xebeb8beb0b60cbe0ULL, 0x3c3cf03cfdcc78c1ULL, 0x81813e817cbf1ffdULL, |
| 123 | 0x94946a94d4fe3540ULL, 0xf7f7fbf7eb0cf31cULL, 0xb9b9deb9a1676f18ULL, |
| 124 | 0x13134c13985f268bULL, 0x2c2cb02c7d9c5851ULL, 0xd3d36bd3d6b8bb05ULL, |
| 125 | 0xe7e7bbe76b5cd38cULL, 0x6e6ea56e57cbdc39ULL, 0xc4c437c46ef395aaULL, |
| 126 | 0x03030c03180f061bULL, 0x565645568a13acdcULL, 0x44440d441a49885eULL, |
| 127 | 0x7f7fe17fdf9efea0ULL, 0xa9a99ea921374f88ULL, 0x2a2aa82a4d825467ULL, |
| 128 | 0xbbbbd6bbb16d6b0aULL, 0xc1c123c146e29f87ULL, 0x53535153a202a6f1ULL, |
| 129 | 0xdcdc57dcae8ba572ULL, 0x0b0b2c0b58271653ULL, 0x9d9d4e9d9cd32701ULL, |
| 130 | 0x6c6cad6c47c1d82bULL, 0x3131c43195f562a4ULL, 0x7474cd7487b9e8f3ULL, |
| 131 | 0xf6f6fff6e309f115ULL, 0x464605460a438c4cULL, 0xacac8aac092645a5ULL, |
| 132 | 0x89891e893c970fb5ULL, 0x14145014a04428b4ULL, 0xe1e1a3e15b42dfbaULL, |
| 133 | 0x16165816b04e2ca6ULL, 0x3a3ae83acdd274f7ULL, 0x6969b9696fd0d206ULL, |
| 134 | 0x09092409482d1241ULL, 0x7070dd70a7ade0d7ULL, 0xb6b6e2b6d954716fULL, |
| 135 | 0xd0d067d0ceb7bd1eULL, 0xeded93ed3b7ec7d6ULL, 0xcccc17cc2edb85e2ULL, |
| 136 | 0x424215422a578468ULL, 0x98985a98b4c22d2cULL, 0xa4a4aaa4490e55edULL, |
| 137 | 0x2828a0285d885075ULL, 0x5c5c6d5cda31b886ULL, 0xf8f8c7f8933fed6bULL, |
| 138 | 0x8686228644a411c2ULL, |
| 139 | }; |
| 140 | |
| 141 | static const u64 C1[256] = { |
| 142 | 0xd818186018c07830ULL, 0x2623238c2305af46ULL, 0xb8c6c63fc67ef991ULL, |
| 143 | 0xfbe8e887e8136fcdULL, 0xcb878726874ca113ULL, 0x11b8b8dab8a9626dULL, |
| 144 | 0x0901010401080502ULL, 0x0d4f4f214f426e9eULL, 0x9b3636d836adee6cULL, |
| 145 | 0xffa6a6a2a6590451ULL, 0x0cd2d26fd2debdb9ULL, 0x0ef5f5f3f5fb06f7ULL, |
| 146 | 0x967979f979ef80f2ULL, 0x306f6fa16f5fcedeULL, 0x6d91917e91fcef3fULL, |
| 147 | 0xf852525552aa07a4ULL, 0x4760609d6027fdc0ULL, 0x35bcbccabc897665ULL, |
| 148 | 0x379b9b569baccd2bULL, 0x8a8e8e028e048c01ULL, 0xd2a3a3b6a371155bULL, |
| 149 | 0x6c0c0c300c603c18ULL, 0x847b7bf17bff8af6ULL, 0x803535d435b5e16aULL, |
| 150 | 0xf51d1d741de8693aULL, 0xb3e0e0a7e05347ddULL, 0x21d7d77bd7f6acb3ULL, |
| 151 | 0x9cc2c22fc25eed99ULL, 0x432e2eb82e6d965cULL, 0x294b4b314b627a96ULL, |
| 152 | 0x5dfefedffea321e1ULL, 0xd5575741578216aeULL, 0xbd15155415a8412aULL, |
| 153 | 0xe87777c1779fb6eeULL, 0x923737dc37a5eb6eULL, 0x9ee5e5b3e57b56d7ULL, |
| 154 | 0x139f9f469f8cd923ULL, 0x23f0f0e7f0d317fdULL, 0x204a4a354a6a7f94ULL, |
| 155 | 0x44dada4fda9e95a9ULL, 0xa258587d58fa25b0ULL, 0xcfc9c903c906ca8fULL, |
| 156 | 0x7c2929a429558d52ULL, 0x5a0a0a280a502214ULL, 0x50b1b1feb1e14f7fULL, |
| 157 | 0xc9a0a0baa0691a5dULL, 0x146b6bb16b7fdad6ULL, 0xd985852e855cab17ULL, |
| 158 | 0x3cbdbdcebd817367ULL, 0x8f5d5d695dd234baULL, 0x9010104010805020ULL, |
| 159 | 0x07f4f4f7f4f303f5ULL, 0xddcbcb0bcb16c08bULL, 0xd33e3ef83eedc67cULL, |
| 160 | 0x2d0505140528110aULL, 0x78676781671fe6ceULL, 0x97e4e4b7e47353d5ULL, |
| 161 | 0x0227279c2725bb4eULL, 0x7341411941325882ULL, 0xa78b8b168b2c9d0bULL, |
| 162 | 0xf6a7a7a6a7510153ULL, 0xb27d7de97dcf94faULL, 0x4995956e95dcfb37ULL, |
| 163 | 0x56d8d847d88e9fadULL, 0x70fbfbcbfb8b30ebULL, 0xcdeeee9fee2371c1ULL, |
| 164 | 0xbb7c7ced7cc791f8ULL, 0x716666856617e3ccULL, 0x7bdddd53dda68ea7ULL, |
| 165 | 0xaf17175c17b84b2eULL, 0x454747014702468eULL, 0x1a9e9e429e84dc21ULL, |
| 166 | 0xd4caca0fca1ec589ULL, 0x582d2db42d75995aULL, 0x2ebfbfc6bf917963ULL, |
| 167 | 0x3f07071c07381b0eULL, 0xacadad8ead012347ULL, 0xb05a5a755aea2fb4ULL, |
| 168 | 0xef838336836cb51bULL, 0xb63333cc3385ff66ULL, 0x5c636391633ff2c6ULL, |
| 169 | 0x1202020802100a04ULL, 0x93aaaa92aa393849ULL, 0xde7171d971afa8e2ULL, |
| 170 | 0xc6c8c807c80ecf8dULL, 0xd119196419c87d32ULL, 0x3b49493949727092ULL, |
| 171 | 0x5fd9d943d9869aafULL, 0x31f2f2eff2c31df9ULL, 0xa8e3e3abe34b48dbULL, |
| 172 | 0xb95b5b715be22ab6ULL, 0xbc88881a8834920dULL, 0x3e9a9a529aa4c829ULL, |
| 173 | 0x0b262698262dbe4cULL, 0xbf3232c8328dfa64ULL, 0x59b0b0fab0e94a7dULL, |
| 174 | 0xf2e9e983e91b6acfULL, 0x770f0f3c0f78331eULL, 0x33d5d573d5e6a6b7ULL, |
| 175 | 0xf480803a8074ba1dULL, 0x27bebec2be997c61ULL, 0xebcdcd13cd26de87ULL, |
| 176 | 0x893434d034bde468ULL, 0x3248483d487a7590ULL, 0x54ffffdbffab24e3ULL, |
| 177 | 0x8d7a7af57af78ff4ULL, 0x6490907a90f4ea3dULL, 0x9d5f5f615fc23ebeULL, |
| 178 | 0x3d202080201da040ULL, 0x0f6868bd6867d5d0ULL, 0xca1a1a681ad07234ULL, |
| 179 | 0xb7aeae82ae192c41ULL, 0x7db4b4eab4c95e75ULL, 0xce54544d549a19a8ULL, |
| 180 | 0x7f93937693ece53bULL, 0x2f222288220daa44ULL, 0x6364648d6407e9c8ULL, |
| 181 | 0x2af1f1e3f1db12ffULL, 0xcc7373d173bfa2e6ULL, 0x8212124812905a24ULL, |
| 182 | 0x7a40401d403a5d80ULL, 0x4808082008402810ULL, 0x95c3c32bc356e89bULL, |
| 183 | 0xdfecec97ec337bc5ULL, 0x4ddbdb4bdb9690abULL, 0xc0a1a1bea1611f5fULL, |
| 184 | 0x918d8d0e8d1c8307ULL, 0xc83d3df43df5c97aULL, 0x5b97976697ccf133ULL, |
| 185 | 0x0000000000000000ULL, 0xf9cfcf1bcf36d483ULL, 0x6e2b2bac2b458756ULL, |
| 186 | 0xe17676c57697b3ecULL, 0xe68282328264b019ULL, 0x28d6d67fd6fea9b1ULL, |
| 187 | 0xc31b1b6c1bd87736ULL, 0x74b5b5eeb5c15b77ULL, 0xbeafaf86af112943ULL, |
| 188 | 0x1d6a6ab56a77dfd4ULL, 0xea50505d50ba0da0ULL, 0x5745450945124c8aULL, |
| 189 | 0x38f3f3ebf3cb18fbULL, 0xad3030c0309df060ULL, 0xc4efef9bef2b74c3ULL, |
| 190 | 0xda3f3ffc3fe5c37eULL, 0xc755554955921caaULL, 0xdba2a2b2a2791059ULL, |
| 191 | 0xe9eaea8fea0365c9ULL, 0x6a656589650feccaULL, 0x03babad2bab96869ULL, |
| 192 | 0x4a2f2fbc2f65935eULL, 0x8ec0c027c04ee79dULL, 0x60dede5fdebe81a1ULL, |
| 193 | 0xfc1c1c701ce06c38ULL, 0x46fdfdd3fdbb2ee7ULL, 0x1f4d4d294d52649aULL, |
| 194 | 0x7692927292e4e039ULL, 0xfa7575c9758fbceaULL, 0x3606061806301e0cULL, |
| 195 | 0xae8a8a128a249809ULL, 0x4bb2b2f2b2f94079ULL, 0x85e6e6bfe66359d1ULL, |
| 196 | 0x7e0e0e380e70361cULL, 0xe71f1f7c1ff8633eULL, 0x556262956237f7c4ULL, |
| 197 | 0x3ad4d477d4eea3b5ULL, 0x81a8a89aa829324dULL, 0x5296966296c4f431ULL, |
| 198 | 0x62f9f9c3f99b3aefULL, 0xa3c5c533c566f697ULL, 0x102525942535b14aULL, |
| 199 | 0xab59597959f220b2ULL, 0xd084842a8454ae15ULL, 0xc57272d572b7a7e4ULL, |
| 200 | 0xec3939e439d5dd72ULL, 0x164c4c2d4c5a6198ULL, 0x945e5e655eca3bbcULL, |
| 201 | 0x9f7878fd78e785f0ULL, 0xe53838e038ddd870ULL, 0x988c8c0a8c148605ULL, |
| 202 | 0x17d1d163d1c6b2bfULL, 0xe4a5a5aea5410b57ULL, 0xa1e2e2afe2434dd9ULL, |
| 203 | 0x4e616199612ff8c2ULL, 0x42b3b3f6b3f1457bULL, 0x342121842115a542ULL, |
| 204 | 0x089c9c4a9c94d625ULL, 0xee1e1e781ef0663cULL, 0x6143431143225286ULL, |
| 205 | 0xb1c7c73bc776fc93ULL, 0x4ffcfcd7fcb32be5ULL, 0x2404041004201408ULL, |
| 206 | 0xe351515951b208a2ULL, 0x2599995e99bcc72fULL, 0x226d6da96d4fc4daULL, |
| 207 | 0x650d0d340d68391aULL, 0x79fafacffa8335e9ULL, 0x69dfdf5bdfb684a3ULL, |
| 208 | 0xa97e7ee57ed79bfcULL, 0x19242490243db448ULL, 0xfe3b3bec3bc5d776ULL, |
| 209 | 0x9aabab96ab313d4bULL, 0xf0cece1fce3ed181ULL, 0x9911114411885522ULL, |
| 210 | 0x838f8f068f0c8903ULL, 0x044e4e254e4a6b9cULL, 0x66b7b7e6b7d15173ULL, |
| 211 | 0xe0ebeb8beb0b60cbULL, 0xc13c3cf03cfdcc78ULL, 0xfd81813e817cbf1fULL, |
| 212 | 0x4094946a94d4fe35ULL, 0x1cf7f7fbf7eb0cf3ULL, 0x18b9b9deb9a1676fULL, |
| 213 | 0x8b13134c13985f26ULL, 0x512c2cb02c7d9c58ULL, 0x05d3d36bd3d6b8bbULL, |
| 214 | 0x8ce7e7bbe76b5cd3ULL, 0x396e6ea56e57cbdcULL, 0xaac4c437c46ef395ULL, |
| 215 | 0x1b03030c03180f06ULL, 0xdc565645568a13acULL, 0x5e44440d441a4988ULL, |
| 216 | 0xa07f7fe17fdf9efeULL, 0x88a9a99ea921374fULL, 0x672a2aa82a4d8254ULL, |
| 217 | 0x0abbbbd6bbb16d6bULL, 0x87c1c123c146e29fULL, 0xf153535153a202a6ULL, |
| 218 | 0x72dcdc57dcae8ba5ULL, 0x530b0b2c0b582716ULL, 0x019d9d4e9d9cd327ULL, |
| 219 | 0x2b6c6cad6c47c1d8ULL, 0xa43131c43195f562ULL, 0xf37474cd7487b9e8ULL, |
| 220 | 0x15f6f6fff6e309f1ULL, 0x4c464605460a438cULL, 0xa5acac8aac092645ULL, |
| 221 | 0xb589891e893c970fULL, 0xb414145014a04428ULL, 0xbae1e1a3e15b42dfULL, |
| 222 | 0xa616165816b04e2cULL, 0xf73a3ae83acdd274ULL, 0x066969b9696fd0d2ULL, |
| 223 | 0x4109092409482d12ULL, 0xd77070dd70a7ade0ULL, 0x6fb6b6e2b6d95471ULL, |
| 224 | 0x1ed0d067d0ceb7bdULL, 0xd6eded93ed3b7ec7ULL, 0xe2cccc17cc2edb85ULL, |
| 225 | 0x68424215422a5784ULL, 0x2c98985a98b4c22dULL, 0xeda4a4aaa4490e55ULL, |
| 226 | 0x752828a0285d8850ULL, 0x865c5c6d5cda31b8ULL, 0x6bf8f8c7f8933fedULL, |
| 227 | 0xc28686228644a411ULL, |
| 228 | }; |
| 229 | |
| 230 | static const u64 C2[256] = { |
| 231 | 0x30d818186018c078ULL, 0x462623238c2305afULL, 0x91b8c6c63fc67ef9ULL, |
| 232 | 0xcdfbe8e887e8136fULL, 0x13cb878726874ca1ULL, 0x6d11b8b8dab8a962ULL, |
| 233 | 0x0209010104010805ULL, 0x9e0d4f4f214f426eULL, 0x6c9b3636d836adeeULL, |
| 234 | 0x51ffa6a6a2a65904ULL, 0xb90cd2d26fd2debdULL, 0xf70ef5f5f3f5fb06ULL, |
| 235 | 0xf2967979f979ef80ULL, 0xde306f6fa16f5fceULL, 0x3f6d91917e91fcefULL, |
| 236 | 0xa4f852525552aa07ULL, 0xc04760609d6027fdULL, 0x6535bcbccabc8976ULL, |
| 237 | 0x2b379b9b569baccdULL, 0x018a8e8e028e048cULL, 0x5bd2a3a3b6a37115ULL, |
| 238 | 0x186c0c0c300c603cULL, 0xf6847b7bf17bff8aULL, 0x6a803535d435b5e1ULL, |
| 239 | 0x3af51d1d741de869ULL, 0xddb3e0e0a7e05347ULL, 0xb321d7d77bd7f6acULL, |
| 240 | 0x999cc2c22fc25eedULL, 0x5c432e2eb82e6d96ULL, 0x96294b4b314b627aULL, |
| 241 | 0xe15dfefedffea321ULL, 0xaed5575741578216ULL, 0x2abd15155415a841ULL, |
| 242 | 0xeee87777c1779fb6ULL, 0x6e923737dc37a5ebULL, 0xd79ee5e5b3e57b56ULL, |
| 243 | 0x23139f9f469f8cd9ULL, 0xfd23f0f0e7f0d317ULL, 0x94204a4a354a6a7fULL, |
| 244 | 0xa944dada4fda9e95ULL, 0xb0a258587d58fa25ULL, 0x8fcfc9c903c906caULL, |
| 245 | 0x527c2929a429558dULL, 0x145a0a0a280a5022ULL, 0x7f50b1b1feb1e14fULL, |
| 246 | 0x5dc9a0a0baa0691aULL, 0xd6146b6bb16b7fdaULL, 0x17d985852e855cabULL, |
| 247 | 0x673cbdbdcebd8173ULL, 0xba8f5d5d695dd234ULL, 0x2090101040108050ULL, |
| 248 | 0xf507f4f4f7f4f303ULL, 0x8bddcbcb0bcb16c0ULL, 0x7cd33e3ef83eedc6ULL, |
| 249 | 0x0a2d050514052811ULL, 0xce78676781671fe6ULL, 0xd597e4e4b7e47353ULL, |
| 250 | 0x4e0227279c2725bbULL, 0x8273414119413258ULL, 0x0ba78b8b168b2c9dULL, |
| 251 | 0x53f6a7a7a6a75101ULL, 0xfab27d7de97dcf94ULL, 0x374995956e95dcfbULL, |
| 252 | 0xad56d8d847d88e9fULL, 0xeb70fbfbcbfb8b30ULL, 0xc1cdeeee9fee2371ULL, |
| 253 | 0xf8bb7c7ced7cc791ULL, 0xcc716666856617e3ULL, 0xa77bdddd53dda68eULL, |
| 254 | 0x2eaf17175c17b84bULL, 0x8e45474701470246ULL, 0x211a9e9e429e84dcULL, |
| 255 | 0x89d4caca0fca1ec5ULL, 0x5a582d2db42d7599ULL, 0x632ebfbfc6bf9179ULL, |
| 256 | 0x0e3f07071c07381bULL, 0x47acadad8ead0123ULL, 0xb4b05a5a755aea2fULL, |
| 257 | 0x1bef838336836cb5ULL, 0x66b63333cc3385ffULL, 0xc65c636391633ff2ULL, |
| 258 | 0x041202020802100aULL, 0x4993aaaa92aa3938ULL, 0xe2de7171d971afa8ULL, |
| 259 | 0x8dc6c8c807c80ecfULL, 0x32d119196419c87dULL, 0x923b494939497270ULL, |
| 260 | 0xaf5fd9d943d9869aULL, 0xf931f2f2eff2c31dULL, 0xdba8e3e3abe34b48ULL, |
| 261 | 0xb6b95b5b715be22aULL, 0x0dbc88881a883492ULL, 0x293e9a9a529aa4c8ULL, |
| 262 | 0x4c0b262698262dbeULL, 0x64bf3232c8328dfaULL, 0x7d59b0b0fab0e94aULL, |
| 263 | 0xcff2e9e983e91b6aULL, 0x1e770f0f3c0f7833ULL, 0xb733d5d573d5e6a6ULL, |
| 264 | 0x1df480803a8074baULL, 0x6127bebec2be997cULL, 0x87ebcdcd13cd26deULL, |
| 265 | 0x68893434d034bde4ULL, 0x903248483d487a75ULL, 0xe354ffffdbffab24ULL, |
| 266 | 0xf48d7a7af57af78fULL, 0x3d6490907a90f4eaULL, 0xbe9d5f5f615fc23eULL, |
| 267 | 0x403d202080201da0ULL, 0xd00f6868bd6867d5ULL, 0x34ca1a1a681ad072ULL, |
| 268 | 0x41b7aeae82ae192cULL, 0x757db4b4eab4c95eULL, 0xa8ce54544d549a19ULL, |
| 269 | 0x3b7f93937693ece5ULL, 0x442f222288220daaULL, 0xc86364648d6407e9ULL, |
| 270 | 0xff2af1f1e3f1db12ULL, 0xe6cc7373d173bfa2ULL, 0x248212124812905aULL, |
| 271 | 0x807a40401d403a5dULL, 0x1048080820084028ULL, 0x9b95c3c32bc356e8ULL, |
| 272 | 0xc5dfecec97ec337bULL, 0xab4ddbdb4bdb9690ULL, 0x5fc0a1a1bea1611fULL, |
| 273 | 0x07918d8d0e8d1c83ULL, 0x7ac83d3df43df5c9ULL, 0x335b97976697ccf1ULL, |
| 274 | 0x0000000000000000ULL, 0x83f9cfcf1bcf36d4ULL, 0x566e2b2bac2b4587ULL, |
| 275 | 0xece17676c57697b3ULL, 0x19e68282328264b0ULL, 0xb128d6d67fd6fea9ULL, |
| 276 | 0x36c31b1b6c1bd877ULL, 0x7774b5b5eeb5c15bULL, 0x43beafaf86af1129ULL, |
| 277 | 0xd41d6a6ab56a77dfULL, 0xa0ea50505d50ba0dULL, 0x8a5745450945124cULL, |
| 278 | 0xfb38f3f3ebf3cb18ULL, 0x60ad3030c0309df0ULL, 0xc3c4efef9bef2b74ULL, |
| 279 | 0x7eda3f3ffc3fe5c3ULL, 0xaac755554955921cULL, 0x59dba2a2b2a27910ULL, |
| 280 | 0xc9e9eaea8fea0365ULL, 0xca6a656589650fecULL, 0x6903babad2bab968ULL, |
| 281 | 0x5e4a2f2fbc2f6593ULL, 0x9d8ec0c027c04ee7ULL, 0xa160dede5fdebe81ULL, |
| 282 | 0x38fc1c1c701ce06cULL, 0xe746fdfdd3fdbb2eULL, 0x9a1f4d4d294d5264ULL, |
| 283 | 0x397692927292e4e0ULL, 0xeafa7575c9758fbcULL, 0x0c3606061806301eULL, |
| 284 | 0x09ae8a8a128a2498ULL, 0x794bb2b2f2b2f940ULL, 0xd185e6e6bfe66359ULL, |
| 285 | 0x1c7e0e0e380e7036ULL, 0x3ee71f1f7c1ff863ULL, 0xc4556262956237f7ULL, |
| 286 | 0xb53ad4d477d4eea3ULL, 0x4d81a8a89aa82932ULL, 0x315296966296c4f4ULL, |
| 287 | 0xef62f9f9c3f99b3aULL, 0x97a3c5c533c566f6ULL, 0x4a102525942535b1ULL, |
| 288 | 0xb2ab59597959f220ULL, 0x15d084842a8454aeULL, 0xe4c57272d572b7a7ULL, |
| 289 | 0x72ec3939e439d5ddULL, 0x98164c4c2d4c5a61ULL, 0xbc945e5e655eca3bULL, |
| 290 | 0xf09f7878fd78e785ULL, 0x70e53838e038ddd8ULL, 0x05988c8c0a8c1486ULL, |
| 291 | 0xbf17d1d163d1c6b2ULL, 0x57e4a5a5aea5410bULL, 0xd9a1e2e2afe2434dULL, |
| 292 | 0xc24e616199612ff8ULL, 0x7b42b3b3f6b3f145ULL, 0x42342121842115a5ULL, |
| 293 | 0x25089c9c4a9c94d6ULL, 0x3cee1e1e781ef066ULL, 0x8661434311432252ULL, |
| 294 | 0x93b1c7c73bc776fcULL, 0xe54ffcfcd7fcb32bULL, 0x0824040410042014ULL, |
| 295 | 0xa2e351515951b208ULL, 0x2f2599995e99bcc7ULL, 0xda226d6da96d4fc4ULL, |
| 296 | 0x1a650d0d340d6839ULL, 0xe979fafacffa8335ULL, 0xa369dfdf5bdfb684ULL, |
| 297 | 0xfca97e7ee57ed79bULL, 0x4819242490243db4ULL, 0x76fe3b3bec3bc5d7ULL, |
| 298 | 0x4b9aabab96ab313dULL, 0x81f0cece1fce3ed1ULL, 0x2299111144118855ULL, |
| 299 | 0x03838f8f068f0c89ULL, 0x9c044e4e254e4a6bULL, 0x7366b7b7e6b7d151ULL, |
| 300 | 0xcbe0ebeb8beb0b60ULL, 0x78c13c3cf03cfdccULL, 0x1ffd81813e817cbfULL, |
| 301 | 0x354094946a94d4feULL, 0xf31cf7f7fbf7eb0cULL, 0x6f18b9b9deb9a167ULL, |
| 302 | 0x268b13134c13985fULL, 0x58512c2cb02c7d9cULL, 0xbb05d3d36bd3d6b8ULL, |
| 303 | 0xd38ce7e7bbe76b5cULL, 0xdc396e6ea56e57cbULL, 0x95aac4c437c46ef3ULL, |
| 304 | 0x061b03030c03180fULL, 0xacdc565645568a13ULL, 0x885e44440d441a49ULL, |
| 305 | 0xfea07f7fe17fdf9eULL, 0x4f88a9a99ea92137ULL, 0x54672a2aa82a4d82ULL, |
| 306 | 0x6b0abbbbd6bbb16dULL, 0x9f87c1c123c146e2ULL, 0xa6f153535153a202ULL, |
| 307 | 0xa572dcdc57dcae8bULL, 0x16530b0b2c0b5827ULL, 0x27019d9d4e9d9cd3ULL, |
| 308 | 0xd82b6c6cad6c47c1ULL, 0x62a43131c43195f5ULL, 0xe8f37474cd7487b9ULL, |
| 309 | 0xf115f6f6fff6e309ULL, 0x8c4c464605460a43ULL, 0x45a5acac8aac0926ULL, |
| 310 | 0x0fb589891e893c97ULL, 0x28b414145014a044ULL, 0xdfbae1e1a3e15b42ULL, |
| 311 | 0x2ca616165816b04eULL, 0x74f73a3ae83acdd2ULL, 0xd2066969b9696fd0ULL, |
| 312 | 0x124109092409482dULL, 0xe0d77070dd70a7adULL, 0x716fb6b6e2b6d954ULL, |
| 313 | 0xbd1ed0d067d0ceb7ULL, 0xc7d6eded93ed3b7eULL, 0x85e2cccc17cc2edbULL, |
| 314 | 0x8468424215422a57ULL, 0x2d2c98985a98b4c2ULL, 0x55eda4a4aaa4490eULL, |
| 315 | 0x50752828a0285d88ULL, 0xb8865c5c6d5cda31ULL, 0xed6bf8f8c7f8933fULL, |
| 316 | 0x11c28686228644a4ULL, |
| 317 | }; |
| 318 | |
| 319 | static const u64 C3[256] = { |
| 320 | 0x7830d818186018c0ULL, 0xaf462623238c2305ULL, 0xf991b8c6c63fc67eULL, |
| 321 | 0x6fcdfbe8e887e813ULL, 0xa113cb878726874cULL, 0x626d11b8b8dab8a9ULL, |
| 322 | 0x0502090101040108ULL, 0x6e9e0d4f4f214f42ULL, 0xee6c9b3636d836adULL, |
| 323 | 0x0451ffa6a6a2a659ULL, 0xbdb90cd2d26fd2deULL, 0x06f70ef5f5f3f5fbULL, |
| 324 | 0x80f2967979f979efULL, 0xcede306f6fa16f5fULL, 0xef3f6d91917e91fcULL, |
| 325 | 0x07a4f852525552aaULL, 0xfdc04760609d6027ULL, 0x766535bcbccabc89ULL, |
| 326 | 0xcd2b379b9b569bacULL, 0x8c018a8e8e028e04ULL, 0x155bd2a3a3b6a371ULL, |
| 327 | 0x3c186c0c0c300c60ULL, 0x8af6847b7bf17bffULL, 0xe16a803535d435b5ULL, |
| 328 | 0x693af51d1d741de8ULL, 0x47ddb3e0e0a7e053ULL, 0xacb321d7d77bd7f6ULL, |
| 329 | 0xed999cc2c22fc25eULL, 0x965c432e2eb82e6dULL, 0x7a96294b4b314b62ULL, |
| 330 | 0x21e15dfefedffea3ULL, 0x16aed55757415782ULL, 0x412abd15155415a8ULL, |
| 331 | 0xb6eee87777c1779fULL, 0xeb6e923737dc37a5ULL, 0x56d79ee5e5b3e57bULL, |
| 332 | 0xd923139f9f469f8cULL, 0x17fd23f0f0e7f0d3ULL, 0x7f94204a4a354a6aULL, |
| 333 | 0x95a944dada4fda9eULL, 0x25b0a258587d58faULL, 0xca8fcfc9c903c906ULL, |
| 334 | 0x8d527c2929a42955ULL, 0x22145a0a0a280a50ULL, 0x4f7f50b1b1feb1e1ULL, |
| 335 | 0x1a5dc9a0a0baa069ULL, 0xdad6146b6bb16b7fULL, 0xab17d985852e855cULL, |
| 336 | 0x73673cbdbdcebd81ULL, 0x34ba8f5d5d695dd2ULL, 0x5020901010401080ULL, |
| 337 | 0x03f507f4f4f7f4f3ULL, 0xc08bddcbcb0bcb16ULL, 0xc67cd33e3ef83eedULL, |
| 338 | 0x110a2d0505140528ULL, 0xe6ce78676781671fULL, 0x53d597e4e4b7e473ULL, |
| 339 | 0xbb4e0227279c2725ULL, 0x5882734141194132ULL, 0x9d0ba78b8b168b2cULL, |
| 340 | 0x0153f6a7a7a6a751ULL, 0x94fab27d7de97dcfULL, 0xfb374995956e95dcULL, |
| 341 | 0x9fad56d8d847d88eULL, 0x30eb70fbfbcbfb8bULL, 0x71c1cdeeee9fee23ULL, |
| 342 | 0x91f8bb7c7ced7cc7ULL, 0xe3cc716666856617ULL, 0x8ea77bdddd53dda6ULL, |
| 343 | 0x4b2eaf17175c17b8ULL, 0x468e454747014702ULL, 0xdc211a9e9e429e84ULL, |
| 344 | 0xc589d4caca0fca1eULL, 0x995a582d2db42d75ULL, 0x79632ebfbfc6bf91ULL, |
| 345 | 0x1b0e3f07071c0738ULL, 0x2347acadad8ead01ULL, 0x2fb4b05a5a755aeaULL, |
| 346 | 0xb51bef838336836cULL, 0xff66b63333cc3385ULL, 0xf2c65c636391633fULL, |
| 347 | 0x0a04120202080210ULL, 0x384993aaaa92aa39ULL, 0xa8e2de7171d971afULL, |
| 348 | 0xcf8dc6c8c807c80eULL, 0x7d32d119196419c8ULL, 0x70923b4949394972ULL, |
| 349 | 0x9aaf5fd9d943d986ULL, 0x1df931f2f2eff2c3ULL, 0x48dba8e3e3abe34bULL, |
| 350 | 0x2ab6b95b5b715be2ULL, 0x920dbc88881a8834ULL, 0xc8293e9a9a529aa4ULL, |
| 351 | 0xbe4c0b262698262dULL, 0xfa64bf3232c8328dULL, 0x4a7d59b0b0fab0e9ULL, |
| 352 | 0x6acff2e9e983e91bULL, 0x331e770f0f3c0f78ULL, 0xa6b733d5d573d5e6ULL, |
| 353 | 0xba1df480803a8074ULL, 0x7c6127bebec2be99ULL, 0xde87ebcdcd13cd26ULL, |
| 354 | 0xe468893434d034bdULL, 0x75903248483d487aULL, 0x24e354ffffdbffabULL, |
| 355 | 0x8ff48d7a7af57af7ULL, 0xea3d6490907a90f4ULL, 0x3ebe9d5f5f615fc2ULL, |
| 356 | 0xa0403d202080201dULL, 0xd5d00f6868bd6867ULL, 0x7234ca1a1a681ad0ULL, |
| 357 | 0x2c41b7aeae82ae19ULL, 0x5e757db4b4eab4c9ULL, 0x19a8ce54544d549aULL, |
| 358 | 0xe53b7f93937693ecULL, 0xaa442f222288220dULL, 0xe9c86364648d6407ULL, |
| 359 | 0x12ff2af1f1e3f1dbULL, 0xa2e6cc7373d173bfULL, 0x5a24821212481290ULL, |
| 360 | 0x5d807a40401d403aULL, 0x2810480808200840ULL, 0xe89b95c3c32bc356ULL, |
| 361 | 0x7bc5dfecec97ec33ULL, 0x90ab4ddbdb4bdb96ULL, 0x1f5fc0a1a1bea161ULL, |
| 362 | 0x8307918d8d0e8d1cULL, 0xc97ac83d3df43df5ULL, 0xf1335b97976697ccULL, |
| 363 | 0x0000000000000000ULL, 0xd483f9cfcf1bcf36ULL, 0x87566e2b2bac2b45ULL, |
| 364 | 0xb3ece17676c57697ULL, 0xb019e68282328264ULL, 0xa9b128d6d67fd6feULL, |
| 365 | 0x7736c31b1b6c1bd8ULL, 0x5b7774b5b5eeb5c1ULL, 0x2943beafaf86af11ULL, |
| 366 | 0xdfd41d6a6ab56a77ULL, 0x0da0ea50505d50baULL, 0x4c8a574545094512ULL, |
| 367 | 0x18fb38f3f3ebf3cbULL, 0xf060ad3030c0309dULL, 0x74c3c4efef9bef2bULL, |
| 368 | 0xc37eda3f3ffc3fe5ULL, 0x1caac75555495592ULL, 0x1059dba2a2b2a279ULL, |
| 369 | 0x65c9e9eaea8fea03ULL, 0xecca6a656589650fULL, 0x686903babad2bab9ULL, |
| 370 | 0x935e4a2f2fbc2f65ULL, 0xe79d8ec0c027c04eULL, 0x81a160dede5fdebeULL, |
| 371 | 0x6c38fc1c1c701ce0ULL, 0x2ee746fdfdd3fdbbULL, 0x649a1f4d4d294d52ULL, |
| 372 | 0xe0397692927292e4ULL, 0xbceafa7575c9758fULL, 0x1e0c360606180630ULL, |
| 373 | 0x9809ae8a8a128a24ULL, 0x40794bb2b2f2b2f9ULL, 0x59d185e6e6bfe663ULL, |
| 374 | 0x361c7e0e0e380e70ULL, 0x633ee71f1f7c1ff8ULL, 0xf7c4556262956237ULL, |
| 375 | 0xa3b53ad4d477d4eeULL, 0x324d81a8a89aa829ULL, 0xf4315296966296c4ULL, |
| 376 | 0x3aef62f9f9c3f99bULL, 0xf697a3c5c533c566ULL, 0xb14a102525942535ULL, |
| 377 | 0x20b2ab59597959f2ULL, 0xae15d084842a8454ULL, 0xa7e4c57272d572b7ULL, |
| 378 | 0xdd72ec3939e439d5ULL, 0x6198164c4c2d4c5aULL, 0x3bbc945e5e655ecaULL, |
| 379 | 0x85f09f7878fd78e7ULL, 0xd870e53838e038ddULL, 0x8605988c8c0a8c14ULL, |
| 380 | 0xb2bf17d1d163d1c6ULL, 0x0b57e4a5a5aea541ULL, 0x4dd9a1e2e2afe243ULL, |
| 381 | 0xf8c24e616199612fULL, 0x457b42b3b3f6b3f1ULL, 0xa542342121842115ULL, |
| 382 | 0xd625089c9c4a9c94ULL, 0x663cee1e1e781ef0ULL, 0x5286614343114322ULL, |
| 383 | 0xfc93b1c7c73bc776ULL, 0x2be54ffcfcd7fcb3ULL, 0x1408240404100420ULL, |
| 384 | 0x08a2e351515951b2ULL, 0xc72f2599995e99bcULL, 0xc4da226d6da96d4fULL, |
| 385 | 0x391a650d0d340d68ULL, 0x35e979fafacffa83ULL, 0x84a369dfdf5bdfb6ULL, |
| 386 | 0x9bfca97e7ee57ed7ULL, 0xb44819242490243dULL, 0xd776fe3b3bec3bc5ULL, |
| 387 | 0x3d4b9aabab96ab31ULL, 0xd181f0cece1fce3eULL, 0x5522991111441188ULL, |
| 388 | 0x8903838f8f068f0cULL, 0x6b9c044e4e254e4aULL, 0x517366b7b7e6b7d1ULL, |
| 389 | 0x60cbe0ebeb8beb0bULL, 0xcc78c13c3cf03cfdULL, 0xbf1ffd81813e817cULL, |
| 390 | 0xfe354094946a94d4ULL, 0x0cf31cf7f7fbf7ebULL, 0x676f18b9b9deb9a1ULL, |
| 391 | 0x5f268b13134c1398ULL, 0x9c58512c2cb02c7dULL, 0xb8bb05d3d36bd3d6ULL, |
| 392 | 0x5cd38ce7e7bbe76bULL, 0xcbdc396e6ea56e57ULL, 0xf395aac4c437c46eULL, |
| 393 | 0x0f061b03030c0318ULL, 0x13acdc565645568aULL, 0x49885e44440d441aULL, |
| 394 | 0x9efea07f7fe17fdfULL, 0x374f88a9a99ea921ULL, 0x8254672a2aa82a4dULL, |
| 395 | 0x6d6b0abbbbd6bbb1ULL, 0xe29f87c1c123c146ULL, 0x02a6f153535153a2ULL, |
| 396 | 0x8ba572dcdc57dcaeULL, 0x2716530b0b2c0b58ULL, 0xd327019d9d4e9d9cULL, |
| 397 | 0xc1d82b6c6cad6c47ULL, 0xf562a43131c43195ULL, 0xb9e8f37474cd7487ULL, |
| 398 | 0x09f115f6f6fff6e3ULL, 0x438c4c464605460aULL, 0x2645a5acac8aac09ULL, |
| 399 | 0x970fb589891e893cULL, 0x4428b414145014a0ULL, 0x42dfbae1e1a3e15bULL, |
| 400 | 0x4e2ca616165816b0ULL, 0xd274f73a3ae83acdULL, 0xd0d2066969b9696fULL, |
| 401 | 0x2d12410909240948ULL, 0xade0d77070dd70a7ULL, 0x54716fb6b6e2b6d9ULL, |
| 402 | 0xb7bd1ed0d067d0ceULL, 0x7ec7d6eded93ed3bULL, 0xdb85e2cccc17cc2eULL, |
| 403 | 0x578468424215422aULL, 0xc22d2c98985a98b4ULL, 0x0e55eda4a4aaa449ULL, |
| 404 | 0x8850752828a0285dULL, 0x31b8865c5c6d5cdaULL, 0x3fed6bf8f8c7f893ULL, |
| 405 | 0xa411c28686228644ULL, |
| 406 | }; |
| 407 | |
| 408 | static const u64 C4[256] = { |
| 409 | 0xc07830d818186018ULL, 0x05af462623238c23ULL, 0x7ef991b8c6c63fc6ULL, |
| 410 | 0x136fcdfbe8e887e8ULL, 0x4ca113cb87872687ULL, 0xa9626d11b8b8dab8ULL, |
| 411 | 0x0805020901010401ULL, 0x426e9e0d4f4f214fULL, 0xadee6c9b3636d836ULL, |
| 412 | 0x590451ffa6a6a2a6ULL, 0xdebdb90cd2d26fd2ULL, 0xfb06f70ef5f5f3f5ULL, |
| 413 | 0xef80f2967979f979ULL, 0x5fcede306f6fa16fULL, 0xfcef3f6d91917e91ULL, |
| 414 | 0xaa07a4f852525552ULL, 0x27fdc04760609d60ULL, 0x89766535bcbccabcULL, |
| 415 | 0xaccd2b379b9b569bULL, 0x048c018a8e8e028eULL, 0x71155bd2a3a3b6a3ULL, |
| 416 | 0x603c186c0c0c300cULL, 0xff8af6847b7bf17bULL, 0xb5e16a803535d435ULL, |
| 417 | 0xe8693af51d1d741dULL, 0x5347ddb3e0e0a7e0ULL, 0xf6acb321d7d77bd7ULL, |
| 418 | 0x5eed999cc2c22fc2ULL, 0x6d965c432e2eb82eULL, 0x627a96294b4b314bULL, |
| 419 | 0xa321e15dfefedffeULL, 0x8216aed557574157ULL, 0xa8412abd15155415ULL, |
| 420 | 0x9fb6eee87777c177ULL, 0xa5eb6e923737dc37ULL, 0x7b56d79ee5e5b3e5ULL, |
| 421 | 0x8cd923139f9f469fULL, 0xd317fd23f0f0e7f0ULL, 0x6a7f94204a4a354aULL, |
| 422 | 0x9e95a944dada4fdaULL, 0xfa25b0a258587d58ULL, 0x06ca8fcfc9c903c9ULL, |
| 423 | 0x558d527c2929a429ULL, 0x5022145a0a0a280aULL, 0xe14f7f50b1b1feb1ULL, |
| 424 | 0x691a5dc9a0a0baa0ULL, 0x7fdad6146b6bb16bULL, 0x5cab17d985852e85ULL, |
| 425 | 0x8173673cbdbdcebdULL, 0xd234ba8f5d5d695dULL, 0x8050209010104010ULL, |
| 426 | 0xf303f507f4f4f7f4ULL, 0x16c08bddcbcb0bcbULL, 0xedc67cd33e3ef83eULL, |
| 427 | 0x28110a2d05051405ULL, 0x1fe6ce7867678167ULL, 0x7353d597e4e4b7e4ULL, |
| 428 | 0x25bb4e0227279c27ULL, 0x3258827341411941ULL, 0x2c9d0ba78b8b168bULL, |
| 429 | 0x510153f6a7a7a6a7ULL, 0xcf94fab27d7de97dULL, 0xdcfb374995956e95ULL, |
| 430 | 0x8e9fad56d8d847d8ULL, 0x8b30eb70fbfbcbfbULL, 0x2371c1cdeeee9feeULL, |
| 431 | 0xc791f8bb7c7ced7cULL, 0x17e3cc7166668566ULL, 0xa68ea77bdddd53ddULL, |
| 432 | 0xb84b2eaf17175c17ULL, 0x02468e4547470147ULL, 0x84dc211a9e9e429eULL, |
| 433 | 0x1ec589d4caca0fcaULL, 0x75995a582d2db42dULL, 0x9179632ebfbfc6bfULL, |
| 434 | 0x381b0e3f07071c07ULL, 0x012347acadad8eadULL, 0xea2fb4b05a5a755aULL, |
| 435 | 0x6cb51bef83833683ULL, 0x85ff66b63333cc33ULL, 0x3ff2c65c63639163ULL, |
| 436 | 0x100a041202020802ULL, 0x39384993aaaa92aaULL, 0xafa8e2de7171d971ULL, |
| 437 | 0x0ecf8dc6c8c807c8ULL, 0xc87d32d119196419ULL, 0x7270923b49493949ULL, |
| 438 | 0x869aaf5fd9d943d9ULL, 0xc31df931f2f2eff2ULL, 0x4b48dba8e3e3abe3ULL, |
| 439 | 0xe22ab6b95b5b715bULL, 0x34920dbc88881a88ULL, 0xa4c8293e9a9a529aULL, |
| 440 | 0x2dbe4c0b26269826ULL, 0x8dfa64bf3232c832ULL, 0xe94a7d59b0b0fab0ULL, |
| 441 | 0x1b6acff2e9e983e9ULL, 0x78331e770f0f3c0fULL, 0xe6a6b733d5d573d5ULL, |
| 442 | 0x74ba1df480803a80ULL, 0x997c6127bebec2beULL, 0x26de87ebcdcd13cdULL, |
| 443 | 0xbde468893434d034ULL, 0x7a75903248483d48ULL, 0xab24e354ffffdbffULL, |
| 444 | 0xf78ff48d7a7af57aULL, 0xf4ea3d6490907a90ULL, 0xc23ebe9d5f5f615fULL, |
| 445 | 0x1da0403d20208020ULL, 0x67d5d00f6868bd68ULL, 0xd07234ca1a1a681aULL, |
| 446 | 0x192c41b7aeae82aeULL, 0xc95e757db4b4eab4ULL, 0x9a19a8ce54544d54ULL, |
| 447 | 0xece53b7f93937693ULL, 0x0daa442f22228822ULL, 0x07e9c86364648d64ULL, |
| 448 | 0xdb12ff2af1f1e3f1ULL, 0xbfa2e6cc7373d173ULL, 0x905a248212124812ULL, |
| 449 | 0x3a5d807a40401d40ULL, 0x4028104808082008ULL, 0x56e89b95c3c32bc3ULL, |
| 450 | 0x337bc5dfecec97ecULL, 0x9690ab4ddbdb4bdbULL, 0x611f5fc0a1a1bea1ULL, |
| 451 | 0x1c8307918d8d0e8dULL, 0xf5c97ac83d3df43dULL, 0xccf1335b97976697ULL, |
| 452 | 0x0000000000000000ULL, 0x36d483f9cfcf1bcfULL, 0x4587566e2b2bac2bULL, |
| 453 | 0x97b3ece17676c576ULL, 0x64b019e682823282ULL, 0xfea9b128d6d67fd6ULL, |
| 454 | 0xd87736c31b1b6c1bULL, 0xc15b7774b5b5eeb5ULL, 0x112943beafaf86afULL, |
| 455 | 0x77dfd41d6a6ab56aULL, 0xba0da0ea50505d50ULL, 0x124c8a5745450945ULL, |
| 456 | 0xcb18fb38f3f3ebf3ULL, 0x9df060ad3030c030ULL, 0x2b74c3c4efef9befULL, |
| 457 | 0xe5c37eda3f3ffc3fULL, 0x921caac755554955ULL, 0x791059dba2a2b2a2ULL, |
| 458 | 0x0365c9e9eaea8feaULL, 0x0fecca6a65658965ULL, 0xb9686903babad2baULL, |
| 459 | 0x65935e4a2f2fbc2fULL, 0x4ee79d8ec0c027c0ULL, 0xbe81a160dede5fdeULL, |
| 460 | 0xe06c38fc1c1c701cULL, 0xbb2ee746fdfdd3fdULL, 0x52649a1f4d4d294dULL, |
| 461 | 0xe4e0397692927292ULL, 0x8fbceafa7575c975ULL, 0x301e0c3606061806ULL, |
| 462 | 0x249809ae8a8a128aULL, 0xf940794bb2b2f2b2ULL, 0x6359d185e6e6bfe6ULL, |
| 463 | 0x70361c7e0e0e380eULL, 0xf8633ee71f1f7c1fULL, 0x37f7c45562629562ULL, |
| 464 | 0xeea3b53ad4d477d4ULL, 0x29324d81a8a89aa8ULL, 0xc4f4315296966296ULL, |
| 465 | 0x9b3aef62f9f9c3f9ULL, 0x66f697a3c5c533c5ULL, 0x35b14a1025259425ULL, |
| 466 | 0xf220b2ab59597959ULL, 0x54ae15d084842a84ULL, 0xb7a7e4c57272d572ULL, |
| 467 | 0xd5dd72ec3939e439ULL, 0x5a6198164c4c2d4cULL, 0xca3bbc945e5e655eULL, |
| 468 | 0xe785f09f7878fd78ULL, 0xddd870e53838e038ULL, 0x148605988c8c0a8cULL, |
| 469 | 0xc6b2bf17d1d163d1ULL, 0x410b57e4a5a5aea5ULL, 0x434dd9a1e2e2afe2ULL, |
| 470 | 0x2ff8c24e61619961ULL, 0xf1457b42b3b3f6b3ULL, 0x15a5423421218421ULL, |
| 471 | 0x94d625089c9c4a9cULL, 0xf0663cee1e1e781eULL, 0x2252866143431143ULL, |
| 472 | 0x76fc93b1c7c73bc7ULL, 0xb32be54ffcfcd7fcULL, 0x2014082404041004ULL, |
| 473 | 0xb208a2e351515951ULL, 0xbcc72f2599995e99ULL, 0x4fc4da226d6da96dULL, |
| 474 | 0x68391a650d0d340dULL, 0x8335e979fafacffaULL, 0xb684a369dfdf5bdfULL, |
| 475 | 0xd79bfca97e7ee57eULL, 0x3db4481924249024ULL, 0xc5d776fe3b3bec3bULL, |
| 476 | 0x313d4b9aabab96abULL, 0x3ed181f0cece1fceULL, 0x8855229911114411ULL, |
| 477 | 0x0c8903838f8f068fULL, 0x4a6b9c044e4e254eULL, 0xd1517366b7b7e6b7ULL, |
| 478 | 0x0b60cbe0ebeb8bebULL, 0xfdcc78c13c3cf03cULL, 0x7cbf1ffd81813e81ULL, |
| 479 | 0xd4fe354094946a94ULL, 0xeb0cf31cf7f7fbf7ULL, 0xa1676f18b9b9deb9ULL, |
| 480 | 0x985f268b13134c13ULL, 0x7d9c58512c2cb02cULL, 0xd6b8bb05d3d36bd3ULL, |
| 481 | 0x6b5cd38ce7e7bbe7ULL, 0x57cbdc396e6ea56eULL, 0x6ef395aac4c437c4ULL, |
| 482 | 0x180f061b03030c03ULL, 0x8a13acdc56564556ULL, 0x1a49885e44440d44ULL, |
| 483 | 0xdf9efea07f7fe17fULL, 0x21374f88a9a99ea9ULL, 0x4d8254672a2aa82aULL, |
| 484 | 0xb16d6b0abbbbd6bbULL, 0x46e29f87c1c123c1ULL, 0xa202a6f153535153ULL, |
| 485 | 0xae8ba572dcdc57dcULL, 0x582716530b0b2c0bULL, 0x9cd327019d9d4e9dULL, |
| 486 | 0x47c1d82b6c6cad6cULL, 0x95f562a43131c431ULL, 0x87b9e8f37474cd74ULL, |
| 487 | 0xe309f115f6f6fff6ULL, 0x0a438c4c46460546ULL, 0x092645a5acac8aacULL, |
| 488 | 0x3c970fb589891e89ULL, 0xa04428b414145014ULL, 0x5b42dfbae1e1a3e1ULL, |
| 489 | 0xb04e2ca616165816ULL, 0xcdd274f73a3ae83aULL, 0x6fd0d2066969b969ULL, |
| 490 | 0x482d124109092409ULL, 0xa7ade0d77070dd70ULL, 0xd954716fb6b6e2b6ULL, |
| 491 | 0xceb7bd1ed0d067d0ULL, 0x3b7ec7d6eded93edULL, 0x2edb85e2cccc17ccULL, |
| 492 | 0x2a57846842421542ULL, 0xb4c22d2c98985a98ULL, 0x490e55eda4a4aaa4ULL, |
| 493 | 0x5d8850752828a028ULL, 0xda31b8865c5c6d5cULL, 0x933fed6bf8f8c7f8ULL, |
| 494 | 0x44a411c286862286ULL, |
| 495 | }; |
| 496 | |
| 497 | static const u64 C5[256] = { |
| 498 | 0x18c07830d8181860ULL, 0x2305af462623238cULL, 0xc67ef991b8c6c63fULL, |
| 499 | 0xe8136fcdfbe8e887ULL, 0x874ca113cb878726ULL, 0xb8a9626d11b8b8daULL, |
| 500 | 0x0108050209010104ULL, 0x4f426e9e0d4f4f21ULL, 0x36adee6c9b3636d8ULL, |
| 501 | 0xa6590451ffa6a6a2ULL, 0xd2debdb90cd2d26fULL, 0xf5fb06f70ef5f5f3ULL, |
| 502 | 0x79ef80f2967979f9ULL, 0x6f5fcede306f6fa1ULL, 0x91fcef3f6d91917eULL, |
| 503 | 0x52aa07a4f8525255ULL, 0x6027fdc04760609dULL, 0xbc89766535bcbccaULL, |
| 504 | 0x9baccd2b379b9b56ULL, 0x8e048c018a8e8e02ULL, 0xa371155bd2a3a3b6ULL, |
| 505 | 0x0c603c186c0c0c30ULL, 0x7bff8af6847b7bf1ULL, 0x35b5e16a803535d4ULL, |
| 506 | 0x1de8693af51d1d74ULL, 0xe05347ddb3e0e0a7ULL, 0xd7f6acb321d7d77bULL, |
| 507 | 0xc25eed999cc2c22fULL, 0x2e6d965c432e2eb8ULL, 0x4b627a96294b4b31ULL, |
| 508 | 0xfea321e15dfefedfULL, 0x578216aed5575741ULL, 0x15a8412abd151554ULL, |
| 509 | 0x779fb6eee87777c1ULL, 0x37a5eb6e923737dcULL, 0xe57b56d79ee5e5b3ULL, |
| 510 | 0x9f8cd923139f9f46ULL, 0xf0d317fd23f0f0e7ULL, 0x4a6a7f94204a4a35ULL, |
| 511 | 0xda9e95a944dada4fULL, 0x58fa25b0a258587dULL, 0xc906ca8fcfc9c903ULL, |
| 512 | 0x29558d527c2929a4ULL, 0x0a5022145a0a0a28ULL, 0xb1e14f7f50b1b1feULL, |
| 513 | 0xa0691a5dc9a0a0baULL, 0x6b7fdad6146b6bb1ULL, 0x855cab17d985852eULL, |
| 514 | 0xbd8173673cbdbdceULL, 0x5dd234ba8f5d5d69ULL, 0x1080502090101040ULL, |
| 515 | 0xf4f303f507f4f4f7ULL, 0xcb16c08bddcbcb0bULL, 0x3eedc67cd33e3ef8ULL, |
| 516 | 0x0528110a2d050514ULL, 0x671fe6ce78676781ULL, 0xe47353d597e4e4b7ULL, |
| 517 | 0x2725bb4e0227279cULL, 0x4132588273414119ULL, 0x8b2c9d0ba78b8b16ULL, |
| 518 | 0xa7510153f6a7a7a6ULL, 0x7dcf94fab27d7de9ULL, 0x95dcfb374995956eULL, |
| 519 | 0xd88e9fad56d8d847ULL, 0xfb8b30eb70fbfbcbULL, 0xee2371c1cdeeee9fULL, |
| 520 | 0x7cc791f8bb7c7cedULL, 0x6617e3cc71666685ULL, 0xdda68ea77bdddd53ULL, |
| 521 | 0x17b84b2eaf17175cULL, 0x4702468e45474701ULL, 0x9e84dc211a9e9e42ULL, |
| 522 | 0xca1ec589d4caca0fULL, 0x2d75995a582d2db4ULL, 0xbf9179632ebfbfc6ULL, |
| 523 | 0x07381b0e3f07071cULL, 0xad012347acadad8eULL, 0x5aea2fb4b05a5a75ULL, |
| 524 | 0x836cb51bef838336ULL, 0x3385ff66b63333ccULL, 0x633ff2c65c636391ULL, |
| 525 | 0x02100a0412020208ULL, 0xaa39384993aaaa92ULL, 0x71afa8e2de7171d9ULL, |
| 526 | 0xc80ecf8dc6c8c807ULL, 0x19c87d32d1191964ULL, 0x497270923b494939ULL, |
| 527 | 0xd9869aaf5fd9d943ULL, 0xf2c31df931f2f2efULL, 0xe34b48dba8e3e3abULL, |
| 528 | 0x5be22ab6b95b5b71ULL, 0x8834920dbc88881aULL, 0x9aa4c8293e9a9a52ULL, |
| 529 | 0x262dbe4c0b262698ULL, 0x328dfa64bf3232c8ULL, 0xb0e94a7d59b0b0faULL, |
| 530 | 0xe91b6acff2e9e983ULL, 0x0f78331e770f0f3cULL, 0xd5e6a6b733d5d573ULL, |
| 531 | 0x8074ba1df480803aULL, 0xbe997c6127bebec2ULL, 0xcd26de87ebcdcd13ULL, |
| 532 | 0x34bde468893434d0ULL, 0x487a75903248483dULL, 0xffab24e354ffffdbULL, |
| 533 | 0x7af78ff48d7a7af5ULL, 0x90f4ea3d6490907aULL, 0x5fc23ebe9d5f5f61ULL, |
| 534 | 0x201da0403d202080ULL, 0x6867d5d00f6868bdULL, 0x1ad07234ca1a1a68ULL, |
| 535 | 0xae192c41b7aeae82ULL, 0xb4c95e757db4b4eaULL, 0x549a19a8ce54544dULL, |
| 536 | 0x93ece53b7f939376ULL, 0x220daa442f222288ULL, 0x6407e9c86364648dULL, |
| 537 | 0xf1db12ff2af1f1e3ULL, 0x73bfa2e6cc7373d1ULL, 0x12905a2482121248ULL, |
| 538 | 0x403a5d807a40401dULL, 0x0840281048080820ULL, 0xc356e89b95c3c32bULL, |
| 539 | 0xec337bc5dfecec97ULL, 0xdb9690ab4ddbdb4bULL, 0xa1611f5fc0a1a1beULL, |
| 540 | 0x8d1c8307918d8d0eULL, 0x3df5c97ac83d3df4ULL, 0x97ccf1335b979766ULL, |
| 541 | 0x0000000000000000ULL, 0xcf36d483f9cfcf1bULL, 0x2b4587566e2b2bacULL, |
| 542 | 0x7697b3ece17676c5ULL, 0x8264b019e6828232ULL, 0xd6fea9b128d6d67fULL, |
| 543 | 0x1bd87736c31b1b6cULL, 0xb5c15b7774b5b5eeULL, 0xaf112943beafaf86ULL, |
| 544 | 0x6a77dfd41d6a6ab5ULL, 0x50ba0da0ea50505dULL, 0x45124c8a57454509ULL, |
| 545 | 0xf3cb18fb38f3f3ebULL, 0x309df060ad3030c0ULL, 0xef2b74c3c4efef9bULL, |
| 546 | 0x3fe5c37eda3f3ffcULL, 0x55921caac7555549ULL, 0xa2791059dba2a2b2ULL, |
| 547 | 0xea0365c9e9eaea8fULL, 0x650fecca6a656589ULL, 0xbab9686903babad2ULL, |
| 548 | 0x2f65935e4a2f2fbcULL, 0xc04ee79d8ec0c027ULL, 0xdebe81a160dede5fULL, |
| 549 | 0x1ce06c38fc1c1c70ULL, 0xfdbb2ee746fdfdd3ULL, 0x4d52649a1f4d4d29ULL, |
| 550 | 0x92e4e03976929272ULL, 0x758fbceafa7575c9ULL, 0x06301e0c36060618ULL, |
| 551 | 0x8a249809ae8a8a12ULL, 0xb2f940794bb2b2f2ULL, 0xe66359d185e6e6bfULL, |
| 552 | 0x0e70361c7e0e0e38ULL, 0x1ff8633ee71f1f7cULL, 0x6237f7c455626295ULL, |
| 553 | 0xd4eea3b53ad4d477ULL, 0xa829324d81a8a89aULL, 0x96c4f43152969662ULL, |
| 554 | 0xf99b3aef62f9f9c3ULL, 0xc566f697a3c5c533ULL, 0x2535b14a10252594ULL, |
| 555 | 0x59f220b2ab595979ULL, 0x8454ae15d084842aULL, 0x72b7a7e4c57272d5ULL, |
| 556 | 0x39d5dd72ec3939e4ULL, 0x4c5a6198164c4c2dULL, 0x5eca3bbc945e5e65ULL, |
| 557 | 0x78e785f09f7878fdULL, 0x38ddd870e53838e0ULL, 0x8c148605988c8c0aULL, |
| 558 | 0xd1c6b2bf17d1d163ULL, 0xa5410b57e4a5a5aeULL, 0xe2434dd9a1e2e2afULL, |
| 559 | 0x612ff8c24e616199ULL, 0xb3f1457b42b3b3f6ULL, 0x2115a54234212184ULL, |
| 560 | 0x9c94d625089c9c4aULL, 0x1ef0663cee1e1e78ULL, 0x4322528661434311ULL, |
| 561 | 0xc776fc93b1c7c73bULL, 0xfcb32be54ffcfcd7ULL, 0x0420140824040410ULL, |
| 562 | 0x51b208a2e3515159ULL, 0x99bcc72f2599995eULL, 0x6d4fc4da226d6da9ULL, |
| 563 | 0x0d68391a650d0d34ULL, 0xfa8335e979fafacfULL, 0xdfb684a369dfdf5bULL, |
| 564 | 0x7ed79bfca97e7ee5ULL, 0x243db44819242490ULL, 0x3bc5d776fe3b3becULL, |
| 565 | 0xab313d4b9aabab96ULL, 0xce3ed181f0cece1fULL, 0x1188552299111144ULL, |
| 566 | 0x8f0c8903838f8f06ULL, 0x4e4a6b9c044e4e25ULL, 0xb7d1517366b7b7e6ULL, |
| 567 | 0xeb0b60cbe0ebeb8bULL, 0x3cfdcc78c13c3cf0ULL, 0x817cbf1ffd81813eULL, |
| 568 | 0x94d4fe354094946aULL, 0xf7eb0cf31cf7f7fbULL, 0xb9a1676f18b9b9deULL, |
| 569 | 0x13985f268b13134cULL, 0x2c7d9c58512c2cb0ULL, 0xd3d6b8bb05d3d36bULL, |
| 570 | 0xe76b5cd38ce7e7bbULL, 0x6e57cbdc396e6ea5ULL, 0xc46ef395aac4c437ULL, |
| 571 | 0x03180f061b03030cULL, 0x568a13acdc565645ULL, 0x441a49885e44440dULL, |
| 572 | 0x7fdf9efea07f7fe1ULL, 0xa921374f88a9a99eULL, 0x2a4d8254672a2aa8ULL, |
| 573 | 0xbbb16d6b0abbbbd6ULL, 0xc146e29f87c1c123ULL, 0x53a202a6f1535351ULL, |
| 574 | 0xdcae8ba572dcdc57ULL, 0x0b582716530b0b2cULL, 0x9d9cd327019d9d4eULL, |
| 575 | 0x6c47c1d82b6c6cadULL, 0x3195f562a43131c4ULL, 0x7487b9e8f37474cdULL, |
| 576 | 0xf6e309f115f6f6ffULL, 0x460a438c4c464605ULL, 0xac092645a5acac8aULL, |
| 577 | 0x893c970fb589891eULL, 0x14a04428b4141450ULL, 0xe15b42dfbae1e1a3ULL, |
| 578 | 0x16b04e2ca6161658ULL, 0x3acdd274f73a3ae8ULL, 0x696fd0d2066969b9ULL, |
| 579 | 0x09482d1241090924ULL, 0x70a7ade0d77070ddULL, 0xb6d954716fb6b6e2ULL, |
| 580 | 0xd0ceb7bd1ed0d067ULL, 0xed3b7ec7d6eded93ULL, 0xcc2edb85e2cccc17ULL, |
| 581 | 0x422a578468424215ULL, 0x98b4c22d2c98985aULL, 0xa4490e55eda4a4aaULL, |
| 582 | 0x285d8850752828a0ULL, 0x5cda31b8865c5c6dULL, 0xf8933fed6bf8f8c7ULL, |
| 583 | 0x8644a411c2868622ULL, |
| 584 | }; |
| 585 | |
| 586 | static const u64 C6[256] = { |
| 587 | 0x6018c07830d81818ULL, 0x8c2305af46262323ULL, 0x3fc67ef991b8c6c6ULL, |
| 588 | 0x87e8136fcdfbe8e8ULL, 0x26874ca113cb8787ULL, 0xdab8a9626d11b8b8ULL, |
| 589 | 0x0401080502090101ULL, 0x214f426e9e0d4f4fULL, 0xd836adee6c9b3636ULL, |
| 590 | 0xa2a6590451ffa6a6ULL, 0x6fd2debdb90cd2d2ULL, 0xf3f5fb06f70ef5f5ULL, |
| 591 | 0xf979ef80f2967979ULL, 0xa16f5fcede306f6fULL, 0x7e91fcef3f6d9191ULL, |
| 592 | 0x5552aa07a4f85252ULL, 0x9d6027fdc0476060ULL, 0xcabc89766535bcbcULL, |
| 593 | 0x569baccd2b379b9bULL, 0x028e048c018a8e8eULL, 0xb6a371155bd2a3a3ULL, |
| 594 | 0x300c603c186c0c0cULL, 0xf17bff8af6847b7bULL, 0xd435b5e16a803535ULL, |
| 595 | 0x741de8693af51d1dULL, 0xa7e05347ddb3e0e0ULL, 0x7bd7f6acb321d7d7ULL, |
| 596 | 0x2fc25eed999cc2c2ULL, 0xb82e6d965c432e2eULL, 0x314b627a96294b4bULL, |
| 597 | 0xdffea321e15dfefeULL, 0x41578216aed55757ULL, 0x5415a8412abd1515ULL, |
| 598 | 0xc1779fb6eee87777ULL, 0xdc37a5eb6e923737ULL, 0xb3e57b56d79ee5e5ULL, |
| 599 | 0x469f8cd923139f9fULL, 0xe7f0d317fd23f0f0ULL, 0x354a6a7f94204a4aULL, |
| 600 | 0x4fda9e95a944dadaULL, 0x7d58fa25b0a25858ULL, 0x03c906ca8fcfc9c9ULL, |
| 601 | 0xa429558d527c2929ULL, 0x280a5022145a0a0aULL, 0xfeb1e14f7f50b1b1ULL, |
| 602 | 0xbaa0691a5dc9a0a0ULL, 0xb16b7fdad6146b6bULL, 0x2e855cab17d98585ULL, |
| 603 | 0xcebd8173673cbdbdULL, 0x695dd234ba8f5d5dULL, 0x4010805020901010ULL, |
| 604 | 0xf7f4f303f507f4f4ULL, 0x0bcb16c08bddcbcbULL, 0xf83eedc67cd33e3eULL, |
| 605 | 0x140528110a2d0505ULL, 0x81671fe6ce786767ULL, 0xb7e47353d597e4e4ULL, |
| 606 | 0x9c2725bb4e022727ULL, 0x1941325882734141ULL, 0x168b2c9d0ba78b8bULL, |
| 607 | 0xa6a7510153f6a7a7ULL, 0xe97dcf94fab27d7dULL, 0x6e95dcfb37499595ULL, |
| 608 | 0x47d88e9fad56d8d8ULL, 0xcbfb8b30eb70fbfbULL, 0x9fee2371c1cdeeeeULL, |
| 609 | 0xed7cc791f8bb7c7cULL, 0x856617e3cc716666ULL, 0x53dda68ea77bddddULL, |
| 610 | 0x5c17b84b2eaf1717ULL, 0x014702468e454747ULL, 0x429e84dc211a9e9eULL, |
| 611 | 0x0fca1ec589d4cacaULL, 0xb42d75995a582d2dULL, 0xc6bf9179632ebfbfULL, |
| 612 | 0x1c07381b0e3f0707ULL, 0x8ead012347acadadULL, 0x755aea2fb4b05a5aULL, |
| 613 | 0x36836cb51bef8383ULL, 0xcc3385ff66b63333ULL, 0x91633ff2c65c6363ULL, |
| 614 | 0x0802100a04120202ULL, 0x92aa39384993aaaaULL, 0xd971afa8e2de7171ULL, |
| 615 | 0x07c80ecf8dc6c8c8ULL, 0x6419c87d32d11919ULL, 0x39497270923b4949ULL, |
| 616 | 0x43d9869aaf5fd9d9ULL, 0xeff2c31df931f2f2ULL, 0xabe34b48dba8e3e3ULL, |
| 617 | 0x715be22ab6b95b5bULL, 0x1a8834920dbc8888ULL, 0x529aa4c8293e9a9aULL, |
| 618 | 0x98262dbe4c0b2626ULL, 0xc8328dfa64bf3232ULL, 0xfab0e94a7d59b0b0ULL, |
| 619 | 0x83e91b6acff2e9e9ULL, 0x3c0f78331e770f0fULL, 0x73d5e6a6b733d5d5ULL, |
| 620 | 0x3a8074ba1df48080ULL, 0xc2be997c6127bebeULL, 0x13cd26de87ebcdcdULL, |
| 621 | 0xd034bde468893434ULL, 0x3d487a7590324848ULL, 0xdbffab24e354ffffULL, |
| 622 | 0xf57af78ff48d7a7aULL, 0x7a90f4ea3d649090ULL, 0x615fc23ebe9d5f5fULL, |
| 623 | 0x80201da0403d2020ULL, 0xbd6867d5d00f6868ULL, 0x681ad07234ca1a1aULL, |
| 624 | 0x82ae192c41b7aeaeULL, 0xeab4c95e757db4b4ULL, 0x4d549a19a8ce5454ULL, |
| 625 | 0x7693ece53b7f9393ULL, 0x88220daa442f2222ULL, 0x8d6407e9c8636464ULL, |
| 626 | 0xe3f1db12ff2af1f1ULL, 0xd173bfa2e6cc7373ULL, 0x4812905a24821212ULL, |
| 627 | 0x1d403a5d807a4040ULL, 0x2008402810480808ULL, 0x2bc356e89b95c3c3ULL, |
| 628 | 0x97ec337bc5dfececULL, 0x4bdb9690ab4ddbdbULL, 0xbea1611f5fc0a1a1ULL, |
| 629 | 0x0e8d1c8307918d8dULL, 0xf43df5c97ac83d3dULL, 0x6697ccf1335b9797ULL, |
| 630 | 0x0000000000000000ULL, 0x1bcf36d483f9cfcfULL, 0xac2b4587566e2b2bULL, |
| 631 | 0xc57697b3ece17676ULL, 0x328264b019e68282ULL, 0x7fd6fea9b128d6d6ULL, |
| 632 | 0x6c1bd87736c31b1bULL, 0xeeb5c15b7774b5b5ULL, 0x86af112943beafafULL, |
| 633 | 0xb56a77dfd41d6a6aULL, 0x5d50ba0da0ea5050ULL, 0x0945124c8a574545ULL, |
| 634 | 0xebf3cb18fb38f3f3ULL, 0xc0309df060ad3030ULL, 0x9bef2b74c3c4efefULL, |
| 635 | 0xfc3fe5c37eda3f3fULL, 0x4955921caac75555ULL, 0xb2a2791059dba2a2ULL, |
| 636 | 0x8fea0365c9e9eaeaULL, 0x89650fecca6a6565ULL, 0xd2bab9686903babaULL, |
| 637 | 0xbc2f65935e4a2f2fULL, 0x27c04ee79d8ec0c0ULL, 0x5fdebe81a160dedeULL, |
| 638 | 0x701ce06c38fc1c1cULL, 0xd3fdbb2ee746fdfdULL, 0x294d52649a1f4d4dULL, |
| 639 | 0x7292e4e039769292ULL, 0xc9758fbceafa7575ULL, 0x1806301e0c360606ULL, |
| 640 | 0x128a249809ae8a8aULL, 0xf2b2f940794bb2b2ULL, 0xbfe66359d185e6e6ULL, |
| 641 | 0x380e70361c7e0e0eULL, 0x7c1ff8633ee71f1fULL, 0x956237f7c4556262ULL, |
| 642 | 0x77d4eea3b53ad4d4ULL, 0x9aa829324d81a8a8ULL, 0x6296c4f431529696ULL, |
| 643 | 0xc3f99b3aef62f9f9ULL, 0x33c566f697a3c5c5ULL, 0x942535b14a102525ULL, |
| 644 | 0x7959f220b2ab5959ULL, 0x2a8454ae15d08484ULL, 0xd572b7a7e4c57272ULL, |
| 645 | 0xe439d5dd72ec3939ULL, 0x2d4c5a6198164c4cULL, 0x655eca3bbc945e5eULL, |
| 646 | 0xfd78e785f09f7878ULL, 0xe038ddd870e53838ULL, 0x0a8c148605988c8cULL, |
| 647 | 0x63d1c6b2bf17d1d1ULL, 0xaea5410b57e4a5a5ULL, 0xafe2434dd9a1e2e2ULL, |
| 648 | 0x99612ff8c24e6161ULL, 0xf6b3f1457b42b3b3ULL, 0x842115a542342121ULL, |
| 649 | 0x4a9c94d625089c9cULL, 0x781ef0663cee1e1eULL, 0x1143225286614343ULL, |
| 650 | 0x3bc776fc93b1c7c7ULL, 0xd7fcb32be54ffcfcULL, 0x1004201408240404ULL, |
| 651 | 0x5951b208a2e35151ULL, 0x5e99bcc72f259999ULL, 0xa96d4fc4da226d6dULL, |
| 652 | 0x340d68391a650d0dULL, 0xcffa8335e979fafaULL, 0x5bdfb684a369dfdfULL, |
| 653 | 0xe57ed79bfca97e7eULL, 0x90243db448192424ULL, 0xec3bc5d776fe3b3bULL, |
| 654 | 0x96ab313d4b9aababULL, 0x1fce3ed181f0ceceULL, 0x4411885522991111ULL, |
| 655 | 0x068f0c8903838f8fULL, 0x254e4a6b9c044e4eULL, 0xe6b7d1517366b7b7ULL, |
| 656 | 0x8beb0b60cbe0ebebULL, 0xf03cfdcc78c13c3cULL, 0x3e817cbf1ffd8181ULL, |
| 657 | 0x6a94d4fe35409494ULL, 0xfbf7eb0cf31cf7f7ULL, 0xdeb9a1676f18b9b9ULL, |
| 658 | 0x4c13985f268b1313ULL, 0xb02c7d9c58512c2cULL, 0x6bd3d6b8bb05d3d3ULL, |
| 659 | 0xbbe76b5cd38ce7e7ULL, 0xa56e57cbdc396e6eULL, 0x37c46ef395aac4c4ULL, |
| 660 | 0x0c03180f061b0303ULL, 0x45568a13acdc5656ULL, 0x0d441a49885e4444ULL, |
| 661 | 0xe17fdf9efea07f7fULL, 0x9ea921374f88a9a9ULL, 0xa82a4d8254672a2aULL, |
| 662 | 0xd6bbb16d6b0abbbbULL, 0x23c146e29f87c1c1ULL, 0x5153a202a6f15353ULL, |
| 663 | 0x57dcae8ba572dcdcULL, 0x2c0b582716530b0bULL, 0x4e9d9cd327019d9dULL, |
| 664 | 0xad6c47c1d82b6c6cULL, 0xc43195f562a43131ULL, 0xcd7487b9e8f37474ULL, |
| 665 | 0xfff6e309f115f6f6ULL, 0x05460a438c4c4646ULL, 0x8aac092645a5acacULL, |
| 666 | 0x1e893c970fb58989ULL, 0x5014a04428b41414ULL, 0xa3e15b42dfbae1e1ULL, |
| 667 | 0x5816b04e2ca61616ULL, 0xe83acdd274f73a3aULL, 0xb9696fd0d2066969ULL, |
| 668 | 0x2409482d12410909ULL, 0xdd70a7ade0d77070ULL, 0xe2b6d954716fb6b6ULL, |
| 669 | 0x67d0ceb7bd1ed0d0ULL, 0x93ed3b7ec7d6ededULL, 0x17cc2edb85e2ccccULL, |
| 670 | 0x15422a5784684242ULL, 0x5a98b4c22d2c9898ULL, 0xaaa4490e55eda4a4ULL, |
| 671 | 0xa0285d8850752828ULL, 0x6d5cda31b8865c5cULL, 0xc7f8933fed6bf8f8ULL, |
| 672 | 0x228644a411c28686ULL, |
| 673 | }; |
| 674 | |
| 675 | static const u64 C7[256] = { |
| 676 | 0x186018c07830d818ULL, 0x238c2305af462623ULL, 0xc63fc67ef991b8c6ULL, |
| 677 | 0xe887e8136fcdfbe8ULL, 0x8726874ca113cb87ULL, 0xb8dab8a9626d11b8ULL, |
| 678 | 0x0104010805020901ULL, 0x4f214f426e9e0d4fULL, 0x36d836adee6c9b36ULL, |
| 679 | 0xa6a2a6590451ffa6ULL, 0xd26fd2debdb90cd2ULL, 0xf5f3f5fb06f70ef5ULL, |
| 680 | 0x79f979ef80f29679ULL, 0x6fa16f5fcede306fULL, 0x917e91fcef3f6d91ULL, |
| 681 | 0x525552aa07a4f852ULL, 0x609d6027fdc04760ULL, 0xbccabc89766535bcULL, |
| 682 | 0x9b569baccd2b379bULL, 0x8e028e048c018a8eULL, 0xa3b6a371155bd2a3ULL, |
| 683 | 0x0c300c603c186c0cULL, 0x7bf17bff8af6847bULL, 0x35d435b5e16a8035ULL, |
| 684 | 0x1d741de8693af51dULL, 0xe0a7e05347ddb3e0ULL, 0xd77bd7f6acb321d7ULL, |
| 685 | 0xc22fc25eed999cc2ULL, 0x2eb82e6d965c432eULL, 0x4b314b627a96294bULL, |
| 686 | 0xfedffea321e15dfeULL, 0x5741578216aed557ULL, 0x155415a8412abd15ULL, |
| 687 | 0x77c1779fb6eee877ULL, 0x37dc37a5eb6e9237ULL, 0xe5b3e57b56d79ee5ULL, |
| 688 | 0x9f469f8cd923139fULL, 0xf0e7f0d317fd23f0ULL, 0x4a354a6a7f94204aULL, |
| 689 | 0xda4fda9e95a944daULL, 0x587d58fa25b0a258ULL, 0xc903c906ca8fcfc9ULL, |
| 690 | 0x29a429558d527c29ULL, 0x0a280a5022145a0aULL, 0xb1feb1e14f7f50b1ULL, |
| 691 | 0xa0baa0691a5dc9a0ULL, 0x6bb16b7fdad6146bULL, 0x852e855cab17d985ULL, |
| 692 | 0xbdcebd8173673cbdULL, 0x5d695dd234ba8f5dULL, 0x1040108050209010ULL, |
| 693 | 0xf4f7f4f303f507f4ULL, 0xcb0bcb16c08bddcbULL, 0x3ef83eedc67cd33eULL, |
| 694 | 0x05140528110a2d05ULL, 0x6781671fe6ce7867ULL, 0xe4b7e47353d597e4ULL, |
| 695 | 0x279c2725bb4e0227ULL, 0x4119413258827341ULL, 0x8b168b2c9d0ba78bULL, |
| 696 | 0xa7a6a7510153f6a7ULL, 0x7de97dcf94fab27dULL, 0x956e95dcfb374995ULL, |
| 697 | 0xd847d88e9fad56d8ULL, 0xfbcbfb8b30eb70fbULL, 0xee9fee2371c1cdeeULL, |
| 698 | 0x7ced7cc791f8bb7cULL, 0x66856617e3cc7166ULL, 0xdd53dda68ea77bddULL, |
| 699 | 0x175c17b84b2eaf17ULL, 0x47014702468e4547ULL, 0x9e429e84dc211a9eULL, |
| 700 | 0xca0fca1ec589d4caULL, 0x2db42d75995a582dULL, 0xbfc6bf9179632ebfULL, |
| 701 | 0x071c07381b0e3f07ULL, 0xad8ead012347acadULL, 0x5a755aea2fb4b05aULL, |
| 702 | 0x8336836cb51bef83ULL, 0x33cc3385ff66b633ULL, 0x6391633ff2c65c63ULL, |
| 703 | 0x020802100a041202ULL, 0xaa92aa39384993aaULL, 0x71d971afa8e2de71ULL, |
| 704 | 0xc807c80ecf8dc6c8ULL, 0x196419c87d32d119ULL, 0x4939497270923b49ULL, |
| 705 | 0xd943d9869aaf5fd9ULL, 0xf2eff2c31df931f2ULL, 0xe3abe34b48dba8e3ULL, |
| 706 | 0x5b715be22ab6b95bULL, 0x881a8834920dbc88ULL, 0x9a529aa4c8293e9aULL, |
| 707 | 0x2698262dbe4c0b26ULL, 0x32c8328dfa64bf32ULL, 0xb0fab0e94a7d59b0ULL, |
| 708 | 0xe983e91b6acff2e9ULL, 0x0f3c0f78331e770fULL, 0xd573d5e6a6b733d5ULL, |
| 709 | 0x803a8074ba1df480ULL, 0xbec2be997c6127beULL, 0xcd13cd26de87ebcdULL, |
| 710 | 0x34d034bde4688934ULL, 0x483d487a75903248ULL, 0xffdbffab24e354ffULL, |
| 711 | 0x7af57af78ff48d7aULL, 0x907a90f4ea3d6490ULL, 0x5f615fc23ebe9d5fULL, |
| 712 | 0x2080201da0403d20ULL, 0x68bd6867d5d00f68ULL, 0x1a681ad07234ca1aULL, |
| 713 | 0xae82ae192c41b7aeULL, 0xb4eab4c95e757db4ULL, 0x544d549a19a8ce54ULL, |
| 714 | 0x937693ece53b7f93ULL, 0x2288220daa442f22ULL, 0x648d6407e9c86364ULL, |
| 715 | 0xf1e3f1db12ff2af1ULL, 0x73d173bfa2e6cc73ULL, 0x124812905a248212ULL, |
| 716 | 0x401d403a5d807a40ULL, 0x0820084028104808ULL, 0xc32bc356e89b95c3ULL, |
| 717 | 0xec97ec337bc5dfecULL, 0xdb4bdb9690ab4ddbULL, 0xa1bea1611f5fc0a1ULL, |
| 718 | 0x8d0e8d1c8307918dULL, 0x3df43df5c97ac83dULL, 0x976697ccf1335b97ULL, |
| 719 | 0x0000000000000000ULL, 0xcf1bcf36d483f9cfULL, 0x2bac2b4587566e2bULL, |
| 720 | 0x76c57697b3ece176ULL, 0x82328264b019e682ULL, 0xd67fd6fea9b128d6ULL, |
| 721 | 0x1b6c1bd87736c31bULL, 0xb5eeb5c15b7774b5ULL, 0xaf86af112943beafULL, |
| 722 | 0x6ab56a77dfd41d6aULL, 0x505d50ba0da0ea50ULL, 0x450945124c8a5745ULL, |
| 723 | 0xf3ebf3cb18fb38f3ULL, 0x30c0309df060ad30ULL, 0xef9bef2b74c3c4efULL, |
| 724 | 0x3ffc3fe5c37eda3fULL, 0x554955921caac755ULL, 0xa2b2a2791059dba2ULL, |
| 725 | 0xea8fea0365c9e9eaULL, 0x6589650fecca6a65ULL, 0xbad2bab9686903baULL, |
| 726 | 0x2fbc2f65935e4a2fULL, 0xc027c04ee79d8ec0ULL, 0xde5fdebe81a160deULL, |
| 727 | 0x1c701ce06c38fc1cULL, 0xfdd3fdbb2ee746fdULL, 0x4d294d52649a1f4dULL, |
| 728 | 0x927292e4e0397692ULL, 0x75c9758fbceafa75ULL, 0x061806301e0c3606ULL, |
| 729 | 0x8a128a249809ae8aULL, 0xb2f2b2f940794bb2ULL, 0xe6bfe66359d185e6ULL, |
| 730 | 0x0e380e70361c7e0eULL, 0x1f7c1ff8633ee71fULL, 0x62956237f7c45562ULL, |
| 731 | 0xd477d4eea3b53ad4ULL, 0xa89aa829324d81a8ULL, 0x966296c4f4315296ULL, |
| 732 | 0xf9c3f99b3aef62f9ULL, 0xc533c566f697a3c5ULL, 0x25942535b14a1025ULL, |
| 733 | 0x597959f220b2ab59ULL, 0x842a8454ae15d084ULL, 0x72d572b7a7e4c572ULL, |
| 734 | 0x39e439d5dd72ec39ULL, 0x4c2d4c5a6198164cULL, 0x5e655eca3bbc945eULL, |
| 735 | 0x78fd78e785f09f78ULL, 0x38e038ddd870e538ULL, 0x8c0a8c148605988cULL, |
| 736 | 0xd163d1c6b2bf17d1ULL, 0xa5aea5410b57e4a5ULL, 0xe2afe2434dd9a1e2ULL, |
| 737 | 0x6199612ff8c24e61ULL, 0xb3f6b3f1457b42b3ULL, 0x21842115a5423421ULL, |
| 738 | 0x9c4a9c94d625089cULL, 0x1e781ef0663cee1eULL, 0x4311432252866143ULL, |
| 739 | 0xc73bc776fc93b1c7ULL, 0xfcd7fcb32be54ffcULL, 0x0410042014082404ULL, |
| 740 | 0x515951b208a2e351ULL, 0x995e99bcc72f2599ULL, 0x6da96d4fc4da226dULL, |
| 741 | 0x0d340d68391a650dULL, 0xfacffa8335e979faULL, 0xdf5bdfb684a369dfULL, |
| 742 | 0x7ee57ed79bfca97eULL, 0x2490243db4481924ULL, 0x3bec3bc5d776fe3bULL, |
| 743 | 0xab96ab313d4b9aabULL, 0xce1fce3ed181f0ceULL, 0x1144118855229911ULL, |
| 744 | 0x8f068f0c8903838fULL, 0x4e254e4a6b9c044eULL, 0xb7e6b7d1517366b7ULL, |
| 745 | 0xeb8beb0b60cbe0ebULL, 0x3cf03cfdcc78c13cULL, 0x813e817cbf1ffd81ULL, |
| 746 | 0x946a94d4fe354094ULL, 0xf7fbf7eb0cf31cf7ULL, 0xb9deb9a1676f18b9ULL, |
| 747 | 0x134c13985f268b13ULL, 0x2cb02c7d9c58512cULL, 0xd36bd3d6b8bb05d3ULL, |
| 748 | 0xe7bbe76b5cd38ce7ULL, 0x6ea56e57cbdc396eULL, 0xc437c46ef395aac4ULL, |
| 749 | 0x030c03180f061b03ULL, 0x5645568a13acdc56ULL, 0x440d441a49885e44ULL, |
| 750 | 0x7fe17fdf9efea07fULL, 0xa99ea921374f88a9ULL, 0x2aa82a4d8254672aULL, |
| 751 | 0xbbd6bbb16d6b0abbULL, 0xc123c146e29f87c1ULL, 0x535153a202a6f153ULL, |
| 752 | 0xdc57dcae8ba572dcULL, 0x0b2c0b582716530bULL, 0x9d4e9d9cd327019dULL, |
| 753 | 0x6cad6c47c1d82b6cULL, 0x31c43195f562a431ULL, 0x74cd7487b9e8f374ULL, |
| 754 | 0xf6fff6e309f115f6ULL, 0x4605460a438c4c46ULL, 0xac8aac092645a5acULL, |
| 755 | 0x891e893c970fb589ULL, 0x145014a04428b414ULL, 0xe1a3e15b42dfbae1ULL, |
| 756 | 0x165816b04e2ca616ULL, 0x3ae83acdd274f73aULL, 0x69b9696fd0d20669ULL, |
| 757 | 0x092409482d124109ULL, 0x70dd70a7ade0d770ULL, 0xb6e2b6d954716fb6ULL, |
| 758 | 0xd067d0ceb7bd1ed0ULL, 0xed93ed3b7ec7d6edULL, 0xcc17cc2edb85e2ccULL, |
| 759 | 0x4215422a57846842ULL, 0x985a98b4c22d2c98ULL, 0xa4aaa4490e55eda4ULL, |
| 760 | 0x28a0285d88507528ULL, 0x5c6d5cda31b8865cULL, 0xf8c7f8933fed6bf8ULL, |
| 761 | 0x86228644a411c286ULL, |
| 762 | }; |
| 763 | |
| 764 | static const u64 rc[WHIRLPOOL_ROUNDS + 1] = { |
| 765 | 0x0000000000000000ULL, 0x1823c6e887b8014fULL, 0x36a6d2f5796f9152ULL, |
| 766 | 0x60bc9b8ea30c7b35ULL, 0x1de0d7c22e4bfe57ULL, 0x157737e59ff04adaULL, |
| 767 | 0x58c9290ab1a06b85ULL, 0xbd5d10f4cb3e0567ULL, 0xe427418ba77d95d8ULL, |
| 768 | 0xfbee7c66dd17479eULL, 0xca2dbf07ad5a8333ULL, |
| 769 | }; |
| 770 | |
| 771 | /** |
| 772 | * The core Whirlpool transform. |
| 773 | */ |
| 774 | |
| 775 | static void wp512_process_buffer(struct wp512_ctx *wctx) { |
| 776 | int i, r; |
| 777 | u64 K[8]; /* the round key */ |
| 778 | u64 block[8]; /* mu(buffer) */ |
| 779 | u64 state[8]; /* the cipher state */ |
| 780 | u64 L[8]; |
| 781 | u8 *buffer = wctx->buffer; |
| 782 | |
| 783 | for (i = 0; i < 8; i++, buffer += 8) { |
| 784 | block[i] = |
| 785 | (((u64)buffer[0] ) << 56) ^ |
| 786 | (((u64)buffer[1] & 0xffL) << 48) ^ |
| 787 | (((u64)buffer[2] & 0xffL) << 40) ^ |
| 788 | (((u64)buffer[3] & 0xffL) << 32) ^ |
| 789 | (((u64)buffer[4] & 0xffL) << 24) ^ |
| 790 | (((u64)buffer[5] & 0xffL) << 16) ^ |
| 791 | (((u64)buffer[6] & 0xffL) << 8) ^ |
| 792 | (((u64)buffer[7] & 0xffL) ); |
| 793 | } |
| 794 | |
| 795 | state[0] = block[0] ^ (K[0] = wctx->hash[0]); |
| 796 | state[1] = block[1] ^ (K[1] = wctx->hash[1]); |
| 797 | state[2] = block[2] ^ (K[2] = wctx->hash[2]); |
| 798 | state[3] = block[3] ^ (K[3] = wctx->hash[3]); |
| 799 | state[4] = block[4] ^ (K[4] = wctx->hash[4]); |
| 800 | state[5] = block[5] ^ (K[5] = wctx->hash[5]); |
| 801 | state[6] = block[6] ^ (K[6] = wctx->hash[6]); |
| 802 | state[7] = block[7] ^ (K[7] = wctx->hash[7]); |
| 803 | |
| 804 | for (r = 1; r <= WHIRLPOOL_ROUNDS; r++) { |
| 805 | |
| 806 | L[0] = C0[(int)(K[0] >> 56) ] ^ |
| 807 | C1[(int)(K[7] >> 48) & 0xff] ^ |
| 808 | C2[(int)(K[6] >> 40) & 0xff] ^ |
| 809 | C3[(int)(K[5] >> 32) & 0xff] ^ |
| 810 | C4[(int)(K[4] >> 24) & 0xff] ^ |
| 811 | C5[(int)(K[3] >> 16) & 0xff] ^ |
| 812 | C6[(int)(K[2] >> 8) & 0xff] ^ |
| 813 | C7[(int)(K[1] ) & 0xff] ^ |
| 814 | rc[r]; |
| 815 | |
| 816 | L[1] = C0[(int)(K[1] >> 56) ] ^ |
| 817 | C1[(int)(K[0] >> 48) & 0xff] ^ |
| 818 | C2[(int)(K[7] >> 40) & 0xff] ^ |
| 819 | C3[(int)(K[6] >> 32) & 0xff] ^ |
| 820 | C4[(int)(K[5] >> 24) & 0xff] ^ |
| 821 | C5[(int)(K[4] >> 16) & 0xff] ^ |
| 822 | C6[(int)(K[3] >> 8) & 0xff] ^ |
| 823 | C7[(int)(K[2] ) & 0xff]; |
| 824 | |
| 825 | L[2] = C0[(int)(K[2] >> 56) ] ^ |
| 826 | C1[(int)(K[1] >> 48) & 0xff] ^ |
| 827 | C2[(int)(K[0] >> 40) & 0xff] ^ |
| 828 | C3[(int)(K[7] >> 32) & 0xff] ^ |
| 829 | C4[(int)(K[6] >> 24) & 0xff] ^ |
| 830 | C5[(int)(K[5] >> 16) & 0xff] ^ |
| 831 | C6[(int)(K[4] >> 8) & 0xff] ^ |
| 832 | C7[(int)(K[3] ) & 0xff]; |
| 833 | |
| 834 | L[3] = C0[(int)(K[3] >> 56) ] ^ |
| 835 | C1[(int)(K[2] >> 48) & 0xff] ^ |
| 836 | C2[(int)(K[1] >> 40) & 0xff] ^ |
| 837 | C3[(int)(K[0] >> 32) & 0xff] ^ |
| 838 | C4[(int)(K[7] >> 24) & 0xff] ^ |
| 839 | C5[(int)(K[6] >> 16) & 0xff] ^ |
| 840 | C6[(int)(K[5] >> 8) & 0xff] ^ |
| 841 | C7[(int)(K[4] ) & 0xff]; |
| 842 | |
| 843 | L[4] = C0[(int)(K[4] >> 56) ] ^ |
| 844 | C1[(int)(K[3] >> 48) & 0xff] ^ |
| 845 | C2[(int)(K[2] >> 40) & 0xff] ^ |
| 846 | C3[(int)(K[1] >> 32) & 0xff] ^ |
| 847 | C4[(int)(K[0] >> 24) & 0xff] ^ |
| 848 | C5[(int)(K[7] >> 16) & 0xff] ^ |
| 849 | C6[(int)(K[6] >> 8) & 0xff] ^ |
| 850 | C7[(int)(K[5] ) & 0xff]; |
| 851 | |
| 852 | L[5] = C0[(int)(K[5] >> 56) ] ^ |
| 853 | C1[(int)(K[4] >> 48) & 0xff] ^ |
| 854 | C2[(int)(K[3] >> 40) & 0xff] ^ |
| 855 | C3[(int)(K[2] >> 32) & 0xff] ^ |
| 856 | C4[(int)(K[1] >> 24) & 0xff] ^ |
| 857 | C5[(int)(K[0] >> 16) & 0xff] ^ |
| 858 | C6[(int)(K[7] >> 8) & 0xff] ^ |
| 859 | C7[(int)(K[6] ) & 0xff]; |
| 860 | |
| 861 | L[6] = C0[(int)(K[6] >> 56) ] ^ |
| 862 | C1[(int)(K[5] >> 48) & 0xff] ^ |
| 863 | C2[(int)(K[4] >> 40) & 0xff] ^ |
| 864 | C3[(int)(K[3] >> 32) & 0xff] ^ |
| 865 | C4[(int)(K[2] >> 24) & 0xff] ^ |
| 866 | C5[(int)(K[1] >> 16) & 0xff] ^ |
| 867 | C6[(int)(K[0] >> 8) & 0xff] ^ |
| 868 | C7[(int)(K[7] ) & 0xff]; |
| 869 | |
| 870 | L[7] = C0[(int)(K[7] >> 56) ] ^ |
| 871 | C1[(int)(K[6] >> 48) & 0xff] ^ |
| 872 | C2[(int)(K[5] >> 40) & 0xff] ^ |
| 873 | C3[(int)(K[4] >> 32) & 0xff] ^ |
| 874 | C4[(int)(K[3] >> 24) & 0xff] ^ |
| 875 | C5[(int)(K[2] >> 16) & 0xff] ^ |
| 876 | C6[(int)(K[1] >> 8) & 0xff] ^ |
| 877 | C7[(int)(K[0] ) & 0xff]; |
| 878 | |
| 879 | K[0] = L[0]; |
| 880 | K[1] = L[1]; |
| 881 | K[2] = L[2]; |
| 882 | K[3] = L[3]; |
| 883 | K[4] = L[4]; |
| 884 | K[5] = L[5]; |
| 885 | K[6] = L[6]; |
| 886 | K[7] = L[7]; |
| 887 | |
| 888 | L[0] = C0[(int)(state[0] >> 56) ] ^ |
| 889 | C1[(int)(state[7] >> 48) & 0xff] ^ |
| 890 | C2[(int)(state[6] >> 40) & 0xff] ^ |
| 891 | C3[(int)(state[5] >> 32) & 0xff] ^ |
| 892 | C4[(int)(state[4] >> 24) & 0xff] ^ |
| 893 | C5[(int)(state[3] >> 16) & 0xff] ^ |
| 894 | C6[(int)(state[2] >> 8) & 0xff] ^ |
| 895 | C7[(int)(state[1] ) & 0xff] ^ |
| 896 | K[0]; |
| 897 | |
| 898 | L[1] = C0[(int)(state[1] >> 56) ] ^ |
| 899 | C1[(int)(state[0] >> 48) & 0xff] ^ |
| 900 | C2[(int)(state[7] >> 40) & 0xff] ^ |
| 901 | C3[(int)(state[6] >> 32) & 0xff] ^ |
| 902 | C4[(int)(state[5] >> 24) & 0xff] ^ |
| 903 | C5[(int)(state[4] >> 16) & 0xff] ^ |
| 904 | C6[(int)(state[3] >> 8) & 0xff] ^ |
| 905 | C7[(int)(state[2] ) & 0xff] ^ |
| 906 | K[1]; |
| 907 | |
| 908 | L[2] = C0[(int)(state[2] >> 56) ] ^ |
| 909 | C1[(int)(state[1] >> 48) & 0xff] ^ |
| 910 | C2[(int)(state[0] >> 40) & 0xff] ^ |
| 911 | C3[(int)(state[7] >> 32) & 0xff] ^ |
| 912 | C4[(int)(state[6] >> 24) & 0xff] ^ |
| 913 | C5[(int)(state[5] >> 16) & 0xff] ^ |
| 914 | C6[(int)(state[4] >> 8) & 0xff] ^ |
| 915 | C7[(int)(state[3] ) & 0xff] ^ |
| 916 | K[2]; |
| 917 | |
| 918 | L[3] = C0[(int)(state[3] >> 56) ] ^ |
| 919 | C1[(int)(state[2] >> 48) & 0xff] ^ |
| 920 | C2[(int)(state[1] >> 40) & 0xff] ^ |
| 921 | C3[(int)(state[0] >> 32) & 0xff] ^ |
| 922 | C4[(int)(state[7] >> 24) & 0xff] ^ |
| 923 | C5[(int)(state[6] >> 16) & 0xff] ^ |
| 924 | C6[(int)(state[5] >> 8) & 0xff] ^ |
| 925 | C7[(int)(state[4] ) & 0xff] ^ |
| 926 | K[3]; |
| 927 | |
| 928 | L[4] = C0[(int)(state[4] >> 56) ] ^ |
| 929 | C1[(int)(state[3] >> 48) & 0xff] ^ |
| 930 | C2[(int)(state[2] >> 40) & 0xff] ^ |
| 931 | C3[(int)(state[1] >> 32) & 0xff] ^ |
| 932 | C4[(int)(state[0] >> 24) & 0xff] ^ |
| 933 | C5[(int)(state[7] >> 16) & 0xff] ^ |
| 934 | C6[(int)(state[6] >> 8) & 0xff] ^ |
| 935 | C7[(int)(state[5] ) & 0xff] ^ |
| 936 | K[4]; |
| 937 | |
| 938 | L[5] = C0[(int)(state[5] >> 56) ] ^ |
| 939 | C1[(int)(state[4] >> 48) & 0xff] ^ |
| 940 | C2[(int)(state[3] >> 40) & 0xff] ^ |
| 941 | C3[(int)(state[2] >> 32) & 0xff] ^ |
| 942 | C4[(int)(state[1] >> 24) & 0xff] ^ |
| 943 | C5[(int)(state[0] >> 16) & 0xff] ^ |
| 944 | C6[(int)(state[7] >> 8) & 0xff] ^ |
| 945 | C7[(int)(state[6] ) & 0xff] ^ |
| 946 | K[5]; |
| 947 | |
| 948 | L[6] = C0[(int)(state[6] >> 56) ] ^ |
| 949 | C1[(int)(state[5] >> 48) & 0xff] ^ |
| 950 | C2[(int)(state[4] >> 40) & 0xff] ^ |
| 951 | C3[(int)(state[3] >> 32) & 0xff] ^ |
| 952 | C4[(int)(state[2] >> 24) & 0xff] ^ |
| 953 | C5[(int)(state[1] >> 16) & 0xff] ^ |
| 954 | C6[(int)(state[0] >> 8) & 0xff] ^ |
| 955 | C7[(int)(state[7] ) & 0xff] ^ |
| 956 | K[6]; |
| 957 | |
| 958 | L[7] = C0[(int)(state[7] >> 56) ] ^ |
| 959 | C1[(int)(state[6] >> 48) & 0xff] ^ |
| 960 | C2[(int)(state[5] >> 40) & 0xff] ^ |
| 961 | C3[(int)(state[4] >> 32) & 0xff] ^ |
| 962 | C4[(int)(state[3] >> 24) & 0xff] ^ |
| 963 | C5[(int)(state[2] >> 16) & 0xff] ^ |
| 964 | C6[(int)(state[1] >> 8) & 0xff] ^ |
| 965 | C7[(int)(state[0] ) & 0xff] ^ |
| 966 | K[7]; |
| 967 | |
| 968 | state[0] = L[0]; |
| 969 | state[1] = L[1]; |
| 970 | state[2] = L[2]; |
| 971 | state[3] = L[3]; |
| 972 | state[4] = L[4]; |
| 973 | state[5] = L[5]; |
| 974 | state[6] = L[6]; |
| 975 | state[7] = L[7]; |
| 976 | } |
| 977 | /* |
| 978 | * apply the Miyaguchi-Preneel compression function: |
| 979 | */ |
| 980 | wctx->hash[0] ^= state[0] ^ block[0]; |
| 981 | wctx->hash[1] ^= state[1] ^ block[1]; |
| 982 | wctx->hash[2] ^= state[2] ^ block[2]; |
| 983 | wctx->hash[3] ^= state[3] ^ block[3]; |
| 984 | wctx->hash[4] ^= state[4] ^ block[4]; |
| 985 | wctx->hash[5] ^= state[5] ^ block[5]; |
| 986 | wctx->hash[6] ^= state[6] ^ block[6]; |
| 987 | wctx->hash[7] ^= state[7] ^ block[7]; |
| 988 | |
| 989 | } |
| 990 | |
| 991 | static void wp512_init (void *ctx) { |
| 992 | int i; |
| 993 | struct wp512_ctx *wctx = ctx; |
| 994 | |
| 995 | memset(wctx->bitLength, 0, 32); |
| 996 | wctx->bufferBits = wctx->bufferPos = 0; |
| 997 | wctx->buffer[0] = 0; |
| 998 | for (i = 0; i < 8; i++) { |
| 999 | wctx->hash[i] = 0L; |
| 1000 | } |
| 1001 | } |
| 1002 | |
| 1003 | static void wp512_update(void *ctx, const u8 *source, unsigned int len) |
| 1004 | { |
| 1005 | |
| 1006 | struct wp512_ctx *wctx = ctx; |
| 1007 | int sourcePos = 0; |
| 1008 | unsigned int bits_len = len * 8; // convert to number of bits |
| 1009 | int sourceGap = (8 - ((int)bits_len & 7)) & 7; |
| 1010 | int bufferRem = wctx->bufferBits & 7; |
| 1011 | int i; |
| 1012 | u32 b, carry; |
| 1013 | u8 *buffer = wctx->buffer; |
| 1014 | u8 *bitLength = wctx->bitLength; |
| 1015 | int bufferBits = wctx->bufferBits; |
| 1016 | int bufferPos = wctx->bufferPos; |
| 1017 | |
| 1018 | u64 value = bits_len; |
| 1019 | for (i = 31, carry = 0; i >= 0 && (carry != 0 || value != 0ULL); i--) { |
| 1020 | carry += bitLength[i] + ((u32)value & 0xff); |
| 1021 | bitLength[i] = (u8)carry; |
| 1022 | carry >>= 8; |
| 1023 | value >>= 8; |
| 1024 | } |
| 1025 | while (bits_len > 8) { |
| 1026 | b = ((source[sourcePos] << sourceGap) & 0xff) | |
| 1027 | ((source[sourcePos + 1] & 0xff) >> (8 - sourceGap)); |
| 1028 | buffer[bufferPos++] |= (u8)(b >> bufferRem); |
| 1029 | bufferBits += 8 - bufferRem; |
| 1030 | if (bufferBits == WP512_BLOCK_SIZE * 8) { |
| 1031 | wp512_process_buffer(wctx); |
| 1032 | bufferBits = bufferPos = 0; |
| 1033 | } |
| 1034 | buffer[bufferPos] = b << (8 - bufferRem); |
| 1035 | bufferBits += bufferRem; |
| 1036 | bits_len -= 8; |
| 1037 | sourcePos++; |
| 1038 | } |
| 1039 | if (bits_len > 0) { |
| 1040 | b = (source[sourcePos] << sourceGap) & 0xff; |
| 1041 | buffer[bufferPos] |= b >> bufferRem; |
| 1042 | } else { |
| 1043 | b = 0; |
| 1044 | } |
| 1045 | if (bufferRem + bits_len < 8) { |
| 1046 | bufferBits += bits_len; |
| 1047 | } else { |
| 1048 | bufferPos++; |
| 1049 | bufferBits += 8 - bufferRem; |
| 1050 | bits_len -= 8 - bufferRem; |
| 1051 | if (bufferBits == WP512_BLOCK_SIZE * 8) { |
| 1052 | wp512_process_buffer(wctx); |
| 1053 | bufferBits = bufferPos = 0; |
| 1054 | } |
| 1055 | buffer[bufferPos] = b << (8 - bufferRem); |
| 1056 | bufferBits += (int)bits_len; |
| 1057 | } |
| 1058 | |
| 1059 | wctx->bufferBits = bufferBits; |
| 1060 | wctx->bufferPos = bufferPos; |
| 1061 | |
| 1062 | } |
| 1063 | |
| 1064 | static void wp512_final(void *ctx, u8 *out) |
| 1065 | { |
| 1066 | struct wp512_ctx *wctx = ctx; |
| 1067 | int i; |
| 1068 | u8 *buffer = wctx->buffer; |
| 1069 | u8 *bitLength = wctx->bitLength; |
| 1070 | int bufferBits = wctx->bufferBits; |
| 1071 | int bufferPos = wctx->bufferPos; |
| 1072 | u8 *digest = out; |
| 1073 | |
| 1074 | buffer[bufferPos] |= 0x80U >> (bufferBits & 7); |
| 1075 | bufferPos++; |
| 1076 | if (bufferPos > WP512_BLOCK_SIZE - WP512_LENGTHBYTES) { |
| 1077 | if (bufferPos < WP512_BLOCK_SIZE) { |
| 1078 | memset(&buffer[bufferPos], 0, WP512_BLOCK_SIZE - bufferPos); |
| 1079 | } |
| 1080 | wp512_process_buffer(wctx); |
| 1081 | bufferPos = 0; |
| 1082 | } |
| 1083 | if (bufferPos < WP512_BLOCK_SIZE - WP512_LENGTHBYTES) { |
| 1084 | memset(&buffer[bufferPos], 0, |
| 1085 | (WP512_BLOCK_SIZE - WP512_LENGTHBYTES) - bufferPos); |
| 1086 | } |
| 1087 | bufferPos = WP512_BLOCK_SIZE - WP512_LENGTHBYTES; |
| 1088 | memcpy(&buffer[WP512_BLOCK_SIZE - WP512_LENGTHBYTES], |
| 1089 | bitLength, WP512_LENGTHBYTES); |
| 1090 | wp512_process_buffer(wctx); |
| 1091 | for (i = 0; i < WP512_DIGEST_SIZE/8; i++) { |
| 1092 | digest[0] = (u8)(wctx->hash[i] >> 56); |
| 1093 | digest[1] = (u8)(wctx->hash[i] >> 48); |
| 1094 | digest[2] = (u8)(wctx->hash[i] >> 40); |
| 1095 | digest[3] = (u8)(wctx->hash[i] >> 32); |
| 1096 | digest[4] = (u8)(wctx->hash[i] >> 24); |
| 1097 | digest[5] = (u8)(wctx->hash[i] >> 16); |
| 1098 | digest[6] = (u8)(wctx->hash[i] >> 8); |
| 1099 | digest[7] = (u8)(wctx->hash[i] ); |
| 1100 | digest += 8; |
| 1101 | } |
| 1102 | wctx->bufferBits = bufferBits; |
| 1103 | wctx->bufferPos = bufferPos; |
| 1104 | } |
| 1105 | |
| 1106 | static void wp384_final(void *ctx, u8 *out) |
| 1107 | { |
| 1108 | struct wp512_ctx *wctx = ctx; |
| 1109 | u8 D[64]; |
| 1110 | |
| 1111 | wp512_final (wctx, D); |
| 1112 | memcpy (out, D, WP384_DIGEST_SIZE); |
| 1113 | memset (D, 0, WP512_DIGEST_SIZE); |
| 1114 | } |
| 1115 | |
| 1116 | static void wp256_final(void *ctx, u8 *out) |
| 1117 | { |
| 1118 | struct wp512_ctx *wctx = ctx; |
| 1119 | u8 D[64]; |
| 1120 | |
| 1121 | wp512_final (wctx, D); |
| 1122 | memcpy (out, D, WP256_DIGEST_SIZE); |
| 1123 | memset (D, 0, WP512_DIGEST_SIZE); |
| 1124 | } |
| 1125 | |
| 1126 | static struct crypto_alg wp512 = { |
| 1127 | .cra_name = "wp512", |
| 1128 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, |
| 1129 | .cra_blocksize = WP512_BLOCK_SIZE, |
| 1130 | .cra_ctxsize = sizeof(struct wp512_ctx), |
| 1131 | .cra_module = THIS_MODULE, |
| 1132 | .cra_list = LIST_HEAD_INIT(wp512.cra_list), |
| 1133 | .cra_u = { .digest = { |
| 1134 | .dia_digestsize = WP512_DIGEST_SIZE, |
| 1135 | .dia_init = wp512_init, |
| 1136 | .dia_update = wp512_update, |
| 1137 | .dia_final = wp512_final } } |
| 1138 | }; |
| 1139 | |
| 1140 | static struct crypto_alg wp384 = { |
| 1141 | .cra_name = "wp384", |
| 1142 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, |
| 1143 | .cra_blocksize = WP512_BLOCK_SIZE, |
| 1144 | .cra_ctxsize = sizeof(struct wp512_ctx), |
| 1145 | .cra_module = THIS_MODULE, |
| 1146 | .cra_list = LIST_HEAD_INIT(wp384.cra_list), |
| 1147 | .cra_u = { .digest = { |
| 1148 | .dia_digestsize = WP384_DIGEST_SIZE, |
| 1149 | .dia_init = wp512_init, |
| 1150 | .dia_update = wp512_update, |
| 1151 | .dia_final = wp384_final } } |
| 1152 | }; |
| 1153 | |
| 1154 | static struct crypto_alg wp256 = { |
| 1155 | .cra_name = "wp256", |
| 1156 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, |
| 1157 | .cra_blocksize = WP512_BLOCK_SIZE, |
| 1158 | .cra_ctxsize = sizeof(struct wp512_ctx), |
| 1159 | .cra_module = THIS_MODULE, |
| 1160 | .cra_list = LIST_HEAD_INIT(wp256.cra_list), |
| 1161 | .cra_u = { .digest = { |
| 1162 | .dia_digestsize = WP256_DIGEST_SIZE, |
| 1163 | .dia_init = wp512_init, |
| 1164 | .dia_update = wp512_update, |
| 1165 | .dia_final = wp256_final } } |
| 1166 | }; |
| 1167 | |
| 1168 | static int __init init(void) |
| 1169 | { |
| 1170 | int ret = 0; |
| 1171 | |
| 1172 | ret = crypto_register_alg(&wp512); |
| 1173 | |
| 1174 | if (ret < 0) |
| 1175 | goto out; |
| 1176 | |
| 1177 | ret = crypto_register_alg(&wp384); |
| 1178 | if (ret < 0) |
| 1179 | { |
| 1180 | crypto_unregister_alg(&wp512); |
| 1181 | goto out; |
| 1182 | } |
| 1183 | |
| 1184 | ret = crypto_register_alg(&wp256); |
| 1185 | if (ret < 0) |
| 1186 | { |
| 1187 | crypto_unregister_alg(&wp512); |
| 1188 | crypto_unregister_alg(&wp384); |
| 1189 | } |
| 1190 | out: |
| 1191 | return ret; |
| 1192 | } |
| 1193 | |
| 1194 | static void __exit fini(void) |
| 1195 | { |
| 1196 | crypto_unregister_alg(&wp512); |
| 1197 | crypto_unregister_alg(&wp384); |
| 1198 | crypto_unregister_alg(&wp256); |
| 1199 | } |
| 1200 | |
| 1201 | MODULE_ALIAS("wp384"); |
| 1202 | MODULE_ALIAS("wp256"); |
| 1203 | |
| 1204 | module_init(init); |
| 1205 | module_exit(fini); |
| 1206 | |
| 1207 | MODULE_LICENSE("GPL"); |
| 1208 | MODULE_DESCRIPTION("Whirlpool Message Digest Algorithm"); |