Tiger hash added
[rofl0r-kripto.git] / lib / hash / tiger.c
blob611a6f33171d9dcb1ba2a85f95f808c9cd978461
1 /*
2 * Written in 2013 by Gregor Pintar <grpintar@gmail.com>
4 * To the extent possible under law, the author(s) have dedicated
5 * all copyright and related and neighboring rights to this software
6 * to the public domain worldwide.
7 *
8 * This software is distributed without any warranty.
10 * You should have received a copy of the CC0 Public Domain Dedication.
11 * If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
14 #include <stdint.h>
15 #include <string.h>
16 #include <stdlib.h>
17 #include <assert.h>
19 #include <kripto/cast.h>
20 #include <kripto/loadstore.h>
21 #include <kripto/memwipe.h>
22 #include <kripto/hash.h>
23 #include <kripto/desc/hash.h>
24 #include <kripto/object/hash.h>
26 #include <kripto/hash/tiger.h>
28 struct kripto_hash
30 struct kripto_hash_object obj;
31 unsigned int passes;
32 uint64_t h[3];
33 uint8_t buf[64];
34 uint64_t len;
35 unsigned int i;
36 int f;
39 static const uint64_t s0[256] =
41 0x02AAB17CF7E90C5E, 0xAC424B03E243A8EC,
42 0x72CD5BE30DD5FCD3, 0x6D019B93F6F97F3A,
43 0xCD9978FFD21F9193, 0x7573A1C9708029E2,
44 0xB164326B922A83C3, 0x46883EEE04915870,
45 0xEAACE3057103ECE6, 0xC54169B808A3535C,
46 0x4CE754918DDEC47C, 0x0AA2F4DFDC0DF40C,
47 0x10B76F18A74DBEFA, 0xC6CCB6235AD1AB6A,
48 0x13726121572FE2FF, 0x1A488C6F199D921E,
49 0x4BC9F9F4DA0007CA, 0x26F5E6F6E85241C7,
50 0x859079DBEA5947B6, 0x4F1885C5C99E8C92,
51 0xD78E761EA96F864B, 0x8E36428C52B5C17D,
52 0x69CF6827373063C1, 0xB607C93D9BB4C56E,
53 0x7D820E760E76B5EA, 0x645C9CC6F07FDC42,
54 0xBF38A078243342E0, 0x5F6B343C9D2E7D04,
55 0xF2C28AEB600B0EC6, 0x6C0ED85F7254BCAC,
56 0x71592281A4DB4FE5, 0x1967FA69CE0FED9F,
57 0xFD5293F8B96545DB, 0xC879E9D7F2A7600B,
58 0x860248920193194E, 0xA4F9533B2D9CC0B3,
59 0x9053836C15957613, 0xDB6DCF8AFC357BF1,
60 0x18BEEA7A7A370F57, 0x037117CA50B99066,
61 0x6AB30A9774424A35, 0xF4E92F02E325249B,
62 0x7739DB07061CCAE1, 0xD8F3B49CECA42A05,
63 0xBD56BE3F51382F73, 0x45FAED5843B0BB28,
64 0x1C813D5C11BF1F83, 0x8AF0E4B6D75FA169,
65 0x33EE18A487AD9999, 0x3C26E8EAB1C94410,
66 0xB510102BC0A822F9, 0x141EEF310CE6123B,
67 0xFC65B90059DDB154, 0xE0158640C5E0E607,
68 0x884E079826C3A3CF, 0x930D0D9523C535FD,
69 0x35638D754E9A2B00, 0x4085FCCF40469DD5,
70 0xC4B17AD28BE23A4C, 0xCAB2F0FC6A3E6A2E,
71 0x2860971A6B943FCD, 0x3DDE6EE212E30446,
72 0x6222F32AE01765AE, 0x5D550BB5478308FE,
73 0xA9EFA98DA0EDA22A, 0xC351A71686C40DA7,
74 0x1105586D9C867C84, 0xDCFFEE85FDA22853,
75 0xCCFBD0262C5EEF76, 0xBAF294CB8990D201,
76 0xE69464F52AFAD975, 0x94B013AFDF133E14,
77 0x06A7D1A32823C958, 0x6F95FE5130F61119,
78 0xD92AB34E462C06C0, 0xED7BDE33887C71D2,
79 0x79746D6E6518393E, 0x5BA419385D713329,
80 0x7C1BA6B948A97564, 0x31987C197BFDAC67,
81 0xDE6C23C44B053D02, 0x581C49FED002D64D,
82 0xDD474D6338261571, 0xAA4546C3E473D062,
83 0x928FCE349455F860, 0x48161BBACAAB94D9,
84 0x63912430770E6F68, 0x6EC8A5E602C6641C,
85 0x87282515337DDD2B, 0x2CDA6B42034B701B,
86 0xB03D37C181CB096D, 0xE108438266C71C6F,
87 0x2B3180C7EB51B255, 0xDF92B82F96C08BBC,
88 0x5C68C8C0A632F3BA, 0x5504CC861C3D0556,
89 0xABBFA4E55FB26B8F, 0x41848B0AB3BACEB4,
90 0xB334A273AA445D32, 0xBCA696F0A85AD881,
91 0x24F6EC65B528D56C, 0x0CE1512E90F4524A,
92 0x4E9DD79D5506D35A, 0x258905FAC6CE9779,
93 0x2019295B3E109B33, 0xF8A9478B73A054CC,
94 0x2924F2F934417EB0, 0x3993357D536D1BC4,
95 0x38A81AC21DB6FF8B, 0x47C4FBF17D6016BF,
96 0x1E0FAADD7667E3F5, 0x7ABCFF62938BEB96,
97 0xA78DAD948FC179C9, 0x8F1F98B72911E50D,
98 0x61E48EAE27121A91, 0x4D62F7AD31859808,
99 0xECEBA345EF5CEAEB, 0xF5CEB25EBC9684CE,
100 0xF633E20CB7F76221, 0xA32CDF06AB8293E4,
101 0x985A202CA5EE2CA4, 0xCF0B8447CC8A8FB1,
102 0x9F765244979859A3, 0xA8D516B1A1240017,
103 0x0BD7BA3EBB5DC726, 0xE54BCA55B86ADB39,
104 0x1D7A3AFD6C478063, 0x519EC608E7669EDD,
105 0x0E5715A2D149AA23, 0x177D4571848FF194,
106 0xEEB55F3241014C22, 0x0F5E5CA13A6E2EC2,
107 0x8029927B75F5C361, 0xAD139FABC3D6E436,
108 0x0D5DF1A94CCF402F, 0x3E8BD948BEA5DFC8,
109 0xA5A0D357BD3FF77E, 0xA2D12E251F74F645,
110 0x66FD9E525E81A082, 0x2E0C90CE7F687A49,
111 0xC2E8BCBEBA973BC5, 0x000001BCE509745F,
112 0x423777BBE6DAB3D6, 0xD1661C7EAEF06EB5,
113 0xA1781F354DAACFD8, 0x2D11284A2B16AFFC,
114 0xF1FC4F67FA891D1F, 0x73ECC25DCB920ADA,
115 0xAE610C22C2A12651, 0x96E0A810D356B78A,
116 0x5A9A381F2FE7870F, 0xD5AD62EDE94E5530,
117 0xD225E5E8368D1427, 0x65977B70C7AF4631,
118 0x99F889B2DE39D74F, 0x233F30BF54E1D143,
119 0x9A9675D3D9A63C97, 0x5470554FF334F9A8,
120 0x166ACB744A4F5688, 0x70C74CAAB2E4AEAD,
121 0xF0D091646F294D12, 0x57B82A89684031D1,
122 0xEFD95A5A61BE0B6B, 0x2FBD12E969F2F29A,
123 0x9BD37013FEFF9FE8, 0x3F9B0404D6085A06,
124 0x4940C1F3166CFE15, 0x09542C4DCDF3DEFB,
125 0xB4C5218385CD5CE3, 0xC935B7DC4462A641,
126 0x3417F8A68ED3B63F, 0xB80959295B215B40,
127 0xF99CDAEF3B8C8572, 0x018C0614F8FCB95D,
128 0x1B14ACCD1A3ACDF3, 0x84D471F200BB732D,
129 0xC1A3110E95E8DA16, 0x430A7220BF1A82B8,
130 0xB77E090D39DF210E, 0x5EF4BD9F3CD05E9D,
131 0x9D4FF6DA7E57A444, 0xDA1D60E183D4A5F8,
132 0xB287C38417998E47, 0xFE3EDC121BB31886,
133 0xC7FE3CCC980CCBEF, 0xE46FB590189BFD03,
134 0x3732FD469A4C57DC, 0x7EF700A07CF1AD65,
135 0x59C64468A31D8859, 0x762FB0B4D45B61F6,
136 0x155BAED099047718, 0x68755E4C3D50BAA6,
137 0xE9214E7F22D8B4DF, 0x2ADDBF532EAC95F4,
138 0x32AE3909B4BD0109, 0x834DF537B08E3450,
139 0xFA209DA84220728D, 0x9E691D9B9EFE23F7,
140 0x0446D288C4AE8D7F, 0x7B4CC524E169785B,
141 0x21D87F0135CA1385, 0xCEBB400F137B8AA5,
142 0x272E2B66580796BE, 0x3612264125C2B0DE,
143 0x057702BDAD1EFBB2, 0xD4BABB8EACF84BE9,
144 0x91583139641BC67B, 0x8BDC2DE08036E024,
145 0x603C8156F49F68ED, 0xF7D236F7DBEF5111,
146 0x9727C4598AD21E80, 0xA08A0896670A5FD7,
147 0xCB4A8F4309EBA9CB, 0x81AF564B0F7036A1,
148 0xC0B99AA778199ABD, 0x959F1EC83FC8E952,
149 0x8C505077794A81B9, 0x3ACAAF8F056338F0,
150 0x07B43F50627A6778, 0x4A44AB49F5ECCC77,
151 0x3BC3D6E4B679EE98, 0x9CC0D4D1CF14108C,
152 0x4406C00B206BC8A0, 0x82A18854C8D72D89,
153 0x67E366B35C3C432C, 0xB923DD61102B37F2,
154 0x56AB2779D884271D, 0xBE83E1B0FF1525AF,
155 0xFB7C65D4217E49A9, 0x6BDBE0E76D48E7D4,
156 0x08DF828745D9179E, 0x22EA6A9ADD53BD34,
157 0xE36E141C5622200A, 0x7F805D1B8CB750EE,
158 0xAFE5C7A59F58E837, 0xE27F996A4FB1C23C,
159 0xD3867DFB0775F0D0, 0xD0E673DE6E88891A,
160 0x123AEB9EAFB86C25, 0x30F1D5D5C145B895,
161 0xBB434A2DEE7269E7, 0x78CB67ECF931FA38,
162 0xF33B0372323BBF9C, 0x52D66336FB279C74,
163 0x505F33AC0AFB4EAA, 0xE8A5CD99A2CCE187,
164 0x534974801E2D30BB, 0x8D2D5711D5876D90,
165 0x1F1A412891BC038E, 0xD6E2E71D82E56648,
166 0x74036C3A497732B7, 0x89B67ED96361F5AB,
167 0xFFED95D8F1EA02A2, 0xE72B3BD61464D43D,
168 0xA6300F170BDC4820, 0xEBC18760ED78A77A
171 static const uint64_t s1[256] =
173 0xE6A6BE5A05A12138, 0xB5A122A5B4F87C98,
174 0x563C6089140B6990, 0x4C46CB2E391F5DD5,
175 0xD932ADDBC9B79434, 0x08EA70E42015AFF5,
176 0xD765A6673E478CF1, 0xC4FB757EAB278D99,
177 0xDF11C6862D6E0692, 0xDDEB84F10D7F3B16,
178 0x6F2EF604A665EA04, 0x4A8E0F0FF0E0DFB3,
179 0xA5EDEEF83DBCBA51, 0xFC4F0A2A0EA4371E,
180 0xE83E1DA85CB38429, 0xDC8FF882BA1B1CE2,
181 0xCD45505E8353E80D, 0x18D19A00D4DB0717,
182 0x34A0CFEDA5F38101, 0x0BE77E518887CAF2,
183 0x1E341438B3C45136, 0xE05797F49089CCF9,
184 0xFFD23F9DF2591D14, 0x543DDA228595C5CD,
185 0x661F81FD99052A33, 0x8736E641DB0F7B76,
186 0x15227725418E5307, 0xE25F7F46162EB2FA,
187 0x48A8B2126C13D9FE, 0xAFDC541792E76EEA,
188 0x03D912BFC6D1898F, 0x31B1AAFA1B83F51B,
189 0xF1AC2796E42AB7D9, 0x40A3A7D7FCD2EBAC,
190 0x1056136D0AFBBCC5, 0x7889E1DD9A6D0C85,
191 0xD33525782A7974AA, 0xA7E25D09078AC09B,
192 0xBD4138B3EAC6EDD0, 0x920ABFBE71EB9E70,
193 0xA2A5D0F54FC2625C, 0xC054E36B0B1290A3,
194 0xF6DD59FF62FE932B, 0x3537354511A8AC7D,
195 0xCA845E9172FADCD4, 0x84F82B60329D20DC,
196 0x79C62CE1CD672F18, 0x8B09A2ADD124642C,
197 0xD0C1E96A19D9E726, 0x5A786A9B4BA9500C,
198 0x0E020336634C43F3, 0xC17B474AEB66D822,
199 0x6A731AE3EC9BAAC2, 0x8226667AE0840258,
200 0x67D4567691CAECA5, 0x1D94155C4875ADB5,
201 0x6D00FD985B813FDF, 0x51286EFCB774CD06,
202 0x5E8834471FA744AF, 0xF72CA0AEE761AE2E,
203 0xBE40E4CDAEE8E09A, 0xE9970BBB5118F665,
204 0x726E4BEB33DF1964, 0x703B000729199762,
205 0x4631D816F5EF30A7, 0xB880B5B51504A6BE,
206 0x641793C37ED84B6C, 0x7B21ED77F6E97D96,
207 0x776306312EF96B73, 0xAE528948E86FF3F4,
208 0x53DBD7F286A3F8F8, 0x16CADCE74CFC1063,
209 0x005C19BDFA52C6DD, 0x68868F5D64D46AD3,
210 0x3A9D512CCF1E186A, 0x367E62C2385660AE,
211 0xE359E7EA77DCB1D7, 0x526C0773749ABE6E,
212 0x735AE5F9D09F734B, 0x493FC7CC8A558BA8,
213 0xB0B9C1533041AB45, 0x321958BA470A59BD,
214 0x852DB00B5F46C393, 0x91209B2BD336B0E5,
215 0x6E604F7D659EF19F, 0xB99A8AE2782CCB24,
216 0xCCF52AB6C814C4C7, 0x4727D9AFBE11727B,
217 0x7E950D0C0121B34D, 0x756F435670AD471F,
218 0xF5ADD442615A6849, 0x4E87E09980B9957A,
219 0x2ACFA1DF50AEE355, 0xD898263AFD2FD556,
220 0xC8F4924DD80C8FD6, 0xCF99CA3D754A173A,
221 0xFE477BACAF91BF3C, 0xED5371F6D690C12D,
222 0x831A5C285E687094, 0xC5D3C90A3708A0A4,
223 0x0F7F903717D06580, 0x19F9BB13B8FDF27F,
224 0xB1BD6F1B4D502843, 0x1C761BA38FFF4012,
225 0x0D1530C4E2E21F3B, 0x8943CE69A7372C8A,
226 0xE5184E11FEB5CE66, 0x618BDB80BD736621,
227 0x7D29BAD68B574D0B, 0x81BB613E25E6FE5B,
228 0x071C9C10BC07913F, 0xC7BEEB7909AC2D97,
229 0xC3E58D353BC5D757, 0xEB017892F38F61E8,
230 0xD4EFFB9C9B1CC21A, 0x99727D26F494F7AB,
231 0xA3E063A2956B3E03, 0x9D4A8B9A4AA09C30,
232 0x3F6AB7D500090FB4, 0x9CC0F2A057268AC0,
233 0x3DEE9D2DEDBF42D1, 0x330F49C87960A972,
234 0xC6B2720287421B41, 0x0AC59EC07C00369C,
235 0xEF4EAC49CB353425, 0xF450244EEF0129D8,
236 0x8ACC46E5CAF4DEB6, 0x2FFEAB63989263F7,
237 0x8F7CB9FE5D7A4578, 0x5BD8F7644E634635,
238 0x427A7315BF2DC900, 0x17D0C4AA2125261C,
239 0x3992486C93518E50, 0xB4CBFEE0A2D7D4C3,
240 0x7C75D6202C5DDD8D, 0xDBC295D8E35B6C61,
241 0x60B369D302032B19, 0xCE42685FDCE44132,
242 0x06F3DDB9DDF65610, 0x8EA4D21DB5E148F0,
243 0x20B0FCE62FCD496F, 0x2C1B912358B0EE31,
244 0xB28317B818F5A308, 0xA89C1E189CA6D2CF,
245 0x0C6B18576AAADBC8, 0xB65DEAA91299FAE3,
246 0xFB2B794B7F1027E7, 0x04E4317F443B5BEB,
247 0x4B852D325939D0A6, 0xD5AE6BEEFB207FFC,
248 0x309682B281C7D374, 0xBAE309A194C3B475,
249 0x8CC3F97B13B49F05, 0x98A9422FF8293967,
250 0x244B16B01076FF7C, 0xF8BF571C663D67EE,
251 0x1F0D6758EEE30DA1, 0xC9B611D97ADEB9B7,
252 0xB7AFD5887B6C57A2, 0x6290AE846B984FE1,
253 0x94DF4CDEACC1A5FD, 0x058A5BD1C5483AFF,
254 0x63166CC142BA3C37, 0x8DB8526EB2F76F40,
255 0xE10880036F0D6D4E, 0x9E0523C9971D311D,
256 0x45EC2824CC7CD691, 0x575B8359E62382C9,
257 0xFA9E400DC4889995, 0xD1823ECB45721568,
258 0xDAFD983B8206082F, 0xAA7D29082386A8CB,
259 0x269FCD4403B87588, 0x1B91F5F728BDD1E0,
260 0xE4669F39040201F6, 0x7A1D7C218CF04ADE,
261 0x65623C29D79CE5CE, 0x2368449096C00BB1,
262 0xAB9BF1879DA503BA, 0xBC23ECB1A458058E,
263 0x9A58DF01BB401ECC, 0xA070E868A85F143D,
264 0x4FF188307DF2239E, 0x14D565B41A641183,
265 0xEE13337452701602, 0x950E3DCF3F285E09,
266 0x59930254B9C80953, 0x3BF299408930DA6D,
267 0xA955943F53691387, 0xA15EDECAA9CB8784,
268 0x29142127352BE9A0, 0x76F0371FFF4E7AFB,
269 0x0239F450274F2228, 0xBB073AF01D5E868B,
270 0xBFC80571C10E96C1, 0xD267088568222E23,
271 0x9671A3D48E80B5B0, 0x55B5D38AE193BB81,
272 0x693AE2D0A18B04B8, 0x5C48B4ECADD5335F,
273 0xFD743B194916A1CA, 0x2577018134BE98C4,
274 0xE77987E83C54A4AD, 0x28E11014DA33E1B9,
275 0x270CC59E226AA213, 0x71495F756D1A5F60,
276 0x9BE853FB60AFEF77, 0xADC786A7F7443DBF,
277 0x0904456173B29A82, 0x58BC7A66C232BD5E,
278 0xF306558C673AC8B2, 0x41F639C6B6C9772A,
279 0x216DEFE99FDA35DA, 0x11640CC71C7BE615,
280 0x93C43694565C5527, 0xEA038E6246777839,
281 0xF9ABF3CE5A3E2469, 0x741E768D0FD312D2,
282 0x0144B883CED652C6, 0xC20B5A5BA33F8552,
283 0x1AE69633C3435A9D, 0x97A28CA4088CFDEC,
284 0x8824A43C1E96F420, 0x37612FA66EEEA746,
285 0x6B4CB165F9CF0E5A, 0x43AA1C06A0ABFB4A,
286 0x7F4DC26FF162796B, 0x6CBACC8E54ED9B0F,
287 0xA6B7FFEFD2BB253E, 0x2E25BC95B0A29D4F,
288 0x86D6A58BDEF1388C, 0xDED74AC576B6F054,
289 0x8030BDBC2B45805D, 0x3C81AF70E94D9289,
290 0x3EFF6DDA9E3100DB, 0xB38DC39FDFCC8847,
291 0x123885528D17B87E, 0xF2DA0ED240B1B642,
292 0x44CEFADCD54BF9A9, 0x1312200E433C7EE6,
293 0x9FFCC84F3A78C748, 0xF0CD1F72248576BB,
294 0xEC6974053638CFE4, 0x2BA7B67C0CEC4E4C,
295 0xAC2F4DF3E5CE32ED, 0xCB33D14326EA4C11,
296 0xA4E9044CC77E58BC, 0x5F513293D934FCEF,
297 0x5DC9645506E55444, 0x50DE418F317DE40A,
298 0x388CB31A69DDE259, 0x2DB4A83455820A86,
299 0x9010A91E84711AE9, 0x4DF7F0B7B1498371,
300 0xD62A2EABC0977179, 0x22FAC097AA8D5C0E
303 static const uint64_t s2[256] =
305 0xF49FCC2FF1DAF39B, 0x487FD5C66FF29281,
306 0xE8A30667FCDCA83F, 0x2C9B4BE3D2FCCE63,
307 0xDA3FF74B93FBBBC2, 0x2FA165D2FE70BA66,
308 0xA103E279970E93D4, 0xBECDEC77B0E45E71,
309 0xCFB41E723985E497, 0xB70AAA025EF75017,
310 0xD42309F03840B8E0, 0x8EFC1AD035898579,
311 0x96C6920BE2B2ABC5, 0x66AF4163375A9172,
312 0x2174ABDCCA7127FB, 0xB33CCEA64A72FF41,
313 0xF04A4933083066A5, 0x8D970ACDD7289AF5,
314 0x8F96E8E031C8C25E, 0xF3FEC02276875D47,
315 0xEC7BF310056190DD, 0xF5ADB0AEBB0F1491,
316 0x9B50F8850FD58892, 0x4975488358B74DE8,
317 0xA3354FF691531C61, 0x0702BBE481D2C6EE,
318 0x89FB24057DEDED98, 0xAC3075138596E902,
319 0x1D2D3580172772ED, 0xEB738FC28E6BC30D,
320 0x5854EF8F63044326, 0x9E5C52325ADD3BBE,
321 0x90AA53CF325C4623, 0xC1D24D51349DD067,
322 0x2051CFEEA69EA624, 0x13220F0A862E7E4F,
323 0xCE39399404E04864, 0xD9C42CA47086FCB7,
324 0x685AD2238A03E7CC, 0x066484B2AB2FF1DB,
325 0xFE9D5D70EFBF79EC, 0x5B13B9DD9C481854,
326 0x15F0D475ED1509AD, 0x0BEBCD060EC79851,
327 0xD58C6791183AB7F8, 0xD1187C5052F3EEE4,
328 0xC95D1192E54E82FF, 0x86EEA14CB9AC6CA2,
329 0x3485BEB153677D5D, 0xDD191D781F8C492A,
330 0xF60866BAA784EBF9, 0x518F643BA2D08C74,
331 0x8852E956E1087C22, 0xA768CB8DC410AE8D,
332 0x38047726BFEC8E1A, 0xA67738B4CD3B45AA,
333 0xAD16691CEC0DDE19, 0xC6D4319380462E07,
334 0xC5A5876D0BA61938, 0x16B9FA1FA58FD840,
335 0x188AB1173CA74F18, 0xABDA2F98C99C021F,
336 0x3E0580AB134AE816, 0x5F3B05B773645ABB,
337 0x2501A2BE5575F2F6, 0x1B2F74004E7E8BA9,
338 0x1CD7580371E8D953, 0x7F6ED89562764E30,
339 0xB15926FF596F003D, 0x9F65293DA8C5D6B9,
340 0x6ECEF04DD690F84C, 0x4782275FFF33AF88,
341 0xE41433083F820801, 0xFD0DFE409A1AF9B5,
342 0x4325A3342CDB396B, 0x8AE77E62B301B252,
343 0xC36F9E9F6655615A, 0x85455A2D92D32C09,
344 0xF2C7DEA949477485, 0x63CFB4C133A39EBA,
345 0x83B040CC6EBC5462, 0x3B9454C8FDB326B0,
346 0x56F56A9E87FFD78C, 0x2DC2940D99F42BC6,
347 0x98F7DF096B096E2D, 0x19A6E01E3AD852BF,
348 0x42A99CCBDBD4B40B, 0xA59998AF45E9C559,
349 0x366295E807D93186, 0x6B48181BFAA1F773,
350 0x1FEC57E2157A0A1D, 0x4667446AF6201AD5,
351 0xE615EBCACFB0F075, 0xB8F31F4F68290778,
352 0x22713ED6CE22D11E, 0x3057C1A72EC3C93B,
353 0xCB46ACC37C3F1F2F, 0xDBB893FD02AAF50E,
354 0x331FD92E600B9FCF, 0xA498F96148EA3AD6,
355 0xA8D8426E8B6A83EA, 0xA089B274B7735CDC,
356 0x87F6B3731E524A11, 0x118808E5CBC96749,
357 0x9906E4C7B19BD394, 0xAFED7F7E9B24A20C,
358 0x6509EADEEB3644A7, 0x6C1EF1D3E8EF0EDE,
359 0xB9C97D43E9798FB4, 0xA2F2D784740C28A3,
360 0x7B8496476197566F, 0x7A5BE3E6B65F069D,
361 0xF96330ED78BE6F10, 0xEEE60DE77A076A15,
362 0x2B4BEE4AA08B9BD0, 0x6A56A63EC7B8894E,
363 0x02121359BA34FEF4, 0x4CBF99F8283703FC,
364 0x398071350CAF30C8, 0xD0A77A89F017687A,
365 0xF1C1A9EB9E423569, 0x8C7976282DEE8199,
366 0x5D1737A5DD1F7ABD, 0x4F53433C09A9FA80,
367 0xFA8B0C53DF7CA1D9, 0x3FD9DCBC886CCB77,
368 0xC040917CA91B4720, 0x7DD00142F9D1DCDF,
369 0x8476FC1D4F387B58, 0x23F8E7C5F3316503,
370 0x032A2244E7E37339, 0x5C87A5D750F5A74B,
371 0x082B4CC43698992E, 0xDF917BECB858F63C,
372 0x3270B8FC5BF86DDA, 0x10AE72BB29B5DD76,
373 0x576AC94E7700362B, 0x1AD112DAC61EFB8F,
374 0x691BC30EC5FAA427, 0xFF246311CC327143,
375 0x3142368E30E53206, 0x71380E31E02CA396,
376 0x958D5C960AAD76F1, 0xF8D6F430C16DA536,
377 0xC8FFD13F1BE7E1D2, 0x7578AE66004DDBE1,
378 0x05833F01067BE646, 0xBB34B5AD3BFE586D,
379 0x095F34C9A12B97F0, 0x247AB64525D60CA8,
380 0xDCDBC6F3017477D1, 0x4A2E14D4DECAD24D,
381 0xBDB5E6D9BE0A1EEB, 0x2A7E70F7794301AB,
382 0xDEF42D8A270540FD, 0x01078EC0A34C22C1,
383 0xE5DE511AF4C16387, 0x7EBB3A52BD9A330A,
384 0x77697857AA7D6435, 0x004E831603AE4C32,
385 0xE7A21020AD78E312, 0x9D41A70C6AB420F2,
386 0x28E06C18EA1141E6, 0xD2B28CBD984F6B28,
387 0x26B75F6C446E9D83, 0xBA47568C4D418D7F,
388 0xD80BADBFE6183D8E, 0x0E206D7F5F166044,
389 0xE258A43911CBCA3E, 0x723A1746B21DC0BC,
390 0xC7CAA854F5D7CDD3, 0x7CAC32883D261D9C,
391 0x7690C26423BA942C, 0x17E55524478042B8,
392 0xE0BE477656A2389F, 0x4D289B5E67AB2DA0,
393 0x44862B9C8FBBFD31, 0xB47CC8049D141365,
394 0x822C1B362B91C793, 0x4EB14655FB13DFD8,
395 0x1ECBBA0714E2A97B, 0x6143459D5CDE5F14,
396 0x53A8FBF1D5F0AC89, 0x97EA04D81C5E5B00,
397 0x622181A8D4FDB3F3, 0xE9BCD341572A1208,
398 0x1411258643CCE58A, 0x9144C5FEA4C6E0A4,
399 0x0D33D06565CF620F, 0x54A48D489F219CA1,
400 0xC43E5EAC6D63C821, 0xA9728B3A72770DAF,
401 0xD7934E7B20DF87EF, 0xE35503B61A3E86E5,
402 0xCAE321FBC819D504, 0x129A50B3AC60BFA6,
403 0xCD5E68EA7E9FB6C3, 0xB01C90199483B1C7,
404 0x3DE93CD5C295376C, 0xAED52EDF2AB9AD13,
405 0x2E60F512C0A07884, 0xBC3D86A3E36210C9,
406 0x35269D9B163951CE, 0x0C7D6E2AD0CDB5FA,
407 0x59E86297D87F5733, 0x298EF221898DB0E7,
408 0x55000029D1A5AA7E, 0x8BC08AE1B5061B45,
409 0xC2C31C2B6C92703A, 0x94CC596BAF25EF42,
410 0x0A1D73DB22540456, 0x04B6A0F9D9C4179A,
411 0xEFFDAFA2AE3D3C60, 0xF7C8075BB49496C4,
412 0x9CC5C7141D1CD4E3, 0x78BD1638218E5534,
413 0xB2F11568F850246A, 0xEDFABCFA9502BC29,
414 0x796CE5F2DA23051B, 0xAAE128B0DC93537C,
415 0x3A493DA0EE4B29AE, 0xB5DF6B2C416895D7,
416 0xFCABBD25122D7F37, 0x70810B58105DC4B1,
417 0xE10FDD37F7882A90, 0x524DCAB5518A3F5C,
418 0x3C9E85878451255B, 0x4029828119BD34E2,
419 0x74A05B6F5D3CECCB, 0xB610021542E13ECA,
420 0x0FF979D12F59E2AC, 0x6037DA27E4F9CC50,
421 0x5E92975A0DF1847D, 0xD66DE190D3E623FE,
422 0x5032D6B87B568048, 0x9A36B7CE8235216E,
423 0x80272A7A24F64B4A, 0x93EFED8B8C6916F7,
424 0x37DDBFF44CCE1555, 0x4B95DB5D4B99BD25,
425 0x92D3FDA169812FC0, 0xFB1A4A9A90660BB6,
426 0x730C196946A4B9B2, 0x81E289AA7F49DA68,
427 0x64669A0F83B1A05F, 0x27B3FF7D9644F48B,
428 0xCC6B615C8DB675B3, 0x674F20B9BCEBBE95,
429 0x6F31238275655982, 0x5AE488713E45CF05,
430 0xBF619F9954C21157, 0xEABAC46040A8EAE9,
431 0x454C6FE9F2C0C1CD, 0x419CF6496412691C,
432 0xD3DC3BEF265B0F70, 0x6D0E60F5C3578A9E
435 static const uint64_t s3[256] =
437 0x5B0E608526323C55, 0x1A46C1A9FA1B59F5,
438 0xA9E245A17C4C8FFA, 0x65CA5159DB2955D7,
439 0x05DB0A76CE35AFC2, 0x81EAC77EA9113D45,
440 0x528EF88AB6AC0A0D, 0xA09EA253597BE3FF,
441 0x430DDFB3AC48CD56, 0xC4B3A67AF45CE46F,
442 0x4ECECFD8FBE2D05E, 0x3EF56F10B39935F0,
443 0x0B22D6829CD619C6, 0x17FD460A74DF2069,
444 0x6CF8CC8E8510ED40, 0xD6C824BF3A6ECAA7,
445 0x61243D581A817049, 0x048BACB6BBC163A2,
446 0xD9A38AC27D44CC32, 0x7FDDFF5BAAF410AB,
447 0xAD6D495AA804824B, 0xE1A6A74F2D8C9F94,
448 0xD4F7851235DEE8E3, 0xFD4B7F886540D893,
449 0x247C20042AA4BFDA, 0x096EA1C517D1327C,
450 0xD56966B4361A6685, 0x277DA5C31221057D,
451 0x94D59893A43ACFF7, 0x64F0C51CCDC02281,
452 0x3D33BCC4FF6189DB, 0xE005CB184CE66AF1,
453 0xFF5CCD1D1DB99BEA, 0xB0B854A7FE42980F,
454 0x7BD46A6A718D4B9F, 0xD10FA8CC22A5FD8C,
455 0xD31484952BE4BD31, 0xC7FA975FCB243847,
456 0x4886ED1E5846C407, 0x28CDDB791EB70B04,
457 0xC2B00BE2F573417F, 0x5C9590452180F877,
458 0x7A6BDDFFF370EB00, 0xCE509E38D6D9D6A4,
459 0xEBEB0F00647FA702, 0x1DCC06CF76606F06,
460 0xE4D9F28BA286FF0A, 0xD85A305DC918C262,
461 0x475B1D8732225F54, 0x2D4FB51668CCB5FE,
462 0xA679B9D9D72BBA20, 0x53841C0D912D43A5,
463 0x3B7EAA48BF12A4E8, 0x781E0E47F22F1DDF,
464 0xEFF20CE60AB50973, 0x20D261D19DFFB742,
465 0x16A12B03062A2E39, 0x1960EB2239650495,
466 0x251C16FED50EB8B8, 0x9AC0C330F826016E,
467 0xED152665953E7671, 0x02D63194A6369570,
468 0x5074F08394B1C987, 0x70BA598C90B25CE1,
469 0x794A15810B9742F6, 0x0D5925E9FCAF8C6C,
470 0x3067716CD868744E, 0x910AB077E8D7731B,
471 0x6A61BBDB5AC42F61, 0x93513EFBF0851567,
472 0xF494724B9E83E9D5, 0xE887E1985C09648D,
473 0x34B1D3C675370CFD, 0xDC35E433BC0D255D,
474 0xD0AAB84234131BE0, 0x08042A50B48B7EAF,
475 0x9997C4EE44A3AB35, 0x829A7B49201799D0,
476 0x263B8307B7C54441, 0x752F95F4FD6A6CA6,
477 0x927217402C08C6E5, 0x2A8AB754A795D9EE,
478 0xA442F7552F72943D, 0x2C31334E19781208,
479 0x4FA98D7CEAEE6291, 0x55C3862F665DB309,
480 0xBD0610175D53B1F3, 0x46FE6CB840413F27,
481 0x3FE03792DF0CFA59, 0xCFE700372EB85E8F,
482 0xA7BE29E7ADBCE118, 0xE544EE5CDE8431DD,
483 0x8A781B1B41F1873E, 0xA5C94C78A0D2F0E7,
484 0x39412E2877B60728, 0xA1265EF3AFC9A62C,
485 0xBCC2770C6A2506C5, 0x3AB66DD5DCE1CE12,
486 0xE65499D04A675B37, 0x7D8F523481BFD216,
487 0x0F6F64FCEC15F389, 0x74EFBE618B5B13C8,
488 0xACDC82B714273E1D, 0xDD40BFE003199D17,
489 0x37E99257E7E061F8, 0xFA52626904775AAA,
490 0x8BBBF63A463D56F9, 0xF0013F1543A26E64,
491 0xA8307E9F879EC898, 0xCC4C27A4150177CC,
492 0x1B432F2CCA1D3348, 0xDE1D1F8F9F6FA013,
493 0x606602A047A7DDD6, 0xD237AB64CC1CB2C7,
494 0x9B938E7225FCD1D3, 0xEC4E03708E0FF476,
495 0xFEB2FBDA3D03C12D, 0xAE0BCED2EE43889A,
496 0x22CB8923EBFB4F43, 0x69360D013CF7396D,
497 0x855E3602D2D4E022, 0x073805BAD01F784C,
498 0x33E17A133852F546, 0xDF4874058AC7B638,
499 0xBA92B29C678AA14A, 0x0CE89FC76CFAADCD,
500 0x5F9D4E0908339E34, 0xF1AFE9291F5923B9,
501 0x6E3480F60F4A265F, 0xEEBF3A2AB29B841C,
502 0xE21938A88F91B4AD, 0x57DFEFF845C6D3C3,
503 0x2F006B0BF62CAAF2, 0x62F479EF6F75EE78,
504 0x11A55AD41C8916A9, 0xF229D29084FED453,
505 0x42F1C27B16B000E6, 0x2B1F76749823C074,
506 0x4B76ECA3C2745360, 0x8C98F463B91691BD,
507 0x14BCC93CF1ADE66A, 0x8885213E6D458397,
508 0x8E177DF0274D4711, 0xB49B73B5503F2951,
509 0x10168168C3F96B6B, 0x0E3D963B63CAB0AE,
510 0x8DFC4B5655A1DB14, 0xF789F1356E14DE5C,
511 0x683E68AF4E51DAC1, 0xC9A84F9D8D4B0FD9,
512 0x3691E03F52A0F9D1, 0x5ED86E46E1878E80,
513 0x3C711A0E99D07150, 0x5A0865B20C4E9310,
514 0x56FBFC1FE4F0682E, 0xEA8D5DE3105EDF9B,
515 0x71ABFDB12379187A, 0x2EB99DE1BEE77B9C,
516 0x21ECC0EA33CF4523, 0x59A4D7521805C7A1,
517 0x3896F5EB56AE7C72, 0xAA638F3DB18F75DC,
518 0x9F39358DABE9808E, 0xB7DEFA91C00B72AC,
519 0x6B5541FD62492D92, 0x6DC6DEE8F92E4D5B,
520 0x353F57ABC4BEEA7E, 0x735769D6DA5690CE,
521 0x0A234AA642391484, 0xF6F9508028F80D9D,
522 0xB8E319A27AB3F215, 0x31AD9C1151341A4D,
523 0x773C22A57BEF5805, 0x45C7561A07968633,
524 0xF913DA9E249DBE36, 0xDA652D9B78A64C68,
525 0x4C27A97F3BC334EF, 0x76621220E66B17F4,
526 0x967743899ACD7D0B, 0xF3EE5BCAE0ED6782,
527 0x409F753600C879FC, 0x06D09A39B5926DB6,
528 0x6F83AEB0317AC588, 0x01E6CA4A86381F21,
529 0x66FF3462D19F3025, 0x72207C24DDFD3BFB,
530 0x4AF6B6D3E2ECE2EB, 0x9C994DBEC7EA08DE,
531 0x49ACE597B09A8BC4, 0xB38C4766CF0797BA,
532 0x131B9373C57C2A75, 0xB1822CCE61931E58,
533 0x9D7555B909BA1C0C, 0x127FAFDD937D11D2,
534 0x29DA3BADC66D92E4, 0xA2C1D57154C2ECBC,
535 0x58C5134D82F6FE24, 0x1C3AE3515B62274F,
536 0xE907C82E01CB8126, 0xF8ED091913E37FCB,
537 0x3249D8F9C80046C9, 0x80CF9BEDE388FB63,
538 0x1881539A116CF19E, 0x5103F3F76BD52457,
539 0x15B7E6F5AE47F7A8, 0xDBD7C6DED47E9CCF,
540 0x44E55C410228BB1A, 0xB647D4255EDB4E99,
541 0x5D11882BB8AAFC30, 0xF5098BBB29D3212A,
542 0x8FB5EA14E90296B3, 0x677B942157DD025A,
543 0xFB58E7C0A390ACB5, 0x89D3674C83BD4A01,
544 0x9E2DA4DF4BF3B93B, 0xFCC41E328CAB4829,
545 0x03F38C96BA582C52, 0xCAD1BDBD7FD85DB2,
546 0xBBB442C16082AE83, 0xB95FE86BA5DA9AB0,
547 0xB22E04673771A93F, 0x845358C9493152D8,
548 0xBE2A488697B4541E, 0x95A2DC2DD38E6966,
549 0xC02C11AC923C852B, 0x2388B1990DF2A87B,
550 0x7C8008FA1B4F37BE, 0x1F70D0C84D54E503,
551 0x5490ADEC7ECE57D4, 0x002B3C27D9063A3A,
552 0x7EAEA3848030A2BF, 0xC602326DED2003C0,
553 0x83A7287D69A94086, 0xC57A5FCB30F57A8A,
554 0xB56844E479EBE779, 0xA373B40F05DCBCE9,
555 0xD71A786E88570EE2, 0x879CBACDBDE8F6A0,
556 0x976AD1BCC164A32F, 0xAB21E25E9666D78B,
557 0x901063AAE5E5C33C, 0x9818B34448698D90,
558 0xE36487AE3E1E8ABB, 0xAFBDF931893BDCB4,
559 0x6345A0DC5FBBD519, 0x8628FE269B9465CA,
560 0x1E5D01603F9C51EC, 0x4DE44006A15049B7,
561 0xBF6C70E5F776CBB1, 0x411218F2EF552BED,
562 0xCB0C0708705A36A3, 0xE74D14754F986044,
563 0xCD56D9430EA8280E, 0xC12591D7535F5065,
564 0xC83223F1720AEF96, 0xC3A0396F7363A51F
567 #define R(a, b, c, x, mul) \
569 c ^= x; \
571 a -= s0[(uint8_t)c] \
572 ^ s1[(uint8_t)(c >> 16)] \
573 ^ s2[(uint8_t)(c >> 32)] \
574 ^ s3[(uint8_t)(c >> 48)]; \
576 b += s3[(uint8_t)(c >> 8)] \
577 ^ s2[(uint8_t)(c >> 24)] \
578 ^ s1[(uint8_t)(c >> 40)] \
579 ^ s0[(uint8_t)(c >> 56)]; \
581 b *= mul; \
584 #define PASS(a, b, c, mul) \
586 R(a, b, c, x0, mul) \
587 R(b, c, a, x1, mul) \
588 R(c, a, b, x2, mul) \
589 R(a, b, c, x3, mul) \
590 R(b, c, a, x4, mul) \
591 R(c, a, b, x5, mul) \
592 R(a, b, c, x6, mul) \
593 R(b, c, a, x7, mul) \
596 #define KS \
598 x0 -= x7 ^ 0xA5A5A5A5A5A5A5A5; \
599 x1 ^= x0; \
600 x2 += x1; \
601 x3 -= x2 ^ ((~x1) << 19); \
602 x4 ^= x3; \
603 x5 += x4; \
604 x6 -= x5 ^ ((~x4) >> 23); \
605 x7 ^= x6; \
606 x0 += x7; \
607 x1 -= x0 ^ ((~x7) << 19); \
608 x2 ^= x1; \
609 x3 += x2; \
610 x4 -= x3 ^ ((~x2) >> 23); \
611 x5 ^= x4; \
612 x6 += x5; \
613 x7 -= x6 ^ 0x0123456789ABCDEF; \
616 static void tiger_process(kripto_hash *s, const void *data)
618 uint64_t x0;
619 uint64_t x1;
620 uint64_t x2;
621 uint64_t x3;
622 uint64_t x4;
623 uint64_t x5;
624 uint64_t x6;
625 uint64_t x7;
627 uint64_t a;
628 uint64_t b;
629 uint64_t c;
630 uint64_t aa;
631 uint64_t bb;
632 uint64_t cc;
633 uint64_t t;
635 unsigned int i;
637 x0 = LOAD64L(CU8(data));
638 x1 = LOAD64L(CU8(data) + 8);
639 x2 = LOAD64L(CU8(data) + 16);
640 x3 = LOAD64L(CU8(data) + 24);
641 x4 = LOAD64L(CU8(data) + 32);
642 x5 = LOAD64L(CU8(data) + 40);
643 x6 = LOAD64L(CU8(data) + 48);
644 x7 = LOAD64L(CU8(data) + 56);
646 aa = a = s->h[0];
647 bb = b = s->h[1];
648 cc = c = s->h[2];
650 PASS(a, b, c, 5);
652 PASS(c, a, b, 7);
654 PASS(b, c, a, 9);
656 for(i = 3; i < s->passes; i++)
659 PASS(a, b, c, 9);
660 t = a; a = c; c = b; b = t;
663 s->h[0] = a ^ aa;
664 s->h[1] = b - bb;
665 s->h[2] = c + cc;
668 static kripto_hash *tiger_recreate
670 kripto_hash *s,
671 unsigned int r,
672 size_t len
675 (void)len;
677 s->passes = r;
678 if(!s->passes) s->passes = 3;
680 s->i = 0;
681 s->f = 0;
682 s->len = 0;
684 s->h[0] = 0x0123456789ABCDEF;
685 s->h[1] = 0xFEDCBA9876543210;
686 s->h[2] = 0xF096A5B4C3B2E187;
688 return s;
691 static void tiger_input
693 kripto_hash *s,
694 const void *in,
695 size_t len
698 size_t i;
700 for(i = 0; i < len; i++)
702 if(s->i == 64)
704 s->len += 512;
705 assert(s->len);
707 tiger_process(s, s->buf);
708 s->i = 0;
711 s->buf[s->i++] = CU8(in)[i];
715 static void tiger_finish(kripto_hash *s)
717 if(s->i)
719 s->len += s->i << 3;
720 assert(s->len);
723 /* pad */
724 s->buf[s->i++] = 0x01;
726 if(s->i > 56) /* not enough space for length */
728 while(s->i < 64) s->buf[s->i++] = 0;
729 tiger_process(s, s->buf);
730 s->i = 0;
733 while(s->i < 56) s->buf[s->i++] = 0;
735 /* add length */
736 STORE64L(s->len, s->buf + 56);
738 tiger_process(s, s->buf);
740 s->i = 0;
741 s->f = -1;
744 static void tiger_output(kripto_hash *s, void *out, size_t len)
746 unsigned int i;
748 if(!s->f) tiger_finish(s);
750 /* little endian */
751 for(i = 0; i < len; s->i++, i++)
753 U8(out)[i] = s->h[s->i >> 3];
754 s->h[s->i >> 3] >>= 8;
758 static kripto_hash *tiger_create(unsigned int r, size_t len)
760 kripto_hash *s;
762 s = malloc(sizeof(kripto_hash));
763 if(!s) return 0;
765 s->obj.desc = kripto_hash_tiger;
767 return tiger_recreate(s, r, len);
770 static void tiger_destroy(kripto_hash *s)
772 kripto_memwipe(s, sizeof(kripto_hash));
773 free(s);
776 static int tiger_hash
778 unsigned int r,
779 const void *in,
780 size_t in_len,
781 void *out,
782 size_t out_len
785 kripto_hash s;
787 (void)tiger_recreate(&s, r, out_len);
788 tiger_input(&s, in, in_len);
789 tiger_output(&s, out, out_len);
791 kripto_memwipe(&s, sizeof(kripto_hash));
793 return 0;
796 static const kripto_hash_desc tiger =
798 &tiger_create,
799 &tiger_recreate,
800 &tiger_input,
801 &tiger_output,
802 &tiger_destroy,
803 &tiger_hash,
804 24, /* max output */
805 64 /* block_size */
808 const kripto_hash_desc *const kripto_hash_tiger = &tiger;