/*
** Copyright 1998 - 1999 Double Precision, Inc.
** See COPYING for distribution information.
*/

#if	HAVE_CONFIG_H
#include	"config.h"
#endif

#define	SHA1_INTERNAL
#include	"../sha1/sha1.h"
#include	"hmac.h"

#include	<stdio.h>


static struct {
	const char *key, *data;
	} testcases[]={
	{"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
		"Hi There"},
	{"Jefe", "what do ya want for nothing?" },

	{"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
		"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"},

	{"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19",
		"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"},

	{"\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c",
		"Test With Truncation"},

	{"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
	"Test Using Larger Than Block-Size Key - Hash Key First"},

	{"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
	"Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data"}
	} ;

int main()
{
	unsigned i, j;

	for (i=0; i<sizeof(testcases)/sizeof(testcases[0]); i++)
	{
	SHA1_DIGEST ok, ik, hash;

		hmac_hashkey(&hmac_sha1, testcases[i].key,
			strlen(testcases[i].key), ok, ik);

		hmac_hashtext(&hmac_sha1, testcases[i].data,
			strlen(testcases[i].data), ok, ik, hash);

		printf("test_cases[%i].digest=0x", i+1);
		for (j=0; j<SHA1_DIGEST_SIZE; j++)
			printf("%02x", hash[j]);
		printf("\n");
	}

	for (i=0; i<sizeof(testcases)/sizeof(testcases[0]); i++)
	{
	SHA256_DIGEST ok, ik, hash;

		hmac_hashkey(&hmac_sha256, testcases[i].key,
			strlen(testcases[i].key), ok, ik);

		hmac_hashtext(&hmac_sha256, testcases[i].data,
			strlen(testcases[i].data), ok, ik, hash);

		printf("test_cases[%i].digest256=0x", i+1);
		for (j=0; j<SHA256_DIGEST_SIZE; j++)
			printf("%02x", hash[j]);
		printf("\n");
	}
	return (0);
}
