<!DOCTYPE HTML>
<html>
<head>
<title>JavaScript Test ECC</title>
</head>
<body>
<h1>JavaScript Test ECC Example</h1>
<script type="text/javascript" src="DBIG.js"></script>
<script type="text/javascript" src="BIG.js"></script>
<script type="text/javascript" src="FP.js"></script>
<script type="text/javascript" src="ROM.js"></script>
<script type="text/javascript" src="HASH.js"></script>
<script type="text/javascript" src="RAND.js"></script>
<script type="text/javascript" src="AES.js"></script>
<script type="text/javascript" src="GCM.js"></script>
<script type="text/javascript" src="ECP.js"></script>
<script type="text/javascript" src="ECDH.js"></script>

<script>
/* test driver and function exerciser for ECDH API Functions only - for use with Montgpmery curves */
		var i,j=0,res;
		var result;
		var pp="M0ng00se";

		var EGS=ECDH.EGS;
		var EFS=ECDH.EFS;
		var EAS=16;

		var S1=[];
		var W0=[];
		var W1=[];
		var Z0=[];
		var Z1=[];
		var RAW=[];
		var SALT=[];

		var rng=new RAND();

		rng.clean();
		for (i=0;i<100;i++) RAW[i]=i;

		rng.seed(100,RAW);
//for (j=0;j<100;j++)
//{

		for (i=0;i<8;i++) SALT[i]=(i+1);  // set Salt

		window.document.write("Alice's Passphrase= " + pp + "<br>");

		var PW=ECDH.stringtobytes(pp);
/* private key S0 of size EGS bytes derived from Password and Salt */
		var S0=ECDH.PBKDF2(PW,SALT,1000,EGS);

		window.document.write("Alice's private key= 0x"+ECDH.bytestostring(S0)+ "<br>");
/* Generate Key pair S/W */
		ECDH.KEY_PAIR_GENERATE(null,S0,W0); 

		window.document.write("Alice's public key= 0x"+ECDH.bytestostring(W0)+ "<br>");

		res=ECDH.PUBLIC_KEY_VALIDATE(true,W0);
		if (res!=0)
			alert("Alice's public Key is invalid!");
/* Random private key for other party */
		ECDH.KEY_PAIR_GENERATE(rng,S1,W1);

		window.document.write("Servers private key= 0x"+ECDH.bytestostring(S1)+ "<br>");
		window.document.write("Servers public key= 0x"+ECDH.bytestostring(W1)+ "<br>");

		res=ECDH.PUBLIC_KEY_VALIDATE(true,W1);
		if (res!=0)
			alert("Server's public Key is invalid!");
			

/* Calculate common key using DH - IEEE 1363 method */

		ECDH.ECPSVDP_DH(S0,W1,Z0);
		ECDH.ECPSVDP_DH(S1,W0,Z1);

		var same=true;
		for (i=0;i<ECDH.EFS;i++)
			if (Z0[i]!=Z1[i]) same=false;

		if (!same)
			alert("*** ECPSVDP-DH Failed");

		var KEY=ECDH.KDF1(Z0,ECDH.EAS);

		window.document.write("Alice's DH Key=  0x"+ECDH.bytestostring(KEY)+ "<br>");
		window.document.write("Servers DH Key=  0x"+ECDH.bytestostring(KEY)+ "<br>");

//}
//window.document.write("Test Completed Successfully"+ "<br>");
</script>
</body>
</html>
