/*
 * Test program for MD4 (test vectors from RFC 1320)
 * Copyright (c) 2006-2009, Jouni Malinen <j@w1.fi>
 *
 * This software may be distributed under the terms of the BSD license.
 * See README for more details.
 */

#include "includes.h"

#include "common.h"
#include "crypto/crypto.h"

int main(int argc, char *argv[])
{
	struct {
		char *data;
		char *hash;
	} tests[] = {
		{
			"",
			"\x31\xd6\xcf\xe0\xd1\x6a\xe9\x31"
			"\xb7\x3c\x59\xd7\xe0\xc0\x89\xc0"
		},
		{
			"a",
			"\xbd\xe5\x2c\xb3\x1d\xe3\x3e\x46"
			"\x24\x5e\x05\xfb\xdb\xd6\xfb\x24"
		},
		{
			"abc",
			"\xa4\x48\x01\x7a\xaf\x21\xd8\x52"
			"\x5f\xc1\x0a\xe8\x7a\xa6\x72\x9d"
		},
		{
			"message digest",
			"\xd9\x13\x0a\x81\x64\x54\x9f\xe8"
			"\x18\x87\x48\x06\xe1\xc7\x01\x4b"
		},
		{
			"abcdefghijklmnopqrstuvwxyz",
			"\xd7\x9e\x1c\x30\x8a\xa5\xbb\xcd"
			"\xee\xa8\xed\x63\xdf\x41\x2d\xa9"
		},
		{
			"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
			"0123456789",
			"\x04\x3f\x85\x82\xf2\x41\xdb\x35"
			"\x1c\xe6\x27\xe1\x53\xe7\xf0\xe4"
		},
		{
			"12345678901234567890123456789012345678901234567890"
			"123456789012345678901234567890",
			"\xe3\x3b\x4d\xdc\x9c\x38\xf2\x19"
			"\x9c\x3e\x7b\x16\x4f\xcc\x05\x36"
		}
	};
	unsigned int i;
	u8 hash[16];
	const u8 *addr[2];
	size_t len[2];
	int errors = 0;

	for (i = 0; i < ARRAY_SIZE(tests); i++) {
		printf("MD4 test case %d:", i);

		addr[0] = (u8 *) tests[i].data;
		len[0] = strlen(tests[i].data);
		md4_vector(1, addr, len, hash);
		if (memcmp(hash, tests[i].hash, 16) != 0) {
			printf(" FAIL");
			errors++;
		} else
			printf(" OK");

		if (len[0]) {
			addr[0] = (u8 *) tests[i].data;
			len[0] = strlen(tests[i].data);
			addr[1] = (u8 *) tests[i].data + 1;
			len[1] = strlen(tests[i].data) - 1;
			md4_vector(1, addr, len, hash);
			if (memcmp(hash, tests[i].hash, 16) != 0) {
				printf(" FAIL");
				errors++;
			} else
				printf(" OK");
		}

		printf("\n");
	}

	return errors;
}
