/*
* Cryptographic API.
*
* Whirlpool hashing Algorithm
*
* The Whirlpool algorithm was developed by Paulo S. L. M. Barreto and
* Vincent Rijmen. It has been selected as one of cryptographic
* primitives by the NESSIE project http://www.cryptonessie.org/
*
* The original authors have disclaimed all copyright interest in this
* code and thus put it in the public domain. The subsequent authors
* have put this under the GNU General Public License.
*
* By Aaron Grothe ajgrothe@yahoo.com, August 23, 2004
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
*/
#include <crypto/internal/hash.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/string.h>
#include <linux/unaligned.h>
#define WP512_DIGEST_SIZE
64
#define WP384_DIGEST_SIZE
48
#define WP256_DIGEST_SIZE
32
#define WP512_BLOCK_SIZE
64
#define WP512_LENGTHBYTES
32
#define WHIRLPOOL_ROUNDS
10
struct wp512_ctx {
u8 bitLength[WP512_LENGTHBYTES];
u64 hash[WP512_DIGEST_SIZE/
8 ];
};
/*
* Though Whirlpool is endianness-neutral, the encryption tables are listed
* in BIG-ENDIAN format, which is adopted throughout this implementation
* (but little-endian notation would be equally suitable if consistently
* employed).
*/
static const u64 C0[
256 ] = {
0 x18186018c07830d8ULL,
0 x23238c2305af4626ULL,
0 xc6c63fc67ef991b8ULL,
0 xe8e887e8136fcdfbULL,
0 x878726874ca113cbULL,
0 xb8b8dab8a9626d11ULL,
0 x0101040108050209ULL,
0 x4f4f214f426e9e0dULL,
0 x3636d836adee6c9bULL,
0 xa6a6a2a6590451ffULL,
0 xd2d26fd2debdb90cULL,
0 xf5f5f3f5fb06f70eULL,
0 x7979f979ef80f296ULL,
0 x6f6fa16f5fcede30ULL,
0 x91917e91fcef3f6dULL,
0 x52525552aa07a4f8ULL,
0 x60609d6027fdc047ULL,
0 xbcbccabc89766535ULL,
0 x9b9b569baccd2b37ULL,
0 x8e8e028e048c018aULL,
0 xa3a3b6a371155bd2ULL,
0 x0c0c300c603c186cULL,
0 x7b7bf17bff8af684ULL,
0 x3535d435b5e16a80ULL,
0 x1d1d741de8693af5ULL,
0 xe0e0a7e05347ddb3ULL,
0 xd7d77bd7f6acb321ULL,
0 xc2c22fc25eed999cULL,
0 x2e2eb82e6d965c43ULL,
0 x4b4b314b627a9629ULL,
0 xfefedffea321e15dULL,
0 x575741578216aed5ULL,
0 x15155415a8412abdULL,
0 x7777c1779fb6eee8ULL,
0 x3737dc37a5eb6e92ULL,
0 xe5e5b3e57b56d79eULL,
0 x9f9f469f8cd92313ULL,
0 xf0f0e7f0d317fd23ULL,
0 x4a4a354a6a7f9420ULL,
0 xdada4fda9e95a944ULL,
0 x58587d58fa25b0a2ULL,
0 xc9c903c906ca8fcfULL,
0 x2929a429558d527cULL,
0 x0a0a280a5022145aULL,
0 xb1b1feb1e14f7f50ULL,
0 xa0a0baa0691a5dc9ULL,
0 x6b6bb16b7fdad614ULL,
0 x85852e855cab17d9ULL,
0 xbdbdcebd8173673cULL,
0 x5d5d695dd234ba8fULL,
0 x1010401080502090ULL,
0 xf4f4f7f4f303f507ULL,
0 xcbcb0bcb16c08bddULL,
0 x3e3ef83eedc67cd3ULL,
0 x0505140528110a2dULL,
0 x676781671fe6ce78ULL,
0 xe4e4b7e47353d597ULL,
0 x27279c2725bb4e02ULL,
0 x4141194132588273ULL,
0 x8b8b168b2c9d0ba7ULL,
0 xa7a7a6a7510153f6ULL,
0 x7d7de97dcf94fab2ULL,
0 x95956e95dcfb3749ULL,
0 xd8d847d88e9fad56ULL,
0 xfbfbcbfb8b30eb70ULL,
0 xeeee9fee2371c1cdULL,
0 x7c7ced7cc791f8bbULL,
0 x6666856617e3cc71ULL,
0 xdddd53dda68ea77bULL,
0 x17175c17b84b2eafULL,
0 x4747014702468e45ULL,
0 x9e9e429e84dc211aULL,
0 xcaca0fca1ec589d4ULL,
0 x2d2db42d75995a58ULL,
0 xbfbfc6bf9179632eULL,
0 x07071c07381b0e3fULL,
0 xadad8ead012347acULL,
0 x5a5a755aea2fb4b0ULL,
0 x838336836cb51befULL,
0 x3333cc3385ff66b6ULL,
0 x636391633ff2c65cULL,
0 x02020802100a0412ULL,
0 xaaaa92aa39384993ULL,
0 x7171d971afa8e2deULL,
0 xc8c807c80ecf8dc6ULL,
0 x19196419c87d32d1ULL,
0 x494939497270923bULL,
0 xd9d943d9869aaf5fULL,
0 xf2f2eff2c31df931ULL,
0 xe3e3abe34b48dba8ULL,
0 x5b5b715be22ab6b9ULL,
0 x88881a8834920dbcULL,
0 x9a9a529aa4c8293eULL,
0 x262698262dbe4c0bULL,
0 x3232c8328dfa64bfULL,
0 xb0b0fab0e94a7d59ULL,
0 xe9e983e91b6acff2ULL,
0 x0f0f3c0f78331e77ULL,
0 xd5d573d5e6a6b733ULL,
0 x80803a8074ba1df4ULL,
0 xbebec2be997c6127ULL,
0 xcdcd13cd26de87ebULL,
0 x3434d034bde46889ULL,
0 x48483d487a759032ULL,
0 xffffdbffab24e354ULL,
0 x7a7af57af78ff48dULL,
0 x90907a90f4ea3d64ULL,
0 x5f5f615fc23ebe9dULL,
0 x202080201da0403dULL,
0 x6868bd6867d5d00fULL,
0 x1a1a681ad07234caULL,
0 xaeae82ae192c41b7ULL,
0 xb4b4eab4c95e757dULL,
0 x54544d549a19a8ceULL,
0 x93937693ece53b7fULL,
0 x222288220daa442fULL,
0 x64648d6407e9c863ULL,
0 xf1f1e3f1db12ff2aULL,
0 x7373d173bfa2e6ccULL,
0 x12124812905a2482ULL,
0 x40401d403a5d807aULL,
0 x0808200840281048ULL,
0 xc3c32bc356e89b95ULL,
0 xecec97ec337bc5dfULL,
0 xdbdb4bdb9690ab4dULL,
0 xa1a1bea1611f5fc0ULL,
0 x8d8d0e8d1c830791ULL,
0 x3d3df43df5c97ac8ULL,
0 x97976697ccf1335bULL,
0 x0000000000000000ULL,
0 xcfcf1bcf36d483f9ULL,
0 x2b2bac2b4587566eULL,
0 x7676c57697b3ece1ULL,
0 x8282328264b019e6ULL,
0 xd6d67fd6fea9b128ULL,
0 x1b1b6c1bd87736c3ULL,
0 xb5b5eeb5c15b7774ULL,
0 xafaf86af112943beULL,
0 x6a6ab56a77dfd41dULL,
0 x50505d50ba0da0eaULL,
0 x45450945124c8a57ULL,
0 xf3f3ebf3cb18fb38ULL,
0 x3030c0309df060adULL,
0 xefef9bef2b74c3c4ULL,
0 x3f3ffc3fe5c37edaULL,
0 x55554955921caac7ULL,
0 xa2a2b2a2791059dbULL,
0 xeaea8fea0365c9e9ULL,
0 x656589650fecca6aULL,
0 xbabad2bab9686903ULL,
0 x2f2fbc2f65935e4aULL,
0 xc0c027c04ee79d8eULL,
0 xdede5fdebe81a160ULL,
0 x1c1c701ce06c38fcULL,
0 xfdfdd3fdbb2ee746ULL,
0 x4d4d294d52649a1fULL,
0 x92927292e4e03976ULL,
0 x7575c9758fbceafaULL,
0 x06061806301e0c36ULL,
0 x8a8a128a249809aeULL,
0 xb2b2f2b2f940794bULL,
0 xe6e6bfe66359d185ULL,
0 x0e0e380e70361c7eULL,
0 x1f1f7c1ff8633ee7ULL,
0 x6262956237f7c455ULL,
0 xd4d477d4eea3b53aULL,
0 xa8a89aa829324d81ULL,
0 x96966296c4f43152ULL,
0 xf9f9c3f99b3aef62ULL,
0 xc5c533c566f697a3ULL,
0 x2525942535b14a10ULL,
0 x59597959f220b2abULL,
0 x84842a8454ae15d0ULL,
0 x7272d572b7a7e4c5ULL,
0 x3939e439d5dd72ecULL,
0 x4c4c2d4c5a619816ULL,
0 x5e5e655eca3bbc94ULL,
0 x7878fd78e785f09fULL,
0 x3838e038ddd870e5ULL,
0 x8c8c0a8c14860598ULL,
0 xd1d163d1c6b2bf17ULL,
0 xa5a5aea5410b57e4ULL,
0 xe2e2afe2434dd9a1ULL,
0 x616199612ff8c24eULL,
0 xb3b3f6b3f1457b42ULL,
0 x2121842115a54234ULL,
0 x9c9c4a9c94d62508ULL,
0 x1e1e781ef0663ceeULL,
0 x4343114322528661ULL,
0 xc7c73bc776fc93b1ULL,
0 xfcfcd7fcb32be54fULL,
0 x0404100420140824ULL,
0 x51515951b208a2e3ULL,
0 x99995e99bcc72f25ULL,
0 x6d6da96d4fc4da22ULL,
0 x0d0d340d68391a65ULL,
0 xfafacffa8335e979ULL,
0 xdfdf5bdfb684a369ULL,
0 x7e7ee57ed79bfca9ULL,
0 x242490243db44819ULL,
0 x3b3bec3bc5d776feULL,
0 xabab96ab313d4b9aULL,
0 xcece1fce3ed181f0ULL,
0 x1111441188552299ULL,
0 x8f8f068f0c890383ULL,
0 x4e4e254e4a6b9c04ULL,
0 xb7b7e6b7d1517366ULL,
0 xebeb8beb0b60cbe0ULL,
0 x3c3cf03cfdcc78c1ULL,
0 x81813e817cbf1ffdULL,
0 x94946a94d4fe3540ULL,
0 xf7f7fbf7eb0cf31cULL,
0 xb9b9deb9a1676f18ULL,
0 x13134c13985f268bULL,
0 x2c2cb02c7d9c5851ULL,
0 xd3d36bd3d6b8bb05ULL,
0 xe7e7bbe76b5cd38cULL,
0 x6e6ea56e57cbdc39ULL,
0 xc4c437c46ef395aaULL,
0 x03030c03180f061bULL,
0 x565645568a13acdcULL,
0 x44440d441a49885eULL,
0 x7f7fe17fdf9efea0ULL,
0 xa9a99ea921374f88ULL,
0 x2a2aa82a4d825467ULL,
0 xbbbbd6bbb16d6b0aULL,
0 xc1c123c146e29f87ULL,
0 x53535153a202a6f1ULL,
0 xdcdc57dcae8ba572ULL,
0 x0b0b2c0b58271653ULL,
0 x9d9d4e9d9cd32701ULL,
0 x6c6cad6c47c1d82bULL,
0 x3131c43195f562a4ULL,
0 x7474cd7487b9e8f3ULL,
0 xf6f6fff6e309f115ULL,
0 x464605460a438c4cULL,
0 xacac8aac092645a5ULL,
0 x89891e893c970fb5ULL,
0 x14145014a04428b4ULL,
0 xe1e1a3e15b42dfbaULL,
0 x16165816b04e2ca6ULL,
0 x3a3ae83acdd274f7ULL,
0 x6969b9696fd0d206ULL,
0 x09092409482d1241ULL,
0 x7070dd70a7ade0d7ULL,
0 xb6b6e2b6d954716fULL,
0 xd0d067d0ceb7bd1eULL,
0 xeded93ed3b7ec7d6ULL,
0 xcccc17cc2edb85e2ULL,
0 x424215422a578468ULL,
0 x98985a98b4c22d2cULL,
0 xa4a4aaa4490e55edULL,
0 x2828a0285d885075ULL,
0 x5c5c6d5cda31b886ULL,
0 xf8f8c7f8933fed6bULL,
0 x8686228644a411c2ULL,
};
static const u64 C1[
256 ] = {
0 xd818186018c07830ULL,
0 x2623238c2305af46ULL,
0 xb8c6c63fc67ef991ULL,
0 xfbe8e887e8136fcdULL,
0 xcb878726874ca113ULL,
0 x11b8b8dab8a9626dULL,
0 x0901010401080502ULL,
0 x0d4f4f214f426e9eULL,
0 x9b3636d836adee6cULL,
0 xffa6a6a2a6590451ULL,
0 x0cd2d26fd2debdb9ULL,
0 x0ef5f5f3f5fb06f7ULL,
0 x967979f979ef80f2ULL,
0 x306f6fa16f5fcedeULL,
0 x6d91917e91fcef3fULL,
0 xf852525552aa07a4ULL,
0 x4760609d6027fdc0ULL,
0 x35bcbccabc897665ULL,
0 x379b9b569baccd2bULL,
0 x8a8e8e028e048c01ULL,
0 xd2a3a3b6a371155bULL,
0 x6c0c0c300c603c18ULL,
0 x847b7bf17bff8af6ULL,
0 x803535d435b5e16aULL,
0 xf51d1d741de8693aULL,
0 xb3e0e0a7e05347ddULL,
0 x21d7d77bd7f6acb3ULL,
0 x9cc2c22fc25eed99ULL,
0 x432e2eb82e6d965cULL,
0 x294b4b314b627a96ULL,
0 x5dfefedffea321e1ULL,
0 xd5575741578216aeULL,
0 xbd15155415a8412aULL,
0 xe87777c1779fb6eeULL,
0 x923737dc37a5eb6eULL,
0 x9ee5e5b3e57b56d7ULL,
0 x139f9f469f8cd923ULL,
0 x23f0f0e7f0d317fdULL,
0 x204a4a354a6a7f94ULL,
0 x44dada4fda9e95a9ULL,
0 xa258587d58fa25b0ULL,
0 xcfc9c903c906ca8fULL,
0 x7c2929a429558d52ULL,
0 x5a0a0a280a502214ULL,
0 x50b1b1feb1e14f7fULL,
0 xc9a0a0baa0691a5dULL,
0 x146b6bb16b7fdad6ULL,
0 xd985852e855cab17ULL,
0 x3cbdbdcebd817367ULL,
0 x8f5d5d695dd234baULL,
0 x9010104010805020ULL,
0 x07f4f4f7f4f303f5ULL,
0 xddcbcb0bcb16c08bULL,
0 xd33e3ef83eedc67cULL,
0 x2d0505140528110aULL,
0 x78676781671fe6ceULL,
0 x97e4e4b7e47353d5ULL,
0 x0227279c2725bb4eULL,
0 x7341411941325882ULL,
0 xa78b8b168b2c9d0bULL,
0 xf6a7a7a6a7510153ULL,
0 xb27d7de97dcf94faULL,
0 x4995956e95dcfb37ULL,
0 x56d8d847d88e9fadULL,
0 x70fbfbcbfb8b30ebULL,
0 xcdeeee9fee2371c1ULL,
0 xbb7c7ced7cc791f8ULL,
0 x716666856617e3ccULL,
0 x7bdddd53dda68ea7ULL,
0 xaf17175c17b84b2eULL,
0 x454747014702468eULL,
0 x1a9e9e429e84dc21ULL,
0 xd4caca0fca1ec589ULL,
0 x582d2db42d75995aULL,
0 x2ebfbfc6bf917963ULL,
0 x3f07071c07381b0eULL,
0 xacadad8ead012347ULL,
0 xb05a5a755aea2fb4ULL,
0 xef838336836cb51bULL,
0 xb63333cc3385ff66ULL,
0 x5c636391633ff2c6ULL,
0 x1202020802100a04ULL,
0 x93aaaa92aa393849ULL,
0 xde7171d971afa8e2ULL,
0 xc6c8c807c80ecf8dULL,
0 xd119196419c87d32ULL,
0 x3b49493949727092ULL,
0 x5fd9d943d9869aafULL,
0 x31f2f2eff2c31df9ULL,
0 xa8e3e3abe34b48dbULL,
0 xb95b5b715be22ab6ULL,
0 xbc88881a8834920dULL,
0 x3e9a9a529aa4c829ULL,
0 x0b262698262dbe4cULL,
0 xbf3232c8328dfa64ULL,
0 x59b0b0fab0e94a7dULL,
0 xf2e9e983e91b6acfULL,
0 x770f0f3c0f78331eULL,
0 x33d5d573d5e6a6b7ULL,
0 xf480803a8074ba1dULL,
0 x27bebec2be997c61ULL,
0 xebcdcd13cd26de87ULL,
0 x893434d034bde468ULL,
0 x3248483d487a7590ULL,
0 x54ffffdbffab24e3ULL,
0 x8d7a7af57af78ff4ULL,
0 x6490907a90f4ea3dULL,
0 x9d5f5f615fc23ebeULL,
0 x3d202080201da040ULL,
0 x0f6868bd6867d5d0ULL,
0 xca1a1a681ad07234ULL,
0 xb7aeae82ae192c41ULL,
0 x7db4b4eab4c95e75ULL,
0 xce54544d549a19a8ULL,
0 x7f93937693ece53bULL,
0 x2f222288220daa44ULL,
0 x6364648d6407e9c8ULL,
0 x2af1f1e3f1db12ffULL,
0 xcc7373d173bfa2e6ULL,
0 x8212124812905a24ULL,
0 x7a40401d403a5d80ULL,
0 x4808082008402810ULL,
0 x95c3c32bc356e89bULL,
0 xdfecec97ec337bc5ULL,
0 x4ddbdb4bdb9690abULL,
0 xc0a1a1bea1611f5fULL,
0 x918d8d0e8d1c8307ULL,
0 xc83d3df43df5c97aULL,
0 x5b97976697ccf133ULL,
0 x0000000000000000ULL,
0 xf9cfcf1bcf36d483ULL,
0 x6e2b2bac2b458756ULL,
0 xe17676c57697b3ecULL,
0 xe68282328264b019ULL,
0 x28d6d67fd6fea9b1ULL,
0 xc31b1b6c1bd87736ULL,
0 x74b5b5eeb5c15b77ULL,
0 xbeafaf86af112943ULL,
0 x1d6a6ab56a77dfd4ULL,
0 xea50505d50ba0da0ULL,
0 x5745450945124c8aULL,
0 x38f3f3ebf3cb18fbULL,
0 xad3030c0309df060ULL,
0 xc4efef9bef2b74c3ULL,
0 xda3f3ffc3fe5c37eULL,
0 xc755554955921caaULL,
0 xdba2a2b2a2791059ULL,
0 xe9eaea8fea0365c9ULL,
0 x6a656589650feccaULL,
0 x03babad2bab96869ULL,
0 x4a2f2fbc2f65935eULL,
0 x8ec0c027c04ee79dULL,
0 x60dede5fdebe81a1ULL,
0 xfc1c1c701ce06c38ULL,
0 x46fdfdd3fdbb2ee7ULL,
0 x1f4d4d294d52649aULL,
0 x7692927292e4e039ULL,
0 xfa7575c9758fbceaULL,
0 x3606061806301e0cULL,
0 xae8a8a128a249809ULL,
0 x4bb2b2f2b2f94079ULL,
0 x85e6e6bfe66359d1ULL,
0 x7e0e0e380e70361cULL,
0 xe71f1f7c1ff8633eULL,
0 x556262956237f7c4ULL,
0 x3ad4d477d4eea3b5ULL,
0 x81a8a89aa829324dULL,
0 x5296966296c4f431ULL,
0 x62f9f9c3f99b3aefULL,
0 xa3c5c533c566f697ULL,
0 x102525942535b14aULL,
0 xab59597959f220b2ULL,
0 xd084842a8454ae15ULL,
0 xc57272d572b7a7e4ULL,
0 xec3939e439d5dd72ULL,
0 x164c4c2d4c5a6198ULL,
0 x945e5e655eca3bbcULL,
0 x9f7878fd78e785f0ULL,
0 xe53838e038ddd870ULL,
0 x988c8c0a8c148605ULL,
0 x17d1d163d1c6b2bfULL,
0 xe4a5a5aea5410b57ULL,
0 xa1e2e2afe2434dd9ULL,
0 x4e616199612ff8c2ULL,
0 x42b3b3f6b3f1457bULL,
0 x342121842115a542ULL,
0 x089c9c4a9c94d625ULL,
0 xee1e1e781ef0663cULL,
0 x6143431143225286ULL,
0 xb1c7c73bc776fc93ULL,
0 x4ffcfcd7fcb32be5ULL,
0 x2404041004201408ULL,
0 xe351515951b208a2ULL,
0 x2599995e99bcc72fULL,
0 x226d6da96d4fc4daULL,
0 x650d0d340d68391aULL,
0 x79fafacffa8335e9ULL,
0 x69dfdf5bdfb684a3ULL,
0 xa97e7ee57ed79bfcULL,
0 x19242490243db448ULL,
0 xfe3b3bec3bc5d776ULL,
0 x9aabab96ab313d4bULL,
0 xf0cece1fce3ed181ULL,
0 x9911114411885522ULL,
0 x838f8f068f0c8903ULL,
0 x044e4e254e4a6b9cULL,
0 x66b7b7e6b7d15173ULL,
0 xe0ebeb8beb0b60cbULL,
0 xc13c3cf03cfdcc78ULL,
0 xfd81813e817cbf1fULL,
0 x4094946a94d4fe35ULL,
0 x1cf7f7fbf7eb0cf3ULL,
0 x18b9b9deb9a1676fULL,
0 x8b13134c13985f26ULL,
0 x512c2cb02c7d9c58ULL,
0 x05d3d36bd3d6b8bbULL,
0 x8ce7e7bbe76b5cd3ULL,
0 x396e6ea56e57cbdcULL,
0 xaac4c437c46ef395ULL,
0 x1b03030c03180f06ULL,
0 xdc565645568a13acULL,
0 x5e44440d441a4988ULL,
0 xa07f7fe17fdf9efeULL,
0 x88a9a99ea921374fULL,
0 x672a2aa82a4d8254ULL,
0 x0abbbbd6bbb16d6bULL,
0 x87c1c123c146e29fULL,
0 xf153535153a202a6ULL,
0 x72dcdc57dcae8ba5ULL,
0 x530b0b2c0b582716ULL,
0 x019d9d4e9d9cd327ULL,
0 x2b6c6cad6c47c1d8ULL,
0 xa43131c43195f562ULL,
0 xf37474cd7487b9e8ULL,
0 x15f6f6fff6e309f1ULL,
0 x4c464605460a438cULL,
0 xa5acac8aac092645ULL,
0 xb589891e893c970fULL,
0 xb414145014a04428ULL,
0 xbae1e1a3e15b42dfULL,
0 xa616165816b04e2cULL,
0 xf73a3ae83acdd274ULL,
0 x066969b9696fd0d2ULL,
0 x4109092409482d12ULL,
0 xd77070dd70a7ade0ULL,
0 x6fb6b6e2b6d95471ULL,
0 x1ed0d067d0ceb7bdULL,
0 xd6eded93ed3b7ec7ULL,
0 xe2cccc17cc2edb85ULL,
0 x68424215422a5784ULL,
0 x2c98985a98b4c22dULL,
0 xeda4a4aaa4490e55ULL,
0 x752828a0285d8850ULL,
0 x865c5c6d5cda31b8ULL,
0 x6bf8f8c7f8933fedULL,
0 xc28686228644a411ULL,
};
static const u64 C2[
256 ] = {
0 x30d818186018c078ULL,
0 x462623238c2305afULL,
0 x91b8c6c63fc67ef9ULL,
0 xcdfbe8e887e8136fULL,
0 x13cb878726874ca1ULL,
0 x6d11b8b8dab8a962ULL,
0 x0209010104010805ULL,
0 x9e0d4f4f214f426eULL,
0 x6c9b3636d836adeeULL,
0 x51ffa6a6a2a65904ULL,
0 xb90cd2d26fd2debdULL,
0 xf70ef5f5f3f5fb06ULL,
0 xf2967979f979ef80ULL,
0 xde306f6fa16f5fceULL,
0 x3f6d91917e91fcefULL,
0 xa4f852525552aa07ULL,
0 xc04760609d6027fdULL,
0 x6535bcbccabc8976ULL,
0 x2b379b9b569baccdULL,
0 x018a8e8e028e048cULL,
0 x5bd2a3a3b6a37115ULL,
0 x186c0c0c300c603cULL,
0 xf6847b7bf17bff8aULL,
0 x6a803535d435b5e1ULL,
0 x3af51d1d741de869ULL,
0 xddb3e0e0a7e05347ULL,
0 xb321d7d77bd7f6acULL,
0 x999cc2c22fc25eedULL,
0 x5c432e2eb82e6d96ULL,
0 x96294b4b314b627aULL,
0 xe15dfefedffea321ULL,
0 xaed5575741578216ULL,
0 x2abd15155415a841ULL,
0 xeee87777c1779fb6ULL,
0 x6e923737dc37a5ebULL,
0 xd79ee5e5b3e57b56ULL,
0 x23139f9f469f8cd9ULL,
0 xfd23f0f0e7f0d317ULL,
0 x94204a4a354a6a7fULL,
0 xa944dada4fda9e95ULL,
0 xb0a258587d58fa25ULL,
0 x8fcfc9c903c906caULL,
0 x527c2929a429558dULL,
0 x145a0a0a280a5022ULL,
0 x7f50b1b1feb1e14fULL,
0 x5dc9a0a0baa0691aULL,
0 xd6146b6bb16b7fdaULL,
0 x17d985852e855cabULL,
0 x673cbdbdcebd8173ULL,
0 xba8f5d5d695dd234ULL,
0 x2090101040108050ULL,
0 xf507f4f4f7f4f303ULL,
0 x8bddcbcb0bcb16c0ULL,
0 x7cd33e3ef83eedc6ULL,
0 x0a2d050514052811ULL,
0 xce78676781671fe6ULL,
0 xd597e4e4b7e47353ULL,
0 x4e0227279c2725bbULL,
0 x8273414119413258ULL,
0 x0ba78b8b168b2c9dULL,
0 x53f6a7a7a6a75101ULL,
0 xfab27d7de97dcf94ULL,
0 x374995956e95dcfbULL,
0 xad56d8d847d88e9fULL,
0 xeb70fbfbcbfb8b30ULL,
0 xc1cdeeee9fee2371ULL,
0 xf8bb7c7ced7cc791ULL,
0 xcc716666856617e3ULL,
0 xa77bdddd53dda68eULL,
0 x2eaf17175c17b84bULL,
0 x8e45474701470246ULL,
0 x211a9e9e429e84dcULL,
0 x89d4caca0fca1ec5ULL,
0 x5a582d2db42d7599ULL,
0 x632ebfbfc6bf9179ULL,
0 x0e3f07071c07381bULL,
0 x47acadad8ead0123ULL,
0 xb4b05a5a755aea2fULL,
0 x1bef838336836cb5ULL,
0 x66b63333cc3385ffULL,
0 xc65c636391633ff2ULL,
0 x041202020802100aULL,
0 x4993aaaa92aa3938ULL,
0 xe2de7171d971afa8ULL,
0 x8dc6c8c807c80ecfULL,
0 x32d119196419c87dULL,
0 x923b494939497270ULL,
0 xaf5fd9d943d9869aULL,
0 xf931f2f2eff2c31dULL,
0 xdba8e3e3abe34b48ULL,
0 xb6b95b5b715be22aULL,
0 x0dbc88881a883492ULL,
0 x293e9a9a529aa4c8ULL,
0 x4c0b262698262dbeULL,
0 x64bf3232c8328dfaULL,
0 x7d59b0b0fab0e94aULL,
0 xcff2e9e983e91b6aULL,
0 x1e770f0f3c0f7833ULL,
0 xb733d5d573d5e6a6ULL,
0 x1df480803a8074baULL,
0 x6127bebec2be997cULL,
0 x87ebcdcd13cd26deULL,
0 x68893434d034bde4ULL,
0 x903248483d487a75ULL,
0 xe354ffffdbffab24ULL,
0 xf48d7a7af57af78fULL,
0 x3d6490907a90f4eaULL,
0 xbe9d5f5f615fc23eULL,
0 x403d202080201da0ULL,
0 xd00f6868bd6867d5ULL,
0 x34ca1a1a681ad072ULL,
0 x41b7aeae82ae192cULL,
0 x757db4b4eab4c95eULL,
0 xa8ce54544d549a19ULL,
0 x3b7f93937693ece5ULL,
0 x442f222288220daaULL,
0 xc86364648d6407e9ULL,
0 xff2af1f1e3f1db12ULL,
0 xe6cc7373d173bfa2ULL,
0 x248212124812905aULL,
0 x807a40401d403a5dULL,
0 x1048080820084028ULL,
0 x9b95c3c32bc356e8ULL,
0 xc5dfecec97ec337bULL,
0 xab4ddbdb4bdb9690ULL,
0 x5fc0a1a1bea1611fULL,
0 x07918d8d0e8d1c83ULL,
0 x7ac83d3df43df5c9ULL,
0 x335b97976697ccf1ULL,
0 x0000000000000000ULL,
0 x83f9cfcf1bcf36d4ULL,
0 x566e2b2bac2b4587ULL,
0 xece17676c57697b3ULL,
0 x19e68282328264b0ULL,
0 xb128d6d67fd6fea9ULL,
0 x36c31b1b6c1bd877ULL,
0 x7774b5b5eeb5c15bULL,
0 x43beafaf86af1129ULL,
0 xd41d6a6ab56a77dfULL,
0 xa0ea50505d50ba0dULL,
0 x8a5745450945124cULL,
0 xfb38f3f3ebf3cb18ULL,
0 x60ad3030c0309df0ULL,
0 xc3c4efef9bef2b74ULL,
0 x7eda3f3ffc3fe5c3ULL,
0 xaac755554955921cULL,
0 x59dba2a2b2a27910ULL,
0 xc9e9eaea8fea0365ULL,
0 xca6a656589650fecULL,
0 x6903babad2bab968ULL,
0 x5e4a2f2fbc2f6593ULL,
0 x9d8ec0c027c04ee7ULL,
0 xa160dede5fdebe81ULL,
0 x38fc1c1c701ce06cULL,
0 xe746fdfdd3fdbb2eULL,
0 x9a1f4d4d294d5264ULL,
0 x397692927292e4e0ULL,
0 xeafa7575c9758fbcULL,
0 x0c3606061806301eULL,
0 x09ae8a8a128a2498ULL,
0 x794bb2b2f2b2f940ULL,
0 xd185e6e6bfe66359ULL,
0 x1c7e0e0e380e7036ULL,
0 x3ee71f1f7c1ff863ULL,
0 xc4556262956237f7ULL,
0 xb53ad4d477d4eea3ULL,
0 x4d81a8a89aa82932ULL,
0 x315296966296c4f4ULL,
0 xef62f9f9c3f99b3aULL,
0 x97a3c5c533c566f6ULL,
0 x4a102525942535b1ULL,
0 xb2ab59597959f220ULL,
0 x15d084842a8454aeULL,
0 xe4c57272d572b7a7ULL,
0 x72ec3939e439d5ddULL,
0 x98164c4c2d4c5a61ULL,
0 xbc945e5e655eca3bULL,
0 xf09f7878fd78e785ULL,
0 x70e53838e038ddd8ULL,
0 x05988c8c0a8c1486ULL,
0 xbf17d1d163d1c6b2ULL,
0 x57e4a5a5aea5410bULL,
0 xd9a1e2e2afe2434dULL,
0 xc24e616199612ff8ULL,
0 x7b42b3b3f6b3f145ULL,
0 x42342121842115a5ULL,
0 x25089c9c4a9c94d6ULL,
0 x3cee1e1e781ef066ULL,
0 x8661434311432252ULL,
0 x93b1c7c73bc776fcULL,
0 xe54ffcfcd7fcb32bULL,
0 x0824040410042014ULL,
0 xa2e351515951b208ULL,
0 x2f2599995e99bcc7ULL,
0 xda226d6da96d4fc4ULL,
0 x1a650d0d340d6839ULL,
0 xe979fafacffa8335ULL,
0 xa369dfdf5bdfb684ULL,
0 xfca97e7ee57ed79bULL,
0 x4819242490243db4ULL,
0 x76fe3b3bec3bc5d7ULL,
0 x4b9aabab96ab313dULL,
0 x81f0cece1fce3ed1ULL,
0 x2299111144118855ULL,
0 x03838f8f068f0c89ULL,
0 x9c044e4e254e4a6bULL,
0 x7366b7b7e6b7d151ULL,
0 xcbe0ebeb8beb0b60ULL,
0 x78c13c3cf03cfdccULL,
0 x1ffd81813e817cbfULL,
0 x354094946a94d4feULL,
0 xf31cf7f7fbf7eb0cULL,
0 x6f18b9b9deb9a167ULL,
0 x268b13134c13985fULL,
0 x58512c2cb02c7d9cULL,
0 xbb05d3d36bd3d6b8ULL,
0 xd38ce7e7bbe76b5cULL,
0 xdc396e6ea56e57cbULL,
0 x95aac4c437c46ef3ULL,
0 x061b03030c03180fULL,
0 xacdc565645568a13ULL,
0 x885e44440d441a49ULL,
0 xfea07f7fe17fdf9eULL,
0 x4f88a9a99ea92137ULL,
0 x54672a2aa82a4d82ULL,
0 x6b0abbbbd6bbb16dULL,
0 x9f87c1c123c146e2ULL,
0 xa6f153535153a202ULL,
0 xa572dcdc57dcae8bULL,
0 x16530b0b2c0b5827ULL,
0 x27019d9d4e9d9cd3ULL,
0 xd82b6c6cad6c47c1ULL,
0 x62a43131c43195f5ULL,
0 xe8f37474cd7487b9ULL,
0 xf115f6f6fff6e309ULL,
0 x8c4c464605460a43ULL,
0 x45a5acac8aac0926ULL,
0 x0fb589891e893c97ULL,
0 x28b414145014a044ULL,
0 xdfbae1e1a3e15b42ULL,
0 x2ca616165816b04eULL,
0 x74f73a3ae83acdd2ULL,
0 xd2066969b9696fd0ULL,
0 x124109092409482dULL,
0 xe0d77070dd70a7adULL,
0 x716fb6b6e2b6d954ULL,
0 xbd1ed0d067d0ceb7ULL,
0 xc7d6eded93ed3b7eULL,
0 x85e2cccc17cc2edbULL,
0 x8468424215422a57ULL,
0 x2d2c98985a98b4c2ULL,
0 x55eda4a4aaa4490eULL,
0 x50752828a0285d88ULL,
0 xb8865c5c6d5cda31ULL,
0 xed6bf8f8c7f8933fULL,
0 x11c28686228644a4ULL,
};
static const u64 C3[
256 ] = {
0 x7830d818186018c0ULL,
0 xaf462623238c2305ULL,
0 xf991b8c6c63fc67eULL,
0 x6fcdfbe8e887e813ULL,
0 xa113cb878726874cULL,
0 x626d11b8b8dab8a9ULL,
0 x0502090101040108ULL,
0 x6e9e0d4f4f214f42ULL,
0 xee6c9b3636d836adULL,
0 x0451ffa6a6a2a659ULL,
0 xbdb90cd2d26fd2deULL,
0 x06f70ef5f5f3f5fbULL,
0 x80f2967979f979efULL,
0 xcede306f6fa16f5fULL,
0 xef3f6d91917e91fcULL,
0 x07a4f852525552aaULL,
0 xfdc04760609d6027ULL,
0 x766535bcbccabc89ULL,
0 xcd2b379b9b569bacULL,
0 x8c018a8e8e028e04ULL,
0 x155bd2a3a3b6a371ULL,
0 x3c186c0c0c300c60ULL,
0 x8af6847b7bf17bffULL,
0 xe16a803535d435b5ULL,
0 x693af51d1d741de8ULL,
0 x47ddb3e0e0a7e053ULL,
0 xacb321d7d77bd7f6ULL,
0 xed999cc2c22fc25eULL,
0 x965c432e2eb82e6dULL,
0 x7a96294b4b314b62ULL,
0 x21e15dfefedffea3ULL,
0 x16aed55757415782ULL,
0 x412abd15155415a8ULL,
0 xb6eee87777c1779fULL,
0 xeb6e923737dc37a5ULL,
0 x56d79ee5e5b3e57bULL,
0 xd923139f9f469f8cULL,
0 x17fd23f0f0e7f0d3ULL,
0 x7f94204a4a354a6aULL,
0 x95a944dada4fda9eULL,
0 x25b0a258587d58faULL,
0 xca8fcfc9c903c906ULL,
0 x8d527c2929a42955ULL,
0 x22145a0a0a280a50ULL,
0 x4f7f50b1b1feb1e1ULL,
0 x1a5dc9a0a0baa069ULL,
0 xdad6146b6bb16b7fULL,
0 xab17d985852e855cULL,
0 x73673cbdbdcebd81ULL,
0 x34ba8f5d5d695dd2ULL,
0 x5020901010401080ULL,
0 x03f507f4f4f7f4f3ULL,
0 xc08bddcbcb0bcb16ULL,
0 xc67cd33e3ef83eedULL,
0 x110a2d0505140528ULL,
0 xe6ce78676781671fULL,
0 x53d597e4e4b7e473ULL,
0 xbb4e0227279c2725ULL,
0 x5882734141194132ULL,
0 x9d0ba78b8b168b2cULL,
0 x0153f6a7a7a6a751ULL,
0 x94fab27d7de97dcfULL,
0 xfb374995956e95dcULL,
0 x9fad56d8d847d88eULL,
0 x30eb70fbfbcbfb8bULL,
0 x71c1cdeeee9fee23ULL,
0 x91f8bb7c7ced7cc7ULL,
0 xe3cc716666856617ULL,
0 x8ea77bdddd53dda6ULL,
0 x4b2eaf17175c17b8ULL,
0 x468e454747014702ULL,
0 xdc211a9e9e429e84ULL,
0 xc589d4caca0fca1eULL,
0 x995a582d2db42d75ULL,
0 x79632ebfbfc6bf91ULL,
0 x1b0e3f07071c0738ULL,
0 x2347acadad8ead01ULL,
0 x2fb4b05a5a755aeaULL,
0 xb51bef838336836cULL,
0 xff66b63333cc3385ULL,
0 xf2c65c636391633fULL,
0 x0a04120202080210ULL,
0 x384993aaaa92aa39ULL,
0 xa8e2de7171d971afULL,
0 xcf8dc6c8c807c80eULL,
0 x7d32d119196419c8ULL,
0 x70923b4949394972ULL,
0 x9aaf5fd9d943d986ULL,
0 x1df931f2f2eff2c3ULL,
0 x48dba8e3e3abe34bULL,
0 x2ab6b95b5b715be2ULL,
0 x920dbc88881a8834ULL,
0 xc8293e9a9a529aa4ULL,
0 xbe4c0b262698262dULL,
0 xfa64bf3232c8328dULL,
0 x4a7d59b0b0fab0e9ULL,
0 x6acff2e9e983e91bULL,
0 x331e770f0f3c0f78ULL,
0 xa6b733d5d573d5e6ULL,
0 xba1df480803a8074ULL,
0 x7c6127bebec2be99ULL,
0 xde87ebcdcd13cd26ULL,
0 xe468893434d034bdULL,
0 x75903248483d487aULL,
0 x24e354ffffdbffabULL,
0 x8ff48d7a7af57af7ULL,
0 xea3d6490907a90f4ULL,
0 x3ebe9d5f5f615fc2ULL,
0 xa0403d202080201dULL,
0 xd5d00f6868bd6867ULL,
0 x7234ca1a1a681ad0ULL,
0 x2c41b7aeae82ae19ULL,
0 x5e757db4b4eab4c9ULL,
0 x19a8ce54544d549aULL,
0 xe53b7f93937693ecULL,
0 xaa442f222288220dULL,
0 xe9c86364648d6407ULL,
0 x12ff2af1f1e3f1dbULL,
0 xa2e6cc7373d173bfULL,
0 x5a24821212481290ULL,
0 x5d807a40401d403aULL,
0 x2810480808200840ULL,
0 xe89b95c3c32bc356ULL,
0 x7bc5dfecec97ec33ULL,
0 x90ab4ddbdb4bdb96ULL,
0 x1f5fc0a1a1bea161ULL,
0 x8307918d8d0e8d1cULL,
0 xc97ac83d3df43df5ULL,
0 xf1335b97976697ccULL,
0 x0000000000000000ULL,
0 xd483f9cfcf1bcf36ULL,
0 x87566e2b2bac2b45ULL,
0 xb3ece17676c57697ULL,
0 xb019e68282328264ULL,
0 xa9b128d6d67fd6feULL,
0 x7736c31b1b6c1bd8ULL,
0 x5b7774b5b5eeb5c1ULL,
0 x2943beafaf86af11ULL,
0 xdfd41d6a6ab56a77ULL,
0 x0da0ea50505d50baULL,
0 x4c8a574545094512ULL,
0 x18fb38f3f3ebf3cbULL,
0 xf060ad3030c0309dULL,
0 x74c3c4efef9bef2bULL,
0 xc37eda3f3ffc3fe5ULL,
0 x1caac75555495592ULL,
0 x1059dba2a2b2a279ULL,
0 x65c9e9eaea8fea03ULL,
0 xecca6a656589650fULL,
0 x686903babad2bab9ULL,
0 x935e4a2f2fbc2f65ULL,
0 xe79d8ec0c027c04eULL,
0 x81a160dede5fdebeULL,
0 x6c38fc1c1c701ce0ULL,
0 x2ee746fdfdd3fdbbULL,
0 x649a1f4d4d294d52ULL,
0 xe0397692927292e4ULL,
0 xbceafa7575c9758fULL,
0 x1e0c360606180630ULL,
0 x9809ae8a8a128a24ULL,
0 x40794bb2b2f2b2f9ULL,
0 x59d185e6e6bfe663ULL,
0 x361c7e0e0e380e70ULL,
0 x633ee71f1f7c1ff8ULL,
0 xf7c4556262956237ULL,
0 xa3b53ad4d477d4eeULL,
0 x324d81a8a89aa829ULL,
0 xf4315296966296c4ULL,
0 x3aef62f9f9c3f99bULL,
0 xf697a3c5c533c566ULL,
0 xb14a102525942535ULL,
0 x20b2ab59597959f2ULL,
0 xae15d084842a8454ULL,
0 xa7e4c57272d572b7ULL,
0 xdd72ec3939e439d5ULL,
0 x6198164c4c2d4c5aULL,
0 x3bbc945e5e655ecaULL,
0 x85f09f7878fd78e7ULL,
0 xd870e53838e038ddULL,
0 x8605988c8c0a8c14ULL,
0 xb2bf17d1d163d1c6ULL,
0 x0b57e4a5a5aea541ULL,
0 x4dd9a1e2e2afe243ULL,
0 xf8c24e616199612fULL,
0 x457b42b3b3f6b3f1ULL,
0 xa542342121842115ULL,
0 xd625089c9c4a9c94ULL,
0 x663cee1e1e781ef0ULL,
0 x5286614343114322ULL,
0 xfc93b1c7c73bc776ULL,
0 x2be54ffcfcd7fcb3ULL,
0 x1408240404100420ULL,
0 x08a2e351515951b2ULL,
0 xc72f2599995e99bcULL,
0 xc4da226d6da96d4fULL,
0 x391a650d0d340d68ULL,
0 x35e979fafacffa83ULL,
0 x84a369dfdf5bdfb6ULL,
0 x9bfca97e7ee57ed7ULL,
0 xb44819242490243dULL,
0 xd776fe3b3bec3bc5ULL,
0 x3d4b9aabab96ab31ULL,
0 xd181f0cece1fce3eULL,
0 x5522991111441188ULL,
0 x8903838f8f068f0cULL,
0 x6b9c044e4e254e4aULL,
0 x517366b7b7e6b7d1ULL,
0 x60cbe0ebeb8beb0bULL,
0 xcc78c13c3cf03cfdULL,
0 xbf1ffd81813e817cULL,
0 xfe354094946a94d4ULL,
0 x0cf31cf7f7fbf7ebULL,
0 x676f18b9b9deb9a1ULL,
0 x5f268b13134c1398ULL,
0 x9c58512c2cb02c7dULL,
0 xb8bb05d3d36bd3d6ULL,
0 x5cd38ce7e7bbe76bULL,
0 xcbdc396e6ea56e57ULL,
0 xf395aac4c437c46eULL,
0 x0f061b03030c0318ULL,
0 x13acdc565645568aULL,
0 x49885e44440d441aULL,
0 x9efea07f7fe17fdfULL,
0 x374f88a9a99ea921ULL,
0 x8254672a2aa82a4dULL,
0 x6d6b0abbbbd6bbb1ULL,
0 xe29f87c1c123c146ULL,
0 x02a6f153535153a2ULL,
0 x8ba572dcdc57dcaeULL,
0 x2716530b0b2c0b58ULL,
0 xd327019d9d4e9d9cULL,
0 xc1d82b6c6cad6c47ULL,
0 xf562a43131c43195ULL,
0 xb9e8f37474cd7487ULL,
0 x09f115f6f6fff6e3ULL,
0 x438c4c464605460aULL,
0 x2645a5acac8aac09ULL,
0 x970fb589891e893cULL,
0 x4428b414145014a0ULL,
0 x42dfbae1e1a3e15bULL,
0 x4e2ca616165816b0ULL,
0 xd274f73a3ae83acdULL,
0 xd0d2066969b9696fULL,
0 x2d12410909240948ULL,
0 xade0d77070dd70a7ULL,
0 x54716fb6b6e2b6d9ULL,
0 xb7bd1ed0d067d0ceULL,
0 x7ec7d6eded93ed3bULL,
0 xdb85e2cccc17cc2eULL,
0 x578468424215422aULL,
0 xc22d2c98985a98b4ULL,
0 x0e55eda4a4aaa449ULL,
0 x8850752828a0285dULL,
0 x31b8865c5c6d5cdaULL,
0 x3fed6bf8f8c7f893ULL,
0 xa411c28686228644ULL,
};
static const u64 C4[
256 ] = {
0 xc07830d818186018ULL,
0 x05af462623238c23ULL,
0 x7ef991b8c6c63fc6ULL,
0 x136fcdfbe8e887e8ULL,
0 x4ca113cb87872687ULL,
0 xa9626d11b8b8dab8ULL,
0 x0805020901010401ULL,
0 x426e9e0d4f4f214fULL,
0 xadee6c9b3636d836ULL,
0 x590451ffa6a6a2a6ULL,
0 xdebdb90cd2d26fd2ULL,
0 xfb06f70ef5f5f3f5ULL,
0 xef80f2967979f979ULL,
0 x5fcede306f6fa16fULL,
0 xfcef3f6d91917e91ULL,
0 xaa07a4f852525552ULL,
0 x27fdc04760609d60ULL,
0 x89766535bcbccabcULL,
0 xaccd2b379b9b569bULL,
0 x048c018a8e8e028eULL,
0 x71155bd2a3a3b6a3ULL,
0 x603c186c0c0c300cULL,
0 xff8af6847b7bf17bULL,
0 xb5e16a803535d435ULL,
0 xe8693af51d1d741dULL,
0 x5347ddb3e0e0a7e0ULL,
0 xf6acb321d7d77bd7ULL,
0 x5eed999cc2c22fc2ULL,
0 x6d965c432e2eb82eULL,
0 x627a96294b4b314bULL,
0 xa321e15dfefedffeULL,
0 x8216aed557574157ULL,
0 xa8412abd15155415ULL,
0 x9fb6eee87777c177ULL,
0 xa5eb6e923737dc37ULL,
0 x7b56d79ee5e5b3e5ULL,
0 x8cd923139f9f469fULL,
0 xd317fd23f0f0e7f0ULL,
0 x6a7f94204a4a354aULL,
0 x9e95a944dada4fdaULL,
0 xfa25b0a258587d58ULL,
0 x06ca8fcfc9c903c9ULL,
0 x558d527c2929a429ULL,
0 x5022145a0a0a280aULL,
0 xe14f7f50b1b1feb1ULL,
0 x691a5dc9a0a0baa0ULL,
0 x7fdad6146b6bb16bULL,
0 x5cab17d985852e85ULL,
0 x8173673cbdbdcebdULL,
0 xd234ba8f5d5d695dULL,
0 x8050209010104010ULL,
0 xf303f507f4f4f7f4ULL,
0 x16c08bddcbcb0bcbULL,
0 xedc67cd33e3ef83eULL,
0 x28110a2d05051405ULL,
0 x1fe6ce7867678167ULL,
0 x7353d597e4e4b7e4ULL,
0 x25bb4e0227279c27ULL,
0 x3258827341411941ULL,
0 x2c9d0ba78b8b168bULL,
0 x510153f6a7a7a6a7ULL,
0 xcf94fab27d7de97dULL,
0 xdcfb374995956e95ULL,
0 x8e9fad56d8d847d8ULL,
0 x8b30eb70fbfbcbfbULL,
0 x2371c1cdeeee9feeULL,
0 xc791f8bb7c7ced7cULL,
0 x17e3cc7166668566ULL,
0 xa68ea77bdddd53ddULL,
0 xb84b2eaf17175c17ULL,
0 x02468e4547470147ULL,
0 x84dc211a9e9e429eULL,
0 x1ec589d4caca0fcaULL,
0 x75995a582d2db42dULL,
0 x9179632ebfbfc6bfULL,
0 x381b0e3f07071c07ULL,
0 x012347acadad8eadULL,
0 xea2fb4b05a5a755aULL,
0 x6cb51bef83833683ULL,
0 x85ff66b63333cc33ULL,
0 x3ff2c65c63639163ULL,
0 x100a041202020802ULL,
0 x39384993aaaa92aaULL,
0 xafa8e2de7171d971ULL,
0 x0ecf8dc6c8c807c8ULL,
0 xc87d32d119196419ULL,
0 x7270923b49493949ULL,
0 x869aaf5fd9d943d9ULL,
0 xc31df931f2f2eff2ULL,
0 x4b48dba8e3e3abe3ULL,
0 xe22ab6b95b5b715bULL,
0 x34920dbc88881a88ULL,
0 xa4c8293e9a9a529aULL,
0 x2dbe4c0b26269826ULL,
0 x8dfa64bf3232c832ULL,
0 xe94a7d59b0b0fab0ULL,
0 x1b6acff2e9e983e9ULL,
0 x78331e770f0f3c0fULL,
0 xe6a6b733d5d573d5ULL,
0 x74ba1df480803a80ULL,
0 x997c6127bebec2beULL,
0 x26de87ebcdcd13cdULL,
0 xbde468893434d034ULL,
0 x7a75903248483d48ULL,
0 xab24e354ffffdbffULL,
0 xf78ff48d7a7af57aULL,
0 xf4ea3d6490907a90ULL,
0 xc23ebe9d5f5f615fULL,
0 x1da0403d20208020ULL,
0 x67d5d00f6868bd68ULL,
0 xd07234ca1a1a681aULL,
0 x192c41b7aeae82aeULL,
0 xc95e757db4b4eab4ULL,
0 x9a19a8ce54544d54ULL,
0 xece53b7f93937693ULL,
0 x0daa442f22228822ULL,
0 x07e9c86364648d64ULL,
0 xdb12ff2af1f1e3f1ULL,
0 xbfa2e6cc7373d173ULL,
0 x905a248212124812ULL,
0 x3a5d807a40401d40ULL,
0 x4028104808082008ULL,
0 x56e89b95c3c32bc3ULL,
0 x337bc5dfecec97ecULL,
0 x9690ab4ddbdb4bdbULL,
0 x611f5fc0a1a1bea1ULL,
0 x1c8307918d8d0e8dULL,
0 xf5c97ac83d3df43dULL,
0 xccf1335b97976697ULL,
0 x0000000000000000ULL,
0 x36d483f9cfcf1bcfULL,
0 x4587566e2b2bac2bULL,
0 x97b3ece17676c576ULL,
0 x64b019e682823282ULL,
0 xfea9b128d6d67fd6ULL,
0 xd87736c31b1b6c1bULL,
0 xc15b7774b5b5eeb5ULL,
0 x112943beafaf86afULL,
0 x77dfd41d6a6ab56aULL,
0 xba0da0ea50505d50ULL,
0 x124c8a5745450945ULL,
0 xcb18fb38f3f3ebf3ULL,
0 x9df060ad3030c030ULL,
0 x2b74c3c4efef9befULL,
0 xe5c37eda3f3ffc3fULL,
0 x921caac755554955ULL,
0 x791059dba2a2b2a2ULL,
0 x0365c9e9eaea8feaULL,
0 x0fecca6a65658965ULL,
0 xb9686903babad2baULL,
0 x65935e4a2f2fbc2fULL,
0 x4ee79d8ec0c027c0ULL,
0 xbe81a160dede5fdeULL,
0 xe06c38fc1c1c701cULL,
0 xbb2ee746fdfdd3fdULL,
0 x52649a1f4d4d294dULL,
0 xe4e0397692927292ULL,
0 x8fbceafa7575c975ULL,
0 x301e0c3606061806ULL,
0 x249809ae8a8a128aULL,
0 xf940794bb2b2f2b2ULL,
0 x6359d185e6e6bfe6ULL,
0 x70361c7e0e0e380eULL,
0 xf8633ee71f1f7c1fULL,
0 x37f7c45562629562ULL,
0 xeea3b53ad4d477d4ULL,
0 x29324d81a8a89aa8ULL,
0 xc4f4315296966296ULL,
0 x9b3aef62f9f9c3f9ULL,
0 x66f697a3c5c533c5ULL,
0 x35b14a1025259425ULL,
0 xf220b2ab59597959ULL,
0 x54ae15d084842a84ULL,
0 xb7a7e4c57272d572ULL,
0 xd5dd72ec3939e439ULL,
0 x5a6198164c4c2d4cULL,
0 xca3bbc945e5e655eULL,
0 xe785f09f7878fd78ULL,
0 xddd870e53838e038ULL,
0 x148605988c8c0a8cULL,
0 xc6b2bf17d1d163d1ULL,
0 x410b57e4a5a5aea5ULL,
0 x434dd9a1e2e2afe2ULL,
0 x2ff8c24e61619961ULL,
0 xf1457b42b3b3f6b3ULL,
0 x15a5423421218421ULL,
0 x94d625089c9c4a9cULL,
0 xf0663cee1e1e781eULL,
0 x2252866143431143ULL,
0 x76fc93b1c7c73bc7ULL,
0 xb32be54ffcfcd7fcULL,
0 x2014082404041004ULL,
0 xb208a2e351515951ULL,
0 xbcc72f2599995e99ULL,
0 x4fc4da226d6da96dULL,
0 x68391a650d0d340dULL,
0 x8335e979fafacffaULL,
0 xb684a369dfdf5bdfULL,
0 xd79bfca97e7ee57eULL,
0 x3db4481924249024ULL,
0 xc5d776fe3b3bec3bULL,
0 x313d4b9aabab96abULL,
0 x3ed181f0cece1fceULL,
0 x8855229911114411ULL,
0 x0c8903838f8f068fULL,
0 x4a6b9c044e4e254eULL,
0 xd1517366b7b7e6b7ULL,
0 x0b60cbe0ebeb8bebULL,
0 xfdcc78c13c3cf03cULL,
0 x7cbf1ffd81813e81ULL,
0 xd4fe354094946a94ULL,
0 xeb0cf31cf7f7fbf7ULL,
0 xa1676f18b9b9deb9ULL,
0 x985f268b13134c13ULL,
0 x7d9c58512c2cb02cULL,
0 xd6b8bb05d3d36bd3ULL,
0 x6b5cd38ce7e7bbe7ULL,
0 x57cbdc396e6ea56eULL,
0 x6ef395aac4c437c4ULL,
0 x180f061b03030c03ULL,
0 x8a13acdc56564556ULL,
0 x1a49885e44440d44ULL,
0 xdf9efea07f7fe17fULL,
0 x21374f88a9a99ea9ULL,
0 x4d8254672a2aa82aULL,
0 xb16d6b0abbbbd6bbULL,
0 x46e29f87c1c123c1ULL,
0 xa202a6f153535153ULL,
0 xae8ba572dcdc57dcULL,
0 x582716530b0b2c0bULL,
0 x9cd327019d9d4e9dULL,
0 x47c1d82b6c6cad6cULL,
0 x95f562a43131c431ULL,
0 x87b9e8f37474cd74ULL,
0 xe309f115f6f6fff6ULL,
0 x0a438c4c46460546ULL,
0 x092645a5acac8aacULL,
0 x3c970fb589891e89ULL,
0 xa04428b414145014ULL,
0 x5b42dfbae1e1a3e1ULL,
0 xb04e2ca616165816ULL,
0 xcdd274f73a3ae83aULL,
0 x6fd0d2066969b969ULL,
0 x482d124109092409ULL,
0 xa7ade0d77070dd70ULL,
0 xd954716fb6b6e2b6ULL,
0 xceb7bd1ed0d067d0ULL,
0 x3b7ec7d6eded93edULL,
0 x2edb85e2cccc17ccULL,
0 x2a57846842421542ULL,
0 xb4c22d2c98985a98ULL,
0 x490e55eda4a4aaa4ULL,
0 x5d8850752828a028ULL,
0 xda31b8865c5c6d5cULL,
0 x933fed6bf8f8c7f8ULL,
0 x44a411c286862286ULL,
};
static const u64 C5[
256 ] = {
0 x18c07830d8181860ULL,
0 x2305af462623238cULL,
0 xc67ef991b8c6c63fULL,
0 xe8136fcdfbe8e887ULL,
0 x874ca113cb878726ULL,
0 xb8a9626d11b8b8daULL,
0 x0108050209010104ULL,
0 x4f426e9e0d4f4f21ULL,
0 x36adee6c9b3636d8ULL,
0 xa6590451ffa6a6a2ULL,
0 xd2debdb90cd2d26fULL,
0 xf5fb06f70ef5f5f3ULL,
0 x79ef80f2967979f9ULL,
0 x6f5fcede306f6fa1ULL,
0 x91fcef3f6d91917eULL,
0 x52aa07a4f8525255ULL,
0 x6027fdc04760609dULL,
0 xbc89766535bcbccaULL,
0 x9baccd2b379b9b56ULL,
0 x8e048c018a8e8e02ULL,
0 xa371155bd2a3a3b6ULL,
0 x0c603c186c0c0c30ULL,
0 x7bff8af6847b7bf1ULL,
0 x35b5e16a803535d4ULL,
0 x1de8693af51d1d74ULL,
0 xe05347ddb3e0e0a7ULL,
0 xd7f6acb321d7d77bULL,
0 xc25eed999cc2c22fULL,
0 x2e6d965c432e2eb8ULL,
0 x4b627a96294b4b31ULL,
0 xfea321e15dfefedfULL,
0 x578216aed5575741ULL,
0 x15a8412abd151554ULL,
0 x779fb6eee87777c1ULL,
0 x37a5eb6e923737dcULL,
0 xe57b56d79ee5e5b3ULL,
0 x9f8cd923139f9f46ULL,
0 xf0d317fd23f0f0e7ULL,
0 x4a6a7f94204a4a35ULL,
0 xda9e95a944dada4fULL,
0 x58fa25b0a258587dULL,
0 xc906ca8fcfc9c903ULL,
0 x29558d527c2929a4ULL,
0 x0a5022145a0a0a28ULL,
0 xb1e14f7f50b1b1feULL,
0 xa0691a5dc9a0a0baULL,
0 x6b7fdad6146b6bb1ULL,
0 x855cab17d985852eULL,
0 xbd8173673cbdbdceULL,
0 x5dd234ba8f5d5d69ULL,
0 x1080502090101040ULL,
0 xf4f303f507f4f4f7ULL,
0 xcb16c08bddcbcb0bULL,
0 x3eedc67cd33e3ef8ULL,
0 x0528110a2d050514ULL,
0 x671fe6ce78676781ULL,
0 xe47353d597e4e4b7ULL,
0 x2725bb4e0227279cULL,
0 x4132588273414119ULL,
0 x8b2c9d0ba78b8b16ULL,
0 xa7510153f6a7a7a6ULL,
0 x7dcf94fab27d7de9ULL,
0 x95dcfb374995956eULL,
0 xd88e9fad56d8d847ULL,
0 xfb8b30eb70fbfbcbULL,
0 xee2371c1cdeeee9fULL,
0 x7cc791f8bb7c7cedULL,
0 x6617e3cc71666685ULL,
0 xdda68ea77bdddd53ULL,
0 x17b84b2eaf17175cULL,
0 x4702468e45474701ULL,
0 x9e84dc211a9e9e42ULL,
0 xca1ec589d4caca0fULL,
0 x2d75995a582d2db4ULL,
0 xbf9179632ebfbfc6ULL,
0 x07381b0e3f07071cULL,
0 xad012347acadad8eULL,
0 x5aea2fb4b05a5a75ULL,
0 x836cb51bef838336ULL,
0 x3385ff66b63333ccULL,
0 x633ff2c65c636391ULL,
0 x02100a0412020208ULL,
0 xaa39384993aaaa92ULL,
0 x71afa8e2de7171d9ULL,
0 xc80ecf8dc6c8c807ULL,
0 x19c87d32d1191964ULL,
0 x497270923b494939ULL,
0 xd9869aaf5fd9d943ULL,
0 xf2c31df931f2f2efULL,
0 xe34b48dba8e3e3abULL,
0 x5be22ab6b95b5b71ULL,
0 x8834920dbc88881aULL,
0 x9aa4c8293e9a9a52ULL,
0 x262dbe4c0b262698ULL,
0 x328dfa64bf3232c8ULL,
0 xb0e94a7d59b0b0faULL,
0 xe91b6acff2e9e983ULL,
0 x0f78331e770f0f3cULL,
0 xd5e6a6b733d5d573ULL,
0 x8074ba1df480803aULL,
0 xbe997c6127bebec2ULL,
0 xcd26de87ebcdcd13ULL,
0 x34bde468893434d0ULL,
0 x487a75903248483dULL,
0 xffab24e354ffffdbULL,
0 x7af78ff48d7a7af5ULL,
0 x90f4ea3d6490907aULL,
0 x5fc23ebe9d5f5f61ULL,
0 x201da0403d202080ULL,
0 x6867d5d00f6868bdULL,
0 x1ad07234ca1a1a68ULL,
0 xae192c41b7aeae82ULL,
0 xb4c95e757db4b4eaULL,
0 x549a19a8ce54544dULL,
0 x93ece53b7f939376ULL,
0 x220daa442f222288ULL,
0 x6407e9c86364648dULL,
0 xf1db12ff2af1f1e3ULL,
0 x73bfa2e6cc7373d1ULL,
0 x12905a2482121248ULL,
0 x403a5d807a40401dULL,
0 x0840281048080820ULL,
0 xc356e89b95c3c32bULL,
0 xec337bc5dfecec97ULL,
0 xdb9690ab4ddbdb4bULL,
0 xa1611f5fc0a1a1beULL,
0 x8d1c8307918d8d0eULL,
0 x3df5c97ac83d3df4ULL,
0 x97ccf1335b979766ULL,
0 x0000000000000000ULL,
0 xcf36d483f9cfcf1bULL,
0 x2b4587566e2b2bacULL,
0 x7697b3ece17676c5ULL,
0 x8264b019e6828232ULL,
0 xd6fea9b128d6d67fULL,
0 x1bd87736c31b1b6cULL,
0 xb5c15b7774b5b5eeULL,
0 xaf112943beafaf86ULL,
0 x6a77dfd41d6a6ab5ULL,
0 x50ba0da0ea50505dULL,
0 x45124c8a57454509ULL,
0 xf3cb18fb38f3f3ebULL,
0 x309df060ad3030c0ULL,
0 xef2b74c3c4efef9bULL,
0 x3fe5c37eda3f3ffcULL,
0 x55921caac7555549ULL,
0 xa2791059dba2a2b2ULL,
0 xea0365c9e9eaea8fULL,
0 x650fecca6a656589ULL,
0 xbab9686903babad2ULL,
0 x2f65935e4a2f2fbcULL,
0 xc04ee79d8ec0c027ULL,
0 xdebe81a160dede5fULL,
0 x1ce06c38fc1c1c70ULL,
0 xfdbb2ee746fdfdd3ULL,
0 x4d52649a1f4d4d29ULL,
0 x92e4e03976929272ULL,
0 x758fbceafa7575c9ULL,
0 x06301e0c36060618ULL,
0 x8a249809ae8a8a12ULL,
0 xb2f940794bb2b2f2ULL,
0 xe66359d185e6e6bfULL,
0 x0e70361c7e0e0e38ULL,
0 x1ff8633ee71f1f7cULL,
0 x6237f7c455626295ULL,
0 xd4eea3b53ad4d477ULL,
0 xa829324d81a8a89aULL,
0 x96c4f43152969662ULL,
0 xf99b3aef62f9f9c3ULL,
0 xc566f697a3c5c533ULL,
0 x2535b14a10252594ULL,
0 x59f220b2ab595979ULL,
0 x8454ae15d084842aULL,
0 x72b7a7e4c57272d5ULL,
0 x39d5dd72ec3939e4ULL,
0 x4c5a6198164c4c2dULL,
0 x5eca3bbc945e5e65ULL,
0 x78e785f09f7878fdULL,
0 x38ddd870e53838e0ULL,
0 x8c148605988c8c0aULL,
0 xd1c6b2bf17d1d163ULL,
0 xa5410b57e4a5a5aeULL,
0 xe2434dd9a1e2e2afULL,
0 x612ff8c24e616199ULL,
0 xb3f1457b42b3b3f6ULL,
0 x2115a54234212184ULL,
0 x9c94d625089c9c4aULL,
0 x1ef0663cee1e1e78ULL,
0 x4322528661434311ULL,
0 xc776fc93b1c7c73bULL,
0 xfcb32be54ffcfcd7ULL,
0 x0420140824040410ULL,
0 x51b208a2e3515159ULL,
0 x99bcc72f2599995eULL,
0 x6d4fc4da226d6da9ULL,
0 x0d68391a650d0d34ULL,
0 xfa8335e979fafacfULL,
0 xdfb684a369dfdf5bULL,
0 x7ed79bfca97e7ee5ULL,
0 x243db44819242490ULL,
0 x3bc5d776fe3b3becULL,
0 xab313d4b9aabab96ULL,
0 xce3ed181f0cece1fULL,
0 x1188552299111144ULL,
0 x8f0c8903838f8f06ULL,
0 x4e4a6b9c044e4e25ULL,
0 xb7d1517366b7b7e6ULL,
0 xeb0b60cbe0ebeb8bULL,
0 x3cfdcc78c13c3cf0ULL,
0 x817cbf1ffd81813eULL,
0 x94d4fe354094946aULL,
0 xf7eb0cf31cf7f7fbULL,
0 xb9a1676f18b9b9deULL,
0 x13985f268b13134cULL,
0 x2c7d9c58512c2cb0ULL,
0 xd3d6b8bb05d3d36bULL,
0 xe76b5cd38ce7e7bbULL,
0 x6e57cbdc396e6ea5ULL,
0 xc46ef395aac4c437ULL,
0 x03180f061b03030cULL,
0 x568a13acdc565645ULL,
0 x441a49885e44440dULL,
0 x7fdf9efea07f7fe1ULL,
0 xa921374f88a9a99eULL,
0 x2a4d8254672a2aa8ULL,
0 xbbb16d6b0abbbbd6ULL,
0 xc146e29f87c1c123ULL,
0 x53a202a6f1535351ULL,
0 xdcae8ba572dcdc57ULL,
0 x0b582716530b0b2cULL,
0 x9d9cd327019d9d4eULL,
0 x6c47c1d82b6c6cadULL,
0 x3195f562a43131c4ULL,
0 x7487b9e8f37474cdULL,
0 xf6e309f115f6f6ffULL,
0 x460a438c4c464605ULL,
0 xac092645a5acac8aULL,
0 x893c970fb589891eULL,
0 x14a04428b4141450ULL,
0 xe15b42dfbae1e1a3ULL,
0 x16b04e2ca6161658ULL,
0 x3acdd274f73a3ae8ULL,
0 x696fd0d2066969b9ULL,
0 x09482d1241090924ULL,
0 x70a7ade0d77070ddULL,
0 xb6d954716fb6b6e2ULL,
0 xd0ceb7bd1ed0d067ULL,
0 xed3b7ec7d6eded93ULL,
0 xcc2edb85e2cccc17ULL,
0 x422a578468424215ULL,
0 x98b4c22d2c98985aULL,
0 xa4490e55eda4a4aaULL,
0 x285d8850752828a0ULL,
0 x5cda31b8865c5c6dULL,
0 xf8933fed6bf8f8c7ULL,
0 x8644a411c2868622ULL,
};
static const u64 C6[
256 ] = {
0 x6018c07830d81818ULL,
0 x8c2305af46262323ULL,
0 x3fc67ef991b8c6c6ULL,
0 x87e8136fcdfbe8e8ULL,
0 x26874ca113cb8787ULL,
0 xdab8a9626d11b8b8ULL,
0 x0401080502090101ULL,
0 x214f426e9e0d4f4fULL,
0 xd836adee6c9b3636ULL,
0 xa2a6590451ffa6a6ULL,
0 x6fd2debdb90cd2d2ULL,
0 xf3f5fb06f70ef5f5ULL,
0 xf979ef80f2967979ULL,
0 xa16f5fcede306f6fULL,
0 x7e91fcef3f6d9191ULL,
0 x5552aa07a4f85252ULL,
0 x9d6027fdc0476060ULL,
0 xcabc89766535bcbcULL,
0 x569baccd2b379b9bULL,
0 x028e048c018a8e8eULL,
0 xb6a371155bd2a3a3ULL,
0 x300c603c186c0c0cULL,
0 xf17bff8af6847b7bULL,
0 xd435b5e16a803535ULL,
0 x741de8693af51d1dULL,
0 xa7e05347ddb3e0e0ULL,
0 x7bd7f6acb321d7d7ULL,
0 x2fc25eed999cc2c2ULL,
0 xb82e6d965c432e2eULL,
0 x314b627a96294b4bULL,
0 xdffea321e15dfefeULL,
0 x41578216aed55757ULL,
0 x5415a8412abd1515ULL,
0 xc1779fb6eee87777ULL,
0 xdc37a5eb6e923737ULL,
0 xb3e57b56d79ee5e5ULL,
0 x469f8cd923139f9fULL,
0 xe7f0d317fd23f0f0ULL,
0 x354a6a7f94204a4aULL,
0 x4fda9e95a944dadaULL,
0 x7d58fa25b0a25858ULL,
0 x03c906ca8fcfc9c9ULL,
0 xa429558d527c2929ULL,
0 x280a5022145a0a0aULL,
0 xfeb1e14f7f50b1b1ULL,
0 xbaa0691a5dc9a0a0ULL,
0 xb16b7fdad6146b6bULL,
0 x2e855cab17d98585ULL,
0 xcebd8173673cbdbdULL,
0 x695dd234ba8f5d5dULL,
0 x4010805020901010ULL,
0 xf7f4f303f507f4f4ULL,
0 x0bcb16c08bddcbcbULL,
0 xf83eedc67cd33e3eULL,
0 x140528110a2d0505ULL,
0 x81671fe6ce786767ULL,
0 xb7e47353d597e4e4ULL,
0 x9c2725bb4e022727ULL,
0 x1941325882734141ULL,
0 x168b2c9d0ba78b8bULL,
0 xa6a7510153f6a7a7ULL,
0 xe97dcf94fab27d7dULL,
0 x6e95dcfb37499595ULL,
0 x47d88e9fad56d8d8ULL,
0 xcbfb8b30eb70fbfbULL,
0 x9fee2371c1cdeeeeULL,
0 xed7cc791f8bb7c7cULL,
0 x856617e3cc716666ULL,
0 x53dda68ea77bddddULL,
0 x5c17b84b2eaf1717ULL,
0 x014702468e454747ULL,
0 x429e84dc211a9e9eULL,
0 x0fca1ec589d4cacaULL,
0 xb42d75995a582d2dULL,
0 xc6bf9179632ebfbfULL,
0 x1c07381b0e3f0707ULL,
0 x8ead012347acadadULL,
0 x755aea2fb4b05a5aULL,
0 x36836cb51bef8383ULL,
0 xcc3385ff66b63333ULL,
0 x91633ff2c65c6363ULL,
0 x0802100a04120202ULL,
0 x92aa39384993aaaaULL,
0 xd971afa8e2de7171ULL,
0 x07c80ecf8dc6c8c8ULL,
0 x6419c87d32d11919ULL,
0 x39497270923b4949ULL,
0 x43d9869aaf5fd9d9ULL,
0 xeff2c31df931f2f2ULL,
0 xabe34b48dba8e3e3ULL,
0 x715be22ab6b95b5bULL,
0 x1a8834920dbc8888ULL,
0 x529aa4c8293e9a9aULL,
0 x98262dbe4c0b2626ULL,
0 xc8328dfa64bf3232ULL,
0 xfab0e94a7d59b0b0ULL,
0 x83e91b6acff2e9e9ULL,
0 x3c0f78331e770f0fULL,
0 x73d5e6a6b733d5d5ULL,
0 x3a8074ba1df48080ULL,
0 xc2be997c6127bebeULL,
0 x13cd26de87ebcdcdULL,
0 xd034bde468893434ULL,
0 x3d487a7590324848ULL,
0 xdbffab24e354ffffULL,
0 xf57af78ff48d7a7aULL,
0 x7a90f4ea3d649090ULL,
0 x615fc23ebe9d5f5fULL,
0 x80201da0403d2020ULL,
0 xbd6867d5d00f6868ULL,
0 x681ad07234ca1a1aULL,
0 x82ae192c41b7aeaeULL,
0 xeab4c95e757db4b4ULL,
0 x4d549a19a8ce5454ULL,
0 x7693ece53b7f9393ULL,
0 x88220daa442f2222ULL,
0 x8d6407e9c8636464ULL,
0 xe3f1db12ff2af1f1ULL,
0 xd173bfa2e6cc7373ULL,
0 x4812905a24821212ULL,
0 x1d403a5d807a4040ULL,
0 x2008402810480808ULL,
0 x2bc356e89b95c3c3ULL,
0 x97ec337bc5dfececULL,
0 x4bdb9690ab4ddbdbULL,
0 xbea1611f5fc0a1a1ULL,
0 x0e8d1c8307918d8dULL,
0 xf43df5c97ac83d3dULL,
0 x6697ccf1335b9797ULL,
0 x0000000000000000ULL,
0 x1bcf36d483f9cfcfULL,
0 xac2b4587566e2b2bULL,
0 xc57697b3ece17676ULL,
0 x328264b019e68282ULL,
0 x7fd6fea9b128d6d6ULL,
0 x6c1bd87736c31b1bULL,
0 xeeb5c15b7774b5b5ULL,
0 x86af112943beafafULL,
0 xb56a77dfd41d6a6aULL,
0 x5d50ba0da0ea5050ULL,
0 x0945124c8a574545ULL,
0 xebf3cb18fb38f3f3ULL,
0 xc0309df060ad3030ULL,
0 x9bef2b74c3c4efefULL,
0 xfc3fe5c37eda3f3fULL,
0 x4955921caac75555ULL,
0 xb2a2791059dba2a2ULL,
0 x8fea0365c9e9eaeaULL,
0 x89650fecca6a6565ULL,
0 xd2bab9686903babaULL,
0 xbc2f65935e4a2f2fULL,
0 x27c04ee79d8ec0c0ULL,
0 x5fdebe81a160dedeULL,
0 x701ce06c38fc1c1cULL,
0 xd3fdbb2ee746fdfdULL,
0 x294d52649a1f4d4dULL,
0 x7292e4e039769292ULL,
0 xc9758fbceafa7575ULL,
0 x1806301e0c360606ULL,
0 x128a249809ae8a8aULL,
0 xf2b2f940794bb2b2ULL,
0 xbfe66359d185e6e6ULL,
0 x380e70361c7e0e0eULL,
0 x7c1ff8633ee71f1fULL,
0 x956237f7c4556262ULL,
0 x77d4eea3b53ad4d4ULL,
0 x9aa829324d81a8a8ULL,
0 x6296c4f431529696ULL,
0 xc3f99b3aef62f9f9ULL,
0 x33c566f697a3c5c5ULL,
0 x942535b14a102525ULL,
0 x7959f220b2ab5959ULL,
0 x2a8454ae15d08484ULL,
0 xd572b7a7e4c57272ULL,
0 xe439d5dd72ec3939ULL,
0 x2d4c5a6198164c4cULL,
0 x655eca3bbc945e5eULL,
0 xfd78e785f09f7878ULL,
0 xe038ddd870e53838ULL,
0 x0a8c148605988c8cULL,
0 x63d1c6b2bf17d1d1ULL,
0 xaea5410b57e4a5a5ULL,
0 xafe2434dd9a1e2e2ULL,
0 x99612ff8c24e6161ULL,
0 xf6b3f1457b42b3b3ULL,
0 x842115a542342121ULL,
0 x4a9c94d625089c9cULL,
0 x781ef0663cee1e1eULL,
0 x1143225286614343ULL,
0 x3bc776fc93b1c7c7ULL,
0 xd7fcb32be54ffcfcULL,
0 x1004201408240404ULL,
0 x5951b208a2e35151ULL,
0 x5e99bcc72f259999ULL,
0 xa96d4fc4da226d6dULL,
0 x340d68391a650d0dULL,
0 xcffa8335e979fafaULL,
0 x5bdfb684a369dfdfULL,
0 xe57ed79bfca97e7eULL,
0 x90243db448192424ULL,
0 xec3bc5d776fe3b3bULL,
0 x96ab313d4b9aababULL,
0 x1fce3ed181f0ceceULL,
0 x4411885522991111ULL,
0 x068f0c8903838f8fULL,
0 x254e4a6b9c044e4eULL,
0 xe6b7d1517366b7b7ULL,
0 x8beb0b60cbe0ebebULL,
0 xf03cfdcc78c13c3cULL,
0 x3e817cbf1ffd8181ULL,
0 x6a94d4fe35409494ULL,
0 xfbf7eb0cf31cf7f7ULL,
0 xdeb9a1676f18b9b9ULL,
0 x4c13985f268b1313ULL,
0 xb02c7d9c58512c2cULL,
0 x6bd3d6b8bb05d3d3ULL,
0 xbbe76b5cd38ce7e7ULL,
0 xa56e57cbdc396e6eULL,
0 x37c46ef395aac4c4ULL,
0 x0c03180f061b0303ULL,
0 x45568a13acdc5656ULL,
0 x0d441a49885e4444ULL,
0 xe17fdf9efea07f7fULL,
0 x9ea921374f88a9a9ULL,
0 xa82a4d8254672a2aULL,
0 xd6bbb16d6b0abbbbULL,
0 x23c146e29f87c1c1ULL,
0 x5153a202a6f15353ULL,
0 x57dcae8ba572dcdcULL,
0 x2c0b582716530b0bULL,
0 x4e9d9cd327019d9dULL,
0 xad6c47c1d82b6c6cULL,
0 xc43195f562a43131ULL,
0 xcd7487b9e8f37474ULL,
0 xfff6e309f115f6f6ULL,
0 x05460a438c4c4646ULL,
0 x8aac092645a5acacULL,
0 x1e893c970fb58989ULL,
0 x5014a04428b41414ULL,
0 xa3e15b42dfbae1e1ULL,
0 x5816b04e2ca61616ULL,
0 xe83acdd274f73a3aULL,
0 xb9696fd0d2066969ULL,
0 x2409482d12410909ULL,
0 xdd70a7ade0d77070ULL,
0 xe2b6d954716fb6b6ULL,
0 x67d0ceb7bd1ed0d0ULL,
0 x93ed3b7ec7d6ededULL,
0 x17cc2edb85e2ccccULL,
0 x15422a5784684242ULL,
0 x5a98b4c22d2c9898ULL,
0 xaaa4490e55eda4a4ULL,
0 xa0285d8850752828ULL,
0 x6d5cda31b8865c5cULL,
0 xc7f8933fed6bf8f8ULL,
0 x228644a411c28686ULL,
};
static const u64 C7[
256 ] = {
0 x186018c07830d818ULL,
0 x238c2305af462623ULL,
0 xc63fc67ef991b8c6ULL,
0 xe887e8136fcdfbe8ULL,
0 x8726874ca113cb87ULL,
0 xb8dab8a9626d11b8ULL,
0 x0104010805020901ULL,
0 x4f214f426e9e0d4fULL,
0 x36d836adee6c9b36ULL,
0 xa6a2a6590451ffa6ULL,
0 xd26fd2debdb90cd2ULL,
0 xf5f3f5fb06f70ef5ULL,
0 x79f979ef80f29679ULL,
0 x6fa16f5fcede306fULL,
0 x917e91fcef3f6d91ULL,
0 x525552aa07a4f852ULL,
0 x609d6027fdc04760ULL,
0 xbccabc89766535bcULL,
0 x9b569baccd2b379bULL,
0 x8e028e048c018a8eULL,
0 xa3b6a371155bd2a3ULL,
0 x0c300c603c186c0cULL,
0 x7bf17bff8af6847bULL,
0 x35d435b5e16a8035ULL,
0 x1d741de8693af51dULL,
0 xe0a7e05347ddb3e0ULL,
0 xd77bd7f6acb321d7ULL,
0 xc22fc25eed999cc2ULL,
0 x2eb82e6d965c432eULL,
0 x4b314b627a96294bULL,
0 xfedffea321e15dfeULL,
0 x5741578216aed557ULL,
0 x155415a8412abd15ULL,
0 x77c1779fb6eee877ULL,
0 x37dc37a5eb6e9237ULL,
0 xe5b3e57b56d79ee5ULL,
0 x9f469f8cd923139fULL,
0 xf0e7f0d317fd23f0ULL,
0 x4a354a6a7f94204aULL,
0 xda4fda9e95a944daULL,
0 x587d58fa25b0a258ULL,
0 xc903c906ca8fcfc9ULL,
0 x29a429558d527c29ULL,
0 x0a280a5022145a0aULL,
0 xb1feb1e14f7f50b1ULL,
0 xa0baa0691a5dc9a0ULL,
0 x6bb16b7fdad6146bULL,
0 x852e855cab17d985ULL,
0 xbdcebd8173673cbdULL,
0 x5d695dd234ba8f5dULL,
0 x1040108050209010ULL,
0 xf4f7f4f303f507f4ULL,
0 xcb0bcb16c08bddcbULL,
0 x3ef83eedc67cd33eULL,
0 x05140528110a2d05ULL,
0 x6781671fe6ce7867ULL,
0 xe4b7e47353d597e4ULL,
0 x279c2725bb4e0227ULL,
0 x4119413258827341ULL,
0 x8b168b2c9d0ba78bULL,
0 xa7a6a7510153f6a7ULL,
0 x7de97dcf94fab27dULL,
0 x956e95dcfb374995ULL,
0 xd847d88e9fad56d8ULL,
0 xfbcbfb8b30eb70fbULL,
0 xee9fee2371c1cdeeULL,
0 x7ced7cc791f8bb7cULL,
0 x66856617e3cc7166ULL,
0 xdd53dda68ea77bddULL,
0 x175c17b84b2eaf17ULL,
0 x47014702468e4547ULL,
0 x9e429e84dc211a9eULL,
0 xca0fca1ec589d4caULL,
0 x2db42d75995a582dULL,
0 xbfc6bf9179632ebfULL,
0 x071c07381b0e3f07ULL,
0 xad8ead012347acadULL,
0 x5a755aea2fb4b05aULL,
0 x8336836cb51bef83ULL,
0 x33cc3385ff66b633ULL,
0 x6391633ff2c65c63ULL,
0 x020802100a041202ULL,
0 xaa92aa39384993aaULL,
0 x71d971afa8e2de71ULL,
0 xc807c80ecf8dc6c8ULL,
0 x196419c87d32d119ULL,
0 x4939497270923b49ULL,
0 xd943d9869aaf5fd9ULL,
0 xf2eff2c31df931f2ULL,
0 xe3abe34b48dba8e3ULL,
0 x5b715be22ab6b95bULL,
0 x881a8834920dbc88ULL,
0 x9a529aa4c8293e9aULL,
0 x2698262dbe4c0b26ULL,
0 x32c8328dfa64bf32ULL,
0 xb0fab0e94a7d59b0ULL,
0 xe983e91b6acff2e9ULL,
0 x0f3c0f78331e770fULL,
0 xd573d5e6a6b733d5ULL,
0 x803a8074ba1df480ULL,
0 xbec2be997c6127beULL,
0 xcd13cd26de87ebcdULL,
0 x34d034bde4688934ULL,
0 x483d487a75903248ULL,
0 xffdbffab24e354ffULL,
0 x7af57af78ff48d7aULL,
0 x907a90f4ea3d6490ULL,
0 x5f615fc23ebe9d5fULL,
0 x2080201da0403d20ULL,
0 x68bd6867d5d00f68ULL,
0 x1a681ad07234ca1aULL,
0 xae82ae192c41b7aeULL,
0 xb4eab4c95e757db4ULL,
0 x544d549a19a8ce54ULL,
0 x937693ece53b7f93ULL,
0 x2288220daa442f22ULL,
0 x648d6407e9c86364ULL,
0 xf1e3f1db12ff2af1ULL,
0 x73d173bfa2e6cc73ULL,
0 x124812905a248212ULL,
0 x401d403a5d807a40ULL,
0 x0820084028104808ULL,
0 xc32bc356e89b95c3ULL,
0 xec97ec337bc5dfecULL,
0 xdb4bdb9690ab4ddbULL,
0 xa1bea1611f5fc0a1ULL,
0 x8d0e8d1c8307918dULL,
0 x3df43df5c97ac83dULL,
0 x976697ccf1335b97ULL,
0 x0000000000000000ULL,
0 xcf1bcf36d483f9cfULL,
0 x2bac2b4587566e2bULL,
0 x76c57697b3ece176ULL,
0 x82328264b019e682ULL,
0 xd67fd6fea9b128d6ULL,
0 x1b6c1bd87736c31bULL,
0 xb5eeb5c15b7774b5ULL,
0 xaf86af112943beafULL,
0 x6ab56a77dfd41d6aULL,
0 x505d50ba0da0ea50ULL,
0 x450945124c8a5745ULL,
0 xf3ebf3cb18fb38f3ULL,
0 x30c0309df060ad30ULL,
0 xef9bef2b74c3c4efULL,
0 x3ffc3fe5c37eda3fULL,
0 x554955921caac755ULL,
0 xa2b2a2791059dba2ULL,
0 xea8fea0365c9e9eaULL,
0 x6589650fecca6a65ULL,
0 xbad2bab9686903baULL,
0 x2fbc2f65935e4a2fULL,
0 xc027c04ee79d8ec0ULL,
0 xde5fdebe81a160deULL,
0 x1c701ce06c38fc1cULL,
0 xfdd3fdbb2ee746fdULL,
0 x4d294d52649a1f4dULL,
0 x927292e4e0397692ULL,
0 x75c9758fbceafa75ULL,
0 x061806301e0c3606ULL,
0 x8a128a249809ae8aULL,
0 xb2f2b2f940794bb2ULL,
0 xe6bfe66359d185e6ULL,
0 x0e380e70361c7e0eULL,
0 x1f7c1ff8633ee71fULL,
0 x62956237f7c45562ULL,
0 xd477d4eea3b53ad4ULL,
0 xa89aa829324d81a8ULL,
0 x966296c4f4315296ULL,
0 xf9c3f99b3aef62f9ULL,
0 xc533c566f697a3c5ULL,
0 x25942535b14a1025ULL,
0 x597959f220b2ab59ULL,
0 x842a8454ae15d084ULL,
0 x72d572b7a7e4c572ULL,
0 x39e439d5dd72ec39ULL,
0 x4c2d4c5a6198164cULL,
0 x5e655eca3bbc945eULL,
0 x78fd78e785f09f78ULL,
0 x38e038ddd870e538ULL,
0 x8c0a8c148605988cULL,
0 xd163d1c6b2bf17d1ULL,
0 xa5aea5410b57e4a5ULL,
0 xe2afe2434dd9a1e2ULL,
0 x6199612ff8c24e61ULL,
0 xb3f6b3f1457b42b3ULL,
0 x21842115a5423421ULL,
0 x9c4a9c94d625089cULL,
0 x1e781ef0663cee1eULL,
0 x4311432252866143ULL,
0 xc73bc776fc93b1c7ULL,
0 xfcd7fcb32be54ffcULL,
0 x0410042014082404ULL,
0 x515951b208a2e351ULL,
0 x995e99bcc72f2599ULL,
0 x6da96d4fc4da226dULL,
0 x0d340d68391a650dULL,
0 xfacffa8335e979faULL,
0 xdf5bdfb684a369dfULL,
0 x7ee57ed79bfca97eULL,
0 x2490243db4481924ULL,
0 x3bec3bc5d776fe3bULL,
0 xab96ab313d4b9aabULL,
0 xce1fce3ed181f0ceULL,
0 x1144118855229911ULL,
0 x8f068f0c8903838fULL,
0 x4e254e4a6b9c044eULL,
0 xb7e6b7d1517366b7ULL,
0 xeb8beb0b60cbe0ebULL,
0 x3cf03cfdcc78c13cULL,
0 x813e817cbf1ffd81ULL,
0 x946a94d4fe354094ULL,
0 xf7fbf7eb0cf31cf7ULL,
0 xb9deb9a1676f18b9ULL,
0 x134c13985f268b13ULL,
0 x2cb02c7d9c58512cULL,
0 xd36bd3d6b8bb05d3ULL,
0 xe7bbe76b5cd38ce7ULL,
0 x6ea56e57cbdc396eULL,
0 xc437c46ef395aac4ULL,
0 x030c03180f061b03ULL,
0 x5645568a13acdc56ULL,
0 x440d441a49885e44ULL,
0 x7fe17fdf9efea07fULL,
0 xa99ea921374f88a9ULL,
0 x2aa82a4d8254672aULL,
0 xbbd6bbb16d6b0abbULL,
0 xc123c146e29f87c1ULL,
0 x535153a202a6f153ULL,
0 xdc57dcae8ba572dcULL,
0 x0b2c0b582716530bULL,
0 x9d4e9d9cd327019dULL,
0 x6cad6c47c1d82b6cULL,
0 x31c43195f562a431ULL,
0 x74cd7487b9e8f374ULL,
0 xf6fff6e309f115f6ULL,
0 x4605460a438c4c46ULL,
0 xac8aac092645a5acULL,
0 x891e893c970fb589ULL,
0 x145014a04428b414ULL,
0 xe1a3e15b42dfbae1ULL,
0 x165816b04e2ca616ULL,
0 x3ae83acdd274f73aULL,
0 x69b9696fd0d20669ULL,
0 x092409482d124109ULL,
0 x70dd70a7ade0d770ULL,
0 xb6e2b6d954716fb6ULL,
0 xd067d0ceb7bd1ed0ULL,
0 xed93ed3b7ec7d6edULL,
0 xcc17cc2edb85e2ccULL,
0 x4215422a57846842ULL,
0 x985a98b4c22d2c98ULL,
0 xa4aaa4490e55eda4ULL,
0 x28a0285d88507528ULL,
0 x5c6d5cda31b8865cULL,
0 xf8c7f8933fed6bf8ULL,
0 x86228644a411c286ULL,
};
static const u64 rc[WHIRLPOOL_ROUNDS] = {
0 x1823c6e887b8014fULL,
0 x36a6d2f5796f9152ULL,
0 x60bc9b8ea30c7b35ULL,
0 x1de0d7c22e4bfe57ULL,
0 x157737e59ff04adaULL,
0 x58c9290ab1a06b85ULL,
0 xbd5d10f4cb3e0567ULL,
0 xe427418ba77d95d8ULL,
0 xfbee7c66dd17479eULL,
0 xca2dbf07ad5a8333ULL,
};
/*
* The core Whirlpool transform.
*/
static __no_kmsan_checks
void wp512_process_buffer(
struct wp512_ctx *wctx,
const u8 *buffer) {
int i, r;
u64 K[
8 ];
/* the round key */
u64 block[
8 ];
/* mu(buffer) */
u64 state[
8 ];
/* the cipher state */
u64 L[
8 ];
for (i =
0 ; i <
8 ; i++)
block[i] = get_unaligned_be64(buffer + i *
8 );
state[
0 ] = block[
0 ] ^ (K[
0 ] = wctx->hash[
0 ]);
state[
1 ] = block[
1 ] ^ (K[
1 ] = wctx->hash[
1 ]);
state[
2 ] = block[
2 ] ^ (K[
2 ] = wctx->hash[
2 ]);
state[
3 ] = block[
3 ] ^ (K[
3 ] = wctx->hash[
3 ]);
state[
4 ] = block[
4 ] ^ (K[
4 ] = wctx->hash[
4 ]);
state[
5 ] = block[
5 ] ^ (K[
5 ] = wctx->hash[
5 ]);
state[
6 ] = block[
6 ] ^ (K[
6 ] = wctx->hash[
6 ]);
state[
7 ] = block[
7 ] ^ (K[
7 ] = wctx->hash[
7 ]);
for (r =
0 ; r < WHIRLPOOL_ROUNDS; r++) {
L[
0 ] = C0[(
int )(K[
0 ] >>
56 ) ] ^
C1[(
int )(K[
7 ] >>
48 ) &
0 xff] ^
C2[(
int )(K[
6 ] >>
40 ) &
0 xff] ^
C3[(
int )(K[
5 ] >>
32 ) &
0 xff] ^
C4[(
int )(K[
4 ] >>
24 ) &
0 xff] ^
C5[(
int )(K[
3 ] >>
16 ) &
0 xff] ^
C6[(
int )(K[
2 ] >>
8 ) &
0 xff] ^
C7[(
int )(K[
1 ] ) &
0 xff] ^
rc[r];
L[
1 ] = C0[(
int )(K[
1 ] >>
56 ) ] ^
C1[(
int )(K[
0 ] >>
48 ) &
0 xff] ^
C2[(
int )(K[
7 ] >>
40 ) &
0 xff] ^
C3[(
int )(K[
6 ] >>
32 ) &
0 xff] ^
C4[(
int )(K[
5 ] >>
24 ) &
0 xff] ^
C5[(
int )(K[
4 ] >>
16 ) &
0 xff] ^
C6[(
int )(K[
3 ] >>
8 ) &
0 xff] ^
C7[(
int )(K[
2 ] ) &
0 xff];
L[
2 ] = C0[(
int )(K[
2 ] >>
56 ) ] ^
C1[(
int )(K[
1 ] >>
48 ) &
0 xff] ^
C2[(
int )(K[
0 ] >>
40 ) &
0 xff] ^
C3[(
int )(K[
7 ] >>
32 ) &
0 xff] ^
C4[(
int )(K[
6 ] >>
24 ) &
0 xff] ^
C5[(
int )(K[
5 ] >>
16 ) &
0 xff] ^
C6[(
int )(K[
4 ] >>
8 ) &
0 xff] ^
C7[(
int )(K[
3 ] ) &
0 xff];
L[
3 ] = C0[(
int )(K[
3 ] >>
56 ) ] ^
C1[(
int )(K[
2 ] >>
48 ) &
0 xff] ^
C2[(
int )(K[
1 ] >>
40 ) &
0 xff] ^
C3[(
int )(K[
0 ] >>
32 ) &
0 xff] ^
C4[(
int )(K[
7 ] >>
24 ) &
0 xff] ^
C5[(
int )(K[
6 ] >>
16 ) &
0 xff] ^
C6[(
int )(K[
5 ] >>
8 ) &
0 xff] ^
C7[(
int )(K[
4 ] ) &
0 xff];
L[
4 ] = C0[(
int )(K[
4 ] >>
56 ) ] ^
C1[(
int )(K[
3 ] >>
48 ) &
0 xff] ^
C2[(
int )(K[
2 ] >>
40 ) &
0 xff] ^
C3[(
int )(K[
1 ] >>
32 ) &
0 xff] ^
C4[(
int )(K[
0 ] >>
24 ) &
0 xff] ^
C5[(
int )(K[
7 ] >>
16 ) &
0 xff] ^
C6[(
int )(K[
6 ] >>
8 ) &
0 xff] ^
C7[(
int )(K[
5 ] ) &
0 xff];
L[
5 ] = C0[(
int )(K[
5 ] >>
56 ) ] ^
C1[(
int )(K[
4 ] >>
48 ) &
0 xff] ^
C2[(
int )(K[
3 ] >>
40 ) &
0 xff] ^
C3[(
int )(K[
2 ] >>
32 ) &
0 xff] ^
C4[(
int )(K[
1 ] >>
24 ) &
0 xff] ^
C5[(
int )(K[
0 ] >>
16 ) &
0 xff] ^
C6[(
int )(K[
7 ] >>
8 ) &
0 xff] ^
C7[(
int )(K[
6 ] ) &
0 xff];
L[
6 ] = C0[(
int )(K[
6 ] >>
56 ) ] ^
C1[(
int )(K[
5 ] >>
48 ) &
0 xff] ^
C2[(
int )(K[
4 ] >>
40 ) &
0 xff] ^
C3[(
int )(K[
3 ] >>
32 ) &
0 xff] ^
C4[(
int )(K[
2 ] >>
24 ) &
0 xff] ^
C5[(
int )(K[
1 ] >>
16 ) &
0 xff] ^
C6[(
int )(K[
0 ] >>
8 ) &
0 xff] ^
C7[(
int )(K[
7 ] ) &
0 xff];
L[
7 ] = C0[(
int )(K[
7 ] >>
56 ) ] ^
C1[(
int )(K[
6 ] >>
48 ) &
0 xff] ^
C2[(
int )(K[
5 ] >>
40 ) &
0 xff] ^
C3[(
int )(K[
4 ] >>
32 ) &
0 xff] ^
C4[(
int )(K[
3 ] >>
24 ) &
0 xff] ^
C5[(
int )(K[
2 ] >>
16 ) &
0 xff] ^
C6[(
int )(K[
1 ] >>
8 ) &
0 xff] ^
C7[(
int )(K[
0 ] ) &
0 xff];
K[
0 ] = L[
0 ];
K[
1 ] = L[
1 ];
K[
2 ] = L[
2 ];
K[
3 ] = L[
3 ];
K[
4 ] = L[
4 ];
K[
5 ] = L[
5 ];
K[
6 ] = L[
6 ];
K[
7 ] = L[
7 ];
L[
0 ] = C0[(
int )(state[
0 ] >>
56 ) ] ^
C1[(
int )(state[
7 ] >>
48 ) &
0 xff] ^
C2[(
int )(state[
6 ] >>
40 ) &
0 xff] ^
C3[(
int )(state[
5 ] >>
32 ) &
0 xff] ^
C4[(
int )(state[
4 ] >>
24 ) &
0 xff] ^
C5[(
int )(state[
3 ] >>
16 ) &
0 xff] ^
C6[(
int )(state[
2 ] >>
8 ) &
0 xff] ^
C7[(
int )(state[
1 ] ) &
0 xff] ^
K[
0 ];
L[
1 ] = C0[(
int )(state[
1 ] >>
56 ) ] ^
C1[(
int )(state[
0 ] >>
48 ) &
0 xff] ^
C2[(
int )(state[
7 ] >>
40 ) &
0 xff] ^
C3[(
int )(state[
6 ] >>
32 ) &
0 xff] ^
C4[(
int )(state[
5 ] >>
24 ) &
0 xff] ^
C5[(
int )(state[
4 ] >>
16 ) &
0 xff] ^
C6[(
int )(state[
3 ] >>
8 ) &
0 xff] ^
C7[(
int )(state[
2 ] ) &
0 xff] ^
K[
1 ];
L[
2 ] = C0[(
int )(state[
2 ] >>
56 ) ] ^
C1[(
int )(state[
1 ] >>
48 ) &
0 xff] ^
C2[(
int )(state[
0 ] >>
40 ) &
0 xff] ^
C3[(
int )(state[
7 ] >>
32 ) &
0 xff] ^
C4[(
int )(state[
6 ] >>
24 ) &
0 xff] ^
C5[(
int )(state[
5 ] >>
16 ) &
0 xff] ^
C6[(
int )(state[
4 ] >>
8 ) &
0 xff] ^
C7[(
int )(state[
3 ] ) &
0 xff] ^
K[
2 ];
L[
3 ] = C0[(
int )(state[
3 ] >>
56 ) ] ^
C1[(
int )(state[
2 ] >>
48 ) &
0 xff] ^
C2[(
int )(state[
1 ] >>
40 ) &
0 xff] ^
C3[(
int )(state[
0 ] >>
32 ) &
0 xff] ^
C4[(
int )(state[
7 ] >>
24 ) &
0 xff] ^
C5[(
int )(state[
6 ] >>
16 ) &
0 xff] ^
C6[(
int )(state[
5 ] >>
8 ) &
0 xff] ^
C7[(
int )(state[
4 ] ) &
0 xff] ^
K[
3 ];
L[
4 ] = C0[(
int )(state[
4 ] >>
56 ) ] ^
C1[(
int )(state[
3 ] >>
48 ) &
0 xff] ^
C2[(
int )(state[
2 ] >>
40 ) &
0 xff] ^
C3[(
int )(state[
1 ] >>
32 ) &
0 xff] ^
C4[(
int )(state[
0 ] >>
24 ) &
0 xff] ^
C5[(
int )(state[
7 ] >>
16 ) &
0 xff] ^
C6[(
int )(state[
6 ] >>
8 ) &
0 xff] ^
C7[(
int )(state[
5 ] ) &
0 xff] ^
K[
4 ];
L[
5 ] = C0[(
int )(state[
5 ] >>
56 ) ] ^
C1[(
int )(state[
4 ] >>
48 ) &
0 xff] ^
C2[(
int )(state[
3 ] >>
40 ) &
0 xff] ^
C3[(
int )(state[
2 ] >>
32 ) &
0 xff] ^
C4[(
int )(state[
1 ] >>
24 ) &
0 xff] ^
C5[(
int )(state[
0 ] >>
16 ) &
0 xff] ^
C6[(
int )(state[
7 ] >>
8 ) &
0 xff] ^
C7[(
int )(state[
6 ] ) &
0 xff] ^
K[
5 ];
L[
6 ] = C0[(
int )(state[
6 ] >>
56 ) ] ^
C1[(
int )(state[
5 ] >>
48 ) &
0 xff] ^
C2[(
int )(state[
4 ] >>
40 ) &
0 xff] ^
C3[(
int )(state[
3 ] >>
32 ) &
0 xff] ^
C4[(
int )(state[
2 ] >>
24 ) &
0 xff] ^
C5[(
int )(state[
1 ] >>
16 ) &
0 xff] ^
C6[(
int )(state[
0 ] >>
8 ) &
0 xff] ^
C7[(
int )(state[
7 ] ) &
0 xff] ^
K[
6 ];
L[
7 ] = C0[(
int )(state[
7 ] >>
56 ) ] ^
C1[(
int )(state[
6 ] >>
48 ) &
0 xff] ^
C2[(
int )(state[
5 ] >>
40 ) &
0 xff] ^
C3[(
int )(state[
4 ] >>
32 ) &
0 xff] ^
C4[(
int )(state[
3 ] >>
24 ) &
0 xff] ^
C5[(
int )(state[
2 ] >>
16 ) &
0 xff] ^
C6[(
int )(state[
1 ] >>
8 ) &
0 xff] ^
C7[(
int )(state[
0 ] ) &
0 xff] ^
K[
7 ];
state[
0 ] = L[
0 ];
state[
1 ] = L[
1 ];
state[
2 ] = L[
2 ];
state[
3 ] = L[
3 ];
state[
4 ] = L[
4 ];
state[
5 ] = L[
5 ];
state[
6 ] = L[
6 ];
state[
7 ] = L[
7 ];
}
/*
* apply the Miyaguchi-Preneel compression function:
*/
wctx->hash[
0 ] ^= state[
0 ] ^ block[
0 ];
wctx->hash[
1 ] ^= state[
1 ] ^ block[
1 ];
wctx->hash[
2 ] ^= state[
2 ] ^ block[
2 ];
wctx->hash[
3 ] ^= state[
3 ] ^ block[
3 ];
wctx->hash[
4 ] ^= state[
4 ] ^ block[
4 ];
wctx->hash[
5 ] ^= state[
5 ] ^ block[
5 ];
wctx->hash[
6 ] ^= state[
6 ] ^ block[
6 ];
wctx->hash[
7 ] ^= state[
7 ] ^ block[
7 ];
}
static int wp512_init(
struct shash_desc *desc) {
struct wp512_ctx *wctx = shash_desc_ctx(desc);
int i;
memset(wctx->bitLength,
0 ,
32 );
for (i =
0 ; i <
8 ; i++) {
wctx->hash[i] =
0 L;
}
return 0 ;
}
static void wp512_add_length(u8 *bitLength, u64 value)
{
u32 carry;
int i;
for (i =
31 , carry =
0 ; i >=
0 && (carry !=
0 || value !=
0 ULL); i--) {
carry += bitLength[i] + ((u32)value &
0 xff);
bitLength[i] = (u8)carry;
carry >>=
8 ;
value >>=
8 ;
}
}
static int wp512_update(
struct shash_desc *desc,
const u8 *source,
unsigned int len)
{
struct wp512_ctx *wctx = shash_desc_ctx(desc);
unsigned int remain = len % WP512_BLOCK_SIZE;
u64 bits_len = (len - remain) *
8 ull;
u8 *bitLength = wctx->bitLength;
wp512_add_length(bitLength, bits_len);
do {
wp512_process_buffer(wctx, source);
source += WP512_BLOCK_SIZE;
bits_len -= WP512_BLOCK_SIZE *
8 ;
}
while (bits_len);
return remain;
}
static int wp512_finup(
struct shash_desc *desc,
const u8 *src,
unsigned int bufferPos, u8 *out)
{
struct wp512_ctx *wctx = shash_desc_ctx(desc);
int i;
u8 *bitLength = wctx->bitLength;
__be64 *digest = (__be64 *)out;
u8 buffer[WP512_BLOCK_SIZE];
wp512_add_length(bitLength, bufferPos *
8 );
memcpy(buffer, src, bufferPos);
buffer[bufferPos] =
0 x80U;
bufferPos++;
if (bufferPos > WP512_BLOCK_SIZE - WP512_LENGTHBYTES) {
if (bufferPos < WP512_BLOCK_SIZE)
memset(&buffer[bufferPos],
0 , WP512_BLOCK_SIZE - bufferPos);
wp512_process_buffer(wctx, buffer);
bufferPos =
0 ;
}
if (bufferPos < WP512_BLOCK_SIZE - WP512_LENGTHBYTES)
memset(&buffer[bufferPos],
0 ,
(WP512_BLOCK_SIZE - WP512_LENGTHBYTES) - bufferPos);
bufferPos = WP512_BLOCK_SIZE - WP512_LENGTHBYTES;
memcpy(&buffer[WP512_BLOCK_SIZE - WP512_LENGTHBYTES],
bitLength, WP512_LENGTHBYTES);
wp512_process_buffer(wctx, buffer);
memzero_explicit(buffer,
sizeof (buffer));
for (i =
0 ; i < WP512_DIGEST_SIZE/
8 ; i++)
digest[i] = cpu_to_be64(wctx->hash[i]);
return 0 ;
}
static int wp384_finup(
struct shash_desc *desc,
const u8 *src,
unsigned int len, u8 *out)
{
u8 D[
64 ];
wp512_finup(desc, src, len, D);
memcpy(out, D, WP384_DIGEST_SIZE);
memzero_explicit(D, WP512_DIGEST_SIZE);
return 0 ;
}
static int wp256_finup(
struct shash_desc *desc,
const u8 *src,
unsigned int len, u8 *out)
{
u8 D[
64 ];
wp512_finup(desc, src, len, D);
memcpy(out, D, WP256_DIGEST_SIZE);
memzero_explicit(D, WP512_DIGEST_SIZE);
return 0 ;
}
static struct shash_alg wp_algs[
3 ] = { {
.digestsize = WP512_DIGEST_SIZE,
.init = wp512_init,
.update = wp512_update,
.finup = wp512_finup,
.descsize =
sizeof (
struct wp512_ctx),
.base = {
.cra_name =
"wp512" ,
.cra_driver_name =
"wp512-generic" ,
.cra_flags = CRYPTO_AHASH_ALG_BLOCK_ONLY,
.cra_blocksize = WP512_BLOCK_SIZE,
.cra_module = THIS_MODULE,
}
}, {
.digestsize = WP384_DIGEST_SIZE,
.init = wp512_init,
.update = wp512_update,
.finup = wp384_finup,
.descsize =
sizeof (
struct wp512_ctx),
.base = {
.cra_name =
"wp384" ,
.cra_driver_name =
"wp384-generic" ,
.cra_flags = CRYPTO_AHASH_ALG_BLOCK_ONLY,
.cra_blocksize = WP512_BLOCK_SIZE,
.cra_module = THIS_MODULE,
}
}, {
.digestsize = WP256_DIGEST_SIZE,
.init = wp512_init,
.update = wp512_update,
.finup = wp256_finup,
.descsize =
sizeof (
struct wp512_ctx),
.base = {
.cra_name =
"wp256" ,
.cra_driver_name =
"wp256-generic" ,
.cra_flags = CRYPTO_AHASH_ALG_BLOCK_ONLY,
.cra_blocksize = WP512_BLOCK_SIZE,
.cra_module = THIS_MODULE,
}
} };
static int __init wp512_mod_init(
void )
{
return crypto_register_shashes(wp_algs, ARRAY_SIZE(wp_algs));
}
static void __
exit wp512_mod_fini(
void )
{
crypto_unregister_shashes(wp_algs, ARRAY_SIZE(wp_algs));
}
MODULE_ALIAS_CRYPTO(
"wp512" );
MODULE_ALIAS_CRYPTO(
"wp384" );
MODULE_ALIAS_CRYPTO(
"wp256" );
module_init(wp512_mod_init);
module_exit(wp512_mod_fini);
MODULE_LICENSE(
"GPL" );
MODULE_DESCRIPTION(
"Whirlpool Message Digest Algorithm" );
Messung V0.5 in Prozent C=100 H=94 G=96
¤ Dauer der Verarbeitung: 0.22 Sekunden
(vorverarbeitet am 2026-06-05)
¤
*© Formatika GbR, Deutschland