Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tpruvot
GitHub Repository: tpruvot/cpuminer-multi
Path: blob/linux/sha3/sph_groestl.c
1201 views
1
/* $Id: groestl.c 260 2011-07-21 01:02:38Z tp $ */
2
/*
3
* Groestl implementation.
4
*
5
* ==========================(LICENSE BEGIN)============================
6
*
7
* Copyright (c) 2007-2010 Projet RNRT SAPHIR
8
*
9
* Permission is hereby granted, free of charge, to any person obtaining
10
* a copy of this software and associated documentation files (the
11
* "Software"), to deal in the Software without restriction, including
12
* without limitation the rights to use, copy, modify, merge, publish,
13
* distribute, sublicense, and/or sell copies of the Software, and to
14
* permit persons to whom the Software is furnished to do so, subject to
15
* the following conditions:
16
*
17
* The above copyright notice and this permission notice shall be
18
* included in all copies or substantial portions of the Software.
19
*
20
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
*
28
* ===========================(LICENSE END)=============================
29
*
30
* @author Thomas Pornin <[email protected]>
31
*/
32
33
#include <stddef.h>
34
#include <string.h>
35
36
#include "sph_groestl.h"
37
38
#ifdef __cplusplus
39
extern "C"{
40
#endif
41
42
#if SPH_SMALL_FOOTPRINT && !defined SPH_SMALL_FOOTPRINT_GROESTL
43
#define SPH_SMALL_FOOTPRINT_GROESTL 1
44
#endif
45
46
/*
47
* Apparently, the 32-bit-only version is not faster than the 64-bit
48
* version unless using the "small footprint" code on a 32-bit machine.
49
*/
50
#if !defined SPH_GROESTL_64
51
#if SPH_SMALL_FOOTPRINT_GROESTL && !SPH_64_TRUE
52
#define SPH_GROESTL_64 0
53
#else
54
#define SPH_GROESTL_64 1
55
#endif
56
#endif
57
58
#if !SPH_64
59
#undef SPH_GROESTL_64
60
#endif
61
62
#ifdef _MSC_VER
63
#pragma warning (disable: 4146)
64
#endif
65
66
/*
67
* The internal representation may use either big-endian or
68
* little-endian. Using the platform default representation speeds up
69
* encoding and decoding between bytes and the matrix columns.
70
*/
71
72
#undef USE_LE
73
#if SPH_GROESTL_LITTLE_ENDIAN
74
#define USE_LE 1
75
#elif SPH_GROESTL_BIG_ENDIAN
76
#define USE_LE 0
77
#elif SPH_LITTLE_ENDIAN
78
#define USE_LE 1
79
#endif
80
81
#if USE_LE
82
83
#define C32e(x) ((SPH_C32(x) >> 24) \
84
| ((SPH_C32(x) >> 8) & SPH_C32(0x0000FF00)) \
85
| ((SPH_C32(x) << 8) & SPH_C32(0x00FF0000)) \
86
| ((SPH_C32(x) << 24) & SPH_C32(0xFF000000)))
87
#define dec32e_aligned sph_dec32le_aligned
88
#define enc32e sph_enc32le
89
#define B32_0(x) ((x) & 0xFF)
90
#define B32_1(x) (((x) >> 8) & 0xFF)
91
#define B32_2(x) (((x) >> 16) & 0xFF)
92
#define B32_3(x) ((x) >> 24)
93
94
#define R32u(u, d) SPH_T32(((u) << 16) | ((d) >> 16))
95
#define R32d(u, d) SPH_T32(((u) >> 16) | ((d) << 16))
96
97
#define PC32up(j, r) ((sph_u32)((j) + (r)))
98
#define PC32dn(j, r) 0
99
#define QC32up(j, r) SPH_C32(0xFFFFFFFF)
100
#define QC32dn(j, r) (((sph_u32)(r) << 24) ^ SPH_T32(~((sph_u32)(j) << 24)))
101
102
#if SPH_64
103
#define C64e(x) ((SPH_C64(x) >> 56) \
104
| ((SPH_C64(x) >> 40) & SPH_C64(0x000000000000FF00)) \
105
| ((SPH_C64(x) >> 24) & SPH_C64(0x0000000000FF0000)) \
106
| ((SPH_C64(x) >> 8) & SPH_C64(0x00000000FF000000)) \
107
| ((SPH_C64(x) << 8) & SPH_C64(0x000000FF00000000)) \
108
| ((SPH_C64(x) << 24) & SPH_C64(0x0000FF0000000000)) \
109
| ((SPH_C64(x) << 40) & SPH_C64(0x00FF000000000000)) \
110
| ((SPH_C64(x) << 56) & SPH_C64(0xFF00000000000000)))
111
#define dec64e_aligned sph_dec64le_aligned
112
#define enc64e sph_enc64le
113
#define B64_0(x) ((x) & 0xFF)
114
#define B64_1(x) (((x) >> 8) & 0xFF)
115
#define B64_2(x) (((x) >> 16) & 0xFF)
116
#define B64_3(x) (((x) >> 24) & 0xFF)
117
#define B64_4(x) (((x) >> 32) & 0xFF)
118
#define B64_5(x) (((x) >> 40) & 0xFF)
119
#define B64_6(x) (((x) >> 48) & 0xFF)
120
#define B64_7(x) ((x) >> 56)
121
#define R64 SPH_ROTL64
122
#define PC64(j, r) ((sph_u64)((j) + (r)))
123
#define QC64(j, r) (((sph_u64)(r) << 56) ^ SPH_T64(~((sph_u64)(j) << 56)))
124
#endif
125
126
#else
127
128
#define C32e(x) SPH_C32(x)
129
#define dec32e_aligned sph_dec32be_aligned
130
#define enc32e sph_enc32be
131
#define B32_0(x) ((x) >> 24)
132
#define B32_1(x) (((x) >> 16) & 0xFF)
133
#define B32_2(x) (((x) >> 8) & 0xFF)
134
#define B32_3(x) ((x) & 0xFF)
135
136
#define R32u(u, d) SPH_T32(((u) >> 16) | ((d) << 16))
137
#define R32d(u, d) SPH_T32(((u) << 16) | ((d) >> 16))
138
139
#define PC32up(j, r) ((sph_u32)((j) + (r)) << 24)
140
#define PC32dn(j, r) 0
141
#define QC32up(j, r) SPH_C32(0xFFFFFFFF)
142
#define QC32dn(j, r) ((sph_u32)(r) ^ SPH_T32(~(sph_u32)(j)))
143
144
#if SPH_64
145
#define C64e(x) SPH_C64(x)
146
#define dec64e_aligned sph_dec64be_aligned
147
#define enc64e sph_enc64be
148
#define B64_0(x) ((x) >> 56)
149
#define B64_1(x) (((x) >> 48) & 0xFF)
150
#define B64_2(x) (((x) >> 40) & 0xFF)
151
#define B64_3(x) (((x) >> 32) & 0xFF)
152
#define B64_4(x) (((x) >> 24) & 0xFF)
153
#define B64_5(x) (((x) >> 16) & 0xFF)
154
#define B64_6(x) (((x) >> 8) & 0xFF)
155
#define B64_7(x) ((x) & 0xFF)
156
#define R64 SPH_ROTR64
157
#define PC64(j, r) ((sph_u64)((j) + (r)) << 56)
158
#define QC64(j, r) ((sph_u64)(r) ^ SPH_T64(~(sph_u64)(j)))
159
#endif
160
161
#endif
162
163
#if SPH_GROESTL_64
164
165
static const sph_u64 T0[] = {
166
C64e(0xc632f4a5f497a5c6), C64e(0xf86f978497eb84f8),
167
C64e(0xee5eb099b0c799ee), C64e(0xf67a8c8d8cf78df6),
168
C64e(0xffe8170d17e50dff), C64e(0xd60adcbddcb7bdd6),
169
C64e(0xde16c8b1c8a7b1de), C64e(0x916dfc54fc395491),
170
C64e(0x6090f050f0c05060), C64e(0x0207050305040302),
171
C64e(0xce2ee0a9e087a9ce), C64e(0x56d1877d87ac7d56),
172
C64e(0xe7cc2b192bd519e7), C64e(0xb513a662a67162b5),
173
C64e(0x4d7c31e6319ae64d), C64e(0xec59b59ab5c39aec),
174
C64e(0x8f40cf45cf05458f), C64e(0x1fa3bc9dbc3e9d1f),
175
C64e(0x8949c040c0094089), C64e(0xfa68928792ef87fa),
176
C64e(0xefd03f153fc515ef), C64e(0xb29426eb267febb2),
177
C64e(0x8ece40c94007c98e), C64e(0xfbe61d0b1ded0bfb),
178
C64e(0x416e2fec2f82ec41), C64e(0xb31aa967a97d67b3),
179
C64e(0x5f431cfd1cbefd5f), C64e(0x456025ea258aea45),
180
C64e(0x23f9dabfda46bf23), C64e(0x535102f702a6f753),
181
C64e(0xe445a196a1d396e4), C64e(0x9b76ed5bed2d5b9b),
182
C64e(0x75285dc25deac275), C64e(0xe1c5241c24d91ce1),
183
C64e(0x3dd4e9aee97aae3d), C64e(0x4cf2be6abe986a4c),
184
C64e(0x6c82ee5aeed85a6c), C64e(0x7ebdc341c3fc417e),
185
C64e(0xf5f3060206f102f5), C64e(0x8352d14fd11d4f83),
186
C64e(0x688ce45ce4d05c68), C64e(0x515607f407a2f451),
187
C64e(0xd18d5c345cb934d1), C64e(0xf9e1180818e908f9),
188
C64e(0xe24cae93aedf93e2), C64e(0xab3e9573954d73ab),
189
C64e(0x6297f553f5c45362), C64e(0x2a6b413f41543f2a),
190
C64e(0x081c140c14100c08), C64e(0x9563f652f6315295),
191
C64e(0x46e9af65af8c6546), C64e(0x9d7fe25ee2215e9d),
192
C64e(0x3048782878602830), C64e(0x37cff8a1f86ea137),
193
C64e(0x0a1b110f11140f0a), C64e(0x2febc4b5c45eb52f),
194
C64e(0x0e151b091b1c090e), C64e(0x247e5a365a483624),
195
C64e(0x1badb69bb6369b1b), C64e(0xdf98473d47a53ddf),
196
C64e(0xcda76a266a8126cd), C64e(0x4ef5bb69bb9c694e),
197
C64e(0x7f334ccd4cfecd7f), C64e(0xea50ba9fbacf9fea),
198
C64e(0x123f2d1b2d241b12), C64e(0x1da4b99eb93a9e1d),
199
C64e(0x58c49c749cb07458), C64e(0x3446722e72682e34),
200
C64e(0x3641772d776c2d36), C64e(0xdc11cdb2cda3b2dc),
201
C64e(0xb49d29ee2973eeb4), C64e(0x5b4d16fb16b6fb5b),
202
C64e(0xa4a501f60153f6a4), C64e(0x76a1d74dd7ec4d76),
203
C64e(0xb714a361a37561b7), C64e(0x7d3449ce49face7d),
204
C64e(0x52df8d7b8da47b52), C64e(0xdd9f423e42a13edd),
205
C64e(0x5ecd937193bc715e), C64e(0x13b1a297a2269713),
206
C64e(0xa6a204f50457f5a6), C64e(0xb901b868b86968b9),
207
C64e(0x0000000000000000), C64e(0xc1b5742c74992cc1),
208
C64e(0x40e0a060a0806040), C64e(0xe3c2211f21dd1fe3),
209
C64e(0x793a43c843f2c879), C64e(0xb69a2ced2c77edb6),
210
C64e(0xd40dd9bed9b3bed4), C64e(0x8d47ca46ca01468d),
211
C64e(0x671770d970ced967), C64e(0x72afdd4bdde44b72),
212
C64e(0x94ed79de7933de94), C64e(0x98ff67d4672bd498),
213
C64e(0xb09323e8237be8b0), C64e(0x855bde4ade114a85),
214
C64e(0xbb06bd6bbd6d6bbb), C64e(0xc5bb7e2a7e912ac5),
215
C64e(0x4f7b34e5349ee54f), C64e(0xedd73a163ac116ed),
216
C64e(0x86d254c55417c586), C64e(0x9af862d7622fd79a),
217
C64e(0x6699ff55ffcc5566), C64e(0x11b6a794a7229411),
218
C64e(0x8ac04acf4a0fcf8a), C64e(0xe9d9301030c910e9),
219
C64e(0x040e0a060a080604), C64e(0xfe66988198e781fe),
220
C64e(0xa0ab0bf00b5bf0a0), C64e(0x78b4cc44ccf04478),
221
C64e(0x25f0d5bad54aba25), C64e(0x4b753ee33e96e34b),
222
C64e(0xa2ac0ef30e5ff3a2), C64e(0x5d4419fe19bafe5d),
223
C64e(0x80db5bc05b1bc080), C64e(0x0580858a850a8a05),
224
C64e(0x3fd3ecadec7ead3f), C64e(0x21fedfbcdf42bc21),
225
C64e(0x70a8d848d8e04870), C64e(0xf1fd0c040cf904f1),
226
C64e(0x63197adf7ac6df63), C64e(0x772f58c158eec177),
227
C64e(0xaf309f759f4575af), C64e(0x42e7a563a5846342),
228
C64e(0x2070503050403020), C64e(0xe5cb2e1a2ed11ae5),
229
C64e(0xfdef120e12e10efd), C64e(0xbf08b76db7656dbf),
230
C64e(0x8155d44cd4194c81), C64e(0x18243c143c301418),
231
C64e(0x26795f355f4c3526), C64e(0xc3b2712f719d2fc3),
232
C64e(0xbe8638e13867e1be), C64e(0x35c8fda2fd6aa235),
233
C64e(0x88c74fcc4f0bcc88), C64e(0x2e654b394b5c392e),
234
C64e(0x936af957f93d5793), C64e(0x55580df20daaf255),
235
C64e(0xfc619d829de382fc), C64e(0x7ab3c947c9f4477a),
236
C64e(0xc827efacef8bacc8), C64e(0xba8832e7326fe7ba),
237
C64e(0x324f7d2b7d642b32), C64e(0xe642a495a4d795e6),
238
C64e(0xc03bfba0fb9ba0c0), C64e(0x19aab398b3329819),
239
C64e(0x9ef668d16827d19e), C64e(0xa322817f815d7fa3),
240
C64e(0x44eeaa66aa886644), C64e(0x54d6827e82a87e54),
241
C64e(0x3bdde6abe676ab3b), C64e(0x0b959e839e16830b),
242
C64e(0x8cc945ca4503ca8c), C64e(0xc7bc7b297b9529c7),
243
C64e(0x6b056ed36ed6d36b), C64e(0x286c443c44503c28),
244
C64e(0xa72c8b798b5579a7), C64e(0xbc813de23d63e2bc),
245
C64e(0x1631271d272c1d16), C64e(0xad379a769a4176ad),
246
C64e(0xdb964d3b4dad3bdb), C64e(0x649efa56fac85664),
247
C64e(0x74a6d24ed2e84e74), C64e(0x1436221e22281e14),
248
C64e(0x92e476db763fdb92), C64e(0x0c121e0a1e180a0c),
249
C64e(0x48fcb46cb4906c48), C64e(0xb88f37e4376be4b8),
250
C64e(0x9f78e75de7255d9f), C64e(0xbd0fb26eb2616ebd),
251
C64e(0x43692aef2a86ef43), C64e(0xc435f1a6f193a6c4),
252
C64e(0x39dae3a8e372a839), C64e(0x31c6f7a4f762a431),
253
C64e(0xd38a593759bd37d3), C64e(0xf274868b86ff8bf2),
254
C64e(0xd583563256b132d5), C64e(0x8b4ec543c50d438b),
255
C64e(0x6e85eb59ebdc596e), C64e(0xda18c2b7c2afb7da),
256
C64e(0x018e8f8c8f028c01), C64e(0xb11dac64ac7964b1),
257
C64e(0x9cf16dd26d23d29c), C64e(0x49723be03b92e049),
258
C64e(0xd81fc7b4c7abb4d8), C64e(0xacb915fa1543faac),
259
C64e(0xf3fa090709fd07f3), C64e(0xcfa06f256f8525cf),
260
C64e(0xca20eaafea8fafca), C64e(0xf47d898e89f38ef4),
261
C64e(0x476720e9208ee947), C64e(0x1038281828201810),
262
C64e(0x6f0b64d564ded56f), C64e(0xf073838883fb88f0),
263
C64e(0x4afbb16fb1946f4a), C64e(0x5cca967296b8725c),
264
C64e(0x38546c246c702438), C64e(0x575f08f108aef157),
265
C64e(0x732152c752e6c773), C64e(0x9764f351f3355197),
266
C64e(0xcbae6523658d23cb), C64e(0xa125847c84597ca1),
267
C64e(0xe857bf9cbfcb9ce8), C64e(0x3e5d6321637c213e),
268
C64e(0x96ea7cdd7c37dd96), C64e(0x611e7fdc7fc2dc61),
269
C64e(0x0d9c9186911a860d), C64e(0x0f9b9485941e850f),
270
C64e(0xe04bab90abdb90e0), C64e(0x7cbac642c6f8427c),
271
C64e(0x712657c457e2c471), C64e(0xcc29e5aae583aacc),
272
C64e(0x90e373d8733bd890), C64e(0x06090f050f0c0506),
273
C64e(0xf7f4030103f501f7), C64e(0x1c2a36123638121c),
274
C64e(0xc23cfea3fe9fa3c2), C64e(0x6a8be15fe1d45f6a),
275
C64e(0xaebe10f91047f9ae), C64e(0x69026bd06bd2d069),
276
C64e(0x17bfa891a82e9117), C64e(0x9971e858e8295899),
277
C64e(0x3a5369276974273a), C64e(0x27f7d0b9d04eb927),
278
C64e(0xd991483848a938d9), C64e(0xebde351335cd13eb),
279
C64e(0x2be5ceb3ce56b32b), C64e(0x2277553355443322),
280
C64e(0xd204d6bbd6bfbbd2), C64e(0xa9399070904970a9),
281
C64e(0x07878089800e8907), C64e(0x33c1f2a7f266a733),
282
C64e(0x2decc1b6c15ab62d), C64e(0x3c5a66226678223c),
283
C64e(0x15b8ad92ad2a9215), C64e(0xc9a96020608920c9),
284
C64e(0x875cdb49db154987), C64e(0xaab01aff1a4fffaa),
285
C64e(0x50d8887888a07850), C64e(0xa52b8e7a8e517aa5),
286
C64e(0x03898a8f8a068f03), C64e(0x594a13f813b2f859),
287
C64e(0x09929b809b128009), C64e(0x1a2339173934171a),
288
C64e(0x651075da75cada65), C64e(0xd784533153b531d7),
289
C64e(0x84d551c65113c684), C64e(0xd003d3b8d3bbb8d0),
290
C64e(0x82dc5ec35e1fc382), C64e(0x29e2cbb0cb52b029),
291
C64e(0x5ac3997799b4775a), C64e(0x1e2d3311333c111e),
292
C64e(0x7b3d46cb46f6cb7b), C64e(0xa8b71ffc1f4bfca8),
293
C64e(0x6d0c61d661dad66d), C64e(0x2c624e3a4e583a2c)
294
};
295
296
#if !SPH_SMALL_FOOTPRINT_GROESTL
297
298
static const sph_u64 T1[] = {
299
C64e(0xc6c632f4a5f497a5), C64e(0xf8f86f978497eb84),
300
C64e(0xeeee5eb099b0c799), C64e(0xf6f67a8c8d8cf78d),
301
C64e(0xffffe8170d17e50d), C64e(0xd6d60adcbddcb7bd),
302
C64e(0xdede16c8b1c8a7b1), C64e(0x91916dfc54fc3954),
303
C64e(0x606090f050f0c050), C64e(0x0202070503050403),
304
C64e(0xcece2ee0a9e087a9), C64e(0x5656d1877d87ac7d),
305
C64e(0xe7e7cc2b192bd519), C64e(0xb5b513a662a67162),
306
C64e(0x4d4d7c31e6319ae6), C64e(0xecec59b59ab5c39a),
307
C64e(0x8f8f40cf45cf0545), C64e(0x1f1fa3bc9dbc3e9d),
308
C64e(0x898949c040c00940), C64e(0xfafa68928792ef87),
309
C64e(0xefefd03f153fc515), C64e(0xb2b29426eb267feb),
310
C64e(0x8e8ece40c94007c9), C64e(0xfbfbe61d0b1ded0b),
311
C64e(0x41416e2fec2f82ec), C64e(0xb3b31aa967a97d67),
312
C64e(0x5f5f431cfd1cbefd), C64e(0x45456025ea258aea),
313
C64e(0x2323f9dabfda46bf), C64e(0x53535102f702a6f7),
314
C64e(0xe4e445a196a1d396), C64e(0x9b9b76ed5bed2d5b),
315
C64e(0x7575285dc25deac2), C64e(0xe1e1c5241c24d91c),
316
C64e(0x3d3dd4e9aee97aae), C64e(0x4c4cf2be6abe986a),
317
C64e(0x6c6c82ee5aeed85a), C64e(0x7e7ebdc341c3fc41),
318
C64e(0xf5f5f3060206f102), C64e(0x838352d14fd11d4f),
319
C64e(0x68688ce45ce4d05c), C64e(0x51515607f407a2f4),
320
C64e(0xd1d18d5c345cb934), C64e(0xf9f9e1180818e908),
321
C64e(0xe2e24cae93aedf93), C64e(0xabab3e9573954d73),
322
C64e(0x626297f553f5c453), C64e(0x2a2a6b413f41543f),
323
C64e(0x08081c140c14100c), C64e(0x959563f652f63152),
324
C64e(0x4646e9af65af8c65), C64e(0x9d9d7fe25ee2215e),
325
C64e(0x3030487828786028), C64e(0x3737cff8a1f86ea1),
326
C64e(0x0a0a1b110f11140f), C64e(0x2f2febc4b5c45eb5),
327
C64e(0x0e0e151b091b1c09), C64e(0x24247e5a365a4836),
328
C64e(0x1b1badb69bb6369b), C64e(0xdfdf98473d47a53d),
329
C64e(0xcdcda76a266a8126), C64e(0x4e4ef5bb69bb9c69),
330
C64e(0x7f7f334ccd4cfecd), C64e(0xeaea50ba9fbacf9f),
331
C64e(0x12123f2d1b2d241b), C64e(0x1d1da4b99eb93a9e),
332
C64e(0x5858c49c749cb074), C64e(0x343446722e72682e),
333
C64e(0x363641772d776c2d), C64e(0xdcdc11cdb2cda3b2),
334
C64e(0xb4b49d29ee2973ee), C64e(0x5b5b4d16fb16b6fb),
335
C64e(0xa4a4a501f60153f6), C64e(0x7676a1d74dd7ec4d),
336
C64e(0xb7b714a361a37561), C64e(0x7d7d3449ce49face),
337
C64e(0x5252df8d7b8da47b), C64e(0xdddd9f423e42a13e),
338
C64e(0x5e5ecd937193bc71), C64e(0x1313b1a297a22697),
339
C64e(0xa6a6a204f50457f5), C64e(0xb9b901b868b86968),
340
C64e(0x0000000000000000), C64e(0xc1c1b5742c74992c),
341
C64e(0x4040e0a060a08060), C64e(0xe3e3c2211f21dd1f),
342
C64e(0x79793a43c843f2c8), C64e(0xb6b69a2ced2c77ed),
343
C64e(0xd4d40dd9bed9b3be), C64e(0x8d8d47ca46ca0146),
344
C64e(0x67671770d970ced9), C64e(0x7272afdd4bdde44b),
345
C64e(0x9494ed79de7933de), C64e(0x9898ff67d4672bd4),
346
C64e(0xb0b09323e8237be8), C64e(0x85855bde4ade114a),
347
C64e(0xbbbb06bd6bbd6d6b), C64e(0xc5c5bb7e2a7e912a),
348
C64e(0x4f4f7b34e5349ee5), C64e(0xededd73a163ac116),
349
C64e(0x8686d254c55417c5), C64e(0x9a9af862d7622fd7),
350
C64e(0x666699ff55ffcc55), C64e(0x1111b6a794a72294),
351
C64e(0x8a8ac04acf4a0fcf), C64e(0xe9e9d9301030c910),
352
C64e(0x04040e0a060a0806), C64e(0xfefe66988198e781),
353
C64e(0xa0a0ab0bf00b5bf0), C64e(0x7878b4cc44ccf044),
354
C64e(0x2525f0d5bad54aba), C64e(0x4b4b753ee33e96e3),
355
C64e(0xa2a2ac0ef30e5ff3), C64e(0x5d5d4419fe19bafe),
356
C64e(0x8080db5bc05b1bc0), C64e(0x050580858a850a8a),
357
C64e(0x3f3fd3ecadec7ead), C64e(0x2121fedfbcdf42bc),
358
C64e(0x7070a8d848d8e048), C64e(0xf1f1fd0c040cf904),
359
C64e(0x6363197adf7ac6df), C64e(0x77772f58c158eec1),
360
C64e(0xafaf309f759f4575), C64e(0x4242e7a563a58463),
361
C64e(0x2020705030504030), C64e(0xe5e5cb2e1a2ed11a),
362
C64e(0xfdfdef120e12e10e), C64e(0xbfbf08b76db7656d),
363
C64e(0x818155d44cd4194c), C64e(0x1818243c143c3014),
364
C64e(0x2626795f355f4c35), C64e(0xc3c3b2712f719d2f),
365
C64e(0xbebe8638e13867e1), C64e(0x3535c8fda2fd6aa2),
366
C64e(0x8888c74fcc4f0bcc), C64e(0x2e2e654b394b5c39),
367
C64e(0x93936af957f93d57), C64e(0x5555580df20daaf2),
368
C64e(0xfcfc619d829de382), C64e(0x7a7ab3c947c9f447),
369
C64e(0xc8c827efacef8bac), C64e(0xbaba8832e7326fe7),
370
C64e(0x32324f7d2b7d642b), C64e(0xe6e642a495a4d795),
371
C64e(0xc0c03bfba0fb9ba0), C64e(0x1919aab398b33298),
372
C64e(0x9e9ef668d16827d1), C64e(0xa3a322817f815d7f),
373
C64e(0x4444eeaa66aa8866), C64e(0x5454d6827e82a87e),
374
C64e(0x3b3bdde6abe676ab), C64e(0x0b0b959e839e1683),
375
C64e(0x8c8cc945ca4503ca), C64e(0xc7c7bc7b297b9529),
376
C64e(0x6b6b056ed36ed6d3), C64e(0x28286c443c44503c),
377
C64e(0xa7a72c8b798b5579), C64e(0xbcbc813de23d63e2),
378
C64e(0x161631271d272c1d), C64e(0xadad379a769a4176),
379
C64e(0xdbdb964d3b4dad3b), C64e(0x64649efa56fac856),
380
C64e(0x7474a6d24ed2e84e), C64e(0x141436221e22281e),
381
C64e(0x9292e476db763fdb), C64e(0x0c0c121e0a1e180a),
382
C64e(0x4848fcb46cb4906c), C64e(0xb8b88f37e4376be4),
383
C64e(0x9f9f78e75de7255d), C64e(0xbdbd0fb26eb2616e),
384
C64e(0x4343692aef2a86ef), C64e(0xc4c435f1a6f193a6),
385
C64e(0x3939dae3a8e372a8), C64e(0x3131c6f7a4f762a4),
386
C64e(0xd3d38a593759bd37), C64e(0xf2f274868b86ff8b),
387
C64e(0xd5d583563256b132), C64e(0x8b8b4ec543c50d43),
388
C64e(0x6e6e85eb59ebdc59), C64e(0xdada18c2b7c2afb7),
389
C64e(0x01018e8f8c8f028c), C64e(0xb1b11dac64ac7964),
390
C64e(0x9c9cf16dd26d23d2), C64e(0x4949723be03b92e0),
391
C64e(0xd8d81fc7b4c7abb4), C64e(0xacacb915fa1543fa),
392
C64e(0xf3f3fa090709fd07), C64e(0xcfcfa06f256f8525),
393
C64e(0xcaca20eaafea8faf), C64e(0xf4f47d898e89f38e),
394
C64e(0x47476720e9208ee9), C64e(0x1010382818282018),
395
C64e(0x6f6f0b64d564ded5), C64e(0xf0f073838883fb88),
396
C64e(0x4a4afbb16fb1946f), C64e(0x5c5cca967296b872),
397
C64e(0x3838546c246c7024), C64e(0x57575f08f108aef1),
398
C64e(0x73732152c752e6c7), C64e(0x979764f351f33551),
399
C64e(0xcbcbae6523658d23), C64e(0xa1a125847c84597c),
400
C64e(0xe8e857bf9cbfcb9c), C64e(0x3e3e5d6321637c21),
401
C64e(0x9696ea7cdd7c37dd), C64e(0x61611e7fdc7fc2dc),
402
C64e(0x0d0d9c9186911a86), C64e(0x0f0f9b9485941e85),
403
C64e(0xe0e04bab90abdb90), C64e(0x7c7cbac642c6f842),
404
C64e(0x71712657c457e2c4), C64e(0xcccc29e5aae583aa),
405
C64e(0x9090e373d8733bd8), C64e(0x0606090f050f0c05),
406
C64e(0xf7f7f4030103f501), C64e(0x1c1c2a3612363812),
407
C64e(0xc2c23cfea3fe9fa3), C64e(0x6a6a8be15fe1d45f),
408
C64e(0xaeaebe10f91047f9), C64e(0x6969026bd06bd2d0),
409
C64e(0x1717bfa891a82e91), C64e(0x999971e858e82958),
410
C64e(0x3a3a536927697427), C64e(0x2727f7d0b9d04eb9),
411
C64e(0xd9d991483848a938), C64e(0xebebde351335cd13),
412
C64e(0x2b2be5ceb3ce56b3), C64e(0x2222775533554433),
413
C64e(0xd2d204d6bbd6bfbb), C64e(0xa9a9399070904970),
414
C64e(0x0707878089800e89), C64e(0x3333c1f2a7f266a7),
415
C64e(0x2d2decc1b6c15ab6), C64e(0x3c3c5a6622667822),
416
C64e(0x1515b8ad92ad2a92), C64e(0xc9c9a96020608920),
417
C64e(0x87875cdb49db1549), C64e(0xaaaab01aff1a4fff),
418
C64e(0x5050d8887888a078), C64e(0xa5a52b8e7a8e517a),
419
C64e(0x0303898a8f8a068f), C64e(0x59594a13f813b2f8),
420
C64e(0x0909929b809b1280), C64e(0x1a1a233917393417),
421
C64e(0x65651075da75cada), C64e(0xd7d784533153b531),
422
C64e(0x8484d551c65113c6), C64e(0xd0d003d3b8d3bbb8),
423
C64e(0x8282dc5ec35e1fc3), C64e(0x2929e2cbb0cb52b0),
424
C64e(0x5a5ac3997799b477), C64e(0x1e1e2d3311333c11),
425
C64e(0x7b7b3d46cb46f6cb), C64e(0xa8a8b71ffc1f4bfc),
426
C64e(0x6d6d0c61d661dad6), C64e(0x2c2c624e3a4e583a)
427
};
428
429
static const sph_u64 T2[] = {
430
C64e(0xa5c6c632f4a5f497), C64e(0x84f8f86f978497eb),
431
C64e(0x99eeee5eb099b0c7), C64e(0x8df6f67a8c8d8cf7),
432
C64e(0x0dffffe8170d17e5), C64e(0xbdd6d60adcbddcb7),
433
C64e(0xb1dede16c8b1c8a7), C64e(0x5491916dfc54fc39),
434
C64e(0x50606090f050f0c0), C64e(0x0302020705030504),
435
C64e(0xa9cece2ee0a9e087), C64e(0x7d5656d1877d87ac),
436
C64e(0x19e7e7cc2b192bd5), C64e(0x62b5b513a662a671),
437
C64e(0xe64d4d7c31e6319a), C64e(0x9aecec59b59ab5c3),
438
C64e(0x458f8f40cf45cf05), C64e(0x9d1f1fa3bc9dbc3e),
439
C64e(0x40898949c040c009), C64e(0x87fafa68928792ef),
440
C64e(0x15efefd03f153fc5), C64e(0xebb2b29426eb267f),
441
C64e(0xc98e8ece40c94007), C64e(0x0bfbfbe61d0b1ded),
442
C64e(0xec41416e2fec2f82), C64e(0x67b3b31aa967a97d),
443
C64e(0xfd5f5f431cfd1cbe), C64e(0xea45456025ea258a),
444
C64e(0xbf2323f9dabfda46), C64e(0xf753535102f702a6),
445
C64e(0x96e4e445a196a1d3), C64e(0x5b9b9b76ed5bed2d),
446
C64e(0xc27575285dc25dea), C64e(0x1ce1e1c5241c24d9),
447
C64e(0xae3d3dd4e9aee97a), C64e(0x6a4c4cf2be6abe98),
448
C64e(0x5a6c6c82ee5aeed8), C64e(0x417e7ebdc341c3fc),
449
C64e(0x02f5f5f3060206f1), C64e(0x4f838352d14fd11d),
450
C64e(0x5c68688ce45ce4d0), C64e(0xf451515607f407a2),
451
C64e(0x34d1d18d5c345cb9), C64e(0x08f9f9e1180818e9),
452
C64e(0x93e2e24cae93aedf), C64e(0x73abab3e9573954d),
453
C64e(0x53626297f553f5c4), C64e(0x3f2a2a6b413f4154),
454
C64e(0x0c08081c140c1410), C64e(0x52959563f652f631),
455
C64e(0x654646e9af65af8c), C64e(0x5e9d9d7fe25ee221),
456
C64e(0x2830304878287860), C64e(0xa13737cff8a1f86e),
457
C64e(0x0f0a0a1b110f1114), C64e(0xb52f2febc4b5c45e),
458
C64e(0x090e0e151b091b1c), C64e(0x3624247e5a365a48),
459
C64e(0x9b1b1badb69bb636), C64e(0x3ddfdf98473d47a5),
460
C64e(0x26cdcda76a266a81), C64e(0x694e4ef5bb69bb9c),
461
C64e(0xcd7f7f334ccd4cfe), C64e(0x9feaea50ba9fbacf),
462
C64e(0x1b12123f2d1b2d24), C64e(0x9e1d1da4b99eb93a),
463
C64e(0x745858c49c749cb0), C64e(0x2e343446722e7268),
464
C64e(0x2d363641772d776c), C64e(0xb2dcdc11cdb2cda3),
465
C64e(0xeeb4b49d29ee2973), C64e(0xfb5b5b4d16fb16b6),
466
C64e(0xf6a4a4a501f60153), C64e(0x4d7676a1d74dd7ec),
467
C64e(0x61b7b714a361a375), C64e(0xce7d7d3449ce49fa),
468
C64e(0x7b5252df8d7b8da4), C64e(0x3edddd9f423e42a1),
469
C64e(0x715e5ecd937193bc), C64e(0x971313b1a297a226),
470
C64e(0xf5a6a6a204f50457), C64e(0x68b9b901b868b869),
471
C64e(0x0000000000000000), C64e(0x2cc1c1b5742c7499),
472
C64e(0x604040e0a060a080), C64e(0x1fe3e3c2211f21dd),
473
C64e(0xc879793a43c843f2), C64e(0xedb6b69a2ced2c77),
474
C64e(0xbed4d40dd9bed9b3), C64e(0x468d8d47ca46ca01),
475
C64e(0xd967671770d970ce), C64e(0x4b7272afdd4bdde4),
476
C64e(0xde9494ed79de7933), C64e(0xd49898ff67d4672b),
477
C64e(0xe8b0b09323e8237b), C64e(0x4a85855bde4ade11),
478
C64e(0x6bbbbb06bd6bbd6d), C64e(0x2ac5c5bb7e2a7e91),
479
C64e(0xe54f4f7b34e5349e), C64e(0x16ededd73a163ac1),
480
C64e(0xc58686d254c55417), C64e(0xd79a9af862d7622f),
481
C64e(0x55666699ff55ffcc), C64e(0x941111b6a794a722),
482
C64e(0xcf8a8ac04acf4a0f), C64e(0x10e9e9d9301030c9),
483
C64e(0x0604040e0a060a08), C64e(0x81fefe66988198e7),
484
C64e(0xf0a0a0ab0bf00b5b), C64e(0x447878b4cc44ccf0),
485
C64e(0xba2525f0d5bad54a), C64e(0xe34b4b753ee33e96),
486
C64e(0xf3a2a2ac0ef30e5f), C64e(0xfe5d5d4419fe19ba),
487
C64e(0xc08080db5bc05b1b), C64e(0x8a050580858a850a),
488
C64e(0xad3f3fd3ecadec7e), C64e(0xbc2121fedfbcdf42),
489
C64e(0x487070a8d848d8e0), C64e(0x04f1f1fd0c040cf9),
490
C64e(0xdf6363197adf7ac6), C64e(0xc177772f58c158ee),
491
C64e(0x75afaf309f759f45), C64e(0x634242e7a563a584),
492
C64e(0x3020207050305040), C64e(0x1ae5e5cb2e1a2ed1),
493
C64e(0x0efdfdef120e12e1), C64e(0x6dbfbf08b76db765),
494
C64e(0x4c818155d44cd419), C64e(0x141818243c143c30),
495
C64e(0x352626795f355f4c), C64e(0x2fc3c3b2712f719d),
496
C64e(0xe1bebe8638e13867), C64e(0xa23535c8fda2fd6a),
497
C64e(0xcc8888c74fcc4f0b), C64e(0x392e2e654b394b5c),
498
C64e(0x5793936af957f93d), C64e(0xf25555580df20daa),
499
C64e(0x82fcfc619d829de3), C64e(0x477a7ab3c947c9f4),
500
C64e(0xacc8c827efacef8b), C64e(0xe7baba8832e7326f),
501
C64e(0x2b32324f7d2b7d64), C64e(0x95e6e642a495a4d7),
502
C64e(0xa0c0c03bfba0fb9b), C64e(0x981919aab398b332),
503
C64e(0xd19e9ef668d16827), C64e(0x7fa3a322817f815d),
504
C64e(0x664444eeaa66aa88), C64e(0x7e5454d6827e82a8),
505
C64e(0xab3b3bdde6abe676), C64e(0x830b0b959e839e16),
506
C64e(0xca8c8cc945ca4503), C64e(0x29c7c7bc7b297b95),
507
C64e(0xd36b6b056ed36ed6), C64e(0x3c28286c443c4450),
508
C64e(0x79a7a72c8b798b55), C64e(0xe2bcbc813de23d63),
509
C64e(0x1d161631271d272c), C64e(0x76adad379a769a41),
510
C64e(0x3bdbdb964d3b4dad), C64e(0x5664649efa56fac8),
511
C64e(0x4e7474a6d24ed2e8), C64e(0x1e141436221e2228),
512
C64e(0xdb9292e476db763f), C64e(0x0a0c0c121e0a1e18),
513
C64e(0x6c4848fcb46cb490), C64e(0xe4b8b88f37e4376b),
514
C64e(0x5d9f9f78e75de725), C64e(0x6ebdbd0fb26eb261),
515
C64e(0xef4343692aef2a86), C64e(0xa6c4c435f1a6f193),
516
C64e(0xa83939dae3a8e372), C64e(0xa43131c6f7a4f762),
517
C64e(0x37d3d38a593759bd), C64e(0x8bf2f274868b86ff),
518
C64e(0x32d5d583563256b1), C64e(0x438b8b4ec543c50d),
519
C64e(0x596e6e85eb59ebdc), C64e(0xb7dada18c2b7c2af),
520
C64e(0x8c01018e8f8c8f02), C64e(0x64b1b11dac64ac79),
521
C64e(0xd29c9cf16dd26d23), C64e(0xe04949723be03b92),
522
C64e(0xb4d8d81fc7b4c7ab), C64e(0xfaacacb915fa1543),
523
C64e(0x07f3f3fa090709fd), C64e(0x25cfcfa06f256f85),
524
C64e(0xafcaca20eaafea8f), C64e(0x8ef4f47d898e89f3),
525
C64e(0xe947476720e9208e), C64e(0x1810103828182820),
526
C64e(0xd56f6f0b64d564de), C64e(0x88f0f073838883fb),
527
C64e(0x6f4a4afbb16fb194), C64e(0x725c5cca967296b8),
528
C64e(0x243838546c246c70), C64e(0xf157575f08f108ae),
529
C64e(0xc773732152c752e6), C64e(0x51979764f351f335),
530
C64e(0x23cbcbae6523658d), C64e(0x7ca1a125847c8459),
531
C64e(0x9ce8e857bf9cbfcb), C64e(0x213e3e5d6321637c),
532
C64e(0xdd9696ea7cdd7c37), C64e(0xdc61611e7fdc7fc2),
533
C64e(0x860d0d9c9186911a), C64e(0x850f0f9b9485941e),
534
C64e(0x90e0e04bab90abdb), C64e(0x427c7cbac642c6f8),
535
C64e(0xc471712657c457e2), C64e(0xaacccc29e5aae583),
536
C64e(0xd89090e373d8733b), C64e(0x050606090f050f0c),
537
C64e(0x01f7f7f4030103f5), C64e(0x121c1c2a36123638),
538
C64e(0xa3c2c23cfea3fe9f), C64e(0x5f6a6a8be15fe1d4),
539
C64e(0xf9aeaebe10f91047), C64e(0xd06969026bd06bd2),
540
C64e(0x911717bfa891a82e), C64e(0x58999971e858e829),
541
C64e(0x273a3a5369276974), C64e(0xb92727f7d0b9d04e),
542
C64e(0x38d9d991483848a9), C64e(0x13ebebde351335cd),
543
C64e(0xb32b2be5ceb3ce56), C64e(0x3322227755335544),
544
C64e(0xbbd2d204d6bbd6bf), C64e(0x70a9a93990709049),
545
C64e(0x890707878089800e), C64e(0xa73333c1f2a7f266),
546
C64e(0xb62d2decc1b6c15a), C64e(0x223c3c5a66226678),
547
C64e(0x921515b8ad92ad2a), C64e(0x20c9c9a960206089),
548
C64e(0x4987875cdb49db15), C64e(0xffaaaab01aff1a4f),
549
C64e(0x785050d8887888a0), C64e(0x7aa5a52b8e7a8e51),
550
C64e(0x8f0303898a8f8a06), C64e(0xf859594a13f813b2),
551
C64e(0x800909929b809b12), C64e(0x171a1a2339173934),
552
C64e(0xda65651075da75ca), C64e(0x31d7d784533153b5),
553
C64e(0xc68484d551c65113), C64e(0xb8d0d003d3b8d3bb),
554
C64e(0xc38282dc5ec35e1f), C64e(0xb02929e2cbb0cb52),
555
C64e(0x775a5ac3997799b4), C64e(0x111e1e2d3311333c),
556
C64e(0xcb7b7b3d46cb46f6), C64e(0xfca8a8b71ffc1f4b),
557
C64e(0xd66d6d0c61d661da), C64e(0x3a2c2c624e3a4e58)
558
};
559
560
static const sph_u64 T3[] = {
561
C64e(0x97a5c6c632f4a5f4), C64e(0xeb84f8f86f978497),
562
C64e(0xc799eeee5eb099b0), C64e(0xf78df6f67a8c8d8c),
563
C64e(0xe50dffffe8170d17), C64e(0xb7bdd6d60adcbddc),
564
C64e(0xa7b1dede16c8b1c8), C64e(0x395491916dfc54fc),
565
C64e(0xc050606090f050f0), C64e(0x0403020207050305),
566
C64e(0x87a9cece2ee0a9e0), C64e(0xac7d5656d1877d87),
567
C64e(0xd519e7e7cc2b192b), C64e(0x7162b5b513a662a6),
568
C64e(0x9ae64d4d7c31e631), C64e(0xc39aecec59b59ab5),
569
C64e(0x05458f8f40cf45cf), C64e(0x3e9d1f1fa3bc9dbc),
570
C64e(0x0940898949c040c0), C64e(0xef87fafa68928792),
571
C64e(0xc515efefd03f153f), C64e(0x7febb2b29426eb26),
572
C64e(0x07c98e8ece40c940), C64e(0xed0bfbfbe61d0b1d),
573
C64e(0x82ec41416e2fec2f), C64e(0x7d67b3b31aa967a9),
574
C64e(0xbefd5f5f431cfd1c), C64e(0x8aea45456025ea25),
575
C64e(0x46bf2323f9dabfda), C64e(0xa6f753535102f702),
576
C64e(0xd396e4e445a196a1), C64e(0x2d5b9b9b76ed5bed),
577
C64e(0xeac27575285dc25d), C64e(0xd91ce1e1c5241c24),
578
C64e(0x7aae3d3dd4e9aee9), C64e(0x986a4c4cf2be6abe),
579
C64e(0xd85a6c6c82ee5aee), C64e(0xfc417e7ebdc341c3),
580
C64e(0xf102f5f5f3060206), C64e(0x1d4f838352d14fd1),
581
C64e(0xd05c68688ce45ce4), C64e(0xa2f451515607f407),
582
C64e(0xb934d1d18d5c345c), C64e(0xe908f9f9e1180818),
583
C64e(0xdf93e2e24cae93ae), C64e(0x4d73abab3e957395),
584
C64e(0xc453626297f553f5), C64e(0x543f2a2a6b413f41),
585
C64e(0x100c08081c140c14), C64e(0x3152959563f652f6),
586
C64e(0x8c654646e9af65af), C64e(0x215e9d9d7fe25ee2),
587
C64e(0x6028303048782878), C64e(0x6ea13737cff8a1f8),
588
C64e(0x140f0a0a1b110f11), C64e(0x5eb52f2febc4b5c4),
589
C64e(0x1c090e0e151b091b), C64e(0x483624247e5a365a),
590
C64e(0x369b1b1badb69bb6), C64e(0xa53ddfdf98473d47),
591
C64e(0x8126cdcda76a266a), C64e(0x9c694e4ef5bb69bb),
592
C64e(0xfecd7f7f334ccd4c), C64e(0xcf9feaea50ba9fba),
593
C64e(0x241b12123f2d1b2d), C64e(0x3a9e1d1da4b99eb9),
594
C64e(0xb0745858c49c749c), C64e(0x682e343446722e72),
595
C64e(0x6c2d363641772d77), C64e(0xa3b2dcdc11cdb2cd),
596
C64e(0x73eeb4b49d29ee29), C64e(0xb6fb5b5b4d16fb16),
597
C64e(0x53f6a4a4a501f601), C64e(0xec4d7676a1d74dd7),
598
C64e(0x7561b7b714a361a3), C64e(0xface7d7d3449ce49),
599
C64e(0xa47b5252df8d7b8d), C64e(0xa13edddd9f423e42),
600
C64e(0xbc715e5ecd937193), C64e(0x26971313b1a297a2),
601
C64e(0x57f5a6a6a204f504), C64e(0x6968b9b901b868b8),
602
C64e(0x0000000000000000), C64e(0x992cc1c1b5742c74),
603
C64e(0x80604040e0a060a0), C64e(0xdd1fe3e3c2211f21),
604
C64e(0xf2c879793a43c843), C64e(0x77edb6b69a2ced2c),
605
C64e(0xb3bed4d40dd9bed9), C64e(0x01468d8d47ca46ca),
606
C64e(0xced967671770d970), C64e(0xe44b7272afdd4bdd),
607
C64e(0x33de9494ed79de79), C64e(0x2bd49898ff67d467),
608
C64e(0x7be8b0b09323e823), C64e(0x114a85855bde4ade),
609
C64e(0x6d6bbbbb06bd6bbd), C64e(0x912ac5c5bb7e2a7e),
610
C64e(0x9ee54f4f7b34e534), C64e(0xc116ededd73a163a),
611
C64e(0x17c58686d254c554), C64e(0x2fd79a9af862d762),
612
C64e(0xcc55666699ff55ff), C64e(0x22941111b6a794a7),
613
C64e(0x0fcf8a8ac04acf4a), C64e(0xc910e9e9d9301030),
614
C64e(0x080604040e0a060a), C64e(0xe781fefe66988198),
615
C64e(0x5bf0a0a0ab0bf00b), C64e(0xf0447878b4cc44cc),
616
C64e(0x4aba2525f0d5bad5), C64e(0x96e34b4b753ee33e),
617
C64e(0x5ff3a2a2ac0ef30e), C64e(0xbafe5d5d4419fe19),
618
C64e(0x1bc08080db5bc05b), C64e(0x0a8a050580858a85),
619
C64e(0x7ead3f3fd3ecadec), C64e(0x42bc2121fedfbcdf),
620
C64e(0xe0487070a8d848d8), C64e(0xf904f1f1fd0c040c),
621
C64e(0xc6df6363197adf7a), C64e(0xeec177772f58c158),
622
C64e(0x4575afaf309f759f), C64e(0x84634242e7a563a5),
623
C64e(0x4030202070503050), C64e(0xd11ae5e5cb2e1a2e),
624
C64e(0xe10efdfdef120e12), C64e(0x656dbfbf08b76db7),
625
C64e(0x194c818155d44cd4), C64e(0x30141818243c143c),
626
C64e(0x4c352626795f355f), C64e(0x9d2fc3c3b2712f71),
627
C64e(0x67e1bebe8638e138), C64e(0x6aa23535c8fda2fd),
628
C64e(0x0bcc8888c74fcc4f), C64e(0x5c392e2e654b394b),
629
C64e(0x3d5793936af957f9), C64e(0xaaf25555580df20d),
630
C64e(0xe382fcfc619d829d), C64e(0xf4477a7ab3c947c9),
631
C64e(0x8bacc8c827efacef), C64e(0x6fe7baba8832e732),
632
C64e(0x642b32324f7d2b7d), C64e(0xd795e6e642a495a4),
633
C64e(0x9ba0c0c03bfba0fb), C64e(0x32981919aab398b3),
634
C64e(0x27d19e9ef668d168), C64e(0x5d7fa3a322817f81),
635
C64e(0x88664444eeaa66aa), C64e(0xa87e5454d6827e82),
636
C64e(0x76ab3b3bdde6abe6), C64e(0x16830b0b959e839e),
637
C64e(0x03ca8c8cc945ca45), C64e(0x9529c7c7bc7b297b),
638
C64e(0xd6d36b6b056ed36e), C64e(0x503c28286c443c44),
639
C64e(0x5579a7a72c8b798b), C64e(0x63e2bcbc813de23d),
640
C64e(0x2c1d161631271d27), C64e(0x4176adad379a769a),
641
C64e(0xad3bdbdb964d3b4d), C64e(0xc85664649efa56fa),
642
C64e(0xe84e7474a6d24ed2), C64e(0x281e141436221e22),
643
C64e(0x3fdb9292e476db76), C64e(0x180a0c0c121e0a1e),
644
C64e(0x906c4848fcb46cb4), C64e(0x6be4b8b88f37e437),
645
C64e(0x255d9f9f78e75de7), C64e(0x616ebdbd0fb26eb2),
646
C64e(0x86ef4343692aef2a), C64e(0x93a6c4c435f1a6f1),
647
C64e(0x72a83939dae3a8e3), C64e(0x62a43131c6f7a4f7),
648
C64e(0xbd37d3d38a593759), C64e(0xff8bf2f274868b86),
649
C64e(0xb132d5d583563256), C64e(0x0d438b8b4ec543c5),
650
C64e(0xdc596e6e85eb59eb), C64e(0xafb7dada18c2b7c2),
651
C64e(0x028c01018e8f8c8f), C64e(0x7964b1b11dac64ac),
652
C64e(0x23d29c9cf16dd26d), C64e(0x92e04949723be03b),
653
C64e(0xabb4d8d81fc7b4c7), C64e(0x43faacacb915fa15),
654
C64e(0xfd07f3f3fa090709), C64e(0x8525cfcfa06f256f),
655
C64e(0x8fafcaca20eaafea), C64e(0xf38ef4f47d898e89),
656
C64e(0x8ee947476720e920), C64e(0x2018101038281828),
657
C64e(0xded56f6f0b64d564), C64e(0xfb88f0f073838883),
658
C64e(0x946f4a4afbb16fb1), C64e(0xb8725c5cca967296),
659
C64e(0x70243838546c246c), C64e(0xaef157575f08f108),
660
C64e(0xe6c773732152c752), C64e(0x3551979764f351f3),
661
C64e(0x8d23cbcbae652365), C64e(0x597ca1a125847c84),
662
C64e(0xcb9ce8e857bf9cbf), C64e(0x7c213e3e5d632163),
663
C64e(0x37dd9696ea7cdd7c), C64e(0xc2dc61611e7fdc7f),
664
C64e(0x1a860d0d9c918691), C64e(0x1e850f0f9b948594),
665
C64e(0xdb90e0e04bab90ab), C64e(0xf8427c7cbac642c6),
666
C64e(0xe2c471712657c457), C64e(0x83aacccc29e5aae5),
667
C64e(0x3bd89090e373d873), C64e(0x0c050606090f050f),
668
C64e(0xf501f7f7f4030103), C64e(0x38121c1c2a361236),
669
C64e(0x9fa3c2c23cfea3fe), C64e(0xd45f6a6a8be15fe1),
670
C64e(0x47f9aeaebe10f910), C64e(0xd2d06969026bd06b),
671
C64e(0x2e911717bfa891a8), C64e(0x2958999971e858e8),
672
C64e(0x74273a3a53692769), C64e(0x4eb92727f7d0b9d0),
673
C64e(0xa938d9d991483848), C64e(0xcd13ebebde351335),
674
C64e(0x56b32b2be5ceb3ce), C64e(0x4433222277553355),
675
C64e(0xbfbbd2d204d6bbd6), C64e(0x4970a9a939907090),
676
C64e(0x0e89070787808980), C64e(0x66a73333c1f2a7f2),
677
C64e(0x5ab62d2decc1b6c1), C64e(0x78223c3c5a662266),
678
C64e(0x2a921515b8ad92ad), C64e(0x8920c9c9a9602060),
679
C64e(0x154987875cdb49db), C64e(0x4fffaaaab01aff1a),
680
C64e(0xa0785050d8887888), C64e(0x517aa5a52b8e7a8e),
681
C64e(0x068f0303898a8f8a), C64e(0xb2f859594a13f813),
682
C64e(0x12800909929b809b), C64e(0x34171a1a23391739),
683
C64e(0xcada65651075da75), C64e(0xb531d7d784533153),
684
C64e(0x13c68484d551c651), C64e(0xbbb8d0d003d3b8d3),
685
C64e(0x1fc38282dc5ec35e), C64e(0x52b02929e2cbb0cb),
686
C64e(0xb4775a5ac3997799), C64e(0x3c111e1e2d331133),
687
C64e(0xf6cb7b7b3d46cb46), C64e(0x4bfca8a8b71ffc1f),
688
C64e(0xdad66d6d0c61d661), C64e(0x583a2c2c624e3a4e)
689
};
690
691
#endif
692
693
static const sph_u64 T4[] = {
694
C64e(0xf497a5c6c632f4a5), C64e(0x97eb84f8f86f9784),
695
C64e(0xb0c799eeee5eb099), C64e(0x8cf78df6f67a8c8d),
696
C64e(0x17e50dffffe8170d), C64e(0xdcb7bdd6d60adcbd),
697
C64e(0xc8a7b1dede16c8b1), C64e(0xfc395491916dfc54),
698
C64e(0xf0c050606090f050), C64e(0x0504030202070503),
699
C64e(0xe087a9cece2ee0a9), C64e(0x87ac7d5656d1877d),
700
C64e(0x2bd519e7e7cc2b19), C64e(0xa67162b5b513a662),
701
C64e(0x319ae64d4d7c31e6), C64e(0xb5c39aecec59b59a),
702
C64e(0xcf05458f8f40cf45), C64e(0xbc3e9d1f1fa3bc9d),
703
C64e(0xc00940898949c040), C64e(0x92ef87fafa689287),
704
C64e(0x3fc515efefd03f15), C64e(0x267febb2b29426eb),
705
C64e(0x4007c98e8ece40c9), C64e(0x1ded0bfbfbe61d0b),
706
C64e(0x2f82ec41416e2fec), C64e(0xa97d67b3b31aa967),
707
C64e(0x1cbefd5f5f431cfd), C64e(0x258aea45456025ea),
708
C64e(0xda46bf2323f9dabf), C64e(0x02a6f753535102f7),
709
C64e(0xa1d396e4e445a196), C64e(0xed2d5b9b9b76ed5b),
710
C64e(0x5deac27575285dc2), C64e(0x24d91ce1e1c5241c),
711
C64e(0xe97aae3d3dd4e9ae), C64e(0xbe986a4c4cf2be6a),
712
C64e(0xeed85a6c6c82ee5a), C64e(0xc3fc417e7ebdc341),
713
C64e(0x06f102f5f5f30602), C64e(0xd11d4f838352d14f),
714
C64e(0xe4d05c68688ce45c), C64e(0x07a2f451515607f4),
715
C64e(0x5cb934d1d18d5c34), C64e(0x18e908f9f9e11808),
716
C64e(0xaedf93e2e24cae93), C64e(0x954d73abab3e9573),
717
C64e(0xf5c453626297f553), C64e(0x41543f2a2a6b413f),
718
C64e(0x14100c08081c140c), C64e(0xf63152959563f652),
719
C64e(0xaf8c654646e9af65), C64e(0xe2215e9d9d7fe25e),
720
C64e(0x7860283030487828), C64e(0xf86ea13737cff8a1),
721
C64e(0x11140f0a0a1b110f), C64e(0xc45eb52f2febc4b5),
722
C64e(0x1b1c090e0e151b09), C64e(0x5a483624247e5a36),
723
C64e(0xb6369b1b1badb69b), C64e(0x47a53ddfdf98473d),
724
C64e(0x6a8126cdcda76a26), C64e(0xbb9c694e4ef5bb69),
725
C64e(0x4cfecd7f7f334ccd), C64e(0xbacf9feaea50ba9f),
726
C64e(0x2d241b12123f2d1b), C64e(0xb93a9e1d1da4b99e),
727
C64e(0x9cb0745858c49c74), C64e(0x72682e343446722e),
728
C64e(0x776c2d363641772d), C64e(0xcda3b2dcdc11cdb2),
729
C64e(0x2973eeb4b49d29ee), C64e(0x16b6fb5b5b4d16fb),
730
C64e(0x0153f6a4a4a501f6), C64e(0xd7ec4d7676a1d74d),
731
C64e(0xa37561b7b714a361), C64e(0x49face7d7d3449ce),
732
C64e(0x8da47b5252df8d7b), C64e(0x42a13edddd9f423e),
733
C64e(0x93bc715e5ecd9371), C64e(0xa226971313b1a297),
734
C64e(0x0457f5a6a6a204f5), C64e(0xb86968b9b901b868),
735
C64e(0x0000000000000000), C64e(0x74992cc1c1b5742c),
736
C64e(0xa080604040e0a060), C64e(0x21dd1fe3e3c2211f),
737
C64e(0x43f2c879793a43c8), C64e(0x2c77edb6b69a2ced),
738
C64e(0xd9b3bed4d40dd9be), C64e(0xca01468d8d47ca46),
739
C64e(0x70ced967671770d9), C64e(0xdde44b7272afdd4b),
740
C64e(0x7933de9494ed79de), C64e(0x672bd49898ff67d4),
741
C64e(0x237be8b0b09323e8), C64e(0xde114a85855bde4a),
742
C64e(0xbd6d6bbbbb06bd6b), C64e(0x7e912ac5c5bb7e2a),
743
C64e(0x349ee54f4f7b34e5), C64e(0x3ac116ededd73a16),
744
C64e(0x5417c58686d254c5), C64e(0x622fd79a9af862d7),
745
C64e(0xffcc55666699ff55), C64e(0xa722941111b6a794),
746
C64e(0x4a0fcf8a8ac04acf), C64e(0x30c910e9e9d93010),
747
C64e(0x0a080604040e0a06), C64e(0x98e781fefe669881),
748
C64e(0x0b5bf0a0a0ab0bf0), C64e(0xccf0447878b4cc44),
749
C64e(0xd54aba2525f0d5ba), C64e(0x3e96e34b4b753ee3),
750
C64e(0x0e5ff3a2a2ac0ef3), C64e(0x19bafe5d5d4419fe),
751
C64e(0x5b1bc08080db5bc0), C64e(0x850a8a050580858a),
752
C64e(0xec7ead3f3fd3ecad), C64e(0xdf42bc2121fedfbc),
753
C64e(0xd8e0487070a8d848), C64e(0x0cf904f1f1fd0c04),
754
C64e(0x7ac6df6363197adf), C64e(0x58eec177772f58c1),
755
C64e(0x9f4575afaf309f75), C64e(0xa584634242e7a563),
756
C64e(0x5040302020705030), C64e(0x2ed11ae5e5cb2e1a),
757
C64e(0x12e10efdfdef120e), C64e(0xb7656dbfbf08b76d),
758
C64e(0xd4194c818155d44c), C64e(0x3c30141818243c14),
759
C64e(0x5f4c352626795f35), C64e(0x719d2fc3c3b2712f),
760
C64e(0x3867e1bebe8638e1), C64e(0xfd6aa23535c8fda2),
761
C64e(0x4f0bcc8888c74fcc), C64e(0x4b5c392e2e654b39),
762
C64e(0xf93d5793936af957), C64e(0x0daaf25555580df2),
763
C64e(0x9de382fcfc619d82), C64e(0xc9f4477a7ab3c947),
764
C64e(0xef8bacc8c827efac), C64e(0x326fe7baba8832e7),
765
C64e(0x7d642b32324f7d2b), C64e(0xa4d795e6e642a495),
766
C64e(0xfb9ba0c0c03bfba0), C64e(0xb332981919aab398),
767
C64e(0x6827d19e9ef668d1), C64e(0x815d7fa3a322817f),
768
C64e(0xaa88664444eeaa66), C64e(0x82a87e5454d6827e),
769
C64e(0xe676ab3b3bdde6ab), C64e(0x9e16830b0b959e83),
770
C64e(0x4503ca8c8cc945ca), C64e(0x7b9529c7c7bc7b29),
771
C64e(0x6ed6d36b6b056ed3), C64e(0x44503c28286c443c),
772
C64e(0x8b5579a7a72c8b79), C64e(0x3d63e2bcbc813de2),
773
C64e(0x272c1d161631271d), C64e(0x9a4176adad379a76),
774
C64e(0x4dad3bdbdb964d3b), C64e(0xfac85664649efa56),
775
C64e(0xd2e84e7474a6d24e), C64e(0x22281e141436221e),
776
C64e(0x763fdb9292e476db), C64e(0x1e180a0c0c121e0a),
777
C64e(0xb4906c4848fcb46c), C64e(0x376be4b8b88f37e4),
778
C64e(0xe7255d9f9f78e75d), C64e(0xb2616ebdbd0fb26e),
779
C64e(0x2a86ef4343692aef), C64e(0xf193a6c4c435f1a6),
780
C64e(0xe372a83939dae3a8), C64e(0xf762a43131c6f7a4),
781
C64e(0x59bd37d3d38a5937), C64e(0x86ff8bf2f274868b),
782
C64e(0x56b132d5d5835632), C64e(0xc50d438b8b4ec543),
783
C64e(0xebdc596e6e85eb59), C64e(0xc2afb7dada18c2b7),
784
C64e(0x8f028c01018e8f8c), C64e(0xac7964b1b11dac64),
785
C64e(0x6d23d29c9cf16dd2), C64e(0x3b92e04949723be0),
786
C64e(0xc7abb4d8d81fc7b4), C64e(0x1543faacacb915fa),
787
C64e(0x09fd07f3f3fa0907), C64e(0x6f8525cfcfa06f25),
788
C64e(0xea8fafcaca20eaaf), C64e(0x89f38ef4f47d898e),
789
C64e(0x208ee947476720e9), C64e(0x2820181010382818),
790
C64e(0x64ded56f6f0b64d5), C64e(0x83fb88f0f0738388),
791
C64e(0xb1946f4a4afbb16f), C64e(0x96b8725c5cca9672),
792
C64e(0x6c70243838546c24), C64e(0x08aef157575f08f1),
793
C64e(0x52e6c773732152c7), C64e(0xf33551979764f351),
794
C64e(0x658d23cbcbae6523), C64e(0x84597ca1a125847c),
795
C64e(0xbfcb9ce8e857bf9c), C64e(0x637c213e3e5d6321),
796
C64e(0x7c37dd9696ea7cdd), C64e(0x7fc2dc61611e7fdc),
797
C64e(0x911a860d0d9c9186), C64e(0x941e850f0f9b9485),
798
C64e(0xabdb90e0e04bab90), C64e(0xc6f8427c7cbac642),
799
C64e(0x57e2c471712657c4), C64e(0xe583aacccc29e5aa),
800
C64e(0x733bd89090e373d8), C64e(0x0f0c050606090f05),
801
C64e(0x03f501f7f7f40301), C64e(0x3638121c1c2a3612),
802
C64e(0xfe9fa3c2c23cfea3), C64e(0xe1d45f6a6a8be15f),
803
C64e(0x1047f9aeaebe10f9), C64e(0x6bd2d06969026bd0),
804
C64e(0xa82e911717bfa891), C64e(0xe82958999971e858),
805
C64e(0x6974273a3a536927), C64e(0xd04eb92727f7d0b9),
806
C64e(0x48a938d9d9914838), C64e(0x35cd13ebebde3513),
807
C64e(0xce56b32b2be5ceb3), C64e(0x5544332222775533),
808
C64e(0xd6bfbbd2d204d6bb), C64e(0x904970a9a9399070),
809
C64e(0x800e890707878089), C64e(0xf266a73333c1f2a7),
810
C64e(0xc15ab62d2decc1b6), C64e(0x6678223c3c5a6622),
811
C64e(0xad2a921515b8ad92), C64e(0x608920c9c9a96020),
812
C64e(0xdb154987875cdb49), C64e(0x1a4fffaaaab01aff),
813
C64e(0x88a0785050d88878), C64e(0x8e517aa5a52b8e7a),
814
C64e(0x8a068f0303898a8f), C64e(0x13b2f859594a13f8),
815
C64e(0x9b12800909929b80), C64e(0x3934171a1a233917),
816
C64e(0x75cada65651075da), C64e(0x53b531d7d7845331),
817
C64e(0x5113c68484d551c6), C64e(0xd3bbb8d0d003d3b8),
818
C64e(0x5e1fc38282dc5ec3), C64e(0xcb52b02929e2cbb0),
819
C64e(0x99b4775a5ac39977), C64e(0x333c111e1e2d3311),
820
C64e(0x46f6cb7b7b3d46cb), C64e(0x1f4bfca8a8b71ffc),
821
C64e(0x61dad66d6d0c61d6), C64e(0x4e583a2c2c624e3a)
822
};
823
824
#if !SPH_SMALL_FOOTPRINT_GROESTL
825
826
static const sph_u64 T5[] = {
827
C64e(0xa5f497a5c6c632f4), C64e(0x8497eb84f8f86f97),
828
C64e(0x99b0c799eeee5eb0), C64e(0x8d8cf78df6f67a8c),
829
C64e(0x0d17e50dffffe817), C64e(0xbddcb7bdd6d60adc),
830
C64e(0xb1c8a7b1dede16c8), C64e(0x54fc395491916dfc),
831
C64e(0x50f0c050606090f0), C64e(0x0305040302020705),
832
C64e(0xa9e087a9cece2ee0), C64e(0x7d87ac7d5656d187),
833
C64e(0x192bd519e7e7cc2b), C64e(0x62a67162b5b513a6),
834
C64e(0xe6319ae64d4d7c31), C64e(0x9ab5c39aecec59b5),
835
C64e(0x45cf05458f8f40cf), C64e(0x9dbc3e9d1f1fa3bc),
836
C64e(0x40c00940898949c0), C64e(0x8792ef87fafa6892),
837
C64e(0x153fc515efefd03f), C64e(0xeb267febb2b29426),
838
C64e(0xc94007c98e8ece40), C64e(0x0b1ded0bfbfbe61d),
839
C64e(0xec2f82ec41416e2f), C64e(0x67a97d67b3b31aa9),
840
C64e(0xfd1cbefd5f5f431c), C64e(0xea258aea45456025),
841
C64e(0xbfda46bf2323f9da), C64e(0xf702a6f753535102),
842
C64e(0x96a1d396e4e445a1), C64e(0x5bed2d5b9b9b76ed),
843
C64e(0xc25deac27575285d), C64e(0x1c24d91ce1e1c524),
844
C64e(0xaee97aae3d3dd4e9), C64e(0x6abe986a4c4cf2be),
845
C64e(0x5aeed85a6c6c82ee), C64e(0x41c3fc417e7ebdc3),
846
C64e(0x0206f102f5f5f306), C64e(0x4fd11d4f838352d1),
847
C64e(0x5ce4d05c68688ce4), C64e(0xf407a2f451515607),
848
C64e(0x345cb934d1d18d5c), C64e(0x0818e908f9f9e118),
849
C64e(0x93aedf93e2e24cae), C64e(0x73954d73abab3e95),
850
C64e(0x53f5c453626297f5), C64e(0x3f41543f2a2a6b41),
851
C64e(0x0c14100c08081c14), C64e(0x52f63152959563f6),
852
C64e(0x65af8c654646e9af), C64e(0x5ee2215e9d9d7fe2),
853
C64e(0x2878602830304878), C64e(0xa1f86ea13737cff8),
854
C64e(0x0f11140f0a0a1b11), C64e(0xb5c45eb52f2febc4),
855
C64e(0x091b1c090e0e151b), C64e(0x365a483624247e5a),
856
C64e(0x9bb6369b1b1badb6), C64e(0x3d47a53ddfdf9847),
857
C64e(0x266a8126cdcda76a), C64e(0x69bb9c694e4ef5bb),
858
C64e(0xcd4cfecd7f7f334c), C64e(0x9fbacf9feaea50ba),
859
C64e(0x1b2d241b12123f2d), C64e(0x9eb93a9e1d1da4b9),
860
C64e(0x749cb0745858c49c), C64e(0x2e72682e34344672),
861
C64e(0x2d776c2d36364177), C64e(0xb2cda3b2dcdc11cd),
862
C64e(0xee2973eeb4b49d29), C64e(0xfb16b6fb5b5b4d16),
863
C64e(0xf60153f6a4a4a501), C64e(0x4dd7ec4d7676a1d7),
864
C64e(0x61a37561b7b714a3), C64e(0xce49face7d7d3449),
865
C64e(0x7b8da47b5252df8d), C64e(0x3e42a13edddd9f42),
866
C64e(0x7193bc715e5ecd93), C64e(0x97a226971313b1a2),
867
C64e(0xf50457f5a6a6a204), C64e(0x68b86968b9b901b8),
868
C64e(0x0000000000000000), C64e(0x2c74992cc1c1b574),
869
C64e(0x60a080604040e0a0), C64e(0x1f21dd1fe3e3c221),
870
C64e(0xc843f2c879793a43), C64e(0xed2c77edb6b69a2c),
871
C64e(0xbed9b3bed4d40dd9), C64e(0x46ca01468d8d47ca),
872
C64e(0xd970ced967671770), C64e(0x4bdde44b7272afdd),
873
C64e(0xde7933de9494ed79), C64e(0xd4672bd49898ff67),
874
C64e(0xe8237be8b0b09323), C64e(0x4ade114a85855bde),
875
C64e(0x6bbd6d6bbbbb06bd), C64e(0x2a7e912ac5c5bb7e),
876
C64e(0xe5349ee54f4f7b34), C64e(0x163ac116ededd73a),
877
C64e(0xc55417c58686d254), C64e(0xd7622fd79a9af862),
878
C64e(0x55ffcc55666699ff), C64e(0x94a722941111b6a7),
879
C64e(0xcf4a0fcf8a8ac04a), C64e(0x1030c910e9e9d930),
880
C64e(0x060a080604040e0a), C64e(0x8198e781fefe6698),
881
C64e(0xf00b5bf0a0a0ab0b), C64e(0x44ccf0447878b4cc),
882
C64e(0xbad54aba2525f0d5), C64e(0xe33e96e34b4b753e),
883
C64e(0xf30e5ff3a2a2ac0e), C64e(0xfe19bafe5d5d4419),
884
C64e(0xc05b1bc08080db5b), C64e(0x8a850a8a05058085),
885
C64e(0xadec7ead3f3fd3ec), C64e(0xbcdf42bc2121fedf),
886
C64e(0x48d8e0487070a8d8), C64e(0x040cf904f1f1fd0c),
887
C64e(0xdf7ac6df6363197a), C64e(0xc158eec177772f58),
888
C64e(0x759f4575afaf309f), C64e(0x63a584634242e7a5),
889
C64e(0x3050403020207050), C64e(0x1a2ed11ae5e5cb2e),
890
C64e(0x0e12e10efdfdef12), C64e(0x6db7656dbfbf08b7),
891
C64e(0x4cd4194c818155d4), C64e(0x143c30141818243c),
892
C64e(0x355f4c352626795f), C64e(0x2f719d2fc3c3b271),
893
C64e(0xe13867e1bebe8638), C64e(0xa2fd6aa23535c8fd),
894
C64e(0xcc4f0bcc8888c74f), C64e(0x394b5c392e2e654b),
895
C64e(0x57f93d5793936af9), C64e(0xf20daaf25555580d),
896
C64e(0x829de382fcfc619d), C64e(0x47c9f4477a7ab3c9),
897
C64e(0xacef8bacc8c827ef), C64e(0xe7326fe7baba8832),
898
C64e(0x2b7d642b32324f7d), C64e(0x95a4d795e6e642a4),
899
C64e(0xa0fb9ba0c0c03bfb), C64e(0x98b332981919aab3),
900
C64e(0xd16827d19e9ef668), C64e(0x7f815d7fa3a32281),
901
C64e(0x66aa88664444eeaa), C64e(0x7e82a87e5454d682),
902
C64e(0xabe676ab3b3bdde6), C64e(0x839e16830b0b959e),
903
C64e(0xca4503ca8c8cc945), C64e(0x297b9529c7c7bc7b),
904
C64e(0xd36ed6d36b6b056e), C64e(0x3c44503c28286c44),
905
C64e(0x798b5579a7a72c8b), C64e(0xe23d63e2bcbc813d),
906
C64e(0x1d272c1d16163127), C64e(0x769a4176adad379a),
907
C64e(0x3b4dad3bdbdb964d), C64e(0x56fac85664649efa),
908
C64e(0x4ed2e84e7474a6d2), C64e(0x1e22281e14143622),
909
C64e(0xdb763fdb9292e476), C64e(0x0a1e180a0c0c121e),
910
C64e(0x6cb4906c4848fcb4), C64e(0xe4376be4b8b88f37),
911
C64e(0x5de7255d9f9f78e7), C64e(0x6eb2616ebdbd0fb2),
912
C64e(0xef2a86ef4343692a), C64e(0xa6f193a6c4c435f1),
913
C64e(0xa8e372a83939dae3), C64e(0xa4f762a43131c6f7),
914
C64e(0x3759bd37d3d38a59), C64e(0x8b86ff8bf2f27486),
915
C64e(0x3256b132d5d58356), C64e(0x43c50d438b8b4ec5),
916
C64e(0x59ebdc596e6e85eb), C64e(0xb7c2afb7dada18c2),
917
C64e(0x8c8f028c01018e8f), C64e(0x64ac7964b1b11dac),
918
C64e(0xd26d23d29c9cf16d), C64e(0xe03b92e04949723b),
919
C64e(0xb4c7abb4d8d81fc7), C64e(0xfa1543faacacb915),
920
C64e(0x0709fd07f3f3fa09), C64e(0x256f8525cfcfa06f),
921
C64e(0xafea8fafcaca20ea), C64e(0x8e89f38ef4f47d89),
922
C64e(0xe9208ee947476720), C64e(0x1828201810103828),
923
C64e(0xd564ded56f6f0b64), C64e(0x8883fb88f0f07383),
924
C64e(0x6fb1946f4a4afbb1), C64e(0x7296b8725c5cca96),
925
C64e(0x246c70243838546c), C64e(0xf108aef157575f08),
926
C64e(0xc752e6c773732152), C64e(0x51f33551979764f3),
927
C64e(0x23658d23cbcbae65), C64e(0x7c84597ca1a12584),
928
C64e(0x9cbfcb9ce8e857bf), C64e(0x21637c213e3e5d63),
929
C64e(0xdd7c37dd9696ea7c), C64e(0xdc7fc2dc61611e7f),
930
C64e(0x86911a860d0d9c91), C64e(0x85941e850f0f9b94),
931
C64e(0x90abdb90e0e04bab), C64e(0x42c6f8427c7cbac6),
932
C64e(0xc457e2c471712657), C64e(0xaae583aacccc29e5),
933
C64e(0xd8733bd89090e373), C64e(0x050f0c050606090f),
934
C64e(0x0103f501f7f7f403), C64e(0x123638121c1c2a36),
935
C64e(0xa3fe9fa3c2c23cfe), C64e(0x5fe1d45f6a6a8be1),
936
C64e(0xf91047f9aeaebe10), C64e(0xd06bd2d06969026b),
937
C64e(0x91a82e911717bfa8), C64e(0x58e82958999971e8),
938
C64e(0x276974273a3a5369), C64e(0xb9d04eb92727f7d0),
939
C64e(0x3848a938d9d99148), C64e(0x1335cd13ebebde35),
940
C64e(0xb3ce56b32b2be5ce), C64e(0x3355443322227755),
941
C64e(0xbbd6bfbbd2d204d6), C64e(0x70904970a9a93990),
942
C64e(0x89800e8907078780), C64e(0xa7f266a73333c1f2),
943
C64e(0xb6c15ab62d2decc1), C64e(0x226678223c3c5a66),
944
C64e(0x92ad2a921515b8ad), C64e(0x20608920c9c9a960),
945
C64e(0x49db154987875cdb), C64e(0xff1a4fffaaaab01a),
946
C64e(0x7888a0785050d888), C64e(0x7a8e517aa5a52b8e),
947
C64e(0x8f8a068f0303898a), C64e(0xf813b2f859594a13),
948
C64e(0x809b12800909929b), C64e(0x173934171a1a2339),
949
C64e(0xda75cada65651075), C64e(0x3153b531d7d78453),
950
C64e(0xc65113c68484d551), C64e(0xb8d3bbb8d0d003d3),
951
C64e(0xc35e1fc38282dc5e), C64e(0xb0cb52b02929e2cb),
952
C64e(0x7799b4775a5ac399), C64e(0x11333c111e1e2d33),
953
C64e(0xcb46f6cb7b7b3d46), C64e(0xfc1f4bfca8a8b71f),
954
C64e(0xd661dad66d6d0c61), C64e(0x3a4e583a2c2c624e)
955
};
956
957
static const sph_u64 T6[] = {
958
C64e(0xf4a5f497a5c6c632), C64e(0x978497eb84f8f86f),
959
C64e(0xb099b0c799eeee5e), C64e(0x8c8d8cf78df6f67a),
960
C64e(0x170d17e50dffffe8), C64e(0xdcbddcb7bdd6d60a),
961
C64e(0xc8b1c8a7b1dede16), C64e(0xfc54fc395491916d),
962
C64e(0xf050f0c050606090), C64e(0x0503050403020207),
963
C64e(0xe0a9e087a9cece2e), C64e(0x877d87ac7d5656d1),
964
C64e(0x2b192bd519e7e7cc), C64e(0xa662a67162b5b513),
965
C64e(0x31e6319ae64d4d7c), C64e(0xb59ab5c39aecec59),
966
C64e(0xcf45cf05458f8f40), C64e(0xbc9dbc3e9d1f1fa3),
967
C64e(0xc040c00940898949), C64e(0x928792ef87fafa68),
968
C64e(0x3f153fc515efefd0), C64e(0x26eb267febb2b294),
969
C64e(0x40c94007c98e8ece), C64e(0x1d0b1ded0bfbfbe6),
970
C64e(0x2fec2f82ec41416e), C64e(0xa967a97d67b3b31a),
971
C64e(0x1cfd1cbefd5f5f43), C64e(0x25ea258aea454560),
972
C64e(0xdabfda46bf2323f9), C64e(0x02f702a6f7535351),
973
C64e(0xa196a1d396e4e445), C64e(0xed5bed2d5b9b9b76),
974
C64e(0x5dc25deac2757528), C64e(0x241c24d91ce1e1c5),
975
C64e(0xe9aee97aae3d3dd4), C64e(0xbe6abe986a4c4cf2),
976
C64e(0xee5aeed85a6c6c82), C64e(0xc341c3fc417e7ebd),
977
C64e(0x060206f102f5f5f3), C64e(0xd14fd11d4f838352),
978
C64e(0xe45ce4d05c68688c), C64e(0x07f407a2f4515156),
979
C64e(0x5c345cb934d1d18d), C64e(0x180818e908f9f9e1),
980
C64e(0xae93aedf93e2e24c), C64e(0x9573954d73abab3e),
981
C64e(0xf553f5c453626297), C64e(0x413f41543f2a2a6b),
982
C64e(0x140c14100c08081c), C64e(0xf652f63152959563),
983
C64e(0xaf65af8c654646e9), C64e(0xe25ee2215e9d9d7f),
984
C64e(0x7828786028303048), C64e(0xf8a1f86ea13737cf),
985
C64e(0x110f11140f0a0a1b), C64e(0xc4b5c45eb52f2feb),
986
C64e(0x1b091b1c090e0e15), C64e(0x5a365a483624247e),
987
C64e(0xb69bb6369b1b1bad), C64e(0x473d47a53ddfdf98),
988
C64e(0x6a266a8126cdcda7), C64e(0xbb69bb9c694e4ef5),
989
C64e(0x4ccd4cfecd7f7f33), C64e(0xba9fbacf9feaea50),
990
C64e(0x2d1b2d241b12123f), C64e(0xb99eb93a9e1d1da4),
991
C64e(0x9c749cb0745858c4), C64e(0x722e72682e343446),
992
C64e(0x772d776c2d363641), C64e(0xcdb2cda3b2dcdc11),
993
C64e(0x29ee2973eeb4b49d), C64e(0x16fb16b6fb5b5b4d),
994
C64e(0x01f60153f6a4a4a5), C64e(0xd74dd7ec4d7676a1),
995
C64e(0xa361a37561b7b714), C64e(0x49ce49face7d7d34),
996
C64e(0x8d7b8da47b5252df), C64e(0x423e42a13edddd9f),
997
C64e(0x937193bc715e5ecd), C64e(0xa297a226971313b1),
998
C64e(0x04f50457f5a6a6a2), C64e(0xb868b86968b9b901),
999
C64e(0x0000000000000000), C64e(0x742c74992cc1c1b5),
1000
C64e(0xa060a080604040e0), C64e(0x211f21dd1fe3e3c2),
1001
C64e(0x43c843f2c879793a), C64e(0x2ced2c77edb6b69a),
1002
C64e(0xd9bed9b3bed4d40d), C64e(0xca46ca01468d8d47),
1003
C64e(0x70d970ced9676717), C64e(0xdd4bdde44b7272af),
1004
C64e(0x79de7933de9494ed), C64e(0x67d4672bd49898ff),
1005
C64e(0x23e8237be8b0b093), C64e(0xde4ade114a85855b),
1006
C64e(0xbd6bbd6d6bbbbb06), C64e(0x7e2a7e912ac5c5bb),
1007
C64e(0x34e5349ee54f4f7b), C64e(0x3a163ac116ededd7),
1008
C64e(0x54c55417c58686d2), C64e(0x62d7622fd79a9af8),
1009
C64e(0xff55ffcc55666699), C64e(0xa794a722941111b6),
1010
C64e(0x4acf4a0fcf8a8ac0), C64e(0x301030c910e9e9d9),
1011
C64e(0x0a060a080604040e), C64e(0x988198e781fefe66),
1012
C64e(0x0bf00b5bf0a0a0ab), C64e(0xcc44ccf0447878b4),
1013
C64e(0xd5bad54aba2525f0), C64e(0x3ee33e96e34b4b75),
1014
C64e(0x0ef30e5ff3a2a2ac), C64e(0x19fe19bafe5d5d44),
1015
C64e(0x5bc05b1bc08080db), C64e(0x858a850a8a050580),
1016
C64e(0xecadec7ead3f3fd3), C64e(0xdfbcdf42bc2121fe),
1017
C64e(0xd848d8e0487070a8), C64e(0x0c040cf904f1f1fd),
1018
C64e(0x7adf7ac6df636319), C64e(0x58c158eec177772f),
1019
C64e(0x9f759f4575afaf30), C64e(0xa563a584634242e7),
1020
C64e(0x5030504030202070), C64e(0x2e1a2ed11ae5e5cb),
1021
C64e(0x120e12e10efdfdef), C64e(0xb76db7656dbfbf08),
1022
C64e(0xd44cd4194c818155), C64e(0x3c143c3014181824),
1023
C64e(0x5f355f4c35262679), C64e(0x712f719d2fc3c3b2),
1024
C64e(0x38e13867e1bebe86), C64e(0xfda2fd6aa23535c8),
1025
C64e(0x4fcc4f0bcc8888c7), C64e(0x4b394b5c392e2e65),
1026
C64e(0xf957f93d5793936a), C64e(0x0df20daaf2555558),
1027
C64e(0x9d829de382fcfc61), C64e(0xc947c9f4477a7ab3),
1028
C64e(0xefacef8bacc8c827), C64e(0x32e7326fe7baba88),
1029
C64e(0x7d2b7d642b32324f), C64e(0xa495a4d795e6e642),
1030
C64e(0xfba0fb9ba0c0c03b), C64e(0xb398b332981919aa),
1031
C64e(0x68d16827d19e9ef6), C64e(0x817f815d7fa3a322),
1032
C64e(0xaa66aa88664444ee), C64e(0x827e82a87e5454d6),
1033
C64e(0xe6abe676ab3b3bdd), C64e(0x9e839e16830b0b95),
1034
C64e(0x45ca4503ca8c8cc9), C64e(0x7b297b9529c7c7bc),
1035
C64e(0x6ed36ed6d36b6b05), C64e(0x443c44503c28286c),
1036
C64e(0x8b798b5579a7a72c), C64e(0x3de23d63e2bcbc81),
1037
C64e(0x271d272c1d161631), C64e(0x9a769a4176adad37),
1038
C64e(0x4d3b4dad3bdbdb96), C64e(0xfa56fac85664649e),
1039
C64e(0xd24ed2e84e7474a6), C64e(0x221e22281e141436),
1040
C64e(0x76db763fdb9292e4), C64e(0x1e0a1e180a0c0c12),
1041
C64e(0xb46cb4906c4848fc), C64e(0x37e4376be4b8b88f),
1042
C64e(0xe75de7255d9f9f78), C64e(0xb26eb2616ebdbd0f),
1043
C64e(0x2aef2a86ef434369), C64e(0xf1a6f193a6c4c435),
1044
C64e(0xe3a8e372a83939da), C64e(0xf7a4f762a43131c6),
1045
C64e(0x593759bd37d3d38a), C64e(0x868b86ff8bf2f274),
1046
C64e(0x563256b132d5d583), C64e(0xc543c50d438b8b4e),
1047
C64e(0xeb59ebdc596e6e85), C64e(0xc2b7c2afb7dada18),
1048
C64e(0x8f8c8f028c01018e), C64e(0xac64ac7964b1b11d),
1049
C64e(0x6dd26d23d29c9cf1), C64e(0x3be03b92e0494972),
1050
C64e(0xc7b4c7abb4d8d81f), C64e(0x15fa1543faacacb9),
1051
C64e(0x090709fd07f3f3fa), C64e(0x6f256f8525cfcfa0),
1052
C64e(0xeaafea8fafcaca20), C64e(0x898e89f38ef4f47d),
1053
C64e(0x20e9208ee9474767), C64e(0x2818282018101038),
1054
C64e(0x64d564ded56f6f0b), C64e(0x838883fb88f0f073),
1055
C64e(0xb16fb1946f4a4afb), C64e(0x967296b8725c5cca),
1056
C64e(0x6c246c7024383854), C64e(0x08f108aef157575f),
1057
C64e(0x52c752e6c7737321), C64e(0xf351f33551979764),
1058
C64e(0x6523658d23cbcbae), C64e(0x847c84597ca1a125),
1059
C64e(0xbf9cbfcb9ce8e857), C64e(0x6321637c213e3e5d),
1060
C64e(0x7cdd7c37dd9696ea), C64e(0x7fdc7fc2dc61611e),
1061
C64e(0x9186911a860d0d9c), C64e(0x9485941e850f0f9b),
1062
C64e(0xab90abdb90e0e04b), C64e(0xc642c6f8427c7cba),
1063
C64e(0x57c457e2c4717126), C64e(0xe5aae583aacccc29),
1064
C64e(0x73d8733bd89090e3), C64e(0x0f050f0c05060609),
1065
C64e(0x030103f501f7f7f4), C64e(0x36123638121c1c2a),
1066
C64e(0xfea3fe9fa3c2c23c), C64e(0xe15fe1d45f6a6a8b),
1067
C64e(0x10f91047f9aeaebe), C64e(0x6bd06bd2d0696902),
1068
C64e(0xa891a82e911717bf), C64e(0xe858e82958999971),
1069
C64e(0x69276974273a3a53), C64e(0xd0b9d04eb92727f7),
1070
C64e(0x483848a938d9d991), C64e(0x351335cd13ebebde),
1071
C64e(0xceb3ce56b32b2be5), C64e(0x5533554433222277),
1072
C64e(0xd6bbd6bfbbd2d204), C64e(0x9070904970a9a939),
1073
C64e(0x8089800e89070787), C64e(0xf2a7f266a73333c1),
1074
C64e(0xc1b6c15ab62d2dec), C64e(0x66226678223c3c5a),
1075
C64e(0xad92ad2a921515b8), C64e(0x6020608920c9c9a9),
1076
C64e(0xdb49db154987875c), C64e(0x1aff1a4fffaaaab0),
1077
C64e(0x887888a0785050d8), C64e(0x8e7a8e517aa5a52b),
1078
C64e(0x8a8f8a068f030389), C64e(0x13f813b2f859594a),
1079
C64e(0x9b809b1280090992), C64e(0x39173934171a1a23),
1080
C64e(0x75da75cada656510), C64e(0x533153b531d7d784),
1081
C64e(0x51c65113c68484d5), C64e(0xd3b8d3bbb8d0d003),
1082
C64e(0x5ec35e1fc38282dc), C64e(0xcbb0cb52b02929e2),
1083
C64e(0x997799b4775a5ac3), C64e(0x3311333c111e1e2d),
1084
C64e(0x46cb46f6cb7b7b3d), C64e(0x1ffc1f4bfca8a8b7),
1085
C64e(0x61d661dad66d6d0c), C64e(0x4e3a4e583a2c2c62)
1086
};
1087
1088
static const sph_u64 T7[] = {
1089
C64e(0x32f4a5f497a5c6c6), C64e(0x6f978497eb84f8f8),
1090
C64e(0x5eb099b0c799eeee), C64e(0x7a8c8d8cf78df6f6),
1091
C64e(0xe8170d17e50dffff), C64e(0x0adcbddcb7bdd6d6),
1092
C64e(0x16c8b1c8a7b1dede), C64e(0x6dfc54fc39549191),
1093
C64e(0x90f050f0c0506060), C64e(0x0705030504030202),
1094
C64e(0x2ee0a9e087a9cece), C64e(0xd1877d87ac7d5656),
1095
C64e(0xcc2b192bd519e7e7), C64e(0x13a662a67162b5b5),
1096
C64e(0x7c31e6319ae64d4d), C64e(0x59b59ab5c39aecec),
1097
C64e(0x40cf45cf05458f8f), C64e(0xa3bc9dbc3e9d1f1f),
1098
C64e(0x49c040c009408989), C64e(0x68928792ef87fafa),
1099
C64e(0xd03f153fc515efef), C64e(0x9426eb267febb2b2),
1100
C64e(0xce40c94007c98e8e), C64e(0xe61d0b1ded0bfbfb),
1101
C64e(0x6e2fec2f82ec4141), C64e(0x1aa967a97d67b3b3),
1102
C64e(0x431cfd1cbefd5f5f), C64e(0x6025ea258aea4545),
1103
C64e(0xf9dabfda46bf2323), C64e(0x5102f702a6f75353),
1104
C64e(0x45a196a1d396e4e4), C64e(0x76ed5bed2d5b9b9b),
1105
C64e(0x285dc25deac27575), C64e(0xc5241c24d91ce1e1),
1106
C64e(0xd4e9aee97aae3d3d), C64e(0xf2be6abe986a4c4c),
1107
C64e(0x82ee5aeed85a6c6c), C64e(0xbdc341c3fc417e7e),
1108
C64e(0xf3060206f102f5f5), C64e(0x52d14fd11d4f8383),
1109
C64e(0x8ce45ce4d05c6868), C64e(0x5607f407a2f45151),
1110
C64e(0x8d5c345cb934d1d1), C64e(0xe1180818e908f9f9),
1111
C64e(0x4cae93aedf93e2e2), C64e(0x3e9573954d73abab),
1112
C64e(0x97f553f5c4536262), C64e(0x6b413f41543f2a2a),
1113
C64e(0x1c140c14100c0808), C64e(0x63f652f631529595),
1114
C64e(0xe9af65af8c654646), C64e(0x7fe25ee2215e9d9d),
1115
C64e(0x4878287860283030), C64e(0xcff8a1f86ea13737),
1116
C64e(0x1b110f11140f0a0a), C64e(0xebc4b5c45eb52f2f),
1117
C64e(0x151b091b1c090e0e), C64e(0x7e5a365a48362424),
1118
C64e(0xadb69bb6369b1b1b), C64e(0x98473d47a53ddfdf),
1119
C64e(0xa76a266a8126cdcd), C64e(0xf5bb69bb9c694e4e),
1120
C64e(0x334ccd4cfecd7f7f), C64e(0x50ba9fbacf9feaea),
1121
C64e(0x3f2d1b2d241b1212), C64e(0xa4b99eb93a9e1d1d),
1122
C64e(0xc49c749cb0745858), C64e(0x46722e72682e3434),
1123
C64e(0x41772d776c2d3636), C64e(0x11cdb2cda3b2dcdc),
1124
C64e(0x9d29ee2973eeb4b4), C64e(0x4d16fb16b6fb5b5b),
1125
C64e(0xa501f60153f6a4a4), C64e(0xa1d74dd7ec4d7676),
1126
C64e(0x14a361a37561b7b7), C64e(0x3449ce49face7d7d),
1127
C64e(0xdf8d7b8da47b5252), C64e(0x9f423e42a13edddd),
1128
C64e(0xcd937193bc715e5e), C64e(0xb1a297a226971313),
1129
C64e(0xa204f50457f5a6a6), C64e(0x01b868b86968b9b9),
1130
C64e(0x0000000000000000), C64e(0xb5742c74992cc1c1),
1131
C64e(0xe0a060a080604040), C64e(0xc2211f21dd1fe3e3),
1132
C64e(0x3a43c843f2c87979), C64e(0x9a2ced2c77edb6b6),
1133
C64e(0x0dd9bed9b3bed4d4), C64e(0x47ca46ca01468d8d),
1134
C64e(0x1770d970ced96767), C64e(0xafdd4bdde44b7272),
1135
C64e(0xed79de7933de9494), C64e(0xff67d4672bd49898),
1136
C64e(0x9323e8237be8b0b0), C64e(0x5bde4ade114a8585),
1137
C64e(0x06bd6bbd6d6bbbbb), C64e(0xbb7e2a7e912ac5c5),
1138
C64e(0x7b34e5349ee54f4f), C64e(0xd73a163ac116eded),
1139
C64e(0xd254c55417c58686), C64e(0xf862d7622fd79a9a),
1140
C64e(0x99ff55ffcc556666), C64e(0xb6a794a722941111),
1141
C64e(0xc04acf4a0fcf8a8a), C64e(0xd9301030c910e9e9),
1142
C64e(0x0e0a060a08060404), C64e(0x66988198e781fefe),
1143
C64e(0xab0bf00b5bf0a0a0), C64e(0xb4cc44ccf0447878),
1144
C64e(0xf0d5bad54aba2525), C64e(0x753ee33e96e34b4b),
1145
C64e(0xac0ef30e5ff3a2a2), C64e(0x4419fe19bafe5d5d),
1146
C64e(0xdb5bc05b1bc08080), C64e(0x80858a850a8a0505),
1147
C64e(0xd3ecadec7ead3f3f), C64e(0xfedfbcdf42bc2121),
1148
C64e(0xa8d848d8e0487070), C64e(0xfd0c040cf904f1f1),
1149
C64e(0x197adf7ac6df6363), C64e(0x2f58c158eec17777),
1150
C64e(0x309f759f4575afaf), C64e(0xe7a563a584634242),
1151
C64e(0x7050305040302020), C64e(0xcb2e1a2ed11ae5e5),
1152
C64e(0xef120e12e10efdfd), C64e(0x08b76db7656dbfbf),
1153
C64e(0x55d44cd4194c8181), C64e(0x243c143c30141818),
1154
C64e(0x795f355f4c352626), C64e(0xb2712f719d2fc3c3),
1155
C64e(0x8638e13867e1bebe), C64e(0xc8fda2fd6aa23535),
1156
C64e(0xc74fcc4f0bcc8888), C64e(0x654b394b5c392e2e),
1157
C64e(0x6af957f93d579393), C64e(0x580df20daaf25555),
1158
C64e(0x619d829de382fcfc), C64e(0xb3c947c9f4477a7a),
1159
C64e(0x27efacef8bacc8c8), C64e(0x8832e7326fe7baba),
1160
C64e(0x4f7d2b7d642b3232), C64e(0x42a495a4d795e6e6),
1161
C64e(0x3bfba0fb9ba0c0c0), C64e(0xaab398b332981919),
1162
C64e(0xf668d16827d19e9e), C64e(0x22817f815d7fa3a3),
1163
C64e(0xeeaa66aa88664444), C64e(0xd6827e82a87e5454),
1164
C64e(0xdde6abe676ab3b3b), C64e(0x959e839e16830b0b),
1165
C64e(0xc945ca4503ca8c8c), C64e(0xbc7b297b9529c7c7),
1166
C64e(0x056ed36ed6d36b6b), C64e(0x6c443c44503c2828),
1167
C64e(0x2c8b798b5579a7a7), C64e(0x813de23d63e2bcbc),
1168
C64e(0x31271d272c1d1616), C64e(0x379a769a4176adad),
1169
C64e(0x964d3b4dad3bdbdb), C64e(0x9efa56fac8566464),
1170
C64e(0xa6d24ed2e84e7474), C64e(0x36221e22281e1414),
1171
C64e(0xe476db763fdb9292), C64e(0x121e0a1e180a0c0c),
1172
C64e(0xfcb46cb4906c4848), C64e(0x8f37e4376be4b8b8),
1173
C64e(0x78e75de7255d9f9f), C64e(0x0fb26eb2616ebdbd),
1174
C64e(0x692aef2a86ef4343), C64e(0x35f1a6f193a6c4c4),
1175
C64e(0xdae3a8e372a83939), C64e(0xc6f7a4f762a43131),
1176
C64e(0x8a593759bd37d3d3), C64e(0x74868b86ff8bf2f2),
1177
C64e(0x83563256b132d5d5), C64e(0x4ec543c50d438b8b),
1178
C64e(0x85eb59ebdc596e6e), C64e(0x18c2b7c2afb7dada),
1179
C64e(0x8e8f8c8f028c0101), C64e(0x1dac64ac7964b1b1),
1180
C64e(0xf16dd26d23d29c9c), C64e(0x723be03b92e04949),
1181
C64e(0x1fc7b4c7abb4d8d8), C64e(0xb915fa1543faacac),
1182
C64e(0xfa090709fd07f3f3), C64e(0xa06f256f8525cfcf),
1183
C64e(0x20eaafea8fafcaca), C64e(0x7d898e89f38ef4f4),
1184
C64e(0x6720e9208ee94747), C64e(0x3828182820181010),
1185
C64e(0x0b64d564ded56f6f), C64e(0x73838883fb88f0f0),
1186
C64e(0xfbb16fb1946f4a4a), C64e(0xca967296b8725c5c),
1187
C64e(0x546c246c70243838), C64e(0x5f08f108aef15757),
1188
C64e(0x2152c752e6c77373), C64e(0x64f351f335519797),
1189
C64e(0xae6523658d23cbcb), C64e(0x25847c84597ca1a1),
1190
C64e(0x57bf9cbfcb9ce8e8), C64e(0x5d6321637c213e3e),
1191
C64e(0xea7cdd7c37dd9696), C64e(0x1e7fdc7fc2dc6161),
1192
C64e(0x9c9186911a860d0d), C64e(0x9b9485941e850f0f),
1193
C64e(0x4bab90abdb90e0e0), C64e(0xbac642c6f8427c7c),
1194
C64e(0x2657c457e2c47171), C64e(0x29e5aae583aacccc),
1195
C64e(0xe373d8733bd89090), C64e(0x090f050f0c050606),
1196
C64e(0xf4030103f501f7f7), C64e(0x2a36123638121c1c),
1197
C64e(0x3cfea3fe9fa3c2c2), C64e(0x8be15fe1d45f6a6a),
1198
C64e(0xbe10f91047f9aeae), C64e(0x026bd06bd2d06969),
1199
C64e(0xbfa891a82e911717), C64e(0x71e858e829589999),
1200
C64e(0x5369276974273a3a), C64e(0xf7d0b9d04eb92727),
1201
C64e(0x91483848a938d9d9), C64e(0xde351335cd13ebeb),
1202
C64e(0xe5ceb3ce56b32b2b), C64e(0x7755335544332222),
1203
C64e(0x04d6bbd6bfbbd2d2), C64e(0x399070904970a9a9),
1204
C64e(0x878089800e890707), C64e(0xc1f2a7f266a73333),
1205
C64e(0xecc1b6c15ab62d2d), C64e(0x5a66226678223c3c),
1206
C64e(0xb8ad92ad2a921515), C64e(0xa96020608920c9c9),
1207
C64e(0x5cdb49db15498787), C64e(0xb01aff1a4fffaaaa),
1208
C64e(0xd8887888a0785050), C64e(0x2b8e7a8e517aa5a5),
1209
C64e(0x898a8f8a068f0303), C64e(0x4a13f813b2f85959),
1210
C64e(0x929b809b12800909), C64e(0x2339173934171a1a),
1211
C64e(0x1075da75cada6565), C64e(0x84533153b531d7d7),
1212
C64e(0xd551c65113c68484), C64e(0x03d3b8d3bbb8d0d0),
1213
C64e(0xdc5ec35e1fc38282), C64e(0xe2cbb0cb52b02929),
1214
C64e(0xc3997799b4775a5a), C64e(0x2d3311333c111e1e),
1215
C64e(0x3d46cb46f6cb7b7b), C64e(0xb71ffc1f4bfca8a8),
1216
C64e(0x0c61d661dad66d6d), C64e(0x624e3a4e583a2c2c)
1217
};
1218
1219
#endif
1220
1221
#define DECL_STATE_SMALL \
1222
sph_u64 H[8];
1223
1224
#define READ_STATE_SMALL(sc) do { \
1225
memcpy(H, (sc)->state.wide, sizeof H); \
1226
} while (0)
1227
1228
#define WRITE_STATE_SMALL(sc) do { \
1229
memcpy((sc)->state.wide, H, sizeof H); \
1230
} while (0)
1231
1232
#if SPH_SMALL_FOOTPRINT_GROESTL
1233
1234
#define RSTT(d, a, b0, b1, b2, b3, b4, b5, b6, b7) do { \
1235
t[d] = T0[B64_0(a[b0])] \
1236
^ R64(T0[B64_1(a[b1])], 8) \
1237
^ R64(T0[B64_2(a[b2])], 16) \
1238
^ R64(T0[B64_3(a[b3])], 24) \
1239
^ T4[B64_4(a[b4])] \
1240
^ R64(T4[B64_5(a[b5])], 8) \
1241
^ R64(T4[B64_6(a[b6])], 16) \
1242
^ R64(T4[B64_7(a[b7])], 24); \
1243
} while (0)
1244
1245
#else
1246
1247
#define RSTT(d, a, b0, b1, b2, b3, b4, b5, b6, b7) do { \
1248
t[d] = T0[B64_0(a[b0])] \
1249
^ T1[B64_1(a[b1])] \
1250
^ T2[B64_2(a[b2])] \
1251
^ T3[B64_3(a[b3])] \
1252
^ T4[B64_4(a[b4])] \
1253
^ T5[B64_5(a[b5])] \
1254
^ T6[B64_6(a[b6])] \
1255
^ T7[B64_7(a[b7])]; \
1256
} while (0)
1257
1258
#endif
1259
1260
#define ROUND_SMALL_P(a, r) do { \
1261
sph_u64 t[8]; \
1262
a[0] ^= PC64(0x00, r); \
1263
a[1] ^= PC64(0x10, r); \
1264
a[2] ^= PC64(0x20, r); \
1265
a[3] ^= PC64(0x30, r); \
1266
a[4] ^= PC64(0x40, r); \
1267
a[5] ^= PC64(0x50, r); \
1268
a[6] ^= PC64(0x60, r); \
1269
a[7] ^= PC64(0x70, r); \
1270
RSTT(0, a, 0, 1, 2, 3, 4, 5, 6, 7); \
1271
RSTT(1, a, 1, 2, 3, 4, 5, 6, 7, 0); \
1272
RSTT(2, a, 2, 3, 4, 5, 6, 7, 0, 1); \
1273
RSTT(3, a, 3, 4, 5, 6, 7, 0, 1, 2); \
1274
RSTT(4, a, 4, 5, 6, 7, 0, 1, 2, 3); \
1275
RSTT(5, a, 5, 6, 7, 0, 1, 2, 3, 4); \
1276
RSTT(6, a, 6, 7, 0, 1, 2, 3, 4, 5); \
1277
RSTT(7, a, 7, 0, 1, 2, 3, 4, 5, 6); \
1278
a[0] = t[0]; \
1279
a[1] = t[1]; \
1280
a[2] = t[2]; \
1281
a[3] = t[3]; \
1282
a[4] = t[4]; \
1283
a[5] = t[5]; \
1284
a[6] = t[6]; \
1285
a[7] = t[7]; \
1286
} while (0)
1287
1288
#define ROUND_SMALL_Q(a, r) do { \
1289
sph_u64 t[8]; \
1290
a[0] ^= QC64(0x00, r); \
1291
a[1] ^= QC64(0x10, r); \
1292
a[2] ^= QC64(0x20, r); \
1293
a[3] ^= QC64(0x30, r); \
1294
a[4] ^= QC64(0x40, r); \
1295
a[5] ^= QC64(0x50, r); \
1296
a[6] ^= QC64(0x60, r); \
1297
a[7] ^= QC64(0x70, r); \
1298
RSTT(0, a, 1, 3, 5, 7, 0, 2, 4, 6); \
1299
RSTT(1, a, 2, 4, 6, 0, 1, 3, 5, 7); \
1300
RSTT(2, a, 3, 5, 7, 1, 2, 4, 6, 0); \
1301
RSTT(3, a, 4, 6, 0, 2, 3, 5, 7, 1); \
1302
RSTT(4, a, 5, 7, 1, 3, 4, 6, 0, 2); \
1303
RSTT(5, a, 6, 0, 2, 4, 5, 7, 1, 3); \
1304
RSTT(6, a, 7, 1, 3, 5, 6, 0, 2, 4); \
1305
RSTT(7, a, 0, 2, 4, 6, 7, 1, 3, 5); \
1306
a[0] = t[0]; \
1307
a[1] = t[1]; \
1308
a[2] = t[2]; \
1309
a[3] = t[3]; \
1310
a[4] = t[4]; \
1311
a[5] = t[5]; \
1312
a[6] = t[6]; \
1313
a[7] = t[7]; \
1314
} while (0)
1315
1316
#if SPH_SMALL_FOOTPRINT_GROESTL
1317
1318
#define PERM_SMALL_P(a) do { \
1319
int r; \
1320
for (r = 0; r < 10; r ++) \
1321
ROUND_SMALL_P(a, r); \
1322
} while (0)
1323
1324
#define PERM_SMALL_Q(a) do { \
1325
int r; \
1326
for (r = 0; r < 10; r ++) \
1327
ROUND_SMALL_Q(a, r); \
1328
} while (0)
1329
1330
#else
1331
1332
/*
1333
* Apparently, unrolling more than that confuses GCC, resulting in
1334
* lower performance, even though L1 cache would be no problem.
1335
*/
1336
#define PERM_SMALL_P(a) do { \
1337
int r; \
1338
for (r = 0; r < 10; r += 2) { \
1339
ROUND_SMALL_P(a, r + 0); \
1340
ROUND_SMALL_P(a, r + 1); \
1341
} \
1342
} while (0)
1343
1344
#define PERM_SMALL_Q(a) do { \
1345
int r; \
1346
for (r = 0; r < 10; r += 2) { \
1347
ROUND_SMALL_Q(a, r + 0); \
1348
ROUND_SMALL_Q(a, r + 1); \
1349
} \
1350
} while (0)
1351
1352
#endif
1353
1354
#define COMPRESS_SMALL do { \
1355
sph_u64 g[8], m[8]; \
1356
size_t u; \
1357
for (u = 0; u < 8; u ++) { \
1358
m[u] = dec64e_aligned(buf + (u << 3)); \
1359
g[u] = m[u] ^ H[u]; \
1360
} \
1361
PERM_SMALL_P(g); \
1362
PERM_SMALL_Q(m); \
1363
for (u = 0; u < 8; u ++) \
1364
H[u] ^= g[u] ^ m[u]; \
1365
} while (0)
1366
1367
#define FINAL_SMALL do { \
1368
sph_u64 x[8]; \
1369
size_t u; \
1370
memcpy(x, H, sizeof x); \
1371
PERM_SMALL_P(x); \
1372
for (u = 0; u < 8; u ++) \
1373
H[u] ^= x[u]; \
1374
} while (0)
1375
1376
#define DECL_STATE_BIG \
1377
sph_u64 H[16];
1378
1379
#define READ_STATE_BIG(sc) do { \
1380
memcpy(H, (sc)->state.wide, sizeof H); \
1381
} while (0)
1382
1383
#define WRITE_STATE_BIG(sc) do { \
1384
memcpy((sc)->state.wide, H, sizeof H); \
1385
} while (0)
1386
1387
#if SPH_SMALL_FOOTPRINT_GROESTL
1388
1389
#define RBTT(d, a, b0, b1, b2, b3, b4, b5, b6, b7) do { \
1390
t[d] = T0[B64_0(a[b0])] \
1391
^ R64(T0[B64_1(a[b1])], 8) \
1392
^ R64(T0[B64_2(a[b2])], 16) \
1393
^ R64(T0[B64_3(a[b3])], 24) \
1394
^ T4[B64_4(a[b4])] \
1395
^ R64(T4[B64_5(a[b5])], 8) \
1396
^ R64(T4[B64_6(a[b6])], 16) \
1397
^ R64(T4[B64_7(a[b7])], 24); \
1398
} while (0)
1399
1400
#else
1401
1402
#define RBTT(d, a, b0, b1, b2, b3, b4, b5, b6, b7) do { \
1403
t[d] = T0[B64_0(a[b0])] \
1404
^ T1[B64_1(a[b1])] \
1405
^ T2[B64_2(a[b2])] \
1406
^ T3[B64_3(a[b3])] \
1407
^ T4[B64_4(a[b4])] \
1408
^ T5[B64_5(a[b5])] \
1409
^ T6[B64_6(a[b6])] \
1410
^ T7[B64_7(a[b7])]; \
1411
} while (0)
1412
1413
#endif
1414
1415
#if SPH_SMALL_FOOTPRINT_GROESTL
1416
1417
#define ROUND_BIG_P(a, r) do { \
1418
sph_u64 t[16]; \
1419
size_t u; \
1420
a[0x0] ^= PC64(0x00, r); \
1421
a[0x1] ^= PC64(0x10, r); \
1422
a[0x2] ^= PC64(0x20, r); \
1423
a[0x3] ^= PC64(0x30, r); \
1424
a[0x4] ^= PC64(0x40, r); \
1425
a[0x5] ^= PC64(0x50, r); \
1426
a[0x6] ^= PC64(0x60, r); \
1427
a[0x7] ^= PC64(0x70, r); \
1428
a[0x8] ^= PC64(0x80, r); \
1429
a[0x9] ^= PC64(0x90, r); \
1430
a[0xA] ^= PC64(0xA0, r); \
1431
a[0xB] ^= PC64(0xB0, r); \
1432
a[0xC] ^= PC64(0xC0, r); \
1433
a[0xD] ^= PC64(0xD0, r); \
1434
a[0xE] ^= PC64(0xE0, r); \
1435
a[0xF] ^= PC64(0xF0, r); \
1436
for (u = 0; u < 16; u += 4) { \
1437
RBTT(u + 0, a, u + 0, (u + 1) & 0xF, \
1438
(u + 2) & 0xF, (u + 3) & 0xF, (u + 4) & 0xF, \
1439
(u + 5) & 0xF, (u + 6) & 0xF, (u + 11) & 0xF); \
1440
RBTT(u + 1, a, u + 1, (u + 2) & 0xF, \
1441
(u + 3) & 0xF, (u + 4) & 0xF, (u + 5) & 0xF, \
1442
(u + 6) & 0xF, (u + 7) & 0xF, (u + 12) & 0xF); \
1443
RBTT(u + 2, a, u + 2, (u + 3) & 0xF, \
1444
(u + 4) & 0xF, (u + 5) & 0xF, (u + 6) & 0xF, \
1445
(u + 7) & 0xF, (u + 8) & 0xF, (u + 13) & 0xF); \
1446
RBTT(u + 3, a, u + 3, (u + 4) & 0xF, \
1447
(u + 5) & 0xF, (u + 6) & 0xF, (u + 7) & 0xF, \
1448
(u + 8) & 0xF, (u + 9) & 0xF, (u + 14) & 0xF); \
1449
} \
1450
memcpy(a, t, sizeof t); \
1451
} while (0)
1452
1453
#define ROUND_BIG_Q(a, r) do { \
1454
sph_u64 t[16]; \
1455
size_t u; \
1456
a[0x0] ^= QC64(0x00, r); \
1457
a[0x1] ^= QC64(0x10, r); \
1458
a[0x2] ^= QC64(0x20, r); \
1459
a[0x3] ^= QC64(0x30, r); \
1460
a[0x4] ^= QC64(0x40, r); \
1461
a[0x5] ^= QC64(0x50, r); \
1462
a[0x6] ^= QC64(0x60, r); \
1463
a[0x7] ^= QC64(0x70, r); \
1464
a[0x8] ^= QC64(0x80, r); \
1465
a[0x9] ^= QC64(0x90, r); \
1466
a[0xA] ^= QC64(0xA0, r); \
1467
a[0xB] ^= QC64(0xB0, r); \
1468
a[0xC] ^= QC64(0xC0, r); \
1469
a[0xD] ^= QC64(0xD0, r); \
1470
a[0xE] ^= QC64(0xE0, r); \
1471
a[0xF] ^= QC64(0xF0, r); \
1472
for (u = 0; u < 16; u += 4) { \
1473
RBTT(u + 0, a, (u + 1) & 0xF, (u + 3) & 0xF, \
1474
(u + 5) & 0xF, (u + 11) & 0xF, (u + 0) & 0xF, \
1475
(u + 2) & 0xF, (u + 4) & 0xF, (u + 6) & 0xF); \
1476
RBTT(u + 1, a, (u + 2) & 0xF, (u + 4) & 0xF, \
1477
(u + 6) & 0xF, (u + 12) & 0xF, (u + 1) & 0xF, \
1478
(u + 3) & 0xF, (u + 5) & 0xF, (u + 7) & 0xF); \
1479
RBTT(u + 2, a, (u + 3) & 0xF, (u + 5) & 0xF, \
1480
(u + 7) & 0xF, (u + 13) & 0xF, (u + 2) & 0xF, \
1481
(u + 4) & 0xF, (u + 6) & 0xF, (u + 8) & 0xF); \
1482
RBTT(u + 3, a, (u + 4) & 0xF, (u + 6) & 0xF, \
1483
(u + 8) & 0xF, (u + 14) & 0xF, (u + 3) & 0xF, \
1484
(u + 5) & 0xF, (u + 7) & 0xF, (u + 9) & 0xF); \
1485
} \
1486
memcpy(a, t, sizeof t); \
1487
} while (0)
1488
1489
#else
1490
1491
#define ROUND_BIG_P(a, r) do { \
1492
sph_u64 t[16]; \
1493
a[0x0] ^= PC64(0x00, r); \
1494
a[0x1] ^= PC64(0x10, r); \
1495
a[0x2] ^= PC64(0x20, r); \
1496
a[0x3] ^= PC64(0x30, r); \
1497
a[0x4] ^= PC64(0x40, r); \
1498
a[0x5] ^= PC64(0x50, r); \
1499
a[0x6] ^= PC64(0x60, r); \
1500
a[0x7] ^= PC64(0x70, r); \
1501
a[0x8] ^= PC64(0x80, r); \
1502
a[0x9] ^= PC64(0x90, r); \
1503
a[0xA] ^= PC64(0xA0, r); \
1504
a[0xB] ^= PC64(0xB0, r); \
1505
a[0xC] ^= PC64(0xC0, r); \
1506
a[0xD] ^= PC64(0xD0, r); \
1507
a[0xE] ^= PC64(0xE0, r); \
1508
a[0xF] ^= PC64(0xF0, r); \
1509
RBTT(0x0, a, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0xB); \
1510
RBTT(0x1, a, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0xC); \
1511
RBTT(0x2, a, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xD); \
1512
RBTT(0x3, a, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xE); \
1513
RBTT(0x4, a, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xF); \
1514
RBTT(0x5, a, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0x0); \
1515
RBTT(0x6, a, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0x1); \
1516
RBTT(0x7, a, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0x2); \
1517
RBTT(0x8, a, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0x3); \
1518
RBTT(0x9, a, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x4); \
1519
RBTT(0xA, a, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x0, 0x5); \
1520
RBTT(0xB, a, 0xB, 0xC, 0xD, 0xE, 0xF, 0x0, 0x1, 0x6); \
1521
RBTT(0xC, a, 0xC, 0xD, 0xE, 0xF, 0x0, 0x1, 0x2, 0x7); \
1522
RBTT(0xD, a, 0xD, 0xE, 0xF, 0x0, 0x1, 0x2, 0x3, 0x8); \
1523
RBTT(0xE, a, 0xE, 0xF, 0x0, 0x1, 0x2, 0x3, 0x4, 0x9); \
1524
RBTT(0xF, a, 0xF, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0xA); \
1525
a[0x0] = t[0x0]; \
1526
a[0x1] = t[0x1]; \
1527
a[0x2] = t[0x2]; \
1528
a[0x3] = t[0x3]; \
1529
a[0x4] = t[0x4]; \
1530
a[0x5] = t[0x5]; \
1531
a[0x6] = t[0x6]; \
1532
a[0x7] = t[0x7]; \
1533
a[0x8] = t[0x8]; \
1534
a[0x9] = t[0x9]; \
1535
a[0xA] = t[0xA]; \
1536
a[0xB] = t[0xB]; \
1537
a[0xC] = t[0xC]; \
1538
a[0xD] = t[0xD]; \
1539
a[0xE] = t[0xE]; \
1540
a[0xF] = t[0xF]; \
1541
} while (0)
1542
1543
#define ROUND_BIG_Q(a, r) do { \
1544
sph_u64 t[16]; \
1545
a[0x0] ^= QC64(0x00, r); \
1546
a[0x1] ^= QC64(0x10, r); \
1547
a[0x2] ^= QC64(0x20, r); \
1548
a[0x3] ^= QC64(0x30, r); \
1549
a[0x4] ^= QC64(0x40, r); \
1550
a[0x5] ^= QC64(0x50, r); \
1551
a[0x6] ^= QC64(0x60, r); \
1552
a[0x7] ^= QC64(0x70, r); \
1553
a[0x8] ^= QC64(0x80, r); \
1554
a[0x9] ^= QC64(0x90, r); \
1555
a[0xA] ^= QC64(0xA0, r); \
1556
a[0xB] ^= QC64(0xB0, r); \
1557
a[0xC] ^= QC64(0xC0, r); \
1558
a[0xD] ^= QC64(0xD0, r); \
1559
a[0xE] ^= QC64(0xE0, r); \
1560
a[0xF] ^= QC64(0xF0, r); \
1561
RBTT(0x0, a, 0x1, 0x3, 0x5, 0xB, 0x0, 0x2, 0x4, 0x6); \
1562
RBTT(0x1, a, 0x2, 0x4, 0x6, 0xC, 0x1, 0x3, 0x5, 0x7); \
1563
RBTT(0x2, a, 0x3, 0x5, 0x7, 0xD, 0x2, 0x4, 0x6, 0x8); \
1564
RBTT(0x3, a, 0x4, 0x6, 0x8, 0xE, 0x3, 0x5, 0x7, 0x9); \
1565
RBTT(0x4, a, 0x5, 0x7, 0x9, 0xF, 0x4, 0x6, 0x8, 0xA); \
1566
RBTT(0x5, a, 0x6, 0x8, 0xA, 0x0, 0x5, 0x7, 0x9, 0xB); \
1567
RBTT(0x6, a, 0x7, 0x9, 0xB, 0x1, 0x6, 0x8, 0xA, 0xC); \
1568
RBTT(0x7, a, 0x8, 0xA, 0xC, 0x2, 0x7, 0x9, 0xB, 0xD); \
1569
RBTT(0x8, a, 0x9, 0xB, 0xD, 0x3, 0x8, 0xA, 0xC, 0xE); \
1570
RBTT(0x9, a, 0xA, 0xC, 0xE, 0x4, 0x9, 0xB, 0xD, 0xF); \
1571
RBTT(0xA, a, 0xB, 0xD, 0xF, 0x5, 0xA, 0xC, 0xE, 0x0); \
1572
RBTT(0xB, a, 0xC, 0xE, 0x0, 0x6, 0xB, 0xD, 0xF, 0x1); \
1573
RBTT(0xC, a, 0xD, 0xF, 0x1, 0x7, 0xC, 0xE, 0x0, 0x2); \
1574
RBTT(0xD, a, 0xE, 0x0, 0x2, 0x8, 0xD, 0xF, 0x1, 0x3); \
1575
RBTT(0xE, a, 0xF, 0x1, 0x3, 0x9, 0xE, 0x0, 0x2, 0x4); \
1576
RBTT(0xF, a, 0x0, 0x2, 0x4, 0xA, 0xF, 0x1, 0x3, 0x5); \
1577
a[0x0] = t[0x0]; \
1578
a[0x1] = t[0x1]; \
1579
a[0x2] = t[0x2]; \
1580
a[0x3] = t[0x3]; \
1581
a[0x4] = t[0x4]; \
1582
a[0x5] = t[0x5]; \
1583
a[0x6] = t[0x6]; \
1584
a[0x7] = t[0x7]; \
1585
a[0x8] = t[0x8]; \
1586
a[0x9] = t[0x9]; \
1587
a[0xA] = t[0xA]; \
1588
a[0xB] = t[0xB]; \
1589
a[0xC] = t[0xC]; \
1590
a[0xD] = t[0xD]; \
1591
a[0xE] = t[0xE]; \
1592
a[0xF] = t[0xF]; \
1593
} while (0)
1594
1595
#endif
1596
1597
#define PERM_BIG_P(a) do { \
1598
int r; \
1599
for (r = 0; r < 14; r += 2) { \
1600
ROUND_BIG_P(a, r + 0); \
1601
ROUND_BIG_P(a, r + 1); \
1602
} \
1603
} while (0)
1604
1605
#define PERM_BIG_Q(a) do { \
1606
int r; \
1607
for (r = 0; r < 14; r += 2) { \
1608
ROUND_BIG_Q(a, r + 0); \
1609
ROUND_BIG_Q(a, r + 1); \
1610
} \
1611
} while (0)
1612
1613
/* obsolete
1614
#if SPH_SMALL_FOOTPRINT_GROESTL
1615
1616
#define COMPRESS_BIG do { \
1617
sph_u64 g[16], m[16], *ya; \
1618
const sph_u64 *yc; \
1619
size_t u; \
1620
int i; \
1621
for (u = 0; u < 16; u ++) { \
1622
m[u] = dec64e_aligned(buf + (u << 3)); \
1623
g[u] = m[u] ^ H[u]; \
1624
} \
1625
ya = g; \
1626
yc = CP; \
1627
for (i = 0; i < 2; i ++) { \
1628
PERM_BIG(ya, yc); \
1629
ya = m; \
1630
yc = CQ; \
1631
} \
1632
for (u = 0; u < 16; u ++) { \
1633
H[u] ^= g[u] ^ m[u]; \
1634
} \
1635
} while (0)
1636
1637
#else
1638
*/
1639
1640
#define COMPRESS_BIG do { \
1641
sph_u64 g[16], m[16]; \
1642
size_t u; \
1643
for (u = 0; u < 16; u ++) { \
1644
m[u] = dec64e_aligned(buf + (u << 3)); \
1645
g[u] = m[u] ^ H[u]; \
1646
} \
1647
PERM_BIG_P(g); \
1648
PERM_BIG_Q(m); \
1649
for (u = 0; u < 16; u ++) { \
1650
H[u] ^= g[u] ^ m[u]; \
1651
} \
1652
} while (0)
1653
1654
/* obsolete
1655
#endif
1656
*/
1657
1658
#define FINAL_BIG do { \
1659
sph_u64 x[16]; \
1660
size_t u; \
1661
memcpy(x, H, sizeof x); \
1662
PERM_BIG_P(x); \
1663
for (u = 0; u < 16; u ++) \
1664
H[u] ^= x[u]; \
1665
} while (0)
1666
1667
#else
1668
1669
static const sph_u32 T0up[] = {
1670
C32e(0xc632f4a5), C32e(0xf86f9784), C32e(0xee5eb099), C32e(0xf67a8c8d),
1671
C32e(0xffe8170d), C32e(0xd60adcbd), C32e(0xde16c8b1), C32e(0x916dfc54),
1672
C32e(0x6090f050), C32e(0x02070503), C32e(0xce2ee0a9), C32e(0x56d1877d),
1673
C32e(0xe7cc2b19), C32e(0xb513a662), C32e(0x4d7c31e6), C32e(0xec59b59a),
1674
C32e(0x8f40cf45), C32e(0x1fa3bc9d), C32e(0x8949c040), C32e(0xfa689287),
1675
C32e(0xefd03f15), C32e(0xb29426eb), C32e(0x8ece40c9), C32e(0xfbe61d0b),
1676
C32e(0x416e2fec), C32e(0xb31aa967), C32e(0x5f431cfd), C32e(0x456025ea),
1677
C32e(0x23f9dabf), C32e(0x535102f7), C32e(0xe445a196), C32e(0x9b76ed5b),
1678
C32e(0x75285dc2), C32e(0xe1c5241c), C32e(0x3dd4e9ae), C32e(0x4cf2be6a),
1679
C32e(0x6c82ee5a), C32e(0x7ebdc341), C32e(0xf5f30602), C32e(0x8352d14f),
1680
C32e(0x688ce45c), C32e(0x515607f4), C32e(0xd18d5c34), C32e(0xf9e11808),
1681
C32e(0xe24cae93), C32e(0xab3e9573), C32e(0x6297f553), C32e(0x2a6b413f),
1682
C32e(0x081c140c), C32e(0x9563f652), C32e(0x46e9af65), C32e(0x9d7fe25e),
1683
C32e(0x30487828), C32e(0x37cff8a1), C32e(0x0a1b110f), C32e(0x2febc4b5),
1684
C32e(0x0e151b09), C32e(0x247e5a36), C32e(0x1badb69b), C32e(0xdf98473d),
1685
C32e(0xcda76a26), C32e(0x4ef5bb69), C32e(0x7f334ccd), C32e(0xea50ba9f),
1686
C32e(0x123f2d1b), C32e(0x1da4b99e), C32e(0x58c49c74), C32e(0x3446722e),
1687
C32e(0x3641772d), C32e(0xdc11cdb2), C32e(0xb49d29ee), C32e(0x5b4d16fb),
1688
C32e(0xa4a501f6), C32e(0x76a1d74d), C32e(0xb714a361), C32e(0x7d3449ce),
1689
C32e(0x52df8d7b), C32e(0xdd9f423e), C32e(0x5ecd9371), C32e(0x13b1a297),
1690
C32e(0xa6a204f5), C32e(0xb901b868), C32e(0x00000000), C32e(0xc1b5742c),
1691
C32e(0x40e0a060), C32e(0xe3c2211f), C32e(0x793a43c8), C32e(0xb69a2ced),
1692
C32e(0xd40dd9be), C32e(0x8d47ca46), C32e(0x671770d9), C32e(0x72afdd4b),
1693
C32e(0x94ed79de), C32e(0x98ff67d4), C32e(0xb09323e8), C32e(0x855bde4a),
1694
C32e(0xbb06bd6b), C32e(0xc5bb7e2a), C32e(0x4f7b34e5), C32e(0xedd73a16),
1695
C32e(0x86d254c5), C32e(0x9af862d7), C32e(0x6699ff55), C32e(0x11b6a794),
1696
C32e(0x8ac04acf), C32e(0xe9d93010), C32e(0x040e0a06), C32e(0xfe669881),
1697
C32e(0xa0ab0bf0), C32e(0x78b4cc44), C32e(0x25f0d5ba), C32e(0x4b753ee3),
1698
C32e(0xa2ac0ef3), C32e(0x5d4419fe), C32e(0x80db5bc0), C32e(0x0580858a),
1699
C32e(0x3fd3ecad), C32e(0x21fedfbc), C32e(0x70a8d848), C32e(0xf1fd0c04),
1700
C32e(0x63197adf), C32e(0x772f58c1), C32e(0xaf309f75), C32e(0x42e7a563),
1701
C32e(0x20705030), C32e(0xe5cb2e1a), C32e(0xfdef120e), C32e(0xbf08b76d),
1702
C32e(0x8155d44c), C32e(0x18243c14), C32e(0x26795f35), C32e(0xc3b2712f),
1703
C32e(0xbe8638e1), C32e(0x35c8fda2), C32e(0x88c74fcc), C32e(0x2e654b39),
1704
C32e(0x936af957), C32e(0x55580df2), C32e(0xfc619d82), C32e(0x7ab3c947),
1705
C32e(0xc827efac), C32e(0xba8832e7), C32e(0x324f7d2b), C32e(0xe642a495),
1706
C32e(0xc03bfba0), C32e(0x19aab398), C32e(0x9ef668d1), C32e(0xa322817f),
1707
C32e(0x44eeaa66), C32e(0x54d6827e), C32e(0x3bdde6ab), C32e(0x0b959e83),
1708
C32e(0x8cc945ca), C32e(0xc7bc7b29), C32e(0x6b056ed3), C32e(0x286c443c),
1709
C32e(0xa72c8b79), C32e(0xbc813de2), C32e(0x1631271d), C32e(0xad379a76),
1710
C32e(0xdb964d3b), C32e(0x649efa56), C32e(0x74a6d24e), C32e(0x1436221e),
1711
C32e(0x92e476db), C32e(0x0c121e0a), C32e(0x48fcb46c), C32e(0xb88f37e4),
1712
C32e(0x9f78e75d), C32e(0xbd0fb26e), C32e(0x43692aef), C32e(0xc435f1a6),
1713
C32e(0x39dae3a8), C32e(0x31c6f7a4), C32e(0xd38a5937), C32e(0xf274868b),
1714
C32e(0xd5835632), C32e(0x8b4ec543), C32e(0x6e85eb59), C32e(0xda18c2b7),
1715
C32e(0x018e8f8c), C32e(0xb11dac64), C32e(0x9cf16dd2), C32e(0x49723be0),
1716
C32e(0xd81fc7b4), C32e(0xacb915fa), C32e(0xf3fa0907), C32e(0xcfa06f25),
1717
C32e(0xca20eaaf), C32e(0xf47d898e), C32e(0x476720e9), C32e(0x10382818),
1718
C32e(0x6f0b64d5), C32e(0xf0738388), C32e(0x4afbb16f), C32e(0x5cca9672),
1719
C32e(0x38546c24), C32e(0x575f08f1), C32e(0x732152c7), C32e(0x9764f351),
1720
C32e(0xcbae6523), C32e(0xa125847c), C32e(0xe857bf9c), C32e(0x3e5d6321),
1721
C32e(0x96ea7cdd), C32e(0x611e7fdc), C32e(0x0d9c9186), C32e(0x0f9b9485),
1722
C32e(0xe04bab90), C32e(0x7cbac642), C32e(0x712657c4), C32e(0xcc29e5aa),
1723
C32e(0x90e373d8), C32e(0x06090f05), C32e(0xf7f40301), C32e(0x1c2a3612),
1724
C32e(0xc23cfea3), C32e(0x6a8be15f), C32e(0xaebe10f9), C32e(0x69026bd0),
1725
C32e(0x17bfa891), C32e(0x9971e858), C32e(0x3a536927), C32e(0x27f7d0b9),
1726
C32e(0xd9914838), C32e(0xebde3513), C32e(0x2be5ceb3), C32e(0x22775533),
1727
C32e(0xd204d6bb), C32e(0xa9399070), C32e(0x07878089), C32e(0x33c1f2a7),
1728
C32e(0x2decc1b6), C32e(0x3c5a6622), C32e(0x15b8ad92), C32e(0xc9a96020),
1729
C32e(0x875cdb49), C32e(0xaab01aff), C32e(0x50d88878), C32e(0xa52b8e7a),
1730
C32e(0x03898a8f), C32e(0x594a13f8), C32e(0x09929b80), C32e(0x1a233917),
1731
C32e(0x651075da), C32e(0xd7845331), C32e(0x84d551c6), C32e(0xd003d3b8),
1732
C32e(0x82dc5ec3), C32e(0x29e2cbb0), C32e(0x5ac39977), C32e(0x1e2d3311),
1733
C32e(0x7b3d46cb), C32e(0xa8b71ffc), C32e(0x6d0c61d6), C32e(0x2c624e3a)
1734
};
1735
1736
static const sph_u32 T0dn[] = {
1737
C32e(0xf497a5c6), C32e(0x97eb84f8), C32e(0xb0c799ee), C32e(0x8cf78df6),
1738
C32e(0x17e50dff), C32e(0xdcb7bdd6), C32e(0xc8a7b1de), C32e(0xfc395491),
1739
C32e(0xf0c05060), C32e(0x05040302), C32e(0xe087a9ce), C32e(0x87ac7d56),
1740
C32e(0x2bd519e7), C32e(0xa67162b5), C32e(0x319ae64d), C32e(0xb5c39aec),
1741
C32e(0xcf05458f), C32e(0xbc3e9d1f), C32e(0xc0094089), C32e(0x92ef87fa),
1742
C32e(0x3fc515ef), C32e(0x267febb2), C32e(0x4007c98e), C32e(0x1ded0bfb),
1743
C32e(0x2f82ec41), C32e(0xa97d67b3), C32e(0x1cbefd5f), C32e(0x258aea45),
1744
C32e(0xda46bf23), C32e(0x02a6f753), C32e(0xa1d396e4), C32e(0xed2d5b9b),
1745
C32e(0x5deac275), C32e(0x24d91ce1), C32e(0xe97aae3d), C32e(0xbe986a4c),
1746
C32e(0xeed85a6c), C32e(0xc3fc417e), C32e(0x06f102f5), C32e(0xd11d4f83),
1747
C32e(0xe4d05c68), C32e(0x07a2f451), C32e(0x5cb934d1), C32e(0x18e908f9),
1748
C32e(0xaedf93e2), C32e(0x954d73ab), C32e(0xf5c45362), C32e(0x41543f2a),
1749
C32e(0x14100c08), C32e(0xf6315295), C32e(0xaf8c6546), C32e(0xe2215e9d),
1750
C32e(0x78602830), C32e(0xf86ea137), C32e(0x11140f0a), C32e(0xc45eb52f),
1751
C32e(0x1b1c090e), C32e(0x5a483624), C32e(0xb6369b1b), C32e(0x47a53ddf),
1752
C32e(0x6a8126cd), C32e(0xbb9c694e), C32e(0x4cfecd7f), C32e(0xbacf9fea),
1753
C32e(0x2d241b12), C32e(0xb93a9e1d), C32e(0x9cb07458), C32e(0x72682e34),
1754
C32e(0x776c2d36), C32e(0xcda3b2dc), C32e(0x2973eeb4), C32e(0x16b6fb5b),
1755
C32e(0x0153f6a4), C32e(0xd7ec4d76), C32e(0xa37561b7), C32e(0x49face7d),
1756
C32e(0x8da47b52), C32e(0x42a13edd), C32e(0x93bc715e), C32e(0xa2269713),
1757
C32e(0x0457f5a6), C32e(0xb86968b9), C32e(0x00000000), C32e(0x74992cc1),
1758
C32e(0xa0806040), C32e(0x21dd1fe3), C32e(0x43f2c879), C32e(0x2c77edb6),
1759
C32e(0xd9b3bed4), C32e(0xca01468d), C32e(0x70ced967), C32e(0xdde44b72),
1760
C32e(0x7933de94), C32e(0x672bd498), C32e(0x237be8b0), C32e(0xde114a85),
1761
C32e(0xbd6d6bbb), C32e(0x7e912ac5), C32e(0x349ee54f), C32e(0x3ac116ed),
1762
C32e(0x5417c586), C32e(0x622fd79a), C32e(0xffcc5566), C32e(0xa7229411),
1763
C32e(0x4a0fcf8a), C32e(0x30c910e9), C32e(0x0a080604), C32e(0x98e781fe),
1764
C32e(0x0b5bf0a0), C32e(0xccf04478), C32e(0xd54aba25), C32e(0x3e96e34b),
1765
C32e(0x0e5ff3a2), C32e(0x19bafe5d), C32e(0x5b1bc080), C32e(0x850a8a05),
1766
C32e(0xec7ead3f), C32e(0xdf42bc21), C32e(0xd8e04870), C32e(0x0cf904f1),
1767
C32e(0x7ac6df63), C32e(0x58eec177), C32e(0x9f4575af), C32e(0xa5846342),
1768
C32e(0x50403020), C32e(0x2ed11ae5), C32e(0x12e10efd), C32e(0xb7656dbf),
1769
C32e(0xd4194c81), C32e(0x3c301418), C32e(0x5f4c3526), C32e(0x719d2fc3),
1770
C32e(0x3867e1be), C32e(0xfd6aa235), C32e(0x4f0bcc88), C32e(0x4b5c392e),
1771
C32e(0xf93d5793), C32e(0x0daaf255), C32e(0x9de382fc), C32e(0xc9f4477a),
1772
C32e(0xef8bacc8), C32e(0x326fe7ba), C32e(0x7d642b32), C32e(0xa4d795e6),
1773
C32e(0xfb9ba0c0), C32e(0xb3329819), C32e(0x6827d19e), C32e(0x815d7fa3),
1774
C32e(0xaa886644), C32e(0x82a87e54), C32e(0xe676ab3b), C32e(0x9e16830b),
1775
C32e(0x4503ca8c), C32e(0x7b9529c7), C32e(0x6ed6d36b), C32e(0x44503c28),
1776
C32e(0x8b5579a7), C32e(0x3d63e2bc), C32e(0x272c1d16), C32e(0x9a4176ad),
1777
C32e(0x4dad3bdb), C32e(0xfac85664), C32e(0xd2e84e74), C32e(0x22281e14),
1778
C32e(0x763fdb92), C32e(0x1e180a0c), C32e(0xb4906c48), C32e(0x376be4b8),
1779
C32e(0xe7255d9f), C32e(0xb2616ebd), C32e(0x2a86ef43), C32e(0xf193a6c4),
1780
C32e(0xe372a839), C32e(0xf762a431), C32e(0x59bd37d3), C32e(0x86ff8bf2),
1781
C32e(0x56b132d5), C32e(0xc50d438b), C32e(0xebdc596e), C32e(0xc2afb7da),
1782
C32e(0x8f028c01), C32e(0xac7964b1), C32e(0x6d23d29c), C32e(0x3b92e049),
1783
C32e(0xc7abb4d8), C32e(0x1543faac), C32e(0x09fd07f3), C32e(0x6f8525cf),
1784
C32e(0xea8fafca), C32e(0x89f38ef4), C32e(0x208ee947), C32e(0x28201810),
1785
C32e(0x64ded56f), C32e(0x83fb88f0), C32e(0xb1946f4a), C32e(0x96b8725c),
1786
C32e(0x6c702438), C32e(0x08aef157), C32e(0x52e6c773), C32e(0xf3355197),
1787
C32e(0x658d23cb), C32e(0x84597ca1), C32e(0xbfcb9ce8), C32e(0x637c213e),
1788
C32e(0x7c37dd96), C32e(0x7fc2dc61), C32e(0x911a860d), C32e(0x941e850f),
1789
C32e(0xabdb90e0), C32e(0xc6f8427c), C32e(0x57e2c471), C32e(0xe583aacc),
1790
C32e(0x733bd890), C32e(0x0f0c0506), C32e(0x03f501f7), C32e(0x3638121c),
1791
C32e(0xfe9fa3c2), C32e(0xe1d45f6a), C32e(0x1047f9ae), C32e(0x6bd2d069),
1792
C32e(0xa82e9117), C32e(0xe8295899), C32e(0x6974273a), C32e(0xd04eb927),
1793
C32e(0x48a938d9), C32e(0x35cd13eb), C32e(0xce56b32b), C32e(0x55443322),
1794
C32e(0xd6bfbbd2), C32e(0x904970a9), C32e(0x800e8907), C32e(0xf266a733),
1795
C32e(0xc15ab62d), C32e(0x6678223c), C32e(0xad2a9215), C32e(0x608920c9),
1796
C32e(0xdb154987), C32e(0x1a4fffaa), C32e(0x88a07850), C32e(0x8e517aa5),
1797
C32e(0x8a068f03), C32e(0x13b2f859), C32e(0x9b128009), C32e(0x3934171a),
1798
C32e(0x75cada65), C32e(0x53b531d7), C32e(0x5113c684), C32e(0xd3bbb8d0),
1799
C32e(0x5e1fc382), C32e(0xcb52b029), C32e(0x99b4775a), C32e(0x333c111e),
1800
C32e(0x46f6cb7b), C32e(0x1f4bfca8), C32e(0x61dad66d), C32e(0x4e583a2c)
1801
};
1802
1803
static const sph_u32 T1up[] = {
1804
C32e(0xc6c632f4), C32e(0xf8f86f97), C32e(0xeeee5eb0), C32e(0xf6f67a8c),
1805
C32e(0xffffe817), C32e(0xd6d60adc), C32e(0xdede16c8), C32e(0x91916dfc),
1806
C32e(0x606090f0), C32e(0x02020705), C32e(0xcece2ee0), C32e(0x5656d187),
1807
C32e(0xe7e7cc2b), C32e(0xb5b513a6), C32e(0x4d4d7c31), C32e(0xecec59b5),
1808
C32e(0x8f8f40cf), C32e(0x1f1fa3bc), C32e(0x898949c0), C32e(0xfafa6892),
1809
C32e(0xefefd03f), C32e(0xb2b29426), C32e(0x8e8ece40), C32e(0xfbfbe61d),
1810
C32e(0x41416e2f), C32e(0xb3b31aa9), C32e(0x5f5f431c), C32e(0x45456025),
1811
C32e(0x2323f9da), C32e(0x53535102), C32e(0xe4e445a1), C32e(0x9b9b76ed),
1812
C32e(0x7575285d), C32e(0xe1e1c524), C32e(0x3d3dd4e9), C32e(0x4c4cf2be),
1813
C32e(0x6c6c82ee), C32e(0x7e7ebdc3), C32e(0xf5f5f306), C32e(0x838352d1),
1814
C32e(0x68688ce4), C32e(0x51515607), C32e(0xd1d18d5c), C32e(0xf9f9e118),
1815
C32e(0xe2e24cae), C32e(0xabab3e95), C32e(0x626297f5), C32e(0x2a2a6b41),
1816
C32e(0x08081c14), C32e(0x959563f6), C32e(0x4646e9af), C32e(0x9d9d7fe2),
1817
C32e(0x30304878), C32e(0x3737cff8), C32e(0x0a0a1b11), C32e(0x2f2febc4),
1818
C32e(0x0e0e151b), C32e(0x24247e5a), C32e(0x1b1badb6), C32e(0xdfdf9847),
1819
C32e(0xcdcda76a), C32e(0x4e4ef5bb), C32e(0x7f7f334c), C32e(0xeaea50ba),
1820
C32e(0x12123f2d), C32e(0x1d1da4b9), C32e(0x5858c49c), C32e(0x34344672),
1821
C32e(0x36364177), C32e(0xdcdc11cd), C32e(0xb4b49d29), C32e(0x5b5b4d16),
1822
C32e(0xa4a4a501), C32e(0x7676a1d7), C32e(0xb7b714a3), C32e(0x7d7d3449),
1823
C32e(0x5252df8d), C32e(0xdddd9f42), C32e(0x5e5ecd93), C32e(0x1313b1a2),
1824
C32e(0xa6a6a204), C32e(0xb9b901b8), C32e(0x00000000), C32e(0xc1c1b574),
1825
C32e(0x4040e0a0), C32e(0xe3e3c221), C32e(0x79793a43), C32e(0xb6b69a2c),
1826
C32e(0xd4d40dd9), C32e(0x8d8d47ca), C32e(0x67671770), C32e(0x7272afdd),
1827
C32e(0x9494ed79), C32e(0x9898ff67), C32e(0xb0b09323), C32e(0x85855bde),
1828
C32e(0xbbbb06bd), C32e(0xc5c5bb7e), C32e(0x4f4f7b34), C32e(0xededd73a),
1829
C32e(0x8686d254), C32e(0x9a9af862), C32e(0x666699ff), C32e(0x1111b6a7),
1830
C32e(0x8a8ac04a), C32e(0xe9e9d930), C32e(0x04040e0a), C32e(0xfefe6698),
1831
C32e(0xa0a0ab0b), C32e(0x7878b4cc), C32e(0x2525f0d5), C32e(0x4b4b753e),
1832
C32e(0xa2a2ac0e), C32e(0x5d5d4419), C32e(0x8080db5b), C32e(0x05058085),
1833
C32e(0x3f3fd3ec), C32e(0x2121fedf), C32e(0x7070a8d8), C32e(0xf1f1fd0c),
1834
C32e(0x6363197a), C32e(0x77772f58), C32e(0xafaf309f), C32e(0x4242e7a5),
1835
C32e(0x20207050), C32e(0xe5e5cb2e), C32e(0xfdfdef12), C32e(0xbfbf08b7),
1836
C32e(0x818155d4), C32e(0x1818243c), C32e(0x2626795f), C32e(0xc3c3b271),
1837
C32e(0xbebe8638), C32e(0x3535c8fd), C32e(0x8888c74f), C32e(0x2e2e654b),
1838
C32e(0x93936af9), C32e(0x5555580d), C32e(0xfcfc619d), C32e(0x7a7ab3c9),
1839
C32e(0xc8c827ef), C32e(0xbaba8832), C32e(0x32324f7d), C32e(0xe6e642a4),
1840
C32e(0xc0c03bfb), C32e(0x1919aab3), C32e(0x9e9ef668), C32e(0xa3a32281),
1841
C32e(0x4444eeaa), C32e(0x5454d682), C32e(0x3b3bdde6), C32e(0x0b0b959e),
1842
C32e(0x8c8cc945), C32e(0xc7c7bc7b), C32e(0x6b6b056e), C32e(0x28286c44),
1843
C32e(0xa7a72c8b), C32e(0xbcbc813d), C32e(0x16163127), C32e(0xadad379a),
1844
C32e(0xdbdb964d), C32e(0x64649efa), C32e(0x7474a6d2), C32e(0x14143622),
1845
C32e(0x9292e476), C32e(0x0c0c121e), C32e(0x4848fcb4), C32e(0xb8b88f37),
1846
C32e(0x9f9f78e7), C32e(0xbdbd0fb2), C32e(0x4343692a), C32e(0xc4c435f1),
1847
C32e(0x3939dae3), C32e(0x3131c6f7), C32e(0xd3d38a59), C32e(0xf2f27486),
1848
C32e(0xd5d58356), C32e(0x8b8b4ec5), C32e(0x6e6e85eb), C32e(0xdada18c2),
1849
C32e(0x01018e8f), C32e(0xb1b11dac), C32e(0x9c9cf16d), C32e(0x4949723b),
1850
C32e(0xd8d81fc7), C32e(0xacacb915), C32e(0xf3f3fa09), C32e(0xcfcfa06f),
1851
C32e(0xcaca20ea), C32e(0xf4f47d89), C32e(0x47476720), C32e(0x10103828),
1852
C32e(0x6f6f0b64), C32e(0xf0f07383), C32e(0x4a4afbb1), C32e(0x5c5cca96),
1853
C32e(0x3838546c), C32e(0x57575f08), C32e(0x73732152), C32e(0x979764f3),
1854
C32e(0xcbcbae65), C32e(0xa1a12584), C32e(0xe8e857bf), C32e(0x3e3e5d63),
1855
C32e(0x9696ea7c), C32e(0x61611e7f), C32e(0x0d0d9c91), C32e(0x0f0f9b94),
1856
C32e(0xe0e04bab), C32e(0x7c7cbac6), C32e(0x71712657), C32e(0xcccc29e5),
1857
C32e(0x9090e373), C32e(0x0606090f), C32e(0xf7f7f403), C32e(0x1c1c2a36),
1858
C32e(0xc2c23cfe), C32e(0x6a6a8be1), C32e(0xaeaebe10), C32e(0x6969026b),
1859
C32e(0x1717bfa8), C32e(0x999971e8), C32e(0x3a3a5369), C32e(0x2727f7d0),
1860
C32e(0xd9d99148), C32e(0xebebde35), C32e(0x2b2be5ce), C32e(0x22227755),
1861
C32e(0xd2d204d6), C32e(0xa9a93990), C32e(0x07078780), C32e(0x3333c1f2),
1862
C32e(0x2d2decc1), C32e(0x3c3c5a66), C32e(0x1515b8ad), C32e(0xc9c9a960),
1863
C32e(0x87875cdb), C32e(0xaaaab01a), C32e(0x5050d888), C32e(0xa5a52b8e),
1864
C32e(0x0303898a), C32e(0x59594a13), C32e(0x0909929b), C32e(0x1a1a2339),
1865
C32e(0x65651075), C32e(0xd7d78453), C32e(0x8484d551), C32e(0xd0d003d3),
1866
C32e(0x8282dc5e), C32e(0x2929e2cb), C32e(0x5a5ac399), C32e(0x1e1e2d33),
1867
C32e(0x7b7b3d46), C32e(0xa8a8b71f), C32e(0x6d6d0c61), C32e(0x2c2c624e)
1868
};
1869
1870
static const sph_u32 T1dn[] = {
1871
C32e(0xa5f497a5), C32e(0x8497eb84), C32e(0x99b0c799), C32e(0x8d8cf78d),
1872
C32e(0x0d17e50d), C32e(0xbddcb7bd), C32e(0xb1c8a7b1), C32e(0x54fc3954),
1873
C32e(0x50f0c050), C32e(0x03050403), C32e(0xa9e087a9), C32e(0x7d87ac7d),
1874
C32e(0x192bd519), C32e(0x62a67162), C32e(0xe6319ae6), C32e(0x9ab5c39a),
1875
C32e(0x45cf0545), C32e(0x9dbc3e9d), C32e(0x40c00940), C32e(0x8792ef87),
1876
C32e(0x153fc515), C32e(0xeb267feb), C32e(0xc94007c9), C32e(0x0b1ded0b),
1877
C32e(0xec2f82ec), C32e(0x67a97d67), C32e(0xfd1cbefd), C32e(0xea258aea),
1878
C32e(0xbfda46bf), C32e(0xf702a6f7), C32e(0x96a1d396), C32e(0x5bed2d5b),
1879
C32e(0xc25deac2), C32e(0x1c24d91c), C32e(0xaee97aae), C32e(0x6abe986a),
1880
C32e(0x5aeed85a), C32e(0x41c3fc41), C32e(0x0206f102), C32e(0x4fd11d4f),
1881
C32e(0x5ce4d05c), C32e(0xf407a2f4), C32e(0x345cb934), C32e(0x0818e908),
1882
C32e(0x93aedf93), C32e(0x73954d73), C32e(0x53f5c453), C32e(0x3f41543f),
1883
C32e(0x0c14100c), C32e(0x52f63152), C32e(0x65af8c65), C32e(0x5ee2215e),
1884
C32e(0x28786028), C32e(0xa1f86ea1), C32e(0x0f11140f), C32e(0xb5c45eb5),
1885
C32e(0x091b1c09), C32e(0x365a4836), C32e(0x9bb6369b), C32e(0x3d47a53d),
1886
C32e(0x266a8126), C32e(0x69bb9c69), C32e(0xcd4cfecd), C32e(0x9fbacf9f),
1887
C32e(0x1b2d241b), C32e(0x9eb93a9e), C32e(0x749cb074), C32e(0x2e72682e),
1888
C32e(0x2d776c2d), C32e(0xb2cda3b2), C32e(0xee2973ee), C32e(0xfb16b6fb),
1889
C32e(0xf60153f6), C32e(0x4dd7ec4d), C32e(0x61a37561), C32e(0xce49face),
1890
C32e(0x7b8da47b), C32e(0x3e42a13e), C32e(0x7193bc71), C32e(0x97a22697),
1891
C32e(0xf50457f5), C32e(0x68b86968), C32e(0x00000000), C32e(0x2c74992c),
1892
C32e(0x60a08060), C32e(0x1f21dd1f), C32e(0xc843f2c8), C32e(0xed2c77ed),
1893
C32e(0xbed9b3be), C32e(0x46ca0146), C32e(0xd970ced9), C32e(0x4bdde44b),
1894
C32e(0xde7933de), C32e(0xd4672bd4), C32e(0xe8237be8), C32e(0x4ade114a),
1895
C32e(0x6bbd6d6b), C32e(0x2a7e912a), C32e(0xe5349ee5), C32e(0x163ac116),
1896
C32e(0xc55417c5), C32e(0xd7622fd7), C32e(0x55ffcc55), C32e(0x94a72294),
1897
C32e(0xcf4a0fcf), C32e(0x1030c910), C32e(0x060a0806), C32e(0x8198e781),
1898
C32e(0xf00b5bf0), C32e(0x44ccf044), C32e(0xbad54aba), C32e(0xe33e96e3),
1899
C32e(0xf30e5ff3), C32e(0xfe19bafe), C32e(0xc05b1bc0), C32e(0x8a850a8a),
1900
C32e(0xadec7ead), C32e(0xbcdf42bc), C32e(0x48d8e048), C32e(0x040cf904),
1901
C32e(0xdf7ac6df), C32e(0xc158eec1), C32e(0x759f4575), C32e(0x63a58463),
1902
C32e(0x30504030), C32e(0x1a2ed11a), C32e(0x0e12e10e), C32e(0x6db7656d),
1903
C32e(0x4cd4194c), C32e(0x143c3014), C32e(0x355f4c35), C32e(0x2f719d2f),
1904
C32e(0xe13867e1), C32e(0xa2fd6aa2), C32e(0xcc4f0bcc), C32e(0x394b5c39),
1905
C32e(0x57f93d57), C32e(0xf20daaf2), C32e(0x829de382), C32e(0x47c9f447),
1906
C32e(0xacef8bac), C32e(0xe7326fe7), C32e(0x2b7d642b), C32e(0x95a4d795),
1907
C32e(0xa0fb9ba0), C32e(0x98b33298), C32e(0xd16827d1), C32e(0x7f815d7f),
1908
C32e(0x66aa8866), C32e(0x7e82a87e), C32e(0xabe676ab), C32e(0x839e1683),
1909
C32e(0xca4503ca), C32e(0x297b9529), C32e(0xd36ed6d3), C32e(0x3c44503c),
1910
C32e(0x798b5579), C32e(0xe23d63e2), C32e(0x1d272c1d), C32e(0x769a4176),
1911
C32e(0x3b4dad3b), C32e(0x56fac856), C32e(0x4ed2e84e), C32e(0x1e22281e),
1912
C32e(0xdb763fdb), C32e(0x0a1e180a), C32e(0x6cb4906c), C32e(0xe4376be4),
1913
C32e(0x5de7255d), C32e(0x6eb2616e), C32e(0xef2a86ef), C32e(0xa6f193a6),
1914
C32e(0xa8e372a8), C32e(0xa4f762a4), C32e(0x3759bd37), C32e(0x8b86ff8b),
1915
C32e(0x3256b132), C32e(0x43c50d43), C32e(0x59ebdc59), C32e(0xb7c2afb7),
1916
C32e(0x8c8f028c), C32e(0x64ac7964), C32e(0xd26d23d2), C32e(0xe03b92e0),
1917
C32e(0xb4c7abb4), C32e(0xfa1543fa), C32e(0x0709fd07), C32e(0x256f8525),
1918
C32e(0xafea8faf), C32e(0x8e89f38e), C32e(0xe9208ee9), C32e(0x18282018),
1919
C32e(0xd564ded5), C32e(0x8883fb88), C32e(0x6fb1946f), C32e(0x7296b872),
1920
C32e(0x246c7024), C32e(0xf108aef1), C32e(0xc752e6c7), C32e(0x51f33551),
1921
C32e(0x23658d23), C32e(0x7c84597c), C32e(0x9cbfcb9c), C32e(0x21637c21),
1922
C32e(0xdd7c37dd), C32e(0xdc7fc2dc), C32e(0x86911a86), C32e(0x85941e85),
1923
C32e(0x90abdb90), C32e(0x42c6f842), C32e(0xc457e2c4), C32e(0xaae583aa),
1924
C32e(0xd8733bd8), C32e(0x050f0c05), C32e(0x0103f501), C32e(0x12363812),
1925
C32e(0xa3fe9fa3), C32e(0x5fe1d45f), C32e(0xf91047f9), C32e(0xd06bd2d0),
1926
C32e(0x91a82e91), C32e(0x58e82958), C32e(0x27697427), C32e(0xb9d04eb9),
1927
C32e(0x3848a938), C32e(0x1335cd13), C32e(0xb3ce56b3), C32e(0x33554433),
1928
C32e(0xbbd6bfbb), C32e(0x70904970), C32e(0x89800e89), C32e(0xa7f266a7),
1929
C32e(0xb6c15ab6), C32e(0x22667822), C32e(0x92ad2a92), C32e(0x20608920),
1930
C32e(0x49db1549), C32e(0xff1a4fff), C32e(0x7888a078), C32e(0x7a8e517a),
1931
C32e(0x8f8a068f), C32e(0xf813b2f8), C32e(0x809b1280), C32e(0x17393417),
1932
C32e(0xda75cada), C32e(0x3153b531), C32e(0xc65113c6), C32e(0xb8d3bbb8),
1933
C32e(0xc35e1fc3), C32e(0xb0cb52b0), C32e(0x7799b477), C32e(0x11333c11),
1934
C32e(0xcb46f6cb), C32e(0xfc1f4bfc), C32e(0xd661dad6), C32e(0x3a4e583a)
1935
};
1936
1937
static const sph_u32 T2up[] = {
1938
C32e(0xa5c6c632), C32e(0x84f8f86f), C32e(0x99eeee5e), C32e(0x8df6f67a),
1939
C32e(0x0dffffe8), C32e(0xbdd6d60a), C32e(0xb1dede16), C32e(0x5491916d),
1940
C32e(0x50606090), C32e(0x03020207), C32e(0xa9cece2e), C32e(0x7d5656d1),
1941
C32e(0x19e7e7cc), C32e(0x62b5b513), C32e(0xe64d4d7c), C32e(0x9aecec59),
1942
C32e(0x458f8f40), C32e(0x9d1f1fa3), C32e(0x40898949), C32e(0x87fafa68),
1943
C32e(0x15efefd0), C32e(0xebb2b294), C32e(0xc98e8ece), C32e(0x0bfbfbe6),
1944
C32e(0xec41416e), C32e(0x67b3b31a), C32e(0xfd5f5f43), C32e(0xea454560),
1945
C32e(0xbf2323f9), C32e(0xf7535351), C32e(0x96e4e445), C32e(0x5b9b9b76),
1946
C32e(0xc2757528), C32e(0x1ce1e1c5), C32e(0xae3d3dd4), C32e(0x6a4c4cf2),
1947
C32e(0x5a6c6c82), C32e(0x417e7ebd), C32e(0x02f5f5f3), C32e(0x4f838352),
1948
C32e(0x5c68688c), C32e(0xf4515156), C32e(0x34d1d18d), C32e(0x08f9f9e1),
1949
C32e(0x93e2e24c), C32e(0x73abab3e), C32e(0x53626297), C32e(0x3f2a2a6b),
1950
C32e(0x0c08081c), C32e(0x52959563), C32e(0x654646e9), C32e(0x5e9d9d7f),
1951
C32e(0x28303048), C32e(0xa13737cf), C32e(0x0f0a0a1b), C32e(0xb52f2feb),
1952
C32e(0x090e0e15), C32e(0x3624247e), C32e(0x9b1b1bad), C32e(0x3ddfdf98),
1953
C32e(0x26cdcda7), C32e(0x694e4ef5), C32e(0xcd7f7f33), C32e(0x9feaea50),
1954
C32e(0x1b12123f), C32e(0x9e1d1da4), C32e(0x745858c4), C32e(0x2e343446),
1955
C32e(0x2d363641), C32e(0xb2dcdc11), C32e(0xeeb4b49d), C32e(0xfb5b5b4d),
1956
C32e(0xf6a4a4a5), C32e(0x4d7676a1), C32e(0x61b7b714), C32e(0xce7d7d34),
1957
C32e(0x7b5252df), C32e(0x3edddd9f), C32e(0x715e5ecd), C32e(0x971313b1),
1958
C32e(0xf5a6a6a2), C32e(0x68b9b901), C32e(0x00000000), C32e(0x2cc1c1b5),
1959
C32e(0x604040e0), C32e(0x1fe3e3c2), C32e(0xc879793a), C32e(0xedb6b69a),
1960
C32e(0xbed4d40d), C32e(0x468d8d47), C32e(0xd9676717), C32e(0x4b7272af),
1961
C32e(0xde9494ed), C32e(0xd49898ff), C32e(0xe8b0b093), C32e(0x4a85855b),
1962
C32e(0x6bbbbb06), C32e(0x2ac5c5bb), C32e(0xe54f4f7b), C32e(0x16ededd7),
1963
C32e(0xc58686d2), C32e(0xd79a9af8), C32e(0x55666699), C32e(0x941111b6),
1964
C32e(0xcf8a8ac0), C32e(0x10e9e9d9), C32e(0x0604040e), C32e(0x81fefe66),
1965
C32e(0xf0a0a0ab), C32e(0x447878b4), C32e(0xba2525f0), C32e(0xe34b4b75),
1966
C32e(0xf3a2a2ac), C32e(0xfe5d5d44), C32e(0xc08080db), C32e(0x8a050580),
1967
C32e(0xad3f3fd3), C32e(0xbc2121fe), C32e(0x487070a8), C32e(0x04f1f1fd),
1968
C32e(0xdf636319), C32e(0xc177772f), C32e(0x75afaf30), C32e(0x634242e7),
1969
C32e(0x30202070), C32e(0x1ae5e5cb), C32e(0x0efdfdef), C32e(0x6dbfbf08),
1970
C32e(0x4c818155), C32e(0x14181824), C32e(0x35262679), C32e(0x2fc3c3b2),
1971
C32e(0xe1bebe86), C32e(0xa23535c8), C32e(0xcc8888c7), C32e(0x392e2e65),
1972
C32e(0x5793936a), C32e(0xf2555558), C32e(0x82fcfc61), C32e(0x477a7ab3),
1973
C32e(0xacc8c827), C32e(0xe7baba88), C32e(0x2b32324f), C32e(0x95e6e642),
1974
C32e(0xa0c0c03b), C32e(0x981919aa), C32e(0xd19e9ef6), C32e(0x7fa3a322),
1975
C32e(0x664444ee), C32e(0x7e5454d6), C32e(0xab3b3bdd), C32e(0x830b0b95),
1976
C32e(0xca8c8cc9), C32e(0x29c7c7bc), C32e(0xd36b6b05), C32e(0x3c28286c),
1977
C32e(0x79a7a72c), C32e(0xe2bcbc81), C32e(0x1d161631), C32e(0x76adad37),
1978
C32e(0x3bdbdb96), C32e(0x5664649e), C32e(0x4e7474a6), C32e(0x1e141436),
1979
C32e(0xdb9292e4), C32e(0x0a0c0c12), C32e(0x6c4848fc), C32e(0xe4b8b88f),
1980
C32e(0x5d9f9f78), C32e(0x6ebdbd0f), C32e(0xef434369), C32e(0xa6c4c435),
1981
C32e(0xa83939da), C32e(0xa43131c6), C32e(0x37d3d38a), C32e(0x8bf2f274),
1982
C32e(0x32d5d583), C32e(0x438b8b4e), C32e(0x596e6e85), C32e(0xb7dada18),
1983
C32e(0x8c01018e), C32e(0x64b1b11d), C32e(0xd29c9cf1), C32e(0xe0494972),
1984
C32e(0xb4d8d81f), C32e(0xfaacacb9), C32e(0x07f3f3fa), C32e(0x25cfcfa0),
1985
C32e(0xafcaca20), C32e(0x8ef4f47d), C32e(0xe9474767), C32e(0x18101038),
1986
C32e(0xd56f6f0b), C32e(0x88f0f073), C32e(0x6f4a4afb), C32e(0x725c5cca),
1987
C32e(0x24383854), C32e(0xf157575f), C32e(0xc7737321), C32e(0x51979764),
1988
C32e(0x23cbcbae), C32e(0x7ca1a125), C32e(0x9ce8e857), C32e(0x213e3e5d),
1989
C32e(0xdd9696ea), C32e(0xdc61611e), C32e(0x860d0d9c), C32e(0x850f0f9b),
1990
C32e(0x90e0e04b), C32e(0x427c7cba), C32e(0xc4717126), C32e(0xaacccc29),
1991
C32e(0xd89090e3), C32e(0x05060609), C32e(0x01f7f7f4), C32e(0x121c1c2a),
1992
C32e(0xa3c2c23c), C32e(0x5f6a6a8b), C32e(0xf9aeaebe), C32e(0xd0696902),
1993
C32e(0x911717bf), C32e(0x58999971), C32e(0x273a3a53), C32e(0xb92727f7),
1994
C32e(0x38d9d991), C32e(0x13ebebde), C32e(0xb32b2be5), C32e(0x33222277),
1995
C32e(0xbbd2d204), C32e(0x70a9a939), C32e(0x89070787), C32e(0xa73333c1),
1996
C32e(0xb62d2dec), C32e(0x223c3c5a), C32e(0x921515b8), C32e(0x20c9c9a9),
1997
C32e(0x4987875c), C32e(0xffaaaab0), C32e(0x785050d8), C32e(0x7aa5a52b),
1998
C32e(0x8f030389), C32e(0xf859594a), C32e(0x80090992), C32e(0x171a1a23),
1999
C32e(0xda656510), C32e(0x31d7d784), C32e(0xc68484d5), C32e(0xb8d0d003),
2000
C32e(0xc38282dc), C32e(0xb02929e2), C32e(0x775a5ac3), C32e(0x111e1e2d),
2001
C32e(0xcb7b7b3d), C32e(0xfca8a8b7), C32e(0xd66d6d0c), C32e(0x3a2c2c62)
2002
};
2003
2004
static const sph_u32 T2dn[] = {
2005
C32e(0xf4a5f497), C32e(0x978497eb), C32e(0xb099b0c7), C32e(0x8c8d8cf7),
2006
C32e(0x170d17e5), C32e(0xdcbddcb7), C32e(0xc8b1c8a7), C32e(0xfc54fc39),
2007
C32e(0xf050f0c0), C32e(0x05030504), C32e(0xe0a9e087), C32e(0x877d87ac),
2008
C32e(0x2b192bd5), C32e(0xa662a671), C32e(0x31e6319a), C32e(0xb59ab5c3),
2009
C32e(0xcf45cf05), C32e(0xbc9dbc3e), C32e(0xc040c009), C32e(0x928792ef),
2010
C32e(0x3f153fc5), C32e(0x26eb267f), C32e(0x40c94007), C32e(0x1d0b1ded),
2011
C32e(0x2fec2f82), C32e(0xa967a97d), C32e(0x1cfd1cbe), C32e(0x25ea258a),
2012
C32e(0xdabfda46), C32e(0x02f702a6), C32e(0xa196a1d3), C32e(0xed5bed2d),
2013
C32e(0x5dc25dea), C32e(0x241c24d9), C32e(0xe9aee97a), C32e(0xbe6abe98),
2014
C32e(0xee5aeed8), C32e(0xc341c3fc), C32e(0x060206f1), C32e(0xd14fd11d),
2015
C32e(0xe45ce4d0), C32e(0x07f407a2), C32e(0x5c345cb9), C32e(0x180818e9),
2016
C32e(0xae93aedf), C32e(0x9573954d), C32e(0xf553f5c4), C32e(0x413f4154),
2017
C32e(0x140c1410), C32e(0xf652f631), C32e(0xaf65af8c), C32e(0xe25ee221),
2018
C32e(0x78287860), C32e(0xf8a1f86e), C32e(0x110f1114), C32e(0xc4b5c45e),
2019
C32e(0x1b091b1c), C32e(0x5a365a48), C32e(0xb69bb636), C32e(0x473d47a5),
2020
C32e(0x6a266a81), C32e(0xbb69bb9c), C32e(0x4ccd4cfe), C32e(0xba9fbacf),
2021
C32e(0x2d1b2d24), C32e(0xb99eb93a), C32e(0x9c749cb0), C32e(0x722e7268),
2022
C32e(0x772d776c), C32e(0xcdb2cda3), C32e(0x29ee2973), C32e(0x16fb16b6),
2023
C32e(0x01f60153), C32e(0xd74dd7ec), C32e(0xa361a375), C32e(0x49ce49fa),
2024
C32e(0x8d7b8da4), C32e(0x423e42a1), C32e(0x937193bc), C32e(0xa297a226),
2025
C32e(0x04f50457), C32e(0xb868b869), C32e(0x00000000), C32e(0x742c7499),
2026
C32e(0xa060a080), C32e(0x211f21dd), C32e(0x43c843f2), C32e(0x2ced2c77),
2027
C32e(0xd9bed9b3), C32e(0xca46ca01), C32e(0x70d970ce), C32e(0xdd4bdde4),
2028
C32e(0x79de7933), C32e(0x67d4672b), C32e(0x23e8237b), C32e(0xde4ade11),
2029
C32e(0xbd6bbd6d), C32e(0x7e2a7e91), C32e(0x34e5349e), C32e(0x3a163ac1),
2030
C32e(0x54c55417), C32e(0x62d7622f), C32e(0xff55ffcc), C32e(0xa794a722),
2031
C32e(0x4acf4a0f), C32e(0x301030c9), C32e(0x0a060a08), C32e(0x988198e7),
2032
C32e(0x0bf00b5b), C32e(0xcc44ccf0), C32e(0xd5bad54a), C32e(0x3ee33e96),
2033
C32e(0x0ef30e5f), C32e(0x19fe19ba), C32e(0x5bc05b1b), C32e(0x858a850a),
2034
C32e(0xecadec7e), C32e(0xdfbcdf42), C32e(0xd848d8e0), C32e(0x0c040cf9),
2035
C32e(0x7adf7ac6), C32e(0x58c158ee), C32e(0x9f759f45), C32e(0xa563a584),
2036
C32e(0x50305040), C32e(0x2e1a2ed1), C32e(0x120e12e1), C32e(0xb76db765),
2037
C32e(0xd44cd419), C32e(0x3c143c30), C32e(0x5f355f4c), C32e(0x712f719d),
2038
C32e(0x38e13867), C32e(0xfda2fd6a), C32e(0x4fcc4f0b), C32e(0x4b394b5c),
2039
C32e(0xf957f93d), C32e(0x0df20daa), C32e(0x9d829de3), C32e(0xc947c9f4),
2040
C32e(0xefacef8b), C32e(0x32e7326f), C32e(0x7d2b7d64), C32e(0xa495a4d7),
2041
C32e(0xfba0fb9b), C32e(0xb398b332), C32e(0x68d16827), C32e(0x817f815d),
2042
C32e(0xaa66aa88), C32e(0x827e82a8), C32e(0xe6abe676), C32e(0x9e839e16),
2043
C32e(0x45ca4503), C32e(0x7b297b95), C32e(0x6ed36ed6), C32e(0x443c4450),
2044
C32e(0x8b798b55), C32e(0x3de23d63), C32e(0x271d272c), C32e(0x9a769a41),
2045
C32e(0x4d3b4dad), C32e(0xfa56fac8), C32e(0xd24ed2e8), C32e(0x221e2228),
2046
C32e(0x76db763f), C32e(0x1e0a1e18), C32e(0xb46cb490), C32e(0x37e4376b),
2047
C32e(0xe75de725), C32e(0xb26eb261), C32e(0x2aef2a86), C32e(0xf1a6f193),
2048
C32e(0xe3a8e372), C32e(0xf7a4f762), C32e(0x593759bd), C32e(0x868b86ff),
2049
C32e(0x563256b1), C32e(0xc543c50d), C32e(0xeb59ebdc), C32e(0xc2b7c2af),
2050
C32e(0x8f8c8f02), C32e(0xac64ac79), C32e(0x6dd26d23), C32e(0x3be03b92),
2051
C32e(0xc7b4c7ab), C32e(0x15fa1543), C32e(0x090709fd), C32e(0x6f256f85),
2052
C32e(0xeaafea8f), C32e(0x898e89f3), C32e(0x20e9208e), C32e(0x28182820),
2053
C32e(0x64d564de), C32e(0x838883fb), C32e(0xb16fb194), C32e(0x967296b8),
2054
C32e(0x6c246c70), C32e(0x08f108ae), C32e(0x52c752e6), C32e(0xf351f335),
2055
C32e(0x6523658d), C32e(0x847c8459), C32e(0xbf9cbfcb), C32e(0x6321637c),
2056
C32e(0x7cdd7c37), C32e(0x7fdc7fc2), C32e(0x9186911a), C32e(0x9485941e),
2057
C32e(0xab90abdb), C32e(0xc642c6f8), C32e(0x57c457e2), C32e(0xe5aae583),
2058
C32e(0x73d8733b), C32e(0x0f050f0c), C32e(0x030103f5), C32e(0x36123638),
2059
C32e(0xfea3fe9f), C32e(0xe15fe1d4), C32e(0x10f91047), C32e(0x6bd06bd2),
2060
C32e(0xa891a82e), C32e(0xe858e829), C32e(0x69276974), C32e(0xd0b9d04e),
2061
C32e(0x483848a9), C32e(0x351335cd), C32e(0xceb3ce56), C32e(0x55335544),
2062
C32e(0xd6bbd6bf), C32e(0x90709049), C32e(0x8089800e), C32e(0xf2a7f266),
2063
C32e(0xc1b6c15a), C32e(0x66226678), C32e(0xad92ad2a), C32e(0x60206089),
2064
C32e(0xdb49db15), C32e(0x1aff1a4f), C32e(0x887888a0), C32e(0x8e7a8e51),
2065
C32e(0x8a8f8a06), C32e(0x13f813b2), C32e(0x9b809b12), C32e(0x39173934),
2066
C32e(0x75da75ca), C32e(0x533153b5), C32e(0x51c65113), C32e(0xd3b8d3bb),
2067
C32e(0x5ec35e1f), C32e(0xcbb0cb52), C32e(0x997799b4), C32e(0x3311333c),
2068
C32e(0x46cb46f6), C32e(0x1ffc1f4b), C32e(0x61d661da), C32e(0x4e3a4e58)
2069
};
2070
2071
static const sph_u32 T3up[] = {
2072
C32e(0x97a5c6c6), C32e(0xeb84f8f8), C32e(0xc799eeee), C32e(0xf78df6f6),
2073
C32e(0xe50dffff), C32e(0xb7bdd6d6), C32e(0xa7b1dede), C32e(0x39549191),
2074
C32e(0xc0506060), C32e(0x04030202), C32e(0x87a9cece), C32e(0xac7d5656),
2075
C32e(0xd519e7e7), C32e(0x7162b5b5), C32e(0x9ae64d4d), C32e(0xc39aecec),
2076
C32e(0x05458f8f), C32e(0x3e9d1f1f), C32e(0x09408989), C32e(0xef87fafa),
2077
C32e(0xc515efef), C32e(0x7febb2b2), C32e(0x07c98e8e), C32e(0xed0bfbfb),
2078
C32e(0x82ec4141), C32e(0x7d67b3b3), C32e(0xbefd5f5f), C32e(0x8aea4545),
2079
C32e(0x46bf2323), C32e(0xa6f75353), C32e(0xd396e4e4), C32e(0x2d5b9b9b),
2080
C32e(0xeac27575), C32e(0xd91ce1e1), C32e(0x7aae3d3d), C32e(0x986a4c4c),
2081
C32e(0xd85a6c6c), C32e(0xfc417e7e), C32e(0xf102f5f5), C32e(0x1d4f8383),
2082
C32e(0xd05c6868), C32e(0xa2f45151), C32e(0xb934d1d1), C32e(0xe908f9f9),
2083
C32e(0xdf93e2e2), C32e(0x4d73abab), C32e(0xc4536262), C32e(0x543f2a2a),
2084
C32e(0x100c0808), C32e(0x31529595), C32e(0x8c654646), C32e(0x215e9d9d),
2085
C32e(0x60283030), C32e(0x6ea13737), C32e(0x140f0a0a), C32e(0x5eb52f2f),
2086
C32e(0x1c090e0e), C32e(0x48362424), C32e(0x369b1b1b), C32e(0xa53ddfdf),
2087
C32e(0x8126cdcd), C32e(0x9c694e4e), C32e(0xfecd7f7f), C32e(0xcf9feaea),
2088
C32e(0x241b1212), C32e(0x3a9e1d1d), C32e(0xb0745858), C32e(0x682e3434),
2089
C32e(0x6c2d3636), C32e(0xa3b2dcdc), C32e(0x73eeb4b4), C32e(0xb6fb5b5b),
2090
C32e(0x53f6a4a4), C32e(0xec4d7676), C32e(0x7561b7b7), C32e(0xface7d7d),
2091
C32e(0xa47b5252), C32e(0xa13edddd), C32e(0xbc715e5e), C32e(0x26971313),
2092
C32e(0x57f5a6a6), C32e(0x6968b9b9), C32e(0x00000000), C32e(0x992cc1c1),
2093
C32e(0x80604040), C32e(0xdd1fe3e3), C32e(0xf2c87979), C32e(0x77edb6b6),
2094
C32e(0xb3bed4d4), C32e(0x01468d8d), C32e(0xced96767), C32e(0xe44b7272),
2095
C32e(0x33de9494), C32e(0x2bd49898), C32e(0x7be8b0b0), C32e(0x114a8585),
2096
C32e(0x6d6bbbbb), C32e(0x912ac5c5), C32e(0x9ee54f4f), C32e(0xc116eded),
2097
C32e(0x17c58686), C32e(0x2fd79a9a), C32e(0xcc556666), C32e(0x22941111),
2098
C32e(0x0fcf8a8a), C32e(0xc910e9e9), C32e(0x08060404), C32e(0xe781fefe),
2099
C32e(0x5bf0a0a0), C32e(0xf0447878), C32e(0x4aba2525), C32e(0x96e34b4b),
2100
C32e(0x5ff3a2a2), C32e(0xbafe5d5d), C32e(0x1bc08080), C32e(0x0a8a0505),
2101
C32e(0x7ead3f3f), C32e(0x42bc2121), C32e(0xe0487070), C32e(0xf904f1f1),
2102
C32e(0xc6df6363), C32e(0xeec17777), C32e(0x4575afaf), C32e(0x84634242),
2103
C32e(0x40302020), C32e(0xd11ae5e5), C32e(0xe10efdfd), C32e(0x656dbfbf),
2104
C32e(0x194c8181), C32e(0x30141818), C32e(0x4c352626), C32e(0x9d2fc3c3),
2105
C32e(0x67e1bebe), C32e(0x6aa23535), C32e(0x0bcc8888), C32e(0x5c392e2e),
2106
C32e(0x3d579393), C32e(0xaaf25555), C32e(0xe382fcfc), C32e(0xf4477a7a),
2107
C32e(0x8bacc8c8), C32e(0x6fe7baba), C32e(0x642b3232), C32e(0xd795e6e6),
2108
C32e(0x9ba0c0c0), C32e(0x32981919), C32e(0x27d19e9e), C32e(0x5d7fa3a3),
2109
C32e(0x88664444), C32e(0xa87e5454), C32e(0x76ab3b3b), C32e(0x16830b0b),
2110
C32e(0x03ca8c8c), C32e(0x9529c7c7), C32e(0xd6d36b6b), C32e(0x503c2828),
2111
C32e(0x5579a7a7), C32e(0x63e2bcbc), C32e(0x2c1d1616), C32e(0x4176adad),
2112
C32e(0xad3bdbdb), C32e(0xc8566464), C32e(0xe84e7474), C32e(0x281e1414),
2113
C32e(0x3fdb9292), C32e(0x180a0c0c), C32e(0x906c4848), C32e(0x6be4b8b8),
2114
C32e(0x255d9f9f), C32e(0x616ebdbd), C32e(0x86ef4343), C32e(0x93a6c4c4),
2115
C32e(0x72a83939), C32e(0x62a43131), C32e(0xbd37d3d3), C32e(0xff8bf2f2),
2116
C32e(0xb132d5d5), C32e(0x0d438b8b), C32e(0xdc596e6e), C32e(0xafb7dada),
2117
C32e(0x028c0101), C32e(0x7964b1b1), C32e(0x23d29c9c), C32e(0x92e04949),
2118
C32e(0xabb4d8d8), C32e(0x43faacac), C32e(0xfd07f3f3), C32e(0x8525cfcf),
2119
C32e(0x8fafcaca), C32e(0xf38ef4f4), C32e(0x8ee94747), C32e(0x20181010),
2120
C32e(0xded56f6f), C32e(0xfb88f0f0), C32e(0x946f4a4a), C32e(0xb8725c5c),
2121
C32e(0x70243838), C32e(0xaef15757), C32e(0xe6c77373), C32e(0x35519797),
2122
C32e(0x8d23cbcb), C32e(0x597ca1a1), C32e(0xcb9ce8e8), C32e(0x7c213e3e),
2123
C32e(0x37dd9696), C32e(0xc2dc6161), C32e(0x1a860d0d), C32e(0x1e850f0f),
2124
C32e(0xdb90e0e0), C32e(0xf8427c7c), C32e(0xe2c47171), C32e(0x83aacccc),
2125
C32e(0x3bd89090), C32e(0x0c050606), C32e(0xf501f7f7), C32e(0x38121c1c),
2126
C32e(0x9fa3c2c2), C32e(0xd45f6a6a), C32e(0x47f9aeae), C32e(0xd2d06969),
2127
C32e(0x2e911717), C32e(0x29589999), C32e(0x74273a3a), C32e(0x4eb92727),
2128
C32e(0xa938d9d9), C32e(0xcd13ebeb), C32e(0x56b32b2b), C32e(0x44332222),
2129
C32e(0xbfbbd2d2), C32e(0x4970a9a9), C32e(0x0e890707), C32e(0x66a73333),
2130
C32e(0x5ab62d2d), C32e(0x78223c3c), C32e(0x2a921515), C32e(0x8920c9c9),
2131
C32e(0x15498787), C32e(0x4fffaaaa), C32e(0xa0785050), C32e(0x517aa5a5),
2132
C32e(0x068f0303), C32e(0xb2f85959), C32e(0x12800909), C32e(0x34171a1a),
2133
C32e(0xcada6565), C32e(0xb531d7d7), C32e(0x13c68484), C32e(0xbbb8d0d0),
2134
C32e(0x1fc38282), C32e(0x52b02929), C32e(0xb4775a5a), C32e(0x3c111e1e),
2135
C32e(0xf6cb7b7b), C32e(0x4bfca8a8), C32e(0xdad66d6d), C32e(0x583a2c2c)
2136
};
2137
2138
static const sph_u32 T3dn[] = {
2139
C32e(0x32f4a5f4), C32e(0x6f978497), C32e(0x5eb099b0), C32e(0x7a8c8d8c),
2140
C32e(0xe8170d17), C32e(0x0adcbddc), C32e(0x16c8b1c8), C32e(0x6dfc54fc),
2141
C32e(0x90f050f0), C32e(0x07050305), C32e(0x2ee0a9e0), C32e(0xd1877d87),
2142
C32e(0xcc2b192b), C32e(0x13a662a6), C32e(0x7c31e631), C32e(0x59b59ab5),
2143
C32e(0x40cf45cf), C32e(0xa3bc9dbc), C32e(0x49c040c0), C32e(0x68928792),
2144
C32e(0xd03f153f), C32e(0x9426eb26), C32e(0xce40c940), C32e(0xe61d0b1d),
2145
C32e(0x6e2fec2f), C32e(0x1aa967a9), C32e(0x431cfd1c), C32e(0x6025ea25),
2146
C32e(0xf9dabfda), C32e(0x5102f702), C32e(0x45a196a1), C32e(0x76ed5bed),
2147
C32e(0x285dc25d), C32e(0xc5241c24), C32e(0xd4e9aee9), C32e(0xf2be6abe),
2148
C32e(0x82ee5aee), C32e(0xbdc341c3), C32e(0xf3060206), C32e(0x52d14fd1),
2149
C32e(0x8ce45ce4), C32e(0x5607f407), C32e(0x8d5c345c), C32e(0xe1180818),
2150
C32e(0x4cae93ae), C32e(0x3e957395), C32e(0x97f553f5), C32e(0x6b413f41),
2151
C32e(0x1c140c14), C32e(0x63f652f6), C32e(0xe9af65af), C32e(0x7fe25ee2),
2152
C32e(0x48782878), C32e(0xcff8a1f8), C32e(0x1b110f11), C32e(0xebc4b5c4),
2153
C32e(0x151b091b), C32e(0x7e5a365a), C32e(0xadb69bb6), C32e(0x98473d47),
2154
C32e(0xa76a266a), C32e(0xf5bb69bb), C32e(0x334ccd4c), C32e(0x50ba9fba),
2155
C32e(0x3f2d1b2d), C32e(0xa4b99eb9), C32e(0xc49c749c), C32e(0x46722e72),
2156
C32e(0x41772d77), C32e(0x11cdb2cd), C32e(0x9d29ee29), C32e(0x4d16fb16),
2157
C32e(0xa501f601), C32e(0xa1d74dd7), C32e(0x14a361a3), C32e(0x3449ce49),
2158
C32e(0xdf8d7b8d), C32e(0x9f423e42), C32e(0xcd937193), C32e(0xb1a297a2),
2159
C32e(0xa204f504), C32e(0x01b868b8), C32e(0x00000000), C32e(0xb5742c74),
2160
C32e(0xe0a060a0), C32e(0xc2211f21), C32e(0x3a43c843), C32e(0x9a2ced2c),
2161
C32e(0x0dd9bed9), C32e(0x47ca46ca), C32e(0x1770d970), C32e(0xafdd4bdd),
2162
C32e(0xed79de79), C32e(0xff67d467), C32e(0x9323e823), C32e(0x5bde4ade),
2163
C32e(0x06bd6bbd), C32e(0xbb7e2a7e), C32e(0x7b34e534), C32e(0xd73a163a),
2164
C32e(0xd254c554), C32e(0xf862d762), C32e(0x99ff55ff), C32e(0xb6a794a7),
2165
C32e(0xc04acf4a), C32e(0xd9301030), C32e(0x0e0a060a), C32e(0x66988198),
2166
C32e(0xab0bf00b), C32e(0xb4cc44cc), C32e(0xf0d5bad5), C32e(0x753ee33e),
2167
C32e(0xac0ef30e), C32e(0x4419fe19), C32e(0xdb5bc05b), C32e(0x80858a85),
2168
C32e(0xd3ecadec), C32e(0xfedfbcdf), C32e(0xa8d848d8), C32e(0xfd0c040c),
2169
C32e(0x197adf7a), C32e(0x2f58c158), C32e(0x309f759f), C32e(0xe7a563a5),
2170
C32e(0x70503050), C32e(0xcb2e1a2e), C32e(0xef120e12), C32e(0x08b76db7),
2171
C32e(0x55d44cd4), C32e(0x243c143c), C32e(0x795f355f), C32e(0xb2712f71),
2172
C32e(0x8638e138), C32e(0xc8fda2fd), C32e(0xc74fcc4f), C32e(0x654b394b),
2173
C32e(0x6af957f9), C32e(0x580df20d), C32e(0x619d829d), C32e(0xb3c947c9),
2174
C32e(0x27efacef), C32e(0x8832e732), C32e(0x4f7d2b7d), C32e(0x42a495a4),
2175
C32e(0x3bfba0fb), C32e(0xaab398b3), C32e(0xf668d168), C32e(0x22817f81),
2176
C32e(0xeeaa66aa), C32e(0xd6827e82), C32e(0xdde6abe6), C32e(0x959e839e),
2177
C32e(0xc945ca45), C32e(0xbc7b297b), C32e(0x056ed36e), C32e(0x6c443c44),
2178
C32e(0x2c8b798b), C32e(0x813de23d), C32e(0x31271d27), C32e(0x379a769a),
2179
C32e(0x964d3b4d), C32e(0x9efa56fa), C32e(0xa6d24ed2), C32e(0x36221e22),
2180
C32e(0xe476db76), C32e(0x121e0a1e), C32e(0xfcb46cb4), C32e(0x8f37e437),
2181
C32e(0x78e75de7), C32e(0x0fb26eb2), C32e(0x692aef2a), C32e(0x35f1a6f1),
2182
C32e(0xdae3a8e3), C32e(0xc6f7a4f7), C32e(0x8a593759), C32e(0x74868b86),
2183
C32e(0x83563256), C32e(0x4ec543c5), C32e(0x85eb59eb), C32e(0x18c2b7c2),
2184
C32e(0x8e8f8c8f), C32e(0x1dac64ac), C32e(0xf16dd26d), C32e(0x723be03b),
2185
C32e(0x1fc7b4c7), C32e(0xb915fa15), C32e(0xfa090709), C32e(0xa06f256f),
2186
C32e(0x20eaafea), C32e(0x7d898e89), C32e(0x6720e920), C32e(0x38281828),
2187
C32e(0x0b64d564), C32e(0x73838883), C32e(0xfbb16fb1), C32e(0xca967296),
2188
C32e(0x546c246c), C32e(0x5f08f108), C32e(0x2152c752), C32e(0x64f351f3),
2189
C32e(0xae652365), C32e(0x25847c84), C32e(0x57bf9cbf), C32e(0x5d632163),
2190
C32e(0xea7cdd7c), C32e(0x1e7fdc7f), C32e(0x9c918691), C32e(0x9b948594),
2191
C32e(0x4bab90ab), C32e(0xbac642c6), C32e(0x2657c457), C32e(0x29e5aae5),
2192
C32e(0xe373d873), C32e(0x090f050f), C32e(0xf4030103), C32e(0x2a361236),
2193
C32e(0x3cfea3fe), C32e(0x8be15fe1), C32e(0xbe10f910), C32e(0x026bd06b),
2194
C32e(0xbfa891a8), C32e(0x71e858e8), C32e(0x53692769), C32e(0xf7d0b9d0),
2195
C32e(0x91483848), C32e(0xde351335), C32e(0xe5ceb3ce), C32e(0x77553355),
2196
C32e(0x04d6bbd6), C32e(0x39907090), C32e(0x87808980), C32e(0xc1f2a7f2),
2197
C32e(0xecc1b6c1), C32e(0x5a662266), C32e(0xb8ad92ad), C32e(0xa9602060),
2198
C32e(0x5cdb49db), C32e(0xb01aff1a), C32e(0xd8887888), C32e(0x2b8e7a8e),
2199
C32e(0x898a8f8a), C32e(0x4a13f813), C32e(0x929b809b), C32e(0x23391739),
2200
C32e(0x1075da75), C32e(0x84533153), C32e(0xd551c651), C32e(0x03d3b8d3),
2201
C32e(0xdc5ec35e), C32e(0xe2cbb0cb), C32e(0xc3997799), C32e(0x2d331133),
2202
C32e(0x3d46cb46), C32e(0xb71ffc1f), C32e(0x0c61d661), C32e(0x624e3a4e)
2203
};
2204
2205
#define DECL_STATE_SMALL \
2206
sph_u32 H[16];
2207
2208
#define READ_STATE_SMALL(sc) do { \
2209
memcpy(H, (sc)->state.narrow, sizeof H); \
2210
} while (0)
2211
2212
#define WRITE_STATE_SMALL(sc) do { \
2213
memcpy((sc)->state.narrow, H, sizeof H); \
2214
} while (0)
2215
2216
#define XCAT(x, y) XCAT_(x, y)
2217
#define XCAT_(x, y) x ## y
2218
2219
#define RSTT(d0, d1, a, b0, b1, b2, b3, b4, b5, b6, b7) do { \
2220
t[d0] = T0up[B32_0(a[b0])] \
2221
^ T1up[B32_1(a[b1])] \
2222
^ T2up[B32_2(a[b2])] \
2223
^ T3up[B32_3(a[b3])] \
2224
^ T0dn[B32_0(a[b4])] \
2225
^ T1dn[B32_1(a[b5])] \
2226
^ T2dn[B32_2(a[b6])] \
2227
^ T3dn[B32_3(a[b7])]; \
2228
t[d1] = T0dn[B32_0(a[b0])] \
2229
^ T1dn[B32_1(a[b1])] \
2230
^ T2dn[B32_2(a[b2])] \
2231
^ T3dn[B32_3(a[b3])] \
2232
^ T0up[B32_0(a[b4])] \
2233
^ T1up[B32_1(a[b5])] \
2234
^ T2up[B32_2(a[b6])] \
2235
^ T3up[B32_3(a[b7])]; \
2236
} while (0)
2237
2238
#define ROUND_SMALL_P(a, r) do { \
2239
sph_u32 t[16]; \
2240
a[0x0] ^= PC32up(0x00, r); \
2241
a[0x1] ^= PC32dn(0x00, r); \
2242
a[0x2] ^= PC32up(0x10, r); \
2243
a[0x3] ^= PC32dn(0x10, r); \
2244
a[0x4] ^= PC32up(0x20, r); \
2245
a[0x5] ^= PC32dn(0x20, r); \
2246
a[0x6] ^= PC32up(0x30, r); \
2247
a[0x7] ^= PC32dn(0x30, r); \
2248
a[0x8] ^= PC32up(0x40, r); \
2249
a[0x9] ^= PC32dn(0x40, r); \
2250
a[0xA] ^= PC32up(0x50, r); \
2251
a[0xB] ^= PC32dn(0x50, r); \
2252
a[0xC] ^= PC32up(0x60, r); \
2253
a[0xD] ^= PC32dn(0x60, r); \
2254
a[0xE] ^= PC32up(0x70, r); \
2255
a[0xF] ^= PC32dn(0x70, r); \
2256
RSTT(0x0, 0x1, a, 0x0, 0x2, 0x4, 0x6, 0x9, 0xB, 0xD, 0xF); \
2257
RSTT(0x2, 0x3, a, 0x2, 0x4, 0x6, 0x8, 0xB, 0xD, 0xF, 0x1); \
2258
RSTT(0x4, 0x5, a, 0x4, 0x6, 0x8, 0xA, 0xD, 0xF, 0x1, 0x3); \
2259
RSTT(0x6, 0x7, a, 0x6, 0x8, 0xA, 0xC, 0xF, 0x1, 0x3, 0x5); \
2260
RSTT(0x8, 0x9, a, 0x8, 0xA, 0xC, 0xE, 0x1, 0x3, 0x5, 0x7); \
2261
RSTT(0xA, 0xB, a, 0xA, 0xC, 0xE, 0x0, 0x3, 0x5, 0x7, 0x9); \
2262
RSTT(0xC, 0xD, a, 0xC, 0xE, 0x0, 0x2, 0x5, 0x7, 0x9, 0xB); \
2263
RSTT(0xE, 0xF, a, 0xE, 0x0, 0x2, 0x4, 0x7, 0x9, 0xB, 0xD); \
2264
memcpy(a, t, sizeof t); \
2265
} while (0)
2266
2267
#define ROUND_SMALL_Q(a, r) do { \
2268
sph_u32 t[16]; \
2269
a[0x0] ^= QC32up(0x00, r); \
2270
a[0x1] ^= QC32dn(0x00, r); \
2271
a[0x2] ^= QC32up(0x10, r); \
2272
a[0x3] ^= QC32dn(0x10, r); \
2273
a[0x4] ^= QC32up(0x20, r); \
2274
a[0x5] ^= QC32dn(0x20, r); \
2275
a[0x6] ^= QC32up(0x30, r); \
2276
a[0x7] ^= QC32dn(0x30, r); \
2277
a[0x8] ^= QC32up(0x40, r); \
2278
a[0x9] ^= QC32dn(0x40, r); \
2279
a[0xA] ^= QC32up(0x50, r); \
2280
a[0xB] ^= QC32dn(0x50, r); \
2281
a[0xC] ^= QC32up(0x60, r); \
2282
a[0xD] ^= QC32dn(0x60, r); \
2283
a[0xE] ^= QC32up(0x70, r); \
2284
a[0xF] ^= QC32dn(0x70, r); \
2285
RSTT(0x0, 0x1, a, 0x2, 0x6, 0xA, 0xE, 0x1, 0x5, 0x9, 0xD); \
2286
RSTT(0x2, 0x3, a, 0x4, 0x8, 0xC, 0x0, 0x3, 0x7, 0xB, 0xF); \
2287
RSTT(0x4, 0x5, a, 0x6, 0xA, 0xE, 0x2, 0x5, 0x9, 0xD, 0x1); \
2288
RSTT(0x6, 0x7, a, 0x8, 0xC, 0x0, 0x4, 0x7, 0xB, 0xF, 0x3); \
2289
RSTT(0x8, 0x9, a, 0xA, 0xE, 0x2, 0x6, 0x9, 0xD, 0x1, 0x5); \
2290
RSTT(0xA, 0xB, a, 0xC, 0x0, 0x4, 0x8, 0xB, 0xF, 0x3, 0x7); \
2291
RSTT(0xC, 0xD, a, 0xE, 0x2, 0x6, 0xA, 0xD, 0x1, 0x5, 0x9); \
2292
RSTT(0xE, 0xF, a, 0x0, 0x4, 0x8, 0xC, 0xF, 0x3, 0x7, 0xB); \
2293
memcpy(a, t, sizeof t); \
2294
} while (0)
2295
2296
#if SPH_SMALL_FOOTPRINT_GROESTL
2297
2298
#define PERM_SMALL_P(a) do { \
2299
int r; \
2300
for (r = 0; r < 10; r ++) \
2301
ROUND_SMALL_P(a, r); \
2302
} while (0)
2303
2304
#define PERM_SMALL_Q(a) do { \
2305
int r; \
2306
for (r = 0; r < 10; r ++) \
2307
ROUND_SMALL_Q(a, r); \
2308
} while (0)
2309
2310
#else
2311
2312
#define PERM_SMALL_P(a) do { \
2313
int r; \
2314
for (r = 0; r < 10; r += 2) { \
2315
ROUND_SMALL_P(a, r + 0); \
2316
ROUND_SMALL_P(a, r + 1); \
2317
} \
2318
} while (0)
2319
2320
#define PERM_SMALL_Q(a) do { \
2321
int r; \
2322
for (r = 0; r < 10; r += 2) { \
2323
ROUND_SMALL_Q(a, r + 0); \
2324
ROUND_SMALL_Q(a, r + 1); \
2325
} \
2326
} while (0)
2327
2328
#endif
2329
2330
#define COMPRESS_SMALL do { \
2331
sph_u32 g[16], m[16]; \
2332
size_t u; \
2333
for (u = 0; u < 16; u ++) { \
2334
m[u] = dec32e_aligned(buf + (u << 2)); \
2335
g[u] = m[u] ^ H[u]; \
2336
} \
2337
PERM_SMALL_P(g); \
2338
PERM_SMALL_Q(m); \
2339
for (u = 0; u < 16; u ++) \
2340
H[u] ^= g[u] ^ m[u]; \
2341
} while (0)
2342
2343
#define FINAL_SMALL do { \
2344
sph_u32 x[16]; \
2345
size_t u; \
2346
memcpy(x, H, sizeof x); \
2347
PERM_SMALL_P(x); \
2348
for (u = 0; u < 16; u ++) \
2349
H[u] ^= x[u]; \
2350
} while (0)
2351
2352
#define DECL_STATE_BIG \
2353
sph_u32 H[32];
2354
2355
#define READ_STATE_BIG(sc) do { \
2356
memcpy(H, (sc)->state.narrow, sizeof H); \
2357
} while (0)
2358
2359
#define WRITE_STATE_BIG(sc) do { \
2360
memcpy((sc)->state.narrow, H, sizeof H); \
2361
} while (0)
2362
2363
#if SPH_SMALL_FOOTPRINT_GROESTL
2364
2365
#define RBTT(d0, d1, a, b0, b1, b2, b3, b4, b5, b6, b7) do { \
2366
sph_u32 fu2 = T0up[B32_2(a[b2])]; \
2367
sph_u32 fd2 = T0dn[B32_2(a[b2])]; \
2368
sph_u32 fu3 = T1up[B32_3(a[b3])]; \
2369
sph_u32 fd3 = T1dn[B32_3(a[b3])]; \
2370
sph_u32 fu6 = T0up[B32_2(a[b6])]; \
2371
sph_u32 fd6 = T0dn[B32_2(a[b6])]; \
2372
sph_u32 fu7 = T1up[B32_3(a[b7])]; \
2373
sph_u32 fd7 = T1dn[B32_3(a[b7])]; \
2374
t[d0] = T0up[B32_0(a[b0])] \
2375
^ T1up[B32_1(a[b1])] \
2376
^ R32u(fu2, fd2) \
2377
^ R32u(fu3, fd3) \
2378
^ T0dn[B32_0(a[b4])] \
2379
^ T1dn[B32_1(a[b5])] \
2380
^ R32d(fu6, fd6) \
2381
^ R32d(fu7, fd7); \
2382
t[d1] = T0dn[B32_0(a[b0])] \
2383
^ T1dn[B32_1(a[b1])] \
2384
^ R32d(fu2, fd2) \
2385
^ R32d(fu3, fd3) \
2386
^ T0up[B32_0(a[b4])] \
2387
^ T1up[B32_1(a[b5])] \
2388
^ R32u(fu6, fd6) \
2389
^ R32u(fu7, fd7); \
2390
} while (0)
2391
2392
#else
2393
2394
#define RBTT(d0, d1, a, b0, b1, b2, b3, b4, b5, b6, b7) do { \
2395
t[d0] = T0up[B32_0(a[b0])] \
2396
^ T1up[B32_1(a[b1])] \
2397
^ T2up[B32_2(a[b2])] \
2398
^ T3up[B32_3(a[b3])] \
2399
^ T0dn[B32_0(a[b4])] \
2400
^ T1dn[B32_1(a[b5])] \
2401
^ T2dn[B32_2(a[b6])] \
2402
^ T3dn[B32_3(a[b7])]; \
2403
t[d1] = T0dn[B32_0(a[b0])] \
2404
^ T1dn[B32_1(a[b1])] \
2405
^ T2dn[B32_2(a[b2])] \
2406
^ T3dn[B32_3(a[b3])] \
2407
^ T0up[B32_0(a[b4])] \
2408
^ T1up[B32_1(a[b5])] \
2409
^ T2up[B32_2(a[b6])] \
2410
^ T3up[B32_3(a[b7])]; \
2411
} while (0)
2412
2413
#endif
2414
2415
#if SPH_SMALL_FOOTPRINT_GROESTL
2416
2417
#define ROUND_BIG_P(a, r) do { \
2418
sph_u32 t[32]; \
2419
size_t u; \
2420
a[0x00] ^= PC32up(0x00, r); \
2421
a[0x01] ^= PC32dn(0x00, r); \
2422
a[0x02] ^= PC32up(0x10, r); \
2423
a[0x03] ^= PC32dn(0x10, r); \
2424
a[0x04] ^= PC32up(0x20, r); \
2425
a[0x05] ^= PC32dn(0x20, r); \
2426
a[0x06] ^= PC32up(0x30, r); \
2427
a[0x07] ^= PC32dn(0x30, r); \
2428
a[0x08] ^= PC32up(0x40, r); \
2429
a[0x09] ^= PC32dn(0x40, r); \
2430
a[0x0A] ^= PC32up(0x50, r); \
2431
a[0x0B] ^= PC32dn(0x50, r); \
2432
a[0x0C] ^= PC32up(0x60, r); \
2433
a[0x0D] ^= PC32dn(0x60, r); \
2434
a[0x0E] ^= PC32up(0x70, r); \
2435
a[0x0F] ^= PC32dn(0x70, r); \
2436
a[0x10] ^= PC32up(0x80, r); \
2437
a[0x11] ^= PC32dn(0x80, r); \
2438
a[0x12] ^= PC32up(0x90, r); \
2439
a[0x13] ^= PC32dn(0x90, r); \
2440
a[0x14] ^= PC32up(0xA0, r); \
2441
a[0x15] ^= PC32dn(0xA0, r); \
2442
a[0x16] ^= PC32up(0xB0, r); \
2443
a[0x17] ^= PC32dn(0xB0, r); \
2444
a[0x18] ^= PC32up(0xC0, r); \
2445
a[0x19] ^= PC32dn(0xC0, r); \
2446
a[0x1A] ^= PC32up(0xD0, r); \
2447
a[0x1B] ^= PC32dn(0xD0, r); \
2448
a[0x1C] ^= PC32up(0xE0, r); \
2449
a[0x1D] ^= PC32dn(0xE0, r); \
2450
a[0x1E] ^= PC32up(0xF0, r); \
2451
a[0x1F] ^= PC32dn(0xF0, r); \
2452
for (u = 0; u < 32; u += 8) { \
2453
RBTT(u + 0x00, (u + 0x01) & 0x1F, a, \
2454
u + 0x00, (u + 0x02) & 0x1F, \
2455
(u + 0x04) & 0x1F, (u + 0x06) & 0x1F, \
2456
(u + 0x09) & 0x1F, (u + 0x0B) & 0x1F, \
2457
(u + 0x0D) & 0x1F, (u + 0x17) & 0x1F); \
2458
RBTT(u + 0x02, (u + 0x03) & 0x1F, a, \
2459
u + 0x02, (u + 0x04) & 0x1F, \
2460
(u + 0x06) & 0x1F, (u + 0x08) & 0x1F, \
2461
(u + 0x0B) & 0x1F, (u + 0x0D) & 0x1F, \
2462
(u + 0x0F) & 0x1F, (u + 0x19) & 0x1F); \
2463
RBTT(u + 0x04, (u + 0x05) & 0x1F, a, \
2464
u + 0x04, (u + 0x06) & 0x1F, \
2465
(u + 0x08) & 0x1F, (u + 0x0A) & 0x1F, \
2466
(u + 0x0D) & 0x1F, (u + 0x0F) & 0x1F, \
2467
(u + 0x11) & 0x1F, (u + 0x1B) & 0x1F); \
2468
RBTT(u + 0x06, (u + 0x07) & 0x1F, a, \
2469
u + 0x06, (u + 0x08) & 0x1F, \
2470
(u + 0x0A) & 0x1F, (u + 0x0C) & 0x1F, \
2471
(u + 0x0F) & 0x1F, (u + 0x11) & 0x1F, \
2472
(u + 0x13) & 0x1F, (u + 0x1D) & 0x1F); \
2473
} \
2474
memcpy(a, t, sizeof t); \
2475
} while (0)
2476
2477
#define ROUND_BIG_Q(a, r) do { \
2478
sph_u32 t[32]; \
2479
size_t u; \
2480
a[0x00] ^= QC32up(0x00, r); \
2481
a[0x01] ^= QC32dn(0x00, r); \
2482
a[0x02] ^= QC32up(0x10, r); \
2483
a[0x03] ^= QC32dn(0x10, r); \
2484
a[0x04] ^= QC32up(0x20, r); \
2485
a[0x05] ^= QC32dn(0x20, r); \
2486
a[0x06] ^= QC32up(0x30, r); \
2487
a[0x07] ^= QC32dn(0x30, r); \
2488
a[0x08] ^= QC32up(0x40, r); \
2489
a[0x09] ^= QC32dn(0x40, r); \
2490
a[0x0A] ^= QC32up(0x50, r); \
2491
a[0x0B] ^= QC32dn(0x50, r); \
2492
a[0x0C] ^= QC32up(0x60, r); \
2493
a[0x0D] ^= QC32dn(0x60, r); \
2494
a[0x0E] ^= QC32up(0x70, r); \
2495
a[0x0F] ^= QC32dn(0x70, r); \
2496
a[0x10] ^= QC32up(0x80, r); \
2497
a[0x11] ^= QC32dn(0x80, r); \
2498
a[0x12] ^= QC32up(0x90, r); \
2499
a[0x13] ^= QC32dn(0x90, r); \
2500
a[0x14] ^= QC32up(0xA0, r); \
2501
a[0x15] ^= QC32dn(0xA0, r); \
2502
a[0x16] ^= QC32up(0xB0, r); \
2503
a[0x17] ^= QC32dn(0xB0, r); \
2504
a[0x18] ^= QC32up(0xC0, r); \
2505
a[0x19] ^= QC32dn(0xC0, r); \
2506
a[0x1A] ^= QC32up(0xD0, r); \
2507
a[0x1B] ^= QC32dn(0xD0, r); \
2508
a[0x1C] ^= QC32up(0xE0, r); \
2509
a[0x1D] ^= QC32dn(0xE0, r); \
2510
a[0x1E] ^= QC32up(0xF0, r); \
2511
a[0x1F] ^= QC32dn(0xF0, r); \
2512
for (u = 0; u < 32; u += 8) { \
2513
RBTT(u + 0x00, (u + 0x01) & 0x1F, a, \
2514
(u + 0x02) & 0x1F, (u + 0x06) & 0x1F, \
2515
(u + 0x0A) & 0x1F, (u + 0x16) & 0x1F, \
2516
(u + 0x01) & 0x1F, (u + 0x05) & 0x1F, \
2517
(u + 0x09) & 0x1F, (u + 0x0D) & 0x1F); \
2518
RBTT(u + 0x02, (u + 0x03) & 0x1F, a, \
2519
(u + 0x04) & 0x1F, (u + 0x08) & 0x1F, \
2520
(u + 0x0C) & 0x1F, (u + 0x18) & 0x1F, \
2521
(u + 0x03) & 0x1F, (u + 0x07) & 0x1F, \
2522
(u + 0x0B) & 0x1F, (u + 0x0F) & 0x1F); \
2523
RBTT(u + 0x04, (u + 0x05) & 0x1F, a, \
2524
(u + 0x06) & 0x1F, (u + 0x0A) & 0x1F, \
2525
(u + 0x0E) & 0x1F, (u + 0x1A) & 0x1F, \
2526
(u + 0x05) & 0x1F, (u + 0x09) & 0x1F, \
2527
(u + 0x0D) & 0x1F, (u + 0x11) & 0x1F); \
2528
RBTT(u + 0x06, (u + 0x07) & 0x1F, a, \
2529
(u + 0x08) & 0x1F, (u + 0x0C) & 0x1F, \
2530
(u + 0x10) & 0x1F, (u + 0x1C) & 0x1F, \
2531
(u + 0x07) & 0x1F, (u + 0x0B) & 0x1F, \
2532
(u + 0x0F) & 0x1F, (u + 0x13) & 0x1F); \
2533
} \
2534
memcpy(a, t, sizeof t); \
2535
} while (0)
2536
2537
#else
2538
2539
#define ROUND_BIG_P(a, r) do { \
2540
sph_u32 t[32]; \
2541
a[0x00] ^= PC32up(0x00, r); \
2542
a[0x01] ^= PC32dn(0x00, r); \
2543
a[0x02] ^= PC32up(0x10, r); \
2544
a[0x03] ^= PC32dn(0x10, r); \
2545
a[0x04] ^= PC32up(0x20, r); \
2546
a[0x05] ^= PC32dn(0x20, r); \
2547
a[0x06] ^= PC32up(0x30, r); \
2548
a[0x07] ^= PC32dn(0x30, r); \
2549
a[0x08] ^= PC32up(0x40, r); \
2550
a[0x09] ^= PC32dn(0x40, r); \
2551
a[0x0A] ^= PC32up(0x50, r); \
2552
a[0x0B] ^= PC32dn(0x50, r); \
2553
a[0x0C] ^= PC32up(0x60, r); \
2554
a[0x0D] ^= PC32dn(0x60, r); \
2555
a[0x0E] ^= PC32up(0x70, r); \
2556
a[0x0F] ^= PC32dn(0x70, r); \
2557
a[0x10] ^= PC32up(0x80, r); \
2558
a[0x11] ^= PC32dn(0x80, r); \
2559
a[0x12] ^= PC32up(0x90, r); \
2560
a[0x13] ^= PC32dn(0x90, r); \
2561
a[0x14] ^= PC32up(0xA0, r); \
2562
a[0x15] ^= PC32dn(0xA0, r); \
2563
a[0x16] ^= PC32up(0xB0, r); \
2564
a[0x17] ^= PC32dn(0xB0, r); \
2565
a[0x18] ^= PC32up(0xC0, r); \
2566
a[0x19] ^= PC32dn(0xC0, r); \
2567
a[0x1A] ^= PC32up(0xD0, r); \
2568
a[0x1B] ^= PC32dn(0xD0, r); \
2569
a[0x1C] ^= PC32up(0xE0, r); \
2570
a[0x1D] ^= PC32dn(0xE0, r); \
2571
a[0x1E] ^= PC32up(0xF0, r); \
2572
a[0x1F] ^= PC32dn(0xF0, r); \
2573
RBTT(0x00, 0x01, a, \
2574
0x00, 0x02, 0x04, 0x06, 0x09, 0x0B, 0x0D, 0x17); \
2575
RBTT(0x02, 0x03, a, \
2576
0x02, 0x04, 0x06, 0x08, 0x0B, 0x0D, 0x0F, 0x19); \
2577
RBTT(0x04, 0x05, a, \
2578
0x04, 0x06, 0x08, 0x0A, 0x0D, 0x0F, 0x11, 0x1B); \
2579
RBTT(0x06, 0x07, a, \
2580
0x06, 0x08, 0x0A, 0x0C, 0x0F, 0x11, 0x13, 0x1D); \
2581
RBTT(0x08, 0x09, a, \
2582
0x08, 0x0A, 0x0C, 0x0E, 0x11, 0x13, 0x15, 0x1F); \
2583
RBTT(0x0A, 0x0B, a, \
2584
0x0A, 0x0C, 0x0E, 0x10, 0x13, 0x15, 0x17, 0x01); \
2585
RBTT(0x0C, 0x0D, a, \
2586
0x0C, 0x0E, 0x10, 0x12, 0x15, 0x17, 0x19, 0x03); \
2587
RBTT(0x0E, 0x0F, a, \
2588
0x0E, 0x10, 0x12, 0x14, 0x17, 0x19, 0x1B, 0x05); \
2589
RBTT(0x10, 0x11, a, \
2590
0x10, 0x12, 0x14, 0x16, 0x19, 0x1B, 0x1D, 0x07); \
2591
RBTT(0x12, 0x13, a, \
2592
0x12, 0x14, 0x16, 0x18, 0x1B, 0x1D, 0x1F, 0x09); \
2593
RBTT(0x14, 0x15, a, \
2594
0x14, 0x16, 0x18, 0x1A, 0x1D, 0x1F, 0x01, 0x0B); \
2595
RBTT(0x16, 0x17, a, \
2596
0x16, 0x18, 0x1A, 0x1C, 0x1F, 0x01, 0x03, 0x0D); \
2597
RBTT(0x18, 0x19, a, \
2598
0x18, 0x1A, 0x1C, 0x1E, 0x01, 0x03, 0x05, 0x0F); \
2599
RBTT(0x1A, 0x1B, a, \
2600
0x1A, 0x1C, 0x1E, 0x00, 0x03, 0x05, 0x07, 0x11); \
2601
RBTT(0x1C, 0x1D, a, \
2602
0x1C, 0x1E, 0x00, 0x02, 0x05, 0x07, 0x09, 0x13); \
2603
RBTT(0x1E, 0x1F, a, \
2604
0x1E, 0x00, 0x02, 0x04, 0x07, 0x09, 0x0B, 0x15); \
2605
memcpy(a, t, sizeof t); \
2606
} while (0)
2607
2608
#define ROUND_BIG_Q(a, r) do { \
2609
sph_u32 t[32]; \
2610
a[0x00] ^= QC32up(0x00, r); \
2611
a[0x01] ^= QC32dn(0x00, r); \
2612
a[0x02] ^= QC32up(0x10, r); \
2613
a[0x03] ^= QC32dn(0x10, r); \
2614
a[0x04] ^= QC32up(0x20, r); \
2615
a[0x05] ^= QC32dn(0x20, r); \
2616
a[0x06] ^= QC32up(0x30, r); \
2617
a[0x07] ^= QC32dn(0x30, r); \
2618
a[0x08] ^= QC32up(0x40, r); \
2619
a[0x09] ^= QC32dn(0x40, r); \
2620
a[0x0A] ^= QC32up(0x50, r); \
2621
a[0x0B] ^= QC32dn(0x50, r); \
2622
a[0x0C] ^= QC32up(0x60, r); \
2623
a[0x0D] ^= QC32dn(0x60, r); \
2624
a[0x0E] ^= QC32up(0x70, r); \
2625
a[0x0F] ^= QC32dn(0x70, r); \
2626
a[0x10] ^= QC32up(0x80, r); \
2627
a[0x11] ^= QC32dn(0x80, r); \
2628
a[0x12] ^= QC32up(0x90, r); \
2629
a[0x13] ^= QC32dn(0x90, r); \
2630
a[0x14] ^= QC32up(0xA0, r); \
2631
a[0x15] ^= QC32dn(0xA0, r); \
2632
a[0x16] ^= QC32up(0xB0, r); \
2633
a[0x17] ^= QC32dn(0xB0, r); \
2634
a[0x18] ^= QC32up(0xC0, r); \
2635
a[0x19] ^= QC32dn(0xC0, r); \
2636
a[0x1A] ^= QC32up(0xD0, r); \
2637
a[0x1B] ^= QC32dn(0xD0, r); \
2638
a[0x1C] ^= QC32up(0xE0, r); \
2639
a[0x1D] ^= QC32dn(0xE0, r); \
2640
a[0x1E] ^= QC32up(0xF0, r); \
2641
a[0x1F] ^= QC32dn(0xF0, r); \
2642
RBTT(0x00, 0x01, a, \
2643
0x02, 0x06, 0x0A, 0x16, 0x01, 0x05, 0x09, 0x0D); \
2644
RBTT(0x02, 0x03, a, \
2645
0x04, 0x08, 0x0C, 0x18, 0x03, 0x07, 0x0B, 0x0F); \
2646
RBTT(0x04, 0x05, a, \
2647
0x06, 0x0A, 0x0E, 0x1A, 0x05, 0x09, 0x0D, 0x11); \
2648
RBTT(0x06, 0x07, a, \
2649
0x08, 0x0C, 0x10, 0x1C, 0x07, 0x0B, 0x0F, 0x13); \
2650
RBTT(0x08, 0x09, a, \
2651
0x0A, 0x0E, 0x12, 0x1E, 0x09, 0x0D, 0x11, 0x15); \
2652
RBTT(0x0A, 0x0B, a, \
2653
0x0C, 0x10, 0x14, 0x00, 0x0B, 0x0F, 0x13, 0x17); \
2654
RBTT(0x0C, 0x0D, a, \
2655
0x0E, 0x12, 0x16, 0x02, 0x0D, 0x11, 0x15, 0x19); \
2656
RBTT(0x0E, 0x0F, a, \
2657
0x10, 0x14, 0x18, 0x04, 0x0F, 0x13, 0x17, 0x1B); \
2658
RBTT(0x10, 0x11, a, \
2659
0x12, 0x16, 0x1A, 0x06, 0x11, 0x15, 0x19, 0x1D); \
2660
RBTT(0x12, 0x13, a, \
2661
0x14, 0x18, 0x1C, 0x08, 0x13, 0x17, 0x1B, 0x1F); \
2662
RBTT(0x14, 0x15, a, \
2663
0x16, 0x1A, 0x1E, 0x0A, 0x15, 0x19, 0x1D, 0x01); \
2664
RBTT(0x16, 0x17, a, \
2665
0x18, 0x1C, 0x00, 0x0C, 0x17, 0x1B, 0x1F, 0x03); \
2666
RBTT(0x18, 0x19, a, \
2667
0x1A, 0x1E, 0x02, 0x0E, 0x19, 0x1D, 0x01, 0x05); \
2668
RBTT(0x1A, 0x1B, a, \
2669
0x1C, 0x00, 0x04, 0x10, 0x1B, 0x1F, 0x03, 0x07); \
2670
RBTT(0x1C, 0x1D, a, \
2671
0x1E, 0x02, 0x06, 0x12, 0x1D, 0x01, 0x05, 0x09); \
2672
RBTT(0x1E, 0x1F, a, \
2673
0x00, 0x04, 0x08, 0x14, 0x1F, 0x03, 0x07, 0x0B); \
2674
memcpy(a, t, sizeof t); \
2675
} while (0)
2676
2677
#endif
2678
2679
#if SPH_SMALL_FOOTPRINT_GROESTL
2680
2681
#define PERM_BIG_P(a) do { \
2682
int r; \
2683
for (r = 0; r < 14; r ++) \
2684
ROUND_BIG_P(a, r); \
2685
} while (0)
2686
2687
#define PERM_BIG_Q(a) do { \
2688
int r; \
2689
for (r = 0; r < 14; r ++) \
2690
ROUND_BIG_Q(a, r); \
2691
} while (0)
2692
2693
#else
2694
2695
#define PERM_BIG_P(a) do { \
2696
int r; \
2697
for (r = 0; r < 14; r += 2) { \
2698
ROUND_BIG_P(a, r + 0); \
2699
ROUND_BIG_P(a, r + 1); \
2700
} \
2701
} while (0)
2702
2703
#define PERM_BIG_Q(a) do { \
2704
int r; \
2705
for (r = 0; r < 14; r += 2) { \
2706
ROUND_BIG_Q(a, r + 0); \
2707
ROUND_BIG_Q(a, r + 1); \
2708
} \
2709
} while (0)
2710
2711
#endif
2712
2713
#define COMPRESS_BIG do { \
2714
sph_u32 g[32], m[32]; \
2715
size_t u; \
2716
for (u = 0; u < 32; u ++) { \
2717
m[u] = dec32e_aligned(buf + (u << 2)); \
2718
g[u] = m[u] ^ H[u]; \
2719
} \
2720
PERM_BIG_P(g); \
2721
PERM_BIG_Q(m); \
2722
for (u = 0; u < 32; u ++) \
2723
H[u] ^= g[u] ^ m[u]; \
2724
} while (0)
2725
2726
#define FINAL_BIG do { \
2727
sph_u32 x[32]; \
2728
size_t u; \
2729
memcpy(x, H, sizeof x); \
2730
PERM_BIG_P(x); \
2731
for (u = 0; u < 32; u ++) \
2732
H[u] ^= x[u]; \
2733
} while (0)
2734
2735
#endif
2736
2737
static void
2738
groestl_small_init(sph_groestl_small_context *sc, unsigned out_size)
2739
{
2740
size_t u;
2741
2742
sc->ptr = 0;
2743
#if SPH_GROESTL_64
2744
for (u = 0; u < 7; u ++)
2745
sc->state.wide[u] = 0;
2746
#if USE_LE
2747
sc->state.wide[7] = ((sph_u64)(out_size & 0xFF) << 56)
2748
| ((sph_u64)(out_size & 0xFF00) << 40);
2749
#else
2750
sc->state.wide[7] = (sph_u64)out_size;
2751
#endif
2752
#else
2753
for (u = 0; u < 15; u ++)
2754
sc->state.narrow[u] = 0;
2755
#if USE_LE
2756
sc->state.narrow[15] = ((sph_u32)(out_size & 0xFF) << 24)
2757
| ((sph_u32)(out_size & 0xFF00) << 8);
2758
#else
2759
sc->state.narrow[15] = (sph_u32)out_size;
2760
#endif
2761
#endif
2762
#if SPH_64
2763
sc->count = 0;
2764
#else
2765
sc->count_high = 0;
2766
sc->count_low = 0;
2767
#endif
2768
}
2769
2770
static void
2771
groestl_small_core(sph_groestl_small_context *sc, const void *data, size_t len)
2772
{
2773
unsigned char *buf;
2774
size_t ptr;
2775
DECL_STATE_SMALL
2776
2777
buf = sc->buf;
2778
ptr = sc->ptr;
2779
if (len < (sizeof sc->buf) - ptr) {
2780
memcpy(buf + ptr, data, len);
2781
ptr += len;
2782
sc->ptr = ptr;
2783
return;
2784
}
2785
2786
READ_STATE_SMALL(sc);
2787
while (len > 0) {
2788
size_t clen;
2789
2790
clen = (sizeof sc->buf) - ptr;
2791
if (clen > len)
2792
clen = len;
2793
memcpy(buf + ptr, data, clen);
2794
ptr += clen;
2795
data = (const unsigned char *)data + clen;
2796
len -= clen;
2797
if (ptr == sizeof sc->buf) {
2798
COMPRESS_SMALL;
2799
#if SPH_64
2800
sc->count ++;
2801
#else
2802
if ((sc->count_low = SPH_T32(sc->count_low + 1)) == 0)
2803
sc->count_high = SPH_T32(sc->count_high + 1);
2804
#endif
2805
ptr = 0;
2806
}
2807
}
2808
WRITE_STATE_SMALL(sc);
2809
sc->ptr = ptr;
2810
}
2811
2812
static void
2813
groestl_small_close(sph_groestl_small_context *sc,
2814
unsigned ub, unsigned n, void *dst, size_t out_len)
2815
{
2816
unsigned char pad[72];
2817
size_t u, ptr, pad_len;
2818
#if SPH_64
2819
sph_u64 count;
2820
#else
2821
sph_u32 count_high, count_low;
2822
#endif
2823
unsigned z;
2824
DECL_STATE_SMALL
2825
2826
ptr = sc->ptr;
2827
z = 0x80 >> n;
2828
pad[0] = ((ub & -z) | z) & 0xFF;
2829
if (ptr < 56) {
2830
pad_len = 64 - ptr;
2831
#if SPH_64
2832
count = SPH_T64(sc->count + 1);
2833
#else
2834
count_low = SPH_T32(sc->count_low + 1);
2835
count_high = SPH_T32(sc->count_high);
2836
if (count_low == 0)
2837
count_high = SPH_T32(count_high + 1);
2838
#endif
2839
} else {
2840
pad_len = 128 - ptr;
2841
#if SPH_64
2842
count = SPH_T64(sc->count + 2);
2843
#else
2844
count_low = SPH_T32(sc->count_low + 2);
2845
count_high = SPH_T32(sc->count_high);
2846
if (count_low <= 1)
2847
count_high = SPH_T32(count_high + 1);
2848
#endif
2849
}
2850
memset(pad + 1, 0, pad_len - 9);
2851
#if SPH_64
2852
sph_enc64be(pad + pad_len - 8, count);
2853
#else
2854
sph_enc64be(pad + pad_len - 8, count_high);
2855
sph_enc64be(pad + pad_len - 4, count_low);
2856
#endif
2857
groestl_small_core(sc, pad, pad_len);
2858
READ_STATE_SMALL(sc);
2859
FINAL_SMALL;
2860
#if SPH_GROESTL_64
2861
for (u = 0; u < 4; u ++)
2862
enc64e(pad + (u << 3), H[u + 4]);
2863
#else
2864
for (u = 0; u < 8; u ++)
2865
enc32e(pad + (u << 2), H[u + 8]);
2866
#endif
2867
memcpy(dst, pad + 32 - out_len, out_len);
2868
groestl_small_init(sc, (unsigned)out_len << 3);
2869
}
2870
2871
static void
2872
groestl_big_init(sph_groestl_big_context *sc, unsigned out_size)
2873
{
2874
size_t u;
2875
2876
sc->ptr = 0;
2877
#if SPH_GROESTL_64
2878
for (u = 0; u < 15; u ++)
2879
sc->state.wide[u] = 0;
2880
#if USE_LE
2881
sc->state.wide[15] = ((sph_u64)(out_size & 0xFF) << 56)
2882
| ((sph_u64)(out_size & 0xFF00) << 40);
2883
#else
2884
sc->state.wide[15] = (sph_u64)out_size;
2885
#endif
2886
#else
2887
for (u = 0; u < 31; u ++)
2888
sc->state.narrow[u] = 0;
2889
#if USE_LE
2890
sc->state.narrow[31] = ((sph_u32)(out_size & 0xFF) << 24)
2891
| ((sph_u32)(out_size & 0xFF00) << 8);
2892
#else
2893
sc->state.narrow[31] = (sph_u32)out_size;
2894
#endif
2895
#endif
2896
#if SPH_64
2897
sc->count = 0;
2898
#else
2899
sc->count_high = 0;
2900
sc->count_low = 0;
2901
#endif
2902
}
2903
2904
static void
2905
groestl_big_core(sph_groestl_big_context *sc, const void *data, size_t len)
2906
{
2907
unsigned char *buf;
2908
size_t ptr;
2909
DECL_STATE_BIG
2910
2911
buf = sc->buf;
2912
ptr = sc->ptr;
2913
if (len < (sizeof sc->buf) - ptr) {
2914
memcpy(buf + ptr, data, len);
2915
ptr += len;
2916
sc->ptr = ptr;
2917
return;
2918
}
2919
2920
READ_STATE_BIG(sc);
2921
while (len > 0) {
2922
size_t clen;
2923
2924
clen = (sizeof sc->buf) - ptr;
2925
if (clen > len)
2926
clen = len;
2927
memcpy(buf + ptr, data, clen);
2928
ptr += clen;
2929
data = (const unsigned char *)data + clen;
2930
len -= clen;
2931
if (ptr == sizeof sc->buf) {
2932
COMPRESS_BIG;
2933
#if SPH_64
2934
sc->count ++;
2935
#else
2936
if ((sc->count_low = SPH_T32(sc->count_low + 1)) == 0)
2937
sc->count_high = SPH_T32(sc->count_high + 1);
2938
#endif
2939
ptr = 0;
2940
}
2941
}
2942
WRITE_STATE_BIG(sc);
2943
sc->ptr = ptr;
2944
}
2945
2946
static void
2947
groestl_big_close(sph_groestl_big_context *sc,
2948
unsigned ub, unsigned n, void *dst, size_t out_len)
2949
{
2950
unsigned char pad[136];
2951
size_t ptr, pad_len, u;
2952
#if SPH_64
2953
sph_u64 count;
2954
#else
2955
sph_u32 count_high, count_low;
2956
#endif
2957
unsigned z;
2958
DECL_STATE_BIG
2959
2960
ptr = sc->ptr;
2961
z = 0x80 >> n;
2962
pad[0] = ((ub & -z) | z) & 0xFF;
2963
if (ptr < 120) {
2964
pad_len = 128 - ptr;
2965
#if SPH_64
2966
count = SPH_T64(sc->count + 1);
2967
#else
2968
count_low = SPH_T32(sc->count_low + 1);
2969
count_high = SPH_T32(sc->count_high);
2970
if (count_low == 0)
2971
count_high = SPH_T32(count_high + 1);
2972
#endif
2973
} else {
2974
pad_len = 256 - ptr;
2975
#if SPH_64
2976
count = SPH_T64(sc->count + 2);
2977
#else
2978
count_low = SPH_T32(sc->count_low + 2);
2979
count_high = SPH_T32(sc->count_high);
2980
if (count_low <= 1)
2981
count_high = SPH_T32(count_high + 1);
2982
#endif
2983
}
2984
memset(pad + 1, 0, pad_len - 9);
2985
#if SPH_64
2986
sph_enc64be(pad + pad_len - 8, count);
2987
#else
2988
sph_enc64be(pad + pad_len - 8, count_high);
2989
sph_enc64be(pad + pad_len - 4, count_low);
2990
#endif
2991
groestl_big_core(sc, pad, pad_len);
2992
READ_STATE_BIG(sc);
2993
FINAL_BIG;
2994
#if SPH_GROESTL_64
2995
for (u = 0; u < 8; u ++)
2996
enc64e(pad + (u << 3), H[u + 8]);
2997
#else
2998
for (u = 0; u < 16; u ++)
2999
enc32e(pad + (u << 2), H[u + 16]);
3000
#endif
3001
memcpy(dst, pad + 64 - out_len, out_len);
3002
groestl_big_init(sc, (unsigned)out_len << 3);
3003
}
3004
3005
/* see sph_groestl.h */
3006
void
3007
sph_groestl224_init(void *cc)
3008
{
3009
groestl_small_init(cc, 224);
3010
}
3011
3012
/* see sph_groestl.h */
3013
void
3014
sph_groestl224(void *cc, const void *data, size_t len)
3015
{
3016
groestl_small_core(cc, data, len);
3017
}
3018
3019
/* see sph_groestl.h */
3020
void
3021
sph_groestl224_close(void *cc, void *dst)
3022
{
3023
groestl_small_close(cc, 0, 0, dst, 28);
3024
}
3025
3026
/* see sph_groestl.h */
3027
void
3028
sph_groestl224_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst)
3029
{
3030
groestl_small_close(cc, ub, n, dst, 28);
3031
}
3032
3033
/* see sph_groestl.h */
3034
void
3035
sph_groestl256_init(void *cc)
3036
{
3037
groestl_small_init(cc, 256);
3038
}
3039
3040
/* see sph_groestl.h */
3041
void
3042
sph_groestl256(void *cc, const void *data, size_t len)
3043
{
3044
groestl_small_core(cc, data, len);
3045
}
3046
3047
/* see sph_groestl.h */
3048
void
3049
sph_groestl256_close(void *cc, void *dst)
3050
{
3051
groestl_small_close(cc, 0, 0, dst, 32);
3052
}
3053
3054
/* see sph_groestl.h */
3055
void
3056
sph_groestl256_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst)
3057
{
3058
groestl_small_close(cc, ub, n, dst, 32);
3059
}
3060
3061
/* see sph_groestl.h */
3062
void
3063
sph_groestl384_init(void *cc)
3064
{
3065
groestl_big_init(cc, 384);
3066
}
3067
3068
/* see sph_groestl.h */
3069
void
3070
sph_groestl384(void *cc, const void *data, size_t len)
3071
{
3072
groestl_big_core(cc, data, len);
3073
}
3074
3075
/* see sph_groestl.h */
3076
void
3077
sph_groestl384_close(void *cc, void *dst)
3078
{
3079
groestl_big_close(cc, 0, 0, dst, 48);
3080
}
3081
3082
/* see sph_groestl.h */
3083
void
3084
sph_groestl384_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst)
3085
{
3086
groestl_big_close(cc, ub, n, dst, 48);
3087
}
3088
3089
/* see sph_groestl.h */
3090
void
3091
sph_groestl512_init(void *cc)
3092
{
3093
groestl_big_init(cc, 512);
3094
}
3095
3096
/* see sph_groestl.h */
3097
void
3098
sph_groestl512(void *cc, const void *data, size_t len)
3099
{
3100
groestl_big_core(cc, data, len);
3101
}
3102
3103
/* see sph_groestl.h */
3104
void
3105
sph_groestl512_close(void *cc, void *dst)
3106
{
3107
groestl_big_close(cc, 0, 0, dst, 64);
3108
}
3109
3110
/* see sph_groestl.h */
3111
void
3112
sph_groestl512_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst)
3113
{
3114
groestl_big_close(cc, ub, n, dst, 64);
3115
}
3116
3117
#ifdef __cplusplus
3118
}
3119
#endif
3120
3121