blob: 5929d0bae555da334bccd40dbde6784222c8dd46 [file] [log] [blame]
/* Test and benchmark elliptic curve and RSA functions
First build amcl.a from build_ec batch file
gcc -O3 benchtest_ec.c amcl.a -o benchtest_ec.exe
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "amcl.h"
#include "rsa.h"
#define MIN_TIME 10.0
#define MIN_ITERS 10
int main()
{
csprng RNG;
BIG s,r,x,y;
ECP P,G;
FP12 g;
int i,iterations;
clock_t start;
double elapsed;
char pr[10];
unsigned long ran;
rsa_public_key pub;
rsa_private_key priv;
char m[RFS],d[RFS],c[RFS];
octet M= {0,sizeof(m),m};
octet D= {0,sizeof(d),d};
octet C= {0,sizeof(c),c};
#if CHOICE==NIST256
printf("NIST256 Curve\n");
#endif
#if CHOICE==C25519
printf("C25519 Curve\n");
#endif
#if CHOICE==BRAINPOOL
printf("BRAINPOOL Curve\n");
#endif
#if CHOICE==ANSSI
printf("ANSSI Curve\n");
#endif
#if CHOICE==MF254
printf("MF254 Curve\n");
#endif
#if CHOICE==MS255
printf("MS255 Curve\n");
#endif
#if CHOICE==MF256
printf("MF256 Curve\n");
#endif
#if CHOICE==MS256
printf("MS256 Curve\n");
#endif
#if CHOICE==HIFIVE
printf("HIFIVE Curve\n");
#endif
#if CHOICE==GOLDILOCKS
printf("GOLDILOCKS Curve\n");
#endif
#if CHOICE==NIST384
printf("NIST384 Curve\n");
#endif
#if CHOICE==C41417
printf("C41417 Curve\n");
#endif
#if CHOICE==NIST521
printf("NIST521 Curve\n");
#endif
#if CHOICE==BN254
printf("BN254 Curve\n");
#endif
#if CHOICE==BN454
printf("BN454 Curve\n");
#endif
#if CHOICE==BN646
printf("BN646 Curve\n");
#endif
#if CHOICE==BN254_CX
printf("BN254_CX Curve\n");
#endif
#if CHOICE==BN254_T
printf("BN254_T Curve\n");
#endif
#if CHOICE==BN254_T2
printf("BN254_T2 Curve\n");
#endif
#if CHOICE==BLS455
printf("BLS455 Curve\n");
#endif
#if CHOICE==BLS383
printf("BLS383 Curve\n");
#endif
#if CURVETYPE==WEIERSTRASS
printf("Weierstrass parameterization\n");
#endif
#if CURVETYPE==EDWARDS
printf("Edwards parameterization\n");
#endif
#if CURVETYPE==MONTGOMERY
printf("Montgomery parameterization\n");
#endif
#if CHUNK==16
printf("16-bit Build\n");
#endif
#if CHUNK==32
printf("32-bit Build\n");
#endif
#if CHUNK==64
printf("64-bit Build\n");
#endif
time((time_t *)&ran);
pr[0]=ran;
pr[1]=ran>>8;
pr[2]=ran>>16;
pr[3]=ran>>24;
for (i=4;i<10;i++) pr[i]=i;
RAND_seed(&RNG,10,pr);
BIG_rcopy(x,CURVE_Gx);
#if CURVETYPE!=MONTGOMERY
BIG_rcopy(y,CURVE_Gy);
ECP_set(&G,x,y);
#else
ECP_set(&G,x);
#endif
BIG_rcopy(r,CURVE_Order);
BIG_randomnum(s,r,&RNG);
ECP_copy(&P,&G);
ECP_mul(&P,r);
if (!ECP_isinf(&P))
{
printf("FAILURE - rG!=O\n");
return 0;
}
iterations=0;
start=clock();
do {
ECP_copy(&P,&G);
ECP_mul(&P,s);
iterations++;
elapsed=(clock()-start)/(double)CLOCKS_PER_SEC;
} while (elapsed<MIN_TIME || iterations<MIN_ITERS);
elapsed=1000.0*elapsed/iterations;
printf("EC mul - %8d iterations ",iterations);
printf(" %8.2lf ms per iteration\n",elapsed);
printf("Generating %d-bit RSA public/private key pair\n",FFLEN*BIGBITS);
iterations=0;
start=clock();
do {
RSA_KEY_PAIR(&RNG,65537,&priv,&pub,NULL,NULL);
iterations++;
elapsed=(clock()-start)/(double)CLOCKS_PER_SEC;
} while (elapsed<MIN_TIME || iterations<MIN_ITERS);
elapsed=1000.0*elapsed/iterations;
printf("RSA gen - %8d iterations ",iterations);
printf(" %8.2lf ms per iteration\n",elapsed);
//FF_randomnum(plain,pub.n,&RNG,FFLEN);
M.len=RFS;
for (i=0;i<RFS;i++) M.val[i]=i%128;
iterations=0;
start=clock();
do {
RSA_ENCRYPT(&pub,&M,&C);
iterations++;
elapsed=(clock()-start)/(double)CLOCKS_PER_SEC;
} while (elapsed<MIN_TIME || iterations<MIN_ITERS);
elapsed=1000.0*elapsed/iterations;
printf("RSA enc - %8d iterations ",iterations);
printf(" %8.2lf ms per iteration\n",elapsed);
iterations=0;
start=clock();
do {
RSA_DECRYPT(&priv,&C,&D);
iterations++;
elapsed=(clock()-start)/(double)CLOCKS_PER_SEC;
} while (elapsed<MIN_TIME || iterations<MIN_ITERS);
elapsed=1000.0*elapsed/iterations;
printf("RSA dec - %8d iterations ",iterations);
printf(" %8.2lf ms per iteration\n",elapsed);
for (i=0;i<RFS;i++)
{
if (M.val[i]!=D.val[i])
{
printf("FAILURE - RSA decryption\n");
return 0;
}
}
printf("All tests pass\n");
return 0;
}