GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: lib/libcrypto/gost/streebog.c Lines: 132 156 84.6 %
Date: 2017-11-13 Branches: 34 47 72.3 %

Line Branch Exec Source
1
/* $OpenBSD: streebog.c,v 1.5 2015/09/10 15:56:25 jsing Exp $ */
2
/*
3
 * Copyright (c) 2014 Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
4
 * Copyright (c) 2005-2006 Cryptocom LTD
5
 *
6
 * Redistribution and use in source and binary forms, with or without
7
 * modification, are permitted provided that the following conditions
8
 * are met:
9
 *
10
 * 1. Redistributions of source code must retain the above copyright
11
 *    notice, this list of conditions and the following disclaimer.
12
 *
13
 * 2. Redistributions in binary form must reproduce the above copyright
14
 *    notice, this list of conditions and the following disclaimer in
15
 *    the documentation and/or other materials provided with the
16
 *    distribution.
17
 *
18
 * 3. All advertising materials mentioning features or use of this
19
 *    software must display the following acknowledgment:
20
 *    "This product includes software developed by the OpenSSL Project
21
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
22
 *
23
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
24
 *    endorse or promote products derived from this software without
25
 *    prior written permission. For written permission, please contact
26
 *    openssl-core@openssl.org.
27
 *
28
 * 5. Products derived from this software may not be called "OpenSSL"
29
 *    nor may "OpenSSL" appear in their names without prior written
30
 *    permission of the OpenSSL Project.
31
 *
32
 * 6. Redistributions of any form whatsoever must retain the following
33
 *    acknowledgment:
34
 *    "This product includes software developed by the OpenSSL Project
35
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
36
 *
37
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
38
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
39
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
40
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
41
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
43
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
44
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
45
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
46
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
47
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
48
 * OF THE POSSIBILITY OF SUCH DAMAGE.
49
 * ====================================================================
50
 */
51
52
#include <machine/endian.h>
53
54
#include <stdlib.h>
55
#include <string.h>
56
57
#include <openssl/opensslconf.h>
58
59
#ifndef OPENSSL_NO_GOST
60
#include <openssl/crypto.h>
61
#include <openssl/objects.h>
62
#include <openssl/gost.h>
63
64
#include "gost_locl.h"
65
66
static const STREEBOG_LONG64 A_PI_table[8][256] = {
67
	{ /* 0 */
68
		U64(0xd01f715b5c7ef8e6), U64(0x16fa240980778325),
69
		U64(0xa8a42e857ee049c8), U64(0x6ac1068fa186465b),
70
		U64(0x6e417bd7a2e9320b), U64(0x665c8167a437daab),
71
		U64(0x7666681aa89617f6), U64(0x4b959163700bdcf5),
72
		U64(0xf14be6b78df36248), U64(0xc585bd689a625cff),
73
		U64(0x9557d7fca67d82cb), U64(0x89f0b969af6dd366),
74
		U64(0xb0833d48749f6c35), U64(0xa1998c23b1ecbc7c),
75
		U64(0x8d70c431ac02a736), U64(0xd6dfbc2fd0a8b69e),
76
		U64(0x37aeb3e551fa198b), U64(0x0b7d128a40b5cf9c),
77
		U64(0x5a8f2008b5780cbc), U64(0xedec882284e333e5),
78
		U64(0xd25fc177d3c7c2ce), U64(0x5e0f5d50b61778ec),
79
		U64(0x1d873683c0c24cb9), U64(0xad040bcbb45d208c),
80
		U64(0x2f89a0285b853c76), U64(0x5732fff6791b8d58),
81
		U64(0x3e9311439ef6ec3f), U64(0xc9183a809fd3c00f),
82
		U64(0x83adf3f5260a01ee), U64(0xa6791941f4e8ef10),
83
		U64(0x103ae97d0ca1cd5d), U64(0x2ce948121dee1b4a),
84
		U64(0x39738421dbf2bf53), U64(0x093da2a6cf0cf5b4),
85
		U64(0xcd9847d89cbcb45f), U64(0xf9561c078b2d8ae8),
86
		U64(0x9c6a755a6971777f), U64(0xbc1ebaa0712ef0c5),
87
		U64(0x72e61542abf963a6), U64(0x78bb5fde229eb12e),
88
		U64(0x14ba94250fceb90d), U64(0x844d6697630e5282),
89
		U64(0x98ea08026a1e032f), U64(0xf06bbea144217f5c),
90
		U64(0xdb6263d11ccb377a), U64(0x641c314b2b8ee083),
91
		U64(0x320e96ab9b4770cf), U64(0x1ee7deb986a96b85),
92
		U64(0xe96cf57a878c47b5), U64(0xfdd6615f8842feb8),
93
		U64(0xc83862965601dd1b), U64(0x2ea9f83e92572162),
94
		U64(0xf876441142ff97fc), U64(0xeb2c455608357d9d),
95
		U64(0x5612a7e0b0c9904c), U64(0x6c01cbfb2d500823),
96
		U64(0x4548a6a7fa037a2d), U64(0xabc4c6bf388b6ef4),
97
		U64(0xbade77d4fdf8bebd), U64(0x799b07c8eb4cac3a),
98
		U64(0x0c9d87e805b19cf0), U64(0xcb588aac106afa27),
99
		U64(0xea0c1d40c1e76089), U64(0x2869354a1e816f1a),
100
		U64(0xff96d17307fbc490), U64(0x9f0a9d602f1a5043),
101
		U64(0x96373fc6e016a5f7), U64(0x5292dab8b3a6e41c),
102
		U64(0x9b8ae0382c752413), U64(0x4f15ec3b7364a8a5),
103
		U64(0x3fb349555724f12b), U64(0xc7c50d4415db66d7),
104
		U64(0x92b7429ee379d1a7), U64(0xd37f99611a15dfda),
105
		U64(0x231427c05e34a086), U64(0xa439a96d7b51d538),
106
		U64(0xb403401077f01865), U64(0xdda2aea5901d7902),
107
		U64(0x0a5d4a9c8967d288), U64(0xc265280adf660f93),
108
		U64(0x8bb0094520d4e94e), U64(0x2a29856691385532),
109
		U64(0x42a833c5bf072941), U64(0x73c64d54622b7eb2),
110
		U64(0x07e095624504536c), U64(0x8a905153e906f45a),
111
		U64(0x6f6123c16b3b2f1f), U64(0xc6e55552dc097bc3),
112
		U64(0x4468feb133d16739), U64(0xe211e7f0c7398829),
113
		U64(0xa2f96419f7879b40), U64(0x19074bdbc3ad38e9),
114
		U64(0xf4ebc3f9474e0b0c), U64(0x43886bd376d53455),
115
		U64(0xd8028beb5aa01046), U64(0x51f23282f5cdc320),
116
		U64(0xe7b1c2be0d84e16d), U64(0x081dfab006dee8a0),
117
		U64(0x3b33340d544b857b), U64(0x7f5bcabc679ae242),
118
		U64(0x0edd37c48a08a6d8), U64(0x81ed43d9a9b33bc6),
119
		U64(0xb1a3655ebd4d7121), U64(0x69a1eeb5e7ed6167),
120
		U64(0xf6ab73d5c8f73124), U64(0x1a67a3e185c61fd5),
121
		U64(0x2dc91004d43c065e), U64(0x0240b02c8fb93a28),
122
		U64(0x90f7f2b26cc0eb8f), U64(0x3cd3a16f114fd617),
123
		U64(0xaae49ea9f15973e0), U64(0x06c0cd748cd64e78),
124
		U64(0xda423bc7d5192a6e), U64(0xc345701c16b41287),
125
		U64(0x6d2193ede4821537), U64(0xfcf639494190e3ac),
126
		U64(0x7c3b228621f1c57e), U64(0xfb16ac2b0494b0c0),
127
		U64(0xbf7e529a3745d7f9), U64(0x6881b6a32e3f7c73),
128
		U64(0xca78d2bad9b8e733), U64(0xbbfe2fc2342aa3a9),
129
		U64(0x0dbddffecc6381e4), U64(0x70a6a56e2440598e),
130
		U64(0xe4d12a844befc651), U64(0x8c509c2765d0ba22),
131
		U64(0xee8c6018c28814d9), U64(0x17da7c1f49a59e31),
132
		U64(0x609c4c1328e194d3), U64(0xb3e3d57232f44b09),
133
		U64(0x91d7aaa4a512f69b), U64(0x0ffd6fd243dabbcc),
134
		U64(0x50d26a943c1fde34), U64(0x6be15e9968545b4f),
135
		U64(0x94778fea6faf9fdf), U64(0x2b09dd7058ea4826),
136
		U64(0x677cd9716de5c7bf), U64(0x49d5214fffb2e6dd),
137
		U64(0x0360e83a466b273c), U64(0x1fc786af4f7b7691),
138
		U64(0xa0b9d435783ea168), U64(0xd49f0c035f118cb6),
139
		U64(0x01205816c9d21d14), U64(0xac2453dd7d8f3d98),
140
		U64(0x545217cc3f70aa64), U64(0x26b4028e9489c9c2),
141
		U64(0xdec2469fd6765e3e), U64(0x04807d58036f7450),
142
		U64(0xe5f17292823ddb45), U64(0xf30b569b024a5860),
143
		U64(0x62dcfc3fa758aefb), U64(0xe84cad6c4e5e5aa1),
144
		U64(0xccb81fce556ea94b), U64(0x53b282ae7a74f908),
145
		U64(0x1b47fbf74c1402c1), U64(0x368eebf39828049f),
146
		U64(0x7afbeff2ad278b06), U64(0xbe5e0a8cfe97caed),
147
		U64(0xcfd8f7f413058e77), U64(0xf78b2bc301252c30),
148
		U64(0x4d555c17fcdd928d), U64(0x5f2f05467fc565f8),
149
		U64(0x24f4b2a21b30f3ea), U64(0x860dd6bbecb768aa),
150
		U64(0x4c750401350f8f99), U64(0x0000000000000000),
151
		U64(0xecccd0344d312ef1), U64(0xb5231806be220571),
152
		U64(0xc105c030990d28af), U64(0x653c695de25cfd97),
153
		U64(0x159acc33c61ca419), U64(0xb89ec7f872418495),
154
		U64(0xa9847693b73254dc), U64(0x58cf90243ac13694),
155
		U64(0x59efc832f3132b80), U64(0x5c4fed7c39ae42c4),
156
		U64(0x828dabe3efd81cfa), U64(0xd13f294d95ace5f2),
157
		U64(0x7d1b7a90e823d86a), U64(0xb643f03cf849224d),
158
		U64(0x3df3f979d89dcb03), U64(0x7426d836272f2dde),
159
		U64(0xdfe21e891fa4432a), U64(0x3a136c1b9d99986f),
160
		U64(0xfa36f43dcd46add4), U64(0xc025982650df35bb),
161
		U64(0x856d3e81aadc4f96), U64(0xc4a5e57e53b041eb),
162
		U64(0x4708168b75ba4005), U64(0xaf44bbe73be41aa4),
163
		U64(0x971767d029c4b8e3), U64(0xb9be9feebb939981),
164
		U64(0x215497ecd18d9aae), U64(0x316e7e91dd2c57f3),
165
		U64(0xcef8afe2dad79363), U64(0x3853dc371220a247),
166
		U64(0x35ee03c9de4323a3), U64(0xe6919aa8c456fc79),
167
		U64(0xe05157dc4880b201), U64(0x7bdbb7e464f59612),
168
		U64(0x127a59518318f775), U64(0x332ecebd52956ddb),
169
		U64(0x8f30741d23bb9d1e), U64(0xd922d3fd93720d52),
170
		U64(0x7746300c61440ae2), U64(0x25d4eab4d2e2eefe),
171
		U64(0x75068020eefd30ca), U64(0x135a01474acaea61),
172
		U64(0x304e268714fe4ae7), U64(0xa519f17bb283c82c),
173
		U64(0xdc82f6b359cf6416), U64(0x5baf781e7caa11a8),
174
		U64(0xb2c38d64fb26561d), U64(0x34ce5bdf17913eb7),
175
		U64(0x5d6fb56af07c5fd0), U64(0x182713cd0a7f25fd),
176
		U64(0x9e2ac576e6c84d57), U64(0x9aaab82ee5a73907),
177
		U64(0xa3d93c0f3e558654), U64(0x7e7b92aaae48ff56),
178
		U64(0x872d8ead256575be), U64(0x41c8dbfff96c0e7d),
179
		U64(0x99ca5014a3cc1e3b), U64(0x40e883e930be1369),
180
		U64(0x1ca76e95091051ad), U64(0x4e35b42dbab6b5b1),
181
		U64(0x05a0254ecabd6944), U64(0xe1710fca8152af15),
182
		U64(0xf22b0e8dcb984574), U64(0xb763a82a319b3f59),
183
		U64(0x63fca4296e8ab3ef), U64(0x9d4a2d4ca0a36a6b),
184
		U64(0xe331bfe60eeb953d), U64(0xd5bf541596c391a2),
185
		U64(0xf5cb9bef8e9c1618), U64(0x46284e9dbc685d11),
186
		U64(0x2074cffa185f87ba), U64(0xbd3ee2b6b8fcedd1),
187
		U64(0xae64e3f1f23607b0), U64(0xfeb68965ce29d984),
188
		U64(0x55724fdaf6a2b770), U64(0x29496d5cd753720e),
189
		U64(0xa75941573d3af204), U64(0x8e102c0bea69800a),
190
		U64(0x111ab16bc573d049), U64(0xd7ffe439197aab8a),
191
		U64(0xefac380e0b5a09cd), U64(0x48f579593660fbc9),
192
		U64(0x22347fd697e6bd92), U64(0x61bc1405e13389c7),
193
		U64(0x4ab5c975b9d9c1e1), U64(0x80cd1bcf606126d2),
194
		U64(0x7186fd78ed92449a), U64(0x93971a882aabccb3),
195
		U64(0x88d0e17f66bfce72), U64(0x27945a985d5bd4d6)
196
	}, { /* 1 */
197
		U64(0xde553f8c05a811c8), U64(0x1906b59631b4f565),
198
		U64(0x436e70d6b1964ff7), U64(0x36d343cb8b1e9d85),
199
		U64(0x843dfacc858aab5a), U64(0xfdfc95c299bfc7f9),
200
		U64(0x0f634bdea1d51fa2), U64(0x6d458b3b76efb3cd),
201
		U64(0x85c3f77cf8593f80), U64(0x3c91315fbe737cb2),
202
		U64(0x2148b03366ace398), U64(0x18f8b8264c6761bf),
203
		U64(0xc830c1c495c9fb0f), U64(0x981a76102086a0aa),
204
		U64(0xaa16012142f35760), U64(0x35cc54060c763cf6),
205
		U64(0x42907d66cc45db2d), U64(0x8203d44b965af4bc),
206
		U64(0x3d6f3cefc3a0e868), U64(0xbc73ff69d292bda7),
207
		U64(0x8722ed0102e20a29), U64(0x8f8185e8cd34deb7),
208
		U64(0x9b0561dda7ee01d9), U64(0x5335a0193227fad6),
209
		U64(0xc9cecc74e81a6fd5), U64(0x54f5832e5c2431ea),
210
		U64(0x99e47ba05d553470), U64(0xf7bee756acd226ce),
211
		U64(0x384e05a5571816fd), U64(0xd1367452a47d0e6a),
212
		U64(0xf29fde1c386ad85b), U64(0x320c77316275f7ca),
213
		U64(0xd0c879e2d9ae9ab0), U64(0xdb7406c69110ef5d),
214
		U64(0x45505e51a2461011), U64(0xfc029872e46c5323),
215
		U64(0xfa3cb6f5f7bc0cc5), U64(0x031f17cd8768a173),
216
		U64(0xbd8df2d9af41297d), U64(0x9d3b4f5ab43e5e3f),
217
		U64(0x4071671b36feee84), U64(0x716207e7d3e3b83d),
218
		U64(0x48d20ff2f9283a1a), U64(0x27769eb4757cbc7e),
219
		U64(0x5c56ebc793f2e574), U64(0xa48b474f9ef5dc18),
220
		U64(0x52cbada94ff46e0c), U64(0x60c7da982d8199c6),
221
		U64(0x0e9d466edc068b78), U64(0x4eec2175eaf865fc),
222
		U64(0x550b8e9e21f7a530), U64(0x6b7ba5bc653fec2b),
223
		U64(0x5eb7f1ba6949d0dd), U64(0x57ea94e3db4c9099),
224
		U64(0xf640eae6d101b214), U64(0xdd4a284182c0b0bb),
225
		U64(0xff1d8fbf6304f250), U64(0xb8accb933bf9d7e8),
226
		U64(0xe8867c478eb68c4d), U64(0x3f8e2692391bddc1),
227
		U64(0xcb2fd60912a15a7c), U64(0xaec935dbab983d2f),
228
		U64(0xf55ffd2b56691367), U64(0x80e2ce366ce1c115),
229
		U64(0x179bf3f8edb27e1d), U64(0x01fe0db07dd394da),
230
		U64(0xda8a0b76ecc37b87), U64(0x44ae53e1df9584cb),
231
		U64(0xb310b4b77347a205), U64(0xdfab323c787b8512),
232
		U64(0x3b511268d070b78e), U64(0x65e6e3d2b9396753),
233
		U64(0x6864b271e2574d58), U64(0x259784c98fc789d7),
234
		U64(0x02e11a7dfabb35a9), U64(0x8841a6dfa337158b),
235
		U64(0x7ade78c39b5dcdd0), U64(0xb7cf804d9a2cc84a),
236
		U64(0x20b6bd831b7f7742), U64(0x75bd331d3a88d272),
237
		U64(0x418f6aab4b2d7a5e), U64(0xd9951cbb6babdaf4),
238
		U64(0xb6318dfde7ff5c90), U64(0x1f389b112264aa83),
239
		U64(0x492c024284fbaec0), U64(0xe33a0363c608f9a0),
240
		U64(0x2688930408af28a4), U64(0xc7538a1a341ce4ad),
241
		U64(0x5da8e677ee2171ae), U64(0x8c9e92254a5c7fc4),
242
		U64(0x63d8cd55aae938b5), U64(0x29ebd8daa97a3706),
243
		U64(0x959827b37be88aa1), U64(0x1484e4356adadf6e),
244
		U64(0xa7945082199d7d6b), U64(0xbf6ce8a455fa1cd4),
245
		U64(0x9cc542eac9edcae5), U64(0x79c16f0e1c356ca3),
246
		U64(0x89bfab6fdee48151), U64(0xd4174d1830c5f0ff),
247
		U64(0x9258048415eb419d), U64(0x6139d72850520d1c),
248
		U64(0x6a85a80c18ec78f1), U64(0xcd11f88e0171059a),
249
		U64(0xcceff53e7ca29140), U64(0xd229639f2315af19),
250
		U64(0x90b91ef9ef507434), U64(0x5977d28d074a1be1),
251
		U64(0x311360fce51d56b9), U64(0xc093a92d5a1f2f91),
252
		U64(0x1a19a25bb6dc5416), U64(0xeb996b8a09de2d3e),
253
		U64(0xfee3820f1ed7668a), U64(0xd7085ad5b7ad518c),
254
		U64(0x7fff41890fe53345), U64(0xec5948bd67dde602),
255
		U64(0x2fd5f65dbaaa68e0), U64(0xa5754affe32648c2),
256
		U64(0xf8ddac880d07396c), U64(0x6fa491468c548664),
257
		U64(0x0c7c5c1326bdbed1), U64(0x4a33158f03930fb3),
258
		U64(0x699abfc19f84d982), U64(0xe4fa2054a80b329c),
259
		U64(0x6707f9af438252fa), U64(0x08a368e9cfd6d49e),
260
		U64(0x47b1442c58fd25b8), U64(0xbbb3dc5ebc91769b),
261
		U64(0x1665fe489061eac7), U64(0x33f27a811fa66310),
262
		U64(0x93a609346838d547), U64(0x30ed6d4c98cec263),
263
		U64(0x1dd9816cd8df9f2a), U64(0x94662a03063b1e7b),
264
		U64(0x83fdd9fbeb896066), U64(0x7b207573e68e590a),
265
		U64(0x5f49fc0a149a4407), U64(0x343259b671a5a82c),
266
		U64(0xfbc2bb458a6f981f), U64(0xc272b350a0a41a38),
267
		U64(0x3aaf1fd8ada32354), U64(0x6cbb868b0b3c2717),
268
		U64(0xa2b569c88d2583fe), U64(0xf180c9d1bf027928),
269
		U64(0xaf37386bd64ba9f5), U64(0x12bacab2790a8088),
270
		U64(0x4c0d3b0810435055), U64(0xb2eeb9070e9436df),
271
		U64(0xc5b29067cea7d104), U64(0xdcb425f1ff132461),
272
		U64(0x4f122cc5972bf126), U64(0xac282fa651230886),
273
		U64(0xe7e537992f6393ef), U64(0xe61b3a2952b00735),
274
		U64(0x709c0a57ae302ce7), U64(0xe02514ae416058d3),
275
		U64(0xc44c9dd7b37445de), U64(0x5a68c5408022ba92),
276
		U64(0x1c278cdca50c0bf0), U64(0x6e5a9cf6f18712be),
277
		U64(0x86dce0b17f319ef3), U64(0x2d34ec2040115d49),
278
		U64(0x4bcd183f7e409b69), U64(0x2815d56ad4a9a3dc),
279
		U64(0x24698979f2141d0d), U64(0x0000000000000000),
280
		U64(0x1ec696a15fb73e59), U64(0xd86b110b16784e2e),
281
		U64(0x8e7f8858b0e74a6d), U64(0x063e2e8713d05fe6),
282
		U64(0xe2c40ed3bbdb6d7a), U64(0xb1f1aeca89fc97ac),
283
		U64(0xe1db191e3cb3cc09), U64(0x6418ee62c4eaf389),
284
		U64(0xc6ad87aa49cf7077), U64(0xd6f65765ca7ec556),
285
		U64(0x9afb6c6dda3d9503), U64(0x7ce05644888d9236),
286
		U64(0x8d609f95378feb1e), U64(0x23a9aa4e9c17d631),
287
		U64(0x6226c0e5d73aac6f), U64(0x56149953a69f0443),
288
		U64(0xeeb852c09d66d3ab), U64(0x2b0ac2a753c102af),
289
		U64(0x07c023376e03cb3c), U64(0x2ccae1903dc2c993),
290
		U64(0xd3d76e2f5ec63bc3), U64(0x9e2458973356ff4c),
291
		U64(0xa66a5d32644ee9b1), U64(0x0a427294356de137),
292
		U64(0x783f62be61e6f879), U64(0x1344c70204d91452),
293
		U64(0x5b96c8f0fdf12e48), U64(0xa90916ecc59bf613),
294
		U64(0xbe92e5142829880e), U64(0x727d102a548b194e),
295
		U64(0x1be7afebcb0fc0cc), U64(0x3e702b2244c8491b),
296
		U64(0xd5e940a84d166425), U64(0x66f9f41f3e51c620),
297
		U64(0xabe80c913f20c3ba), U64(0xf07ec461c2d1edf2),
298
		U64(0xf361d3ac45b94c81), U64(0x0521394a94b8fe95),
299
		U64(0xadd622162cf09c5c), U64(0xe97871f7f3651897),
300
		U64(0xf4a1f09b2bba87bd), U64(0x095d6559b2054044),
301
		U64(0x0bbc7f2448be75ed), U64(0x2af4cf172e129675),
302
		U64(0x157ae98517094bb4), U64(0x9fda55274e856b96),
303
		U64(0x914713499283e0ee), U64(0xb952c623462a4332),
304
		U64(0x74433ead475b46a8), U64(0x8b5eb112245fb4f8),
305
		U64(0xa34b6478f0f61724), U64(0x11a5dd7ffe6221fb),
306
		U64(0xc16da49d27ccbb4b), U64(0x76a224d0bde07301),
307
		U64(0x8aa0bca2598c2022), U64(0x4df336b86d90c48f),
308
		U64(0xea67663a740db9e4), U64(0xef465f70e0b54771),
309
		U64(0x39b008152acb8227), U64(0x7d1e5bf4f55e06ec),
310
		U64(0x105bd0cf83b1b521), U64(0x775c2960c033e7db),
311
		U64(0x7e014c397236a79f), U64(0x811cc386113255cf),
312
		U64(0xeda7450d1a0e72d8), U64(0x5889df3d7a998f3b),
313
		U64(0x2e2bfbedc779fc3a), U64(0xce0eef438619a4e9),
314
		U64(0x372d4e7bf6cd095f), U64(0x04df34fae96b6a4f),
315
		U64(0xf923a13870d4adb6), U64(0xa1aa7e050a4d228d),
316
		U64(0xa8f71b5cb84862c9), U64(0xb52e9a306097fde3),
317
		U64(0x0d8251a35b6e2a0b), U64(0x2257a7fee1c442eb),
318
		U64(0x73831d9a29588d94), U64(0x51d4ba64c89ccf7f),
319
		U64(0x502ab7d4b54f5ba5), U64(0x97793dce8153bf08),
320
		U64(0xe5042de4d5d8a646), U64(0x9687307efc802bd2),
321
		U64(0xa05473b5779eb657), U64(0xb4d097801d446939),
322
		U64(0xcff0e2f3fbca3033), U64(0xc38cbee0dd778ee2),
323
		U64(0x464f499c252eb162), U64(0xcad1dbb96f72cea6),
324
		U64(0xba4dd1eec142e241), U64(0xb00fa37af42f0376)
325
	}, { /* 2 */
326
		U64(0xcce4cd3aa968b245), U64(0x089d5484e80b7faf),
327
		U64(0x638246c1b3548304), U64(0xd2fe0ec8c2355492),
328
		U64(0xa7fbdf7ff2374eee), U64(0x4df1600c92337a16),
329
		U64(0x84e503ea523b12fb), U64(0x0790bbfd53ab0c4a),
330
		U64(0x198a780f38f6ea9d), U64(0x2ab30c8f55ec48cb),
331
		U64(0xe0f7fed6b2c49db5), U64(0xb6ecf3f422cadbdc),
332
		U64(0x409c9a541358df11), U64(0xd3ce8a56dfde3fe3),
333
		U64(0xc3e9224312c8c1a0), U64(0x0d6dfa58816ba507),
334
		U64(0xddf3e1b179952777), U64(0x04c02a42748bb1d9),
335
		U64(0x94c2abff9f2decb8), U64(0x4f91752da8f8acf4),
336
		U64(0x78682befb169bf7b), U64(0xe1c77a48af2ff6c4),
337
		U64(0x0c5d7ec69c80ce76), U64(0x4cc1e4928fd81167),
338
		U64(0xfeed3d24d9997b62), U64(0x518bb6dfc3a54a23),
339
		U64(0x6dbf2d26151f9b90), U64(0xb5bc624b05ea664f),
340
		U64(0xe86aaa525acfe21a), U64(0x4801ced0fb53a0be),
341
		U64(0xc91463e6c00868ed), U64(0x1027a815cd16fe43),
342
		U64(0xf67069a0319204cd), U64(0xb04ccc976c8abce7),
343
		U64(0xc0b9b3fc35e87c33), U64(0xf380c77c58f2de65),
344
		U64(0x50bb3241de4e2152), U64(0xdf93f490435ef195),
345
		U64(0xf1e0d25d62390887), U64(0xaf668bfb1a3c3141),
346
		U64(0xbc11b251f00a7291), U64(0x73a5eed47e427d47),
347
		U64(0x25bee3f6ee4c3b2e), U64(0x43cc0beb34786282),
348
		U64(0xc824e778dde3039c), U64(0xf97d86d98a327728),
349
		U64(0xf2b043e24519b514), U64(0xe297ebf7880f4b57),
350
		U64(0x3a94a49a98fab688), U64(0x868516cb68f0c419),
351
		U64(0xeffa11af0964ee50), U64(0xa4ab4ec0d517f37d),
352
		U64(0xa9c6b498547c567a), U64(0x8e18424f80fbbbb6),
353
		U64(0x0bcdc53bcf2bc23c), U64(0x137739aaea3643d0),
354
		U64(0x2c1333ec1bac2ff0), U64(0x8d48d3f0a7db0625),
355
		U64(0x1e1ac3f26b5de6d7), U64(0xf520f81f16b2b95e),
356
		U64(0x9f0f6ec450062e84), U64(0x0130849e1deb6b71),
357
		U64(0xd45e31ab8c7533a9), U64(0x652279a2fd14e43f),
358
		U64(0x3209f01e70f1c927), U64(0xbe71a770cac1a473),
359
		U64(0x0e3d6be7a64b1894), U64(0x7ec8148cff29d840),
360
		U64(0xcb7476c7fac3be0f), U64(0x72956a4a63a91636),
361
		U64(0x37f95ec21991138f), U64(0x9e3fea5a4ded45f5),
362
		U64(0x7b38ba50964902e8), U64(0x222e580bbde73764),
363
		U64(0x61e253e0899f55e6), U64(0xfc8d2805e352ad80),
364
		U64(0x35994be3235ac56d), U64(0x09add01af5e014de),
365
		U64(0x5e8659a6780539c6), U64(0xb17c48097161d796),
366
		U64(0x026015213acbd6e2), U64(0xd1ae9f77e515e901),
367
		U64(0xb7dc776a3f21b0ad), U64(0xaba6a1b96eb78098),
368
		U64(0x9bcf4486248d9f5d), U64(0x582666c536455efd),
369
		U64(0xfdbdac9bfeb9c6f1), U64(0xc47999be4163cdea),
370
		U64(0x765540081722a7ef), U64(0x3e548ed8ec710751),
371
		U64(0x3d041f67cb51bac2), U64(0x7958af71ac82d40a),
372
		U64(0x36c9da5c047a78fe), U64(0xed9a048e33af38b2),
373
		U64(0x26ee7249c96c86bd), U64(0x900281bdeba65d61),
374
		U64(0x11172c8bd0fd9532), U64(0xea0abf73600434f8),
375
		U64(0x42fc8f75299309f3), U64(0x34a9cf7d3eb1ae1c),
376
		U64(0x2b838811480723ba), U64(0x5ce64c8742ceef24),
377
		U64(0x1adae9b01fd6570e), U64(0x3c349bf9d6bad1b3),
378
		U64(0x82453c891c7b75c0), U64(0x97923a40b80d512b),
379
		U64(0x4a61dbf1c198765c), U64(0xb48ce6d518010d3e),
380
		U64(0xcfb45c858e480fd6), U64(0xd933cbf30d1e96ae),
381
		U64(0xd70ea014ab558e3a), U64(0xc189376228031742),
382
		U64(0x9262949cd16d8b83), U64(0xeb3a3bed7def5f89),
383
		U64(0x49314a4ee6b8cbcf), U64(0xdcc3652f647e4c06),
384
		U64(0xda635a4c2a3e2b3d), U64(0x470c21a940f3d35b),
385
		U64(0x315961a157d174b4), U64(0x6672e81dda3459ac),
386
		U64(0x5b76f77a1165e36e), U64(0x445cb01667d36ec8),
387
		U64(0xc5491d205c88a69b), U64(0x456c34887a3805b9),
388
		U64(0xffddb9bac4721013), U64(0x99af51a71e4649bf),
389
		U64(0xa15be01cbc7729d5), U64(0x52db2760e485f7b0),
390
		U64(0x8c78576eba306d54), U64(0xae560f6507d75a30),
391
		U64(0x95f22f6182c687c9), U64(0x71c5fbf54489aba5),
392
		U64(0xca44f259e728d57e), U64(0x88b87d2ccebbdc8d),
393
		U64(0xbab18d32be4a15aa), U64(0x8be8ec93e99b611e),
394
		U64(0x17b713e89ebdf209), U64(0xb31c5d284baa0174),
395
		U64(0xeeca9531148f8521), U64(0xb8d198138481c348),
396
		U64(0x8988f9b2d350b7fc), U64(0xb9e11c8d996aa839),
397
		U64(0x5a4673e40c8e881f), U64(0x1687977683569978),
398
		U64(0xbf4123eed72acf02), U64(0x4ea1f1b3b513c785),
399
		U64(0xe767452be16f91ff), U64(0x7505d1b730021a7c),
400
		U64(0xa59bca5ec8fc980c), U64(0xad069eda20f7e7a3),
401
		U64(0x38f4b1bba231606a), U64(0x60d2d77e94743e97),
402
		U64(0x9affc0183966f42c), U64(0x248e6768f3a7505f),
403
		U64(0xcdd449a4b483d934), U64(0x87b59255751baf68),
404
		U64(0x1bea6d2e023d3c7f), U64(0x6b1f12455b5ffcab),
405
		U64(0x743555292de9710d), U64(0xd8034f6d10f5fddf),
406
		U64(0xc6198c9f7ba81b08), U64(0xbb8109aca3a17edb),
407
		U64(0xfa2d1766ad12cabb), U64(0xc729080166437079),
408
		U64(0x9c5fff7b77269317), U64(0x0000000000000000),
409
		U64(0x15d706c9a47624eb), U64(0x6fdf38072fd44d72),
410
		U64(0x5fb6dd3865ee52b7), U64(0xa33bf53d86bcff37),
411
		U64(0xe657c1b5fc84fa8e), U64(0xaa962527735cebe9),
412
		U64(0x39c43525bfda0b1b), U64(0x204e4d2a872ce186),
413
		U64(0x7a083ece8ba26999), U64(0x554b9c9db72efbfa),
414
		U64(0xb22cd9b656416a05), U64(0x96a2bedea5e63a5a),
415
		U64(0x802529a826b0a322), U64(0x8115ad363b5bc853),
416
		U64(0x8375b81701901eb1), U64(0x3069e53f4a3a1fc5),
417
		U64(0xbd2136cfede119e0), U64(0x18bafc91251d81ec),
418
		U64(0x1d4a524d4c7d5b44), U64(0x05f0aedc6960daa8),
419
		U64(0x29e39d3072ccf558), U64(0x70f57f6b5962c0d4),
420
		U64(0x989fd53903ad22ce), U64(0xf84d024797d91c59),
421
		U64(0x547b1803aac5908b), U64(0xf0d056c37fd263f6),
422
		U64(0xd56eb535919e58d8), U64(0x1c7ad6d351963035),
423
		U64(0x2e7326cd2167f912), U64(0xac361a443d1c8cd2),
424
		U64(0x697f076461942a49), U64(0x4b515f6fdc731d2d),
425
		U64(0x8ad8680df4700a6f), U64(0x41ac1eca0eb3b460),
426
		U64(0x7d988533d80965d3), U64(0xa8f6300649973d0b),
427
		U64(0x7765c4960ac9cc9e), U64(0x7ca801adc5e20ea2),
428
		U64(0xdea3700e5eb59ae4), U64(0xa06b6482a19c42a4),
429
		U64(0x6a2f96db46b497da), U64(0x27def6d7d487edcc),
430
		U64(0x463ca5375d18b82a), U64(0xa6cb5be1efdc259f),
431
		U64(0x53eba3fef96e9cc1), U64(0xce84d81b93a364a7),
432
		U64(0xf4107c810b59d22f), U64(0x333974806d1aa256),
433
		U64(0x0f0def79bba073e5), U64(0x231edc95a00c5c15),
434
		U64(0xe437d494c64f2c6c), U64(0x91320523f64d3610),
435
		U64(0x67426c83c7df32dd), U64(0x6eefbc99323f2603),
436
		U64(0x9d6f7be56acdf866), U64(0x5916e25b2bae358c),
437
		U64(0x7ff89012e2c2b331), U64(0x035091bf2720bd93),
438
		U64(0x561b0d22900e4669), U64(0x28d319ae6f279e29),
439
		U64(0x2f43a2533c8c9263), U64(0xd09e1be9f8fe8270),
440
		U64(0xf740ed3e2c796fbc), U64(0xdb53ded237d5404c),
441
		U64(0x62b2c25faebfe875), U64(0x0afd41a5d2c0a94d),
442
		U64(0x6412fd3ce0ff8f4e), U64(0xe3a76f6995e42026),
443
		U64(0x6c8fa9b808f4f0e1), U64(0xc2d9a6dd0f23aad1),
444
		U64(0x8f28c6d19d10d0c7), U64(0x85d587744fd0798a),
445
		U64(0xa20b71a39b579446), U64(0x684f83fa7c7f4138),
446
		U64(0xe507500adba4471d), U64(0x3f640a46f19a6c20),
447
		U64(0x1247bd34f7dd28a1), U64(0x2d23b77206474481),
448
		U64(0x93521002cc86e0f2), U64(0x572b89bc8de52d18),
449
		U64(0xfb1d93f8b0f9a1ca), U64(0xe95a2ecc4724896b),
450
		U64(0x3ba420048511ddf9), U64(0xd63e248ab6bee54b),
451
		U64(0x5dd6c8195f258455), U64(0x06a03f634e40673b),
452
		U64(0x1f2a476c76b68da6), U64(0x217ec9b49ac78af7),
453
		U64(0xecaa80102e4453c3), U64(0x14e78257b99d4f9a)
454
	}, { /* 3 */
455
		U64(0x20329b2cc87bba05), U64(0x4f5eb6f86546a531),
456
		U64(0xd4f44775f751b6b1), U64(0x8266a47b850dfa8b),
457
		U64(0xbb986aa15a6ca985), U64(0xc979eb08f9ae0f99),
458
		U64(0x2da6f447a2375ea1), U64(0x1e74275dcd7d8576),
459
		U64(0xbc20180a800bc5f8), U64(0xb4a2f701b2dc65be),
460
		U64(0xe726946f981b6d66), U64(0x48e6c453bf21c94c),
461
		U64(0x42cad9930f0a4195), U64(0xefa47b64aacccd20),
462
		U64(0x71180a8960409a42), U64(0x8bb3329bf6a44e0c),
463
		U64(0xd34c35de2d36dacc), U64(0xa92f5b7cbc23dc96),
464
		U64(0xb31a85aa68bb09c3), U64(0x13e04836a73161d2),
465
		U64(0xb24dfc4129c51d02), U64(0x8ae44b70b7da5acd),
466
		U64(0xe671ed84d96579a7), U64(0xa4bb3417d66f3832),
467
		U64(0x4572ab38d56d2de8), U64(0xb1b47761ea47215c),
468
		U64(0xe81c09cf70aba15d), U64(0xffbdb872ce7f90ac),
469
		U64(0xa8782297fd5dc857), U64(0x0d946f6b6a4ce4a4),
470
		U64(0xe4df1f4f5b995138), U64(0x9ebc71edca8c5762),
471
		U64(0x0a2c1dc0b02b88d9), U64(0x3b503c115d9d7b91),
472
		U64(0xc64376a8111ec3a2), U64(0xcec199a323c963e4),
473
		U64(0xdc76a87ec58616f7), U64(0x09d596e073a9b487),
474
		U64(0x14583a9d7d560daf), U64(0xf4c6dc593f2a0cb4),
475
		U64(0xdd21d19584f80236), U64(0x4a4836983ddde1d3),
476
		U64(0xe58866a41ae745f9), U64(0xf591a5b27e541875),
477
		U64(0x891dc05074586693), U64(0x5b068c651810a89e),
478
		U64(0xa30346bc0c08544f), U64(0x3dbf3751c684032d),
479
		U64(0x2a1e86ec785032dc), U64(0xf73f5779fca830ea),
480
		U64(0xb60c05ca30204d21), U64(0x0cc316802b32f065),
481
		U64(0x8770241bdd96be69), U64(0xb861e18199ee95db),
482
		U64(0xf805cad91418fcd1), U64(0x29e70dccbbd20e82),
483
		U64(0xc7140f435060d763), U64(0x0f3a9da0e8b0cc3b),
484
		U64(0xa2543f574d76408e), U64(0xbd7761e1c175d139),
485
		U64(0x4b1f4f737ca3f512), U64(0x6dc2df1f2fc137ab),
486
		U64(0xf1d05c3967b14856), U64(0xa742bf3715ed046c),
487
		U64(0x654030141d1697ed), U64(0x07b872abda676c7d),
488
		U64(0x3ce84eba87fa17ec), U64(0xc1fb0403cb79afdf),
489
		U64(0x3e46bc7105063f73), U64(0x278ae987121cd678),
490
		U64(0xa1adb4778ef47cd0), U64(0x26dd906c5362c2b9),
491
		U64(0x05168060589b44e2), U64(0xfbfc41f9d79ac08f),
492
		U64(0x0e6de44ba9ced8fa), U64(0x9feb08068bf243a3),
493
		U64(0x7b341749d06b129b), U64(0x229c69e74a87929a),
494
		U64(0xe09ee6c4427c011b), U64(0x5692e30e725c4c3a),
495
		U64(0xda99a33e5e9f6e4b), U64(0x353dd85af453a36b),
496
		U64(0x25241b4c90e0fee7), U64(0x5de987258309d022),
497
		U64(0xe230140fc0802984), U64(0x93281e86a0c0b3c6),
498
		U64(0xf229d719a4337408), U64(0x6f6c2dd4ad3d1f34),
499
		U64(0x8ea5b2fbae3f0aee), U64(0x8331dd90c473ee4a),
500
		U64(0x346aa1b1b52db7aa), U64(0xdf8f235e06042aa9),
501
		U64(0xcc6f6b68a1354b7b), U64(0x6c95a6f46ebf236a),
502
		U64(0x52d31a856bb91c19), U64(0x1a35ded6d498d555),
503
		U64(0xf37eaef2e54d60c9), U64(0x72e181a9a3c2a61c),
504
		U64(0x98537aad51952fde), U64(0x16f6c856ffaa2530),
505
		U64(0xd960281e9d1d5215), U64(0x3a0745fa1ce36f50),
506
		U64(0x0b7b642bf1559c18), U64(0x59a87eae9aec8001),
507
		U64(0x5e100c05408bec7c), U64(0x0441f98b19e55023),
508
		U64(0xd70dcc5534d38aef), U64(0x927f676de1bea707),
509
		U64(0x9769e70db925e3e5), U64(0x7a636ea29115065a),
510
		U64(0x468b201816ef11b6), U64(0xab81a9b73edff409),
511
		U64(0xc0ac7de88a07bb1e), U64(0x1f235eb68c0391b7),
512
		U64(0x6056b074458dd30f), U64(0xbe8eeac102f7ed67),
513
		U64(0xcd381283e04b5fba), U64(0x5cbefecec277c4e3),
514
		U64(0xd21b4c356c48ce0d), U64(0x1019c31664b35d8c),
515
		U64(0x247362a7d19eea26), U64(0xebe582efb3299d03),
516
		U64(0x02aef2cb82fc289f), U64(0x86275df09ce8aaa8),
517
		U64(0x28b07427faac1a43), U64(0x38a9b7319e1f47cf),
518
		U64(0xc82e92e3b8d01b58), U64(0x06ef0b409b1978bc),
519
		U64(0x62f842bfc771fb90), U64(0x9904034610eb3b1f),
520
		U64(0xded85ab5477a3e68), U64(0x90d195a663428f98),
521
		U64(0x5384636e2ac708d8), U64(0xcbd719c37b522706),
522
		U64(0xae9729d76644b0eb), U64(0x7c8c65e20a0c7ee6),
523
		U64(0x80c856b007f1d214), U64(0x8c0b40302cc32271),
524
		U64(0xdbcedad51fe17a8a), U64(0x740e8ae938dbdea0),
525
		U64(0xa615c6dc549310ad), U64(0x19cc55f6171ae90b),
526
		U64(0x49b1bdb8fe5fdd8d), U64(0xed0a89af2830e5bf),
527
		U64(0x6a7aadb4f5a65bd6), U64(0x7e22972988f05679),
528
		U64(0xf952b3325566e810), U64(0x39fecedadf61530e),
529
		U64(0x6101c99f04f3c7ce), U64(0x2e5f7f6761b562ff),
530
		U64(0xf08725d226cf5c97), U64(0x63af3b54860fef51),
531
		U64(0x8ff2cb10ef411e2f), U64(0x884ab9bb35267252),
532
		U64(0x4df04433e7ba8dae), U64(0x9afd8866d3690741),
533
		U64(0x66b9bb34de94abb3), U64(0x9baaf18d92171380),
534
		U64(0x543c11c5f0a064a5), U64(0x17a1b1bdbed431f1),
535
		U64(0xb5f58eeaf3a2717f), U64(0xc355f6c849858740),
536
		U64(0xec5df044694ef17e), U64(0xd83751f5dc6346d4),
537
		U64(0xfc4433520dfdacf2), U64(0x0000000000000000),
538
		U64(0x5a51f58e596ebc5f), U64(0x3285aaf12e34cf16),
539
		U64(0x8d5c39db6dbd36b0), U64(0x12b731dde64f7513),
540
		U64(0x94906c2d7aa7dfbb), U64(0x302b583aacc8e789),
541
		U64(0x9d45facd090e6b3c), U64(0x2165e2c78905aec4),
542
		U64(0x68d45f7f775a7349), U64(0x189b2c1d5664fdca),
543
		U64(0xe1c99f2f030215da), U64(0x6983269436246788),
544
		U64(0x8489af3b1e148237), U64(0xe94b702431d5b59c),
545
		U64(0x33d2d31a6f4adbd7), U64(0xbfd9932a4389f9a6),
546
		U64(0xb0e30e8aab39359d), U64(0xd1e2c715afcaf253),
547
		U64(0x150f43763c28196e), U64(0xc4ed846393e2eb3d),
548
		U64(0x03f98b20c3823c5e), U64(0xfd134ab94c83b833),
549
		U64(0x556b682eb1de7064), U64(0x36c4537a37d19f35),
550
		U64(0x7559f30279a5ca61), U64(0x799ae58252973a04),
551
		U64(0x9c12832648707ffd), U64(0x78cd9c6913e92ec5),
552
		U64(0x1d8dac7d0effb928), U64(0x439da0784e745554),
553
		U64(0x413352b3cc887dcb), U64(0xbacf134a1b12bd44),
554
		U64(0x114ebafd25cd494d), U64(0x2f08068c20cb763e),
555
		U64(0x76a07822ba27f63f), U64(0xeab2fb04f25789c2),
556
		U64(0xe3676de481fe3d45), U64(0x1b62a73d95e6c194),
557
		U64(0x641749ff5c68832c), U64(0xa5ec4dfc97112cf3),
558
		U64(0xf6682e92bdd6242b), U64(0x3f11c59a44782bb2),
559
		U64(0x317c21d1edb6f348), U64(0xd65ab5be75ad9e2e),
560
		U64(0x6b2dd45fb4d84f17), U64(0xfaab381296e4d44e),
561
		U64(0xd0b5befeeeb4e692), U64(0x0882ef0b32d7a046),
562
		U64(0x512a91a5a83b2047), U64(0x963e9ee6f85bf724),
563
		U64(0x4e09cf132438b1f0), U64(0x77f701c9fb59e2fe),
564
		U64(0x7ddb1c094b726a27), U64(0x5f4775ee01f5f8bd),
565
		U64(0x9186ec4d223c9b59), U64(0xfeeac1998f01846d),
566
		U64(0xac39db1ce4b89874), U64(0xb75b7c21715e59e0),
567
		U64(0xafc0503c273aa42a), U64(0x6e3b543fec430bf5),
568
		U64(0x704f7362213e8e83), U64(0x58ff0745db9294c0),
569
		U64(0x67eec2df9feabf72), U64(0xa0facd9ccf8a6811),
570
		U64(0xb936986ad890811a), U64(0x95c715c63bd9cb7a),
571
		U64(0xca8060283a2c33c7), U64(0x507de84ee9453486),
572
		U64(0x85ded6d05f6a96f6), U64(0x1cdad5964f81ade9),
573
		U64(0xd5a33e9eb62fa270), U64(0x40642b588df6690a),
574
		U64(0x7f75eec2c98e42b8), U64(0x2cf18dace3494a60),
575
		U64(0x23cb100c0bf9865b), U64(0xeef3028febb2d9e1),
576
		U64(0x4425d2d394133929), U64(0xaad6d05c7fa1e0c8),
577
		U64(0xad6ea2f7a5c68cb5), U64(0xc2028f2308fb9381),
578
		U64(0x819f2f5b468fc6d5), U64(0xc5bafd88d29cfffc),
579
		U64(0x47dc59f357910577), U64(0x2b49ff07392e261d),
580
		U64(0x57c59ae5332258fb), U64(0x73b6f842e2bcb2dd),
581
		U64(0xcf96e04862b77725), U64(0x4ca73dd8a6c4996f),
582
		U64(0x015779eb417e14c1), U64(0x37932a9176af8bf4)
583
	}, { /* 4 */
584
		U64(0x190a2c9b249df23e), U64(0x2f62f8b62263e1e9),
585
		U64(0x7a7f754740993655), U64(0x330b7ba4d5564d9f),
586
		U64(0x4c17a16a46672582), U64(0xb22f08eb7d05f5b8),
587
		U64(0x535f47f40bc148cc), U64(0x3aec5d27d4883037),
588
		U64(0x10ed0a1825438f96), U64(0x516101f72c233d17),
589
		U64(0x13cc6f949fd04eae), U64(0x739853c441474bfd),
590
		U64(0x653793d90d3f5b1b), U64(0x5240647b96b0fc2f),
591
		U64(0x0c84890ad27623e0), U64(0xd7189b32703aaea3),
592
		U64(0x2685de3523bd9c41), U64(0x99317c5b11bffefa),
593
		U64(0x0d9baa854f079703), U64(0x70b93648fbd48ac5),
594
		U64(0xa80441fce30bc6be), U64(0x7287704bdc36ff1e),
595
		U64(0xb65384ed33dc1f13), U64(0xd36417343ee34408),
596
		U64(0x39cd38ab6e1bf10f), U64(0x5ab861770a1f3564),
597
		U64(0x0ebacf09f594563b), U64(0xd04572b884708530),
598
		U64(0x3cae9722bdb3af47), U64(0x4a556b6f2f5cbaf2),
599
		U64(0xe1704f1f76c4bd74), U64(0x5ec4ed7144c6dfcf),
600
		U64(0x16afc01d4c7810e6), U64(0x283f113cd629ca7a),
601
		U64(0xaf59a8761741ed2d), U64(0xeed5a3991e215fac),
602
		U64(0x3bf37ea849f984d4), U64(0xe413e096a56ce33c),
603
		U64(0x2c439d3a98f020d1), U64(0x637559dc6404c46b),
604
		U64(0x9e6c95d1e5f5d569), U64(0x24bb9836045fe99a),
605
		U64(0x44efa466dac8ecc9), U64(0xc6eab2a5c80895d6),
606
		U64(0x803b50c035220cc4), U64(0x0321658cba93c138),
607
		U64(0x8f9ebc465dc7ee1c), U64(0xd15a5137190131d3),
608
		U64(0x0fa5ec8668e5e2d8), U64(0x91c979578d1037b1),
609
		U64(0x0642ca05693b9f70), U64(0xefca80168350eb4f),
610
		U64(0x38d21b24f36a45ec), U64(0xbeab81e1af73d658),
611
		U64(0x8cbfd9cae7542f24), U64(0xfd19cc0d81f11102),
612
		U64(0x0ac6430fbb4dbc90), U64(0x1d76a09d6a441895),
613
		U64(0x2a01573ff1cbbfa1), U64(0xb572e161894fde2b),
614
		U64(0x8124734fa853b827), U64(0x614b1fdf43e6b1b0),
615
		U64(0x68ac395c4238cc18), U64(0x21d837bfd7f7b7d2),
616
		U64(0x20c714304a860331), U64(0x5cfaab726324aa14),
617
		U64(0x74c5ba4eb50d606e), U64(0xf3a3030474654739),
618
		U64(0x23e671bcf015c209), U64(0x45f087e947b9582a),
619
		U64(0xd8bd77b418df4c7b), U64(0xe06f6c90ebb50997),
620
		U64(0x0bd96080263c0873), U64(0x7e03f9410e40dcfe),
621
		U64(0xb8e94be4c6484928), U64(0xfb5b0608e8ca8e72),
622
		U64(0x1a2b49179e0e3306), U64(0x4e29e76961855059),
623
		U64(0x4f36c4e6fcf4e4ba), U64(0x49740ee395cf7bca),
624
		U64(0xc2963ea386d17f7d), U64(0x90d65ad810618352),
625
		U64(0x12d34c1b02a1fa4d), U64(0xfa44258775bb3a91),
626
		U64(0x18150f14b9ec46dd), U64(0x1491861e6b9a653d),
627
		U64(0x9a1019d7ab2c3fc2), U64(0x3668d42d06fe13d7),
628
		U64(0xdcc1fbb25606a6d0), U64(0x969490dd795a1c22),
629
		U64(0x3549b1a1bc6dd2ef), U64(0xc94f5e23a0ed770e),
630
		U64(0xb9f6686b5b39fdcb), U64(0xc4d4f4a6efeae00d),
631
		U64(0xe732851a1fff2204), U64(0x94aad6de5eb869f9),
632
		U64(0x3f8ff2ae07206e7f), U64(0xfe38a9813b62d03a),
633
		U64(0xa7a1ad7a8bee2466), U64(0x7b6056c8dde882b6),
634
		U64(0x302a1e286fc58ca7), U64(0x8da0fa457a259bc7),
635
		U64(0xb3302b64e074415b), U64(0x5402ae7eff8b635f),
636
		U64(0x08f8050c9cafc94b), U64(0xae468bf98a3059ce),
637
		U64(0x88c355cca98dc58f), U64(0xb10e6d67c7963480),
638
		U64(0xbad70de7e1aa3cf3), U64(0xbfb4a26e320262bb),
639
		U64(0xcb711820870f02d5), U64(0xce12b7a954a75c9d),
640
		U64(0x563ce87dd8691684), U64(0x9f73b65e7884618a),
641
		U64(0x2b1e74b06cba0b42), U64(0x47cec1ea605b2df1),
642
		U64(0x1c698312f735ac76), U64(0x5fdbcefed9b76b2c),
643
		U64(0x831a354c8fb1cdfc), U64(0x820516c312c0791f),
644
		U64(0xb74ca762aeadabf0), U64(0xfc06ef821c80a5e1),
645
		U64(0x5723cbf24518a267), U64(0x9d4df05d5f661451),
646
		U64(0x588627742dfd40bf), U64(0xda8331b73f3d39a0),
647
		U64(0x17b0e392d109a405), U64(0xf965400bcf28fba9),
648
		U64(0x7c3dbf4229a2a925), U64(0x023e460327e275db),
649
		U64(0x6cd0b55a0ce126b3), U64(0xe62da695828e96e7),
650
		U64(0x42ad6e63b3f373b9), U64(0xe50cc319381d57df),
651
		U64(0xc5cbd729729b54ee), U64(0x46d1e265fd2a9912),
652
		U64(0x6428b056904eeff8), U64(0x8be23040131e04b7),
653
		U64(0x6709d5da2add2ec0), U64(0x075de98af44a2b93),
654
		U64(0x8447dcc67bfbe66f), U64(0x6616f655b7ac9a23),
655
		U64(0xd607b8bded4b1a40), U64(0x0563af89d3a85e48),
656
		U64(0x3db1b4ad20c21ba4), U64(0x11f22997b8323b75),
657
		U64(0x292032b34b587e99), U64(0x7f1cdace9331681d),
658
		U64(0x8e819fc9c0b65aff), U64(0xa1e3677fe2d5bb16),
659
		U64(0xcd33d225ee349da5), U64(0xd9a2543b85aef898),
660
		U64(0x795e10cbfa0af76d), U64(0x25a4bbb9992e5d79),
661
		U64(0x78413344677b438e), U64(0xf0826688cef68601),
662
		U64(0xd27b34bba392f0eb), U64(0x551d8df162fad7bc),
663
		U64(0x1e57c511d0d7d9ad), U64(0xdeffbdb171e4d30b),
664
		U64(0xf4feea8e802f6caa), U64(0xa480c8f6317de55e),
665
		U64(0xa0fc44f07fa40ff5), U64(0x95b5f551c3c9dd1a),
666
		U64(0x22f952336d6476ea), U64(0x0000000000000000),
667
		U64(0xa6be8ef5169f9085), U64(0xcc2cf1aa73452946),
668
		U64(0x2e7ddb39bf12550a), U64(0xd526dd3157d8db78),
669
		U64(0x486b2d6c08becf29), U64(0x9b0f3a58365d8b21),
670
		U64(0xac78cdfaadd22c15), U64(0xbc95c7e28891a383),
671
		U64(0x6a927f5f65dab9c3), U64(0xc3891d2c1ba0cb9e),
672
		U64(0xeaa92f9f50f8b507), U64(0xcf0d9426c9d6e87e),
673
		U64(0xca6e3baf1a7eb636), U64(0xab25247059980786),
674
		U64(0x69b31ad3df4978fb), U64(0xe2512a93cc577c4c),
675
		U64(0xff278a0ea61364d9), U64(0x71a615c766a53e26),
676
		U64(0x89dc764334fc716c), U64(0xf87a638452594f4a),
677
		U64(0xf2bc208be914f3da), U64(0x8766b94ac1682757),
678
		U64(0xbbc82e687cdb8810), U64(0x626a7a53f9757088),
679
		U64(0xa2c202f358467a2e), U64(0x4d0882e5db169161),
680
		U64(0x09e7268301de7da8), U64(0xe897699c771ac0dc),
681
		U64(0xc8507dac3d9cc3ed), U64(0xc0a878a0a1330aa6),
682
		U64(0x978bb352e42ba8c1), U64(0xe9884a13ea6b743f),
683
		U64(0x279afdbabecc28a2), U64(0x047c8c064ed9eaab),
684
		U64(0x507e2278b15289f4), U64(0x599904fbb08cf45c),
685
		U64(0xbd8ae46d15e01760), U64(0x31353da7f2b43844),
686
		U64(0x8558ff49e68a528c), U64(0x76fbfc4d92ef15b5),
687
		U64(0x3456922e211c660c), U64(0x86799ac55c1993b4),
688
		U64(0x3e90d1219a51da9c), U64(0x2d5cbeb505819432),
689
		U64(0x982e5fd48cce4a19), U64(0xdb9c1238a24c8d43),
690
		U64(0xd439febecaa96f9b), U64(0x418c0bef0960b281),
691
		U64(0x158ea591f6ebd1de), U64(0x1f48e69e4da66d4e),
692
		U64(0x8afd13cf8e6fb054), U64(0xf5e1c9011d5ed849),
693
		U64(0xe34e091c5126c8af), U64(0xad67ee7530a398f6),
694
		U64(0x43b24dec2e82c75a), U64(0x75da99c1287cd48d),
695
		U64(0x92e81cdb3783f689), U64(0xa3dd217cc537cecd),
696
		U64(0x60543c50de970553), U64(0x93f73f54aaf2426a),
697
		U64(0xa91b62737e7a725d), U64(0xf19d4507538732e2),
698
		U64(0x77e4dfc20f9ea156), U64(0x7d229ccdb4d31dc6),
699
		U64(0x1b346a98037f87e5), U64(0xedf4c615a4b29e94),
700
		U64(0x4093286094110662), U64(0xb0114ee85ae78063),
701
		U64(0x6ff1d0d6b672e78b), U64(0x6dcf96d591909250),
702
		U64(0xdfe09e3eec9567e8), U64(0x3214582b4827f97c),
703
		U64(0xb46dc2ee143e6ac8), U64(0xf6c0ac8da7cd1971),
704
		U64(0xebb60c10cd8901e4), U64(0xf7df8f023abcad92),
705
		U64(0x9c52d3d2c217a0b2), U64(0x6b8d5cd0f8ab0d20),
706
		U64(0x3777f7a29b8fa734), U64(0x011f238f9d71b4e3),
707
		U64(0xc1b75b2f3c42be45), U64(0x5de588fdfe551ef7),
708
		U64(0x6eeef3592b035368), U64(0xaa3a07ffc4e9b365),
709
		U64(0xecebe59a39c32a77), U64(0x5ba742f8976e8187),
710
		U64(0x4b4a48e0b22d0e11), U64(0xddded83dcb771233),
711
		U64(0xa59feb79ac0c51bd), U64(0xc7f5912a55792135)
712
	}, { /* 5 */
713
		U64(0x6d6ae04668a9b08a), U64(0x3ab3f04b0be8c743),
714
		U64(0xe51e166b54b3c908), U64(0xbe90a9eb35c2f139),
715
		U64(0xb2c7066637f2bec1), U64(0xaa6945613392202c),
716
		U64(0x9a28c36f3b5201eb), U64(0xddce5a93ab536994),
717
		U64(0x0e34133ef6382827), U64(0x52a02ba1ec55048b),
718
		U64(0xa2f88f97c4b2a177), U64(0x8640e513ca2251a5),
719
		U64(0xcdf1d36258137622), U64(0xfe6cb708dedf8ddb),
720
		U64(0x8a174a9ec8121e5d), U64(0x679896036b81560e),
721
		U64(0x59ed033395795fee), U64(0x1dd778ab8b74edaf),
722
		U64(0xee533ef92d9f926d), U64(0x2a8c79baf8a8d8f5),
723
		U64(0x6bcf398e69b119f6), U64(0xe20491742fafdd95),
724
		U64(0x276488e0809c2aec), U64(0xea955b82d88f5cce),
725
		U64(0x7102c63a99d9e0c4), U64(0xf9763017a5c39946),
726
		U64(0x429fa2501f151b3d), U64(0x4659c72bea05d59e),
727
		U64(0x984b7fdccf5a6634), U64(0xf742232953fbb161),
728
		U64(0x3041860e08c021c7), U64(0x747bfd9616cd9386),
729
		U64(0x4bb1367192312787), U64(0x1b72a1638a6c44d3),
730
		U64(0x4a0e68a6e8359a66), U64(0x169a5039f258b6ca),
731
		U64(0xb98a2ef44edee5a4), U64(0xd9083fe85e43a737),
732
		U64(0x967f6ce239624e13), U64(0x8874f62d3c1a7982),
733
		U64(0x3c1629830af06e3f), U64(0x9165ebfd427e5a8e),
734
		U64(0xb5dd81794ceeaa5c), U64(0x0de8f15a7834f219),
735
		U64(0x70bd98ede3dd5d25), U64(0xaccc9ca9328a8950),
736
		U64(0x56664eda1945ca28), U64(0x221db34c0f8859ae),
737
		U64(0x26dbd637fa98970d), U64(0x1acdffb4f068f932),
738
		U64(0x4585254f64090fa0), U64(0x72de245e17d53afa),
739
		U64(0x1546b25d7c546cf4), U64(0x207e0ffffb803e71),
740
		U64(0xfaaad2732bcf4378), U64(0xb462dfae36ea17bd),
741
		U64(0xcf926fd1ac1b11fd), U64(0xe0672dc7dba7ba4a),
742
		U64(0xd3fa49ad5d6b41b3), U64(0x8ba81449b216a3bc),
743
		U64(0x14f9ec8a0650d115), U64(0x40fc1ee3eb1d7ce2),
744
		U64(0x23a2ed9b758ce44f), U64(0x782c521b14fddc7e),
745
		U64(0x1c68267cf170504e), U64(0xbcf31558c1ca96e6),
746
		U64(0xa781b43b4ba6d235), U64(0xf6fd7dfe29ff0c80),
747
		U64(0xb0a4bad5c3fad91e), U64(0xd199f51ea963266c),
748
		U64(0x414340349119c103), U64(0x5405f269ed4dadf7),
749
		U64(0xabd61bb649969dcd), U64(0x6813dbeae7bdc3c8),
750
		U64(0x65fb2ab09f8931d1), U64(0xf1e7fae152e3181d),
751
		U64(0xc1a67cef5a2339da), U64(0x7a4feea8e0f5bba1),
752
		U64(0x1e0b9acf05783791), U64(0x5b8ebf8061713831),
753
		U64(0x80e53cdbcb3af8d9), U64(0x7e898bd315e57502),
754
		U64(0xc6bcfbf0213f2d47), U64(0x95a38e86b76e942d),
755
		U64(0x092e94218d243cba), U64(0x8339debf453622e7),
756
		U64(0xb11be402b9fe64ff), U64(0x57d9100d634177c9),
757
		U64(0xcc4e8db52217cbc3), U64(0x3b0cae9c71ec7aa2),
758
		U64(0xfb158ca451cbfe99), U64(0x2b33276d82ac6514),
759
		U64(0x01bf5ed77a04bde1), U64(0xc5601994af33f779),
760
		U64(0x75c4a3416cc92e67), U64(0xf3844652a6eb7fc2),
761
		U64(0x3487e375fdd0ef64), U64(0x18ae430704609eed),
762
		U64(0x4d14efb993298efb), U64(0x815a620cb13e4538),
763
		U64(0x125c354207487869), U64(0x9eeea614ce42cf48),
764
		U64(0xce2d3106d61fac1c), U64(0xbbe99247bad6827b),
765
		U64(0x071a871f7b1c149d), U64(0x2e4a1cc10db81656),
766
		U64(0x77a71ff298c149b8), U64(0x06a5d9c80118a97c),
767
		U64(0xad73c27e488e34b1), U64(0x443a7b981e0db241),
768
		U64(0xe3bbcfa355ab6074), U64(0x0af276450328e684),
769
		U64(0x73617a896dd1871b), U64(0x58525de4ef7de20f),
770
		U64(0xb7be3dcab8e6cd83), U64(0x19111dd07e64230c),
771
		U64(0x842359a03e2a367a), U64(0x103f89f1f3401fb6),
772
		U64(0xdc710444d157d475), U64(0xb835702334da5845),
773
		U64(0x4320fc876511a6dc), U64(0xd026abc9d3679b8d),
774
		U64(0x17250eee885c0b2b), U64(0x90dab52a387ae76f),
775
		U64(0x31fed8d972c49c26), U64(0x89cba8fa461ec463),
776
		U64(0x2ff5421677bcabb7), U64(0x396f122f85e41d7d),
777
		U64(0xa09b332430bac6a8), U64(0xc888e8ced7070560),
778
		U64(0xaeaf201ac682ee8f), U64(0x1180d7268944a257),
779
		U64(0xf058a43628e7a5fc), U64(0xbd4c4b8fbbce2b07),
780
		U64(0xa1246df34abe7b49), U64(0x7d5569b79be9af3c),
781
		U64(0xa9b5a705bd9efa12), U64(0xdb6b835baa4bc0e8),
782
		U64(0x05793bac8f147342), U64(0x21c1512881848390),
783
		U64(0xfdb0556c50d357e5), U64(0x613d4fcb6a99ff72),
784
		U64(0x03dce2648e0cda3e), U64(0xe949b9e6568386f0),
785
		U64(0xfc0f0bbb2ad7ea04), U64(0x6a70675913b5a417),
786
		U64(0x7f36d5046fe1c8e3), U64(0x0c57af8d02304ff8),
787
		U64(0x32223abdfcc84618), U64(0x0891caf6f720815b),
788
		U64(0xa63eeaec31a26fd4), U64(0x2507345374944d33),
789
		U64(0x49d28ac266394058), U64(0xf5219f9aa7f3d6be),
790
		U64(0x2d96fea583b4cc68), U64(0x5a31e1571b7585d0),
791
		U64(0x8ed12fe53d02d0fe), U64(0xdfade6205f5b0e4b),
792
		U64(0x4cabb16ee92d331a), U64(0x04c6657bf510cea3),
793
		U64(0xd73c2cd6a87b8f10), U64(0xe1d87310a1a307ab),
794
		U64(0x6cd5be9112ad0d6b), U64(0x97c032354366f3f2),
795
		U64(0xd4e0ceb22677552e), U64(0x0000000000000000),
796
		U64(0x29509bde76a402cb), U64(0xc27a9e8bd42fe3e4),
797
		U64(0x5ef7842cee654b73), U64(0xaf107ecdbc86536e),
798
		U64(0x3fcacbe784fcb401), U64(0xd55f90655c73e8cf),
799
		U64(0xe6c2f40fdabf1336), U64(0xe8f6e7312c873b11),
800
		U64(0xeb2a0555a28be12f), U64(0xe4a148bc2eb774e9),
801
		U64(0x9b979db84156bc0a), U64(0x6eb60222e6a56ab4),
802
		U64(0x87ffbbc4b026ec44), U64(0xc703a5275b3b90a6),
803
		U64(0x47e699fc9001687f), U64(0x9c8d1aa73a4aa897),
804
		U64(0x7cea3760e1ed12dd), U64(0x4ec80ddd1d2554c5),
805
		U64(0x13e36b957d4cc588), U64(0x5d2b66486069914d),
806
		U64(0x92b90999cc7280b0), U64(0x517cc9c56259deb5),
807
		U64(0xc937b619ad03b881), U64(0xec30824ad997f5b2),
808
		U64(0xa45d565fc5aa080b), U64(0xd6837201d27f32f1),
809
		U64(0x635ef3789e9198ad), U64(0x531f75769651b96a),
810
		U64(0x4f77530a6721e924), U64(0x486dd4151c3dfdb9),
811
		U64(0x5f48dafb9461f692), U64(0x375b011173dc355a),
812
		U64(0x3da9775470f4d3de), U64(0x8d0dcd81b30e0ac0),
813
		U64(0x36e45fc609d888bb), U64(0x55baacbe97491016),
814
		U64(0x8cb29356c90ab721), U64(0x76184125e2c5f459),
815
		U64(0x99f4210bb55edbd5), U64(0x6f095cf59ca1d755),
816
		U64(0x9f51f8c3b44672a9), U64(0x3538bda287d45285),
817
		U64(0x50c39712185d6354), U64(0xf23b1885dcefc223),
818
		U64(0x79930ccc6ef9619f), U64(0xed8fdc9da3934853),
819
		U64(0xcb540aaa590bdf5e), U64(0x5c94389f1a6d2cac),
820
		U64(0xe77daad8a0bbaed7), U64(0x28efc5090ca0bf2a),
821
		U64(0xbf2ff73c4fc64cd8), U64(0xb37858b14df60320),
822
		U64(0xf8c96ec0dfc724a7), U64(0x828680683f329f06),
823
		U64(0x941cd051cd6a29cc), U64(0xc3c5c05cae2b5e05),
824
		U64(0xb601631dc2e27062), U64(0xc01922382027843b),
825
		U64(0x24b86a840e90f0d2), U64(0xd245177a276ffc52),
826
		U64(0x0f8b4de98c3c95c6), U64(0x3e759530fef809e0),
827
		U64(0x0b4d2892792c5b65), U64(0xc4df4743d5374a98),
828
		U64(0xa5e20888bfaeb5ea), U64(0xba56cc90c0d23f9a),
829
		U64(0x38d04cf8ffe0a09c), U64(0x62e1adafe495254c),
830
		U64(0x0263bcb3f40867df), U64(0xcaeb547d230f62bf),
831
		U64(0x6082111c109d4293), U64(0xdad4dd8cd04f7d09),
832
		U64(0xefec602e579b2f8c), U64(0x1fb4c4187f7c8a70),
833
		U64(0xffd3e9dfa4db303a), U64(0x7bf0b07f9af10640),
834
		U64(0xf49ec14dddf76b5f), U64(0x8f6e713247066d1f),
835
		U64(0x339d646a86ccfbf9), U64(0x64447467e58d8c30),
836
		U64(0x2c29a072f9b07189), U64(0xd8b7613f24471ad6),
837
		U64(0x6627c8d41185ebef), U64(0xa347d140beb61c96),
838
		U64(0xde12b8f7255fb3aa), U64(0x9d324470404e1576),
839
		U64(0x9306574eb6763d51), U64(0xa80af9d2c79a47f3),
840
		U64(0x859c0777442e8b9b), U64(0x69ac853d9db97e29)
841
	}, { /* 6 */
842
		U64(0xc3407dfc2de6377e), U64(0x5b9e93eea4256f77),
843
		U64(0xadb58fdd50c845e0), U64(0x5219ff11a75bed86),
844
		U64(0x356b61cfd90b1de9), U64(0xfb8f406e25abe037),
845
		U64(0x7a5a0231c0f60796), U64(0x9d3cd216e1f5020b),
846
		U64(0x0c6550fb6b48d8f3), U64(0xf57508c427ff1c62),
847
		U64(0x4ad35ffa71cb407d), U64(0x6290a2da1666aa6d),
848
		U64(0xe284ec2349355f9f), U64(0xb3c307c53d7c84ec),
849
		U64(0x05e23c0468365a02), U64(0x190bac4d6c9ebfa8),
850
		U64(0x94bbbee9e28b80fa), U64(0xa34fc777529cb9b5),
851
		U64(0xcc7b39f095bcd978), U64(0x2426addb0ce532e3),
852
		U64(0x7e79329312ce4fc7), U64(0xab09a72eebec2917),
853
		U64(0xf8d15499f6b9d6c2), U64(0x1a55b8babf8c895d),
854
		U64(0xdb8add17fb769a85), U64(0xb57f2f368658e81b),
855
		U64(0x8acd36f18f3f41f6), U64(0x5ce3b7bba50f11d3),
856
		U64(0x114dcc14d5ee2f0a), U64(0xb91a7fcded1030e8),
857
		U64(0x81d5425fe55de7a1), U64(0xb6213bc1554adeee),
858
		U64(0x80144ef95f53f5f2), U64(0x1e7688186db4c10c),
859
		U64(0x3b912965db5fe1bc), U64(0xc281715a97e8252d),
860
		U64(0x54a5d7e21c7f8171), U64(0x4b12535ccbc5522e),
861
		U64(0x1d289cefbea6f7f9), U64(0x6ef5f2217d2e729e),
862
		U64(0xe6a7dc819b0d17ce), U64(0x1b94b41c05829b0e),
863
		U64(0x33d7493c622f711e), U64(0xdcf7f942fa5ce421),
864
		U64(0x600fba8b7f7a8ecb), U64(0x46b60f011a83988e),
865
		U64(0x235b898e0dcf4c47), U64(0x957ab24f588592a9),
866
		U64(0x4354330572b5c28c), U64(0xa5f3ef84e9b8d542),
867
		U64(0x8c711e02341b2d01), U64(0x0b1874ae6a62a657),
868
		U64(0x1213d8e306fc19ff), U64(0xfe6d7c6a4d9dba35),
869
		U64(0x65ed868f174cd4c9), U64(0x88522ea0e6236550),
870
		U64(0x899322065c2d7703), U64(0xc01e690bfef4018b),
871
		U64(0x915982ed8abddaf8), U64(0xbe675b98ec3a4e4c),
872
		U64(0xa996bf7f82f00db1), U64(0xe1daf8d49a27696a),
873
		U64(0x2effd5d3dc8986e7), U64(0xd153a51f2b1a2e81),
874
		U64(0x18caa0ebd690adfb), U64(0x390e3134b243c51a),
875
		U64(0x2778b92cdff70416), U64(0x029f1851691c24a6),
876
		U64(0x5e7cafeacc133575), U64(0xfa4e4cc89fa5f264),
877
		U64(0x5a5f9f481e2b7d24), U64(0x484c47ab18d764db),
878
		U64(0x400a27f2a1a7f479), U64(0xaeeb9b2a83da7315),
879
		U64(0x721c626879869734), U64(0x042330a2d2384851),
880
		U64(0x85f672fd3765aff0), U64(0xba446b3a3e02061d),
881
		U64(0x73dd6ecec3888567), U64(0xffac70ccf793a866),
882
		U64(0xdfa9edb5294ed2d4), U64(0x6c6aea7014325638),
883
		U64(0x834a5a0e8c41c307), U64(0xcdba35562fb2cb2b),
884
		U64(0x0ad97808d06cb404), U64(0x0f3b440cb85aee06),
885
		U64(0xe5f9c876481f213b), U64(0x98deee1289c35809),
886
		U64(0x59018bbfcd394bd1), U64(0xe01bf47220297b39),
887
		U64(0xde68e1139340c087), U64(0x9fa3ca4788e926ad),
888
		U64(0xbb85679c840c144e), U64(0x53d8f3b71d55ffd5),
889
		U64(0x0da45c5dd146caa0), U64(0x6f34fe87c72060cd),
890
		U64(0x57fbc315cf6db784), U64(0xcee421a1fca0fdde),
891
		U64(0x3d2d0196607b8d4b), U64(0x642c8a29ad42c69a),
892
		U64(0x14aff010bdd87508), U64(0xac74837beac657b3),
893
		U64(0x3216459ad821634d), U64(0x3fb219c70967a9ed),
894
		U64(0x06bc28f3bb246cf7), U64(0xf2082c9126d562c6),
895
		U64(0x66b39278c45ee23c), U64(0xbd394f6f3f2878b9),
896
		U64(0xfd33689d9e8f8cc0), U64(0x37f4799eb017394f),
897
		U64(0x108cc0b26fe03d59), U64(0xda4bd1b1417888d6),
898
		U64(0xb09d1332ee6eb219), U64(0x2f3ed975668794b4),
899
		U64(0x58c0871977375982), U64(0x7561463d78ace990),
900
		U64(0x09876cff037e82f1), U64(0x7fb83e35a8c05d94),
901
		U64(0x26b9b58a65f91645), U64(0xef20b07e9873953f),
902
		U64(0x3148516d0b3355b8), U64(0x41cb2b541ba9e62a),
903
		U64(0x790416c613e43163), U64(0xa011d380818e8f40),
904
		U64(0x3a5025c36151f3ef), U64(0xd57095bdf92266d0),
905
		U64(0x498d4b0da2d97688), U64(0x8b0c3a57353153a5),
906
		U64(0x21c491df64d368e1), U64(0x8f2f0af5e7091bf4),
907
		U64(0x2da1c1240f9bb012), U64(0xc43d59a92ccc49da),
908
		U64(0xbfa6573e56345c1f), U64(0x828b56a8364fd154),
909
		U64(0x9a41f643e0df7caf), U64(0xbcf843c985266aea),
910
		U64(0x2b1de9d7b4bfdce5), U64(0x20059d79dedd7ab2),
911
		U64(0x6dabe6d6ae3c446b), U64(0x45e81bf6c991ae7b),
912
		U64(0x6351ae7cac68b83e), U64(0xa432e32253b6c711),
913
		U64(0xd092a9b991143cd2), U64(0xcac711032e98b58f),
914
		U64(0xd8d4c9e02864ac70), U64(0xc5fc550f96c25b89),
915
		U64(0xd7ef8dec903e4276), U64(0x67729ede7e50f06f),
916
		U64(0xeac28c7af045cf3d), U64(0xb15c1f945460a04a),
917
		U64(0x9cfddeb05bfb1058), U64(0x93c69abce3a1fe5e),
918
		U64(0xeb0380dc4a4bdd6e), U64(0xd20db1e8f8081874),
919
		U64(0x229a8528b7c15e14), U64(0x44291750739fbc28),
920
		U64(0xd3ccbd4e42060a27), U64(0xf62b1c33f4ed2a97),
921
		U64(0x86a8660ae4779905), U64(0xd62e814a2a305025),
922
		U64(0x477703a7a08d8add), U64(0x7b9b0e977af815c5),
923
		U64(0x78c51a60a9ea2330), U64(0xa6adfb733aaae3b7),
924
		U64(0x97e5aa1e3199b60f), U64(0x0000000000000000),
925
		U64(0xf4b404629df10e31), U64(0x5564db44a6719322),
926
		U64(0x9207961a59afec0d), U64(0x9624a6b88b97a45c),
927
		U64(0x363575380a192b1c), U64(0x2c60cd82b595a241),
928
		U64(0x7d272664c1dc7932), U64(0x7142769faa94a1c1),
929
		U64(0xa1d0df263b809d13), U64(0x1630e841d4c451ae),
930
		U64(0xc1df65ad44fa13d8), U64(0x13d2d445bcf20bac),
931
		U64(0xd915c546926abe23), U64(0x38cf3d92084dd749),
932
		U64(0xe766d0272103059d), U64(0xc7634d5effde7f2f),
933
		U64(0x077d2455012a7ea4), U64(0xedbfa82ff16fb199),
934
		U64(0xaf2a978c39d46146), U64(0x42953fa3c8bbd0df),
935
		U64(0xcb061da59496a7dc), U64(0x25e7a17db6eb20b0),
936
		U64(0x34aa6d6963050fba), U64(0xa76cf7d580a4f1e4),
937
		U64(0xf7ea10954ee338c4), U64(0xfcf2643b24819e93),
938
		U64(0xcf252d0746aeef8d), U64(0x4ef06f58a3f3082c),
939
		U64(0x563acfb37563a5d7), U64(0x5086e740ce47c920),
940
		U64(0x2982f186dda3f843), U64(0x87696aac5e798b56),
941
		U64(0x5d22bb1d1f010380), U64(0x035e14f7d31236f5),
942
		U64(0x3cec0d30da759f18), U64(0xf3c920379cdb7095),
943
		U64(0xb8db736b571e22bb), U64(0xdd36f5e44052f672),
944
		U64(0xaac8ab8851e23b44), U64(0xa857b3d938fe1fe2),
945
		U64(0x17f1e4e76eca43fd), U64(0xec7ea4894b61a3ca),
946
		U64(0x9e62c6e132e734fe), U64(0xd4b1991b432c7483),
947
		U64(0x6ad6c283af163acf), U64(0x1ce9904904a8e5aa),
948
		U64(0x5fbda34c761d2726), U64(0xf910583f4cb7c491),
949
		U64(0xc6a241f845d06d7c), U64(0x4f3163fe19fd1a7f),
950
		U64(0xe99c988d2357f9c8), U64(0x8eee06535d0709a7),
951
		U64(0x0efa48aa0254fc55), U64(0xb4be23903c56fa48),
952
		U64(0x763f52caabbedf65), U64(0xeee1bcd8227d876c),
953
		U64(0xe345e085f33b4dcc), U64(0x3e731561b369bbbe),
954
		U64(0x2843fd2067adea10), U64(0x2adce5710eb1ceb6),
955
		U64(0xb7e03767ef44ccbd), U64(0x8db012a48e153f52),
956
		U64(0x61ceb62dc5749c98), U64(0xe85d942b9959eb9b),
957
		U64(0x4c6f7709caef2c8a), U64(0x84377e5b8d6bbda3),
958
		U64(0x30895dcbb13d47eb), U64(0x74a04a9bc2a2fbc3),
959
		U64(0x6b17ce251518289c), U64(0xe438c4d0f2113368),
960
		U64(0x1fb784bed7bad35f), U64(0x9b80fae55ad16efc),
961
		U64(0x77fe5e6c11b0cd36), U64(0xc858095247849129),
962
		U64(0x08466059b97090a2), U64(0x01c10ca6ba0e1253),
963
		U64(0x6988d6747c040c3a), U64(0x6849dad2c60a1e69),
964
		U64(0x5147ebe67449db73), U64(0xc99905f4fd8a837a),
965
		U64(0x991fe2b433cd4a5a), U64(0xf09734c04fc94660),
966
		U64(0xa28ecbd1e892abe6), U64(0xf1563866f5c75433),
967
		U64(0x4dae7baf70e13ed9), U64(0x7ce62ac27bd26b61),
968
		U64(0x70837a39109ab392), U64(0x90988e4b30b3c8ab),
969
		U64(0xb2020b63877296bf), U64(0x156efcb607d6675b)
970
	}, { /* 7 */
971
		U64(0xe63f55ce97c331d0), U64(0x25b506b0015bba16),
972
		U64(0xc8706e29e6ad9ba8), U64(0x5b43d3775d521f6a),
973
		U64(0x0bfa3d577035106e), U64(0xab95fc172afb0e66),
974
		U64(0xf64b63979e7a3276), U64(0xf58b4562649dad4b),
975
		U64(0x48f7c3dbae0c83f1), U64(0xff31916642f5c8c5),
976
		U64(0xcbb048dc1c4a0495), U64(0x66b8f83cdf622989),
977
		U64(0x35c130e908e2b9b0), U64(0x7c761a61f0b34fa1),
978
		U64(0x3601161cf205268d), U64(0x9e54ccfe2219b7d6),
979
		U64(0x8b7d90a538940837), U64(0x9cd403588ea35d0b),
980
		U64(0xbc3c6fea9ccc5b5a), U64(0xe5ff733b6d24aeed),
981
		U64(0xceed22de0f7eb8d2), U64(0xec8581cab1ab545e),
982
		U64(0xb96105e88ff8e71d), U64(0x8ca03501871a5ead),
983
		U64(0x76ccce65d6db2a2f), U64(0x5883f582a7b58057),
984
		U64(0x3f7be4ed2e8adc3e), U64(0x0fe7be06355cd9c9),
985
		U64(0xee054e6c1d11be83), U64(0x1074365909b903a6),
986
		U64(0x5dde9f80b4813c10), U64(0x4a770c7d02b6692c),
987
		U64(0x5379c8d5d7809039), U64(0xb4067448161ed409),
988
		U64(0x5f5e5026183bd6cd), U64(0xe898029bf4c29df9),
989
		U64(0x7fb63c940a54d09c), U64(0xc5171f897f4ba8bc),
990
		U64(0xa6f28db7b31d3d72), U64(0x2e4f3be7716eaa78),
991
		U64(0x0d6771a099e63314), U64(0x82076254e41bf284),
992
		U64(0x2f0fd2b42733df98), U64(0x5c9e76d3e2dc49f0),
993
		U64(0x7aeb569619606cdb), U64(0x83478b07b2468764),
994
		U64(0xcfadcb8d5923cd32), U64(0x85dac7f05b95a41e),
995
		U64(0xb5469d1b4043a1e9), U64(0xb821ecbbd9a592fd),
996
		U64(0x1b8e0b0e798c13c8), U64(0x62a57b6d9a0be02e),
997
		U64(0xfcf1b793b81257f8), U64(0x9d94ea0bd8fe28eb),
998
		U64(0x4cea408aeb654a56), U64(0x23284a47e888996c),
999
		U64(0x2d8f1d128b893545), U64(0xf4cbac3132c0d8ab),
1000
		U64(0xbd7c86b9ca912eba), U64(0x3a268eef3dbe6079),
1001
		U64(0xf0d62f6077a9110c), U64(0x2735c916ade150cb),
1002
		U64(0x89fd5f03942ee2ea), U64(0x1acee25d2fd16628),
1003
		U64(0x90f39bab41181bff), U64(0x430dfe8cde39939f),
1004
		U64(0xf70b8ac4c8274796), U64(0x1c53aeaac6024552),
1005
		U64(0x13b410acf35e9c9b), U64(0xa532ab4249faa24f),
1006
		U64(0x2b1251e5625a163f), U64(0xd7e3e676da4841c7),
1007
		U64(0xa7b264e4e5404892), U64(0xda8497d643ae72d3),
1008
		U64(0x861ae105a1723b23), U64(0x38a6414991048aa4),
1009
		U64(0x6578dec92585b6b4), U64(0x0280cfa6acbaeadd),
1010
		U64(0x88bdb650c273970a), U64(0x9333bd5ebbff84c2),
1011
		U64(0x4e6a8f2c47dfa08b), U64(0x321c954db76cef2a),
1012
		U64(0x418d312a72837942), U64(0xb29b38bfffcdf773),
1013
		U64(0x6c022c38f90a4c07), U64(0x5a033a240b0f6a8a),
1014
		U64(0x1f93885f3ce5da6f), U64(0xc38a537e96988bc6),
1015
		U64(0x39e6a81ac759ff44), U64(0x29929e43cee0fce2),
1016
		U64(0x40cdd87924de0ca2), U64(0xe9d8ebc8a29fe819),
1017
		U64(0x0c2798f3cfbb46f4), U64(0x55e484223e53b343),
1018
		U64(0x4650948ecd0d2fd8), U64(0x20e86cb2126f0651),
1019
		U64(0x6d42c56baf5739e7), U64(0xa06fc1405ace1e08),
1020
		U64(0x7babbfc54f3d193b), U64(0x424d17df8864e67f),
1021
		U64(0xd8045870ef14980e), U64(0xc6d7397c85ac3781),
1022
		U64(0x21a885e1443273b1), U64(0x67f8116f893f5c69),
1023
		U64(0x24f5efe35706cff6), U64(0xd56329d076f2ab1a),
1024
		U64(0x5e1eb9754e66a32d), U64(0x28d2771098bd8902),
1025
		U64(0x8f6013f47dfdc190), U64(0x17a993fdb637553c),
1026
		U64(0xe0a219397e1012aa), U64(0x786b9930b5da8606),
1027
		U64(0x6e82e39e55b0a6da), U64(0x875a0856f72f4ec3),
1028
		U64(0x3741ff4fa458536d), U64(0xac4859b3957558fc),
1029
		U64(0x7ef6d5c75c09a57c), U64(0xc04a758b6c7f14fb),
1030
		U64(0xf9acdd91ab26ebbf), U64(0x7391a467c5ef9668),
1031
		U64(0x335c7c1ee1319aca), U64(0xa91533b18641e4bb),
1032
		U64(0xe4bf9a683b79db0d), U64(0x8e20faa72ba0b470),
1033
		U64(0x51f907737b3a7ae4), U64(0x2268a314bed5ec8c),
1034
		U64(0xd944b123b949edee), U64(0x31dcb3b84d8b7017),
1035
		U64(0xd3fe65279f218860), U64(0x097af2f1dc8ffab3),
1036
		U64(0x9b09a6fc312d0b91), U64(0xcc6ded78a3c4520f),
1037
		U64(0x3481d9ba5ebfcc50), U64(0x4f2a667f1182d56b),
1038
		U64(0xdfd9fdd4509ace94), U64(0x26752045fbbc252b),
1039
		U64(0xbffc491f662bc467), U64(0xdd593272fc202449),
1040
		U64(0x3cbbc218d46d4303), U64(0x91b372f817456e1f),
1041
		U64(0x681faf69bc6385a0), U64(0xb686bbeebaa43ed4),
1042
		U64(0x1469b5084cd0ca01), U64(0x98c98009cbca94ac),
1043
		U64(0x6438379a73d8c354), U64(0xc2caba2dc0c5fe26),
1044
		U64(0x3e3b0dbe78d7a9de), U64(0x50b9ee202d670f04),
1045
		U64(0x4590b27b37eab0e5), U64(0x6025b4cb36b10af3),
1046
		U64(0xfb2c1237079c0162), U64(0xa12f28130c936be8),
1047
		U64(0x4b37e52e54eb1ccc), U64(0x083a1ba28ad28f53),
1048
		U64(0xc10a9cd83a22611b), U64(0x9f1425ad7444c236),
1049
		U64(0x069d4cf7e9d3237a), U64(0xedc56899e7f621be),
1050
		U64(0x778c273680865fcf), U64(0x309c5aeb1bd605f7),
1051
		U64(0x8de0dc52d1472b4d), U64(0xf8ec34c2fd7b9e5f),
1052
		U64(0xea18cd3d58787724), U64(0xaad515447ca67b86),
1053
		U64(0x9989695a9d97e14c), U64(0x0000000000000000),
1054
		U64(0xf196c63321f464ec), U64(0x71116bc169557cb5),
1055
		U64(0xaf887f466f92c7c1), U64(0x972e3e0ffe964d65),
1056
		U64(0x190ec4a8d536f915), U64(0x95aef1a9522ca7b8),
1057
		U64(0xdc19db21aa7d51a9), U64(0x94ee18fa0471d258),
1058
		U64(0x8087adf248a11859), U64(0xc457f6da2916dd5c),
1059
		U64(0xfa6cfb6451c17482), U64(0xf256e0c6db13fbd1),
1060
		U64(0x6a9f60cf10d96f7d), U64(0x4daaa9d9bd383fb6),
1061
		U64(0x03c026f5fae79f3d), U64(0xde99148706c7bb74),
1062
		U64(0x2a52b8b6340763df), U64(0x6fc20acd03edd33a),
1063
		U64(0xd423c08320afdefa), U64(0xbbe1ca4e23420dc0),
1064
		U64(0x966ed75ca8cb3885), U64(0xeb58246e0e2502c4),
1065
		U64(0x055d6a021334bc47), U64(0xa47242111fa7d7af),
1066
		U64(0xe3623fcc84f78d97), U64(0x81c744a11efc6db9),
1067
		U64(0xaec8961539cfb221), U64(0xf31609958d4e8e31),
1068
		U64(0x63e5923ecc5695ce), U64(0x47107ddd9b505a38),
1069
		U64(0xa3afe7b5a0298135), U64(0x792b7063e387f3e6),
1070
		U64(0x0140e953565d75e0), U64(0x12f4f9ffa503e97b),
1071
		U64(0x750ce8902c3cb512), U64(0xdbc47e8515f30733),
1072
		U64(0x1ed3610c6ab8af8f), U64(0x5239218681dde5d9),
1073
		U64(0xe222d69fd2aaf877), U64(0xfe71783514a8bd25),
1074
		U64(0xcaf0a18f4a177175), U64(0x61655d9860ec7f13),
1075
		U64(0xe77fbc9dc19e4430), U64(0x2ccff441ddd440a5),
1076
		U64(0x16e97aaee06a20dc), U64(0xa855dae2d01c915b),
1077
		U64(0x1d1347f9905f30b2), U64(0xb7c652bdecf94b34),
1078
		U64(0xd03e43d265c6175d), U64(0xfdb15ec0ee4f2218),
1079
		U64(0x57644b8492e9599e), U64(0x07dda5a4bf8e569a),
1080
		U64(0x54a46d71680ec6a3), U64(0x5624a2d7c4b42c7e),
1081
		U64(0xbebca04c3076b187), U64(0x7d36f332a6ee3a41),
1082
		U64(0x3b6667bc6be31599), U64(0x695f463aea3ef040),
1083
		U64(0xad08b0e0c3282d1c), U64(0xb15b1e4a052a684e),
1084
		U64(0x44d05b2861b7c505), U64(0x15295c5b1a8dbfe1),
1085
		U64(0x744c01c37a61c0f2), U64(0x59c31cd1f1e8f5b7),
1086
		U64(0xef45a73f4b4ccb63), U64(0x6bdf899c46841a9d),
1087
		U64(0x3dfb2b4b823036e3), U64(0xa2ef0ee6f674f4d5),
1088
		U64(0x184e2dfb836b8cf5), U64(0x1134df0a5fe47646),
1089
		U64(0xbaa1231d751f7820), U64(0xd17eaa81339b62bd),
1090
		U64(0xb01bf71953771dae), U64(0x849a2ea30dc8d1fe),
1091
		U64(0x705182923f080955), U64(0x0ea757556301ac29),
1092
		U64(0x041d83514569c9a7), U64(0x0abad4042668658e),
1093
		U64(0x49b72a88f851f611), U64(0x8a3d79f66ec97dd7),
1094
		U64(0xcd2d042bf59927ef), U64(0xc930877ab0f0ee48),
1095
		U64(0x9273540deda2f122), U64(0xc797d02fd3f14261),
1096
		U64(0xe1e2f06a284d674a), U64(0xd2be8c74c97cfd80),
1097
		U64(0x9a494faf67707e71), U64(0xb3dbd1eca9908293),
1098
		U64(0x72d14d3493b2e388), U64(0xd6a30f258c153427)
1099
	},
1100
};
1101
1102
static const STREEBOG_LONG64 C16[12][8] = {
1103
	{
1104
		U64(0xdd806559f2a64507), U64(0x05767436cc744d23),
1105
		U64(0xa2422a08a460d315), U64(0x4b7ce09192676901),
1106
		U64(0x714eb88d7585c4fc), U64(0x2f6a76432e45d016),
1107
		U64(0xebcb2f81c0657c1f), U64(0xb1085bda1ecadae9)
1108
	}, {
1109
		U64(0xe679047021b19bb7), U64(0x55dda21bd7cbcd56),
1110
		U64(0x5cb561c2db0aa7ca), U64(0x9ab5176b12d69958),
1111
		U64(0x61d55e0f16b50131), U64(0xf3feea720a232b98),
1112
		U64(0x4fe39d460f70b5d7), U64(0x6fa3b58aa99d2f1a)
1113
	}, {
1114
		U64(0x991e96f50aba0ab2), U64(0xc2b6f443867adb31),
1115
		U64(0xc1c93a376062db09), U64(0xd3e20fe490359eb1),
1116
		U64(0xf2ea7514b1297b7b), U64(0x06f15e5f529c1f8b),
1117
		U64(0x0a39fc286a3d8435), U64(0xf574dcac2bce2fc7)
1118
	}, {
1119
		U64(0x220cbebc84e3d12e), U64(0x3453eaa193e837f1),
1120
		U64(0xd8b71333935203be), U64(0xa9d72c82ed03d675),
1121
		U64(0x9d721cad685e353f), U64(0x488e857e335c3c7d),
1122
		U64(0xf948e1a05d71e4dd), U64(0xef1fdfb3e81566d2)
1123
	}, {
1124
		U64(0x601758fd7c6cfe57), U64(0x7a56a27ea9ea63f5),
1125
		U64(0xdfff00b723271a16), U64(0xbfcd1747253af5a3),
1126
		U64(0x359e35d7800fffbd), U64(0x7f151c1f1686104a),
1127
		U64(0x9a3f410c6ca92363), U64(0x4bea6bacad474799)
1128
	}, {
1129
		U64(0xfa68407a46647d6e), U64(0xbf71c57236904f35),
1130
		U64(0x0af21f66c2bec6b6), U64(0xcffaa6b71c9ab7b4),
1131
		U64(0x187f9ab49af08ec6), U64(0x2d66c4f95142a46c),
1132
		U64(0x6fa4c33b7a3039c0), U64(0xae4faeae1d3ad3d9)
1133
	}, {
1134
		U64(0x8886564d3a14d493), U64(0x3517454ca23c4af3),
1135
		U64(0x06476983284a0504), U64(0x0992abc52d822c37),
1136
		U64(0xd3473e33197a93c9), U64(0x399ec6c7e6bf87c9),
1137
		U64(0x51ac86febf240954), U64(0xf4c70e16eeaac5ec)
1138
	}, {
1139
		U64(0xa47f0dd4bf02e71e), U64(0x36acc2355951a8d9),
1140
		U64(0x69d18d2bd1a5c42f), U64(0xf4892bcb929b0690),
1141
		U64(0x89b4443b4ddbc49a), U64(0x4eb7f8719c36de1e),
1142
		U64(0x03e7aa020c6e4141), U64(0x9b1f5b424d93c9a7)
1143
	}, {
1144
		U64(0x7261445183235adb), U64(0x0e38dc92cb1f2a60),
1145
		U64(0x7b2b8a9aa6079c54), U64(0x800a440bdbb2ceb1),
1146
		U64(0x3cd955b7e00d0984), U64(0x3a7d3a1b25894224),
1147
		U64(0x944c9ad8ec165fde), U64(0x378f5a541631229b)
1148
	}, {
1149
		U64(0x74b4c7fb98459ced), U64(0x3698fad1153bb6c3),
1150
		U64(0x7a1e6c303b7652f4), U64(0x9fe76702af69334b),
1151
		U64(0x1fffe18a1b336103), U64(0x8941e71cff8a78db),
1152
		U64(0x382ae548b2e4f3f3), U64(0xabbedea680056f52)
1153
	}, {
1154
		U64(0x6bcaa4cd81f32d1b), U64(0xdea2594ac06fd85d),
1155
		U64(0xefbacd1d7d476e98), U64(0x8a1d71efea48b9ca),
1156
		U64(0x2001802114846679), U64(0xd8fa6bbbebab0761),
1157
		U64(0x3002c6cd635afe94), U64(0x7bcd9ed0efc889fb)
1158
	}, {
1159
		U64(0x48bc924af11bd720), U64(0xfaf417d5d9b21b99),
1160
		U64(0xe71da4aa88e12852), U64(0x5d80ef9d1891cc86),
1161
		U64(0xf82012d430219f9b), U64(0xcda43c32bcdf1d77),
1162
		U64(0xd21380b00449b17a), U64(0x378ee767f11631ba)
1163
	},
1164
};
1165
1166
#define B(x,i,j)	(((STREEBOG_LONG64)(*(((const unsigned char *)(&x))+i)))<<(j*8))
1167
#define PULL64(x) (B(x,0,0)|B(x,1,1)|B(x,2,2)|B(x,3,3)|B(x,4,4)|B(x,5,5)|B(x,6,6)|B(x,7,7))
1168
#define SWAB64(x) (B(x,0,7)|B(x,1,6)|B(x,2,5)|B(x,3,4)|B(x,4,3)|B(x,5,2)|B(x,6,1)|B(x,7,0))
1169
1170
static inline STREEBOG_LONG64
1171
multipermute(const STREEBOG_LONG64 *in, int i)
1172
{
1173
	STREEBOG_LONG64 t = 0;
1174
1175
6727200
	t ^= A_PI_table[0][(in[0] >> (i * 8)) & 0xff];
1176
3363600
	t ^= A_PI_table[1][(in[1] >> (i * 8)) & 0xff];
1177
3363600
	t ^= A_PI_table[2][(in[2] >> (i * 8)) & 0xff];
1178
3363600
	t ^= A_PI_table[3][(in[3] >> (i * 8)) & 0xff];
1179
3363600
	t ^= A_PI_table[4][(in[4] >> (i * 8)) & 0xff];
1180
3363600
	t ^= A_PI_table[5][(in[5] >> (i * 8)) & 0xff];
1181
3363600
	t ^= A_PI_table[6][(in[6] >> (i * 8)) & 0xff];
1182
3363600
	t ^= A_PI_table[7][(in[7] >> (i * 8)) & 0xff];
1183
1184
3363600
	return t;
1185
}
1186
1187
static void
1188
transform(STREEBOG_LONG64 *out, const STREEBOG_LONG64 *a,
1189
    const STREEBOG_LONG64 *b)
1190
{
1191
840900
	STREEBOG_LONG64 tmp[8];
1192
1193
420450
	tmp[0] = a[0] ^ b[0];
1194
420450
	tmp[1] = a[1] ^ b[1];
1195
420450
	tmp[2] = a[2] ^ b[2];
1196
420450
	tmp[3] = a[3] ^ b[3];
1197
420450
	tmp[4] = a[4] ^ b[4];
1198
420450
	tmp[5] = a[5] ^ b[5];
1199
420450
	tmp[6] = a[6] ^ b[6];
1200
420450
	tmp[7] = a[7] ^ b[7];
1201
1202
420450
	out[0] = multipermute(tmp, 0);
1203
420450
	out[1] = multipermute(tmp, 1);
1204
420450
	out[2] = multipermute(tmp, 2);
1205
420450
	out[3] = multipermute(tmp, 3);
1206
420450
	out[4] = multipermute(tmp, 4);
1207
420450
	out[5] = multipermute(tmp, 5);
1208
420450
	out[6] = multipermute(tmp, 6);
1209
420450
	out[7] = multipermute(tmp, 7);
1210
420450
}
1211
1212
static inline void
1213
gN(STREEBOG_LONG64 *h, STREEBOG_LONG64 *m, STREEBOG_LONG64 *N)
1214
{
1215
33636
	STREEBOG_LONG64 K[8];
1216
16818
	STREEBOG_LONG64 T[8];
1217
	int i;
1218
1219
16818
	transform(K, h, N);
1220
1221
16818
	transform(T, K, m);
1222
16818
	transform(K, K, C16[0]);
1223
403632
	for (i = 1; i < 12; i++) {
1224
184998
		transform(T, K, T);
1225
184998
		transform(K, K, C16[i]);
1226
	}
1227
1228
16818
	h[0] ^= T[0] ^ K[0] ^ m[0];
1229
16818
	h[1] ^= T[1] ^ K[1] ^ m[1];
1230
16818
	h[2] ^= T[2] ^ K[2] ^ m[2];
1231
16818
	h[3] ^= T[3] ^ K[3] ^ m[3];
1232
16818
	h[4] ^= T[4] ^ K[4] ^ m[4];
1233
16818
	h[5] ^= T[5] ^ K[5] ^ m[5];
1234
16818
	h[6] ^= T[6] ^ K[6] ^ m[6];
1235
16818
	h[7] ^= T[7] ^ K[7] ^ m[7];
1236
16818
}
1237
1238
1239
static void
1240
streebog_single_block(STREEBOG_CTX *ctx, const unsigned char *in, size_t num)
1241
{
1242
18156
	STREEBOG_LONG64 M[8], l;
1243
	int i;
1244
1245
163404
	for (i = 0; i < 8; i++)
1246
72624
		M[i] = PULL64(in[i*8]);
1247
1248
9078
	gN(ctx->h, M, ctx->N);
1249
1250
9078
	l = ctx->N[0];
1251
9078
	ctx->N[0] += num;
1252
1253

18156
	if (ctx->N[0] < l || ctx->N[0] < num) {
1254
		for (i = 1; i < 8; i++) {
1255
			ctx->N[i]++;
1256
			if (ctx->N[i] != 0)
1257
				break;
1258
		}
1259
	}
1260
1261
9078
	ctx->Sigma[0] += M[0];
1262
145248
	for (i = 1; i < 8; i++)
1263
63546
		if (ctx->Sigma[i-1] < M[i-1])
1264
5772
			ctx->Sigma[i] += M[i] + 1;
1265
		else
1266
			ctx->Sigma[i] += M[i];
1267
9078
}
1268
1269
1270
1271
static void
1272
streebog_block_data_order(STREEBOG_CTX *ctx, const unsigned char *in,
1273
    size_t num)
1274
{
1275
	int i;
1276
1277
26040
	for (i = 0; i < num; i++)
1278
5208
		streebog_single_block(ctx, in + i * STREEBOG_CBLOCK, 64 * 8);
1279
5208
}
1280
1281
int
1282
STREEBOG512_Final(unsigned char *md, STREEBOG_CTX *c)
1283
{
1284
7740
	unsigned char *p = (unsigned char *)c->data;
1285
3870
	STREEBOG_LONG64 Z[STREEBOG_LBLOCK] = {0};
1286
	int n;
1287
1288
3870
	if (c->num == STREEBOG_CBLOCK) {
1289
		streebog_block_data_order(c, p, 1);
1290
		c->num -= STREEBOG_CBLOCK;
1291
	}
1292
1293
3870
	n = c->num;
1294
3870
	p[n++] = 1;
1295
3870
	memset(p + n, 0, STREEBOG_CBLOCK - n);
1296
1297
3870
	streebog_single_block(c, p, c->num * 8);
1298
1299
3870
	gN(c->h, c->N, Z);
1300
3870
	gN(c->h, c->Sigma, Z);
1301
1302
69660
	for (n = 0; n < STREEBOG_LBLOCK; n++)
1303
30960
		c->h[n] = SWAB64(c->h[n]);
1304
1305
3870
	if (md == NULL)
1306
		return 0;
1307
1308
3870
	switch (c->md_len) {
1309
		/* Let compiler decide if it's appropriate to unroll... */
1310
	case STREEBOG256_LENGTH:
1311
38550
		for (n = 0; n < STREEBOG256_LENGTH / 8; n++) {
1312
15420
			STREEBOG_LONG64 t = c->h[4+n];
1313
1314
#if BYTE_ORDER == BIG_ENDIAN
1315
			*(md++) = (unsigned char)(t);
1316
			*(md++) = (unsigned char)(t >> 8);
1317
			*(md++) = (unsigned char)(t >> 16);
1318
			*(md++) = (unsigned char)(t >> 24);
1319
			*(md++) = (unsigned char)(t >> 32);
1320
			*(md++) = (unsigned char)(t >> 40);
1321
			*(md++) = (unsigned char)(t >> 48);
1322
			*(md++) = (unsigned char)(t >> 56);
1323
#else
1324
15420
			*(md++) = (unsigned char)(t >> 56);
1325
15420
			*(md++) = (unsigned char)(t >> 48);
1326
15420
			*(md++) = (unsigned char)(t >> 40);
1327
15420
			*(md++) = (unsigned char)(t >> 32);
1328
15420
			*(md++) = (unsigned char)(t >> 24);
1329
15420
			*(md++) = (unsigned char)(t >> 16);
1330
15420
			*(md++) = (unsigned char)(t >> 8);
1331
15420
			*(md++) = (unsigned char)(t);
1332
#endif
1333
		}
1334
		break;
1335
	case STREEBOG512_LENGTH:
1336
270
		for (n = 0; n < STREEBOG512_LENGTH / 8; n++) {
1337
120
			STREEBOG_LONG64 t = c->h[n];
1338
1339
#if BYTE_ORDER == BIG_ENDIAN
1340
			*(md++) = (unsigned char)(t);
1341
			*(md++) = (unsigned char)(t >> 8);
1342
			*(md++) = (unsigned char)(t >> 16);
1343
			*(md++) = (unsigned char)(t >> 24);
1344
			*(md++) = (unsigned char)(t >> 32);
1345
			*(md++) = (unsigned char)(t >> 40);
1346
			*(md++) = (unsigned char)(t >> 48);
1347
			*(md++) = (unsigned char)(t >> 56);
1348
#else
1349
120
			*(md++) = (unsigned char)(t >> 56);
1350
120
			*(md++) = (unsigned char)(t >> 48);
1351
120
			*(md++) = (unsigned char)(t >> 40);
1352
120
			*(md++) = (unsigned char)(t >> 32);
1353
120
			*(md++) = (unsigned char)(t >> 24);
1354
120
			*(md++) = (unsigned char)(t >> 16);
1355
120
			*(md++) = (unsigned char)(t >> 8);
1356
120
			*(md++) = (unsigned char)(t);
1357
#endif
1358
		}
1359
		break;
1360
		/* ... as well as make sure md_len is not abused. */
1361
	default:
1362
		return 0;
1363
	}
1364
1365
3870
	return 1;
1366
3870
}
1367
1368
int
1369
STREEBOG256_Final(unsigned char *md, STREEBOG_CTX * c)
1370
{
1371
7710
	return STREEBOG512_Final(md, c);
1372
}
1373
1374
int
1375
STREEBOG512_Update(STREEBOG_CTX *c, const void *_data, size_t len)
1376
{
1377
28124
	unsigned char *p = (unsigned char *)c->data;
1378
	const unsigned char *data = (const unsigned char *)_data;
1379
1380
14062
	if (len == 0)
1381
6
		return 1;
1382
1383
14056
	if (c->num != 0) {
1384
6336
		size_t n = STREEBOG_CBLOCK - c->num;
1385
1386
6336
		if (len < n) {
1387
4992
			memcpy(p + c->num, data, len);
1388
4992
			c->num += (unsigned int)len;
1389
4992
			return 1;
1390
		} else {
1391
1344
			memcpy(p + c->num, data, n);
1392
1344
			c->num = 0;
1393
1344
			len -= n;
1394
1344
			data += n;
1395
1344
			streebog_block_data_order(c, p, 1);
1396
		}
1397
1344
	}
1398
1399
9064
	if (len >= STREEBOG_CBLOCK) {
1400
3864
		streebog_block_data_order(c, data, len / STREEBOG_CBLOCK);
1401
3864
		data += len;
1402
3864
		len %= STREEBOG_CBLOCK;
1403
3864
		data -= len;
1404
3864
	}
1405
1406
9064
	if (len != 0) {
1407
5206
		memcpy(p, data, len);
1408
5206
		c->num = (int)len;
1409
5206
	}
1410
1411
9064
	return 1;
1412
14062
}
1413
1414
int
1415
STREEBOG256_Update(STREEBOG_CTX *c, const void *data, size_t len)
1416
{
1417
28078
	return STREEBOG512_Update(c, data, len);
1418
}
1419
1420
void
1421
STREEBOG512_Transform(STREEBOG_CTX *c, const unsigned char *data)
1422
{
1423
	streebog_block_data_order(c, data, 1);
1424
}
1425
1426
int
1427
STREEBOG256_Init(STREEBOG_CTX *c)
1428
{
1429
7722
	memset(c, 0, sizeof(*c));
1430
3861
	memset(c->h, 1, sizeof(c->h));
1431
1432
3861
	c->md_len = STREEBOG256_LENGTH;
1433
3861
	return 1;
1434
}
1435
1436
int
1437
STREEBOG512_Init(STREEBOG_CTX *c)
1438
{
1439
42
	memset(c, 0, sizeof(*c));
1440
21
	memset(c->h, 0, sizeof(c->h));
1441
1442
21
	c->num = 0;
1443
21
	c->md_len = STREEBOG512_LENGTH;
1444
21
	return 1;
1445
}
1446
1447
unsigned char *
1448
STREEBOG256(const unsigned char *d, size_t n, unsigned char *md)
1449
{
1450
	STREEBOG_CTX c;
1451
	static unsigned char m[STREEBOG256_LENGTH];
1452
1453
	if (md == NULL)
1454
		md = m;
1455
	STREEBOG256_Init(&c);
1456
	STREEBOG256_Update(&c, d, n);
1457
	STREEBOG256_Final(md, &c);
1458
	explicit_bzero(&c, sizeof(c));
1459
	return (md);
1460
}
1461
1462
unsigned char *
1463
STREEBOG512(const unsigned char *d, size_t n, unsigned char *md)
1464
{
1465
	STREEBOG_CTX c;
1466
	static unsigned char m[STREEBOG512_LENGTH];
1467
1468
	if (md == NULL)
1469
		md = m;
1470
	STREEBOG512_Init(&c);
1471
	STREEBOG512_Update(&c, d, n);
1472
	STREEBOG512_Final(md, &c);
1473
	explicit_bzero(&c, sizeof(c));
1474
	return (md);
1475
}
1476
1477
#endif