/* -----------------------------------------------------------------------
 *
 * Copyright (c) 2008 EURL Cryptographie Ingénierie et Conseil <ecctk@cryptograph-ic.com>, AIX-NOULETTE, FRANCE
 *
 * Termes :
 *
 * L'utilisation et/ou la redistribution de ce code (avec ou sans modification),
 * ainsi que de tous les composants du produit (librairies, documentation, exemples, ...)
 * est soumise aux termes de la licence qui vous est attribuée par son auteur.
 *
 * -----------------------------------------------------------------------
 */

#include <stdlib.h>
#include <stdio.h>

#include <include/ecctk-prototype.h>
#include <include/ecctk-hash.h>

void hmac_stream()
{
	s2byte	ret		= -1;

	/* set hashMAC algorithm
	 */
	s2byte	algo	= ECCTK_HASH_HMAC_ALGO_MD5;
	
	/* set stream to hashMAC and create output stream with maximum size for the hash value
	 */
	u1byte	in[]	= "Elliptic Curve Cryptographic ToolKit";

#ifndef ECCTK_EVALUATION
	u1byte	hash[ECCTK_HASH_SIZE_SHA512];
#else
	u1byte	hash[ECCTK_HASH_SIZE_SHA160];
#endif
	

	/* set the value of the key
	 */
	u1byte	key[] = "This is an example of text key";

	/* the size of hash value, only use to print the result
	 */
	u2byte	hashsize;

	switch (algo)
	{
	case ECCTK_HASH_HMAC_ALGO_MD5:
		hashsize = ECCTK_HASH_SIZE_MD5;
		ret = MD5_StreamHashMAC(in, sizeof(in), key, sizeof(key), hash, hashsize);
		break;
	case ECCTK_HASH_HMAC_ALGO_SHA160:
		hashsize = ECCTK_HASH_SIZE_SHA160;
		ret = SHA160_StreamHashMAC(in, sizeof(in), key, sizeof(key), hash, hashsize);
		break;
#ifndef ECCTK_EVALUATION
	case ECCTK_HASH_HMAC_ALGO_SHA256:
		hashsize = ECCTK_HASH_SIZE_SHA256;
		ret = SHA256_StreamHashMAC(in, sizeof(in), key, sizeof(key), hash, hashsize);
		break;
	case ECCTK_HASH_HMAC_ALGO_SHA384:
		hashsize = ECCTK_HASH_SIZE_SHA384;
		ret = SHA384_StreamHashMAC(in, sizeof(in), key, sizeof(key), hash, hashsize);
		break;
	case ECCTK_HASH_HMAC_ALGO_SHA512:
		hashsize = ECCTK_HASH_SIZE_SHA512;
		ret = SHA512_StreamHashMAC(in, sizeof(in), key, sizeof(key), hash, hashsize);
		break;
#endif
	case ECCTK_HASH_HMAC_ALGO_RMD128:
		hashsize = ECCTK_HASH_SIZE_RMD128;
		ret = RIPEMD128_StreamHashMAC(in, sizeof(in), key, sizeof(key), hash, hashsize);
		break;
#ifndef ECCTK_EVALUATION
	case ECCTK_HASH_HMAC_ALGO_RMD160:
		hashsize = ECCTK_HASH_SIZE_RMD160;
		ret = RIPEMD160_StreamHashMAC(in, sizeof(in), key, sizeof(key), hash, hashsize);
		break;
	case ECCTK_HASH_HMAC_ALGO_RMD256:
		hashsize = ECCTK_HASH_SIZE_RMD256;
		ret = RIPEMD256_StreamHashMAC(in, sizeof(in), key, sizeof(key), hash, hashsize);
		break;
	case ECCTK_HASH_HMAC_ALGO_RMD320:
		hashsize = ECCTK_HASH_SIZE_RMD320;
		ret = RIPEMD320_StreamHashMAC(in, sizeof(in), key, sizeof(key), hash, hashsize);
		break;
#endif
	default:
		break;
	}

	if (ret != ECCTK_HASH_NO_ERROR)
		printf("HashMAC stream failed (Error : %d)\n", ret);
	else
	{
		u4byte i;

		printf("HashMAC of stream = ");
		for (i = 0; i < hashsize; i++)
			printf("%02x", hash[i]);
		printf("\n");
	}
}
