#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "ecrypt-sync.h"

#undef u32
typedef unsigned int  u32;

#undef u8
typedef unsigned char  u8;

#define TEST_NUM 0x800000

void generate_testvector (void);

int main(void)
{
	ECRYPT_ctx state;
	u8 key[20], iv[20], text1[16], text2[16];
	u32 keysize, ivsize, i;
	__int64 PERF_MSRB, PERF_MSRE;

	keysize = 128; for (i = 0; i < keysize/8; i++) key[i] = i;
	ivsize  =  32; for (i = 0; i <  ivsize/8; i++)  iv[i] = i;
	for (i = 0; i <  ivsize/8; i++)  text1[i] = 0;
	ECRYPT_keysetup (&state, key, keysize, ivsize);

	printf ("Testing speed. Please be patient.\n");
	_asm rdtsc
    _asm lea ebx, PERF_MSRB
    _asm mov dword ptr [ebx], eax
    _asm mov dword ptr [ebx+4], edx
	for (i = 0; i < TEST_NUM; i++)
	{
		ECRYPT_process_packet (1, &state, iv, text1, text2, 16);
	}
	_asm rdtsc
    _asm lea ebx, PERF_MSRE
    _asm mov dword ptr [ebx],   eax
    _asm mov dword ptr [ebx+4], edx
	printf ("%lf cycles/iteration\n",
		((long double) (PERF_MSRE - PERF_MSRB))/TEST_NUM);
	printf (
		"single iteration\n"
		"     = ECRYPT_process_packet (1, ..., 16);\n"
		"     = state initialization and 128-bit encryption.\n\n"
		);

	generate_testvector();

	exit (0);
}
