📄 mrcurve.c
字号:
#ifndef MR_AFFINE_ONLY
if (mr_mip->coord==MR_AFFINE)
{
#endif
if (compare(a->X,b->X)==0 && compare(a->Y,b->Y)==0) result=TRUE;
else result=FALSE;
return result;
#ifndef MR_AFFINE_ONLY
}
if (mr_mip->coord==MR_PROJECTIVE)
{
MR_IN(105)
if (a->marker!=MR_EPOINT_GENERAL)
{
convert(_MIPP_ 1,mr_mip->w1);
nres(_MIPP_ mr_mip->w1,mr_mip->w1);
}
else copy(a->Z,mr_mip->w1);
if (b->marker!=MR_EPOINT_GENERAL)
{
convert(_MIPP_ 1,mr_mip->w2);
nres(_MIPP_ mr_mip->w2,mr_mip->w2);
}
else copy(b->Z,mr_mip->w2);
nres_modmult(_MIPP_ mr_mip->w1,mr_mip->w1,mr_mip->w3); /* Za*Za */
nres_modmult(_MIPP_ mr_mip->w2,mr_mip->w2,mr_mip->w4); /* Zb*Zb */
nres_modmult(_MIPP_ a->X,mr_mip->w4,mr_mip->w5); /* Xa*Zb*Zb */
nres_modmult(_MIPP_ b->X,mr_mip->w3,mr_mip->w6); /* Xb*Za*Za */
if (compare(mr_mip->w5,mr_mip->w6)!=0) result=FALSE;
else
{
nres_modmult(_MIPP_ mr_mip->w1,mr_mip->w3,mr_mip->w3);
nres_modmult(_MIPP_ mr_mip->w2,mr_mip->w4,mr_mip->w4);
nres_modmult(_MIPP_ a->Y,mr_mip->w4,mr_mip->w5);
nres_modmult(_MIPP_ b->Y,mr_mip->w3,mr_mip->w6);
if (compare(mr_mip->w5,mr_mip->w6)!=0) result=FALSE;
else result=TRUE;
}
MR_OUT
return result;
}
return FALSE;
#endif
}
big ecurve_add(_MIPD_ epoint *p,epoint *pa)
{ /* pa=pa+p; */
/* An ephemeral pointer to the line slope is returned */
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return NULL;
MR_IN(94)
if (p==pa)
{
ecurve_double(_MIPP_ pa);
MR_OUT
if (pa->marker==MR_EPOINT_INFINITY) return NULL;
return mr_mip->w8;
}
if (pa->marker==MR_EPOINT_INFINITY)
{
epoint_copy(p,pa);
MR_OUT
return NULL;
}
if (p->marker==MR_EPOINT_INFINITY)
{
MR_OUT
return NULL;
}
if (!ecurve_padd(_MIPP_ p,pa)) ecurve_double(_MIPP_ pa);
MR_OUT
if (pa->marker==MR_EPOINT_INFINITY) return NULL;
return mr_mip->w8;
}
void epoint_negate(_MIPD_ epoint *p)
{ /* negate a point */
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return;
if (p->marker==MR_EPOINT_INFINITY) return;
MR_IN(121)
if (size(p->Y)!=0) mr_psub(_MIPP_ mr_mip->modulus,p->Y,p->Y);
MR_OUT
}
big ecurve_sub(_MIPD_ epoint *p,epoint *pa)
{
big r;
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return NULL;
MR_IN(104)
if (p==pa)
{
epoint_set(_MIPP_ NULL,NULL,0,pa);
MR_OUT
return NULL;
}
if (p->marker==MR_EPOINT_INFINITY)
{
MR_OUT
return NULL;
}
epoint_negate(_MIPP_ p);
r=ecurve_add(_MIPP_ p,pa);
epoint_negate(_MIPP_ p);
MR_OUT
return r;
}
void ecurve_mult(_MIPD_ big e,epoint *pa,epoint *pt)
{ /* pt=e*pa; */
int i,j,n,nb,nbs,nzs;
epoint *p;
epoint *table[11];
#ifdef MR_STATIC
char mem[MR_ECP_RESERVE(12)];
#else
char *mem;
#endif
#ifndef MR_ALWAYS_BINARY
int ce,ch;
#endif
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return;
MR_IN(95)
if (size(e)==0)
{ /* multiplied by 0 */
epoint_set(_MIPP_ NULL,NULL,0,pt);
MR_OUT
return;
}
copy(e,mr_mip->w9);
epoint_norm(_MIPP_ pa);
epoint_copy(pa,pt);
if (size(mr_mip->w9)<0)
{ /* pt = -pt */
negify(mr_mip->w9,mr_mip->w9);
epoint_negate(_MIPP_ pt);
}
if (size(mr_mip->w9)==1)
{
MR_OUT
return;
}
premult(_MIPP_ mr_mip->w9,3,mr_mip->w10); /* h=3*e */
#ifndef MR_ALWAYS_BINARY
if (mr_mip->base==mr_mip->base2)
{
#endif
#ifdef MR_STATIC
memset(mem,0,MR_ECP_RESERVE(12));
#else
mem=ecp_memalloc(_MIPP_ 12);
#endif
p=epoint_init_mem(_MIPP_ mem,0);
epoint_copy(pt,p);
table[0]=epoint_init_mem(_MIPP_ mem,1);
epoint_copy(p,table[0]);
ecurve_double(_MIPP_ p);
for (i=1;i<=10;i++)
{ /* precomputation */
table[i]=epoint_init_mem(_MIPP_ mem,i+1);
epoint_copy(table[i-1],table[i]);
ecurve_add(_MIPP_ p,table[i]);
}
/* note that normalising this table doesn't really help */
nb=logb2(_MIPP_ mr_mip->w10);
for (i=nb-2;i>=1;)
{ /* add/subtract */
if (mr_mip->user!=NULL) (*mr_mip->user)();
n=mr_naf_window(_MIPP_ mr_mip->w9,mr_mip->w10,i,&nbs,&nzs);
for (j=0;j<nbs;j++)
ecurve_double(_MIPP_ pt);
if (n>0) ecurve_add(_MIPP_ table[n/2],pt);
if (n<0) ecurve_sub(_MIPP_ table[(-n)/2],pt);
i-=nbs;
if (nzs)
{
for (j=0;j<nzs;j++) ecurve_double(_MIPP_ pt);
i-=nzs;
}
}
ecp_memkill(_MIPP_ mem,12);
#ifndef MR_ALWAYS_BINARY
}
else
{
mem=ecp_memalloc(_MIPP_ 1);
p=epoint_init_mem(_MIPP_ mem,0);
epoint_copy(pt,p);
expb2(_MIPP_ logb2(_MIPP_ mr_mip->w10)-1,mr_mip->w11);
mr_psub(_MIPP_ mr_mip->w10,mr_mip->w11,mr_mip->w10);
subdiv(_MIPP_ mr_mip->w11,2,mr_mip->w11);
while (size(mr_mip->w11) > 1)
{ /* add/subtract method */
if (mr_mip->user!=NULL) (*mr_mip->user)();
ecurve_double(_MIPP_ pt);
ce=compare(mr_mip->w9,mr_mip->w11); /* e(i)=1? */
ch=compare(mr_mip->w10,mr_mip->w11); /* h(i)=1? */
if (ch>=0)
{ /* h(i)=1 */
if (ce<0) ecurve_add(_MIPP_ p,pt);
mr_psub(_MIPP_ mr_mip->w10,mr_mip->w11,mr_mip->w10);
}
if (ce>=0)
{ /* e(i)=1 */
if (ch<0) ecurve_sub(_MIPP_ p,pt);
mr_psub(_MIPP_ mr_mip->w9,mr_mip->w11,mr_mip->w9);
}
subdiv(_MIPP_ mr_mip->w11,2,mr_mip->w11);
}
ecp_memkill(_MIPP_ mem,1);
}
#endif
MR_OUT
}
#ifndef MR_STATIC
void ecurve_multn(_MIPD_ int n,big *y,epoint **x,epoint *w)
{ /* pt=e[o]*p[0]+e[1]*p[1]+ .... e[n-1]*p[n-1] */
int i,j,k,m,nb,ea;
epoint **G;
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return;
MR_IN(114)
m=1<<n;
G=(epoint **)mr_alloc(_MIPP_ m,sizeof(epoint*));
for (i=0,k=1;i<n;i++)
{
for (j=0; j < (1<<i) ;j++)
{
G[k]=epoint_init(_MIPPO_ );
epoint_copy(x[i],G[k]);
if (j!=0) ecurve_add(_MIPP_ G[j],G[k]);
k++;
}
}
nb=0;
for (j=0;j<n;j++) if ((k=logb2(_MIPP_ y[j])) > nb) nb=k;
epoint_set(_MIPP_ NULL,NULL,0,w); /* w=0 */
#ifndef MR_ALWAYS_BINARY
if (mr_mip->base==mr_mip->base2)
{
#endif
for (i=nb-1;i>=0;i--)
{
if (mr_mip->user!=NULL) (*mr_mip->user)();
ea=0;
k=1;
for (j=0;j<n;j++)
{
if (mr_testbit(_MIPP_ y[j],i)) ea+=k;
k<<=1;
}
ecurve_double(_MIPP_ w);
if (ea!=0) ecurve_add(_MIPP_ G[ea],w);
}
#ifndef MR_ALWAYS_BINARY
}
else mr_berror(_MIPP_ MR_ERR_NOT_SUPPORTED);
#endif
for (i=1;i<m;i++) epoint_free(G[i]);
mr_free(G);
MR_OUT
}
#endif
void ecurve_mult2(_MIPD_ big e,epoint *p,big ea,epoint *pa,epoint *pt)
{ /* pt=e*p+ea*pa; */
int e1,h1,e2,h2;
epoint *p1,*p2,*ps,*pd;
#ifdef MR_STATIC
char mem[MR_ECP_RESERVE(4)];
#else
char *mem;
#endif
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return;
MR_IN(103)
if (size(e)==0)
{
ecurve_mult(_MIPP_ ea,pa,pt);
MR_OUT
return;
}
#ifdef MR_STATIC
memset(mem,0,MR_ECP_RESERVE(4));
#else
mem=ecp_memalloc(_MIPP_ 4);
#endif
p2=epoint_init_mem(_MIPP_ mem,0);
p1=epoint_init_mem(_MIPP_ mem,1);
ps=epoint_init_mem(_MIPP_ mem,2);
pd=epoint_init_mem(_MIPP_ mem,3);
epoint_norm(_MIPP_ pa);
epoint_copy(pa,p2);
copy(ea,mr_mip->w9);
if (size(mr_mip->w9)<0)
{ /* p2 = -p2 */
negify(mr_mip->w9,mr_mip->w9);
epoint_negate(_MIPP_ p2);
}
premult(_MIPP_ mr_mip->w9,3,mr_mip->w10); /* 3*ea */
epoint_norm(_MIPP_ p);
epoint_copy(p,p1);
copy(e,mr_mip->w12);
if (size(mr_mip->w12)<0)
{ /* p1= -p1 */
negify(mr_mip->w12,mr_mip->w12);
epoint_negate(_MIPP_ p1);
}
premult(_MIPP_ mr_mip->w12,3,mr_mip->w13); /* 3*e */
epoint_set(_MIPP_ NULL,NULL,0,pt); /* pt=0 */
if (compare(mr_mip->w10,mr_mip->w13)>=0)
expb2(_MIPP_ logb2(_MIPP_ mr_mip->w10)-1,mr_mip->w11);
else expb2(_MIPP_ logb2(_MIPP_ mr_mip->w13)-1,mr_mip->w11);
epoint_copy(p1,ps);
ecurve_add(_MIPP_ p2,ps); /* ps=p1+p2 */
epoint_copy(p1,pd);
ecurve_sub(_MIPP_ p2,pd); /* pd=p1-p2 */
epoint_norm(_MIPP_ ps);
epoint_norm(_MIPP_ pd);
while (size(mr_mip->w11) > 1)
{ /* add/subtract method */
if (mr_mip->user!=NULL) (*mr_mip->user)();
ecurve_double(_MIPP_ pt);
e1=h1=e2=h2=0;
if (compare(mr_mip->w9,mr_mip->w11)>=0)
{ /* e1(i)=1? */
e2=1;
mr_psub(_MIPP_ mr_mip->w9,mr_mip->w11,mr_mip->w9);
}
if (compare(mr_mip->w10,mr_mip->w11)>=0)
{ /* h1(i)=1? */
h2=1;
mr_psub(_MIPP_ mr_mip->w10,mr_mip->w11,mr_mip->w10);
}
if (compare(mr_mip->w12,mr_mip->w11)>=0)
{ /* e2(i)=1? */
e1=1;
mr_psub(_MIPP_ mr_mip->w12,mr_mip->w11,mr_mip->w12);
}
if (compare(mr_mip->w13,mr_mip->w11)>=0)
{ /* h2(i)=1? */
h1=1;
mr_psub(_MIPP_ mr_mip->w13,mr_mip->w11,mr_mip->w13);
}
if (e1!=h1)
{
if (e2==h2)
{
if (h1==1) ecurve_add(_MIPP_ p1,pt);
else ecurve_sub(_MIPP_ p1,pt);
}
else
{
if (h1==1)
{
if (h2==1) ecurve_add(_MIPP_ ps,pt);
else ecurve_add(_MIPP_ pd,pt);
}
else
{
if (h2==1) ecurve_sub(_MIPP_ pd,pt);
else ecurve_sub(_MIPP_ ps,pt);
}
}
}
else if (e2!=h2)
{
if (h2==1) ecurve_add(_MIPP_ p2,pt);
else ecurve_sub(_MIPP_ p2,pt);
}
subdiv(_MIPP_ mr_mip->w11,2,mr_mip->w11);
}
ecp_memkill(_MIPP_ mem,4);
MR_OUT
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -