blob: 49ca24159dee2fb69bbd2cb95b8c3cb07fd5cdc7 [file] [log] [blame]
<!DOCTYPE HTML>
<html>
<head>
<title>JavaScript Elliptic Curve Benchtest</title>
</head>
<body>
<h1>JavaScript Benchmark ECC and RSA</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="FF.js"></script>
<script type="text/javascript" src="ECP.js"></script>
<script type="text/javascript" src="RSA.js"></script>
<script type="text/javascript" src="HASH256.js"></script>
<script type="text/javascript" src="RAND.js"></script>
<script>
/* test driver and function exerciser ECC functions */
var i,j;
var result;
var MIN_ITERS=10;
var MIN_TIME=10;
var pub=new rsa_public_key(ROM.FFLEN);
var priv=new rsa_private_key(ROM.HFLEN);
var fail=false;
var RAW=[];
var M=[];
var C=[];
var P=[];
var rng=new RAND();
rng.clean();
for (i=0;i<100;i++) RAW[i]=i;
rng.seed(100,RAW);
if (ROM.CURVETYPE==ROM.WEIERSTRASS)
{
window.document.write("Weierstrass parameterization "+ "<br>");
}
if (ROM.CURVETYPE==ROM.EDWARDS)
{
window.document.write("Edwards parameterization"+ "<br>");
}
if (ROM.CURVETYPE==ROM.MONTGOMERY)
{
window.document.write("Montgomery parameterization"+ "<br>");
}
if (ROM.MODTYPE==ROM.PSEUDO_MERSENNE)
{
window.document.write("Pseudo-Mersenne Modulus"+ "<br>");
}
if (ROM.MODTYPE==ROM.MONTGOMERY_FRIENDLY)
{
window.document.write("Montgomery friendly Modulus"+ "<br>");
}
if (ROM.MODTYPE==ROM.GENERALISED_MERSENNE)
{
window.document.write("Generalised-Mersenne Modulus"+ "<br>");
}
if (ROM.MODTYPE==ROM.NOT_SPECIAL)
{
window.document.write("Not special Modulus"+ "<br>");
}
window.document.write("Modulus size "+ROM.MODBITS+ " bits"+ "<br>");
window.document.write(ROM.CHUNK + " bit build"+ "<br>");
var r,gx,gy,s;
var G,WP;
var res=0;
G=new ECP(0);
gx=new BIG(0); gx.rcopy(ROM.CURVE_Gx);
if (ROM.CURVETYPE!=ROM.MOMTGOMERY)
{
gy=new BIG(0); gy.rcopy(ROM.CURVE_Gy);
G.setxy(gx,gy);
}
else G.setx(gx);
r=new BIG(0); r.rcopy(ROM.CURVE_Order);
s=BIG.randomnum(r,rng);
WP=G.mul(r);
if (!WP.is_infinity())
{
alert("FAILURE - rG!=O");
fail=true;
}
var elapsed;
var start = performance.now();
iterations=0;
do {
WP=G.mul(s);
iterations++;
elapsed=(performance.now()-start);
} while (elapsed<MIN_TIME*1000 || iterations<MIN_ITERS);
dur=elapsed/iterations;
window.document.write("EC mul - " + iterations + " iterations ");
window.document.write(dur.toFixed(2) + " ms per iteration"+ "<br>");
window.document.write("Generating " +ROM.FFLEN*ROM.BIGBITS + " - bit RSA public/private key pair"+ "<br>");
MIN_ITERS=1;
start = performance.now();
iterations=0;
do {
RSA.KEY_PAIR(rng,65537,priv,pub);
iterations++;
elapsed=(performance.now()-start);
} while (elapsed<MIN_TIME*1000 || iterations<MIN_ITERS);
dur=elapsed/iterations;
window.document.write("RSA gen - " + iterations + " iteration ");
window.document.write(dur.toFixed(2) + " ms per iteration"+ "<br>");
MIN_ITERS=10;
for (i=0;i<RSA.RFS;i++) M[i]=(i%128);
start = performance.now();
iterations=0;
do {
RSA.ENCRYPT(pub,M,C);
iterations++;
elapsed=(performance.now()-start);
} while (elapsed<MIN_TIME*1000 || iterations<MIN_ITERS);
dur=elapsed/iterations;
window.document.write("RSA enc - " + iterations + " iterations ");
window.document.write(dur.toFixed(2) + " ms per iteration"+ "<br>");
start = performance.now();
iterations=0;
do {
RSA.DECRYPT(priv,C,P);
iterations++;
elapsed=(performance.now()-start);
} while (elapsed<MIN_TIME*1000 || iterations<MIN_ITERS);
dur=elapsed/iterations;
window.document.write("RSA dec - " + iterations + " iterations ");
window.document.write(dur.toFixed(2) + " ms per iteration"+ "<br>");
var cmp=true;
for (i=0;i<RSA.RFS;i++)
{
if (P[i]!=M[i]) cmp=false;
}
if (!cmp)
{
alert("FAILURE - RSA decryption");
fail=true;
}
if (!fail) window.document.write("All tests pass"+ "<br>");
</script>
</body>
</html>