1#include <base/hash_ctxt.h>
2#include <base/str.h>
3
4#include <gtest/gtest.h>
5
6template<size_t BufferSize = SHA256_MAXSTRSIZE>
7static void ExpectSha256(SHA256_DIGEST Actual, const char *pWanted)
8{
9 char aActual[BufferSize];
10 sha256_str(Actual, aActual, sizeof(aActual));
11 EXPECT_STREQ(aActual, pWanted);
12}
13
14constexpr static const char QUICK_BROWN_FOX[] = "The quick brown fox jumps over the lazy dog.";
15
16TEST(Hash, Sha256)
17{
18 // https://en.wikipedia.org/w/index.php?title=SHA-2&oldid=840187620#Test_vectors
19 ExpectSha256(Actual: sha256(message: "", message_len: 0), pWanted: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
20 SHA256_CTX Context;
21
22 sha256_init(ctxt: &Context);
23 ExpectSha256(Actual: sha256_finish(ctxt: &Context), pWanted: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
24
25 // printf 'The quick brown fox jumps over the lazy dog.' | sha256sum
26 ExpectSha256(Actual: sha256(message: QUICK_BROWN_FOX, message_len: str_length(str: QUICK_BROWN_FOX)), pWanted: "ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c");
27
28 sha256_init(ctxt: &Context);
29 sha256_update(ctxt: &Context, data: "The ", data_len: 4);
30 sha256_update(ctxt: &Context, data: "quick ", data_len: 6);
31 sha256_update(ctxt: &Context, data: "brown ", data_len: 6);
32 sha256_update(ctxt: &Context, data: "fox ", data_len: 4);
33 sha256_update(ctxt: &Context, data: "jumps ", data_len: 6);
34 sha256_update(ctxt: &Context, data: "over ", data_len: 5);
35 sha256_update(ctxt: &Context, data: "the ", data_len: 4);
36 sha256_update(ctxt: &Context, data: "lazy ", data_len: 5);
37 sha256_update(ctxt: &Context, data: "dog.", data_len: 4);
38 ExpectSha256(Actual: sha256_finish(ctxt: &Context), pWanted: "ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c");
39}
40
41TEST(Hash, Sha256ToStringSmallBuffer)
42{
43 ExpectSha256<1>(Actual: sha256(message: QUICK_BROWN_FOX, message_len: str_length(str: QUICK_BROWN_FOX)), pWanted: "");
44 ExpectSha256<16 + 1>(Actual: sha256(message: QUICK_BROWN_FOX, message_len: str_length(str: QUICK_BROWN_FOX)), pWanted: "ef537f25c895bfa7");
45}
46
47TEST(Hash, Sha256ToStringLargeBuffer)
48{
49 ExpectSha256<SHA256_MAXSTRSIZE + 64>(Actual: sha256(message: QUICK_BROWN_FOX, message_len: str_length(str: QUICK_BROWN_FOX)), pWanted: "ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c");
50}
51
52TEST(Hash, Sha256Eq)
53{
54 EXPECT_EQ(sha256_comp(sha256("", 0), sha256("", 0)), 0);
55 EXPECT_TRUE(sha256("", 0) == sha256("", 0));
56 EXPECT_NE(sha256_comp(sha256("a", 1), sha256("b", 1)), 0);
57 EXPECT_TRUE(sha256("a", 1) != sha256("b", 1));
58}
59
60TEST(Hash, Sha256FromStr)
61{
62 SHA256_DIGEST Expected = {.data: {
63 0x01,
64 0x23,
65 0x45,
66 0x67,
67 0x89,
68 0x01,
69 0x23,
70 0x45,
71 0x67,
72 0x89,
73 0x01,
74 0x23,
75 0x45,
76 0x67,
77 0x89,
78 0x01,
79 0x23,
80 0x45,
81 0x67,
82 0x89,
83 0x01,
84 0x23,
85 0x45,
86 0x67,
87 0x89,
88 0x01,
89 0x23,
90 0x45,
91 0x67,
92 0x89,
93 0x01,
94 0x23,
95 }};
96 SHA256_DIGEST Sha256;
97 EXPECT_FALSE(sha256_from_str(&Sha256, "0123456789012345678901234567890123456789012345678901234567890123"));
98 EXPECT_EQ(Sha256, Expected);
99 EXPECT_TRUE(sha256_from_str(&Sha256, "012345678901234567890123456789012345678901234567890123456789012"));
100 EXPECT_TRUE(sha256_from_str(&Sha256, "01234567890123456789012345678901234567890123456789012345678901234"));
101 EXPECT_TRUE(sha256_from_str(&Sha256, ""));
102 EXPECT_TRUE(sha256_from_str(&Sha256, "012345678901234567890123456789012345678901234567890123456789012x"));
103 EXPECT_TRUE(sha256_from_str(&Sha256, "x123456789012345678901234567890123456789012345678901234567890123"));
104}
105
106template<size_t BufferSize = MD5_MAXSTRSIZE>
107static void ExpectMd5(MD5_DIGEST Actual, const char *pWanted)
108{
109 char aActual[BufferSize];
110 md5_str(Actual, aActual, sizeof(aActual));
111 EXPECT_STREQ(aActual, pWanted);
112}
113
114TEST(Hash, Md5)
115{
116 // https://en.wikipedia.org/w/index.php?title=MD5&oldid=889664074#MD5_hashes
117 ExpectMd5(Actual: md5(message: "", message_len: 0), pWanted: "d41d8cd98f00b204e9800998ecf8427e");
118 MD5_CTX Context;
119
120 md5_init(ctxt: &Context);
121 ExpectMd5(Actual: md5_finish(ctxt: &Context), pWanted: "d41d8cd98f00b204e9800998ecf8427e");
122
123 ExpectMd5(Actual: md5(message: QUICK_BROWN_FOX, message_len: str_length(str: QUICK_BROWN_FOX)), pWanted: "e4d909c290d0fb1ca068ffaddf22cbd0");
124
125 md5_init(ctxt: &Context);
126 md5_update(ctxt: &Context, data: "The ", data_len: 4);
127 md5_update(ctxt: &Context, data: "quick ", data_len: 6);
128 md5_update(ctxt: &Context, data: "brown ", data_len: 6);
129 md5_update(ctxt: &Context, data: "fox ", data_len: 4);
130 md5_update(ctxt: &Context, data: "jumps ", data_len: 6);
131 md5_update(ctxt: &Context, data: "over ", data_len: 5);
132 md5_update(ctxt: &Context, data: "the ", data_len: 4);
133 md5_update(ctxt: &Context, data: "lazy ", data_len: 5);
134 md5_update(ctxt: &Context, data: "dog.", data_len: 4);
135 ExpectMd5(Actual: md5_finish(ctxt: &Context), pWanted: "e4d909c290d0fb1ca068ffaddf22cbd0");
136}
137
138TEST(Hash, Md5ToStringSmallBuffer)
139{
140 ExpectMd5<1>(Actual: md5(message: QUICK_BROWN_FOX, message_len: str_length(str: QUICK_BROWN_FOX)), pWanted: "");
141 ExpectMd5<16 + 1>(Actual: md5(message: QUICK_BROWN_FOX, message_len: str_length(str: QUICK_BROWN_FOX)), pWanted: "e4d909c290d0fb1c");
142}
143
144TEST(Hash, Md5ToStringLargeBuffer)
145{
146 ExpectMd5<MD5_MAXSTRSIZE + 64>(Actual: md5(message: QUICK_BROWN_FOX, message_len: str_length(str: QUICK_BROWN_FOX)), pWanted: "e4d909c290d0fb1ca068ffaddf22cbd0");
147}
148
149TEST(Hash, Md5Eq)
150{
151 EXPECT_EQ(md5_comp(md5("", 0), md5("", 0)), 0);
152 EXPECT_TRUE(md5("", 0) == md5("", 0));
153 EXPECT_NE(md5_comp(md5("a", 1), md5("b", 1)), 0);
154 EXPECT_TRUE(md5("a", 1) != md5("b", 1));
155}
156
157TEST(Hash, Md5FromStr)
158{
159 MD5_DIGEST Expected = {.data: {
160 0x01,
161 0x23,
162 0x45,
163 0x67,
164 0x89,
165 0x01,
166 0x23,
167 0x45,
168 0x67,
169 0x89,
170 0x01,
171 0x23,
172 0x45,
173 0x67,
174 0x89,
175 0x01,
176 }};
177 MD5_DIGEST Md5;
178 EXPECT_FALSE(md5_from_str(&Md5, "01234567890123456789012345678901"));
179 EXPECT_EQ(Md5, Expected);
180 EXPECT_TRUE(md5_from_str(&Md5, "0123456789012345678901234567890"));
181 EXPECT_TRUE(md5_from_str(&Md5, "012345678901234567890123456789012"));
182 EXPECT_TRUE(md5_from_str(&Md5, ""));
183 EXPECT_TRUE(md5_from_str(&Md5, "0123456789012345678901234567890x"));
184 EXPECT_TRUE(md5_from_str(&Md5, "x1234567890123456789012345678901"));
185}
186