Branch data Line data Source code
1 : : /**
2 : : * \file lib/digest.c
3 : : *
4 : : * \brief Roll-up of the digests used by fwknop.
5 : : */
6 : :
7 : : /* Fwknop is developed primarily by the people listed in the file 'AUTHORS'.
8 : : * Copyright (C) 2009-2015 fwknop developers and contributors. For a full
9 : : * list of contributors, see the file 'CREDITS'.
10 : : *
11 : : * License (GNU General Public License):
12 : : *
13 : : * This program is free software; you can redistribute it and/or
14 : : * modify it under the terms of the GNU General Public License
15 : : * as published by the Free Software Foundation; either version 2
16 : : * of the License, or (at your option) any later version.
17 : : *
18 : : * This program is distributed in the hope that it will be useful,
19 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 : : * GNU General Public License for more details.
22 : : *
23 : : * You should have received a copy of the GNU General Public License
24 : : * along with this program; if not, write to the Free Software
25 : : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
26 : : * USA
27 : : */
28 : :
29 : : #include "fko_common.h"
30 : : #include "digest.h"
31 : : #include "base64.h"
32 : : #ifdef HAVE_C_UNIT_TESTS /* LCOV_EXCL_START */
33 : : DECLARE_TEST_SUITE(digest_test, "digest functions test suite");
34 : : #endif /* LCOV_EXCL_STOP */
35 : : /* Compute MD5 hash on in and store result in out.
36 : : */
37 : : void
38 : 4056456 : md5(unsigned char *out, unsigned char *in, size_t size)
39 : : {
40 : : MD5Context ctx;
41 : :
42 : 4056456 : MD5Init(&ctx);
43 : 4056456 : MD5Update(&ctx, (unsigned char*)in, size);
44 : 4056456 : MD5Final(out, &ctx);
45 : 4056456 : }
46 : :
47 : : /* Compute MD5 hash on in and store the base64 string result in out.
48 : : */
49 : : void
50 : 76 : md5_base64(char *out, unsigned char *in, size_t size)
51 : : {
52 : : uint8_t md[MD5_DIGEST_LEN];
53 : :
54 : 76 : md5(md, in, size);
55 : 76 : b64_encode(md, out, MD5_DIGEST_LEN);
56 : :
57 : 76 : strip_b64_eq(out);
58 : 76 : }
59 : :
60 : : /* Compute SHA1 hash on in and store result in out.
61 : : */
62 : : void
63 : 299 : sha1(unsigned char *out, unsigned char *in, size_t size)
64 : : {
65 : : SHA1_INFO sha1_info;
66 : :
67 : 299 : sha1_init(&sha1_info);
68 : 299 : sha1_update(&sha1_info, (uint8_t*)in, size);
69 : 299 : sha1_final(out, &sha1_info);
70 : 299 : }
71 : :
72 : : /* Compute SHA1 hash on in and store the base64 string result in out.
73 : : */
74 : : void
75 : 98 : sha1_base64(char *out, unsigned char *in, size_t size)
76 : : {
77 : : uint8_t md[SHA1_DIGEST_LEN];
78 : :
79 : 98 : sha1(md, in, size);
80 : 98 : b64_encode(md, out, SHA1_DIGEST_LEN);
81 : :
82 : 98 : strip_b64_eq(out);
83 : 98 : }
84 : :
85 : : /* Compute SHA256 hash on in and store the hex string result in out.
86 : : */
87 : : void
88 : 6231104 : sha256(unsigned char *out, unsigned char *in, size_t size)
89 : : {
90 : : SHA256_CTX sha256_ctx;
91 : :
92 : 6231104 : SHA256_Init(&sha256_ctx);
93 : 6231104 : SHA256_Update(&sha256_ctx, (const uint8_t*)in, size);
94 : 6231104 : SHA256_Final(out, &sha256_ctx);
95 : 6231104 : }
96 : :
97 : : /* Compute SHA256 hash on in and store the base64 string result in out.
98 : : */
99 : : void
100 : 1682380 : sha256_base64(char *out, unsigned char *in, size_t size)
101 : : {
102 : : uint8_t md[SHA256_DIGEST_LEN];
103 : :
104 : 1682380 : sha256(md, in, size);
105 : 1682380 : b64_encode(md, out, SHA256_DIGEST_LEN);
106 : :
107 : 1682380 : strip_b64_eq(out);
108 : 1682380 : }
109 : :
110 : : /* Compute SHA384 hash on in and store the hex string result in out.
111 : : */
112 : : void
113 : 196 : sha384(unsigned char *out, unsigned char *in, size_t size)
114 : : {
115 : : SHA384_CTX sha384_ctx;
116 : :
117 : 196 : SHA384_Init(&sha384_ctx);
118 : 196 : SHA384_Update(&sha384_ctx, (const uint8_t*)in, size);
119 : 196 : SHA384_Final(out, &sha384_ctx);
120 : 196 : }
121 : :
122 : : /* Compute SHA384 hash on in and store the base64 string result in out.
123 : : */
124 : : void
125 : 74 : sha384_base64(char *out, unsigned char *in, size_t size)
126 : : {
127 : : uint8_t md[SHA384_DIGEST_LEN];
128 : :
129 : 74 : sha384(md, in, size);
130 : 74 : b64_encode(md, out, SHA384_DIGEST_LEN);
131 : :
132 : 74 : strip_b64_eq(out);
133 : 74 : }
134 : :
135 : : /* Compute SHA512 hash on in and store the hex string result in out.
136 : : */
137 : : void
138 : 251 : sha512(unsigned char *out, unsigned char *in, size_t size)
139 : : {
140 : : SHA512_CTX sha512_ctx;
141 : :
142 : 251 : SHA512_Init(&sha512_ctx);
143 : 251 : SHA512_Update(&sha512_ctx, (const uint8_t*)in, size);
144 : 251 : SHA512_Final(out, &sha512_ctx);
145 : 251 : }
146 : :
147 : : /* Compute SHA512 hash on in and store the base64 string result in out.
148 : : */
149 : : void
150 : 117 : sha512_base64(char *out, unsigned char *in, size_t size)
151 : : {
152 : : uint8_t md[SHA512_DIGEST_LEN];
153 : :
154 : 117 : sha512(md, in, size);
155 : 117 : b64_encode(md, out, SHA512_DIGEST_LEN);
156 : :
157 : 117 : strip_b64_eq(out);
158 : 117 : }
159 : :
160 : : void
161 : 4 : sha3_256(unsigned char *out, unsigned char *in, size_t size)
162 : : {
163 : 4 : FIPS202_SHA3_256(in, size, out);
164 : 4 : }
165 : :
166 : : void
167 : 7175 : sha3_256_base64(char *out, unsigned char *in, size_t size)
168 : : {
169 : : uint8_t md[SHA3_256_DIGEST_LEN];
170 : :
171 : 7175 : FIPS202_SHA3_256(in, size, md);
172 : 7175 : b64_encode(md, out, SHA3_256_DIGEST_LEN);
173 : :
174 : 7175 : strip_b64_eq(out);
175 : :
176 : 7175 : }
177 : : void
178 : 4 : sha3_512(unsigned char *out, unsigned char *in, size_t size)
179 : : {
180 : 4 : FIPS202_SHA3_512(in, size, out);
181 : 4 : }
182 : :
183 : : void
184 : 78 : sha3_512_base64(char *out, unsigned char *in, size_t size)
185 : : {
186 : : uint8_t md[SHA3_512_DIGEST_LEN];
187 : :
188 : 78 : FIPS202_SHA3_512(in, size, md);
189 : 78 : b64_encode(md, out, SHA3_512_DIGEST_LEN);
190 : :
191 : 78 : strip_b64_eq(out);
192 : :
193 : 78 : }
194 : :
195 : : #ifdef HAVE_C_UNIT_TESTS /* LCOV_EXCL_START */
196 : :
197 : : DECLARE_UTEST(test_md5, "md5 test vectors") //https://tools.ietf.org/html/rfc1321.html
198 : : {
199 : : char msg[1024] = {0};
200 : : unsigned char digest[1024] = {0};
201 : : char digest_txt[1024] = {0};
202 : : char expected_digest1[1024] = {0};
203 : : char expected_digest2[1024] = {0};
204 : : char expected_digest3[1024] = {0};
205 : : char expected_digest4[1024] = {0};
206 : : char expected_digest5[1024] = {0};
207 : : char expected_digest6[1024] = {0};
208 : : char expected_digest7[1024] = {0};
209 : : int i = 0;
210 : :
211 : : strcpy(expected_digest1, "d41d8cd98f00b204e9800998ecf8427e");
212 : : strcpy(expected_digest2, "0cc175b9c0f1b6a831c399e269772661");
213 : : strcpy(expected_digest3, "900150983cd24fb0d6963f7d28e17f72");
214 : : strcpy(expected_digest4, "f96b697d7cb7938d525a2f31aaf161d0");
215 : : strcpy(expected_digest5, "c3fcd3d76192e4007dfb496cca67e13b");
216 : : strcpy(expected_digest6, "d174ab98d277d9f5a5611c2c9f419d9f");
217 : : strcpy(expected_digest7, "57edf4a22be3c955ac49da2e2107b67a");
218 : :
219 : : strcpy(msg, "");
220 : : md5(digest, (unsigned char *)msg, strlen(msg));
221 : : for ( i = 0; i < MD5_DIGEST_LEN; i++)
222 : : {
223 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
224 : : }
225 : : CU_ASSERT(memcmp(digest_txt, expected_digest1, MD5_DIGEST_LEN) == 0);
226 : :
227 : : strcpy(msg, "a");
228 : : md5(digest, (unsigned char *)msg, strlen(msg));
229 : : for ( i = 0; i < MD5_DIGEST_LEN; i++)
230 : : {
231 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
232 : : }
233 : : CU_ASSERT(memcmp(digest_txt, expected_digest2, MD5_DIGEST_LEN) == 0);
234 : :
235 : : strcpy(msg, "abc");
236 : : md5(digest, (unsigned char *)msg, strlen(msg));
237 : : for ( i = 0; i < MD5_DIGEST_LEN; i++)
238 : : {
239 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
240 : : }
241 : : CU_ASSERT(memcmp(digest_txt, expected_digest3, MD5_DIGEST_LEN) == 0);
242 : :
243 : : strcpy(msg, "message digest");
244 : : md5(digest, (unsigned char *)msg, strlen(msg));
245 : : for ( i = 0; i < MD5_DIGEST_LEN; i++)
246 : : {
247 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
248 : : }
249 : : CU_ASSERT(memcmp(digest_txt, expected_digest4, MD5_DIGEST_LEN) == 0);
250 : : strcpy(msg, "abcdefghijklmnopqrstuvwxyz");
251 : : md5(digest, (unsigned char *)msg, strlen(msg));
252 : : for ( i = 0; i < MD5_DIGEST_LEN; i++)
253 : : {
254 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
255 : : }
256 : : CU_ASSERT(memcmp(digest_txt, expected_digest5, MD5_DIGEST_LEN) == 0);
257 : : strcpy(msg, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
258 : : md5(digest, (unsigned char *)msg, strlen(msg));
259 : : for ( i = 0; i < MD5_DIGEST_LEN; i++)
260 : : {
261 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
262 : : }
263 : : CU_ASSERT(memcmp(digest_txt, expected_digest6, MD5_DIGEST_LEN) == 0);
264 : : strcpy(msg, "12345678901234567890123456789012345678901234567890123456789012345678901234567890");
265 : : md5(digest, (unsigned char *)msg, strlen(msg));
266 : : for ( i = 0; i < MD5_DIGEST_LEN; i++)
267 : : {
268 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
269 : : }
270 : : CU_ASSERT(memcmp(digest_txt, expected_digest7, MD5_DIGEST_LEN) == 0);
271 : :
272 : : }
273 : :
274 : : DECLARE_UTEST(test_sha1, "sha1 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
275 : : {
276 : : char msg[1024] = {0};
277 : : unsigned char digest[1024] = {0};
278 : : char digest_txt[1024] = {0};
279 : : char expected_digest1[1024] = {0};
280 : : char expected_digest2[1024] = {0};
281 : : char expected_digest3[1024] = {0};
282 : : char expected_digest4[1024] = {0};
283 : : int i = 0;
284 : :
285 : : strcpy(msg, "abc");
286 : : strcpy(expected_digest1, "a9993e364706816aba3e25717850c26c9cd0d89d");
287 : : sha1(digest, (unsigned char *)msg, strlen(msg));
288 : : for ( i = 0; i < SHA1_DIGEST_LEN; i++)
289 : : {
290 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
291 : : }
292 : : CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA1_DIGEST_LEN) == 0);
293 : :
294 : : strcpy(msg, "");
295 : : strcpy(expected_digest2, "da39a3ee5e6b4b0d3255bfef95601890afd80709");
296 : : sha1(digest, (unsigned char *)msg, strlen(msg));
297 : : for ( i = 0; i < SHA1_DIGEST_LEN; i++)
298 : : {
299 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
300 : : }
301 : : CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA1_DIGEST_LEN) == 0);
302 : :
303 : : strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
304 : : strcpy(expected_digest3, "84983e441c3bd26ebaae4aa1f95129e5e54670f1");
305 : : sha1(digest, (unsigned char *)msg, strlen(msg));
306 : : for ( i = 0; i < SHA1_DIGEST_LEN; i++)
307 : : {
308 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
309 : : }
310 : : CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA1_DIGEST_LEN) == 0);
311 : :
312 : : strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
313 : : strcpy(expected_digest4, "a49b2446a02c645bf419f995b67091253a04a259");
314 : : sha1(digest, (unsigned char *)msg, strlen(msg));
315 : : for ( i = 0; i < SHA1_DIGEST_LEN; i++)
316 : : {
317 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
318 : : }
319 : : CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA1_DIGEST_LEN) == 0);
320 : :
321 : : }
322 : : DECLARE_UTEST(test_sha256, "sha-256 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
323 : : {
324 : : char msg[1024] = {0};
325 : : unsigned char digest[1024] = {0};
326 : : char digest_txt[1024] = {0};
327 : : char expected_digest1[1024] = {0};
328 : : char expected_digest2[1024] = {0};
329 : : char expected_digest3[1024] = {0};
330 : : char expected_digest4[1024] = {0};
331 : : int i = 0;
332 : :
333 : : strcpy(msg, "abc");
334 : : strcpy(expected_digest1, "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad");
335 : : sha256(digest, (unsigned char *)msg, strlen(msg));
336 : : for ( i = 0; i < SHA256_DIGEST_LEN; i++)
337 : : {
338 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
339 : : }
340 : : CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA256_DIGEST_LEN) == 0);
341 : :
342 : : strcpy(msg, "");
343 : : strcpy(expected_digest2, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
344 : : sha256(digest, (unsigned char *)msg, strlen(msg));
345 : : for ( i = 0; i < SHA256_DIGEST_LEN; i++)
346 : : {
347 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
348 : : }
349 : : CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA256_DIGEST_LEN) == 0);
350 : :
351 : : strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
352 : : strcpy(expected_digest3, "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1");
353 : : sha256(digest, (unsigned char *)msg, strlen(msg));
354 : : for ( i = 0; i < SHA256_DIGEST_LEN; i++)
355 : : {
356 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
357 : : }
358 : : CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA256_DIGEST_LEN) == 0);
359 : :
360 : : strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
361 : : strcpy(expected_digest4, "cf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1");
362 : : sha256(digest, (unsigned char *)msg, strlen(msg));
363 : : for ( i = 0; i < SHA256_DIGEST_LEN; i++)
364 : : {
365 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
366 : : }
367 : : CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA256_DIGEST_LEN) == 0);
368 : : }
369 : : DECLARE_UTEST(test_sha384, "sha-384 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
370 : : {
371 : : char msg[1024] = {0};
372 : : unsigned char digest[1024] = {0};
373 : : char digest_txt[1024] = {0};
374 : : char expected_digest1[1024] = {0};
375 : : char expected_digest2[1024] = {0};
376 : : char expected_digest3[1024] = {0};
377 : : char expected_digest4[1024] = {0};
378 : : int i = 0;
379 : :
380 : : strcpy(msg, "abc");
381 : : strcpy(expected_digest1, "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7");
382 : : sha384(digest, (unsigned char *)msg, strlen(msg));
383 : : for ( i = 0; i < SHA384_DIGEST_LEN; i++)
384 : : {
385 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
386 : : }
387 : : CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA384_DIGEST_LEN) == 0);
388 : :
389 : : strcpy(msg, "");
390 : : strcpy(expected_digest2, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b");
391 : : sha384(digest, (unsigned char *)msg, strlen(msg));
392 : : for ( i = 0; i < SHA384_DIGEST_LEN; i++)
393 : : {
394 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
395 : : }
396 : : CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA384_DIGEST_LEN) == 0);
397 : :
398 : : strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
399 : : strcpy(expected_digest3, "3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b");
400 : : sha384(digest, (unsigned char *)msg, strlen(msg));
401 : : for ( i = 0; i < SHA384_DIGEST_LEN; i++)
402 : : {
403 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
404 : : }
405 : : CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA384_DIGEST_LEN) == 0);
406 : :
407 : : strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
408 : : strcpy(expected_digest4, "09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039");
409 : : sha384(digest, (unsigned char *)msg, strlen(msg));
410 : : for ( i = 0; i < SHA384_DIGEST_LEN; i++)
411 : : {
412 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
413 : : }
414 : : CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA384_DIGEST_LEN) == 0);
415 : :
416 : : }
417 : : DECLARE_UTEST(test_sha512, "sha-512 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
418 : : {
419 : : char msg[1024] = {0};
420 : : unsigned char digest[1024] = {0};
421 : : char digest_txt[1024] = {0};
422 : : char expected_digest1[1024] = {0};
423 : : char expected_digest2[1024] = {0};
424 : : char expected_digest3[1024] = {0};
425 : : char expected_digest4[1024] = {0};
426 : : int i = 0;
427 : :
428 : : strcpy(msg, "abc");
429 : : strcpy(expected_digest1, "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f");
430 : : sha512(digest, (unsigned char *)msg, strlen(msg));
431 : : for ( i = 0; i < SHA512_DIGEST_LEN; i++)
432 : : {
433 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
434 : : }
435 : : CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA512_DIGEST_LEN) == 0);
436 : :
437 : : strcpy(msg, "");
438 : : strcpy(expected_digest2, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e");
439 : : sha512(digest, (unsigned char *)msg, strlen(msg));
440 : : for ( i = 0; i < SHA512_DIGEST_LEN; i++)
441 : : {
442 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
443 : : }
444 : : CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA512_DIGEST_LEN) == 0);
445 : :
446 : : strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
447 : : strcpy(expected_digest3, "204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445");
448 : : sha512(digest, (unsigned char *)msg, strlen(msg));
449 : : for ( i = 0; i < SHA512_DIGEST_LEN; i++)
450 : : {
451 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
452 : : }
453 : : CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA512_DIGEST_LEN) == 0);
454 : :
455 : : strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
456 : : strcpy(expected_digest4, "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909");
457 : : sha512(digest, (unsigned char *)msg, strlen(msg));
458 : : for ( i = 0; i < SHA512_DIGEST_LEN; i++)
459 : : {
460 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
461 : : }
462 : : CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA512_DIGEST_LEN) == 0);
463 : :
464 : : }
465 : :
466 : : DECLARE_UTEST(test_sha3_256, "sha3_256 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
467 : : {
468 : : char msg[1024] = {0};
469 : : unsigned char digest[1024] = {0};
470 : : char digest_txt[1024] = {0};
471 : : char expected_digest1[1024] = {0};
472 : : char expected_digest2[1024] = {0};
473 : : char expected_digest3[1024] = {0};
474 : : char expected_digest4[1024] = {0};
475 : : int i = 0;
476 : :
477 : : strcpy(msg, "abc");
478 : : strcpy(expected_digest1, "3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532");
479 : : sha3_256(digest, (unsigned char *)msg, strlen(msg));
480 : : for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
481 : : {
482 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
483 : : }
484 : : CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA3_256_DIGEST_LEN) == 0);
485 : :
486 : : strcpy(msg, "");
487 : : strcpy(expected_digest2, "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a");
488 : : sha3_256(digest, (unsigned char *)msg, strlen(msg));
489 : : for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
490 : : {
491 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
492 : : }
493 : : CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA3_256_DIGEST_LEN) == 0);
494 : :
495 : : strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
496 : : strcpy(expected_digest3, "41c0dba2a9d6240849100376a8235e2c82e1b9998a999e21db32dd97496d3376");
497 : : sha3_256(digest, (unsigned char *)msg, strlen(msg));
498 : : for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
499 : : {
500 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
501 : : }
502 : : CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA3_256_DIGEST_LEN) == 0);
503 : :
504 : : strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
505 : : strcpy(expected_digest4, "916f6061fe879741ca6469b43971dfdb28b1a32dc36cb3254e812be27aad1d18");
506 : : sha3_256(digest, (unsigned char *)msg, strlen(msg));
507 : : for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
508 : : {
509 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
510 : : }
511 : : CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA3_256_DIGEST_LEN) == 0);
512 : :
513 : : }
514 : :
515 : : DECLARE_UTEST(test_sha3_512, "sha3_512 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
516 : : {
517 : : char msg[1024] = {0};
518 : : unsigned char digest[1024] = {0};
519 : : char digest_txt[1024] = {0};
520 : : char expected_digest1[1024] = {0};
521 : : char expected_digest2[1024] = {0};
522 : : char expected_digest3[1024] = {0};
523 : : char expected_digest4[1024] = {0};
524 : : int i = 0;
525 : :
526 : : strcpy(msg, "abc");
527 : : strcpy(expected_digest1, "b751850b1a57168a5693cd924b6b096e08f621827444f70d884f5d0240d2712e10e116e9192af3c91a7ec57647e3934057340b4cf408d5a56592f8274eec53f0");
528 : : sha3_512(digest, (unsigned char *)msg, strlen(msg));
529 : : for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
530 : : {
531 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
532 : : }
533 : : CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA3_512_DIGEST_LEN) == 0);
534 : :
535 : : strcpy(msg, "");
536 : : strcpy(expected_digest2, "a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26");
537 : : sha3_512(digest, (unsigned char *)msg, strlen(msg));
538 : : for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
539 : : {
540 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
541 : : }
542 : : CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA3_512_DIGEST_LEN) == 0);
543 : :
544 : : strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
545 : : strcpy(expected_digest3, "04a371e84ecfb5b8b77cb48610fca8182dd457ce6f326a0fd3d7ec2f1e91636dee691fbe0c985302ba1b0d8dc78c086346b533b49c030d99a27daf1139d6e75e");
546 : : sha3_512(digest, (unsigned char *)msg, strlen(msg));
547 : : for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
548 : : {
549 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
550 : : }
551 : : CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA3_512_DIGEST_LEN) == 0);
552 : :
553 : : strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
554 : : strcpy(expected_digest4, "afebb2ef542e6579c50cad06d2e578f9f8dd6881d7dc824d26360feebf18a4fa73e3261122948efcfd492e74e82e2189ed0fb440d187f382270cb455f21dd185");
555 : : sha3_512(digest, (unsigned char *)msg, strlen(msg));
556 : : for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
557 : : {
558 : : sprintf(digest_txt + (2 * i), "%02x", digest[i]);
559 : : }
560 : : CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA3_512_DIGEST_LEN) == 0);
561 : :
562 : : }
563 : :
564 : : int register_ts_digest_test(void)
565 : : {
566 : : ts_init(&TEST_SUITE(digest_test), TEST_SUITE_DESCR(digest_test), NULL, NULL);
567 : : ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_md5), UTEST_DESCR(test_md5));
568 : : ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha1), UTEST_DESCR(test_sha1));
569 : : ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha256), UTEST_DESCR(test_sha256));
570 : : ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha384), UTEST_DESCR(test_sha384));
571 : : ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha512), UTEST_DESCR(test_sha512));
572 : : ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha3_256), UTEST_DESCR(test_sha3_256));
573 : : ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha3_512), UTEST_DESCR(test_sha3_512));
574 : :
575 : : return register_ts(&TEST_SUITE(digest_test));
576 : : }
577 : :
578 : : #endif /* HAVE_C_UNIT_TESTS */ /* LCOV_EXCL_STOP */
579 : : /***EOF***/
|