1 /* $OpenBSD: streebog.c,v 1.6 2019/05/09 22:54:28 tb 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 	t ^= A_PI_table[0][(in[0] >> (i * 8)) & 0xff];
1176 	t ^= A_PI_table[1][(in[1] >> (i * 8)) & 0xff];
1177 	t ^= A_PI_table[2][(in[2] >> (i * 8)) & 0xff];
1178 	t ^= A_PI_table[3][(in[3] >> (i * 8)) & 0xff];
1179 	t ^= A_PI_table[4][(in[4] >> (i * 8)) & 0xff];
1180 	t ^= A_PI_table[5][(in[5] >> (i * 8)) & 0xff];
1181 	t ^= A_PI_table[6][(in[6] >> (i * 8)) & 0xff];
1182 	t ^= A_PI_table[7][(in[7] >> (i * 8)) & 0xff];
1183 
1184 	return t;
1185 }
1186 
1187 static void
1188 transform(STREEBOG_LONG64 *out, const STREEBOG_LONG64 *a,
1189     const STREEBOG_LONG64 *b)
1190 {
1191 	STREEBOG_LONG64 tmp[8];
1192 
1193 	tmp[0] = a[0] ^ b[0];
1194 	tmp[1] = a[1] ^ b[1];
1195 	tmp[2] = a[2] ^ b[2];
1196 	tmp[3] = a[3] ^ b[3];
1197 	tmp[4] = a[4] ^ b[4];
1198 	tmp[5] = a[5] ^ b[5];
1199 	tmp[6] = a[6] ^ b[6];
1200 	tmp[7] = a[7] ^ b[7];
1201 
1202 	out[0] = multipermute(tmp, 0);
1203 	out[1] = multipermute(tmp, 1);
1204 	out[2] = multipermute(tmp, 2);
1205 	out[3] = multipermute(tmp, 3);
1206 	out[4] = multipermute(tmp, 4);
1207 	out[5] = multipermute(tmp, 5);
1208 	out[6] = multipermute(tmp, 6);
1209 	out[7] = multipermute(tmp, 7);
1210 }
1211 
1212 static inline void
1213 gN(STREEBOG_LONG64 *h, STREEBOG_LONG64 *m, STREEBOG_LONG64 *N)
1214 {
1215 	STREEBOG_LONG64 K[8];
1216 	STREEBOG_LONG64 T[8];
1217 	int i;
1218 
1219 	transform(K, h, N);
1220 
1221 	transform(T, K, m);
1222 	transform(K, K, C16[0]);
1223 	for (i = 1; i < 12; i++) {
1224 		transform(T, K, T);
1225 		transform(K, K, C16[i]);
1226 	}
1227 
1228 	h[0] ^= T[0] ^ K[0] ^ m[0];
1229 	h[1] ^= T[1] ^ K[1] ^ m[1];
1230 	h[2] ^= T[2] ^ K[2] ^ m[2];
1231 	h[3] ^= T[3] ^ K[3] ^ m[3];
1232 	h[4] ^= T[4] ^ K[4] ^ m[4];
1233 	h[5] ^= T[5] ^ K[5] ^ m[5];
1234 	h[6] ^= T[6] ^ K[6] ^ m[6];
1235 	h[7] ^= T[7] ^ K[7] ^ m[7];
1236 }
1237 
1238 
1239 static void
1240 streebog_single_block(STREEBOG_CTX *ctx, const unsigned char *in, size_t num)
1241 {
1242 	STREEBOG_LONG64 M[8], l;
1243 	STREEBOG_LONG64 CF;
1244 	int i;
1245 
1246 	for (i = 0; i < 8; i++)
1247 		M[i] = PULL64(in[i*8]);
1248 
1249 	gN(ctx->h, M, ctx->N);
1250 
1251 	l = ctx->N[0];
1252 	ctx->N[0] += num;
1253 
1254 	if (ctx->N[0] < l || ctx->N[0] < num) {
1255 		for (i = 1; i < 8; i++) {
1256 			ctx->N[i]++;
1257 			if (ctx->N[i] != 0)
1258 				break;
1259 		}
1260 	}
1261 
1262 	CF = 0;
1263 	ctx->Sigma[0] += M[0];
1264 	for (i = 1; i < 8; i++) {
1265 		if (ctx->Sigma[i-1] != M[i-1])
1266 			CF = (ctx->Sigma[i-1] < M[i-1]);
1267 		ctx->Sigma[i] += M[i] + CF;
1268 	}
1269 }
1270 
1271 
1272 
1273 static void
1274 streebog_block_data_order(STREEBOG_CTX *ctx, const unsigned char *in,
1275     size_t num)
1276 {
1277 	int i;
1278 
1279 	for (i = 0; i < num; i++)
1280 		streebog_single_block(ctx, in + i * STREEBOG_CBLOCK, 64 * 8);
1281 }
1282 
1283 int
1284 STREEBOG512_Final(unsigned char *md, STREEBOG_CTX *c)
1285 {
1286 	unsigned char *p = (unsigned char *)c->data;
1287 	STREEBOG_LONG64 Z[STREEBOG_LBLOCK] = {0};
1288 	int n;
1289 
1290 	if (c->num == STREEBOG_CBLOCK) {
1291 		streebog_block_data_order(c, p, 1);
1292 		c->num -= STREEBOG_CBLOCK;
1293 	}
1294 
1295 	n = c->num;
1296 	p[n++] = 1;
1297 	memset(p + n, 0, STREEBOG_CBLOCK - n);
1298 
1299 	streebog_single_block(c, p, c->num * 8);
1300 
1301 	gN(c->h, c->N, Z);
1302 	gN(c->h, c->Sigma, Z);
1303 
1304 	for (n = 0; n < STREEBOG_LBLOCK; n++)
1305 		c->h[n] = SWAB64(c->h[n]);
1306 
1307 	if (md == NULL)
1308 		return 0;
1309 
1310 	switch (c->md_len) {
1311 		/* Let compiler decide if it's appropriate to unroll... */
1312 	case STREEBOG256_LENGTH:
1313 		for (n = 0; n < STREEBOG256_LENGTH / 8; n++) {
1314 			STREEBOG_LONG64 t = c->h[4+n];
1315 
1316 #if BYTE_ORDER == BIG_ENDIAN
1317 			*(md++) = (unsigned char)(t);
1318 			*(md++) = (unsigned char)(t >> 8);
1319 			*(md++) = (unsigned char)(t >> 16);
1320 			*(md++) = (unsigned char)(t >> 24);
1321 			*(md++) = (unsigned char)(t >> 32);
1322 			*(md++) = (unsigned char)(t >> 40);
1323 			*(md++) = (unsigned char)(t >> 48);
1324 			*(md++) = (unsigned char)(t >> 56);
1325 #else
1326 			*(md++) = (unsigned char)(t >> 56);
1327 			*(md++) = (unsigned char)(t >> 48);
1328 			*(md++) = (unsigned char)(t >> 40);
1329 			*(md++) = (unsigned char)(t >> 32);
1330 			*(md++) = (unsigned char)(t >> 24);
1331 			*(md++) = (unsigned char)(t >> 16);
1332 			*(md++) = (unsigned char)(t >> 8);
1333 			*(md++) = (unsigned char)(t);
1334 #endif
1335 		}
1336 		break;
1337 	case STREEBOG512_LENGTH:
1338 		for (n = 0; n < STREEBOG512_LENGTH / 8; n++) {
1339 			STREEBOG_LONG64 t = c->h[n];
1340 
1341 #if BYTE_ORDER == BIG_ENDIAN
1342 			*(md++) = (unsigned char)(t);
1343 			*(md++) = (unsigned char)(t >> 8);
1344 			*(md++) = (unsigned char)(t >> 16);
1345 			*(md++) = (unsigned char)(t >> 24);
1346 			*(md++) = (unsigned char)(t >> 32);
1347 			*(md++) = (unsigned char)(t >> 40);
1348 			*(md++) = (unsigned char)(t >> 48);
1349 			*(md++) = (unsigned char)(t >> 56);
1350 #else
1351 			*(md++) = (unsigned char)(t >> 56);
1352 			*(md++) = (unsigned char)(t >> 48);
1353 			*(md++) = (unsigned char)(t >> 40);
1354 			*(md++) = (unsigned char)(t >> 32);
1355 			*(md++) = (unsigned char)(t >> 24);
1356 			*(md++) = (unsigned char)(t >> 16);
1357 			*(md++) = (unsigned char)(t >> 8);
1358 			*(md++) = (unsigned char)(t);
1359 #endif
1360 		}
1361 		break;
1362 		/* ... as well as make sure md_len is not abused. */
1363 	default:
1364 		return 0;
1365 	}
1366 
1367 	return 1;
1368 }
1369 
1370 int
1371 STREEBOG256_Final(unsigned char *md, STREEBOG_CTX * c)
1372 {
1373 	return STREEBOG512_Final(md, c);
1374 }
1375 
1376 int
1377 STREEBOG512_Update(STREEBOG_CTX *c, const void *_data, size_t len)
1378 {
1379 	unsigned char *p = (unsigned char *)c->data;
1380 	const unsigned char *data = (const unsigned char *)_data;
1381 
1382 	if (len == 0)
1383 		return 1;
1384 
1385 	if (c->num != 0) {
1386 		size_t n = STREEBOG_CBLOCK - c->num;
1387 
1388 		if (len < n) {
1389 			memcpy(p + c->num, data, len);
1390 			c->num += (unsigned int)len;
1391 			return 1;
1392 		} else {
1393 			memcpy(p + c->num, data, n);
1394 			c->num = 0;
1395 			len -= n;
1396 			data += n;
1397 			streebog_block_data_order(c, p, 1);
1398 		}
1399 	}
1400 
1401 	if (len >= STREEBOG_CBLOCK) {
1402 		streebog_block_data_order(c, data, len / STREEBOG_CBLOCK);
1403 		data += len;
1404 		len %= STREEBOG_CBLOCK;
1405 		data -= len;
1406 	}
1407 
1408 	if (len != 0) {
1409 		memcpy(p, data, len);
1410 		c->num = (int)len;
1411 	}
1412 
1413 	return 1;
1414 }
1415 
1416 int
1417 STREEBOG256_Update(STREEBOG_CTX *c, const void *data, size_t len)
1418 {
1419 	return STREEBOG512_Update(c, data, len);
1420 }
1421 
1422 void
1423 STREEBOG512_Transform(STREEBOG_CTX *c, const unsigned char *data)
1424 {
1425 	streebog_block_data_order(c, data, 1);
1426 }
1427 
1428 int
1429 STREEBOG256_Init(STREEBOG_CTX *c)
1430 {
1431 	memset(c, 0, sizeof(*c));
1432 	memset(c->h, 1, sizeof(c->h));
1433 
1434 	c->md_len = STREEBOG256_LENGTH;
1435 	return 1;
1436 }
1437 
1438 int
1439 STREEBOG512_Init(STREEBOG_CTX *c)
1440 {
1441 	memset(c, 0, sizeof(*c));
1442 	memset(c->h, 0, sizeof(c->h));
1443 
1444 	c->num = 0;
1445 	c->md_len = STREEBOG512_LENGTH;
1446 	return 1;
1447 }
1448 
1449 unsigned char *
1450 STREEBOG256(const unsigned char *d, size_t n, unsigned char *md)
1451 {
1452 	STREEBOG_CTX c;
1453 	static unsigned char m[STREEBOG256_LENGTH];
1454 
1455 	if (md == NULL)
1456 		md = m;
1457 	STREEBOG256_Init(&c);
1458 	STREEBOG256_Update(&c, d, n);
1459 	STREEBOG256_Final(md, &c);
1460 	explicit_bzero(&c, sizeof(c));
1461 	return (md);
1462 }
1463 
1464 unsigned char *
1465 STREEBOG512(const unsigned char *d, size_t n, unsigned char *md)
1466 {
1467 	STREEBOG_CTX c;
1468 	static unsigned char m[STREEBOG512_LENGTH];
1469 
1470 	if (md == NULL)
1471 		md = m;
1472 	STREEBOG512_Init(&c);
1473 	STREEBOG512_Update(&c, d, n);
1474 	STREEBOG512_Final(md, &c);
1475 	explicit_bzero(&c, sizeof(c));
1476 	return (md);
1477 }
1478 
1479 #endif
1480