1 /* vim: set ts=8 sts=4 sw=4 tw=80 noet: */
2 /*======================================================================
3 Copyright (C) 2004,2005,2009,2011,2012 Walter Doekes
4   <walter+tthsum@wjd.nu>
5 This file is part of tthsum.
6 
7 tthsum is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11 
12 tthsum is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with tthsum.  If not, see <http://www.gnu.org/licenses/>.
19 ======================================================================*/
20 #include "tiger.h"
21 
22 #include "base32.h"
23 #include "test.h"
24 #include <stdlib.h>
25 #include <string.h>
26 
27 
help_cmp_base32_bin(const char * name,const uint64_t * input,unsigned input_len,const char * base32)28 static int help_cmp_base32_bin(const char* name, const uint64_t* input,
29 	unsigned input_len, const char* base32) {
30     uint64_t res[3];
31     char base32buf[40];
32     tiger((uint64_t*)input, input_len, res);
33     uint64tobase32(base32buf, res, 3);
34     TEST_PASS3(strcmp(base32buf, base32) == 0,
35 	    "Tiger hash result for \"%s\" is wrong! "
36 	    "Expected \"%s\", got \"%s\".", name, base32, base32buf);
37     if (input_len != 0) {
38 	tiger_bp(((const char*)input)[0], (const char*)input + 1,
39 		input_len - 1, res);
40 	uint64tobase32(base32buf, res, 3);
41 	TEST_PASS1(strcmp(base32buf, base32) == 0,
42 		"Tiger BP hash result for \"%s\" is wrong!", name);
43     }
44     return 0;
45 }
46 
help_cmp_base32(const char * input,const char * base32)47 static int help_cmp_base32(const char* input, const char* base32) {
48     unsigned input_len = strlen(input);
49     uint64_t buf64[32];
50     if (input_len > 8*32)
51 	abort();
52     memcpy(buf64, input, input_len); /* force 64 bit alignment */
53     return help_cmp_base32_bin(input, buf64, input_len, base32);
54 }
55 
test_tiger192_nessie_1a()56 static int test_tiger192_nessie_1a() {
57     /* echo -n '3293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3' |
58      * perl -e 'use MIME::Base32 "RFC";$bin=<>;$bin=~s/([0-9A-Fa-f]{2})/chr
59      *  hex $1/eg;print MIME::Base32::encode($bin)."\n";' */
60     return help_cmp_base32("",
61 	    "GKJ2YYYMCPYCIX4SXOYXM3QWCZ5E4WCJFXPHH4Y")
62 	 + help_cmp_base32("a",
63 	    "O67PX3ZOP34KWLWI7E57LB5H7RQT4JD7L4SHQCI")
64 	 + help_cmp_base32("abc",
65 	    "FKVRJBHIYFMPFP5YYX7UDNL2KJISSEY4SV5V7EY")
66 	 + help_cmp_base32("message digest",
67 	    "3GA7RS3YEANJKDOPGBEHKHSEDRIX7SQ2UVNCT5Q")
68 	 + help_cmp_base32("abcdefghijklmnopqrstuvwxyz",
69 	    "C4KKI4XO4V6TABAECK74YVIDFIFRCYBP6N5652I")
70 	 + help_cmp_base32("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnl"
71 	    "mnomnopnopq", "B557TIM3TRMPFN3BBX36QTYKYOTRYYY6PNJ7PDQ");
72 }
73 
test_tiger192_nessie_1b()74 static int test_tiger192_nessie_1b() {
75     int ret = 0;
76     char buf[2048];
77     char *p;
78     int i = 0;
79 
80     /* A..Z a..z 0..9 */
81     p = buf;
82     for (i = 'A'; i <= 'Z'; ++i)
83 	*p++ = (char)i;
84     for (i = 'a'; i <= 'z'; ++i)
85 	*p++ = (char)i;
86     for (i = '0'; i <= '9'; ++i)
87 	*p++ = (char)i;
88     *p = '\0';
89     ret += help_cmp_base32(buf, "RXHKNAFBOWB64UBLUOFDYNUGKGEQ766M3RE2RTA");
90 
91     /* 8 * (1..0) */
92     p = buf;
93     for (i = 0; i < 8; ++i) {
94 	int j;
95 	for (j = '1'; j <= '9'; ++j)
96 	    *p++ = (char)j;
97 	*p++ = (char)'0';
98     }
99     *p = '\0';
100     ret += help_cmp_base32(buf, "DQKHSVJJ7WPSA6UVR6CMKLYR5CD7UDFL37MRX7I");
101 
102     /* 1M * 'a' */
103     p = (char*)malloc(1000000);
104     memset(p, 'a', 1000000);
105     ret += help_cmp_base32_bin("one million times 'a'", (const uint64_t*)p,
106 	    1000000, "NWYOE4U4X2WZHVYVY2T5GYYC5GZ45YGSXQYUWQI");
107     free(p);
108 
109     return ret;
110 }
111 
test_tiger192_ross_and_eli()112 static int test_tiger192_ross_and_eli() {
113     return help_cmp_base32("",
114 	    "GKJ2YYYMCPYCIX4SXOYXM3QWCZ5E4WCJFXPHH4Y")
115 	 + help_cmp_base32("abc",
116 	    "FKVRJBHIYFMPFP5YYX7UDNL2KJISSEY4SV5V7EY")
117 	 + help_cmp_base32("Tiger",
118 	    "3UACGB4Z6UAJ73DN5PEDRO3KE7PSXHLPCEGHSNY")
119 	 + help_cmp_base32("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr"
120 	    "stuvwxyz0123456789+-", "64OILA4QFL5YPHW74YIPQLANI6DKHJJUKBCINNI")
121 	 + help_cmp_base32("ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopq"
122 	    "rstuvwxyz+0123456789", "JDHOWYYIXB6UN2K5MVQRFTPRRWLZCX4XMVSYSVY")
123 	 + help_cmp_base32("Tiger - A Fast New Hash Function, by Ross An"
124 	    "derson and Eli Biham", "RKDGQKIEBJAQY4U22I7VVWTRCYB3HTOTK7SMCXQ")
125 	 + help_cmp_base32("Tiger - A Fast New Hash Function, by Ross An"
126 	    "derson and Eli Biham, proceedings of Fast Software Encrypti"
127 	    "on 3, Cambridge, 1996.", "MMNL3UID5OND2JC3NX6U255SK76HIOKQDUKWRXI")
128 	 + help_cmp_base32("Tiger - A Fast New Hash Function, by Ross An"
129 	    "derson and Eli Biham, proceedings of Fast Software Encrypti"
130 	    "on 3, Cambridge.", "ZZK2NL6VSH26XLCUP74E7CJCP6JTDWVQWYI4RCI")
131 	 + help_cmp_base32("message digest",
132 	    "3GA7RS3YEANJKDOPGBEHKHSEDRIX7SQ2UVNCT5Q")
133 	 + help_cmp_base32("12345678901234567890123456789012345678901234"
134 	    "567890123456789012345678901234567890",
135 	    "DQKHSVJJ7WPSA6UVR6CMKLYR5CD7UDFL37MRX7I")
136 	 + help_cmp_base32("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr"
137 	    "stuvwxyz0123456789+-ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm"
138 	    "nopqrstuvwxyz0123456789+-",
139 	    "YVADJZNUH24AAWCIU7QK42VMO3SP6WIK44K72JI");
140 }
141 
test_tiger192_0to255()142 static int test_tiger192_0to255() {
143     char name[256];
144     uint64_t buf64[32];
145     char *buf = (char*)&buf64[0]; /* char[256] */
146     const char *results[256] = {
147 	"LWPNACQDBZRYXW3VHJVCJ64QBZNGHOHHHZWCLNQ",
148 	"MWYOD2RWZIL63YXQKXTH5LLHWHBIFII2LOR2RYA",
149 	"VN73RUQ44PMNTO27DLY7F6QNHQTXSBQWBW4NEJQ",
150 	"7YXJ2Q7XJMMZ3ENZFEOXHTH4UC7KL4DI7OREJ7Y",
151 	"HX3NM4X6TWVLEFJD5MCHAXMKRNZLPCYAVVDF2HA",
152 	"4BLSINJ74KMVPQ7I325KEHIMFXKJZSRCDEOVVUY",
153 	"IBLN3P4CVZ2KWVTSBXVPA6NMULYHN3IENUCE3ZI",
154 	"QAP3TPQ2TLDTG6UBGRNTQRPE47ATV4P3VW3TOIY",
155 	"IMAVMVD2QJESZKCZHBJQI5EPMXZNJJ7CMZFOFMI",
156 	"7RBVCN6NMUWXECQR5X2HVPSGQC5EVVN5QEGJQNI",
157 	"ECUBIPPUP5LRL6QJAX7G7HI5FNNS2TRG7KMJGCY",
158 	"4SRAMMAZ7PADJXVQDYVJKKLAIIYZZPADTWTJVEI",
159 	"WXYPUVYMJTLJUPDIISF6ILEGLPPXP3LIXE4HLZY",
160 	"QAV6N2RM5BVAWNY7ENKJISYZZMZDDL37WTYA76A",
161 	"27AIQY5V4XR5NG2UASQRMMK2NGHBFDV27BRWW4A",
162 	"LRJIRSYOJZJTAVV2KKJUIDM343Z4IYJDHPY62UI",
163 	"RDJ2STZYEDSAQ7NGTWF34LHUCVDGAY3QTRCQYTI",
164 	"YB5UWFK7T52YAXM5BBYIP7G5FDIIVHICEGJEI7Q",
165 	"5ZDT4VU76PQJFT4JS2ZRZZTF5J6WCUQNILRHHFI",
166 	"4E625AEYCOOPZ2TVLUQGB4IH4PDVQHW7T5FTXBI",
167 	"WSFJYCPSNM3ZVIUPXR2QWUGO62OQ2DXDP73WL5Y",
168 	"K5FACRLDOMAU6QLZZWQUKQPC4PC2DTO2T6OQOHA",
169 	"6LRIGHS3WSXQLEKMJOTBXOGWADI66BY4LXYCE2I",
170 	"W6AIUW3CLDF6OGHNVE4JPDDJ2P74IWRCF2O36TA",
171 	"3DSOA5W546EVBVI6VSPZPUWRSFVASECGLVC2KXA",
172 	"J3PM7KXB32MLPYCW4ZGKEQADIIV343YEQEU3ETA",
173 	"BXRIHNNESU7KV3DPH7PFBV4HLSHOK75HTPOHB7A",
174 	"5TOUXIMTNW46N6B6FPL7HHJDSJ5BUF5S2UVIMSI",
175 	"XYIYSNDA4SLFT567H6Z32XR6TIYZ7BP5GSLOE3A",
176 	"V3ANUDZMYBSGGJOMAMYZUDQIB5ULI2ZT7AMSBVQ",
177 	"RASP2OMYJ5VFF777DEAW4J6FSSJBIUQIMNZ7F3Q",
178 	"RNSZFL53ALRCPKSFDNOP3SBBXBBELU2LS27U6EY",
179 	"SYG7TQ2J5RTBT7ZX4PYPJAZODHGGUTSNNCLCMUI",
180 	"6TRLPKTSXR6W4DHW3IIJJPXPVKOFKYIDE7DCSAA",
181 	"AX6RXAGKJR6BJ7S36CWL2DVD3LSJRXBZDXHSE5Y",
182 	"YXUV7FJYTDDIGVNVSFIHXNYU6DS5VOMYTUEDSAA",
183 	"WLKOFBWPP2UKW3WNMUGJ4SGKENEX5LPFKSC5WHQ",
184 	"TVIWK7QRYVH734QF3O2DKCL2FPDPSPCL5DLBQCY",
185 	"HRVOHEITK2RUHLRRCNZV6B747NPAI2WNI6YA7OY",
186 	"MZBUFTPMZAS62NAKP77C4VYQPXILL4SMESZMH4A",
187 	"J337ZIJ442CNQHPE6VTNFCL45NAH7OZ532A72ZA",
188 	"KRUJ73HNMPZJPMJ42SKLQXTIM2APJ54N47WIDVI",
189 	"V5BUXW64P34QXYB6ICQDH4LORJL3IGCA4HUKWWI",
190 	"UMW3M6HUJEC4DCLI6XMJRSTZSLV6FZGMGMMLS3A",
191 	"33U5KGNBFLH3RIETLI3I23TMOXXO5ZXSWDK5DEI",
192 	"ZPDUQY2HFUOJ2I6FE32JBC6U2QRU4AGLZSM2T2I",
193 	"NQRIUHKIOHUAFYBVZG5RNRIYONKIIH5WXY6GTNQ",
194 	"ZKTVLRK2VBU6MM6LHRWZHJLBSRFMOQMBKTRLB4A",
195 	"U2BV67AMNSUPJJCXQ65PU52HRLU23W7PXQYFFUY",
196 	"4QDHKWKX5QQ3U2TEWXJ2V4YXJHHZRX4S6GY77YA",
197 	"BQWUURFIAPN2TG32IZ2VHSJJHNDKKOCVRPLX3VA",
198 	"6BHQCGYJ2J22DBKSRTAEB23RSZE4QRY2Q6ZFTMY",
199 	"HWULK77VF7FOPQZGG3WGZADQQGE45WARHRON4HQ",
200 	"NRWIROHBRX24WIXNWYNC2PWXI5A2OCF4IZLW7NY",
201 	"FVEO4K7YLXRDI5KL5TZ4N5NQ4YUYRNN7ESXKLOY",
202 	"BULXALO4UB4O2HGFDOK56KPKCBJ45F7WSOK4MEY",
203 	"TWGCVUZH3ZB5K6BNL4QIQH2KRRBTXIM27SGBLLI",
204 	"EJ52IGNXMDM5CDN3BFMF5XKHLLBHGT6UKOPYE5I",
205 	"F5JCBKBI56KOGJ55KHKN6XCYMCPYVE5Z7YA775Q",
206 	"B3WZ7EPBUM5FBOHJCPN2BNPCJDJGHYP4OLDKISI",
207 	"OZVXA7UZT7Z4KHXACFUFCO5A3TX6VMRC3UPWT5Q",
208 	"QXTHCBUU47BWUI2A3JVDOHAFMBCQ6PKE2NNNTDA",
209 	"2QA7TMJ5HHBEI56AVZUXDRYFYY6AM7ZJKCGCTSI",
210 	"EEW7RHCXCVJHANCKZSYZAJ5QWJVRAT5A7O7A7ZA",
211 	"HPW6OZ5KJJ2QPW7P7A6RXQZ7M7V2TRSJIUDGEJY",
212 	"PH7ND647C7CJQAII5BQFYEGZ4F3KZD7E62TFAZA",
213 	"JDM3OYRKW74JNDWZEYSV66HIZZDB4TERML76RNY",
214 	"MY4MQOBXFF5T6U5Q7ASMBB6ZUC4NT7DCMVUDXDY",
215 	"C5CCDT3NGMP7KGJE7CKG5ASEKVOJAIGTRYY3NWY",
216 	"APSCV62776NZYN4UUPN6ZGP2PY7XGBPPA66ST3Y",
217 	"ZSX4NDKLH3MITXE7FDFZEJMARJAKVDQNLSRUH7Y",
218 	"5ASPSO2AEIARRBXPYVCTTVGV2UMGHLNDFH5U4IQ",
219 	"PTYNYANTEZUHKMHUEBALUDIM5EYXIRK6RKMQ2FA",
220 	"PKHGDFDZ6T24IGHMAQMANBIOM4R4UVVPXQ6TFTA",
221 	"BA6FZKIPJMUWYQQEAVM4QKLBJHKO5OVV54WLQLI",
222 	"GWA3PLBS7KFATBX5CTZHP6YQNYISXEWRRTLITPI",
223 	"EWHIELM4YHWKRNK5SJN2GYN2FWP4E6XRQHYTRNA",
224 	"VBWB5CFGIUK7UKA2IYWUM5CYEMKJJ4LOQNO7Q4Y",
225 	"O3T7A37JXCZYRWYBF6FUXYX3GQ7ZLEJ63XSHUJY",
226 	"AATYWTSWSDTST3DRDC236Y6J2HVRE2EWBCJ4U5I",
227 	"RXTQ4ZFDDOQ26T24EPHXOTGKGL7JKLLWYP65DNY",
228 	"XPVHFSCAOSN2XLYUCX7KYNBUCG4JKFNYPBEKBGQ",
229 	"Y3B4ZLA3GOG7CF5GD3HZUKAOTOTQS6CMOK3WO4I",
230 	"V2MBH32EFHVOOPVJ7W26EPJGHLY3XB4SRT27ASA",
231 	"NBSHZV577OHFGDJIZBTILKGS6ZL64TGWJ3OX4ZQ",
232 	"VKGDLMHHI2XVMQ27NRYRVUCCHFTOURMQQ5AJOEY",
233 	"VLK4BVPJQCZJXSEJQXCUI4L3QH2YZW4SHI2GRYA",
234 	"6YESTUKHQHPEJ2TAPKX4BUS7UG3O6PDKUD4LHVY",
235 	"YSAIPXDV5RB2KSSZH4SODM2ZXN24LANGLQYXBUA",
236 	"CHITOL557WP7KFDBDKZA2MN2MLYYQVWI22XDVVY",
237 	"6KUAO24QC7W233WUD5AJZHRS5M54BEHK5CPYKXI",
238 	"OAX2I7S32NPDIS23Q7AAQIIGGNZANSW5HVGVAFA",
239 	"XHQD73LVFJLAYOYDMXW7LP6E3R7KYXSLXOJXHDI",
240 	"HSCMKK7VCB32LAM7K3S2LQOAMIERQFLZHEZCBRY",
241 	"7DWMUKFFEVMU4E4LKXAGMF5AMPPXJ7RUNHMYHAI",
242 	"CCA4HOXOYCW7JGAMF2TFSOYJA3OL5XSIAV2UO5A",
243 	"WUKS4OO6BP7ITAWXQP6E6DFXCYHLFVU7N45T4WY",
244 	"NJVXMC73DFS4OKWHSP44AL5CDMHRYNF5EZALW2Y",
245 	"DZW4X6ULVDMWYKIQC5UKNI4UGPK22WSQ4CLQOMA",
246 	"OMZCFU5AGM2R7L6WRROORJGYGO5HIIGUIEB4W2Y",
247 	"4TGX3JM3EFPR32VI7O5IKDZMDJ7UYPKJL7TIASQ",
248 	"PPTYY6IHCNKFOVGUY6FJGGFMUSVALDC4ENKACMI",
249 	"W4ODQCNFAS7C6V5OTYS33TBZEHOGMXDFFCPKKWQ",
250 	"FOGKHGLXKNPLNEXPX4G6ZWUJOGUGAT37ZOXHLXI",
251 	"HTCIWUPEYXPE6DBKXYF6N3SLMPGFMSUHYAMUHTI",
252 	"CV5M355VT7BFSZXZPAZAOVKDMSECQQHHEUPNNQI",
253 	"32Q47LWPDDJWCHGNAULRGGQW3W6JPIJJALOYXKY",
254 	"FLJOTEF46ZEBFBG7IS4WCYZGQ7BOMTP24KXBNQQ",
255 	"QOHTUOZIUUFBFNLQOSIKMYEA3T5AEMHFQO3OWFA",
256 	"ZCZAGFISDTP3HKI3YDW7CGEG6KB463CIB5EYMJY",
257 	"FMH3ATYQBPU22UNX2ZGHMZI3VNFX2MOR3EMVOEI",
258 	"WZEVWYSW75DE5RAJUQEYWYRORPN3CABUCGCU7VY",
259 	"C5A2PCKHFYQODTEJQ2NCI57E6KAHYIQYF2S3EII",
260 	"A6W4QLFT6JZYTIJLNOOCWJUL3X6R3FDY3HW2BVY",
261 	"3G6WOYH3QGNIUPHOOUYD7AQI7SR6COFVC7NLSNA",
262 	"T7HSDKJDNQWBFBQ72IHR7MK2DB6NP3TYEH3SXZY",
263 	"OPIWK5U3GTNG6FIUMTTBCFOQ4CNGN6GQ7ICJOJQ",
264 	"ORMAX6UI52QDYDVOOIXYDGL6IAGZZQS7UAYR36Q",
265 	"4PDKG2MCBYTHZE4NE5VILCJIAQGHYJNIEZIB3RY",
266 	"YIFNSDNQXC7OAM25A2JFTGIQMCLJ53E7SOPEZJY",
267 	"6N2G6TGWUGOMCN6F7TEPMCSMBJ7VNWLRSC32TQQ",
268 	"MOR3PHVPHXZVDAEWARSQLHAK33QG2RIXTJLCQTY",
269 	"MBVP3AZ5BATCRVMGOJAD5ZW3GSHG62GYZUMUP6A",
270 	"OVT6VDQQZPZRF6CHRN6FDWD3AC3M6PPIFMB5ZZY",
271 	"3PG4FONYLCPWY5QWWVNQLGZ3HY4NS6U6NXY7FGQ",
272 	"CXMZBH4NNFUJ47TYUDNZFAMUUWLCHZZFHKU5IAA",
273 	"3Y4VRHOMBRSUQZ4UHAAZI24YRCZUOUTCPHFBLPI",
274 	"GT5HY5HOM7A7SLAL4HH5JMXUNIKP7OMZMBESL5Q",
275 	"32RM6ILFACIWWHX4JGFYI5U5CD6CUTYFDHR5POI",
276 	"DGD6BKKGH3AQUVA7DDOZWS2LRPYTCG5C23GNLKA",
277 	"KAQ2LYN7TEYGNVIVRGTWRL4FDSS7GPIRVRRY3KY",
278 	"RY4HR4SOJ32AV72H7CEFIIXV243JAEZCRVXFNGA",
279 	"YDS3SGLNKTO2XBRYTXRT6CQFC5RPCTWY4VIR6VA",
280 	"TOZ7PTUDBNRYA2P4PUAOWH3ARMW7ADF3R4R5XZQ",
281 	"2VN5HKX2D4YH3IQMMILR5OU3KSVZFUU6YLGSNIY",
282 	"AHDZC2W5Y6YBQNKPIJQLYXUJ3IWCTAZPBF24SGQ",
283 	"G7YYLV7LIVZSYBBAKYZ4R6BUWXO7KHZ7KVPPKRI",
284 	"QGC3IZH4PMI64TRRC24QESZKGUEXJMLFE6LCRUI",
285 	"MAO56LXX4CO7KHF3VRBXN6ROPZYA3F6OU5HEOZA",
286 	"NXJZ3LLKNFIGECW3KK4FLRFYJXR656BBRUZGGOA",
287 	"YRUYD3AKI3SIVIH5JTQV425AVNCS363J4YGK5QY",
288 	"WBZK3JBTM5J7OQ62IPALVEV3X66UY54RM427YJA",
289 	"YYF7KUUYFKY5O6QO7HXAQA5TZVVMZKJEPKKUC3Q",
290 	"AAM2ABFELIJXLKNODF4AHLNHSOMIKTKPT742OZI",
291 	"3YUIDE5QJGJVRXXX47FZFFDVPFQ4UZFPEQWBXHQ",
292 	"HK7TEYEMKYVUHFUB25XJC2ZRBKBHLHRFUHKORMA",
293 	"MGF5LPUOV2QUETHAAKGHYXQYXEKD7GG4HP2UN5Y",
294 	"EKNBK6YSSIDDZTUZKW2S6QJRX3WQRBPAZXNJDDQ",
295 	"HWWBBJ3Y2V7T73HZVQ7G2YPBTZEIPCKGZHJHGWQ",
296 	"TUSLJITDCZP7K3IEZHD6PH5ZJN7TFQOUIIXAOMQ",
297 	"E7VYSFDMRIGE5OULOWP67BCEA5IKCQLTUTVTNWA",
298 	"XYJETXKBVW57IIUABPGKJI46XREQSTZUFMDNFGQ",
299 	"PTYB2XTVSY7XRYNLNARPN6NAZOCGBVTLVOZUYXY",
300 	"WVAE3KBQLN2WWLOE4YFU447H7PRALW3IMWIEL3A",
301 	"RJC52KLP336OETVMOHIYMSM5IWD5FY2C77HTZEI",
302 	"7SEPD75TGIFSJQOYC232N4YCYRXC7NC7SLVR73Y",
303 	"DJ6AGOILGDVFL5ZJGRUU7JTCEJFWPSU6MYHH6RI",
304 	"CTNJSYU245C6H3UIQVY5RMNJ3OPBWHMB4V76OJQ",
305 	"OGORC6O2MB6IDTKYUILD6W2AY3RRDQBACL6JVPQ",
306 	"IJ4336JAXNGBHTHNBYNQ7TS6O4V6POP7UHARAZY",
307 	"U7EFYE2KTRCPB4DRU6EB4F2JGOANBN7RMHLJ4YI",
308 	"IHKFGKRUUBEWCPAAQJKUOM5ZFG3FP3GHWHGNQRA",
309 	"TODCDW4LPZS2NWK5DRIBA3J5G2GCHIO2PIIVXGA",
310 	"LRLOEZ3HQRTTPTIK3MMEUJCOIBNRDJM4KD4R2BQ",
311 	"IDPALYFIHCRENOVNATHEF6CWEDWEVDGVFSU2MWI",
312 	"2MBXSFC6RFO674PVSF7FIVW7JIZJUCNFRZ3TMPY",
313 	"HLMYUQO5K6FQGCU6TKVG7G55XQ6P6W5UGJTPZMY",
314 	"IYG2OE2T5QEKYYH7U4PWQEKAMGNU4XOO3X3E2JA",
315 	"KZLRXQ3K5KXF7HEIBMMNGZWXXF2NTNKKKCBZURA",
316 	"THSWZB6CU6TYPB6YEODWJI6GPTARSN3O2OWFTNQ",
317 	"6TOHWP2AIVPZSFU7S5KOBTX3H7TOQG7YCSWMKCI",
318 	"ZXTONTTSRYXGLT2JC75OMWFUVBDSLLYGMYKT72Y",
319 	"MRIZWQYCM7QE2A4UOJB2XLQ6T3FRDQ7SP7JEZ2I",
320 	"PZTTS46DJG2PMYTLOHDRR3DOKNGHOWINXBHWE7Q",
321 	"W2OFMNVOWMDAL5WKJJTRX2BYXM5KBHH3OUKEGQY",
322 	"JJCDGWPQ3LB34AWD2XX3UEN23P2XXJZ2YXPHWEA",
323 	"3F5FSYBRDWYQMEFEFSUAUG44A3QUQLVOHZNOODQ",
324 	"E4OHMFFQFIOYB4K7DHVGBXYC54SXF3QO3C3Y3FI",
325 	"ZA6NHVBVUIIRDY6BCXWOBWQD5TASWUV3KZNDI4Y",
326 	"YJCMEZZ2JGFJUW2Y2Y2WOO42KIAYXHHLTX6EPYI",
327 	"XD6JPM6DMKD6NTPPFEFOB57EOBUDMJP4LBD7ZFQ",
328 	"OZBHUSVBAVJZBYOVUHVMKBALFYXP345BGQ4XSSQ",
329 	"4QA33HZMJJPNT4XSXCJTKYKJ6V7DMQ73225Q2TY",
330 	"F5SLLM6AXAVPOAULYDB2TLY3J32GJZ5ZNTQNFUY",
331 	"VWXRK7F3R2ZLMCEUMK3QN6Y7BXI4O2UC7V3OKJA",
332 	"HYIRWDFF6PDAJDEWDWCJAOVER4ZAHC4MGXF7VXA",
333 	"OARGE3NPDEUZCF5LKXLCLP47IAPEKKH62HDHK3Y",
334 	"2FEP6FOWAMLPZE43I64EE6LYWVP7MUBHCBEODAA",
335 	"IYNG4VYBO32ADGEQ4GQH3AAKY2UGILZDY5TG6GY",
336 	"MELMIUEKN24DJIPKRPM4XYWCTED5KBIILWZBHUQ",
337 	"D7F6NJVK53BPIZHZFYIANJJ3VDI56ZX3ID4QDWA",
338 	"JEUJXOTM77T7SLFBA2L3Q6I7MQP5HUZL7CFKS7Y",
339 	"ORDNK5DB6T5IHQJE4NLS5DF7VZU2FTV3H565SEI",
340 	"HTJD4F42BZ64RNWGMMJVM7LTW4VRKW4JHZGFDHI",
341 	"G7QTMS6DLMKVEOOMFS4A2YWWEEXGOR67SDCTZCQ",
342 	"KDF4GLZP4WGFGTNPVIEZTOYMMBBS5HIIJUTFUDI",
343 	"FWQBOAZMVQLA4E5BMEVLK6DRWOMEXDZ7BVARFTA",
344 	"6RSPTN2DJSEJUY2VBLSRIUWH3VG2TZBZWBR7IZA",
345 	"6IARIZQCKVK7HLJSHXBWELEIAUKMGLP273ZIXOQ",
346 	"NB7CEN3VJPU7ZBCITQAXNHZKINMLIGW7ANVYFZA",
347 	"RJC44IPNNHRCFEXLBT7LZ455NRU45XWPF4DKDBI",
348 	"5MOCB7SLPFJSVM553DHRRVRJSBV7EGPHE3C36QA",
349 	"7DJXLJEVKAM7XHQPPPKSNMBWXT3COBEL7XFRITI",
350 	"6BBPKU43LJ2RLSRZBOKGMPEBX536DSPHWOIV6EA",
351 	"PI4E3BDUPERN6CXYMK5X3UQMWORLAMMP4VPUZWA",
352 	"YZWIPSJZQNMJZJO47DRZ2ZLXUSD2RSXJ6F4BJBA",
353 	"4HIQKOIHLZOWZNJF36BHTIHGFPYLDYOMIS5HPEY",
354 	"EB4HKLKAQP7ZEHWLNYLBJSDAIPD5GCH6F22W5UY",
355 	"2GR57JDXL3TCEYOUTHGXRAY2ZKO3A3G2NQ3GRHA",
356 	"AZ635YQX5IHUIJ5IKYZVV4EVYDBIOTBOYJHECGI",
357 	"DN32SZO6SEU7SEHU23ZNPKWFBEA6ADNT2BWF2QQ",
358 	"2XJ5TSJ7UKK7MJPBO4NBBW5FXPLNFISJ7EPER7I",
359 	"JB55WLFKIR3PLVAK6BGG65LVG56JQX224MJ6G2Y",
360 	"4MW7ZSNBX4LSURKHSIYAEEFFGPUJOMRVG4QJALY",
361 	"XT3ASJ6DIECY5VYWHLV7CPVERVXNFBGUW3VQ3HI",
362 	"QQNEFKUIIPKFQM6Y4XSKAHYD3OAT75ZHXW6366A",
363 	"EUXMMGHHGC6HZ7UGMFNJZCOSXYTA7PDM3UUWEFY",
364 	"5MYSTBUSOYXB6W5XUTPYD2A3XEHA2JJTEKSGPMI",
365 	"72XGOD2IY7MFXK3URTCMBEVAPIRP44ZUOERJXGI",
366 	"DOF4GVPB3UQFM2FXKX5XZPEL3MYVIJG53QQEXFY",
367 	"NZQZPSB3Y4NY5R6NZSDZZEYNFJW77OGVC63JQ6A",
368 	"4LKYFNQQUE2JBDR5MZ74KX54RHSWGBWCQVMKSKY",
369 	"XH5YMKIQHK6COXGT4JBY5IO5SQTS6IZ4PDIFZII",
370 	"TZPF64R4YI6QL3ZN2UW3Z3YJQOIG5ACDZ47WDPA",
371 	"S5PGNXT2WOIMIZDU3DHAIWVDJ25NWGUU3VEPDII",
372 	"ZTCDIG52EXSTQSNXMFZVYXIB5MX2CCMEZEAWGTY",
373 	"GTUJMZY2CSZQ3WX6A23BCGRBCBY3GLQ4VVL67RY",
374 	"BOOXD4JIXX6WRN6BQU6JDZ76PEMDHN24UF4EAEA",
375 	"75JXVY2ZT4JJNWRKSTVYOY3UDRSYOEIX2QYL3TQ",
376 	"4EVUFPLLBEXNBX7DC65LR3ELULPDXYKAQO2RRFI",
377 	"3RC2GTPP5M4RAZAOI5ZTTFJFOIE7I4THW6JP5HY",
378 	"ISM2YBQKIDZMLDARHCN75AAWVAVD5ISHIA7PJAI",
379 	"BLB4GRYDVNHZNGZJRP4I53IR2JYXA66OLSWK6SA",
380 	"YO3ZP3NESLRUOJWJ2Z2ZCMTXR53DA3RSCMJSWFY",
381 	"FC4BPAJVHCW4D6GDYVQCIA34S5YESFTXSWPVIAY",
382 	"VQWALTQ2VV66M75RRCRG4ZEFBBHER6TLHQ6VG3I",
383 	"FCGJCN4WPOTGMZBBLMDKG5SJLIRT7HPFWOYAIJY",
384 	"XABLN2BETS3DMOFSDWSMBCNBN4AECT75GTQZ6GA",
385 	"5YBTJHDV6AILPCSIPTHMNADWKE645GX3N4MHZXA",
386 	"N6F6BY5IP7IJNT2X7TRRY3SCZ4ATZ5VHGZ7EFQQ",
387 	"JAAEWOBNORJASTMJ3JUFMZFZCVLF7ECHPTORUXY",
388 	"HX6GPU5GUAT5MJKE5O63XWYAFA4ZX5KY6RKRP2Q",
389 	"G42Q47J2JYQO5L6CDRH2ODBHUIEAG6XHLMHSFIQ",
390 	"QEIE7IKMSAI5UIVDJRMYMPFDHBEU7YRZF2BYGVI",
391 	"G3VSBYIRM76QI4I36PQ36JGJXHNABSOLRZRN4QA",
392 	"BBXWENR7SUAV2OPOWT3BEZWQEQETQFMVHHAOZ5Y",
393 	"O72GHKBQVOD2SM2UH5DWLSBROAPDO77WCFPLMJY",
394 	"SSIRRW6I47HUQLBCJU47HROY52OWN6VGKYERCPA",
395 	"PUMGP24L3C3BK6OLUNN75H6TNTXGO47BJYQLYQY",
396 	"GD2TAVFT3EMTPGL32ZQAFBZ7T65QAKJ4QFFYNAA",
397 	"7XPTUXVFHWNKGNK6SU4DJBBXR23NOWIEO4LZGNY",
398 	"V66BL34FLEWONDE4Z6WCE6OOE4SXJ2A767VGJBI",
399 	"DZ4DTF7KCDSBBUXQV3ENXBV3QBNVCJNURAL6VFY",
400 	"Z63ZRRF5CFJ2JODAZ7DUFFGGIIIO26XHC2BYCEA",
401 	"SCIIV6BFYPFII5GNTWGEEAPBUEXJOYYP67LOGVA",
402 	"UMC6OJR6MLYN6ZWWL2XM5CQC7TROEI4P67C4PJQ"
403     };
404     int i;
405     name[255] = '\0';
406     for (i = 0; i < 256; ++i) {
407 	/* Avoid snprintf because it's not C90 */
408 	sprintf(name, "<characters 0..%d, length %d>", i, i + 1);
409 	buf[i] = (char)i;
410 	if (help_cmp_base32_bin(name, buf64, i + 1, results[i]))
411 	    return 1;
412     }
413     return 0;
414 }
415 
test_tiger192_alignment()416 static int test_tiger192_alignment() {
417     uint64_t res[3];
418     char buf[127];
419 
420     memset(buf, (int)'A', 127);
421     tiger_bp(0x00, buf, 127, res);
422     TEST_PASS3(res[0] == _ULL(0x007bbdabb402654c)
423 	    && res[1] == _ULL(0xaa7aefd7cb812b2d)
424 	    && res[2] == _ULL(0x1df2166aea456fca),
425 	    "Tiger BP hash result for \"<127*A>\" is wrong! "
426 	    "Expected 007bbdabb402654c aa7aefd7cb812b2d 1df2166aea456fca, "
427 	    "got %016" PRIx64 " %016" PRIx64 " %016" PRIx64 ".\n",
428 	    res[0], res[1], res[2]);
429 
430     /* The ARM fails on this second one when unaligned access is attempted on the
431      * last int64. It rotates some values and ends up with 8*A instead of 7*A+LF.
432      */
433     buf[126] = '\n';
434     tiger_bp(0x00, buf, 127, res);
435     TEST_PASS3(res[0] == _ULL(0x8dfae2bea717c033)
436 	    && res[1] == _ULL(0x91fc74dffb9eba48)
437 	    && res[2] == _ULL(0xe62d12fd8ef213af),
438 	    "Tiger BP hash result for \"<126*A+LF>\" is wrong! "
439 	    "Expected 8dfae2bea717c033 91fc74dffb9eba48 e62d12fd8ef213af, "
440 	    "got %016" PRIx64 " %016" PRIx64 " %016" PRIx64 ".\n",
441 	    res[0], res[1], res[2]);
442 
443     return 0;
444 }
445 
test_tiger192_abelarm_o3()446 static int test_tiger192_abelarm_o3() {
447     uint64_t res[3];
448     uint64_t const out[] = {
449 	_ULL(0x60d56f0949e7560f), _ULL(0xcf62a9d35ea20959),
450 	_ULL(0xd4f5836a7ce76166), /* 0..124 (len=125) */
451 	_ULL(0x6baec4efc36d6da1), _ULL(0xf87ff3d2852f0250),
452 	_ULL(0xfbdb48ea8c361c38), /* 0..125 (len=126) */
453 	_ULL(0xa950e3ff469b7cc2), _ULL(0xd2e5105a998e1647),
454 	_ULL(0x7dc3bc1a875015b5), /* 0..126 (len=127) */
455 	_ULL(0xaa322e0262d43ccd), _ULL(0x85e408a00248ee64),
456 	_ULL(0x327f3eec7f32687e)  /* 0..127 (len=128) */
457     };
458     char buf[128];
459     int i, j;
460     int failures = 0;
461 
462     /* A different ARM (abel@debian) fails on this one with -O3 optimization
463      * when an uint64_t pointer is pointing to unaligned memory. */
464     for (i = 0; i < 128; ++i)
465 	buf[i] = (char)i;
466     for (i = 0, j = 125; j <= 128 /* i < 4 * 3 */; i += 3, ++j) {
467 	tiger_bp(0x00, buf, j, res);
468 	if (res[0] != out[i] || res[1] != out[i+1] || res[2] != out[i+2]) {
469 	    fprintf(stderr, ">>> %s:%i: Tiger BP hash result for \"<\\x00.."
470 			    "\\x%hhx is wrong! Expected %016" PRIx64 " %016"
471 			    PRIx64 " %016" PRIx64 ", got %016" PRIx64 " %016"
472 			    PRIx64 " %016" PRIx64 ".\n", __FILE__, __LINE__,
473 			    j - 1, out[i], out[i+1], out[i+2], res[0], res[1],
474 			    res[2]);
475 	    ++failures;
476 	}
477     }
478     if (failures)
479 	return 1;
480 
481     return 0;
482 }
483 
484 
485 TESTS(tiger_test)
486     TEST(test_tiger192_nessie_1a);
487     TEST(test_tiger192_nessie_1b);
488     TEST(test_tiger192_ross_and_eli);
489     TEST(test_tiger192_0to255);
490     TEST(test_tiger192_alignment);
491     TEST(test_tiger192_abelarm_o3);
492 ENDTESTS
493