Blame winpr/libwinpr/crypto/test/TestCryptoHash.c

Packit 1fb8d4
Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
#include <winpr/print.h>
Packit 1fb8d4
#include <winpr/crypto.h>
Packit 1fb8d4
#include <winpr/ssl.h>
Packit 1fb8d4
Packit Service 5a9772
static const char TEST_MD5_DATA[] = "test";
Packit Service 5a9772
static const BYTE TEST_MD5_HASH[] =
Packit Service 5a9772
    "\x09\x8f\x6b\xcd\x46\x21\xd3\x73\xca\xde\x4e\x83\x26\x27\xb4\xf6";
Packit 1fb8d4
Packit 1fb8d4
static BOOL test_crypto_hash_md5(void)
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL result = FALSE;
Packit 1fb8d4
	BYTE hash[WINPR_MD5_DIGEST_LENGTH];
Packit 1fb8d4
	WINPR_DIGEST_CTX* ctx;
Packit 1fb8d4
Packit 1fb8d4
	if (!(ctx = winpr_Digest_New()))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_Digest_New failed\n", __FUNCTION__);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
	if (!winpr_Digest_Init(ctx, WINPR_MD_MD5))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_Digest_Init failed\n", __FUNCTION__);
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit Service 5a9772
	if (!winpr_Digest_Update(ctx, (const BYTE*)TEST_MD5_DATA,
Packit Service 5a9772
	                         strnlen(TEST_MD5_DATA, sizeof(TEST_MD5_DATA))))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_Digest_Update failed\n", __FUNCTION__);
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit 1fb8d4
	if (!winpr_Digest_Final(ctx, hash, sizeof(hash)))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_Digest_Final failed\n", __FUNCTION__);
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit 1fb8d4
	if (memcmp(hash, TEST_MD5_HASH, WINPR_MD5_DIGEST_LENGTH) != 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		char* actual;
Packit 1fb8d4
		char* expected;
Packit 1fb8d4
Packit 1fb8d4
		actual = winpr_BinToHexString(hash, WINPR_MD5_DIGEST_LENGTH, FALSE);
Packit 1fb8d4
		expected = winpr_BinToHexString(TEST_MD5_HASH, WINPR_MD5_DIGEST_LENGTH, FALSE);
Packit 1fb8d4
Packit 1fb8d4
		fprintf(stderr, "unexpected MD5 hash: Actual: %s Expected: %s\n", actual, expected);
Packit 1fb8d4
Packit 1fb8d4
		free(actual);
Packit 1fb8d4
		free(expected);
Packit 1fb8d4
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	result = TRUE;
Packit 1fb8d4
out:
Packit 1fb8d4
	winpr_Digest_Free(ctx);
Packit 1fb8d4
	return result;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
static const char TEST_MD4_DATA[] = "test";
Packit Service 5a9772
static const BYTE TEST_MD4_HASH[] =
Packit Service 5a9772
    "\xdb\x34\x6d\x69\x1d\x7a\xcc\x4d\xc2\x62\x5d\xb1\x9f\x9e\x3f\x52";
Packit 1fb8d4
Packit 1fb8d4
static BOOL test_crypto_hash_md4(void)
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL result = FALSE;
Packit 1fb8d4
	BYTE hash[WINPR_MD4_DIGEST_LENGTH];
Packit 1fb8d4
	WINPR_DIGEST_CTX* ctx;
Packit 1fb8d4
Packit 1fb8d4
	if (!(ctx = winpr_Digest_New()))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_Digest_New failed\n", __FUNCTION__);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
	if (!winpr_Digest_Init(ctx, WINPR_MD_MD4))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_Digest_Init failed\n", __FUNCTION__);
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit Service 5a9772
	if (!winpr_Digest_Update(ctx, (const BYTE*)TEST_MD4_DATA,
Packit Service 5a9772
	                         strnlen(TEST_MD4_DATA, sizeof(TEST_MD4_DATA))))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_Digest_Update failed\n", __FUNCTION__);
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit 1fb8d4
	if (!winpr_Digest_Final(ctx, hash, sizeof(hash)))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_Digest_Final failed\n", __FUNCTION__);
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit 1fb8d4
	if (memcmp(hash, TEST_MD4_HASH, WINPR_MD4_DIGEST_LENGTH) != 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		char* actual;
Packit 1fb8d4
		char* expected;
Packit 1fb8d4
Packit 1fb8d4
		actual = winpr_BinToHexString(hash, WINPR_MD4_DIGEST_LENGTH, FALSE);
Packit 1fb8d4
		expected = winpr_BinToHexString(TEST_MD4_HASH, WINPR_MD4_DIGEST_LENGTH, FALSE);
Packit 1fb8d4
Packit 1fb8d4
		fprintf(stderr, "unexpected MD4 hash: Actual: %s Expected: %s\n", actual, expected);
Packit 1fb8d4
Packit 1fb8d4
		free(actual);
Packit 1fb8d4
		free(expected);
Packit 1fb8d4
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	result = TRUE;
Packit 1fb8d4
out:
Packit 1fb8d4
	winpr_Digest_Free(ctx);
Packit 1fb8d4
	return result;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
static const char TEST_SHA1_DATA[] = "test";
Packit Service 5a9772
static const BYTE TEST_SHA1_HASH[] =
Packit Service 5a9772
    "\xa9\x4a\x8f\xe5\xcc\xb1\x9b\xa6\x1c\x4c\x08\x73\xd3\x91\xe9\x87\x98\x2f\xbb\xd3";
Packit 1fb8d4
Packit 1fb8d4
static BOOL test_crypto_hash_sha1(void)
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL result = FALSE;
Packit 1fb8d4
	BYTE hash[WINPR_SHA1_DIGEST_LENGTH];
Packit 1fb8d4
	WINPR_DIGEST_CTX* ctx;
Packit 1fb8d4
Packit 1fb8d4
	if (!(ctx = winpr_Digest_New()))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_Digest_New failed\n", __FUNCTION__);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
	if (!winpr_Digest_Init(ctx, WINPR_MD_SHA1))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_Digest_Init failed\n", __FUNCTION__);
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit Service 5a9772
	if (!winpr_Digest_Update(ctx, (const BYTE*)TEST_SHA1_DATA,
Packit Service 5a9772
	                         strnlen(TEST_SHA1_DATA, sizeof(TEST_SHA1_DATA))))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_Digest_Update failed\n", __FUNCTION__);
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit 1fb8d4
	if (!winpr_Digest_Final(ctx, hash, sizeof(hash)))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_Digest_Final failed\n", __FUNCTION__);
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (memcmp(hash, TEST_SHA1_HASH, WINPR_MD5_DIGEST_LENGTH) != 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		char* actual;
Packit 1fb8d4
		char* expected;
Packit 1fb8d4
Packit 1fb8d4
		actual = winpr_BinToHexString(hash, WINPR_SHA1_DIGEST_LENGTH, FALSE);
Packit 1fb8d4
		expected = winpr_BinToHexString(TEST_SHA1_HASH, WINPR_SHA1_DIGEST_LENGTH, FALSE);
Packit 1fb8d4
Packit 1fb8d4
		fprintf(stderr, "unexpected SHA1 hash: Actual: %s Expected: %s\n", actual, expected);
Packit 1fb8d4
Packit 1fb8d4
		free(actual);
Packit 1fb8d4
		free(expected);
Packit 1fb8d4
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	result = TRUE;
Packit 1fb8d4
out:
Packit 1fb8d4
	winpr_Digest_Free(ctx);
Packit 1fb8d4
	return result;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
static const char TEST_HMAC_MD5_DATA[] = "Hi There";
Packit Service 5a9772
static const BYTE TEST_HMAC_MD5_KEY[] =
Packit Service 5a9772
    "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b";
Packit Service 5a9772
static const BYTE TEST_HMAC_MD5_HASH[] =
Packit Service 5a9772
    "\x92\x94\x72\x7a\x36\x38\xbb\x1c\x13\xf4\x8e\xf8\x15\x8b\xfc\x9d";
Packit 1fb8d4
Packit 1fb8d4
static BOOL test_crypto_hash_hmac_md5(void)
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE hash[WINPR_MD5_DIGEST_LENGTH];
Packit 1fb8d4
	WINPR_HMAC_CTX* ctx;
Packit 1fb8d4
	BOOL result = FALSE;
Packit 1fb8d4
Packit 1fb8d4
	if (!(ctx = winpr_HMAC_New()))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_HMAC_New failed\n", __FUNCTION__);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (!winpr_HMAC_Init(ctx, WINPR_MD_MD5, TEST_HMAC_MD5_KEY, WINPR_MD5_DIGEST_LENGTH))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_HMAC_Init failed\n", __FUNCTION__);
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit Service 5a9772
	if (!winpr_HMAC_Update(ctx, (const BYTE*)TEST_HMAC_MD5_DATA,
Packit Service 5a9772
	                       strnlen(TEST_HMAC_MD5_DATA, sizeof(TEST_HMAC_MD5_DATA))))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_HMAC_Update failed\n", __FUNCTION__);
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit 1fb8d4
	if (!winpr_HMAC_Final(ctx, hash, sizeof(hash)))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_HMAC_Final failed\n", __FUNCTION__);
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (memcmp(hash, TEST_HMAC_MD5_HASH, WINPR_MD5_DIGEST_LENGTH) != 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		char* actual;
Packit 1fb8d4
		char* expected;
Packit 1fb8d4
Packit 1fb8d4
		actual = winpr_BinToHexString(hash, WINPR_MD5_DIGEST_LENGTH, FALSE);
Packit 1fb8d4
		expected = winpr_BinToHexString(TEST_HMAC_MD5_HASH, WINPR_MD5_DIGEST_LENGTH, FALSE);
Packit 1fb8d4
Packit 1fb8d4
		fprintf(stderr, "unexpected HMAC-MD5 hash: Actual: %s Expected: %s\n", actual, expected);
Packit 1fb8d4
Packit 1fb8d4
		free(actual);
Packit 1fb8d4
		free(expected);
Packit 1fb8d4
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	result = TRUE;
Packit 1fb8d4
out:
Packit 1fb8d4
	winpr_HMAC_Free(ctx);
Packit 1fb8d4
	return result;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
static const char TEST_HMAC_SHA1_DATA[] = "Hi There";
Packit Service 5a9772
static const BYTE TEST_HMAC_SHA1_KEY[] =
Packit Service 5a9772
    "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b";
Packit Service 5a9772
static const BYTE TEST_HMAC_SHA1_HASH[] =
Packit Service 5a9772
    "\xb6\x17\x31\x86\x55\x05\x72\x64\xe2\x8b\xc0\xb6\xfb\x37\x8c\x8e\xf1\x46\xbe\x00";
Packit 1fb8d4
Packit 1fb8d4
static BOOL test_crypto_hash_hmac_sha1(void)
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE hash[WINPR_SHA1_DIGEST_LENGTH];
Packit 1fb8d4
	WINPR_HMAC_CTX* ctx;
Packit 1fb8d4
	BOOL result = FALSE;
Packit 1fb8d4
Packit 1fb8d4
	if (!(ctx = winpr_HMAC_New()))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_HMAC_New failed\n", __FUNCTION__);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (!winpr_HMAC_Init(ctx, WINPR_MD_SHA1, TEST_HMAC_SHA1_KEY, WINPR_SHA1_DIGEST_LENGTH))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_HMAC_Init failed\n", __FUNCTION__);
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit Service 5a9772
	if (!winpr_HMAC_Update(ctx, (const BYTE*)TEST_HMAC_SHA1_DATA,
Packit Service 5a9772
	                       strnlen(TEST_HMAC_SHA1_DATA, sizeof(TEST_HMAC_SHA1_DATA))))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_HMAC_Update failed\n", __FUNCTION__);
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit 1fb8d4
	if (!winpr_HMAC_Final(ctx, hash, sizeof(hash)))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "%s: winpr_HMAC_Final failed\n", __FUNCTION__);
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (memcmp(hash, TEST_HMAC_SHA1_HASH, WINPR_SHA1_DIGEST_LENGTH) != 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		char* actual;
Packit 1fb8d4
		char* expected;
Packit 1fb8d4
Packit 1fb8d4
		actual = winpr_BinToHexString(hash, WINPR_SHA1_DIGEST_LENGTH, FALSE);
Packit 1fb8d4
		expected = winpr_BinToHexString(TEST_HMAC_SHA1_HASH, WINPR_SHA1_DIGEST_LENGTH, FALSE);
Packit 1fb8d4
Packit 1fb8d4
		fprintf(stderr, "unexpected HMAC-SHA1 hash: Actual: %s Expected: %s\n", actual, expected);
Packit 1fb8d4
Packit 1fb8d4
		free(actual);
Packit 1fb8d4
		free(expected);
Packit 1fb8d4
Packit 1fb8d4
		goto out;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	result = TRUE;
Packit 1fb8d4
out:
Packit 1fb8d4
	winpr_HMAC_Free(ctx);
Packit 1fb8d4
	return result;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int TestCryptoHash(int argc, char* argv[])
Packit 1fb8d4
{
Packit Service 5a9772
	WINPR_UNUSED(argc);
Packit Service 5a9772
	WINPR_UNUSED(argv);
Packit Service 5a9772
Packit 1fb8d4
	winpr_InitializeSSL(WINPR_SSL_INIT_DEFAULT);
Packit 1fb8d4
Packit 1fb8d4
	if (!test_crypto_hash_md5())
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	if (!test_crypto_hash_md4())
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	if (!test_crypto_hash_sha1())
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	if (!test_crypto_hash_hmac_md5())
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	if (!test_crypto_hash_hmac_sha1())
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}