580 lines
21 KiB
C
580 lines
21 KiB
C
/**
|
|
* \file lib/digest.c
|
|
*
|
|
* \brief Roll-up of the digests used by fwknop.
|
|
*/
|
|
|
|
/* Fwknop is developed primarily by the people listed in the file 'AUTHORS'.
|
|
* Copyright (C) 2009-2015 fwknop developers and contributors. For a full
|
|
* list of contributors, see the file 'CREDITS'.
|
|
*
|
|
* License (GNU General Public License):
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
* USA
|
|
*/
|
|
|
|
#include "fko_common.h"
|
|
#include "digest.h"
|
|
#include "base64.h"
|
|
#ifdef HAVE_C_UNIT_TESTS
|
|
DECLARE_TEST_SUITE(digest_test, "digest functions test suite");
|
|
#endif
|
|
/* Compute MD5 hash on in and store result in out.
|
|
*/
|
|
void
|
|
md5(unsigned char *out, unsigned char *in, size_t size)
|
|
{
|
|
MD5Context ctx;
|
|
|
|
MD5Init(&ctx);
|
|
MD5Update(&ctx, (unsigned char*)in, size);
|
|
MD5Final(out, &ctx);
|
|
}
|
|
|
|
/* Compute MD5 hash on in and store the base64 string result in out.
|
|
*/
|
|
void
|
|
md5_base64(char *out, unsigned char *in, size_t size)
|
|
{
|
|
uint8_t md[MD5_DIGEST_LEN];
|
|
|
|
md5(md, in, size);
|
|
b64_encode(md, out, MD5_DIGEST_LEN);
|
|
|
|
strip_b64_eq(out);
|
|
}
|
|
|
|
/* Compute SHA1 hash on in and store result in out.
|
|
*/
|
|
void
|
|
sha1(unsigned char *out, unsigned char *in, size_t size)
|
|
{
|
|
SHA1_INFO sha1_info;
|
|
|
|
sha1_init(&sha1_info);
|
|
sha1_update(&sha1_info, (uint8_t*)in, size);
|
|
sha1_final(out, &sha1_info);
|
|
}
|
|
|
|
/* Compute SHA1 hash on in and store the base64 string result in out.
|
|
*/
|
|
void
|
|
sha1_base64(char *out, unsigned char *in, size_t size)
|
|
{
|
|
uint8_t md[SHA1_DIGEST_LEN];
|
|
|
|
sha1(md, in, size);
|
|
b64_encode(md, out, SHA1_DIGEST_LEN);
|
|
|
|
strip_b64_eq(out);
|
|
}
|
|
|
|
/* Compute SHA256 hash on in and store the hex string result in out.
|
|
*/
|
|
void
|
|
sha256(unsigned char *out, unsigned char *in, size_t size)
|
|
{
|
|
SHA256_CTX sha256_ctx;
|
|
|
|
SHA256_Init(&sha256_ctx);
|
|
SHA256_Update(&sha256_ctx, (const uint8_t*)in, size);
|
|
SHA256_Final(out, &sha256_ctx);
|
|
}
|
|
|
|
/* Compute SHA256 hash on in and store the base64 string result in out.
|
|
*/
|
|
void
|
|
sha256_base64(char *out, unsigned char *in, size_t size)
|
|
{
|
|
uint8_t md[SHA256_DIGEST_LEN];
|
|
|
|
sha256(md, in, size);
|
|
b64_encode(md, out, SHA256_DIGEST_LEN);
|
|
|
|
strip_b64_eq(out);
|
|
}
|
|
|
|
/* Compute SHA384 hash on in and store the hex string result in out.
|
|
*/
|
|
void
|
|
sha384(unsigned char *out, unsigned char *in, size_t size)
|
|
{
|
|
SHA384_CTX sha384_ctx;
|
|
|
|
SHA384_Init(&sha384_ctx);
|
|
SHA384_Update(&sha384_ctx, (const uint8_t*)in, size);
|
|
SHA384_Final(out, &sha384_ctx);
|
|
}
|
|
|
|
/* Compute SHA384 hash on in and store the base64 string result in out.
|
|
*/
|
|
void
|
|
sha384_base64(char *out, unsigned char *in, size_t size)
|
|
{
|
|
uint8_t md[SHA384_DIGEST_LEN];
|
|
|
|
sha384(md, in, size);
|
|
b64_encode(md, out, SHA384_DIGEST_LEN);
|
|
|
|
strip_b64_eq(out);
|
|
}
|
|
|
|
/* Compute SHA512 hash on in and store the hex string result in out.
|
|
*/
|
|
void
|
|
sha512(unsigned char *out, unsigned char *in, size_t size)
|
|
{
|
|
SHA512_CTX sha512_ctx;
|
|
|
|
SHA512_Init(&sha512_ctx);
|
|
SHA512_Update(&sha512_ctx, (const uint8_t*)in, size);
|
|
SHA512_Final(out, &sha512_ctx);
|
|
}
|
|
|
|
/* Compute SHA512 hash on in and store the base64 string result in out.
|
|
*/
|
|
void
|
|
sha512_base64(char *out, unsigned char *in, size_t size)
|
|
{
|
|
uint8_t md[SHA512_DIGEST_LEN];
|
|
|
|
sha512(md, in, size);
|
|
b64_encode(md, out, SHA512_DIGEST_LEN);
|
|
|
|
strip_b64_eq(out);
|
|
}
|
|
|
|
void
|
|
sha3_256(unsigned char *out, unsigned char *in, size_t size)
|
|
{
|
|
FIPS202_SHA3_256(in, size, out);
|
|
}
|
|
|
|
void
|
|
sha3_256_base64(char *out, unsigned char *in, size_t size)
|
|
{
|
|
uint8_t md[SHA3_256_DIGEST_LEN];
|
|
|
|
FIPS202_SHA3_256(in, size, md);
|
|
b64_encode(md, out, SHA3_256_DIGEST_LEN);
|
|
|
|
strip_b64_eq(out);
|
|
|
|
}
|
|
void
|
|
sha3_512(unsigned char *out, unsigned char *in, size_t size)
|
|
{
|
|
FIPS202_SHA3_512(in, size, out);
|
|
}
|
|
|
|
void
|
|
sha3_512_base64(char *out, unsigned char *in, size_t size)
|
|
{
|
|
uint8_t md[SHA3_512_DIGEST_LEN];
|
|
|
|
FIPS202_SHA3_512(in, size, md);
|
|
b64_encode(md, out, SHA3_512_DIGEST_LEN);
|
|
|
|
strip_b64_eq(out);
|
|
|
|
}
|
|
|
|
#ifdef HAVE_C_UNIT_TESTS
|
|
|
|
DECLARE_UTEST(test_md5, "md5 test vectors") //https://tools.ietf.org/html/rfc1321.html
|
|
{
|
|
char msg[1024] = {0};
|
|
unsigned char digest[1024] = {0};
|
|
char digest_txt[1024] = {0};
|
|
char expected_digest1[1024] = {0};
|
|
char expected_digest2[1024] = {0};
|
|
char expected_digest3[1024] = {0};
|
|
char expected_digest4[1024] = {0};
|
|
char expected_digest5[1024] = {0};
|
|
char expected_digest6[1024] = {0};
|
|
char expected_digest7[1024] = {0};
|
|
int i = 0;
|
|
|
|
strcpy(expected_digest1, "d41d8cd98f00b204e9800998ecf8427e");
|
|
strcpy(expected_digest2, "0cc175b9c0f1b6a831c399e269772661");
|
|
strcpy(expected_digest3, "900150983cd24fb0d6963f7d28e17f72");
|
|
strcpy(expected_digest4, "f96b697d7cb7938d525a2f31aaf161d0");
|
|
strcpy(expected_digest5, "c3fcd3d76192e4007dfb496cca67e13b");
|
|
strcpy(expected_digest6, "d174ab98d277d9f5a5611c2c9f419d9f");
|
|
strcpy(expected_digest7, "57edf4a22be3c955ac49da2e2107b67a");
|
|
|
|
strcpy(msg, "");
|
|
md5(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < MD5_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest1, MD5_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "a");
|
|
md5(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < MD5_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest2, MD5_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "abc");
|
|
md5(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < MD5_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest3, MD5_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "message digest");
|
|
md5(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < MD5_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest4, MD5_DIGEST_LEN) == 0);
|
|
strcpy(msg, "abcdefghijklmnopqrstuvwxyz");
|
|
md5(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < MD5_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest5, MD5_DIGEST_LEN) == 0);
|
|
strcpy(msg, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
|
|
md5(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < MD5_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest6, MD5_DIGEST_LEN) == 0);
|
|
strcpy(msg, "12345678901234567890123456789012345678901234567890123456789012345678901234567890");
|
|
md5(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < MD5_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest7, MD5_DIGEST_LEN) == 0);
|
|
|
|
}
|
|
|
|
DECLARE_UTEST(test_sha1, "sha1 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
|
|
{
|
|
char msg[1024] = {0};
|
|
unsigned char digest[1024] = {0};
|
|
char digest_txt[1024] = {0};
|
|
char expected_digest1[1024] = {0};
|
|
char expected_digest2[1024] = {0};
|
|
char expected_digest3[1024] = {0};
|
|
char expected_digest4[1024] = {0};
|
|
int i = 0;
|
|
|
|
strcpy(msg, "abc");
|
|
strcpy(expected_digest1, "a9993e364706816aba3e25717850c26c9cd0d89d");
|
|
sha1(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA1_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA1_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "");
|
|
strcpy(expected_digest2, "da39a3ee5e6b4b0d3255bfef95601890afd80709");
|
|
sha1(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA1_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA1_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
|
|
strcpy(expected_digest3, "84983e441c3bd26ebaae4aa1f95129e5e54670f1");
|
|
sha1(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA1_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA1_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
|
|
strcpy(expected_digest4, "a49b2446a02c645bf419f995b67091253a04a259");
|
|
sha1(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA1_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA1_DIGEST_LEN) == 0);
|
|
|
|
}
|
|
DECLARE_UTEST(test_sha256, "sha-256 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
|
|
{
|
|
char msg[1024] = {0};
|
|
unsigned char digest[1024] = {0};
|
|
char digest_txt[1024] = {0};
|
|
char expected_digest1[1024] = {0};
|
|
char expected_digest2[1024] = {0};
|
|
char expected_digest3[1024] = {0};
|
|
char expected_digest4[1024] = {0};
|
|
int i = 0;
|
|
|
|
strcpy(msg, "abc");
|
|
strcpy(expected_digest1, "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad");
|
|
sha256(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA256_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA256_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "");
|
|
strcpy(expected_digest2, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
|
|
sha256(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA256_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA256_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
|
|
strcpy(expected_digest3, "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1");
|
|
sha256(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA256_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA256_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
|
|
strcpy(expected_digest4, "cf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1");
|
|
sha256(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA256_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA256_DIGEST_LEN) == 0);
|
|
}
|
|
DECLARE_UTEST(test_sha384, "sha-384 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
|
|
{
|
|
char msg[1024] = {0};
|
|
unsigned char digest[1024] = {0};
|
|
char digest_txt[1024] = {0};
|
|
char expected_digest1[1024] = {0};
|
|
char expected_digest2[1024] = {0};
|
|
char expected_digest3[1024] = {0};
|
|
char expected_digest4[1024] = {0};
|
|
int i = 0;
|
|
|
|
strcpy(msg, "abc");
|
|
strcpy(expected_digest1, "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7");
|
|
sha384(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA384_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA384_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "");
|
|
strcpy(expected_digest2, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b");
|
|
sha384(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA384_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA384_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
|
|
strcpy(expected_digest3, "3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b");
|
|
sha384(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA384_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA384_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
|
|
strcpy(expected_digest4, "09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039");
|
|
sha384(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA384_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA384_DIGEST_LEN) == 0);
|
|
|
|
}
|
|
DECLARE_UTEST(test_sha512, "sha-512 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
|
|
{
|
|
char msg[1024] = {0};
|
|
unsigned char digest[1024] = {0};
|
|
char digest_txt[1024] = {0};
|
|
char expected_digest1[1024] = {0};
|
|
char expected_digest2[1024] = {0};
|
|
char expected_digest3[1024] = {0};
|
|
char expected_digest4[1024] = {0};
|
|
int i = 0;
|
|
|
|
strcpy(msg, "abc");
|
|
strcpy(expected_digest1, "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f");
|
|
sha512(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA512_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA512_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "");
|
|
strcpy(expected_digest2, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e");
|
|
sha512(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA512_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA512_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
|
|
strcpy(expected_digest3, "204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445");
|
|
sha512(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA512_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA512_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
|
|
strcpy(expected_digest4, "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909");
|
|
sha512(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA512_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA512_DIGEST_LEN) == 0);
|
|
|
|
}
|
|
|
|
DECLARE_UTEST(test_sha3_256, "sha3_256 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
|
|
{
|
|
char msg[1024] = {0};
|
|
unsigned char digest[1024] = {0};
|
|
char digest_txt[1024] = {0};
|
|
char expected_digest1[1024] = {0};
|
|
char expected_digest2[1024] = {0};
|
|
char expected_digest3[1024] = {0};
|
|
char expected_digest4[1024] = {0};
|
|
int i = 0;
|
|
|
|
strcpy(msg, "abc");
|
|
strcpy(expected_digest1, "3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532");
|
|
sha3_256(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA3_256_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "");
|
|
strcpy(expected_digest2, "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a");
|
|
sha3_256(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA3_256_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
|
|
strcpy(expected_digest3, "41c0dba2a9d6240849100376a8235e2c82e1b9998a999e21db32dd97496d3376");
|
|
sha3_256(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA3_256_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
|
|
strcpy(expected_digest4, "916f6061fe879741ca6469b43971dfdb28b1a32dc36cb3254e812be27aad1d18");
|
|
sha3_256(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA3_256_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA3_256_DIGEST_LEN) == 0);
|
|
|
|
}
|
|
|
|
DECLARE_UTEST(test_sha3_512, "sha3_512 test vectors") //http://www.di-mgt.com.au/sha_testvectors.html
|
|
{
|
|
char msg[1024] = {0};
|
|
unsigned char digest[1024] = {0};
|
|
char digest_txt[1024] = {0};
|
|
char expected_digest1[1024] = {0};
|
|
char expected_digest2[1024] = {0};
|
|
char expected_digest3[1024] = {0};
|
|
char expected_digest4[1024] = {0};
|
|
int i = 0;
|
|
|
|
strcpy(msg, "abc");
|
|
strcpy(expected_digest1, "b751850b1a57168a5693cd924b6b096e08f621827444f70d884f5d0240d2712e10e116e9192af3c91a7ec57647e3934057340b4cf408d5a56592f8274eec53f0");
|
|
sha3_512(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest1, SHA3_512_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "");
|
|
strcpy(expected_digest2, "a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26");
|
|
sha3_512(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest2, SHA3_512_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
|
|
strcpy(expected_digest3, "04a371e84ecfb5b8b77cb48610fca8182dd457ce6f326a0fd3d7ec2f1e91636dee691fbe0c985302ba1b0d8dc78c086346b533b49c030d99a27daf1139d6e75e");
|
|
sha3_512(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest3, SHA3_512_DIGEST_LEN) == 0);
|
|
|
|
strcpy(msg, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
|
|
strcpy(expected_digest4, "afebb2ef542e6579c50cad06d2e578f9f8dd6881d7dc824d26360feebf18a4fa73e3261122948efcfd492e74e82e2189ed0fb440d187f382270cb455f21dd185");
|
|
sha3_512(digest, (unsigned char *)msg, strlen(msg));
|
|
for ( i = 0; i < SHA3_512_DIGEST_LEN; i++)
|
|
{
|
|
sprintf(digest_txt + (2 * i), "%02x", digest[i]);
|
|
}
|
|
CU_ASSERT(memcmp(digest_txt, expected_digest4, SHA3_512_DIGEST_LEN) == 0);
|
|
|
|
}
|
|
|
|
int register_ts_digest_test(void)
|
|
{
|
|
ts_init(&TEST_SUITE(digest_test), TEST_SUITE_DESCR(digest_test), NULL, NULL);
|
|
ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_md5), UTEST_DESCR(test_md5));
|
|
ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha1), UTEST_DESCR(test_sha1));
|
|
ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha256), UTEST_DESCR(test_sha256));
|
|
ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha384), UTEST_DESCR(test_sha384));
|
|
ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha512), UTEST_DESCR(test_sha512));
|
|
ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha3_256), UTEST_DESCR(test_sha3_256));
|
|
ts_add_utest(&TEST_SUITE(digest_test), UTEST_FCT(test_sha3_512), UTEST_DESCR(test_sha3_512));
|
|
|
|
return register_ts(&TEST_SUITE(digest_test));
|
|
}
|
|
|
|
#endif /* HAVE_C_UNIT_TESTS */
|
|
/***EOF***/
|