1 /*
2  *  Chocobo1/Hash
3  *
4  *   Copyright 2017-2018 by Mike Tzou (Chocobo1)
5  *     https://github.com/Chocobo1/Hash
6  *
7  *   Licensed under GNU General Public License 3 or later.
8  *
9  *  @license GPL3 <https://www.gnu.org/licenses/gpl-3.0-standalone.html>
10  */
11 
12 #include "../src/whirlpool.h"
13 
14 #include "catch2/single_include/catch2/catch.hpp"
15 
16 #include <cstring>
17 
18 
19 TEST_CASE("whirlpool")
20 {
21 	using Hash = Chocobo1::Whirlpool;
22 
23 	// ISO test suite from whirlpool website
24 	const char s1[] = "";
25 	REQUIRE("19fa61d75522a4669b44e39c1d2e1726c530232130d407f89afee0964997f7a73e83be698b288febcf88e3e03c4f0757ea8964e59b63d93708b138cc42a66eb3"
26 		== Hash().addData(s1, strlen(s1)).finalize().toString());
27 
28 	const char s2[] = "a";
29 	REQUIRE("8aca2602792aec6f11a67206531fb7d7f0dff59413145e6973c45001d0087b42d11bc645413aeff63a42391a39145a591a92200d560195e53b478584fdae231a"
30 		== Hash().addData(s2, strlen(s2)).finalize().toString());
31 
32 	const char s3[] = "abc";
33 	REQUIRE("4e2448a4c6f486bb16b6562c73b4020bf3043e3a731bce721ae1b303d97e6d4c7181eebdb6c57e277d0e34957114cbd6c797fc9d95d8b582d225292076d4eef5"
34 		== Hash().addData(s3, strlen(s3)).finalize().toString());
35 
36 	const char s4[] = "message digest";
37 	REQUIRE("378c84a4126e2dc6e56dcc7458377aac838d00032230f53ce1f5700c0ffb4d3b8421557659ef55c106b4b52ac5a4aaa692ed920052838f3362e86dbd37a8903e"
38 		== Hash().addData(s4, strlen(s4)).finalize().toString());
39 
40 	const char s5[] = "abcdefghijklmnopqrstuvwxyz";
41 	REQUIRE("f1d754662636ffe92c82ebb9212a484a8d38631ead4238f5442ee13b8054e41b08bf2a9251c30b6a0b8aae86177ab4a6f68f673e7207865d5d9819a3dba4eb3b"
42 		== Hash().addData(s5, strlen(s5)).finalize().toString());
43 
44 	const char s6[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
45 	REQUIRE("dc37e008cf9ee69bf11f00ed9aba26901dd7c28cdec066cc6af42e40f82f3a1e08eba26629129d8fb7cb57211b9281a65517cc879d7b962142c65f5a7af01467"
46 		== Hash().addData(s6, strlen(s6)).finalize().toString());
47 
48 	const char s7[] = "1234567890";
49 	Hash test7;
50 	for (long int i = 0 ; i < 8; ++i)
51 		test7.addData(s7, strlen(s7));
52 	REQUIRE("466ef18babb0154d25b9d38a6414f5c08784372bccb204d6549c4afadb6014294d5bd8df2a6c44e538cd047b2681a51a2c60481e88c5a20b2c2a80cf3a9a083b"
53 		== test7.finalize().toString());
54 
55 	const char s8[] = "abcdbcdecdefdefgefghfghighijhijk";
56 	REQUIRE("2a987ea40f917061f5d6f0a0e4644f488a7a5a52deee656207c562f988e95c6916bdc8031bc5be1b7b947639fe050b56939baaa0adff9ae6745b7b181c3be3fd"
57 		== Hash().addData(s8, strlen(s8)).finalize().toString());
58 
59 	const char s9[] = "a";
60 	Hash test9;
61 	for (long int i = 0 ; i < 1000000; ++i)
62 		test9.addData(s9, strlen(s9));
63 	REQUIRE("0c99005beb57eff50a7cf005560ddf5d29057fd86b20bfd62deca0f1ccea4af51fc15490eddc47af32bb2b66c34ff9ad8c6008ad677f77126953b226e4ed8b01"
64 		== test9.finalize().toString());
65 
66 
67 	// my own tests
68 	REQUIRE("19fa61d75522a4669b44e39c1d2e1726c530232130d407f89afee0964997f7a73e83be698b288febcf88e3e03c4f0757ea8964e59b63d93708b138cc42a66eb3"
69 		== Hash().finalize().toString());
70 
71 	const char s11[] = "The quick brown fox jumps over the lazy dog";
72 	REQUIRE("b97de512e91e3828b40d2b0fdce9ceb3c4a71f9bea8d88e75c4fa854df36725fd2b52eb6544edcacd6f8beddfea403cb55ae31f03ad62a5ef54e42ee82c3fb35"
73 		== Hash().addData(s11, strlen(s11)).finalize().toString());
74 
75 	const char s12[] = "The quick brown fox jumps over the lazy dog.";
76 	REQUIRE("87a7ff096082e3ffeb86db10feb91c5af36c2c71bc426fe310ce662e0338223e217def0eab0b02b80eecf875657802bc5965e48f5c0a05467756f0d3f396faba"
77 		== Hash().addData(s12, strlen(s12)).finalize().toString());
78 
79 	const char s13[] = "The quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dogThe quick brown fox jumps over the lazy dog";
80 	REQUIRE("b542bf13643b644826ed9854f0049dcb9d1bb53c3b041ad4c417203b1d2c43a891a93dc42dc77e2042ed612abc08dcab20d2c25cae02754d7032498689c3b013"
81 		== Hash().addData(s13, strlen(s13)).finalize().toString());
82 
83 	const std::vector<char> s14(1000001, 'a');
84 	REQUIRE("0c99005beb57eff50a7cf005560ddf5d29057fd86b20bfd62deca0f1ccea4af51fc15490eddc47af32bb2b66c34ff9ad8c6008ad677f77126953b226e4ed8b01"
85 			== Hash().addData(s14.data() + 1, s14.size() - 1).finalize().toString());
86 
87 	const int s15[2] = {0};
88 	const char s15_2[8] = {0};
89 	REQUIRE(Hash().addData(Hash::Span<const int>(s15)).finalize().toString()
90 			== Hash().addData(s15_2).finalize().toString());
91 
92 	const unsigned char s16[] = {0x00, 0x0A};
93 	const auto s16_1 = Hash().addData(s16, 2).finalize().toArray();
94 	const auto s16_2 = Hash().addData(s16).finalize().toArray();
95 	REQUIRE(s16_1 == s16_2);
96 }
97