libxcks  0.1.0.1
whirlpool.cpp
Go to the documentation of this file.
1 /*
2  * libxcks
3  * Copyright (C) 2022 Julien Couot
4  *
5  * This program is free software: you can redistribute it and/or modify it
6  * under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or (at your
8  * option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
13  * License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with this program. If not, see <https://www.gnu.org/licenses/>.
17  */
18 
24 //---------------------------------------------------------------------------
25 #include <cstring>
26 
27 #include "whirlpool.hpp"
28 //---------------------------------------------------------------------------
29 
31 using namespace std;
32 //---------------------------------------------------------------------------
33 
34 
35 namespace libxcks
36 {
37 /*
38  * Though Whirlpool is endianness-neutral, the encryption tables are listed
39  * in BIG-ENDIAN format, which is adopted throughout this implementation
40  * (but little-endian notation would be equally suitable if consistently
41  * employed).
42  */
43 const uint64_t Whirlpool::C0[256] = {
44  UINT64_C(0x18186018c07830d8), UINT64_C(0x23238c2305af4626), UINT64_C(0xc6c63fc67ef991b8), UINT64_C(0xe8e887e8136fcdfb),
45  UINT64_C(0x878726874ca113cb), UINT64_C(0xb8b8dab8a9626d11), UINT64_C(0x0101040108050209), UINT64_C(0x4f4f214f426e9e0d),
46  UINT64_C(0x3636d836adee6c9b), UINT64_C(0xa6a6a2a6590451ff), UINT64_C(0xd2d26fd2debdb90c), UINT64_C(0xf5f5f3f5fb06f70e),
47  UINT64_C(0x7979f979ef80f296), UINT64_C(0x6f6fa16f5fcede30), UINT64_C(0x91917e91fcef3f6d), UINT64_C(0x52525552aa07a4f8),
48  UINT64_C(0x60609d6027fdc047), UINT64_C(0xbcbccabc89766535), UINT64_C(0x9b9b569baccd2b37), UINT64_C(0x8e8e028e048c018a),
49  UINT64_C(0xa3a3b6a371155bd2), UINT64_C(0x0c0c300c603c186c), UINT64_C(0x7b7bf17bff8af684), UINT64_C(0x3535d435b5e16a80),
50  UINT64_C(0x1d1d741de8693af5), UINT64_C(0xe0e0a7e05347ddb3), UINT64_C(0xd7d77bd7f6acb321), UINT64_C(0xc2c22fc25eed999c),
51  UINT64_C(0x2e2eb82e6d965c43), UINT64_C(0x4b4b314b627a9629), UINT64_C(0xfefedffea321e15d), UINT64_C(0x575741578216aed5),
52  UINT64_C(0x15155415a8412abd), UINT64_C(0x7777c1779fb6eee8), UINT64_C(0x3737dc37a5eb6e92), UINT64_C(0xe5e5b3e57b56d79e),
53  UINT64_C(0x9f9f469f8cd92313), UINT64_C(0xf0f0e7f0d317fd23), UINT64_C(0x4a4a354a6a7f9420), UINT64_C(0xdada4fda9e95a944),
54  UINT64_C(0x58587d58fa25b0a2), UINT64_C(0xc9c903c906ca8fcf), UINT64_C(0x2929a429558d527c), UINT64_C(0x0a0a280a5022145a),
55  UINT64_C(0xb1b1feb1e14f7f50), UINT64_C(0xa0a0baa0691a5dc9), UINT64_C(0x6b6bb16b7fdad614), UINT64_C(0x85852e855cab17d9),
56  UINT64_C(0xbdbdcebd8173673c), UINT64_C(0x5d5d695dd234ba8f), UINT64_C(0x1010401080502090), UINT64_C(0xf4f4f7f4f303f507),
57  UINT64_C(0xcbcb0bcb16c08bdd), UINT64_C(0x3e3ef83eedc67cd3), UINT64_C(0x0505140528110a2d), UINT64_C(0x676781671fe6ce78),
58  UINT64_C(0xe4e4b7e47353d597), UINT64_C(0x27279c2725bb4e02), UINT64_C(0x4141194132588273), UINT64_C(0x8b8b168b2c9d0ba7),
59  UINT64_C(0xa7a7a6a7510153f6), UINT64_C(0x7d7de97dcf94fab2), UINT64_C(0x95956e95dcfb3749), UINT64_C(0xd8d847d88e9fad56),
60  UINT64_C(0xfbfbcbfb8b30eb70), UINT64_C(0xeeee9fee2371c1cd), UINT64_C(0x7c7ced7cc791f8bb), UINT64_C(0x6666856617e3cc71),
61  UINT64_C(0xdddd53dda68ea77b), UINT64_C(0x17175c17b84b2eaf), UINT64_C(0x4747014702468e45), UINT64_C(0x9e9e429e84dc211a),
62  UINT64_C(0xcaca0fca1ec589d4), UINT64_C(0x2d2db42d75995a58), UINT64_C(0xbfbfc6bf9179632e), UINT64_C(0x07071c07381b0e3f),
63  UINT64_C(0xadad8ead012347ac), UINT64_C(0x5a5a755aea2fb4b0), UINT64_C(0x838336836cb51bef), UINT64_C(0x3333cc3385ff66b6),
64  UINT64_C(0x636391633ff2c65c), UINT64_C(0x02020802100a0412), UINT64_C(0xaaaa92aa39384993), UINT64_C(0x7171d971afa8e2de),
65  UINT64_C(0xc8c807c80ecf8dc6), UINT64_C(0x19196419c87d32d1), UINT64_C(0x494939497270923b), UINT64_C(0xd9d943d9869aaf5f),
66  UINT64_C(0xf2f2eff2c31df931), UINT64_C(0xe3e3abe34b48dba8), UINT64_C(0x5b5b715be22ab6b9), UINT64_C(0x88881a8834920dbc),
67  UINT64_C(0x9a9a529aa4c8293e), UINT64_C(0x262698262dbe4c0b), UINT64_C(0x3232c8328dfa64bf), UINT64_C(0xb0b0fab0e94a7d59),
68  UINT64_C(0xe9e983e91b6acff2), UINT64_C(0x0f0f3c0f78331e77), UINT64_C(0xd5d573d5e6a6b733), UINT64_C(0x80803a8074ba1df4),
69  UINT64_C(0xbebec2be997c6127), UINT64_C(0xcdcd13cd26de87eb), UINT64_C(0x3434d034bde46889), UINT64_C(0x48483d487a759032),
70  UINT64_C(0xffffdbffab24e354), UINT64_C(0x7a7af57af78ff48d), UINT64_C(0x90907a90f4ea3d64), UINT64_C(0x5f5f615fc23ebe9d),
71  UINT64_C(0x202080201da0403d), UINT64_C(0x6868bd6867d5d00f), UINT64_C(0x1a1a681ad07234ca), UINT64_C(0xaeae82ae192c41b7),
72  UINT64_C(0xb4b4eab4c95e757d), UINT64_C(0x54544d549a19a8ce), UINT64_C(0x93937693ece53b7f), UINT64_C(0x222288220daa442f),
73  UINT64_C(0x64648d6407e9c863), UINT64_C(0xf1f1e3f1db12ff2a), UINT64_C(0x7373d173bfa2e6cc), UINT64_C(0x12124812905a2482),
74  UINT64_C(0x40401d403a5d807a), UINT64_C(0x0808200840281048), UINT64_C(0xc3c32bc356e89b95), UINT64_C(0xecec97ec337bc5df),
75  UINT64_C(0xdbdb4bdb9690ab4d), UINT64_C(0xa1a1bea1611f5fc0), UINT64_C(0x8d8d0e8d1c830791), UINT64_C(0x3d3df43df5c97ac8),
76  UINT64_C(0x97976697ccf1335b), UINT64_C(0x0000000000000000), UINT64_C(0xcfcf1bcf36d483f9), UINT64_C(0x2b2bac2b4587566e),
77  UINT64_C(0x7676c57697b3ece1), UINT64_C(0x8282328264b019e6), UINT64_C(0xd6d67fd6fea9b128), UINT64_C(0x1b1b6c1bd87736c3),
78  UINT64_C(0xb5b5eeb5c15b7774), UINT64_C(0xafaf86af112943be), UINT64_C(0x6a6ab56a77dfd41d), UINT64_C(0x50505d50ba0da0ea),
79  UINT64_C(0x45450945124c8a57), UINT64_C(0xf3f3ebf3cb18fb38), UINT64_C(0x3030c0309df060ad), UINT64_C(0xefef9bef2b74c3c4),
80  UINT64_C(0x3f3ffc3fe5c37eda), UINT64_C(0x55554955921caac7), UINT64_C(0xa2a2b2a2791059db), UINT64_C(0xeaea8fea0365c9e9),
81  UINT64_C(0x656589650fecca6a), UINT64_C(0xbabad2bab9686903), UINT64_C(0x2f2fbc2f65935e4a), UINT64_C(0xc0c027c04ee79d8e),
82  UINT64_C(0xdede5fdebe81a160), UINT64_C(0x1c1c701ce06c38fc), UINT64_C(0xfdfdd3fdbb2ee746), UINT64_C(0x4d4d294d52649a1f),
83  UINT64_C(0x92927292e4e03976), UINT64_C(0x7575c9758fbceafa), UINT64_C(0x06061806301e0c36), UINT64_C(0x8a8a128a249809ae),
84  UINT64_C(0xb2b2f2b2f940794b), UINT64_C(0xe6e6bfe66359d185), UINT64_C(0x0e0e380e70361c7e), UINT64_C(0x1f1f7c1ff8633ee7),
85  UINT64_C(0x6262956237f7c455), UINT64_C(0xd4d477d4eea3b53a), UINT64_C(0xa8a89aa829324d81), UINT64_C(0x96966296c4f43152),
86  UINT64_C(0xf9f9c3f99b3aef62), UINT64_C(0xc5c533c566f697a3), UINT64_C(0x2525942535b14a10), UINT64_C(0x59597959f220b2ab),
87  UINT64_C(0x84842a8454ae15d0), UINT64_C(0x7272d572b7a7e4c5), UINT64_C(0x3939e439d5dd72ec), UINT64_C(0x4c4c2d4c5a619816),
88  UINT64_C(0x5e5e655eca3bbc94), UINT64_C(0x7878fd78e785f09f), UINT64_C(0x3838e038ddd870e5), UINT64_C(0x8c8c0a8c14860598),
89  UINT64_C(0xd1d163d1c6b2bf17), UINT64_C(0xa5a5aea5410b57e4), UINT64_C(0xe2e2afe2434dd9a1), UINT64_C(0x616199612ff8c24e),
90  UINT64_C(0xb3b3f6b3f1457b42), UINT64_C(0x2121842115a54234), UINT64_C(0x9c9c4a9c94d62508), UINT64_C(0x1e1e781ef0663cee),
91  UINT64_C(0x4343114322528661), UINT64_C(0xc7c73bc776fc93b1), UINT64_C(0xfcfcd7fcb32be54f), UINT64_C(0x0404100420140824),
92  UINT64_C(0x51515951b208a2e3), UINT64_C(0x99995e99bcc72f25), UINT64_C(0x6d6da96d4fc4da22), UINT64_C(0x0d0d340d68391a65),
93  UINT64_C(0xfafacffa8335e979), UINT64_C(0xdfdf5bdfb684a369), UINT64_C(0x7e7ee57ed79bfca9), UINT64_C(0x242490243db44819),
94  UINT64_C(0x3b3bec3bc5d776fe), UINT64_C(0xabab96ab313d4b9a), UINT64_C(0xcece1fce3ed181f0), UINT64_C(0x1111441188552299),
95  UINT64_C(0x8f8f068f0c890383), UINT64_C(0x4e4e254e4a6b9c04), UINT64_C(0xb7b7e6b7d1517366), UINT64_C(0xebeb8beb0b60cbe0),
96  UINT64_C(0x3c3cf03cfdcc78c1), UINT64_C(0x81813e817cbf1ffd), UINT64_C(0x94946a94d4fe3540), UINT64_C(0xf7f7fbf7eb0cf31c),
97  UINT64_C(0xb9b9deb9a1676f18), UINT64_C(0x13134c13985f268b), UINT64_C(0x2c2cb02c7d9c5851), UINT64_C(0xd3d36bd3d6b8bb05),
98  UINT64_C(0xe7e7bbe76b5cd38c), UINT64_C(0x6e6ea56e57cbdc39), UINT64_C(0xc4c437c46ef395aa), UINT64_C(0x03030c03180f061b),
99  UINT64_C(0x565645568a13acdc), UINT64_C(0x44440d441a49885e), UINT64_C(0x7f7fe17fdf9efea0), UINT64_C(0xa9a99ea921374f88),
100  UINT64_C(0x2a2aa82a4d825467), UINT64_C(0xbbbbd6bbb16d6b0a), UINT64_C(0xc1c123c146e29f87), UINT64_C(0x53535153a202a6f1),
101  UINT64_C(0xdcdc57dcae8ba572), UINT64_C(0x0b0b2c0b58271653), UINT64_C(0x9d9d4e9d9cd32701), UINT64_C(0x6c6cad6c47c1d82b),
102  UINT64_C(0x3131c43195f562a4), UINT64_C(0x7474cd7487b9e8f3), UINT64_C(0xf6f6fff6e309f115), UINT64_C(0x464605460a438c4c),
103  UINT64_C(0xacac8aac092645a5), UINT64_C(0x89891e893c970fb5), UINT64_C(0x14145014a04428b4), UINT64_C(0xe1e1a3e15b42dfba),
104  UINT64_C(0x16165816b04e2ca6), UINT64_C(0x3a3ae83acdd274f7), UINT64_C(0x6969b9696fd0d206), UINT64_C(0x09092409482d1241),
105  UINT64_C(0x7070dd70a7ade0d7), UINT64_C(0xb6b6e2b6d954716f), UINT64_C(0xd0d067d0ceb7bd1e), UINT64_C(0xeded93ed3b7ec7d6),
106  UINT64_C(0xcccc17cc2edb85e2), UINT64_C(0x424215422a578468), UINT64_C(0x98985a98b4c22d2c), UINT64_C(0xa4a4aaa4490e55ed),
107  UINT64_C(0x2828a0285d885075), UINT64_C(0x5c5c6d5cda31b886), UINT64_C(0xf8f8c7f8933fed6b), UINT64_C(0x8686228644a411c2)
108 };
109 
110 const uint64_t Whirlpool::C1[256] = {
111  UINT64_C(0xd818186018c07830), UINT64_C(0x2623238c2305af46), UINT64_C(0xb8c6c63fc67ef991), UINT64_C(0xfbe8e887e8136fcd),
112  UINT64_C(0xcb878726874ca113), UINT64_C(0x11b8b8dab8a9626d), UINT64_C(0x0901010401080502), UINT64_C(0x0d4f4f214f426e9e),
113  UINT64_C(0x9b3636d836adee6c), UINT64_C(0xffa6a6a2a6590451), UINT64_C(0x0cd2d26fd2debdb9), UINT64_C(0x0ef5f5f3f5fb06f7),
114  UINT64_C(0x967979f979ef80f2), UINT64_C(0x306f6fa16f5fcede), UINT64_C(0x6d91917e91fcef3f), UINT64_C(0xf852525552aa07a4),
115  UINT64_C(0x4760609d6027fdc0), UINT64_C(0x35bcbccabc897665), UINT64_C(0x379b9b569baccd2b), UINT64_C(0x8a8e8e028e048c01),
116  UINT64_C(0xd2a3a3b6a371155b), UINT64_C(0x6c0c0c300c603c18), UINT64_C(0x847b7bf17bff8af6), UINT64_C(0x803535d435b5e16a),
117  UINT64_C(0xf51d1d741de8693a), UINT64_C(0xb3e0e0a7e05347dd), UINT64_C(0x21d7d77bd7f6acb3), UINT64_C(0x9cc2c22fc25eed99),
118  UINT64_C(0x432e2eb82e6d965c), UINT64_C(0x294b4b314b627a96), UINT64_C(0x5dfefedffea321e1), UINT64_C(0xd5575741578216ae),
119  UINT64_C(0xbd15155415a8412a), UINT64_C(0xe87777c1779fb6ee), UINT64_C(0x923737dc37a5eb6e), UINT64_C(0x9ee5e5b3e57b56d7),
120  UINT64_C(0x139f9f469f8cd923), UINT64_C(0x23f0f0e7f0d317fd), UINT64_C(0x204a4a354a6a7f94), UINT64_C(0x44dada4fda9e95a9),
121  UINT64_C(0xa258587d58fa25b0), UINT64_C(0xcfc9c903c906ca8f), UINT64_C(0x7c2929a429558d52), UINT64_C(0x5a0a0a280a502214),
122  UINT64_C(0x50b1b1feb1e14f7f), UINT64_C(0xc9a0a0baa0691a5d), UINT64_C(0x146b6bb16b7fdad6), UINT64_C(0xd985852e855cab17),
123  UINT64_C(0x3cbdbdcebd817367), UINT64_C(0x8f5d5d695dd234ba), UINT64_C(0x9010104010805020), UINT64_C(0x07f4f4f7f4f303f5),
124  UINT64_C(0xddcbcb0bcb16c08b), UINT64_C(0xd33e3ef83eedc67c), UINT64_C(0x2d0505140528110a), UINT64_C(0x78676781671fe6ce),
125  UINT64_C(0x97e4e4b7e47353d5), UINT64_C(0x0227279c2725bb4e), UINT64_C(0x7341411941325882), UINT64_C(0xa78b8b168b2c9d0b),
126  UINT64_C(0xf6a7a7a6a7510153), UINT64_C(0xb27d7de97dcf94fa), UINT64_C(0x4995956e95dcfb37), UINT64_C(0x56d8d847d88e9fad),
127  UINT64_C(0x70fbfbcbfb8b30eb), UINT64_C(0xcdeeee9fee2371c1), UINT64_C(0xbb7c7ced7cc791f8), UINT64_C(0x716666856617e3cc),
128  UINT64_C(0x7bdddd53dda68ea7), UINT64_C(0xaf17175c17b84b2e), UINT64_C(0x454747014702468e), UINT64_C(0x1a9e9e429e84dc21),
129  UINT64_C(0xd4caca0fca1ec589), UINT64_C(0x582d2db42d75995a), UINT64_C(0x2ebfbfc6bf917963), UINT64_C(0x3f07071c07381b0e),
130  UINT64_C(0xacadad8ead012347), UINT64_C(0xb05a5a755aea2fb4), UINT64_C(0xef838336836cb51b), UINT64_C(0xb63333cc3385ff66),
131  UINT64_C(0x5c636391633ff2c6), UINT64_C(0x1202020802100a04), UINT64_C(0x93aaaa92aa393849), UINT64_C(0xde7171d971afa8e2),
132  UINT64_C(0xc6c8c807c80ecf8d), UINT64_C(0xd119196419c87d32), UINT64_C(0x3b49493949727092), UINT64_C(0x5fd9d943d9869aaf),
133  UINT64_C(0x31f2f2eff2c31df9), UINT64_C(0xa8e3e3abe34b48db), UINT64_C(0xb95b5b715be22ab6), UINT64_C(0xbc88881a8834920d),
134  UINT64_C(0x3e9a9a529aa4c829), UINT64_C(0x0b262698262dbe4c), UINT64_C(0xbf3232c8328dfa64), UINT64_C(0x59b0b0fab0e94a7d),
135  UINT64_C(0xf2e9e983e91b6acf), UINT64_C(0x770f0f3c0f78331e), UINT64_C(0x33d5d573d5e6a6b7), UINT64_C(0xf480803a8074ba1d),
136  UINT64_C(0x27bebec2be997c61), UINT64_C(0xebcdcd13cd26de87), UINT64_C(0x893434d034bde468), UINT64_C(0x3248483d487a7590),
137  UINT64_C(0x54ffffdbffab24e3), UINT64_C(0x8d7a7af57af78ff4), UINT64_C(0x6490907a90f4ea3d), UINT64_C(0x9d5f5f615fc23ebe),
138  UINT64_C(0x3d202080201da040), UINT64_C(0x0f6868bd6867d5d0), UINT64_C(0xca1a1a681ad07234), UINT64_C(0xb7aeae82ae192c41),
139  UINT64_C(0x7db4b4eab4c95e75), UINT64_C(0xce54544d549a19a8), UINT64_C(0x7f93937693ece53b), UINT64_C(0x2f222288220daa44),
140  UINT64_C(0x6364648d6407e9c8), UINT64_C(0x2af1f1e3f1db12ff), UINT64_C(0xcc7373d173bfa2e6), UINT64_C(0x8212124812905a24),
141  UINT64_C(0x7a40401d403a5d80), UINT64_C(0x4808082008402810), UINT64_C(0x95c3c32bc356e89b), UINT64_C(0xdfecec97ec337bc5),
142  UINT64_C(0x4ddbdb4bdb9690ab), UINT64_C(0xc0a1a1bea1611f5f), UINT64_C(0x918d8d0e8d1c8307), UINT64_C(0xc83d3df43df5c97a),
143  UINT64_C(0x5b97976697ccf133), UINT64_C(0x0000000000000000), UINT64_C(0xf9cfcf1bcf36d483), UINT64_C(0x6e2b2bac2b458756),
144  UINT64_C(0xe17676c57697b3ec), UINT64_C(0xe68282328264b019), UINT64_C(0x28d6d67fd6fea9b1), UINT64_C(0xc31b1b6c1bd87736),
145  UINT64_C(0x74b5b5eeb5c15b77), UINT64_C(0xbeafaf86af112943), UINT64_C(0x1d6a6ab56a77dfd4), UINT64_C(0xea50505d50ba0da0),
146  UINT64_C(0x5745450945124c8a), UINT64_C(0x38f3f3ebf3cb18fb), UINT64_C(0xad3030c0309df060), UINT64_C(0xc4efef9bef2b74c3),
147  UINT64_C(0xda3f3ffc3fe5c37e), UINT64_C(0xc755554955921caa), UINT64_C(0xdba2a2b2a2791059), UINT64_C(0xe9eaea8fea0365c9),
148  UINT64_C(0x6a656589650fecca), UINT64_C(0x03babad2bab96869), UINT64_C(0x4a2f2fbc2f65935e), UINT64_C(0x8ec0c027c04ee79d),
149  UINT64_C(0x60dede5fdebe81a1), UINT64_C(0xfc1c1c701ce06c38), UINT64_C(0x46fdfdd3fdbb2ee7), UINT64_C(0x1f4d4d294d52649a),
150  UINT64_C(0x7692927292e4e039), UINT64_C(0xfa7575c9758fbcea), UINT64_C(0x3606061806301e0c), UINT64_C(0xae8a8a128a249809),
151  UINT64_C(0x4bb2b2f2b2f94079), UINT64_C(0x85e6e6bfe66359d1), UINT64_C(0x7e0e0e380e70361c), UINT64_C(0xe71f1f7c1ff8633e),
152  UINT64_C(0x556262956237f7c4), UINT64_C(0x3ad4d477d4eea3b5), UINT64_C(0x81a8a89aa829324d), UINT64_C(0x5296966296c4f431),
153  UINT64_C(0x62f9f9c3f99b3aef), UINT64_C(0xa3c5c533c566f697), UINT64_C(0x102525942535b14a), UINT64_C(0xab59597959f220b2),
154  UINT64_C(0xd084842a8454ae15), UINT64_C(0xc57272d572b7a7e4), UINT64_C(0xec3939e439d5dd72), UINT64_C(0x164c4c2d4c5a6198),
155  UINT64_C(0x945e5e655eca3bbc), UINT64_C(0x9f7878fd78e785f0), UINT64_C(0xe53838e038ddd870), UINT64_C(0x988c8c0a8c148605),
156  UINT64_C(0x17d1d163d1c6b2bf), UINT64_C(0xe4a5a5aea5410b57), UINT64_C(0xa1e2e2afe2434dd9), UINT64_C(0x4e616199612ff8c2),
157  UINT64_C(0x42b3b3f6b3f1457b), UINT64_C(0x342121842115a542), UINT64_C(0x089c9c4a9c94d625), UINT64_C(0xee1e1e781ef0663c),
158  UINT64_C(0x6143431143225286), UINT64_C(0xb1c7c73bc776fc93), UINT64_C(0x4ffcfcd7fcb32be5), UINT64_C(0x2404041004201408),
159  UINT64_C(0xe351515951b208a2), UINT64_C(0x2599995e99bcc72f), UINT64_C(0x226d6da96d4fc4da), UINT64_C(0x650d0d340d68391a),
160  UINT64_C(0x79fafacffa8335e9), UINT64_C(0x69dfdf5bdfb684a3), UINT64_C(0xa97e7ee57ed79bfc), UINT64_C(0x19242490243db448),
161  UINT64_C(0xfe3b3bec3bc5d776), UINT64_C(0x9aabab96ab313d4b), UINT64_C(0xf0cece1fce3ed181), UINT64_C(0x9911114411885522),
162  UINT64_C(0x838f8f068f0c8903), UINT64_C(0x044e4e254e4a6b9c), UINT64_C(0x66b7b7e6b7d15173), UINT64_C(0xe0ebeb8beb0b60cb),
163  UINT64_C(0xc13c3cf03cfdcc78), UINT64_C(0xfd81813e817cbf1f), UINT64_C(0x4094946a94d4fe35), UINT64_C(0x1cf7f7fbf7eb0cf3),
164  UINT64_C(0x18b9b9deb9a1676f), UINT64_C(0x8b13134c13985f26), UINT64_C(0x512c2cb02c7d9c58), UINT64_C(0x05d3d36bd3d6b8bb),
165  UINT64_C(0x8ce7e7bbe76b5cd3), UINT64_C(0x396e6ea56e57cbdc), UINT64_C(0xaac4c437c46ef395), UINT64_C(0x1b03030c03180f06),
166  UINT64_C(0xdc565645568a13ac), UINT64_C(0x5e44440d441a4988), UINT64_C(0xa07f7fe17fdf9efe), UINT64_C(0x88a9a99ea921374f),
167  UINT64_C(0x672a2aa82a4d8254), UINT64_C(0x0abbbbd6bbb16d6b), UINT64_C(0x87c1c123c146e29f), UINT64_C(0xf153535153a202a6),
168  UINT64_C(0x72dcdc57dcae8ba5), UINT64_C(0x530b0b2c0b582716), UINT64_C(0x019d9d4e9d9cd327), UINT64_C(0x2b6c6cad6c47c1d8),
169  UINT64_C(0xa43131c43195f562), UINT64_C(0xf37474cd7487b9e8), UINT64_C(0x15f6f6fff6e309f1), UINT64_C(0x4c464605460a438c),
170  UINT64_C(0xa5acac8aac092645), UINT64_C(0xb589891e893c970f), UINT64_C(0xb414145014a04428), UINT64_C(0xbae1e1a3e15b42df),
171  UINT64_C(0xa616165816b04e2c), UINT64_C(0xf73a3ae83acdd274), UINT64_C(0x066969b9696fd0d2), UINT64_C(0x4109092409482d12),
172  UINT64_C(0xd77070dd70a7ade0), UINT64_C(0x6fb6b6e2b6d95471), UINT64_C(0x1ed0d067d0ceb7bd), UINT64_C(0xd6eded93ed3b7ec7),
173  UINT64_C(0xe2cccc17cc2edb85), UINT64_C(0x68424215422a5784), UINT64_C(0x2c98985a98b4c22d), UINT64_C(0xeda4a4aaa4490e55),
174  UINT64_C(0x752828a0285d8850), UINT64_C(0x865c5c6d5cda31b8), UINT64_C(0x6bf8f8c7f8933fed), UINT64_C(0xc28686228644a411)
175 };
176 
177 const uint64_t Whirlpool::C2[256] = {
178  UINT64_C(0x30d818186018c078), UINT64_C(0x462623238c2305af), UINT64_C(0x91b8c6c63fc67ef9), UINT64_C(0xcdfbe8e887e8136f),
179  UINT64_C(0x13cb878726874ca1), UINT64_C(0x6d11b8b8dab8a962), UINT64_C(0x0209010104010805), UINT64_C(0x9e0d4f4f214f426e),
180  UINT64_C(0x6c9b3636d836adee), UINT64_C(0x51ffa6a6a2a65904), UINT64_C(0xb90cd2d26fd2debd), UINT64_C(0xf70ef5f5f3f5fb06),
181  UINT64_C(0xf2967979f979ef80), UINT64_C(0xde306f6fa16f5fce), UINT64_C(0x3f6d91917e91fcef), UINT64_C(0xa4f852525552aa07),
182  UINT64_C(0xc04760609d6027fd), UINT64_C(0x6535bcbccabc8976), UINT64_C(0x2b379b9b569baccd), UINT64_C(0x018a8e8e028e048c),
183  UINT64_C(0x5bd2a3a3b6a37115), UINT64_C(0x186c0c0c300c603c), UINT64_C(0xf6847b7bf17bff8a), UINT64_C(0x6a803535d435b5e1),
184  UINT64_C(0x3af51d1d741de869), UINT64_C(0xddb3e0e0a7e05347), UINT64_C(0xb321d7d77bd7f6ac), UINT64_C(0x999cc2c22fc25eed),
185  UINT64_C(0x5c432e2eb82e6d96), UINT64_C(0x96294b4b314b627a), UINT64_C(0xe15dfefedffea321), UINT64_C(0xaed5575741578216),
186  UINT64_C(0x2abd15155415a841), UINT64_C(0xeee87777c1779fb6), UINT64_C(0x6e923737dc37a5eb), UINT64_C(0xd79ee5e5b3e57b56),
187  UINT64_C(0x23139f9f469f8cd9), UINT64_C(0xfd23f0f0e7f0d317), UINT64_C(0x94204a4a354a6a7f), UINT64_C(0xa944dada4fda9e95),
188  UINT64_C(0xb0a258587d58fa25), UINT64_C(0x8fcfc9c903c906ca), UINT64_C(0x527c2929a429558d), UINT64_C(0x145a0a0a280a5022),
189  UINT64_C(0x7f50b1b1feb1e14f), UINT64_C(0x5dc9a0a0baa0691a), UINT64_C(0xd6146b6bb16b7fda), UINT64_C(0x17d985852e855cab),
190  UINT64_C(0x673cbdbdcebd8173), UINT64_C(0xba8f5d5d695dd234), UINT64_C(0x2090101040108050), UINT64_C(0xf507f4f4f7f4f303),
191  UINT64_C(0x8bddcbcb0bcb16c0), UINT64_C(0x7cd33e3ef83eedc6), UINT64_C(0x0a2d050514052811), UINT64_C(0xce78676781671fe6),
192  UINT64_C(0xd597e4e4b7e47353), UINT64_C(0x4e0227279c2725bb), UINT64_C(0x8273414119413258), UINT64_C(0x0ba78b8b168b2c9d),
193  UINT64_C(0x53f6a7a7a6a75101), UINT64_C(0xfab27d7de97dcf94), UINT64_C(0x374995956e95dcfb), UINT64_C(0xad56d8d847d88e9f),
194  UINT64_C(0xeb70fbfbcbfb8b30), UINT64_C(0xc1cdeeee9fee2371), UINT64_C(0xf8bb7c7ced7cc791), UINT64_C(0xcc716666856617e3),
195  UINT64_C(0xa77bdddd53dda68e), UINT64_C(0x2eaf17175c17b84b), UINT64_C(0x8e45474701470246), UINT64_C(0x211a9e9e429e84dc),
196  UINT64_C(0x89d4caca0fca1ec5), UINT64_C(0x5a582d2db42d7599), UINT64_C(0x632ebfbfc6bf9179), UINT64_C(0x0e3f07071c07381b),
197  UINT64_C(0x47acadad8ead0123), UINT64_C(0xb4b05a5a755aea2f), UINT64_C(0x1bef838336836cb5), UINT64_C(0x66b63333cc3385ff),
198  UINT64_C(0xc65c636391633ff2), UINT64_C(0x041202020802100a), UINT64_C(0x4993aaaa92aa3938), UINT64_C(0xe2de7171d971afa8),
199  UINT64_C(0x8dc6c8c807c80ecf), UINT64_C(0x32d119196419c87d), UINT64_C(0x923b494939497270), UINT64_C(0xaf5fd9d943d9869a),
200  UINT64_C(0xf931f2f2eff2c31d), UINT64_C(0xdba8e3e3abe34b48), UINT64_C(0xb6b95b5b715be22a), UINT64_C(0x0dbc88881a883492),
201  UINT64_C(0x293e9a9a529aa4c8), UINT64_C(0x4c0b262698262dbe), UINT64_C(0x64bf3232c8328dfa), UINT64_C(0x7d59b0b0fab0e94a),
202  UINT64_C(0xcff2e9e983e91b6a), UINT64_C(0x1e770f0f3c0f7833), UINT64_C(0xb733d5d573d5e6a6), UINT64_C(0x1df480803a8074ba),
203  UINT64_C(0x6127bebec2be997c), UINT64_C(0x87ebcdcd13cd26de), UINT64_C(0x68893434d034bde4), UINT64_C(0x903248483d487a75),
204  UINT64_C(0xe354ffffdbffab24), UINT64_C(0xf48d7a7af57af78f), UINT64_C(0x3d6490907a90f4ea), UINT64_C(0xbe9d5f5f615fc23e),
205  UINT64_C(0x403d202080201da0), UINT64_C(0xd00f6868bd6867d5), UINT64_C(0x34ca1a1a681ad072), UINT64_C(0x41b7aeae82ae192c),
206  UINT64_C(0x757db4b4eab4c95e), UINT64_C(0xa8ce54544d549a19), UINT64_C(0x3b7f93937693ece5), UINT64_C(0x442f222288220daa),
207  UINT64_C(0xc86364648d6407e9), UINT64_C(0xff2af1f1e3f1db12), UINT64_C(0xe6cc7373d173bfa2), UINT64_C(0x248212124812905a),
208  UINT64_C(0x807a40401d403a5d), UINT64_C(0x1048080820084028), UINT64_C(0x9b95c3c32bc356e8), UINT64_C(0xc5dfecec97ec337b),
209  UINT64_C(0xab4ddbdb4bdb9690), UINT64_C(0x5fc0a1a1bea1611f), UINT64_C(0x07918d8d0e8d1c83), UINT64_C(0x7ac83d3df43df5c9),
210  UINT64_C(0x335b97976697ccf1), UINT64_C(0x0000000000000000), UINT64_C(0x83f9cfcf1bcf36d4), UINT64_C(0x566e2b2bac2b4587),
211  UINT64_C(0xece17676c57697b3), UINT64_C(0x19e68282328264b0), UINT64_C(0xb128d6d67fd6fea9), UINT64_C(0x36c31b1b6c1bd877),
212  UINT64_C(0x7774b5b5eeb5c15b), UINT64_C(0x43beafaf86af1129), UINT64_C(0xd41d6a6ab56a77df), UINT64_C(0xa0ea50505d50ba0d),
213  UINT64_C(0x8a5745450945124c), UINT64_C(0xfb38f3f3ebf3cb18), UINT64_C(0x60ad3030c0309df0), UINT64_C(0xc3c4efef9bef2b74),
214  UINT64_C(0x7eda3f3ffc3fe5c3), UINT64_C(0xaac755554955921c), UINT64_C(0x59dba2a2b2a27910), UINT64_C(0xc9e9eaea8fea0365),
215  UINT64_C(0xca6a656589650fec), UINT64_C(0x6903babad2bab968), UINT64_C(0x5e4a2f2fbc2f6593), UINT64_C(0x9d8ec0c027c04ee7),
216  UINT64_C(0xa160dede5fdebe81), UINT64_C(0x38fc1c1c701ce06c), UINT64_C(0xe746fdfdd3fdbb2e), UINT64_C(0x9a1f4d4d294d5264),
217  UINT64_C(0x397692927292e4e0), UINT64_C(0xeafa7575c9758fbc), UINT64_C(0x0c3606061806301e), UINT64_C(0x09ae8a8a128a2498),
218  UINT64_C(0x794bb2b2f2b2f940), UINT64_C(0xd185e6e6bfe66359), UINT64_C(0x1c7e0e0e380e7036), UINT64_C(0x3ee71f1f7c1ff863),
219  UINT64_C(0xc4556262956237f7), UINT64_C(0xb53ad4d477d4eea3), UINT64_C(0x4d81a8a89aa82932), UINT64_C(0x315296966296c4f4),
220  UINT64_C(0xef62f9f9c3f99b3a), UINT64_C(0x97a3c5c533c566f6), UINT64_C(0x4a102525942535b1), UINT64_C(0xb2ab59597959f220),
221  UINT64_C(0x15d084842a8454ae), UINT64_C(0xe4c57272d572b7a7), UINT64_C(0x72ec3939e439d5dd), UINT64_C(0x98164c4c2d4c5a61),
222  UINT64_C(0xbc945e5e655eca3b), UINT64_C(0xf09f7878fd78e785), UINT64_C(0x70e53838e038ddd8), UINT64_C(0x05988c8c0a8c1486),
223  UINT64_C(0xbf17d1d163d1c6b2), UINT64_C(0x57e4a5a5aea5410b), UINT64_C(0xd9a1e2e2afe2434d), UINT64_C(0xc24e616199612ff8),
224  UINT64_C(0x7b42b3b3f6b3f145), UINT64_C(0x42342121842115a5), UINT64_C(0x25089c9c4a9c94d6), UINT64_C(0x3cee1e1e781ef066),
225  UINT64_C(0x8661434311432252), UINT64_C(0x93b1c7c73bc776fc), UINT64_C(0xe54ffcfcd7fcb32b), UINT64_C(0x0824040410042014),
226  UINT64_C(0xa2e351515951b208), UINT64_C(0x2f2599995e99bcc7), UINT64_C(0xda226d6da96d4fc4), UINT64_C(0x1a650d0d340d6839),
227  UINT64_C(0xe979fafacffa8335), UINT64_C(0xa369dfdf5bdfb684), UINT64_C(0xfca97e7ee57ed79b), UINT64_C(0x4819242490243db4),
228  UINT64_C(0x76fe3b3bec3bc5d7), UINT64_C(0x4b9aabab96ab313d), UINT64_C(0x81f0cece1fce3ed1), UINT64_C(0x2299111144118855),
229  UINT64_C(0x03838f8f068f0c89), UINT64_C(0x9c044e4e254e4a6b), UINT64_C(0x7366b7b7e6b7d151), UINT64_C(0xcbe0ebeb8beb0b60),
230  UINT64_C(0x78c13c3cf03cfdcc), UINT64_C(0x1ffd81813e817cbf), UINT64_C(0x354094946a94d4fe), UINT64_C(0xf31cf7f7fbf7eb0c),
231  UINT64_C(0x6f18b9b9deb9a167), UINT64_C(0x268b13134c13985f), UINT64_C(0x58512c2cb02c7d9c), UINT64_C(0xbb05d3d36bd3d6b8),
232  UINT64_C(0xd38ce7e7bbe76b5c), UINT64_C(0xdc396e6ea56e57cb), UINT64_C(0x95aac4c437c46ef3), UINT64_C(0x061b03030c03180f),
233  UINT64_C(0xacdc565645568a13), UINT64_C(0x885e44440d441a49), UINT64_C(0xfea07f7fe17fdf9e), UINT64_C(0x4f88a9a99ea92137),
234  UINT64_C(0x54672a2aa82a4d82), UINT64_C(0x6b0abbbbd6bbb16d), UINT64_C(0x9f87c1c123c146e2), UINT64_C(0xa6f153535153a202),
235  UINT64_C(0xa572dcdc57dcae8b), UINT64_C(0x16530b0b2c0b5827), UINT64_C(0x27019d9d4e9d9cd3), UINT64_C(0xd82b6c6cad6c47c1),
236  UINT64_C(0x62a43131c43195f5), UINT64_C(0xe8f37474cd7487b9), UINT64_C(0xf115f6f6fff6e309), UINT64_C(0x8c4c464605460a43),
237  UINT64_C(0x45a5acac8aac0926), UINT64_C(0x0fb589891e893c97), UINT64_C(0x28b414145014a044), UINT64_C(0xdfbae1e1a3e15b42),
238  UINT64_C(0x2ca616165816b04e), UINT64_C(0x74f73a3ae83acdd2), UINT64_C(0xd2066969b9696fd0), UINT64_C(0x124109092409482d),
239  UINT64_C(0xe0d77070dd70a7ad), UINT64_C(0x716fb6b6e2b6d954), UINT64_C(0xbd1ed0d067d0ceb7), UINT64_C(0xc7d6eded93ed3b7e),
240  UINT64_C(0x85e2cccc17cc2edb), UINT64_C(0x8468424215422a57), UINT64_C(0x2d2c98985a98b4c2), UINT64_C(0x55eda4a4aaa4490e),
241  UINT64_C(0x50752828a0285d88), UINT64_C(0xb8865c5c6d5cda31), UINT64_C(0xed6bf8f8c7f8933f), UINT64_C(0x11c28686228644a4)
242 };
243 
244 const uint64_t Whirlpool::C3[256] = {
245  UINT64_C(0x7830d818186018c0), UINT64_C(0xaf462623238c2305), UINT64_C(0xf991b8c6c63fc67e), UINT64_C(0x6fcdfbe8e887e813),
246  UINT64_C(0xa113cb878726874c), UINT64_C(0x626d11b8b8dab8a9), UINT64_C(0x0502090101040108), UINT64_C(0x6e9e0d4f4f214f42),
247  UINT64_C(0xee6c9b3636d836ad), UINT64_C(0x0451ffa6a6a2a659), UINT64_C(0xbdb90cd2d26fd2de), UINT64_C(0x06f70ef5f5f3f5fb),
248  UINT64_C(0x80f2967979f979ef), UINT64_C(0xcede306f6fa16f5f), UINT64_C(0xef3f6d91917e91fc), UINT64_C(0x07a4f852525552aa),
249  UINT64_C(0xfdc04760609d6027), UINT64_C(0x766535bcbccabc89), UINT64_C(0xcd2b379b9b569bac), UINT64_C(0x8c018a8e8e028e04),
250  UINT64_C(0x155bd2a3a3b6a371), UINT64_C(0x3c186c0c0c300c60), UINT64_C(0x8af6847b7bf17bff), UINT64_C(0xe16a803535d435b5),
251  UINT64_C(0x693af51d1d741de8), UINT64_C(0x47ddb3e0e0a7e053), UINT64_C(0xacb321d7d77bd7f6), UINT64_C(0xed999cc2c22fc25e),
252  UINT64_C(0x965c432e2eb82e6d), UINT64_C(0x7a96294b4b314b62), UINT64_C(0x21e15dfefedffea3), UINT64_C(0x16aed55757415782),
253  UINT64_C(0x412abd15155415a8), UINT64_C(0xb6eee87777c1779f), UINT64_C(0xeb6e923737dc37a5), UINT64_C(0x56d79ee5e5b3e57b),
254  UINT64_C(0xd923139f9f469f8c), UINT64_C(0x17fd23f0f0e7f0d3), UINT64_C(0x7f94204a4a354a6a), UINT64_C(0x95a944dada4fda9e),
255  UINT64_C(0x25b0a258587d58fa), UINT64_C(0xca8fcfc9c903c906), UINT64_C(0x8d527c2929a42955), UINT64_C(0x22145a0a0a280a50),
256  UINT64_C(0x4f7f50b1b1feb1e1), UINT64_C(0x1a5dc9a0a0baa069), UINT64_C(0xdad6146b6bb16b7f), UINT64_C(0xab17d985852e855c),
257  UINT64_C(0x73673cbdbdcebd81), UINT64_C(0x34ba8f5d5d695dd2), UINT64_C(0x5020901010401080), UINT64_C(0x03f507f4f4f7f4f3),
258  UINT64_C(0xc08bddcbcb0bcb16), UINT64_C(0xc67cd33e3ef83eed), UINT64_C(0x110a2d0505140528), UINT64_C(0xe6ce78676781671f),
259  UINT64_C(0x53d597e4e4b7e473), UINT64_C(0xbb4e0227279c2725), UINT64_C(0x5882734141194132), UINT64_C(0x9d0ba78b8b168b2c),
260  UINT64_C(0x0153f6a7a7a6a751), UINT64_C(0x94fab27d7de97dcf), UINT64_C(0xfb374995956e95dc), UINT64_C(0x9fad56d8d847d88e),
261  UINT64_C(0x30eb70fbfbcbfb8b), UINT64_C(0x71c1cdeeee9fee23), UINT64_C(0x91f8bb7c7ced7cc7), UINT64_C(0xe3cc716666856617),
262  UINT64_C(0x8ea77bdddd53dda6), UINT64_C(0x4b2eaf17175c17b8), UINT64_C(0x468e454747014702), UINT64_C(0xdc211a9e9e429e84),
263  UINT64_C(0xc589d4caca0fca1e), UINT64_C(0x995a582d2db42d75), UINT64_C(0x79632ebfbfc6bf91), UINT64_C(0x1b0e3f07071c0738),
264  UINT64_C(0x2347acadad8ead01), UINT64_C(0x2fb4b05a5a755aea), UINT64_C(0xb51bef838336836c), UINT64_C(0xff66b63333cc3385),
265  UINT64_C(0xf2c65c636391633f), UINT64_C(0x0a04120202080210), UINT64_C(0x384993aaaa92aa39), UINT64_C(0xa8e2de7171d971af),
266  UINT64_C(0xcf8dc6c8c807c80e), UINT64_C(0x7d32d119196419c8), UINT64_C(0x70923b4949394972), UINT64_C(0x9aaf5fd9d943d986),
267  UINT64_C(0x1df931f2f2eff2c3), UINT64_C(0x48dba8e3e3abe34b), UINT64_C(0x2ab6b95b5b715be2), UINT64_C(0x920dbc88881a8834),
268  UINT64_C(0xc8293e9a9a529aa4), UINT64_C(0xbe4c0b262698262d), UINT64_C(0xfa64bf3232c8328d), UINT64_C(0x4a7d59b0b0fab0e9),
269  UINT64_C(0x6acff2e9e983e91b), UINT64_C(0x331e770f0f3c0f78), UINT64_C(0xa6b733d5d573d5e6), UINT64_C(0xba1df480803a8074),
270  UINT64_C(0x7c6127bebec2be99), UINT64_C(0xde87ebcdcd13cd26), UINT64_C(0xe468893434d034bd), UINT64_C(0x75903248483d487a),
271  UINT64_C(0x24e354ffffdbffab), UINT64_C(0x8ff48d7a7af57af7), UINT64_C(0xea3d6490907a90f4), UINT64_C(0x3ebe9d5f5f615fc2),
272  UINT64_C(0xa0403d202080201d), UINT64_C(0xd5d00f6868bd6867), UINT64_C(0x7234ca1a1a681ad0), UINT64_C(0x2c41b7aeae82ae19),
273  UINT64_C(0x5e757db4b4eab4c9), UINT64_C(0x19a8ce54544d549a), UINT64_C(0xe53b7f93937693ec), UINT64_C(0xaa442f222288220d),
274  UINT64_C(0xe9c86364648d6407), UINT64_C(0x12ff2af1f1e3f1db), UINT64_C(0xa2e6cc7373d173bf), UINT64_C(0x5a24821212481290),
275  UINT64_C(0x5d807a40401d403a), UINT64_C(0x2810480808200840), UINT64_C(0xe89b95c3c32bc356), UINT64_C(0x7bc5dfecec97ec33),
276  UINT64_C(0x90ab4ddbdb4bdb96), UINT64_C(0x1f5fc0a1a1bea161), UINT64_C(0x8307918d8d0e8d1c), UINT64_C(0xc97ac83d3df43df5),
277  UINT64_C(0xf1335b97976697cc), UINT64_C(0x0000000000000000), UINT64_C(0xd483f9cfcf1bcf36), UINT64_C(0x87566e2b2bac2b45),
278  UINT64_C(0xb3ece17676c57697), UINT64_C(0xb019e68282328264), UINT64_C(0xa9b128d6d67fd6fe), UINT64_C(0x7736c31b1b6c1bd8),
279  UINT64_C(0x5b7774b5b5eeb5c1), UINT64_C(0x2943beafaf86af11), UINT64_C(0xdfd41d6a6ab56a77), UINT64_C(0x0da0ea50505d50ba),
280  UINT64_C(0x4c8a574545094512), UINT64_C(0x18fb38f3f3ebf3cb), UINT64_C(0xf060ad3030c0309d), UINT64_C(0x74c3c4efef9bef2b),
281  UINT64_C(0xc37eda3f3ffc3fe5), UINT64_C(0x1caac75555495592), UINT64_C(0x1059dba2a2b2a279), UINT64_C(0x65c9e9eaea8fea03),
282  UINT64_C(0xecca6a656589650f), UINT64_C(0x686903babad2bab9), UINT64_C(0x935e4a2f2fbc2f65), UINT64_C(0xe79d8ec0c027c04e),
283  UINT64_C(0x81a160dede5fdebe), UINT64_C(0x6c38fc1c1c701ce0), UINT64_C(0x2ee746fdfdd3fdbb), UINT64_C(0x649a1f4d4d294d52),
284  UINT64_C(0xe0397692927292e4), UINT64_C(0xbceafa7575c9758f), UINT64_C(0x1e0c360606180630), UINT64_C(0x9809ae8a8a128a24),
285  UINT64_C(0x40794bb2b2f2b2f9), UINT64_C(0x59d185e6e6bfe663), UINT64_C(0x361c7e0e0e380e70), UINT64_C(0x633ee71f1f7c1ff8),
286  UINT64_C(0xf7c4556262956237), UINT64_C(0xa3b53ad4d477d4ee), UINT64_C(0x324d81a8a89aa829), UINT64_C(0xf4315296966296c4),
287  UINT64_C(0x3aef62f9f9c3f99b), UINT64_C(0xf697a3c5c533c566), UINT64_C(0xb14a102525942535), UINT64_C(0x20b2ab59597959f2),
288  UINT64_C(0xae15d084842a8454), UINT64_C(0xa7e4c57272d572b7), UINT64_C(0xdd72ec3939e439d5), UINT64_C(0x6198164c4c2d4c5a),
289  UINT64_C(0x3bbc945e5e655eca), UINT64_C(0x85f09f7878fd78e7), UINT64_C(0xd870e53838e038dd), UINT64_C(0x8605988c8c0a8c14),
290  UINT64_C(0xb2bf17d1d163d1c6), UINT64_C(0x0b57e4a5a5aea541), UINT64_C(0x4dd9a1e2e2afe243), UINT64_C(0xf8c24e616199612f),
291  UINT64_C(0x457b42b3b3f6b3f1), UINT64_C(0xa542342121842115), UINT64_C(0xd625089c9c4a9c94), UINT64_C(0x663cee1e1e781ef0),
292  UINT64_C(0x5286614343114322), UINT64_C(0xfc93b1c7c73bc776), UINT64_C(0x2be54ffcfcd7fcb3), UINT64_C(0x1408240404100420),
293  UINT64_C(0x08a2e351515951b2), UINT64_C(0xc72f2599995e99bc), UINT64_C(0xc4da226d6da96d4f), UINT64_C(0x391a650d0d340d68),
294  UINT64_C(0x35e979fafacffa83), UINT64_C(0x84a369dfdf5bdfb6), UINT64_C(0x9bfca97e7ee57ed7), UINT64_C(0xb44819242490243d),
295  UINT64_C(0xd776fe3b3bec3bc5), UINT64_C(0x3d4b9aabab96ab31), UINT64_C(0xd181f0cece1fce3e), UINT64_C(0x5522991111441188),
296  UINT64_C(0x8903838f8f068f0c), UINT64_C(0x6b9c044e4e254e4a), UINT64_C(0x517366b7b7e6b7d1), UINT64_C(0x60cbe0ebeb8beb0b),
297  UINT64_C(0xcc78c13c3cf03cfd), UINT64_C(0xbf1ffd81813e817c), UINT64_C(0xfe354094946a94d4), UINT64_C(0x0cf31cf7f7fbf7eb),
298  UINT64_C(0x676f18b9b9deb9a1), UINT64_C(0x5f268b13134c1398), UINT64_C(0x9c58512c2cb02c7d), UINT64_C(0xb8bb05d3d36bd3d6),
299  UINT64_C(0x5cd38ce7e7bbe76b), UINT64_C(0xcbdc396e6ea56e57), UINT64_C(0xf395aac4c437c46e), UINT64_C(0x0f061b03030c0318),
300  UINT64_C(0x13acdc565645568a), UINT64_C(0x49885e44440d441a), UINT64_C(0x9efea07f7fe17fdf), UINT64_C(0x374f88a9a99ea921),
301  UINT64_C(0x8254672a2aa82a4d), UINT64_C(0x6d6b0abbbbd6bbb1), UINT64_C(0xe29f87c1c123c146), UINT64_C(0x02a6f153535153a2),
302  UINT64_C(0x8ba572dcdc57dcae), UINT64_C(0x2716530b0b2c0b58), UINT64_C(0xd327019d9d4e9d9c), UINT64_C(0xc1d82b6c6cad6c47),
303  UINT64_C(0xf562a43131c43195), UINT64_C(0xb9e8f37474cd7487), UINT64_C(0x09f115f6f6fff6e3), UINT64_C(0x438c4c464605460a),
304  UINT64_C(0x2645a5acac8aac09), UINT64_C(0x970fb589891e893c), UINT64_C(0x4428b414145014a0), UINT64_C(0x42dfbae1e1a3e15b),
305  UINT64_C(0x4e2ca616165816b0), UINT64_C(0xd274f73a3ae83acd), UINT64_C(0xd0d2066969b9696f), UINT64_C(0x2d12410909240948),
306  UINT64_C(0xade0d77070dd70a7), UINT64_C(0x54716fb6b6e2b6d9), UINT64_C(0xb7bd1ed0d067d0ce), UINT64_C(0x7ec7d6eded93ed3b),
307  UINT64_C(0xdb85e2cccc17cc2e), UINT64_C(0x578468424215422a), UINT64_C(0xc22d2c98985a98b4), UINT64_C(0x0e55eda4a4aaa449),
308  UINT64_C(0x8850752828a0285d), UINT64_C(0x31b8865c5c6d5cda), UINT64_C(0x3fed6bf8f8c7f893), UINT64_C(0xa411c28686228644)
309 };
310 
311 const uint64_t Whirlpool::C4[256] = {
312  UINT64_C(0xc07830d818186018), UINT64_C(0x05af462623238c23), UINT64_C(0x7ef991b8c6c63fc6), UINT64_C(0x136fcdfbe8e887e8),
313  UINT64_C(0x4ca113cb87872687), UINT64_C(0xa9626d11b8b8dab8), UINT64_C(0x0805020901010401), UINT64_C(0x426e9e0d4f4f214f),
314  UINT64_C(0xadee6c9b3636d836), UINT64_C(0x590451ffa6a6a2a6), UINT64_C(0xdebdb90cd2d26fd2), UINT64_C(0xfb06f70ef5f5f3f5),
315  UINT64_C(0xef80f2967979f979), UINT64_C(0x5fcede306f6fa16f), UINT64_C(0xfcef3f6d91917e91), UINT64_C(0xaa07a4f852525552),
316  UINT64_C(0x27fdc04760609d60), UINT64_C(0x89766535bcbccabc), UINT64_C(0xaccd2b379b9b569b), UINT64_C(0x048c018a8e8e028e),
317  UINT64_C(0x71155bd2a3a3b6a3), UINT64_C(0x603c186c0c0c300c), UINT64_C(0xff8af6847b7bf17b), UINT64_C(0xb5e16a803535d435),
318  UINT64_C(0xe8693af51d1d741d), UINT64_C(0x5347ddb3e0e0a7e0), UINT64_C(0xf6acb321d7d77bd7), UINT64_C(0x5eed999cc2c22fc2),
319  UINT64_C(0x6d965c432e2eb82e), UINT64_C(0x627a96294b4b314b), UINT64_C(0xa321e15dfefedffe), UINT64_C(0x8216aed557574157),
320  UINT64_C(0xa8412abd15155415), UINT64_C(0x9fb6eee87777c177), UINT64_C(0xa5eb6e923737dc37), UINT64_C(0x7b56d79ee5e5b3e5),
321  UINT64_C(0x8cd923139f9f469f), UINT64_C(0xd317fd23f0f0e7f0), UINT64_C(0x6a7f94204a4a354a), UINT64_C(0x9e95a944dada4fda),
322  UINT64_C(0xfa25b0a258587d58), UINT64_C(0x06ca8fcfc9c903c9), UINT64_C(0x558d527c2929a429), UINT64_C(0x5022145a0a0a280a),
323  UINT64_C(0xe14f7f50b1b1feb1), UINT64_C(0x691a5dc9a0a0baa0), UINT64_C(0x7fdad6146b6bb16b), UINT64_C(0x5cab17d985852e85),
324  UINT64_C(0x8173673cbdbdcebd), UINT64_C(0xd234ba8f5d5d695d), UINT64_C(0x8050209010104010), UINT64_C(0xf303f507f4f4f7f4),
325  UINT64_C(0x16c08bddcbcb0bcb), UINT64_C(0xedc67cd33e3ef83e), UINT64_C(0x28110a2d05051405), UINT64_C(0x1fe6ce7867678167),
326  UINT64_C(0x7353d597e4e4b7e4), UINT64_C(0x25bb4e0227279c27), UINT64_C(0x3258827341411941), UINT64_C(0x2c9d0ba78b8b168b),
327  UINT64_C(0x510153f6a7a7a6a7), UINT64_C(0xcf94fab27d7de97d), UINT64_C(0xdcfb374995956e95), UINT64_C(0x8e9fad56d8d847d8),
328  UINT64_C(0x8b30eb70fbfbcbfb), UINT64_C(0x2371c1cdeeee9fee), UINT64_C(0xc791f8bb7c7ced7c), UINT64_C(0x17e3cc7166668566),
329  UINT64_C(0xa68ea77bdddd53dd), UINT64_C(0xb84b2eaf17175c17), UINT64_C(0x02468e4547470147), UINT64_C(0x84dc211a9e9e429e),
330  UINT64_C(0x1ec589d4caca0fca), UINT64_C(0x75995a582d2db42d), UINT64_C(0x9179632ebfbfc6bf), UINT64_C(0x381b0e3f07071c07),
331  UINT64_C(0x012347acadad8ead), UINT64_C(0xea2fb4b05a5a755a), UINT64_C(0x6cb51bef83833683), UINT64_C(0x85ff66b63333cc33),
332  UINT64_C(0x3ff2c65c63639163), UINT64_C(0x100a041202020802), UINT64_C(0x39384993aaaa92aa), UINT64_C(0xafa8e2de7171d971),
333  UINT64_C(0x0ecf8dc6c8c807c8), UINT64_C(0xc87d32d119196419), UINT64_C(0x7270923b49493949), UINT64_C(0x869aaf5fd9d943d9),
334  UINT64_C(0xc31df931f2f2eff2), UINT64_C(0x4b48dba8e3e3abe3), UINT64_C(0xe22ab6b95b5b715b), UINT64_C(0x34920dbc88881a88),
335  UINT64_C(0xa4c8293e9a9a529a), UINT64_C(0x2dbe4c0b26269826), UINT64_C(0x8dfa64bf3232c832), UINT64_C(0xe94a7d59b0b0fab0),
336  UINT64_C(0x1b6acff2e9e983e9), UINT64_C(0x78331e770f0f3c0f), UINT64_C(0xe6a6b733d5d573d5), UINT64_C(0x74ba1df480803a80),
337  UINT64_C(0x997c6127bebec2be), UINT64_C(0x26de87ebcdcd13cd), UINT64_C(0xbde468893434d034), UINT64_C(0x7a75903248483d48),
338  UINT64_C(0xab24e354ffffdbff), UINT64_C(0xf78ff48d7a7af57a), UINT64_C(0xf4ea3d6490907a90), UINT64_C(0xc23ebe9d5f5f615f),
339  UINT64_C(0x1da0403d20208020), UINT64_C(0x67d5d00f6868bd68), UINT64_C(0xd07234ca1a1a681a), UINT64_C(0x192c41b7aeae82ae),
340  UINT64_C(0xc95e757db4b4eab4), UINT64_C(0x9a19a8ce54544d54), UINT64_C(0xece53b7f93937693), UINT64_C(0x0daa442f22228822),
341  UINT64_C(0x07e9c86364648d64), UINT64_C(0xdb12ff2af1f1e3f1), UINT64_C(0xbfa2e6cc7373d173), UINT64_C(0x905a248212124812),
342  UINT64_C(0x3a5d807a40401d40), UINT64_C(0x4028104808082008), UINT64_C(0x56e89b95c3c32bc3), UINT64_C(0x337bc5dfecec97ec),
343  UINT64_C(0x9690ab4ddbdb4bdb), UINT64_C(0x611f5fc0a1a1bea1), UINT64_C(0x1c8307918d8d0e8d), UINT64_C(0xf5c97ac83d3df43d),
344  UINT64_C(0xccf1335b97976697), UINT64_C(0x0000000000000000), UINT64_C(0x36d483f9cfcf1bcf), UINT64_C(0x4587566e2b2bac2b),
345  UINT64_C(0x97b3ece17676c576), UINT64_C(0x64b019e682823282), UINT64_C(0xfea9b128d6d67fd6), UINT64_C(0xd87736c31b1b6c1b),
346  UINT64_C(0xc15b7774b5b5eeb5), UINT64_C(0x112943beafaf86af), UINT64_C(0x77dfd41d6a6ab56a), UINT64_C(0xba0da0ea50505d50),
347  UINT64_C(0x124c8a5745450945), UINT64_C(0xcb18fb38f3f3ebf3), UINT64_C(0x9df060ad3030c030), UINT64_C(0x2b74c3c4efef9bef),
348  UINT64_C(0xe5c37eda3f3ffc3f), UINT64_C(0x921caac755554955), UINT64_C(0x791059dba2a2b2a2), UINT64_C(0x0365c9e9eaea8fea),
349  UINT64_C(0x0fecca6a65658965), UINT64_C(0xb9686903babad2ba), UINT64_C(0x65935e4a2f2fbc2f), UINT64_C(0x4ee79d8ec0c027c0),
350  UINT64_C(0xbe81a160dede5fde), UINT64_C(0xe06c38fc1c1c701c), UINT64_C(0xbb2ee746fdfdd3fd), UINT64_C(0x52649a1f4d4d294d),
351  UINT64_C(0xe4e0397692927292), UINT64_C(0x8fbceafa7575c975), UINT64_C(0x301e0c3606061806), UINT64_C(0x249809ae8a8a128a),
352  UINT64_C(0xf940794bb2b2f2b2), UINT64_C(0x6359d185e6e6bfe6), UINT64_C(0x70361c7e0e0e380e), UINT64_C(0xf8633ee71f1f7c1f),
353  UINT64_C(0x37f7c45562629562), UINT64_C(0xeea3b53ad4d477d4), UINT64_C(0x29324d81a8a89aa8), UINT64_C(0xc4f4315296966296),
354  UINT64_C(0x9b3aef62f9f9c3f9), UINT64_C(0x66f697a3c5c533c5), UINT64_C(0x35b14a1025259425), UINT64_C(0xf220b2ab59597959),
355  UINT64_C(0x54ae15d084842a84), UINT64_C(0xb7a7e4c57272d572), UINT64_C(0xd5dd72ec3939e439), UINT64_C(0x5a6198164c4c2d4c),
356  UINT64_C(0xca3bbc945e5e655e), UINT64_C(0xe785f09f7878fd78), UINT64_C(0xddd870e53838e038), UINT64_C(0x148605988c8c0a8c),
357  UINT64_C(0xc6b2bf17d1d163d1), UINT64_C(0x410b57e4a5a5aea5), UINT64_C(0x434dd9a1e2e2afe2), UINT64_C(0x2ff8c24e61619961),
358  UINT64_C(0xf1457b42b3b3f6b3), UINT64_C(0x15a5423421218421), UINT64_C(0x94d625089c9c4a9c), UINT64_C(0xf0663cee1e1e781e),
359  UINT64_C(0x2252866143431143), UINT64_C(0x76fc93b1c7c73bc7), UINT64_C(0xb32be54ffcfcd7fc), UINT64_C(0x2014082404041004),
360  UINT64_C(0xb208a2e351515951), UINT64_C(0xbcc72f2599995e99), UINT64_C(0x4fc4da226d6da96d), UINT64_C(0x68391a650d0d340d),
361  UINT64_C(0x8335e979fafacffa), UINT64_C(0xb684a369dfdf5bdf), UINT64_C(0xd79bfca97e7ee57e), UINT64_C(0x3db4481924249024),
362  UINT64_C(0xc5d776fe3b3bec3b), UINT64_C(0x313d4b9aabab96ab), UINT64_C(0x3ed181f0cece1fce), UINT64_C(0x8855229911114411),
363  UINT64_C(0x0c8903838f8f068f), UINT64_C(0x4a6b9c044e4e254e), UINT64_C(0xd1517366b7b7e6b7), UINT64_C(0x0b60cbe0ebeb8beb),
364  UINT64_C(0xfdcc78c13c3cf03c), UINT64_C(0x7cbf1ffd81813e81), UINT64_C(0xd4fe354094946a94), UINT64_C(0xeb0cf31cf7f7fbf7),
365  UINT64_C(0xa1676f18b9b9deb9), UINT64_C(0x985f268b13134c13), UINT64_C(0x7d9c58512c2cb02c), UINT64_C(0xd6b8bb05d3d36bd3),
366  UINT64_C(0x6b5cd38ce7e7bbe7), UINT64_C(0x57cbdc396e6ea56e), UINT64_C(0x6ef395aac4c437c4), UINT64_C(0x180f061b03030c03),
367  UINT64_C(0x8a13acdc56564556), UINT64_C(0x1a49885e44440d44), UINT64_C(0xdf9efea07f7fe17f), UINT64_C(0x21374f88a9a99ea9),
368  UINT64_C(0x4d8254672a2aa82a), UINT64_C(0xb16d6b0abbbbd6bb), UINT64_C(0x46e29f87c1c123c1), UINT64_C(0xa202a6f153535153),
369  UINT64_C(0xae8ba572dcdc57dc), UINT64_C(0x582716530b0b2c0b), UINT64_C(0x9cd327019d9d4e9d), UINT64_C(0x47c1d82b6c6cad6c),
370  UINT64_C(0x95f562a43131c431), UINT64_C(0x87b9e8f37474cd74), UINT64_C(0xe309f115f6f6fff6), UINT64_C(0x0a438c4c46460546),
371  UINT64_C(0x092645a5acac8aac), UINT64_C(0x3c970fb589891e89), UINT64_C(0xa04428b414145014), UINT64_C(0x5b42dfbae1e1a3e1),
372  UINT64_C(0xb04e2ca616165816), UINT64_C(0xcdd274f73a3ae83a), UINT64_C(0x6fd0d2066969b969), UINT64_C(0x482d124109092409),
373  UINT64_C(0xa7ade0d77070dd70), UINT64_C(0xd954716fb6b6e2b6), UINT64_C(0xceb7bd1ed0d067d0), UINT64_C(0x3b7ec7d6eded93ed),
374  UINT64_C(0x2edb85e2cccc17cc), UINT64_C(0x2a57846842421542), UINT64_C(0xb4c22d2c98985a98), UINT64_C(0x490e55eda4a4aaa4),
375  UINT64_C(0x5d8850752828a028), UINT64_C(0xda31b8865c5c6d5c), UINT64_C(0x933fed6bf8f8c7f8), UINT64_C(0x44a411c286862286)
376 };
377 
378 const uint64_t Whirlpool::C5[256] = {
379  UINT64_C(0x18c07830d8181860), UINT64_C(0x2305af462623238c), UINT64_C(0xc67ef991b8c6c63f), UINT64_C(0xe8136fcdfbe8e887),
380  UINT64_C(0x874ca113cb878726), UINT64_C(0xb8a9626d11b8b8da), UINT64_C(0x0108050209010104), UINT64_C(0x4f426e9e0d4f4f21),
381  UINT64_C(0x36adee6c9b3636d8), UINT64_C(0xa6590451ffa6a6a2), UINT64_C(0xd2debdb90cd2d26f), UINT64_C(0xf5fb06f70ef5f5f3),
382  UINT64_C(0x79ef80f2967979f9), UINT64_C(0x6f5fcede306f6fa1), UINT64_C(0x91fcef3f6d91917e), UINT64_C(0x52aa07a4f8525255),
383  UINT64_C(0x6027fdc04760609d), UINT64_C(0xbc89766535bcbcca), UINT64_C(0x9baccd2b379b9b56), UINT64_C(0x8e048c018a8e8e02),
384  UINT64_C(0xa371155bd2a3a3b6), UINT64_C(0x0c603c186c0c0c30), UINT64_C(0x7bff8af6847b7bf1), UINT64_C(0x35b5e16a803535d4),
385  UINT64_C(0x1de8693af51d1d74), UINT64_C(0xe05347ddb3e0e0a7), UINT64_C(0xd7f6acb321d7d77b), UINT64_C(0xc25eed999cc2c22f),
386  UINT64_C(0x2e6d965c432e2eb8), UINT64_C(0x4b627a96294b4b31), UINT64_C(0xfea321e15dfefedf), UINT64_C(0x578216aed5575741),
387  UINT64_C(0x15a8412abd151554), UINT64_C(0x779fb6eee87777c1), UINT64_C(0x37a5eb6e923737dc), UINT64_C(0xe57b56d79ee5e5b3),
388  UINT64_C(0x9f8cd923139f9f46), UINT64_C(0xf0d317fd23f0f0e7), UINT64_C(0x4a6a7f94204a4a35), UINT64_C(0xda9e95a944dada4f),
389  UINT64_C(0x58fa25b0a258587d), UINT64_C(0xc906ca8fcfc9c903), UINT64_C(0x29558d527c2929a4), UINT64_C(0x0a5022145a0a0a28),
390  UINT64_C(0xb1e14f7f50b1b1fe), UINT64_C(0xa0691a5dc9a0a0ba), UINT64_C(0x6b7fdad6146b6bb1), UINT64_C(0x855cab17d985852e),
391  UINT64_C(0xbd8173673cbdbdce), UINT64_C(0x5dd234ba8f5d5d69), UINT64_C(0x1080502090101040), UINT64_C(0xf4f303f507f4f4f7),
392  UINT64_C(0xcb16c08bddcbcb0b), UINT64_C(0x3eedc67cd33e3ef8), UINT64_C(0x0528110a2d050514), UINT64_C(0x671fe6ce78676781),
393  UINT64_C(0xe47353d597e4e4b7), UINT64_C(0x2725bb4e0227279c), UINT64_C(0x4132588273414119), UINT64_C(0x8b2c9d0ba78b8b16),
394  UINT64_C(0xa7510153f6a7a7a6), UINT64_C(0x7dcf94fab27d7de9), UINT64_C(0x95dcfb374995956e), UINT64_C(0xd88e9fad56d8d847),
395  UINT64_C(0xfb8b30eb70fbfbcb), UINT64_C(0xee2371c1cdeeee9f), UINT64_C(0x7cc791f8bb7c7ced), UINT64_C(0x6617e3cc71666685),
396  UINT64_C(0xdda68ea77bdddd53), UINT64_C(0x17b84b2eaf17175c), UINT64_C(0x4702468e45474701), UINT64_C(0x9e84dc211a9e9e42),
397  UINT64_C(0xca1ec589d4caca0f), UINT64_C(0x2d75995a582d2db4), UINT64_C(0xbf9179632ebfbfc6), UINT64_C(0x07381b0e3f07071c),
398  UINT64_C(0xad012347acadad8e), UINT64_C(0x5aea2fb4b05a5a75), UINT64_C(0x836cb51bef838336), UINT64_C(0x3385ff66b63333cc),
399  UINT64_C(0x633ff2c65c636391), UINT64_C(0x02100a0412020208), UINT64_C(0xaa39384993aaaa92), UINT64_C(0x71afa8e2de7171d9),
400  UINT64_C(0xc80ecf8dc6c8c807), UINT64_C(0x19c87d32d1191964), UINT64_C(0x497270923b494939), UINT64_C(0xd9869aaf5fd9d943),
401  UINT64_C(0xf2c31df931f2f2ef), UINT64_C(0xe34b48dba8e3e3ab), UINT64_C(0x5be22ab6b95b5b71), UINT64_C(0x8834920dbc88881a),
402  UINT64_C(0x9aa4c8293e9a9a52), UINT64_C(0x262dbe4c0b262698), UINT64_C(0x328dfa64bf3232c8), UINT64_C(0xb0e94a7d59b0b0fa),
403  UINT64_C(0xe91b6acff2e9e983), UINT64_C(0x0f78331e770f0f3c), UINT64_C(0xd5e6a6b733d5d573), UINT64_C(0x8074ba1df480803a),
404  UINT64_C(0xbe997c6127bebec2), UINT64_C(0xcd26de87ebcdcd13), UINT64_C(0x34bde468893434d0), UINT64_C(0x487a75903248483d),
405  UINT64_C(0xffab24e354ffffdb), UINT64_C(0x7af78ff48d7a7af5), UINT64_C(0x90f4ea3d6490907a), UINT64_C(0x5fc23ebe9d5f5f61),
406  UINT64_C(0x201da0403d202080), UINT64_C(0x6867d5d00f6868bd), UINT64_C(0x1ad07234ca1a1a68), UINT64_C(0xae192c41b7aeae82),
407  UINT64_C(0xb4c95e757db4b4ea), UINT64_C(0x549a19a8ce54544d), UINT64_C(0x93ece53b7f939376), UINT64_C(0x220daa442f222288),
408  UINT64_C(0x6407e9c86364648d), UINT64_C(0xf1db12ff2af1f1e3), UINT64_C(0x73bfa2e6cc7373d1), UINT64_C(0x12905a2482121248),
409  UINT64_C(0x403a5d807a40401d), UINT64_C(0x0840281048080820), UINT64_C(0xc356e89b95c3c32b), UINT64_C(0xec337bc5dfecec97),
410  UINT64_C(0xdb9690ab4ddbdb4b), UINT64_C(0xa1611f5fc0a1a1be), UINT64_C(0x8d1c8307918d8d0e), UINT64_C(0x3df5c97ac83d3df4),
411  UINT64_C(0x97ccf1335b979766), UINT64_C(0x0000000000000000), UINT64_C(0xcf36d483f9cfcf1b), UINT64_C(0x2b4587566e2b2bac),
412  UINT64_C(0x7697b3ece17676c5), UINT64_C(0x8264b019e6828232), UINT64_C(0xd6fea9b128d6d67f), UINT64_C(0x1bd87736c31b1b6c),
413  UINT64_C(0xb5c15b7774b5b5ee), UINT64_C(0xaf112943beafaf86), UINT64_C(0x6a77dfd41d6a6ab5), UINT64_C(0x50ba0da0ea50505d),
414  UINT64_C(0x45124c8a57454509), UINT64_C(0xf3cb18fb38f3f3eb), UINT64_C(0x309df060ad3030c0), UINT64_C(0xef2b74c3c4efef9b),
415  UINT64_C(0x3fe5c37eda3f3ffc), UINT64_C(0x55921caac7555549), UINT64_C(0xa2791059dba2a2b2), UINT64_C(0xea0365c9e9eaea8f),
416  UINT64_C(0x650fecca6a656589), UINT64_C(0xbab9686903babad2), UINT64_C(0x2f65935e4a2f2fbc), UINT64_C(0xc04ee79d8ec0c027),
417  UINT64_C(0xdebe81a160dede5f), UINT64_C(0x1ce06c38fc1c1c70), UINT64_C(0xfdbb2ee746fdfdd3), UINT64_C(0x4d52649a1f4d4d29),
418  UINT64_C(0x92e4e03976929272), UINT64_C(0x758fbceafa7575c9), UINT64_C(0x06301e0c36060618), UINT64_C(0x8a249809ae8a8a12),
419  UINT64_C(0xb2f940794bb2b2f2), UINT64_C(0xe66359d185e6e6bf), UINT64_C(0x0e70361c7e0e0e38), UINT64_C(0x1ff8633ee71f1f7c),
420  UINT64_C(0x6237f7c455626295), UINT64_C(0xd4eea3b53ad4d477), UINT64_C(0xa829324d81a8a89a), UINT64_C(0x96c4f43152969662),
421  UINT64_C(0xf99b3aef62f9f9c3), UINT64_C(0xc566f697a3c5c533), UINT64_C(0x2535b14a10252594), UINT64_C(0x59f220b2ab595979),
422  UINT64_C(0x8454ae15d084842a), UINT64_C(0x72b7a7e4c57272d5), UINT64_C(0x39d5dd72ec3939e4), UINT64_C(0x4c5a6198164c4c2d),
423  UINT64_C(0x5eca3bbc945e5e65), UINT64_C(0x78e785f09f7878fd), UINT64_C(0x38ddd870e53838e0), UINT64_C(0x8c148605988c8c0a),
424  UINT64_C(0xd1c6b2bf17d1d163), UINT64_C(0xa5410b57e4a5a5ae), UINT64_C(0xe2434dd9a1e2e2af), UINT64_C(0x612ff8c24e616199),
425  UINT64_C(0xb3f1457b42b3b3f6), UINT64_C(0x2115a54234212184), UINT64_C(0x9c94d625089c9c4a), UINT64_C(0x1ef0663cee1e1e78),
426  UINT64_C(0x4322528661434311), UINT64_C(0xc776fc93b1c7c73b), UINT64_C(0xfcb32be54ffcfcd7), UINT64_C(0x0420140824040410),
427  UINT64_C(0x51b208a2e3515159), UINT64_C(0x99bcc72f2599995e), UINT64_C(0x6d4fc4da226d6da9), UINT64_C(0x0d68391a650d0d34),
428  UINT64_C(0xfa8335e979fafacf), UINT64_C(0xdfb684a369dfdf5b), UINT64_C(0x7ed79bfca97e7ee5), UINT64_C(0x243db44819242490),
429  UINT64_C(0x3bc5d776fe3b3bec), UINT64_C(0xab313d4b9aabab96), UINT64_C(0xce3ed181f0cece1f), UINT64_C(0x1188552299111144),
430  UINT64_C(0x8f0c8903838f8f06), UINT64_C(0x4e4a6b9c044e4e25), UINT64_C(0xb7d1517366b7b7e6), UINT64_C(0xeb0b60cbe0ebeb8b),
431  UINT64_C(0x3cfdcc78c13c3cf0), UINT64_C(0x817cbf1ffd81813e), UINT64_C(0x94d4fe354094946a), UINT64_C(0xf7eb0cf31cf7f7fb),
432  UINT64_C(0xb9a1676f18b9b9de), UINT64_C(0x13985f268b13134c), UINT64_C(0x2c7d9c58512c2cb0), UINT64_C(0xd3d6b8bb05d3d36b),
433  UINT64_C(0xe76b5cd38ce7e7bb), UINT64_C(0x6e57cbdc396e6ea5), UINT64_C(0xc46ef395aac4c437), UINT64_C(0x03180f061b03030c),
434  UINT64_C(0x568a13acdc565645), UINT64_C(0x441a49885e44440d), UINT64_C(0x7fdf9efea07f7fe1), UINT64_C(0xa921374f88a9a99e),
435  UINT64_C(0x2a4d8254672a2aa8), UINT64_C(0xbbb16d6b0abbbbd6), UINT64_C(0xc146e29f87c1c123), UINT64_C(0x53a202a6f1535351),
436  UINT64_C(0xdcae8ba572dcdc57), UINT64_C(0x0b582716530b0b2c), UINT64_C(0x9d9cd327019d9d4e), UINT64_C(0x6c47c1d82b6c6cad),
437  UINT64_C(0x3195f562a43131c4), UINT64_C(0x7487b9e8f37474cd), UINT64_C(0xf6e309f115f6f6ff), UINT64_C(0x460a438c4c464605),
438  UINT64_C(0xac092645a5acac8a), UINT64_C(0x893c970fb589891e), UINT64_C(0x14a04428b4141450), UINT64_C(0xe15b42dfbae1e1a3),
439  UINT64_C(0x16b04e2ca6161658), UINT64_C(0x3acdd274f73a3ae8), UINT64_C(0x696fd0d2066969b9), UINT64_C(0x09482d1241090924),
440  UINT64_C(0x70a7ade0d77070dd), UINT64_C(0xb6d954716fb6b6e2), UINT64_C(0xd0ceb7bd1ed0d067), UINT64_C(0xed3b7ec7d6eded93),
441  UINT64_C(0xcc2edb85e2cccc17), UINT64_C(0x422a578468424215), UINT64_C(0x98b4c22d2c98985a), UINT64_C(0xa4490e55eda4a4aa),
442  UINT64_C(0x285d8850752828a0), UINT64_C(0x5cda31b8865c5c6d), UINT64_C(0xf8933fed6bf8f8c7), UINT64_C(0x8644a411c2868622)
443 };
444 
445 const uint64_t Whirlpool::C6[256] = {
446  UINT64_C(0x6018c07830d81818), UINT64_C(0x8c2305af46262323), UINT64_C(0x3fc67ef991b8c6c6), UINT64_C(0x87e8136fcdfbe8e8),
447  UINT64_C(0x26874ca113cb8787), UINT64_C(0xdab8a9626d11b8b8), UINT64_C(0x0401080502090101), UINT64_C(0x214f426e9e0d4f4f),
448  UINT64_C(0xd836adee6c9b3636), UINT64_C(0xa2a6590451ffa6a6), UINT64_C(0x6fd2debdb90cd2d2), UINT64_C(0xf3f5fb06f70ef5f5),
449  UINT64_C(0xf979ef80f2967979), UINT64_C(0xa16f5fcede306f6f), UINT64_C(0x7e91fcef3f6d9191), UINT64_C(0x5552aa07a4f85252),
450  UINT64_C(0x9d6027fdc0476060), UINT64_C(0xcabc89766535bcbc), UINT64_C(0x569baccd2b379b9b), UINT64_C(0x028e048c018a8e8e),
451  UINT64_C(0xb6a371155bd2a3a3), UINT64_C(0x300c603c186c0c0c), UINT64_C(0xf17bff8af6847b7b), UINT64_C(0xd435b5e16a803535),
452  UINT64_C(0x741de8693af51d1d), UINT64_C(0xa7e05347ddb3e0e0), UINT64_C(0x7bd7f6acb321d7d7), UINT64_C(0x2fc25eed999cc2c2),
453  UINT64_C(0xb82e6d965c432e2e), UINT64_C(0x314b627a96294b4b), UINT64_C(0xdffea321e15dfefe), UINT64_C(0x41578216aed55757),
454  UINT64_C(0x5415a8412abd1515), UINT64_C(0xc1779fb6eee87777), UINT64_C(0xdc37a5eb6e923737), UINT64_C(0xb3e57b56d79ee5e5),
455  UINT64_C(0x469f8cd923139f9f), UINT64_C(0xe7f0d317fd23f0f0), UINT64_C(0x354a6a7f94204a4a), UINT64_C(0x4fda9e95a944dada),
456  UINT64_C(0x7d58fa25b0a25858), UINT64_C(0x03c906ca8fcfc9c9), UINT64_C(0xa429558d527c2929), UINT64_C(0x280a5022145a0a0a),
457  UINT64_C(0xfeb1e14f7f50b1b1), UINT64_C(0xbaa0691a5dc9a0a0), UINT64_C(0xb16b7fdad6146b6b), UINT64_C(0x2e855cab17d98585),
458  UINT64_C(0xcebd8173673cbdbd), UINT64_C(0x695dd234ba8f5d5d), UINT64_C(0x4010805020901010), UINT64_C(0xf7f4f303f507f4f4),
459  UINT64_C(0x0bcb16c08bddcbcb), UINT64_C(0xf83eedc67cd33e3e), UINT64_C(0x140528110a2d0505), UINT64_C(0x81671fe6ce786767),
460  UINT64_C(0xb7e47353d597e4e4), UINT64_C(0x9c2725bb4e022727), UINT64_C(0x1941325882734141), UINT64_C(0x168b2c9d0ba78b8b),
461  UINT64_C(0xa6a7510153f6a7a7), UINT64_C(0xe97dcf94fab27d7d), UINT64_C(0x6e95dcfb37499595), UINT64_C(0x47d88e9fad56d8d8),
462  UINT64_C(0xcbfb8b30eb70fbfb), UINT64_C(0x9fee2371c1cdeeee), UINT64_C(0xed7cc791f8bb7c7c), UINT64_C(0x856617e3cc716666),
463  UINT64_C(0x53dda68ea77bdddd), UINT64_C(0x5c17b84b2eaf1717), UINT64_C(0x014702468e454747), UINT64_C(0x429e84dc211a9e9e),
464  UINT64_C(0x0fca1ec589d4caca), UINT64_C(0xb42d75995a582d2d), UINT64_C(0xc6bf9179632ebfbf), UINT64_C(0x1c07381b0e3f0707),
465  UINT64_C(0x8ead012347acadad), UINT64_C(0x755aea2fb4b05a5a), UINT64_C(0x36836cb51bef8383), UINT64_C(0xcc3385ff66b63333),
466  UINT64_C(0x91633ff2c65c6363), UINT64_C(0x0802100a04120202), UINT64_C(0x92aa39384993aaaa), UINT64_C(0xd971afa8e2de7171),
467  UINT64_C(0x07c80ecf8dc6c8c8), UINT64_C(0x6419c87d32d11919), UINT64_C(0x39497270923b4949), UINT64_C(0x43d9869aaf5fd9d9),
468  UINT64_C(0xeff2c31df931f2f2), UINT64_C(0xabe34b48dba8e3e3), UINT64_C(0x715be22ab6b95b5b), UINT64_C(0x1a8834920dbc8888),
469  UINT64_C(0x529aa4c8293e9a9a), UINT64_C(0x98262dbe4c0b2626), UINT64_C(0xc8328dfa64bf3232), UINT64_C(0xfab0e94a7d59b0b0),
470  UINT64_C(0x83e91b6acff2e9e9), UINT64_C(0x3c0f78331e770f0f), UINT64_C(0x73d5e6a6b733d5d5), UINT64_C(0x3a8074ba1df48080),
471  UINT64_C(0xc2be997c6127bebe), UINT64_C(0x13cd26de87ebcdcd), UINT64_C(0xd034bde468893434), UINT64_C(0x3d487a7590324848),
472  UINT64_C(0xdbffab24e354ffff), UINT64_C(0xf57af78ff48d7a7a), UINT64_C(0x7a90f4ea3d649090), UINT64_C(0x615fc23ebe9d5f5f),
473  UINT64_C(0x80201da0403d2020), UINT64_C(0xbd6867d5d00f6868), UINT64_C(0x681ad07234ca1a1a), UINT64_C(0x82ae192c41b7aeae),
474  UINT64_C(0xeab4c95e757db4b4), UINT64_C(0x4d549a19a8ce5454), UINT64_C(0x7693ece53b7f9393), UINT64_C(0x88220daa442f2222),
475  UINT64_C(0x8d6407e9c8636464), UINT64_C(0xe3f1db12ff2af1f1), UINT64_C(0xd173bfa2e6cc7373), UINT64_C(0x4812905a24821212),
476  UINT64_C(0x1d403a5d807a4040), UINT64_C(0x2008402810480808), UINT64_C(0x2bc356e89b95c3c3), UINT64_C(0x97ec337bc5dfecec),
477  UINT64_C(0x4bdb9690ab4ddbdb), UINT64_C(0xbea1611f5fc0a1a1), UINT64_C(0x0e8d1c8307918d8d), UINT64_C(0xf43df5c97ac83d3d),
478  UINT64_C(0x6697ccf1335b9797), UINT64_C(0x0000000000000000), UINT64_C(0x1bcf36d483f9cfcf), UINT64_C(0xac2b4587566e2b2b),
479  UINT64_C(0xc57697b3ece17676), UINT64_C(0x328264b019e68282), UINT64_C(0x7fd6fea9b128d6d6), UINT64_C(0x6c1bd87736c31b1b),
480  UINT64_C(0xeeb5c15b7774b5b5), UINT64_C(0x86af112943beafaf), UINT64_C(0xb56a77dfd41d6a6a), UINT64_C(0x5d50ba0da0ea5050),
481  UINT64_C(0x0945124c8a574545), UINT64_C(0xebf3cb18fb38f3f3), UINT64_C(0xc0309df060ad3030), UINT64_C(0x9bef2b74c3c4efef),
482  UINT64_C(0xfc3fe5c37eda3f3f), UINT64_C(0x4955921caac75555), UINT64_C(0xb2a2791059dba2a2), UINT64_C(0x8fea0365c9e9eaea),
483  UINT64_C(0x89650fecca6a6565), UINT64_C(0xd2bab9686903baba), UINT64_C(0xbc2f65935e4a2f2f), UINT64_C(0x27c04ee79d8ec0c0),
484  UINT64_C(0x5fdebe81a160dede), UINT64_C(0x701ce06c38fc1c1c), UINT64_C(0xd3fdbb2ee746fdfd), UINT64_C(0x294d52649a1f4d4d),
485  UINT64_C(0x7292e4e039769292), UINT64_C(0xc9758fbceafa7575), UINT64_C(0x1806301e0c360606), UINT64_C(0x128a249809ae8a8a),
486  UINT64_C(0xf2b2f940794bb2b2), UINT64_C(0xbfe66359d185e6e6), UINT64_C(0x380e70361c7e0e0e), UINT64_C(0x7c1ff8633ee71f1f),
487  UINT64_C(0x956237f7c4556262), UINT64_C(0x77d4eea3b53ad4d4), UINT64_C(0x9aa829324d81a8a8), UINT64_C(0x6296c4f431529696),
488  UINT64_C(0xc3f99b3aef62f9f9), UINT64_C(0x33c566f697a3c5c5), UINT64_C(0x942535b14a102525), UINT64_C(0x7959f220b2ab5959),
489  UINT64_C(0x2a8454ae15d08484), UINT64_C(0xd572b7a7e4c57272), UINT64_C(0xe439d5dd72ec3939), UINT64_C(0x2d4c5a6198164c4c),
490  UINT64_C(0x655eca3bbc945e5e), UINT64_C(0xfd78e785f09f7878), UINT64_C(0xe038ddd870e53838), UINT64_C(0x0a8c148605988c8c),
491  UINT64_C(0x63d1c6b2bf17d1d1), UINT64_C(0xaea5410b57e4a5a5), UINT64_C(0xafe2434dd9a1e2e2), UINT64_C(0x99612ff8c24e6161),
492  UINT64_C(0xf6b3f1457b42b3b3), UINT64_C(0x842115a542342121), UINT64_C(0x4a9c94d625089c9c), UINT64_C(0x781ef0663cee1e1e),
493  UINT64_C(0x1143225286614343), UINT64_C(0x3bc776fc93b1c7c7), UINT64_C(0xd7fcb32be54ffcfc), UINT64_C(0x1004201408240404),
494  UINT64_C(0x5951b208a2e35151), UINT64_C(0x5e99bcc72f259999), UINT64_C(0xa96d4fc4da226d6d), UINT64_C(0x340d68391a650d0d),
495  UINT64_C(0xcffa8335e979fafa), UINT64_C(0x5bdfb684a369dfdf), UINT64_C(0xe57ed79bfca97e7e), UINT64_C(0x90243db448192424),
496  UINT64_C(0xec3bc5d776fe3b3b), UINT64_C(0x96ab313d4b9aabab), UINT64_C(0x1fce3ed181f0cece), UINT64_C(0x4411885522991111),
497  UINT64_C(0x068f0c8903838f8f), UINT64_C(0x254e4a6b9c044e4e), UINT64_C(0xe6b7d1517366b7b7), UINT64_C(0x8beb0b60cbe0ebeb),
498  UINT64_C(0xf03cfdcc78c13c3c), UINT64_C(0x3e817cbf1ffd8181), UINT64_C(0x6a94d4fe35409494), UINT64_C(0xfbf7eb0cf31cf7f7),
499  UINT64_C(0xdeb9a1676f18b9b9), UINT64_C(0x4c13985f268b1313), UINT64_C(0xb02c7d9c58512c2c), UINT64_C(0x6bd3d6b8bb05d3d3),
500  UINT64_C(0xbbe76b5cd38ce7e7), UINT64_C(0xa56e57cbdc396e6e), UINT64_C(0x37c46ef395aac4c4), UINT64_C(0x0c03180f061b0303),
501  UINT64_C(0x45568a13acdc5656), UINT64_C(0x0d441a49885e4444), UINT64_C(0xe17fdf9efea07f7f), UINT64_C(0x9ea921374f88a9a9),
502  UINT64_C(0xa82a4d8254672a2a), UINT64_C(0xd6bbb16d6b0abbbb), UINT64_C(0x23c146e29f87c1c1), UINT64_C(0x5153a202a6f15353),
503  UINT64_C(0x57dcae8ba572dcdc), UINT64_C(0x2c0b582716530b0b), UINT64_C(0x4e9d9cd327019d9d), UINT64_C(0xad6c47c1d82b6c6c),
504  UINT64_C(0xc43195f562a43131), UINT64_C(0xcd7487b9e8f37474), UINT64_C(0xfff6e309f115f6f6), UINT64_C(0x05460a438c4c4646),
505  UINT64_C(0x8aac092645a5acac), UINT64_C(0x1e893c970fb58989), UINT64_C(0x5014a04428b41414), UINT64_C(0xa3e15b42dfbae1e1),
506  UINT64_C(0x5816b04e2ca61616), UINT64_C(0xe83acdd274f73a3a), UINT64_C(0xb9696fd0d2066969), UINT64_C(0x2409482d12410909),
507  UINT64_C(0xdd70a7ade0d77070), UINT64_C(0xe2b6d954716fb6b6), UINT64_C(0x67d0ceb7bd1ed0d0), UINT64_C(0x93ed3b7ec7d6eded),
508  UINT64_C(0x17cc2edb85e2cccc), UINT64_C(0x15422a5784684242), UINT64_C(0x5a98b4c22d2c9898), UINT64_C(0xaaa4490e55eda4a4),
509  UINT64_C(0xa0285d8850752828), UINT64_C(0x6d5cda31b8865c5c), UINT64_C(0xc7f8933fed6bf8f8), UINT64_C(0x228644a411c28686)
510 };
511 
512 const uint64_t Whirlpool::C7[256] = {
513  UINT64_C(0x186018c07830d818), UINT64_C(0x238c2305af462623), UINT64_C(0xc63fc67ef991b8c6), UINT64_C(0xe887e8136fcdfbe8),
514  UINT64_C(0x8726874ca113cb87), UINT64_C(0xb8dab8a9626d11b8), UINT64_C(0x0104010805020901), UINT64_C(0x4f214f426e9e0d4f),
515  UINT64_C(0x36d836adee6c9b36), UINT64_C(0xa6a2a6590451ffa6), UINT64_C(0xd26fd2debdb90cd2), UINT64_C(0xf5f3f5fb06f70ef5),
516  UINT64_C(0x79f979ef80f29679), UINT64_C(0x6fa16f5fcede306f), UINT64_C(0x917e91fcef3f6d91), UINT64_C(0x525552aa07a4f852),
517  UINT64_C(0x609d6027fdc04760), UINT64_C(0xbccabc89766535bc), UINT64_C(0x9b569baccd2b379b), UINT64_C(0x8e028e048c018a8e),
518  UINT64_C(0xa3b6a371155bd2a3), UINT64_C(0x0c300c603c186c0c), UINT64_C(0x7bf17bff8af6847b), UINT64_C(0x35d435b5e16a8035),
519  UINT64_C(0x1d741de8693af51d), UINT64_C(0xe0a7e05347ddb3e0), UINT64_C(0xd77bd7f6acb321d7), UINT64_C(0xc22fc25eed999cc2),
520  UINT64_C(0x2eb82e6d965c432e), UINT64_C(0x4b314b627a96294b), UINT64_C(0xfedffea321e15dfe), UINT64_C(0x5741578216aed557),
521  UINT64_C(0x155415a8412abd15), UINT64_C(0x77c1779fb6eee877), UINT64_C(0x37dc37a5eb6e9237), UINT64_C(0xe5b3e57b56d79ee5),
522  UINT64_C(0x9f469f8cd923139f), UINT64_C(0xf0e7f0d317fd23f0), UINT64_C(0x4a354a6a7f94204a), UINT64_C(0xda4fda9e95a944da),
523  UINT64_C(0x587d58fa25b0a258), UINT64_C(0xc903c906ca8fcfc9), UINT64_C(0x29a429558d527c29), UINT64_C(0x0a280a5022145a0a),
524  UINT64_C(0xb1feb1e14f7f50b1), UINT64_C(0xa0baa0691a5dc9a0), UINT64_C(0x6bb16b7fdad6146b), UINT64_C(0x852e855cab17d985),
525  UINT64_C(0xbdcebd8173673cbd), UINT64_C(0x5d695dd234ba8f5d), UINT64_C(0x1040108050209010), UINT64_C(0xf4f7f4f303f507f4),
526  UINT64_C(0xcb0bcb16c08bddcb), UINT64_C(0x3ef83eedc67cd33e), UINT64_C(0x05140528110a2d05), UINT64_C(0x6781671fe6ce7867),
527  UINT64_C(0xe4b7e47353d597e4), UINT64_C(0x279c2725bb4e0227), UINT64_C(0x4119413258827341), UINT64_C(0x8b168b2c9d0ba78b),
528  UINT64_C(0xa7a6a7510153f6a7), UINT64_C(0x7de97dcf94fab27d), UINT64_C(0x956e95dcfb374995), UINT64_C(0xd847d88e9fad56d8),
529  UINT64_C(0xfbcbfb8b30eb70fb), UINT64_C(0xee9fee2371c1cdee), UINT64_C(0x7ced7cc791f8bb7c), UINT64_C(0x66856617e3cc7166),
530  UINT64_C(0xdd53dda68ea77bdd), UINT64_C(0x175c17b84b2eaf17), UINT64_C(0x47014702468e4547), UINT64_C(0x9e429e84dc211a9e),
531  UINT64_C(0xca0fca1ec589d4ca), UINT64_C(0x2db42d75995a582d), UINT64_C(0xbfc6bf9179632ebf), UINT64_C(0x071c07381b0e3f07),
532  UINT64_C(0xad8ead012347acad), UINT64_C(0x5a755aea2fb4b05a), UINT64_C(0x8336836cb51bef83), UINT64_C(0x33cc3385ff66b633),
533  UINT64_C(0x6391633ff2c65c63), UINT64_C(0x020802100a041202), UINT64_C(0xaa92aa39384993aa), UINT64_C(0x71d971afa8e2de71),
534  UINT64_C(0xc807c80ecf8dc6c8), UINT64_C(0x196419c87d32d119), UINT64_C(0x4939497270923b49), UINT64_C(0xd943d9869aaf5fd9),
535  UINT64_C(0xf2eff2c31df931f2), UINT64_C(0xe3abe34b48dba8e3), UINT64_C(0x5b715be22ab6b95b), UINT64_C(0x881a8834920dbc88),
536  UINT64_C(0x9a529aa4c8293e9a), UINT64_C(0x2698262dbe4c0b26), UINT64_C(0x32c8328dfa64bf32), UINT64_C(0xb0fab0e94a7d59b0),
537  UINT64_C(0xe983e91b6acff2e9), UINT64_C(0x0f3c0f78331e770f), UINT64_C(0xd573d5e6a6b733d5), UINT64_C(0x803a8074ba1df480),
538  UINT64_C(0xbec2be997c6127be), UINT64_C(0xcd13cd26de87ebcd), UINT64_C(0x34d034bde4688934), UINT64_C(0x483d487a75903248),
539  UINT64_C(0xffdbffab24e354ff), UINT64_C(0x7af57af78ff48d7a), UINT64_C(0x907a90f4ea3d6490), UINT64_C(0x5f615fc23ebe9d5f),
540  UINT64_C(0x2080201da0403d20), UINT64_C(0x68bd6867d5d00f68), UINT64_C(0x1a681ad07234ca1a), UINT64_C(0xae82ae192c41b7ae),
541  UINT64_C(0xb4eab4c95e757db4), UINT64_C(0x544d549a19a8ce54), UINT64_C(0x937693ece53b7f93), UINT64_C(0x2288220daa442f22),
542  UINT64_C(0x648d6407e9c86364), UINT64_C(0xf1e3f1db12ff2af1), UINT64_C(0x73d173bfa2e6cc73), UINT64_C(0x124812905a248212),
543  UINT64_C(0x401d403a5d807a40), UINT64_C(0x0820084028104808), UINT64_C(0xc32bc356e89b95c3), UINT64_C(0xec97ec337bc5dfec),
544  UINT64_C(0xdb4bdb9690ab4ddb), UINT64_C(0xa1bea1611f5fc0a1), UINT64_C(0x8d0e8d1c8307918d), UINT64_C(0x3df43df5c97ac83d),
545  UINT64_C(0x976697ccf1335b97), UINT64_C(0x0000000000000000), UINT64_C(0xcf1bcf36d483f9cf), UINT64_C(0x2bac2b4587566e2b),
546  UINT64_C(0x76c57697b3ece176), UINT64_C(0x82328264b019e682), UINT64_C(0xd67fd6fea9b128d6), UINT64_C(0x1b6c1bd87736c31b),
547  UINT64_C(0xb5eeb5c15b7774b5), UINT64_C(0xaf86af112943beaf), UINT64_C(0x6ab56a77dfd41d6a), UINT64_C(0x505d50ba0da0ea50),
548  UINT64_C(0x450945124c8a5745), UINT64_C(0xf3ebf3cb18fb38f3), UINT64_C(0x30c0309df060ad30), UINT64_C(0xef9bef2b74c3c4ef),
549  UINT64_C(0x3ffc3fe5c37eda3f), UINT64_C(0x554955921caac755), UINT64_C(0xa2b2a2791059dba2), UINT64_C(0xea8fea0365c9e9ea),
550  UINT64_C(0x6589650fecca6a65), UINT64_C(0xbad2bab9686903ba), UINT64_C(0x2fbc2f65935e4a2f), UINT64_C(0xc027c04ee79d8ec0),
551  UINT64_C(0xde5fdebe81a160de), UINT64_C(0x1c701ce06c38fc1c), UINT64_C(0xfdd3fdbb2ee746fd), UINT64_C(0x4d294d52649a1f4d),
552  UINT64_C(0x927292e4e0397692), UINT64_C(0x75c9758fbceafa75), UINT64_C(0x061806301e0c3606), UINT64_C(0x8a128a249809ae8a),
553  UINT64_C(0xb2f2b2f940794bb2), UINT64_C(0xe6bfe66359d185e6), UINT64_C(0x0e380e70361c7e0e), UINT64_C(0x1f7c1ff8633ee71f),
554  UINT64_C(0x62956237f7c45562), UINT64_C(0xd477d4eea3b53ad4), UINT64_C(0xa89aa829324d81a8), UINT64_C(0x966296c4f4315296),
555  UINT64_C(0xf9c3f99b3aef62f9), UINT64_C(0xc533c566f697a3c5), UINT64_C(0x25942535b14a1025), UINT64_C(0x597959f220b2ab59),
556  UINT64_C(0x842a8454ae15d084), UINT64_C(0x72d572b7a7e4c572), UINT64_C(0x39e439d5dd72ec39), UINT64_C(0x4c2d4c5a6198164c),
557  UINT64_C(0x5e655eca3bbc945e), UINT64_C(0x78fd78e785f09f78), UINT64_C(0x38e038ddd870e538), UINT64_C(0x8c0a8c148605988c),
558  UINT64_C(0xd163d1c6b2bf17d1), UINT64_C(0xa5aea5410b57e4a5), UINT64_C(0xe2afe2434dd9a1e2), UINT64_C(0x6199612ff8c24e61),
559  UINT64_C(0xb3f6b3f1457b42b3), UINT64_C(0x21842115a5423421), UINT64_C(0x9c4a9c94d625089c), UINT64_C(0x1e781ef0663cee1e),
560  UINT64_C(0x4311432252866143), UINT64_C(0xc73bc776fc93b1c7), UINT64_C(0xfcd7fcb32be54ffc), UINT64_C(0x0410042014082404),
561  UINT64_C(0x515951b208a2e351), UINT64_C(0x995e99bcc72f2599), UINT64_C(0x6da96d4fc4da226d), UINT64_C(0x0d340d68391a650d),
562  UINT64_C(0xfacffa8335e979fa), UINT64_C(0xdf5bdfb684a369df), UINT64_C(0x7ee57ed79bfca97e), UINT64_C(0x2490243db4481924),
563  UINT64_C(0x3bec3bc5d776fe3b), UINT64_C(0xab96ab313d4b9aab), UINT64_C(0xce1fce3ed181f0ce), UINT64_C(0x1144118855229911),
564  UINT64_C(0x8f068f0c8903838f), UINT64_C(0x4e254e4a6b9c044e), UINT64_C(0xb7e6b7d1517366b7), UINT64_C(0xeb8beb0b60cbe0eb),
565  UINT64_C(0x3cf03cfdcc78c13c), UINT64_C(0x813e817cbf1ffd81), UINT64_C(0x946a94d4fe354094), UINT64_C(0xf7fbf7eb0cf31cf7),
566  UINT64_C(0xb9deb9a1676f18b9), UINT64_C(0x134c13985f268b13), UINT64_C(0x2cb02c7d9c58512c), UINT64_C(0xd36bd3d6b8bb05d3),
567  UINT64_C(0xe7bbe76b5cd38ce7), UINT64_C(0x6ea56e57cbdc396e), UINT64_C(0xc437c46ef395aac4), UINT64_C(0x030c03180f061b03),
568  UINT64_C(0x5645568a13acdc56), UINT64_C(0x440d441a49885e44), UINT64_C(0x7fe17fdf9efea07f), UINT64_C(0xa99ea921374f88a9),
569  UINT64_C(0x2aa82a4d8254672a), UINT64_C(0xbbd6bbb16d6b0abb), UINT64_C(0xc123c146e29f87c1), UINT64_C(0x535153a202a6f153),
570  UINT64_C(0xdc57dcae8ba572dc), UINT64_C(0x0b2c0b582716530b), UINT64_C(0x9d4e9d9cd327019d), UINT64_C(0x6cad6c47c1d82b6c),
571  UINT64_C(0x31c43195f562a431), UINT64_C(0x74cd7487b9e8f374), UINT64_C(0xf6fff6e309f115f6), UINT64_C(0x4605460a438c4c46),
572  UINT64_C(0xac8aac092645a5ac), UINT64_C(0x891e893c970fb589), UINT64_C(0x145014a04428b414), UINT64_C(0xe1a3e15b42dfbae1),
573  UINT64_C(0x165816b04e2ca616), UINT64_C(0x3ae83acdd274f73a), UINT64_C(0x69b9696fd0d20669), UINT64_C(0x092409482d124109),
574  UINT64_C(0x70dd70a7ade0d770), UINT64_C(0xb6e2b6d954716fb6), UINT64_C(0xd067d0ceb7bd1ed0), UINT64_C(0xed93ed3b7ec7d6ed),
575  UINT64_C(0xcc17cc2edb85e2cc), UINT64_C(0x4215422a57846842), UINT64_C(0x985a98b4c22d2c98), UINT64_C(0xa4aaa4490e55eda4),
576  UINT64_C(0x28a0285d88507528), UINT64_C(0x5c6d5cda31b8865c), UINT64_C(0xf8c7f8933fed6bf8), UINT64_C(0x86228644a411c286)
577 };
578 
579 const unsigned int Whirlpool::R = 10u;
580 
581 const uint64_t Whirlpool::rc[R + 1] = {
582  UINT64_C(0x0000000000000000),
583  UINT64_C(0x1823c6e887b8014f),
584  UINT64_C(0x36a6d2f5796f9152),
585  UINT64_C(0x60bc9b8ea30c7b35),
586  UINT64_C(0x1de0d7c22e4bfe57),
587  UINT64_C(0x157737e59ff04ada),
588  UINT64_C(0x58c9290ab1a06b85),
589  UINT64_C(0xbd5d10f4cb3e0567),
590  UINT64_C(0xe427418ba77d95d8),
591  UINT64_C(0xfbee7c66dd17479e),
592  UINT64_C(0xca2dbf07ad5a8333),
593 };
594 //---------------------------------------------------------------------------
595 
596 
597 /*
598  * Default constructor.
599  */
600 Whirlpool::Whirlpool()
601 {
602  reset();
603 }
604 //---------------------------------------------------------------------------
605 
606 
607 /*
608  * Resets the Whirlpool hash to initial value.
609  */
610 void Whirlpool::reset()
611 {
612  int i;
613 
614  memset(bitLength, 0, WHIRLPOOL_LENGTHBYTES);
615  bufferBits = 0;
616  bufferPos = 0;
617  buffer[0] = 0; /* it's only necessary to cleanup buffer[bufferPos] */
618  for (i = 0; i < WHIRLPOOL_DIGESTQUADWORDS; i++)
619  hash[i] = UINT64_C(0); /* initial value */
620 }
621 //---------------------------------------------------------------------------
622 
623 
624 /*
625  * Process the remaining bytes in the internal buffer and the usual
626  * prolog according to the standard.
627  */
628 void Whirlpool::finish(uint8_t* const result)
629 {
630  int i;
631  uint8_t* buffer = this->buffer;
632  uint8_t* bitLength = this->bitLength;
633  int bufferBits = this->bufferBits;
634  int bufferPos = this->bufferPos;
635  uint8_t* digest = result;
636 
637  // append a '1'-bit:
638  buffer[bufferPos] |= 0x80U >> (bufferBits & 7);
639  bufferPos++; // all remaining bits on the current u8 are set to zero.
640 
641  // Pad with zero bits to complete (N*WBLOCKBITS - LENGTHBITS) bits:
643  {
644  if (bufferPos < WHIRLPOOL_WBLOCKBYTES)
645  memset(&buffer[bufferPos], 0, WHIRLPOOL_WBLOCKBYTES - bufferPos);
646 
647  // process data block:
648  process_buffer();
649 
650  // reset buffer:
651  bufferPos = 0;
652  }
654  memset(&buffer[bufferPos], 0, (WHIRLPOOL_WBLOCKBYTES -
655  WHIRLPOOL_LENGTHBYTES) - bufferPos);
657 
658  // append bit length of hashed data:
659  memcpy(&buffer[WHIRLPOOL_WBLOCKBYTES - WHIRLPOOL_LENGTHBYTES], bitLength,
661 
662  // process data block:
663  process_buffer();
664 
665  // return the completed message digest
666  for (i = 0; i < WHIRLPOOL_DIGESTBYTES/8; i++)
667  {
668  digest[0] = static_cast<uint8_t>(this->hash[i] >> 56);
669  digest[1] = static_cast<uint8_t>(this->hash[i] >> 48);
670  digest[2] = static_cast<uint8_t>(this->hash[i] >> 40);
671  digest[3] = static_cast<uint8_t>(this->hash[i] >> 32);
672  digest[4] = static_cast<uint8_t>(this->hash[i] >> 24);
673  digest[5] = static_cast<uint8_t>(this->hash[i] >> 16);
674  digest[6] = static_cast<uint8_t>(this->hash[i] >> 8);
675  digest[7] = static_cast<uint8_t>(this->hash[i] );
676  digest += 8;
677  }
678  this->bufferBits = bufferBits;
679  this->bufferPos = bufferPos;
680 }
681 //---------------------------------------------------------------------------
682 
683 
684 /*
685  * Updates the Whirlpool hash with specified array of bytes.
686  */
687 void Whirlpool::update(const uint8_t* buf, size_t len)
688 {
689  /*
690  sourcePos
691  |
692  +-------+-------+-------
693  ||||||||||||||||||||| source
694  +-------+-------+-------
695  +-------+-------+-------+-------+-------+-------
696  |||||||||||||||||||||| buffer
697  +-------+-------+-------+-------+-------+-------
698  |
699  bufferPos
700  */
701 
702  size_t sourceBits = len * 8u;
703  int sourcePos = 0; /* index of leftmost source u8 containing data (1 to 8 bits). */
704  int sourceGap = (8 - (static_cast<int>(sourceBits) & 7)) & 7; /* space on source[sourcePos]. */
705  int bufferRem = bufferBits & 7; /* occupied bits on buffer[bufferPos]. */
706  int i;
707  uint32_t b, carry;
708  uint8_t* buffer = this->buffer;
709  uint8_t* bitLength = this->bitLength;
710  int bufferBits = this->bufferBits;
711  int bufferPos = this->bufferPos;
712 
713  // tally the length of the added data:
714  uint64_t value = sourceBits;
715  for (i = 31, carry = 0; i >= 0 && (carry != 0 || value != UINT64_C(0)); i--)
716  {
717  carry += bitLength[i] + (static_cast<uint32_t>(value) & 0xff);
718  bitLength[i] = static_cast<uint8_t>(carry);
719  carry >>= 8;
720  value >>= 8;
721  }
722 
723  // process data in chunks of 8 bits (a more efficient approach would be to take whole-word chunks):
724  while (sourceBits > 8)
725  {
726  // N.B. at least source[sourcePos] and source[sourcePos+1] contain data.
727  // take a byte from the source:
728  b = ((buf[sourcePos] << sourceGap) & 0xff) |
729  ((buf[sourcePos + 1] & 0xff) >> (8 - sourceGap));
730 
731  // process this byte:
732  buffer[bufferPos++] |= static_cast<uint8_t>(b >> bufferRem);
733  bufferBits += 8 - bufferRem; // bufferBits = 8*bufferPos;
734  if (bufferBits == WHIRLPOOL_DIGESTBITS)
735  {
736  // process data block:
737  process_buffer();
738 
739  // reset buffer:
740  bufferBits = 0;
741  bufferPos = 0;
742  }
743  buffer[bufferPos] = b << (8 - bufferRem);
744  bufferBits += bufferRem;
745 
746  // proceed to remaining data:
747  sourceBits -= 8;
748  sourcePos++;
749  }
750 
751  // now 0 <= sourceBits <= 8;
752  // furthermore, all data (if any is left) is in source[sourcePos].
753  if (sourceBits > 0)
754  {
755  b = (buf[sourcePos] << sourceGap) & 0xff; // bits are left-justified on b.
756 
757  // process the remaining bits:
758  buffer[bufferPos] |= b >> bufferRem;
759  }
760  else
761  b = 0;
762 
763  if (bufferRem + sourceBits < 8)
764  // all remaining data fits on buffer[bufferPos],
765  // and there still remains some space.
766  bufferBits += sourceBits;
767  else
768  {
769  // buffer[bufferPos] is full:
770  bufferPos++;
771  bufferBits += 8 - bufferRem; // bufferBits = 8*bufferPos;
772  sourceBits -= 8 - bufferRem;
773  // now 0 <= sourceBits < 8;
774  // furthermore, all data (if any is left) is in source[sourcePos].
775  if (bufferBits == WHIRLPOOL_DIGESTBITS)
776  {
777  // process data block:
778  process_buffer();
779 
780  // reset buffer:
781  bufferBits = 0;
782  bufferPos = 0;
783  }
784  buffer[bufferPos] = b << (8 - bufferRem);
785  bufferBits += static_cast<int>(sourceBits);
786  }
787  this->bufferBits = bufferBits;
788  this->bufferPos = bufferPos;
789 }
790 //---------------------------------------------------------------------------
791 
792 
793 /*
794  * The core Whirlpool transform.
795  */
796 void Whirlpool::process_buffer()
797 {
798  int i;
799  unsigned int r;
800  uint64_t K[8]; /* the round key */
801  uint64_t block[8]; /* mu(buffer) */
802  uint64_t state[8]; /* the cipher state */
803  uint64_t L[8];
804  uint8_t* buffer = this->buffer;
805 
806  // map the buffer to a block:
807  for (i = 0; i < 8; i++, buffer += 8)
808  block[i] = (((uint64_t)buffer[0] ) << 56) ^
809  (((uint64_t)buffer[1] & 0xffL) << 48) ^
810  (((uint64_t)buffer[2] & 0xffL) << 40) ^
811  (((uint64_t)buffer[3] & 0xffL) << 32) ^
812  (((uint64_t)buffer[4] & 0xffL) << 24) ^
813  (((uint64_t)buffer[5] & 0xffL) << 16) ^
814  (((uint64_t)buffer[6] & 0xffL) << 8) ^
815  (((uint64_t)buffer[7] & 0xffL) );
816 
817  // compute and apply K^0 to the cipher state:
818  state[0] = block[0] ^ (K[0] = this->hash[0]);
819  state[1] = block[1] ^ (K[1] = this->hash[1]);
820  state[2] = block[2] ^ (K[2] = this->hash[2]);
821  state[3] = block[3] ^ (K[3] = this->hash[3]);
822  state[4] = block[4] ^ (K[4] = this->hash[4]);
823  state[5] = block[5] ^ (K[5] = this->hash[5]);
824  state[6] = block[6] ^ (K[6] = this->hash[6]);
825  state[7] = block[7] ^ (K[7] = this->hash[7]);
826 
827  // iterate over all rounds:
828  for (r = 1; r <= R; r++)
829  {
830  // compute K^r from K^{r-1}:
831  L[0] =
832  C0[(int)(K[0] >> 56) ] ^
833  C1[(int)(K[7] >> 48) & 0xff] ^
834  C2[(int)(K[6] >> 40) & 0xff] ^
835  C3[(int)(K[5] >> 32) & 0xff] ^
836  C4[(int)(K[4] >> 24) & 0xff] ^
837  C5[(int)(K[3] >> 16) & 0xff] ^
838  C6[(int)(K[2] >> 8) & 0xff] ^
839  C7[(int)(K[1] ) & 0xff] ^
840  rc[r];
841  L[1] =
842  C0[(int)(K[1] >> 56) ] ^
843  C1[(int)(K[0] >> 48) & 0xff] ^
844  C2[(int)(K[7] >> 40) & 0xff] ^
845  C3[(int)(K[6] >> 32) & 0xff] ^
846  C4[(int)(K[5] >> 24) & 0xff] ^
847  C5[(int)(K[4] >> 16) & 0xff] ^
848  C6[(int)(K[3] >> 8) & 0xff] ^
849  C7[(int)(K[2] ) & 0xff];
850  L[2] =
851  C0[(int)(K[2] >> 56) ] ^
852  C1[(int)(K[1] >> 48) & 0xff] ^
853  C2[(int)(K[0] >> 40) & 0xff] ^
854  C3[(int)(K[7] >> 32) & 0xff] ^
855  C4[(int)(K[6] >> 24) & 0xff] ^
856  C5[(int)(K[5] >> 16) & 0xff] ^
857  C6[(int)(K[4] >> 8) & 0xff] ^
858  C7[(int)(K[3] ) & 0xff];
859  L[3] =
860  C0[(int)(K[3] >> 56) ] ^
861  C1[(int)(K[2] >> 48) & 0xff] ^
862  C2[(int)(K[1] >> 40) & 0xff] ^
863  C3[(int)(K[0] >> 32) & 0xff] ^
864  C4[(int)(K[7] >> 24) & 0xff] ^
865  C5[(int)(K[6] >> 16) & 0xff] ^
866  C6[(int)(K[5] >> 8) & 0xff] ^
867  C7[(int)(K[4] ) & 0xff];
868  L[4] =
869  C0[(int)(K[4] >> 56) ] ^
870  C1[(int)(K[3] >> 48) & 0xff] ^
871  C2[(int)(K[2] >> 40) & 0xff] ^
872  C3[(int)(K[1] >> 32) & 0xff] ^
873  C4[(int)(K[0] >> 24) & 0xff] ^
874  C5[(int)(K[7] >> 16) & 0xff] ^
875  C6[(int)(K[6] >> 8) & 0xff] ^
876  C7[(int)(K[5] ) & 0xff];
877  L[5] =
878  C0[(int)(K[5] >> 56) ] ^
879  C1[(int)(K[4] >> 48) & 0xff] ^
880  C2[(int)(K[3] >> 40) & 0xff] ^
881  C3[(int)(K[2] >> 32) & 0xff] ^
882  C4[(int)(K[1] >> 24) & 0xff] ^
883  C5[(int)(K[0] >> 16) & 0xff] ^
884  C6[(int)(K[7] >> 8) & 0xff] ^
885  C7[(int)(K[6] ) & 0xff];
886  L[6] =
887  C0[(int)(K[6] >> 56) ] ^
888  C1[(int)(K[5] >> 48) & 0xff] ^
889  C2[(int)(K[4] >> 40) & 0xff] ^
890  C3[(int)(K[3] >> 32) & 0xff] ^
891  C4[(int)(K[2] >> 24) & 0xff] ^
892  C5[(int)(K[1] >> 16) & 0xff] ^
893  C6[(int)(K[0] >> 8) & 0xff] ^
894  C7[(int)(K[7] ) & 0xff];
895  L[7] =
896  C0[(int)(K[7] >> 56) ] ^
897  C1[(int)(K[6] >> 48) & 0xff] ^
898  C2[(int)(K[5] >> 40) & 0xff] ^
899  C3[(int)(K[4] >> 32) & 0xff] ^
900  C4[(int)(K[3] >> 24) & 0xff] ^
901  C5[(int)(K[2] >> 16) & 0xff] ^
902  C6[(int)(K[1] >> 8) & 0xff] ^
903  C7[(int)(K[0] ) & 0xff];
904  K[0] = L[0];
905  K[1] = L[1];
906  K[2] = L[2];
907  K[3] = L[3];
908  K[4] = L[4];
909  K[5] = L[5];
910  K[6] = L[6];
911  K[7] = L[7];
912 
913  // apply the r-th round transformation:
914  L[0] =
915  C0[(int)(state[0] >> 56) ] ^
916  C1[(int)(state[7] >> 48) & 0xff] ^
917  C2[(int)(state[6] >> 40) & 0xff] ^
918  C3[(int)(state[5] >> 32) & 0xff] ^
919  C4[(int)(state[4] >> 24) & 0xff] ^
920  C5[(int)(state[3] >> 16) & 0xff] ^
921  C6[(int)(state[2] >> 8) & 0xff] ^
922  C7[(int)(state[1] ) & 0xff] ^
923  K[0];
924  L[1] =
925  C0[(int)(state[1] >> 56) ] ^
926  C1[(int)(state[0] >> 48) & 0xff] ^
927  C2[(int)(state[7] >> 40) & 0xff] ^
928  C3[(int)(state[6] >> 32) & 0xff] ^
929  C4[(int)(state[5] >> 24) & 0xff] ^
930  C5[(int)(state[4] >> 16) & 0xff] ^
931  C6[(int)(state[3] >> 8) & 0xff] ^
932  C7[(int)(state[2] ) & 0xff] ^
933  K[1];
934  L[2] =
935  C0[(int)(state[2] >> 56) ] ^
936  C1[(int)(state[1] >> 48) & 0xff] ^
937  C2[(int)(state[0] >> 40) & 0xff] ^
938  C3[(int)(state[7] >> 32) & 0xff] ^
939  C4[(int)(state[6] >> 24) & 0xff] ^
940  C5[(int)(state[5] >> 16) & 0xff] ^
941  C6[(int)(state[4] >> 8) & 0xff] ^
942  C7[(int)(state[3] ) & 0xff] ^
943  K[2];
944  L[3] =
945  C0[(int)(state[3] >> 56) ] ^
946  C1[(int)(state[2] >> 48) & 0xff] ^
947  C2[(int)(state[1] >> 40) & 0xff] ^
948  C3[(int)(state[0] >> 32) & 0xff] ^
949  C4[(int)(state[7] >> 24) & 0xff] ^
950  C5[(int)(state[6] >> 16) & 0xff] ^
951  C6[(int)(state[5] >> 8) & 0xff] ^
952  C7[(int)(state[4] ) & 0xff] ^
953  K[3];
954  L[4] =
955  C0[(int)(state[4] >> 56) ] ^
956  C1[(int)(state[3] >> 48) & 0xff] ^
957  C2[(int)(state[2] >> 40) & 0xff] ^
958  C3[(int)(state[1] >> 32) & 0xff] ^
959  C4[(int)(state[0] >> 24) & 0xff] ^
960  C5[(int)(state[7] >> 16) & 0xff] ^
961  C6[(int)(state[6] >> 8) & 0xff] ^
962  C7[(int)(state[5] ) & 0xff] ^
963  K[4];
964  L[5] =
965  C0[(int)(state[5] >> 56) ] ^
966  C1[(int)(state[4] >> 48) & 0xff] ^
967  C2[(int)(state[3] >> 40) & 0xff] ^
968  C3[(int)(state[2] >> 32) & 0xff] ^
969  C4[(int)(state[1] >> 24) & 0xff] ^
970  C5[(int)(state[0] >> 16) & 0xff] ^
971  C6[(int)(state[7] >> 8) & 0xff] ^
972  C7[(int)(state[6] ) & 0xff] ^
973  K[5];
974  L[6] =
975  C0[(int)(state[6] >> 56) ] ^
976  C1[(int)(state[5] >> 48) & 0xff] ^
977  C2[(int)(state[4] >> 40) & 0xff] ^
978  C3[(int)(state[3] >> 32) & 0xff] ^
979  C4[(int)(state[2] >> 24) & 0xff] ^
980  C5[(int)(state[1] >> 16) & 0xff] ^
981  C6[(int)(state[0] >> 8) & 0xff] ^
982  C7[(int)(state[7] ) & 0xff] ^
983  K[6];
984  L[7] =
985  C0[(int)(state[7] >> 56) ] ^
986  C1[(int)(state[6] >> 48) & 0xff] ^
987  C2[(int)(state[5] >> 40) & 0xff] ^
988  C3[(int)(state[4] >> 32) & 0xff] ^
989  C4[(int)(state[3] >> 24) & 0xff] ^
990  C5[(int)(state[2] >> 16) & 0xff] ^
991  C6[(int)(state[1] >> 8) & 0xff] ^
992  C7[(int)(state[0] ) & 0xff] ^
993  K[7];
994  state[0] = L[0];
995  state[1] = L[1];
996  state[2] = L[2];
997  state[3] = L[3];
998  state[4] = L[4];
999  state[5] = L[5];
1000  state[6] = L[6];
1001  state[7] = L[7];
1002  }
1003 
1004  // apply the Miyaguchi-Preneel compression function:
1005  this->hash[0] ^= state[0] ^ block[0];
1006  this->hash[1] ^= state[1] ^ block[1];
1007  this->hash[2] ^= state[2] ^ block[2];
1008  this->hash[3] ^= state[3] ^ block[3];
1009  this->hash[4] ^= state[4] ^ block[4];
1010  this->hash[5] ^= state[5] ^ block[5];
1011  this->hash[6] ^= state[6] ^ block[6];
1012  this->hash[7] ^= state[7] ^ block[7];
1013 }
1014 //---------------------------------------------------------------------------
1015 
1016 
1017 /*
1018  * Returns the Whirlpool hash value in the first 64 bytes of the given address.
1019  */
1020 uint8_t* Whirlpool::getValue(uint8_t* buffer) const
1021 {
1022  Whirlpool whirlpool(*this);
1023  whirlpool.finish(reinterpret_cast<uint8_t*>(buffer));
1024 
1025  return buffer;
1026 }
1027 //---------------------------------------------------------------------------
1028 
1029 
1030 // For doxygen
1031 /* @def UNALIGNED_P(p) Checks alignment. */
1032 
1036 } // namespace libxcks
1037 //---------------------------------------------------------------------------
Computes the Whirlpool hash from a byte stream.
Definition: whirlpool.hpp:58
void finish(uint8_t *const result)
Process the remaining bytes in the internal buffer and the usual prolog according to the standard.
Definition: whirlpool.cpp:628
#define R(a, b, c, d, e, f, k, r, s)
Helper value for RIPE-MD160's computing.
Compute Whirlpool hash.
#define WHIRLPOOL_DIGESTBYTES
Size of the message digest in bytes.
Definition: whirlpool.hpp:60
#define WHIRLPOOL_DIGESTQUADWORDS
Size of the message digest in quad words.
Definition: whirlpool.hpp:62
#define WHIRLPOOL_LENGTHBYTES
Number of hashed bytes.
Definition: whirlpool.hpp:67
#define WHIRLPOOL_WBLOCKBYTES
Size of the buffer of data for hashing in bytes.
Definition: whirlpool.hpp:64
#define WHIRLPOOL_DIGESTBITS
Size of the message digest in bits.
Definition: whirlpool.hpp:61