BOOL ebrick_init(_MIPD_ ebrick *B,big x,big y,big a,big b,big n,int window,int nb) { /* Uses Montgomery arithmetic internally * * (x,y) is the fixed base * * a,b and n are parameters and modulus of the curve * * window is the window size in bits and * * nb is the maximum number of bits in the multiplier */ int i,j,k,t,bp,len,bptr,is; epoint **table; epoint *w; #ifdef MR_OS_THREADS miracl *mr_mip=get_mip(); #endif if (nb<2 || window<1 || window>nb || mr_mip->ERNUM) return FALSE; t=MR_ROUNDUP(nb,window); if (t<2) return FALSE; MR_IN(115) #ifndef MR_ALWAYS_BINARY if (mr_mip->base != mr_mip->base2) { mr_berror(_MIPP_ MR_ERR_NOT_SUPPORTED); MR_OUT return FALSE; }
BOOL brick_init(_MIPD_ brick *b,big g,big n,int window,int nb) { /* Uses Montgomery arithmetic internally * * g is the fixed base for exponentiation * * n is the fixed modulus * * nb is the maximum number of bits in the exponent */ int i,j,k,t,bp,len,bptr; big *table; #ifdef MR_OS_THREADS miracl *mr_mip=get_mip(); #endif if (nb<2 || window<1 || window>nb || mr_mip->ERNUM) return FALSE; t=MR_ROUNDUP(nb,window); if (t<2) return FALSE; MR_IN(109) #ifndef MR_ALWAYS_BINARY if (mr_mip->base != mr_mip->base2) { mr_berror(_MIPP_ MR_ERR_NOT_SUPPORTED); MR_OUT return FALSE; }
int main() { FILE *fp; int ep,m,a,b,c; miracl *mip; epoint *g,*public; char ifname[50],ofname[50]; big a2,a6,q,x,y,v,u1,u2,r,s,hash; /* get public data */ fp=fopen("common2.ecs","rt"); if (fp==NULL) { printf("file common2.ecs does not exist\n"); return 0; } fscanf(fp,"%d\n",&m); mip=mirsys(MR_ROUNDUP(abs(m),4),16); a2=mirvar(0); a6=mirvar(0); q=mirvar(0); x=mirvar(0); y=mirvar(0); v=mirvar(0); u1=mirvar(0); u2=mirvar(0); s=mirvar(0); r=mirvar(0); hash=mirvar(0); innum(a2,fp); innum(a6,fp); innum(q,fp); innum(x,fp); innum(y,fp); fscanf(fp,"%d\n",&a); fscanf(fp,"%d\n",&b); fscanf(fp,"%d\n",&c); fclose(fp); ecurve2_init(m,a,b,c,a2,a6,FALSE,MR_BEST); /* initialise curve */ g=epoint_init(); epoint2_set(x,y,0,g); /* initialise point of order q */ /* get public key of signer */ fp=fopen("public.ecs","rt"); if (fp==NULL) { printf("file public.ecs does not exist\n"); return 0; } fscanf(fp,"%d",&ep); innum(x,fp); fclose(fp); public=epoint_init();
int PFC::precomp_for_mult(G2& w,BOOL small) { ECn3 v; ZZn3 x,y; int i,j,k,bp,is,t; if (small) t=MR_ROUNDUP(2*S,WINDOW_SIZE); else t=MR_ROUNDUP(bits(*ord),WINDOW_SIZE); w.g.norm(); v=w.g; w.mtable=new ECn3[1<<WINDOW_SIZE]; v.norm(); w.mtable[1]=v; w.mtbits=t; for (j=0;j<t;j++) v+=v; k=1; for (i=2;i<(1<<WINDOW_SIZE);i++) { if (i==(1<<k)) { k++; v.norm(); w.mtable[i]=v; for (j=0;j<t;j++) v+=v; continue; } bp=1; for (j=0;j<k;j++) { if (i&bp) { is=1<<j; w.mtable[i]+=w.mtable[is]; } bp<<=1; } w.mtable[i].norm(); } return (1<<WINDOW_SIZE); }
int PFC::precomp_for_power(GT& w,BOOL small) { ZZn2 v=w.g; int i,j,k,bp,is,t; if (small) t=MR_ROUNDUP(2*S,WINDOW_SIZE); else t=MR_ROUNDUP(bits(*ord),WINDOW_SIZE); w.etable=new ZZn2[1<<WINDOW_SIZE]; w.etable[0]=1; w.etable[1]=v; w.etbits=t; for (j=0;j<t;j++) v*=v; k=1; for (i=2;i<(1<<WINDOW_SIZE);i++) { if (i==(1<<k)) { k++; w.etable[i]=v; for (j=0;j<t;j++) v*=v; continue; } bp=1; w.etable[i]=1; for (j=0;j<k;j++) { if (i&bp) { is=1<<j; w.etable[i]*=w.etable[is]; } bp<<=1; } } return (1<<WINDOW_SIZE); }
int main() { FILE *fp; int ep,m,a,b,c; epoint *g,*public; char ifname[50],ofname[50]; big a2,a6,q,x,y,v,u1,u2,r,s,hash; miracl instance; miracl *mip=&instance; char mem[MR_BIG_RESERVE(11)]; /* reserve space on the stack for 11 bigs */ char mem1[MR_ECP_RESERVE(2)]; /* and two elliptic curve points */ memset(mem,0,MR_BIG_RESERVE(11)); memset(mem1,0,MR_ECP_RESERVE(2)); /* get public data */ fp=fopen("common2.ecs","rt"); if (fp==NULL) { printf("file common2.ecs does not exist\n"); return 0; } fscanf(fp,"%d\n",&m); mip=mirsys(mip,MR_ROUNDUP(abs(m),4),16); a2=mirvar_mem(mip,mem,0); a6=mirvar_mem(mip,mem,1); q=mirvar_mem(mip,mem,2); x=mirvar_mem(mip,mem,3); y=mirvar_mem(mip,mem,4); v=mirvar_mem(mip,mem,5); u1=mirvar_mem(mip,mem,6); u2=mirvar_mem(mip,mem,7); s=mirvar_mem(mip,mem,8); r=mirvar_mem(mip,mem,9); hash=mirvar_mem(mip,mem,10); innum(mip,a2,fp); innum(mip,a6,fp); innum(mip,q,fp); innum(mip,x,fp); innum(mip,y,fp); fscanf(fp,"%d\n",&a); fscanf(fp,"%d\n",&b); fscanf(fp,"%d\n",&c); fclose(fp); ecurve2_init(mip,m,a,b,c,a2,a6,FALSE,MR_PROJECTIVE); /* initialise curve */ g=epoint_init_mem(mip,mem1,0); epoint2_set(mip,x,y,0,g); /* initialise point of order q */ /* get public key of signer */ fp=fopen("public.ecs","rt"); if (fp==NULL) { printf("file public.ecs does not exist\n"); return 0; } fscanf(fp,"%d",&ep); innum(mip,x,fp); fclose(fp); public=epoint_init_mem(mip,mem1,1);
int main() { FILE *fp; int m,a,b,c; big e,a2,a6,x,y,r,t; epoint *g; ebrick2 binst; char fname[100]; BOOL last; int i,j,len,bptr,nb,window,wsize,words,winsize; miracl *mip=mirsys(50,0); e=mirvar(0); a2=mirvar(0); a6=mirvar(0); x=mirvar(0); y=mirvar(0); r=mirvar(0); t=mirvar(0); printf("Enter name of .ecs file= "); gets(fname); strip(fname); strcat(fname,".ecs"); if ((fp=fopen(fname,"rt"))==NULL) { printf("Unable to open file %s\n",fname); return 0; } fscanf(fp,"%d\n",&m); mip->IOBASE=16; cinnum(a2,fp); cinnum(a6,fp); cinnum(r,fp); cinnum(x,fp); cinnum(y,fp); mip->IOBASE=10; fscanf(fp,"%d\n",&a); fscanf(fp,"%d\n",&b); fscanf(fp,"%d\n",&c); printf("modulus is %d bits in length\n",m); nb=m; printf("Enter window size in bits (1-10)= "); scanf("%d",&window); getchar(); printf("Enter word size of application processor (8, 16, 32 or 64 bit)= "); scanf("%d",&wsize); getchar(); if (wsize!=8 && wsize!=16 && wsize!=32 && wsize!=64 || wsize>MIRACL) { printf("Error - Unsupported word size\n"); exit(0); } if (!ebrick2_init(&binst,x,y,a2,a6,m,a,b,c,window,nb)) { printf("Failed to Initialize\n"); return 0; } len=MR_ROUNDUP(m,MIRACL); words=MR_ROUNDUP(m,wsize); printf("\n--------------------CUT HERE----------------------\n\n"); printf("#define CURVE_M %d\n",m); printf("#define CURVE_A %d\n",a); printf("#define CURVE_B %d\n",b); printf("#define CURVE_C %d\n",c); printf("#define WINDOW %d\n",window); printf("#define WORDS %d\n",words); printf("\nstatic const mr_small rom[]={\n"); bprint(a6->w,len,words,wsize,FALSE); bprint(r->w,len,words,wsize,FALSE); bprint(x->w,len,words,wsize,FALSE); bprint(y->w,len,words,wsize,TRUE); printf("\nstatic const mr_small prom[]={\n"); bptr=0; last=FALSE; winsize=2*(1<<window); for (i=0;i<winsize;i++) { zero(t); t->len=len; for (j=0;j<len;j++) t->w[j]=binst.table[bptr++]; if (i==winsize-1) last=TRUE; bprint(t->w,len,words,wsize,last); } ebrick2_end(&binst); return 0; }