1 /* tiger.c - The TIGER hash function
2 * Copyright (C) 1998, 2001, 2002, 2003, 2010 Free Software Foundation, Inc.
3 *
4 * This file is part of Libgcrypt.
5 *
6 * Libgcrypt is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser General Public License as
8 * published by the Free Software Foundation; either version 2.1 of
9 * the License, or (at your option) any later version.
10 *
11 * Libgcrypt is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19 */
20
21 /* See http://www.cs.technion.ac.il/~biham/Reports/Tiger/ */
22
23 #include "common.h"
24 #include "tiger.h"
25
26 // Code copied from libgcrypt, version 1.5.0
27 // http://directory.fsf.org/wiki/Libgcrypt
28 // http://www.gnupg.org/download/#libgcrypt
29
30 // Test vectors for the "Fixed" Tiger algorithm
31 // Source: http://www.cs.technion.ac.il/~biham/Reports/Tiger/test-vectors-nessie-format.dat
32 // Inserted by Jesse Kornblum
33 //
34 // Set 1, vector# 0:
35 // message="" (empty string)
36 // hash=3293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3
37 //
38 // Set 1, vector# 1:
39 // message="a"
40 // hash=77BEFBEF2E7EF8AB2EC8F93BF587A7FC613E247F5F247809
41 //
42 // Set 1, vector# 2:
43 // message="abc"
44 // hash=2AAB1484E8C158F2BFB8C5FF41B57A525129131C957B5F93
45 //
46 // Set 1, vector# 3:
47 // message="message digest"
48 // hash=D981F8CB78201A950DCF3048751E441C517FCA1AA55A29F6
49 //
50 // Set 1, vector# 4:
51 // message="abcdefghijklmnopqrstuvwxyz"
52 // hash=1714A472EEE57D30040412BFCC55032A0B11602FF37BEEE9
53
54
55 static uint64_t sbox1[256] = {
56 0x02aab17cf7e90c5eLL /* 0 */, 0xac424b03e243a8ecLL /* 1 */,
57 0x72cd5be30dd5fcd3LL /* 2 */, 0x6d019b93f6f97f3aLL /* 3 */,
58 0xcd9978ffd21f9193LL /* 4 */, 0x7573a1c9708029e2LL /* 5 */,
59 0xb164326b922a83c3LL /* 6 */, 0x46883eee04915870LL /* 7 */,
60 0xeaace3057103ece6LL /* 8 */, 0xc54169b808a3535cLL /* 9 */,
61 0x4ce754918ddec47cLL /* 10 */, 0x0aa2f4dfdc0df40cLL /* 11 */,
62 0x10b76f18a74dbefaLL /* 12 */, 0xc6ccb6235ad1ab6aLL /* 13 */,
63 0x13726121572fe2ffLL /* 14 */, 0x1a488c6f199d921eLL /* 15 */,
64 0x4bc9f9f4da0007caLL /* 16 */, 0x26f5e6f6e85241c7LL /* 17 */,
65 0x859079dbea5947b6LL /* 18 */, 0x4f1885c5c99e8c92LL /* 19 */,
66 0xd78e761ea96f864bLL /* 20 */, 0x8e36428c52b5c17dLL /* 21 */,
67 0x69cf6827373063c1LL /* 22 */, 0xb607c93d9bb4c56eLL /* 23 */,
68 0x7d820e760e76b5eaLL /* 24 */, 0x645c9cc6f07fdc42LL /* 25 */,
69 0xbf38a078243342e0LL /* 26 */, 0x5f6b343c9d2e7d04LL /* 27 */,
70 0xf2c28aeb600b0ec6LL /* 28 */, 0x6c0ed85f7254bcacLL /* 29 */,
71 0x71592281a4db4fe5LL /* 30 */, 0x1967fa69ce0fed9fLL /* 31 */,
72 0xfd5293f8b96545dbLL /* 32 */, 0xc879e9d7f2a7600bLL /* 33 */,
73 0x860248920193194eLL /* 34 */, 0xa4f9533b2d9cc0b3LL /* 35 */,
74 0x9053836c15957613LL /* 36 */, 0xdb6dcf8afc357bf1LL /* 37 */,
75 0x18beea7a7a370f57LL /* 38 */, 0x037117ca50b99066LL /* 39 */,
76 0x6ab30a9774424a35LL /* 40 */, 0xf4e92f02e325249bLL /* 41 */,
77 0x7739db07061ccae1LL /* 42 */, 0xd8f3b49ceca42a05LL /* 43 */,
78 0xbd56be3f51382f73LL /* 44 */, 0x45faed5843b0bb28LL /* 45 */,
79 0x1c813d5c11bf1f83LL /* 46 */, 0x8af0e4b6d75fa169LL /* 47 */,
80 0x33ee18a487ad9999LL /* 48 */, 0x3c26e8eab1c94410LL /* 49 */,
81 0xb510102bc0a822f9LL /* 50 */, 0x141eef310ce6123bLL /* 51 */,
82 0xfc65b90059ddb154LL /* 52 */, 0xe0158640c5e0e607LL /* 53 */,
83 0x884e079826c3a3cfLL /* 54 */, 0x930d0d9523c535fdLL /* 55 */,
84 0x35638d754e9a2b00LL /* 56 */, 0x4085fccf40469dd5LL /* 57 */,
85 0xc4b17ad28be23a4cLL /* 58 */, 0xcab2f0fc6a3e6a2eLL /* 59 */,
86 0x2860971a6b943fcdLL /* 60 */, 0x3dde6ee212e30446LL /* 61 */,
87 0x6222f32ae01765aeLL /* 62 */, 0x5d550bb5478308feLL /* 63 */,
88 0xa9efa98da0eda22aLL /* 64 */, 0xc351a71686c40da7LL /* 65 */,
89 0x1105586d9c867c84LL /* 66 */, 0xdcffee85fda22853LL /* 67 */,
90 0xccfbd0262c5eef76LL /* 68 */, 0xbaf294cb8990d201LL /* 69 */,
91 0xe69464f52afad975LL /* 70 */, 0x94b013afdf133e14LL /* 71 */,
92 0x06a7d1a32823c958LL /* 72 */, 0x6f95fe5130f61119LL /* 73 */,
93 0xd92ab34e462c06c0LL /* 74 */, 0xed7bde33887c71d2LL /* 75 */,
94 0x79746d6e6518393eLL /* 76 */, 0x5ba419385d713329LL /* 77 */,
95 0x7c1ba6b948a97564LL /* 78 */, 0x31987c197bfdac67LL /* 79 */,
96 0xde6c23c44b053d02LL /* 80 */, 0x581c49fed002d64dLL /* 81 */,
97 0xdd474d6338261571LL /* 82 */, 0xaa4546c3e473d062LL /* 83 */,
98 0x928fce349455f860LL /* 84 */, 0x48161bbacaab94d9LL /* 85 */,
99 0x63912430770e6f68LL /* 86 */, 0x6ec8a5e602c6641cLL /* 87 */,
100 0x87282515337ddd2bLL /* 88 */, 0x2cda6b42034b701bLL /* 89 */,
101 0xb03d37c181cb096dLL /* 90 */, 0xe108438266c71c6fLL /* 91 */,
102 0x2b3180c7eb51b255LL /* 92 */, 0xdf92b82f96c08bbcLL /* 93 */,
103 0x5c68c8c0a632f3baLL /* 94 */, 0x5504cc861c3d0556LL /* 95 */,
104 0xabbfa4e55fb26b8fLL /* 96 */, 0x41848b0ab3baceb4LL /* 97 */,
105 0xb334a273aa445d32LL /* 98 */, 0xbca696f0a85ad881LL /* 99 */,
106 0x24f6ec65b528d56cLL /* 100 */, 0x0ce1512e90f4524aLL /* 101 */,
107 0x4e9dd79d5506d35aLL /* 102 */, 0x258905fac6ce9779LL /* 103 */,
108 0x2019295b3e109b33LL /* 104 */, 0xf8a9478b73a054ccLL /* 105 */,
109 0x2924f2f934417eb0LL /* 106 */, 0x3993357d536d1bc4LL /* 107 */,
110 0x38a81ac21db6ff8bLL /* 108 */, 0x47c4fbf17d6016bfLL /* 109 */,
111 0x1e0faadd7667e3f5LL /* 110 */, 0x7abcff62938beb96LL /* 111 */,
112 0xa78dad948fc179c9LL /* 112 */, 0x8f1f98b72911e50dLL /* 113 */,
113 0x61e48eae27121a91LL /* 114 */, 0x4d62f7ad31859808LL /* 115 */,
114 0xeceba345ef5ceaebLL /* 116 */, 0xf5ceb25ebc9684ceLL /* 117 */,
115 0xf633e20cb7f76221LL /* 118 */, 0xa32cdf06ab8293e4LL /* 119 */,
116 0x985a202ca5ee2ca4LL /* 120 */, 0xcf0b8447cc8a8fb1LL /* 121 */,
117 0x9f765244979859a3LL /* 122 */, 0xa8d516b1a1240017LL /* 123 */,
118 0x0bd7ba3ebb5dc726LL /* 124 */, 0xe54bca55b86adb39LL /* 125 */,
119 0x1d7a3afd6c478063LL /* 126 */, 0x519ec608e7669eddLL /* 127 */,
120 0x0e5715a2d149aa23LL /* 128 */, 0x177d4571848ff194LL /* 129 */,
121 0xeeb55f3241014c22LL /* 130 */, 0x0f5e5ca13a6e2ec2LL /* 131 */,
122 0x8029927b75f5c361LL /* 132 */, 0xad139fabc3d6e436LL /* 133 */,
123 0x0d5df1a94ccf402fLL /* 134 */, 0x3e8bd948bea5dfc8LL /* 135 */,
124 0xa5a0d357bd3ff77eLL /* 136 */, 0xa2d12e251f74f645LL /* 137 */,
125 0x66fd9e525e81a082LL /* 138 */, 0x2e0c90ce7f687a49LL /* 139 */,
126 0xc2e8bcbeba973bc5LL /* 140 */, 0x000001bce509745fLL /* 141 */,
127 0x423777bbe6dab3d6LL /* 142 */, 0xd1661c7eaef06eb5LL /* 143 */,
128 0xa1781f354daacfd8LL /* 144 */, 0x2d11284a2b16affcLL /* 145 */,
129 0xf1fc4f67fa891d1fLL /* 146 */, 0x73ecc25dcb920adaLL /* 147 */,
130 0xae610c22c2a12651LL /* 148 */, 0x96e0a810d356b78aLL /* 149 */,
131 0x5a9a381f2fe7870fLL /* 150 */, 0xd5ad62ede94e5530LL /* 151 */,
132 0xd225e5e8368d1427LL /* 152 */, 0x65977b70c7af4631LL /* 153 */,
133 0x99f889b2de39d74fLL /* 154 */, 0x233f30bf54e1d143LL /* 155 */,
134 0x9a9675d3d9a63c97LL /* 156 */, 0x5470554ff334f9a8LL /* 157 */,
135 0x166acb744a4f5688LL /* 158 */, 0x70c74caab2e4aeadLL /* 159 */,
136 0xf0d091646f294d12LL /* 160 */, 0x57b82a89684031d1LL /* 161 */,
137 0xefd95a5a61be0b6bLL /* 162 */, 0x2fbd12e969f2f29aLL /* 163 */,
138 0x9bd37013feff9fe8LL /* 164 */, 0x3f9b0404d6085a06LL /* 165 */,
139 0x4940c1f3166cfe15LL /* 166 */, 0x09542c4dcdf3defbLL /* 167 */,
140 0xb4c5218385cd5ce3LL /* 168 */, 0xc935b7dc4462a641LL /* 169 */,
141 0x3417f8a68ed3b63fLL /* 170 */, 0xb80959295b215b40LL /* 171 */,
142 0xf99cdaef3b8c8572LL /* 172 */, 0x018c0614f8fcb95dLL /* 173 */,
143 0x1b14accd1a3acdf3LL /* 174 */, 0x84d471f200bb732dLL /* 175 */,
144 0xc1a3110e95e8da16LL /* 176 */, 0x430a7220bf1a82b8LL /* 177 */,
145 0xb77e090d39df210eLL /* 178 */, 0x5ef4bd9f3cd05e9dLL /* 179 */,
146 0x9d4ff6da7e57a444LL /* 180 */, 0xda1d60e183d4a5f8LL /* 181 */,
147 0xb287c38417998e47LL /* 182 */, 0xfe3edc121bb31886LL /* 183 */,
148 0xc7fe3ccc980ccbefLL /* 184 */, 0xe46fb590189bfd03LL /* 185 */,
149 0x3732fd469a4c57dcLL /* 186 */, 0x7ef700a07cf1ad65LL /* 187 */,
150 0x59c64468a31d8859LL /* 188 */, 0x762fb0b4d45b61f6LL /* 189 */,
151 0x155baed099047718LL /* 190 */, 0x68755e4c3d50baa6LL /* 191 */,
152 0xe9214e7f22d8b4dfLL /* 192 */, 0x2addbf532eac95f4LL /* 193 */,
153 0x32ae3909b4bd0109LL /* 194 */, 0x834df537b08e3450LL /* 195 */,
154 0xfa209da84220728dLL /* 196 */, 0x9e691d9b9efe23f7LL /* 197 */,
155 0x0446d288c4ae8d7fLL /* 198 */, 0x7b4cc524e169785bLL /* 199 */,
156 0x21d87f0135ca1385LL /* 200 */, 0xcebb400f137b8aa5LL /* 201 */,
157 0x272e2b66580796beLL /* 202 */, 0x3612264125c2b0deLL /* 203 */,
158 0x057702bdad1efbb2LL /* 204 */, 0xd4babb8eacf84be9LL /* 205 */,
159 0x91583139641bc67bLL /* 206 */, 0x8bdc2de08036e024LL /* 207 */,
160 0x603c8156f49f68edLL /* 208 */, 0xf7d236f7dbef5111LL /* 209 */,
161 0x9727c4598ad21e80LL /* 210 */, 0xa08a0896670a5fd7LL /* 211 */,
162 0xcb4a8f4309eba9cbLL /* 212 */, 0x81af564b0f7036a1LL /* 213 */,
163 0xc0b99aa778199abdLL /* 214 */, 0x959f1ec83fc8e952LL /* 215 */,
164 0x8c505077794a81b9LL /* 216 */, 0x3acaaf8f056338f0LL /* 217 */,
165 0x07b43f50627a6778LL /* 218 */, 0x4a44ab49f5eccc77LL /* 219 */,
166 0x3bc3d6e4b679ee98LL /* 220 */, 0x9cc0d4d1cf14108cLL /* 221 */,
167 0x4406c00b206bc8a0LL /* 222 */, 0x82a18854c8d72d89LL /* 223 */,
168 0x67e366b35c3c432cLL /* 224 */, 0xb923dd61102b37f2LL /* 225 */,
169 0x56ab2779d884271dLL /* 226 */, 0xbe83e1b0ff1525afLL /* 227 */,
170 0xfb7c65d4217e49a9LL /* 228 */, 0x6bdbe0e76d48e7d4LL /* 229 */,
171 0x08df828745d9179eLL /* 230 */, 0x22ea6a9add53bd34LL /* 231 */,
172 0xe36e141c5622200aLL /* 232 */, 0x7f805d1b8cb750eeLL /* 233 */,
173 0xafe5c7a59f58e837LL /* 234 */, 0xe27f996a4fb1c23cLL /* 235 */,
174 0xd3867dfb0775f0d0LL /* 236 */, 0xd0e673de6e88891aLL /* 237 */,
175 0x123aeb9eafb86c25LL /* 238 */, 0x30f1d5d5c145b895LL /* 239 */,
176 0xbb434a2dee7269e7LL /* 240 */, 0x78cb67ecf931fa38LL /* 241 */,
177 0xf33b0372323bbf9cLL /* 242 */, 0x52d66336fb279c74LL /* 243 */,
178 0x505f33ac0afb4eaaLL /* 244 */, 0xe8a5cd99a2cce187LL /* 245 */,
179 0x534974801e2d30bbLL /* 246 */, 0x8d2d5711d5876d90LL /* 247 */,
180 0x1f1a412891bc038eLL /* 248 */, 0xd6e2e71d82e56648LL /* 249 */,
181 0x74036c3a497732b7LL /* 250 */, 0x89b67ed96361f5abLL /* 251 */,
182 0xffed95d8f1ea02a2LL /* 252 */, 0xe72b3bd61464d43dLL /* 253 */,
183 0xa6300f170bdc4820LL /* 254 */, 0xebc18760ed78a77aLL /* 255 */
184 };
185 static uint64_t sbox2[256] = {
186 0xe6a6be5a05a12138LL /* 256 */, 0xb5a122a5b4f87c98LL /* 257 */,
187 0x563c6089140b6990LL /* 258 */, 0x4c46cb2e391f5dd5LL /* 259 */,
188 0xd932addbc9b79434LL /* 260 */, 0x08ea70e42015aff5LL /* 261 */,
189 0xd765a6673e478cf1LL /* 262 */, 0xc4fb757eab278d99LL /* 263 */,
190 0xdf11c6862d6e0692LL /* 264 */, 0xddeb84f10d7f3b16LL /* 265 */,
191 0x6f2ef604a665ea04LL /* 266 */, 0x4a8e0f0ff0e0dfb3LL /* 267 */,
192 0xa5edeef83dbcba51LL /* 268 */, 0xfc4f0a2a0ea4371eLL /* 269 */,
193 0xe83e1da85cb38429LL /* 270 */, 0xdc8ff882ba1b1ce2LL /* 271 */,
194 0xcd45505e8353e80dLL /* 272 */, 0x18d19a00d4db0717LL /* 273 */,
195 0x34a0cfeda5f38101LL /* 274 */, 0x0be77e518887caf2LL /* 275 */,
196 0x1e341438b3c45136LL /* 276 */, 0xe05797f49089ccf9LL /* 277 */,
197 0xffd23f9df2591d14LL /* 278 */, 0x543dda228595c5cdLL /* 279 */,
198 0x661f81fd99052a33LL /* 280 */, 0x8736e641db0f7b76LL /* 281 */,
199 0x15227725418e5307LL /* 282 */, 0xe25f7f46162eb2faLL /* 283 */,
200 0x48a8b2126c13d9feLL /* 284 */, 0xafdc541792e76eeaLL /* 285 */,
201 0x03d912bfc6d1898fLL /* 286 */, 0x31b1aafa1b83f51bLL /* 287 */,
202 0xf1ac2796e42ab7d9LL /* 288 */, 0x40a3a7d7fcd2ebacLL /* 289 */,
203 0x1056136d0afbbcc5LL /* 290 */, 0x7889e1dd9a6d0c85LL /* 291 */,
204 0xd33525782a7974aaLL /* 292 */, 0xa7e25d09078ac09bLL /* 293 */,
205 0xbd4138b3eac6edd0LL /* 294 */, 0x920abfbe71eb9e70LL /* 295 */,
206 0xa2a5d0f54fc2625cLL /* 296 */, 0xc054e36b0b1290a3LL /* 297 */,
207 0xf6dd59ff62fe932bLL /* 298 */, 0x3537354511a8ac7dLL /* 299 */,
208 0xca845e9172fadcd4LL /* 300 */, 0x84f82b60329d20dcLL /* 301 */,
209 0x79c62ce1cd672f18LL /* 302 */, 0x8b09a2add124642cLL /* 303 */,
210 0xd0c1e96a19d9e726LL /* 304 */, 0x5a786a9b4ba9500cLL /* 305 */,
211 0x0e020336634c43f3LL /* 306 */, 0xc17b474aeb66d822LL /* 307 */,
212 0x6a731ae3ec9baac2LL /* 308 */, 0x8226667ae0840258LL /* 309 */,
213 0x67d4567691caeca5LL /* 310 */, 0x1d94155c4875adb5LL /* 311 */,
214 0x6d00fd985b813fdfLL /* 312 */, 0x51286efcb774cd06LL /* 313 */,
215 0x5e8834471fa744afLL /* 314 */, 0xf72ca0aee761ae2eLL /* 315 */,
216 0xbe40e4cdaee8e09aLL /* 316 */, 0xe9970bbb5118f665LL /* 317 */,
217 0x726e4beb33df1964LL /* 318 */, 0x703b000729199762LL /* 319 */,
218 0x4631d816f5ef30a7LL /* 320 */, 0xb880b5b51504a6beLL /* 321 */,
219 0x641793c37ed84b6cLL /* 322 */, 0x7b21ed77f6e97d96LL /* 323 */,
220 0x776306312ef96b73LL /* 324 */, 0xae528948e86ff3f4LL /* 325 */,
221 0x53dbd7f286a3f8f8LL /* 326 */, 0x16cadce74cfc1063LL /* 327 */,
222 0x005c19bdfa52c6ddLL /* 328 */, 0x68868f5d64d46ad3LL /* 329 */,
223 0x3a9d512ccf1e186aLL /* 330 */, 0x367e62c2385660aeLL /* 331 */,
224 0xe359e7ea77dcb1d7LL /* 332 */, 0x526c0773749abe6eLL /* 333 */,
225 0x735ae5f9d09f734bLL /* 334 */, 0x493fc7cc8a558ba8LL /* 335 */,
226 0xb0b9c1533041ab45LL /* 336 */, 0x321958ba470a59bdLL /* 337 */,
227 0x852db00b5f46c393LL /* 338 */, 0x91209b2bd336b0e5LL /* 339 */,
228 0x6e604f7d659ef19fLL /* 340 */, 0xb99a8ae2782ccb24LL /* 341 */,
229 0xccf52ab6c814c4c7LL /* 342 */, 0x4727d9afbe11727bLL /* 343 */,
230 0x7e950d0c0121b34dLL /* 344 */, 0x756f435670ad471fLL /* 345 */,
231 0xf5add442615a6849LL /* 346 */, 0x4e87e09980b9957aLL /* 347 */,
232 0x2acfa1df50aee355LL /* 348 */, 0xd898263afd2fd556LL /* 349 */,
233 0xc8f4924dd80c8fd6LL /* 350 */, 0xcf99ca3d754a173aLL /* 351 */,
234 0xfe477bacaf91bf3cLL /* 352 */, 0xed5371f6d690c12dLL /* 353 */,
235 0x831a5c285e687094LL /* 354 */, 0xc5d3c90a3708a0a4LL /* 355 */,
236 0x0f7f903717d06580LL /* 356 */, 0x19f9bb13b8fdf27fLL /* 357 */,
237 0xb1bd6f1b4d502843LL /* 358 */, 0x1c761ba38fff4012LL /* 359 */,
238 0x0d1530c4e2e21f3bLL /* 360 */, 0x8943ce69a7372c8aLL /* 361 */,
239 0xe5184e11feb5ce66LL /* 362 */, 0x618bdb80bd736621LL /* 363 */,
240 0x7d29bad68b574d0bLL /* 364 */, 0x81bb613e25e6fe5bLL /* 365 */,
241 0x071c9c10bc07913fLL /* 366 */, 0xc7beeb7909ac2d97LL /* 367 */,
242 0xc3e58d353bc5d757LL /* 368 */, 0xeb017892f38f61e8LL /* 369 */,
243 0xd4effb9c9b1cc21aLL /* 370 */, 0x99727d26f494f7abLL /* 371 */,
244 0xa3e063a2956b3e03LL /* 372 */, 0x9d4a8b9a4aa09c30LL /* 373 */,
245 0x3f6ab7d500090fb4LL /* 374 */, 0x9cc0f2a057268ac0LL /* 375 */,
246 0x3dee9d2dedbf42d1LL /* 376 */, 0x330f49c87960a972LL /* 377 */,
247 0xc6b2720287421b41LL /* 378 */, 0x0ac59ec07c00369cLL /* 379 */,
248 0xef4eac49cb353425LL /* 380 */, 0xf450244eef0129d8LL /* 381 */,
249 0x8acc46e5caf4deb6LL /* 382 */, 0x2ffeab63989263f7LL /* 383 */,
250 0x8f7cb9fe5d7a4578LL /* 384 */, 0x5bd8f7644e634635LL /* 385 */,
251 0x427a7315bf2dc900LL /* 386 */, 0x17d0c4aa2125261cLL /* 387 */,
252 0x3992486c93518e50LL /* 388 */, 0xb4cbfee0a2d7d4c3LL /* 389 */,
253 0x7c75d6202c5ddd8dLL /* 390 */, 0xdbc295d8e35b6c61LL /* 391 */,
254 0x60b369d302032b19LL /* 392 */, 0xce42685fdce44132LL /* 393 */,
255 0x06f3ddb9ddf65610LL /* 394 */, 0x8ea4d21db5e148f0LL /* 395 */,
256 0x20b0fce62fcd496fLL /* 396 */, 0x2c1b912358b0ee31LL /* 397 */,
257 0xb28317b818f5a308LL /* 398 */, 0xa89c1e189ca6d2cfLL /* 399 */,
258 0x0c6b18576aaadbc8LL /* 400 */, 0xb65deaa91299fae3LL /* 401 */,
259 0xfb2b794b7f1027e7LL /* 402 */, 0x04e4317f443b5bebLL /* 403 */,
260 0x4b852d325939d0a6LL /* 404 */, 0xd5ae6beefb207ffcLL /* 405 */,
261 0x309682b281c7d374LL /* 406 */, 0xbae309a194c3b475LL /* 407 */,
262 0x8cc3f97b13b49f05LL /* 408 */, 0x98a9422ff8293967LL /* 409 */,
263 0x244b16b01076ff7cLL /* 410 */, 0xf8bf571c663d67eeLL /* 411 */,
264 0x1f0d6758eee30da1LL /* 412 */, 0xc9b611d97adeb9b7LL /* 413 */,
265 0xb7afd5887b6c57a2LL /* 414 */, 0x6290ae846b984fe1LL /* 415 */,
266 0x94df4cdeacc1a5fdLL /* 416 */, 0x058a5bd1c5483affLL /* 417 */,
267 0x63166cc142ba3c37LL /* 418 */, 0x8db8526eb2f76f40LL /* 419 */,
268 0xe10880036f0d6d4eLL /* 420 */, 0x9e0523c9971d311dLL /* 421 */,
269 0x45ec2824cc7cd691LL /* 422 */, 0x575b8359e62382c9LL /* 423 */,
270 0xfa9e400dc4889995LL /* 424 */, 0xd1823ecb45721568LL /* 425 */,
271 0xdafd983b8206082fLL /* 426 */, 0xaa7d29082386a8cbLL /* 427 */,
272 0x269fcd4403b87588LL /* 428 */, 0x1b91f5f728bdd1e0LL /* 429 */,
273 0xe4669f39040201f6LL /* 430 */, 0x7a1d7c218cf04adeLL /* 431 */,
274 0x65623c29d79ce5ceLL /* 432 */, 0x2368449096c00bb1LL /* 433 */,
275 0xab9bf1879da503baLL /* 434 */, 0xbc23ecb1a458058eLL /* 435 */,
276 0x9a58df01bb401eccLL /* 436 */, 0xa070e868a85f143dLL /* 437 */,
277 0x4ff188307df2239eLL /* 438 */, 0x14d565b41a641183LL /* 439 */,
278 0xee13337452701602LL /* 440 */, 0x950e3dcf3f285e09LL /* 441 */,
279 0x59930254b9c80953LL /* 442 */, 0x3bf299408930da6dLL /* 443 */,
280 0xa955943f53691387LL /* 444 */, 0xa15edecaa9cb8784LL /* 445 */,
281 0x29142127352be9a0LL /* 446 */, 0x76f0371fff4e7afbLL /* 447 */,
282 0x0239f450274f2228LL /* 448 */, 0xbb073af01d5e868bLL /* 449 */,
283 0xbfc80571c10e96c1LL /* 450 */, 0xd267088568222e23LL /* 451 */,
284 0x9671a3d48e80b5b0LL /* 452 */, 0x55b5d38ae193bb81LL /* 453 */,
285 0x693ae2d0a18b04b8LL /* 454 */, 0x5c48b4ecadd5335fLL /* 455 */,
286 0xfd743b194916a1caLL /* 456 */, 0x2577018134be98c4LL /* 457 */,
287 0xe77987e83c54a4adLL /* 458 */, 0x28e11014da33e1b9LL /* 459 */,
288 0x270cc59e226aa213LL /* 460 */, 0x71495f756d1a5f60LL /* 461 */,
289 0x9be853fb60afef77LL /* 462 */, 0xadc786a7f7443dbfLL /* 463 */,
290 0x0904456173b29a82LL /* 464 */, 0x58bc7a66c232bd5eLL /* 465 */,
291 0xf306558c673ac8b2LL /* 466 */, 0x41f639c6b6c9772aLL /* 467 */,
292 0x216defe99fda35daLL /* 468 */, 0x11640cc71c7be615LL /* 469 */,
293 0x93c43694565c5527LL /* 470 */, 0xea038e6246777839LL /* 471 */,
294 0xf9abf3ce5a3e2469LL /* 472 */, 0x741e768d0fd312d2LL /* 473 */,
295 0x0144b883ced652c6LL /* 474 */, 0xc20b5a5ba33f8552LL /* 475 */,
296 0x1ae69633c3435a9dLL /* 476 */, 0x97a28ca4088cfdecLL /* 477 */,
297 0x8824a43c1e96f420LL /* 478 */, 0x37612fa66eeea746LL /* 479 */,
298 0x6b4cb165f9cf0e5aLL /* 480 */, 0x43aa1c06a0abfb4aLL /* 481 */,
299 0x7f4dc26ff162796bLL /* 482 */, 0x6cbacc8e54ed9b0fLL /* 483 */,
300 0xa6b7ffefd2bb253eLL /* 484 */, 0x2e25bc95b0a29d4fLL /* 485 */,
301 0x86d6a58bdef1388cLL /* 486 */, 0xded74ac576b6f054LL /* 487 */,
302 0x8030bdbc2b45805dLL /* 488 */, 0x3c81af70e94d9289LL /* 489 */,
303 0x3eff6dda9e3100dbLL /* 490 */, 0xb38dc39fdfcc8847LL /* 491 */,
304 0x123885528d17b87eLL /* 492 */, 0xf2da0ed240b1b642LL /* 493 */,
305 0x44cefadcd54bf9a9LL /* 494 */, 0x1312200e433c7ee6LL /* 495 */,
306 0x9ffcc84f3a78c748LL /* 496 */, 0xf0cd1f72248576bbLL /* 497 */,
307 0xec6974053638cfe4LL /* 498 */, 0x2ba7b67c0cec4e4cLL /* 499 */,
308 0xac2f4df3e5ce32edLL /* 500 */, 0xcb33d14326ea4c11LL /* 501 */,
309 0xa4e9044cc77e58bcLL /* 502 */, 0x5f513293d934fcefLL /* 503 */,
310 0x5dc9645506e55444LL /* 504 */, 0x50de418f317de40aLL /* 505 */,
311 0x388cb31a69dde259LL /* 506 */, 0x2db4a83455820a86LL /* 507 */,
312 0x9010a91e84711ae9LL /* 508 */, 0x4df7f0b7b1498371LL /* 509 */,
313 0xd62a2eabc0977179LL /* 510 */, 0x22fac097aa8d5c0eLL /* 511 */
314 };
315 static uint64_t sbox3[256] = {
316 0xf49fcc2ff1daf39bLL /* 512 */, 0x487fd5c66ff29281LL /* 513 */,
317 0xe8a30667fcdca83fLL /* 514 */, 0x2c9b4be3d2fcce63LL /* 515 */,
318 0xda3ff74b93fbbbc2LL /* 516 */, 0x2fa165d2fe70ba66LL /* 517 */,
319 0xa103e279970e93d4LL /* 518 */, 0xbecdec77b0e45e71LL /* 519 */,
320 0xcfb41e723985e497LL /* 520 */, 0xb70aaa025ef75017LL /* 521 */,
321 0xd42309f03840b8e0LL /* 522 */, 0x8efc1ad035898579LL /* 523 */,
322 0x96c6920be2b2abc5LL /* 524 */, 0x66af4163375a9172LL /* 525 */,
323 0x2174abdcca7127fbLL /* 526 */, 0xb33ccea64a72ff41LL /* 527 */,
324 0xf04a4933083066a5LL /* 528 */, 0x8d970acdd7289af5LL /* 529 */,
325 0x8f96e8e031c8c25eLL /* 530 */, 0xf3fec02276875d47LL /* 531 */,
326 0xec7bf310056190ddLL /* 532 */, 0xf5adb0aebb0f1491LL /* 533 */,
327 0x9b50f8850fd58892LL /* 534 */, 0x4975488358b74de8LL /* 535 */,
328 0xa3354ff691531c61LL /* 536 */, 0x0702bbe481d2c6eeLL /* 537 */,
329 0x89fb24057deded98LL /* 538 */, 0xac3075138596e902LL /* 539 */,
330 0x1d2d3580172772edLL /* 540 */, 0xeb738fc28e6bc30dLL /* 541 */,
331 0x5854ef8f63044326LL /* 542 */, 0x9e5c52325add3bbeLL /* 543 */,
332 0x90aa53cf325c4623LL /* 544 */, 0xc1d24d51349dd067LL /* 545 */,
333 0x2051cfeea69ea624LL /* 546 */, 0x13220f0a862e7e4fLL /* 547 */,
334 0xce39399404e04864LL /* 548 */, 0xd9c42ca47086fcb7LL /* 549 */,
335 0x685ad2238a03e7ccLL /* 550 */, 0x066484b2ab2ff1dbLL /* 551 */,
336 0xfe9d5d70efbf79ecLL /* 552 */, 0x5b13b9dd9c481854LL /* 553 */,
337 0x15f0d475ed1509adLL /* 554 */, 0x0bebcd060ec79851LL /* 555 */,
338 0xd58c6791183ab7f8LL /* 556 */, 0xd1187c5052f3eee4LL /* 557 */,
339 0xc95d1192e54e82ffLL /* 558 */, 0x86eea14cb9ac6ca2LL /* 559 */,
340 0x3485beb153677d5dLL /* 560 */, 0xdd191d781f8c492aLL /* 561 */,
341 0xf60866baa784ebf9LL /* 562 */, 0x518f643ba2d08c74LL /* 563 */,
342 0x8852e956e1087c22LL /* 564 */, 0xa768cb8dc410ae8dLL /* 565 */,
343 0x38047726bfec8e1aLL /* 566 */, 0xa67738b4cd3b45aaLL /* 567 */,
344 0xad16691cec0dde19LL /* 568 */, 0xc6d4319380462e07LL /* 569 */,
345 0xc5a5876d0ba61938LL /* 570 */, 0x16b9fa1fa58fd840LL /* 571 */,
346 0x188ab1173ca74f18LL /* 572 */, 0xabda2f98c99c021fLL /* 573 */,
347 0x3e0580ab134ae816LL /* 574 */, 0x5f3b05b773645abbLL /* 575 */,
348 0x2501a2be5575f2f6LL /* 576 */, 0x1b2f74004e7e8ba9LL /* 577 */,
349 0x1cd7580371e8d953LL /* 578 */, 0x7f6ed89562764e30LL /* 579 */,
350 0xb15926ff596f003dLL /* 580 */, 0x9f65293da8c5d6b9LL /* 581 */,
351 0x6ecef04dd690f84cLL /* 582 */, 0x4782275fff33af88LL /* 583 */,
352 0xe41433083f820801LL /* 584 */, 0xfd0dfe409a1af9b5LL /* 585 */,
353 0x4325a3342cdb396bLL /* 586 */, 0x8ae77e62b301b252LL /* 587 */,
354 0xc36f9e9f6655615aLL /* 588 */, 0x85455a2d92d32c09LL /* 589 */,
355 0xf2c7dea949477485LL /* 590 */, 0x63cfb4c133a39ebaLL /* 591 */,
356 0x83b040cc6ebc5462LL /* 592 */, 0x3b9454c8fdb326b0LL /* 593 */,
357 0x56f56a9e87ffd78cLL /* 594 */, 0x2dc2940d99f42bc6LL /* 595 */,
358 0x98f7df096b096e2dLL /* 596 */, 0x19a6e01e3ad852bfLL /* 597 */,
359 0x42a99ccbdbd4b40bLL /* 598 */, 0xa59998af45e9c559LL /* 599 */,
360 0x366295e807d93186LL /* 600 */, 0x6b48181bfaa1f773LL /* 601 */,
361 0x1fec57e2157a0a1dLL /* 602 */, 0x4667446af6201ad5LL /* 603 */,
362 0xe615ebcacfb0f075LL /* 604 */, 0xb8f31f4f68290778LL /* 605 */,
363 0x22713ed6ce22d11eLL /* 606 */, 0x3057c1a72ec3c93bLL /* 607 */,
364 0xcb46acc37c3f1f2fLL /* 608 */, 0xdbb893fd02aaf50eLL /* 609 */,
365 0x331fd92e600b9fcfLL /* 610 */, 0xa498f96148ea3ad6LL /* 611 */,
366 0xa8d8426e8b6a83eaLL /* 612 */, 0xa089b274b7735cdcLL /* 613 */,
367 0x87f6b3731e524a11LL /* 614 */, 0x118808e5cbc96749LL /* 615 */,
368 0x9906e4c7b19bd394LL /* 616 */, 0xafed7f7e9b24a20cLL /* 617 */,
369 0x6509eadeeb3644a7LL /* 618 */, 0x6c1ef1d3e8ef0edeLL /* 619 */,
370 0xb9c97d43e9798fb4LL /* 620 */, 0xa2f2d784740c28a3LL /* 621 */,
371 0x7b8496476197566fLL /* 622 */, 0x7a5be3e6b65f069dLL /* 623 */,
372 0xf96330ed78be6f10LL /* 624 */, 0xeee60de77a076a15LL /* 625 */,
373 0x2b4bee4aa08b9bd0LL /* 626 */, 0x6a56a63ec7b8894eLL /* 627 */,
374 0x02121359ba34fef4LL /* 628 */, 0x4cbf99f8283703fcLL /* 629 */,
375 0x398071350caf30c8LL /* 630 */, 0xd0a77a89f017687aLL /* 631 */,
376 0xf1c1a9eb9e423569LL /* 632 */, 0x8c7976282dee8199LL /* 633 */,
377 0x5d1737a5dd1f7abdLL /* 634 */, 0x4f53433c09a9fa80LL /* 635 */,
378 0xfa8b0c53df7ca1d9LL /* 636 */, 0x3fd9dcbc886ccb77LL /* 637 */,
379 0xc040917ca91b4720LL /* 638 */, 0x7dd00142f9d1dcdfLL /* 639 */,
380 0x8476fc1d4f387b58LL /* 640 */, 0x23f8e7c5f3316503LL /* 641 */,
381 0x032a2244e7e37339LL /* 642 */, 0x5c87a5d750f5a74bLL /* 643 */,
382 0x082b4cc43698992eLL /* 644 */, 0xdf917becb858f63cLL /* 645 */,
383 0x3270b8fc5bf86ddaLL /* 646 */, 0x10ae72bb29b5dd76LL /* 647 */,
384 0x576ac94e7700362bLL /* 648 */, 0x1ad112dac61efb8fLL /* 649 */,
385 0x691bc30ec5faa427LL /* 650 */, 0xff246311cc327143LL /* 651 */,
386 0x3142368e30e53206LL /* 652 */, 0x71380e31e02ca396LL /* 653 */,
387 0x958d5c960aad76f1LL /* 654 */, 0xf8d6f430c16da536LL /* 655 */,
388 0xc8ffd13f1be7e1d2LL /* 656 */, 0x7578ae66004ddbe1LL /* 657 */,
389 0x05833f01067be646LL /* 658 */, 0xbb34b5ad3bfe586dLL /* 659 */,
390 0x095f34c9a12b97f0LL /* 660 */, 0x247ab64525d60ca8LL /* 661 */,
391 0xdcdbc6f3017477d1LL /* 662 */, 0x4a2e14d4decad24dLL /* 663 */,
392 0xbdb5e6d9be0a1eebLL /* 664 */, 0x2a7e70f7794301abLL /* 665 */,
393 0xdef42d8a270540fdLL /* 666 */, 0x01078ec0a34c22c1LL /* 667 */,
394 0xe5de511af4c16387LL /* 668 */, 0x7ebb3a52bd9a330aLL /* 669 */,
395 0x77697857aa7d6435LL /* 670 */, 0x004e831603ae4c32LL /* 671 */,
396 0xe7a21020ad78e312LL /* 672 */, 0x9d41a70c6ab420f2LL /* 673 */,
397 0x28e06c18ea1141e6LL /* 674 */, 0xd2b28cbd984f6b28LL /* 675 */,
398 0x26b75f6c446e9d83LL /* 676 */, 0xba47568c4d418d7fLL /* 677 */,
399 0xd80badbfe6183d8eLL /* 678 */, 0x0e206d7f5f166044LL /* 679 */,
400 0xe258a43911cbca3eLL /* 680 */, 0x723a1746b21dc0bcLL /* 681 */,
401 0xc7caa854f5d7cdd3LL /* 682 */, 0x7cac32883d261d9cLL /* 683 */,
402 0x7690c26423ba942cLL /* 684 */, 0x17e55524478042b8LL /* 685 */,
403 0xe0be477656a2389fLL /* 686 */, 0x4d289b5e67ab2da0LL /* 687 */,
404 0x44862b9c8fbbfd31LL /* 688 */, 0xb47cc8049d141365LL /* 689 */,
405 0x822c1b362b91c793LL /* 690 */, 0x4eb14655fb13dfd8LL /* 691 */,
406 0x1ecbba0714e2a97bLL /* 692 */, 0x6143459d5cde5f14LL /* 693 */,
407 0x53a8fbf1d5f0ac89LL /* 694 */, 0x97ea04d81c5e5b00LL /* 695 */,
408 0x622181a8d4fdb3f3LL /* 696 */, 0xe9bcd341572a1208LL /* 697 */,
409 0x1411258643cce58aLL /* 698 */, 0x9144c5fea4c6e0a4LL /* 699 */,
410 0x0d33d06565cf620fLL /* 700 */, 0x54a48d489f219ca1LL /* 701 */,
411 0xc43e5eac6d63c821LL /* 702 */, 0xa9728b3a72770dafLL /* 703 */,
412 0xd7934e7b20df87efLL /* 704 */, 0xe35503b61a3e86e5LL /* 705 */,
413 0xcae321fbc819d504LL /* 706 */, 0x129a50b3ac60bfa6LL /* 707 */,
414 0xcd5e68ea7e9fb6c3LL /* 708 */, 0xb01c90199483b1c7LL /* 709 */,
415 0x3de93cd5c295376cLL /* 710 */, 0xaed52edf2ab9ad13LL /* 711 */,
416 0x2e60f512c0a07884LL /* 712 */, 0xbc3d86a3e36210c9LL /* 713 */,
417 0x35269d9b163951ceLL /* 714 */, 0x0c7d6e2ad0cdb5faLL /* 715 */,
418 0x59e86297d87f5733LL /* 716 */, 0x298ef221898db0e7LL /* 717 */,
419 0x55000029d1a5aa7eLL /* 718 */, 0x8bc08ae1b5061b45LL /* 719 */,
420 0xc2c31c2b6c92703aLL /* 720 */, 0x94cc596baf25ef42LL /* 721 */,
421 0x0a1d73db22540456LL /* 722 */, 0x04b6a0f9d9c4179aLL /* 723 */,
422 0xeffdafa2ae3d3c60LL /* 724 */, 0xf7c8075bb49496c4LL /* 725 */,
423 0x9cc5c7141d1cd4e3LL /* 726 */, 0x78bd1638218e5534LL /* 727 */,
424 0xb2f11568f850246aLL /* 728 */, 0xedfabcfa9502bc29LL /* 729 */,
425 0x796ce5f2da23051bLL /* 730 */, 0xaae128b0dc93537cLL /* 731 */,
426 0x3a493da0ee4b29aeLL /* 732 */, 0xb5df6b2c416895d7LL /* 733 */,
427 0xfcabbd25122d7f37LL /* 734 */, 0x70810b58105dc4b1LL /* 735 */,
428 0xe10fdd37f7882a90LL /* 736 */, 0x524dcab5518a3f5cLL /* 737 */,
429 0x3c9e85878451255bLL /* 738 */, 0x4029828119bd34e2LL /* 739 */,
430 0x74a05b6f5d3ceccbLL /* 740 */, 0xb610021542e13ecaLL /* 741 */,
431 0x0ff979d12f59e2acLL /* 742 */, 0x6037da27e4f9cc50LL /* 743 */,
432 0x5e92975a0df1847dLL /* 744 */, 0xd66de190d3e623feLL /* 745 */,
433 0x5032d6b87b568048LL /* 746 */, 0x9a36b7ce8235216eLL /* 747 */,
434 0x80272a7a24f64b4aLL /* 748 */, 0x93efed8b8c6916f7LL /* 749 */,
435 0x37ddbff44cce1555LL /* 750 */, 0x4b95db5d4b99bd25LL /* 751 */,
436 0x92d3fda169812fc0LL /* 752 */, 0xfb1a4a9a90660bb6LL /* 753 */,
437 0x730c196946a4b9b2LL /* 754 */, 0x81e289aa7f49da68LL /* 755 */,
438 0x64669a0f83b1a05fLL /* 756 */, 0x27b3ff7d9644f48bLL /* 757 */,
439 0xcc6b615c8db675b3LL /* 758 */, 0x674f20b9bcebbe95LL /* 759 */,
440 0x6f31238275655982LL /* 760 */, 0x5ae488713e45cf05LL /* 761 */,
441 0xbf619f9954c21157LL /* 762 */, 0xeabac46040a8eae9LL /* 763 */,
442 0x454c6fe9f2c0c1cdLL /* 764 */, 0x419cf6496412691cLL /* 765 */,
443 0xd3dc3bef265b0f70LL /* 766 */, 0x6d0e60f5c3578a9eLL /* 767 */
444 };
445 static uint64_t sbox4[256] = {
446 0x5b0e608526323c55LL /* 768 */, 0x1a46c1a9fa1b59f5LL /* 769 */,
447 0xa9e245a17c4c8ffaLL /* 770 */, 0x65ca5159db2955d7LL /* 771 */,
448 0x05db0a76ce35afc2LL /* 772 */, 0x81eac77ea9113d45LL /* 773 */,
449 0x528ef88ab6ac0a0dLL /* 774 */, 0xa09ea253597be3ffLL /* 775 */,
450 0x430ddfb3ac48cd56LL /* 776 */, 0xc4b3a67af45ce46fLL /* 777 */,
451 0x4ececfd8fbe2d05eLL /* 778 */, 0x3ef56f10b39935f0LL /* 779 */,
452 0x0b22d6829cd619c6LL /* 780 */, 0x17fd460a74df2069LL /* 781 */,
453 0x6cf8cc8e8510ed40LL /* 782 */, 0xd6c824bf3a6ecaa7LL /* 783 */,
454 0x61243d581a817049LL /* 784 */, 0x048bacb6bbc163a2LL /* 785 */,
455 0xd9a38ac27d44cc32LL /* 786 */, 0x7fddff5baaf410abLL /* 787 */,
456 0xad6d495aa804824bLL /* 788 */, 0xe1a6a74f2d8c9f94LL /* 789 */,
457 0xd4f7851235dee8e3LL /* 790 */, 0xfd4b7f886540d893LL /* 791 */,
458 0x247c20042aa4bfdaLL /* 792 */, 0x096ea1c517d1327cLL /* 793 */,
459 0xd56966b4361a6685LL /* 794 */, 0x277da5c31221057dLL /* 795 */,
460 0x94d59893a43acff7LL /* 796 */, 0x64f0c51ccdc02281LL /* 797 */,
461 0x3d33bcc4ff6189dbLL /* 798 */, 0xe005cb184ce66af1LL /* 799 */,
462 0xff5ccd1d1db99beaLL /* 800 */, 0xb0b854a7fe42980fLL /* 801 */,
463 0x7bd46a6a718d4b9fLL /* 802 */, 0xd10fa8cc22a5fd8cLL /* 803 */,
464 0xd31484952be4bd31LL /* 804 */, 0xc7fa975fcb243847LL /* 805 */,
465 0x4886ed1e5846c407LL /* 806 */, 0x28cddb791eb70b04LL /* 807 */,
466 0xc2b00be2f573417fLL /* 808 */, 0x5c9590452180f877LL /* 809 */,
467 0x7a6bddfff370eb00LL /* 810 */, 0xce509e38d6d9d6a4LL /* 811 */,
468 0xebeb0f00647fa702LL /* 812 */, 0x1dcc06cf76606f06LL /* 813 */,
469 0xe4d9f28ba286ff0aLL /* 814 */, 0xd85a305dc918c262LL /* 815 */,
470 0x475b1d8732225f54LL /* 816 */, 0x2d4fb51668ccb5feLL /* 817 */,
471 0xa679b9d9d72bba20LL /* 818 */, 0x53841c0d912d43a5LL /* 819 */,
472 0x3b7eaa48bf12a4e8LL /* 820 */, 0x781e0e47f22f1ddfLL /* 821 */,
473 0xeff20ce60ab50973LL /* 822 */, 0x20d261d19dffb742LL /* 823 */,
474 0x16a12b03062a2e39LL /* 824 */, 0x1960eb2239650495LL /* 825 */,
475 0x251c16fed50eb8b8LL /* 826 */, 0x9ac0c330f826016eLL /* 827 */,
476 0xed152665953e7671LL /* 828 */, 0x02d63194a6369570LL /* 829 */,
477 0x5074f08394b1c987LL /* 830 */, 0x70ba598c90b25ce1LL /* 831 */,
478 0x794a15810b9742f6LL /* 832 */, 0x0d5925e9fcaf8c6cLL /* 833 */,
479 0x3067716cd868744eLL /* 834 */, 0x910ab077e8d7731bLL /* 835 */,
480 0x6a61bbdb5ac42f61LL /* 836 */, 0x93513efbf0851567LL /* 837 */,
481 0xf494724b9e83e9d5LL /* 838 */, 0xe887e1985c09648dLL /* 839 */,
482 0x34b1d3c675370cfdLL /* 840 */, 0xdc35e433bc0d255dLL /* 841 */,
483 0xd0aab84234131be0LL /* 842 */, 0x08042a50b48b7eafLL /* 843 */,
484 0x9997c4ee44a3ab35LL /* 844 */, 0x829a7b49201799d0LL /* 845 */,
485 0x263b8307b7c54441LL /* 846 */, 0x752f95f4fd6a6ca6LL /* 847 */,
486 0x927217402c08c6e5LL /* 848 */, 0x2a8ab754a795d9eeLL /* 849 */,
487 0xa442f7552f72943dLL /* 850 */, 0x2c31334e19781208LL /* 851 */,
488 0x4fa98d7ceaee6291LL /* 852 */, 0x55c3862f665db309LL /* 853 */,
489 0xbd0610175d53b1f3LL /* 854 */, 0x46fe6cb840413f27LL /* 855 */,
490 0x3fe03792df0cfa59LL /* 856 */, 0xcfe700372eb85e8fLL /* 857 */,
491 0xa7be29e7adbce118LL /* 858 */, 0xe544ee5cde8431ddLL /* 859 */,
492 0x8a781b1b41f1873eLL /* 860 */, 0xa5c94c78a0d2f0e7LL /* 861 */,
493 0x39412e2877b60728LL /* 862 */, 0xa1265ef3afc9a62cLL /* 863 */,
494 0xbcc2770c6a2506c5LL /* 864 */, 0x3ab66dd5dce1ce12LL /* 865 */,
495 0xe65499d04a675b37LL /* 866 */, 0x7d8f523481bfd216LL /* 867 */,
496 0x0f6f64fcec15f389LL /* 868 */, 0x74efbe618b5b13c8LL /* 869 */,
497 0xacdc82b714273e1dLL /* 870 */, 0xdd40bfe003199d17LL /* 871 */,
498 0x37e99257e7e061f8LL /* 872 */, 0xfa52626904775aaaLL /* 873 */,
499 0x8bbbf63a463d56f9LL /* 874 */, 0xf0013f1543a26e64LL /* 875 */,
500 0xa8307e9f879ec898LL /* 876 */, 0xcc4c27a4150177ccLL /* 877 */,
501 0x1b432f2cca1d3348LL /* 878 */, 0xde1d1f8f9f6fa013LL /* 879 */,
502 0x606602a047a7ddd6LL /* 880 */, 0xd237ab64cc1cb2c7LL /* 881 */,
503 0x9b938e7225fcd1d3LL /* 882 */, 0xec4e03708e0ff476LL /* 883 */,
504 0xfeb2fbda3d03c12dLL /* 884 */, 0xae0bced2ee43889aLL /* 885 */,
505 0x22cb8923ebfb4f43LL /* 886 */, 0x69360d013cf7396dLL /* 887 */,
506 0x855e3602d2d4e022LL /* 888 */, 0x073805bad01f784cLL /* 889 */,
507 0x33e17a133852f546LL /* 890 */, 0xdf4874058ac7b638LL /* 891 */,
508 0xba92b29c678aa14aLL /* 892 */, 0x0ce89fc76cfaadcdLL /* 893 */,
509 0x5f9d4e0908339e34LL /* 894 */, 0xf1afe9291f5923b9LL /* 895 */,
510 0x6e3480f60f4a265fLL /* 896 */, 0xeebf3a2ab29b841cLL /* 897 */,
511 0xe21938a88f91b4adLL /* 898 */, 0x57dfeff845c6d3c3LL /* 899 */,
512 0x2f006b0bf62caaf2LL /* 900 */, 0x62f479ef6f75ee78LL /* 901 */,
513 0x11a55ad41c8916a9LL /* 902 */, 0xf229d29084fed453LL /* 903 */,
514 0x42f1c27b16b000e6LL /* 904 */, 0x2b1f76749823c074LL /* 905 */,
515 0x4b76eca3c2745360LL /* 906 */, 0x8c98f463b91691bdLL /* 907 */,
516 0x14bcc93cf1ade66aLL /* 908 */, 0x8885213e6d458397LL /* 909 */,
517 0x8e177df0274d4711LL /* 910 */, 0xb49b73b5503f2951LL /* 911 */,
518 0x10168168c3f96b6bLL /* 912 */, 0x0e3d963b63cab0aeLL /* 913 */,
519 0x8dfc4b5655a1db14LL /* 914 */, 0xf789f1356e14de5cLL /* 915 */,
520 0x683e68af4e51dac1LL /* 916 */, 0xc9a84f9d8d4b0fd9LL /* 917 */,
521 0x3691e03f52a0f9d1LL /* 918 */, 0x5ed86e46e1878e80LL /* 919 */,
522 0x3c711a0e99d07150LL /* 920 */, 0x5a0865b20c4e9310LL /* 921 */,
523 0x56fbfc1fe4f0682eLL /* 922 */, 0xea8d5de3105edf9bLL /* 923 */,
524 0x71abfdb12379187aLL /* 924 */, 0x2eb99de1bee77b9cLL /* 925 */,
525 0x21ecc0ea33cf4523LL /* 926 */, 0x59a4d7521805c7a1LL /* 927 */,
526 0x3896f5eb56ae7c72LL /* 928 */, 0xaa638f3db18f75dcLL /* 929 */,
527 0x9f39358dabe9808eLL /* 930 */, 0xb7defa91c00b72acLL /* 931 */,
528 0x6b5541fd62492d92LL /* 932 */, 0x6dc6dee8f92e4d5bLL /* 933 */,
529 0x353f57abc4beea7eLL /* 934 */, 0x735769d6da5690ceLL /* 935 */,
530 0x0a234aa642391484LL /* 936 */, 0xf6f9508028f80d9dLL /* 937 */,
531 0xb8e319a27ab3f215LL /* 938 */, 0x31ad9c1151341a4dLL /* 939 */,
532 0x773c22a57bef5805LL /* 940 */, 0x45c7561a07968633LL /* 941 */,
533 0xf913da9e249dbe36LL /* 942 */, 0xda652d9b78a64c68LL /* 943 */,
534 0x4c27a97f3bc334efLL /* 944 */, 0x76621220e66b17f4LL /* 945 */,
535 0x967743899acd7d0bLL /* 946 */, 0xf3ee5bcae0ed6782LL /* 947 */,
536 0x409f753600c879fcLL /* 948 */, 0x06d09a39b5926db6LL /* 949 */,
537 0x6f83aeb0317ac588LL /* 950 */, 0x01e6ca4a86381f21LL /* 951 */,
538 0x66ff3462d19f3025LL /* 952 */, 0x72207c24ddfd3bfbLL /* 953 */,
539 0x4af6b6d3e2ece2ebLL /* 954 */, 0x9c994dbec7ea08deLL /* 955 */,
540 0x49ace597b09a8bc4LL /* 956 */, 0xb38c4766cf0797baLL /* 957 */,
541 0x131b9373c57c2a75LL /* 958 */, 0xb1822cce61931e58LL /* 959 */,
542 0x9d7555b909ba1c0cLL /* 960 */, 0x127fafdd937d11d2LL /* 961 */,
543 0x29da3badc66d92e4LL /* 962 */, 0xa2c1d57154c2ecbcLL /* 963 */,
544 0x58c5134d82f6fe24LL /* 964 */, 0x1c3ae3515b62274fLL /* 965 */,
545 0xe907c82e01cb8126LL /* 966 */, 0xf8ed091913e37fcbLL /* 967 */,
546 0x3249d8f9c80046c9LL /* 968 */, 0x80cf9bede388fb63LL /* 969 */,
547 0x1881539a116cf19eLL /* 970 */, 0x5103f3f76bd52457LL /* 971 */,
548 0x15b7e6f5ae47f7a8LL /* 972 */, 0xdbd7c6ded47e9ccfLL /* 973 */,
549 0x44e55c410228bb1aLL /* 974 */, 0xb647d4255edb4e99LL /* 975 */,
550 0x5d11882bb8aafc30LL /* 976 */, 0xf5098bbb29d3212aLL /* 977 */,
551 0x8fb5ea14e90296b3LL /* 978 */, 0x677b942157dd025aLL /* 979 */,
552 0xfb58e7c0a390acb5LL /* 980 */, 0x89d3674c83bd4a01LL /* 981 */,
553 0x9e2da4df4bf3b93bLL /* 982 */, 0xfcc41e328cab4829LL /* 983 */,
554 0x03f38c96ba582c52LL /* 984 */, 0xcad1bdbd7fd85db2LL /* 985 */,
555 0xbbb442c16082ae83LL /* 986 */, 0xb95fe86ba5da9ab0LL /* 987 */,
556 0xb22e04673771a93fLL /* 988 */, 0x845358c9493152d8LL /* 989 */,
557 0xbe2a488697b4541eLL /* 990 */, 0x95a2dc2dd38e6966LL /* 991 */,
558 0xc02c11ac923c852bLL /* 992 */, 0x2388b1990df2a87bLL /* 993 */,
559 0x7c8008fa1b4f37beLL /* 994 */, 0x1f70d0c84d54e503LL /* 995 */,
560 0x5490adec7ece57d4LL /* 996 */, 0x002b3c27d9063a3aLL /* 997 */,
561 0x7eaea3848030a2bfLL /* 998 */, 0xc602326ded2003c0LL /* 999 */,
562 0x83a7287d69a94086LL /* 1000 */, 0xc57a5fcb30f57a8aLL /* 1001 */,
563 0xb56844e479ebe779LL /* 1002 */, 0xa373b40f05dcbce9LL /* 1003 */,
564 0xd71a786e88570ee2LL /* 1004 */, 0x879cbacdbde8f6a0LL /* 1005 */,
565 0x976ad1bcc164a32fLL /* 1006 */, 0xab21e25e9666d78bLL /* 1007 */,
566 0x901063aae5e5c33cLL /* 1008 */, 0x9818b34448698d90LL /* 1009 */,
567 0xe36487ae3e1e8abbLL /* 1010 */, 0xafbdf931893bdcb4LL /* 1011 */,
568 0x6345a0dc5fbbd519LL /* 1012 */, 0x8628fe269b9465caLL /* 1013 */,
569 0x1e5d01603f9c51ecLL /* 1014 */, 0x4de44006a15049b7LL /* 1015 */,
570 0xbf6c70e5f776cbb1LL /* 1016 */, 0x411218f2ef552bedLL /* 1017 */,
571 0xcb0c0708705a36a3LL /* 1018 */, 0xe74d14754f986044LL /* 1019 */,
572 0xcd56d9430ea8280eLL /* 1020 */, 0xc12591d7535f5065LL /* 1021 */,
573 0xc83223f1720aef96LL /* 1022 */, 0xc3a0396f7363a51fLL /* 1023 */
574 };
575
576
577
578 // Inserted code
579 // From libgcrypt, g10lib.h
580 #define wipememory2(_ptr,_set,_len) do { \
581 volatile char *_vptr=(volatile char *)(_ptr); \
582 size_t _vlen=(_len); \
583 while(_vlen) { *_vptr=(_set); _vptr++; _vlen--; } \
584 } while(0)
585 #define wipememory(_ptr,_len) wipememory2(_ptr,0,_len)
586
587 void _gcry_burn_stack(int bytes);
588
589
590 // Inserted code
591 // From libgcrypt, misc.c
592 void
_gcry_burn_stack(int bytes)593 _gcry_burn_stack (int bytes)
594 {
595 char buf[64];
596
597 wipememory (buf, sizeof buf);
598 bytes -= sizeof buf;
599 if (bytes > 0)
600 _gcry_burn_stack (bytes);
601 }
602
603
604 // libgcrypt, tiger.c
605 typedef struct
606 {
607 uint64_t a, b, c;
608 unsigned char buf[64];
609 int count;
610 uint32_t nblocks;
611 int variant; /* 0 = old code, 1 = fixed code, 2 - TIGER2. */
612 } TIGER_CONTEXT;
613
614
615 static void
do_init(void * context,int variant)616 do_init (void *context, int variant)
617 {
618 TIGER_CONTEXT *hd = (TIGER_CONTEXT *)context;
619
620 hd->a = 0x0123456789abcdefLL;
621 hd->b = 0xfedcba9876543210LL;
622 hd->c = 0xf096a5b4c3b2e187LL;
623 hd->nblocks = 0;
624 hd->count = 0;
625 hd->variant = variant;
626 }
627
628 static void
tiger_init(void * context)629 tiger_init (void *context)
630 {
631 do_init (context, 0);
632 }
633
634 static void
tiger1_init(void * context)635 tiger1_init (void *context)
636 {
637 do_init (context, 1);
638 }
639
640 static void
tiger2_init(void * context)641 tiger2_init (void *context)
642 {
643 do_init (context, 2);
644 }
645
646 static void
tiger_round(uint64_t * ra,uint64_t * rb,uint64_t * rc,uint64_t x,int mul)647 tiger_round( uint64_t *ra, uint64_t *rb, uint64_t *rc, uint64_t x, int mul )
648 {
649 uint64_t a = *ra;
650 uint64_t b = *rb;
651 uint64_t c = *rc;
652
653 c ^= x;
654 a -= ( sbox1[ c & 0xff ] ^ sbox2[ (c >> 16) & 0xff ]
655 ^ sbox3[ (c >> 32) & 0xff ] ^ sbox4[ (c >> 48) & 0xff ]);
656 b += ( sbox4[ (c >> 8) & 0xff ] ^ sbox3[ (c >> 24) & 0xff ]
657 ^ sbox2[ (c >> 40) & 0xff ] ^ sbox1[ (c >> 56) & 0xff ]);
658 b *= mul;
659
660 *ra = a;
661 *rb = b;
662 *rc = c;
663 }
664
665
666 static void
pass(uint64_t * ra,uint64_t * rb,uint64_t * rc,uint64_t * x,int mul)667 pass( uint64_t *ra, uint64_t *rb, uint64_t *rc, uint64_t *x, int mul )
668 {
669 uint64_t a = *ra;
670 uint64_t b = *rb;
671 uint64_t c = *rc;
672
673 tiger_round( &a, &b, &c, x[0], mul );
674 tiger_round( &b, &c, &a, x[1], mul );
675 tiger_round( &c, &a, &b, x[2], mul );
676 tiger_round( &a, &b, &c, x[3], mul );
677 tiger_round( &b, &c, &a, x[4], mul );
678 tiger_round( &c, &a, &b, x[5], mul );
679 tiger_round( &a, &b, &c, x[6], mul );
680 tiger_round( &b, &c, &a, x[7], mul );
681
682 *ra = a;
683 *rb = b;
684 *rc = c;
685 }
686
687
688 static void
key_schedule(uint64_t * x)689 key_schedule( uint64_t *x )
690 {
691 x[0] -= x[7] ^ 0xa5a5a5a5a5a5a5a5LL;
692 x[1] ^= x[0];
693 x[2] += x[1];
694 x[3] -= x[2] ^ ((~x[1]) << 19 );
695 x[4] ^= x[3];
696 x[5] += x[4];
697 x[6] -= x[5] ^ ((~x[4]) >> 23 );
698 x[7] ^= x[6];
699 x[0] += x[7];
700 x[1] -= x[0] ^ ((~x[7]) << 19 );
701 x[2] ^= x[1];
702 x[3] += x[2];
703 x[4] -= x[3] ^ ((~x[2]) >> 23 );
704 x[5] ^= x[4];
705 x[6] += x[5];
706 x[7] -= x[6] ^ 0x0123456789abcdefLL;
707 }
708
709
710 /****************
711 * Transform the message DATA which consists of 512 bytes (8 words)
712 */
713 static void
transform(TIGER_CONTEXT * hd,const unsigned char * data)714 transform ( TIGER_CONTEXT *hd, const unsigned char *data )
715 {
716 uint64_t a,b,c,aa,bb,cc;
717 uint64_t x[8];
718 #ifdef WORDS_BIGENDIAN
719 #define MKWORD(d,n) \
720 ( ((uint64_t)(d)[8*(n)+7]) << 56 | ((uint64_t)(d)[8*(n)+6]) << 48 \
721 | ((uint64_t)(d)[8*(n)+5]) << 40 | ((uint64_t)(d)[8*(n)+4]) << 32 \
722 | ((uint64_t)(d)[8*(n)+3]) << 24 | ((uint64_t)(d)[8*(n)+2]) << 16 \
723 | ((uint64_t)(d)[8*(n)+1]) << 8 | ((uint64_t)(d)[8*(n) ]) )
724 x[0] = MKWORD(data, 0);
725 x[1] = MKWORD(data, 1);
726 x[2] = MKWORD(data, 2);
727 x[3] = MKWORD(data, 3);
728 x[4] = MKWORD(data, 4);
729 x[5] = MKWORD(data, 5);
730 x[6] = MKWORD(data, 6);
731 x[7] = MKWORD(data, 7);
732 #undef MKWORD
733 #else
734 memcpy( &x[0], data, 64 );
735 #endif
736
737 /* save */
738 a = aa = hd->a;
739 b = bb = hd->b;
740 c = cc = hd->c;
741
742 pass( &a, &b, &c, x, 5);
743 key_schedule( x );
744 pass( &c, &a, &b, x, 7);
745 key_schedule( x );
746 pass( &b, &c, &a, x, 9);
747
748 /* feedforward */
749 a ^= aa;
750 b -= bb;
751 c += cc;
752 /* store */
753 hd->a = a;
754 hd->b = b;
755 hd->c = c;
756 }
757
758
759
760 /* Update the message digest with the contents
761 * of INBUF with length INLEN.
762 */
763 static void
tiger_write(void * context,const void * inbuf_arg,size_t inlen)764 tiger_write ( void *context, const void *inbuf_arg, size_t inlen)
765 {
766 const unsigned char *inbuf = (const unsigned char *)inbuf_arg;
767 TIGER_CONTEXT *hd = (TIGER_CONTEXT *)context;
768
769 if( hd->count == 64) /* flush the buffer */
770 {
771 transform( hd, hd->buf );
772 _gcry_burn_stack (21*8+11*sizeof(void*));
773 hd->count = 0;
774 hd->nblocks++;
775 }
776 if( !inbuf )
777 return;
778 if( hd->count )
779 {
780 for( ; inlen && hd->count < 64; inlen-- )
781 hd->buf[hd->count++] = *inbuf++;
782 tiger_write( hd, NULL, 0 );
783 if( !inlen )
784 return;
785 }
786
787 while( inlen >= 64 )
788 {
789 transform( hd, inbuf );
790 hd->count = 0;
791 hd->nblocks++;
792 inlen -= 64;
793 inbuf += 64;
794 }
795 _gcry_burn_stack (21*8+11*sizeof(void*));
796 for( ; inlen && hd->count < 64; inlen-- )
797 hd->buf[hd->count++] = *inbuf++;
798 }
799
800
801
802 /* The routine terminates the computation
803 */
804 static void
tiger_final(void * context)805 tiger_final( void *context )
806 {
807 TIGER_CONTEXT *hd = (TIGER_CONTEXT *)context;
808 uint32_t t, msb, lsb;
809 unsigned char *p;
810 unsigned char pad = hd->variant == 2? 0x80 : 0x01;
811
812 tiger_write(hd, NULL, 0); /* flush */;
813
814 t = hd->nblocks;
815 /* multiply by 64 to make a byte count */
816 lsb = t << 6;
817 msb = t >> 26;
818 /* add the count */
819 t = lsb;
820 if( (lsb += hd->count) < t )
821 msb++;
822 /* multiply by 8 to make a bit count */
823 t = lsb;
824 lsb <<= 3;
825 msb <<= 3;
826 msb |= t >> 29;
827
828 if( hd->count < 56 ) /* enough room */
829 {
830 hd->buf[hd->count++] = pad;
831 while( hd->count < 56 )
832 hd->buf[hd->count++] = 0; /* pad */
833 }
834 else /* need one extra block */
835 {
836 hd->buf[hd->count++] = pad; /* pad character */
837 while( hd->count < 64 )
838 hd->buf[hd->count++] = 0;
839 tiger_write(hd, NULL, 0); /* flush */;
840 memset(hd->buf, 0, 56 ); /* fill next block with zeroes */
841 }
842 /* append the 64 bit count */
843 hd->buf[56] = lsb ;
844 hd->buf[57] = lsb >> 8;
845 hd->buf[58] = lsb >> 16;
846 hd->buf[59] = lsb >> 24;
847 hd->buf[60] = msb ;
848 hd->buf[61] = msb >> 8;
849 hd->buf[62] = msb >> 16;
850 hd->buf[63] = msb >> 24;
851 transform( hd, hd->buf );
852 _gcry_burn_stack (21*8+11*sizeof(void*));
853
854 p = hd->buf;
855 #ifdef WORDS_BIGENDIAN
856 #define X(a) do { *(uint64_t*)p = hd->a ; p += 8; } while(0)
857 #else /* little endian */
858 #define X(a) do { *p++ = hd->a >> 56; *p++ = hd->a >> 48; \
859 *p++ = hd->a >> 40; *p++ = hd->a >> 32; \
860 *p++ = hd->a >> 24; *p++ = hd->a >> 16; \
861 *p++ = hd->a >> 8; *p++ = hd->a; } while(0)
862 #endif
863 #define Y(a) do { *p++ = hd->a ; *p++ = hd->a >> 8; \
864 *p++ = hd->a >> 16; *p++ = hd->a >> 24; \
865 *p++ = hd->a >> 32; *p++ = hd->a >> 40; \
866 *p++ = hd->a >> 48; *p++ = hd->a >> 56; } while(0)
867 if (hd->variant == 0)
868 {
869 X(a);
870 X(b);
871 X(c);
872 }
873 else
874 {
875 Y(a);
876 Y(b);
877 Y(c);
878 }
879 #undef X
880 #undef Y
881 }
882
883 static unsigned char *
tiger_read(void * context)884 tiger_read( void *context )
885 {
886 TIGER_CONTEXT *hd = (TIGER_CONTEXT *)context;
887
888 return hd->buf;
889 }
890
891
892
893
894
895 // ------------------------------------------------------------------
896 // End Libgcrypt code
897 // ------------------------------------------------------------------
898
hash_init_tiger(void * ctx)899 void hash_init_tiger(void * ctx)
900 {
901 // Variant 0, Unknown
902 // tiger_init(ctx)
903
904 // Variant 1, Tiger
905 tiger1_init(ctx);
906
907 // Variant 2, The Tiger2 Hash
908 // http://www.cs.technion.ac.il/~biham/Reports/Tiger/tiger2-test-vectors-nessie-format.dat
909 // tiger2_init(ctx);
910 }
911
912
hash_update_tiger(void * ctx,const unsigned char * buf,size_t len)913 void hash_update_tiger(void * ctx, const unsigned char *buf, size_t len)
914 {
915 tiger_write(ctx,buf,len);
916 }
917
918
hash_final_tiger(void * ctx,unsigned char * sum)919 void hash_final_tiger(void * ctx, unsigned char *sum)
920 {
921 tiger_final(ctx);
922 unsigned char * tmp = tiger_read(ctx);
923 memcpy(sum,tmp,64);
924 }
925