📄 mrcurve.c
字号:
nres_modsub(_MIPP_ b->X,mr_mip->w1,mr_mip->w2);
nres_modmult(_MIPP_ mr_mip->w2,mr_mip->w8,mr_mip->w2);
nres_modsub(_MIPP_ mr_mip->w2,b->Y,b->Y);
copy(mr_mip->w1,b->X);
b->marker=MR_EPOINT_GENERAL;
nres_modmult(_MIPP_ mr_mip->w9,mr_mip->w9,mr_mip->w2); /* m^2 */
nres_modsub(_MIPP_ mr_mip->w2,c->X,mr_mip->w1);
nres_modsub(_MIPP_ mr_mip->w1,d->X,mr_mip->w1);
nres_modsub(_MIPP_ d->X,mr_mip->w1,mr_mip->w2);
nres_modmult(_MIPP_ mr_mip->w2,mr_mip->w9,mr_mip->w2);
nres_modsub(_MIPP_ mr_mip->w2,d->Y,d->Y);
copy(mr_mip->w1,d->X);
d->marker=MR_EPOINT_GENERAL;
*s1=mr_mip->w8;
*s2=mr_mip->w9;
#ifndef MR_AFFINE_ONLY
}
else
{ /* no speed-up */
ecurve_add(_MIPP_ a,b);
copy(mr_mip->w8,mr_mip->w9);
*s1=mr_mip->w9;
*s2=ecurve_add(_MIPP_ c,d);
}
#endif
MR_OUT
}
#ifndef MR_STATIC
void ecurve_multi_add(_MIPD_ int m,epoint **x,epoint**w)
{ /* adds m points together simultaneously, w[i]+=x[i] */
int i,*flag;
big *A,*B,*C;
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return;
MR_IN(122)
#ifndef MR_AFFINE_ONLY
if (mr_mip->coord==MR_AFFINE)
{ /* this can be done faster */
#endif
A=(big *)mr_alloc(_MIPP_ m,sizeof(big));
B=(big *)mr_alloc(_MIPP_ m,sizeof(big));
C=(big *)mr_alloc(_MIPP_ m,sizeof(big));
flag=(int *)mr_alloc(_MIPP_ m,sizeof(int));
convert(_MIPP_ 1,mr_mip->w3);
nres(_MIPP_ mr_mip->w3,mr_mip->w3); /* unity */
for (i=0;i<m;i++)
{
A[i]=mirvar(_MIPP_ 0);
B[i]=mirvar(_MIPP_ 0);
C[i]=mirvar(_MIPP_ 0);
flag[i]=0;
if (compare(x[i]->X,w[i]->X)==0 && compare(x[i]->Y,w[i]->Y)==0)
{ /* doubling */
if (x[i]->marker==MR_EPOINT_INFINITY || size(x[i]->Y)==0)
{
flag[i]=1; /* result is infinity */
copy(mr_mip->w3,B[i]);
continue;
}
nres_modmult(_MIPP_ x[i]->X,x[i]->X,A[i]);
nres_premult(_MIPP_ A[i],3,A[i]); /* 3*x^2 */
if (mr_abs(mr_mip->Asize) == MR_TOOBIG)
nres_modadd(_MIPP_ A[i],mr_mip->A,A[i]);
else
{
convert(_MIPP_ mr_mip->Asize,mr_mip->w2);
nres(_MIPP_ mr_mip->w2,mr_mip->w2);
nres_modadd(_MIPP_ A[i],mr_mip->w2,A[i]);
} /* 3*x^2+A */
nres_premult(_MIPP_ x[i]->Y,2,B[i]);
}
else
{
if (x[i]->marker==MR_EPOINT_INFINITY)
{
flag[i]=2; /* w[i] unchanged */
copy(mr_mip->w3,B[i]);
continue;
}
if (w[i]->marker==MR_EPOINT_INFINITY)
{
flag[i]=3; /* w[i] = x[i] */
copy(mr_mip->w3,B[i]);
continue;
}
nres_modsub(_MIPP_ x[i]->X,w[i]->X,B[i]);
if (size(B[i])==0)
{ /* point at infinity */
flag[i]=1; /* result is infinity */
copy(mr_mip->w3,B[i]);
continue;
}
nres_modsub(_MIPP_ x[i]->Y,w[i]->Y,A[i]);
}
}
nres_multi_inverse(_MIPP_ m,B,C); /* only one inversion needed */
for (i=0;i<m;i++)
{
if (flag[i]==1)
{ /* point at infinity */
epoint_set(_MIPP_ NULL,NULL,0,w[i]);
continue;
}
if (flag[i]==2)
{
continue;
}
if (flag[i]==3)
{
epoint_copy(x[i],w[i]);
continue;
}
nres_modmult(_MIPP_ A[i],C[i],mr_mip->w8);
nres_modmult(_MIPP_ mr_mip->w8,mr_mip->w8,mr_mip->w2); /* m^2 */
nres_modsub(_MIPP_ mr_mip->w2,x[i]->X,mr_mip->w1);
nres_modsub(_MIPP_ mr_mip->w1,w[i]->X,mr_mip->w1);
nres_modsub(_MIPP_ w[i]->X,mr_mip->w1,mr_mip->w2);
nres_modmult(_MIPP_ mr_mip->w2,mr_mip->w8,mr_mip->w2);
nres_modsub(_MIPP_ mr_mip->w2,w[i]->Y,w[i]->Y);
copy(mr_mip->w1,w[i]->X);
w[i]->marker=MR_EPOINT_NORMALIZED;
mr_free(C[i]);
mr_free(B[i]);
mr_free(A[i]);
}
mr_free(flag);
mr_free(C); mr_free(B); mr_free(A);
#ifndef MR_AFFINE_ONLY
}
else
{ /* no speed-up */
for (i=0;i<m;i++) ecurve_add(_MIPP_ x[i],w[i]);
}
#endif
MR_OUT
}
#endif
static void ecurve_double(_MIPD_ epoint *p)
{ /* double epoint on active ecurve */
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return;
if (p->marker==MR_EPOINT_INFINITY)
{ /* 2 times infinity == infinity ! */
return;
}
#ifndef MR_AFFINE_ONLY
if (mr_mip->coord==MR_AFFINE)
{ /* 2 sqrs, 1 mul, 1 div */
#endif
if (size(p->Y)==0)
{ /* set to point at infinity */
epoint_set(_MIPP_ NULL,NULL,0,p);
return;
}
nres_modmult(_MIPP_ p->X,p->X,mr_mip->w8); /* w8=x^2 */
nres_premult(_MIPP_ mr_mip->w8,3,mr_mip->w8); /* w8=3*x^2 */
if (mr_abs(mr_mip->Asize) == MR_TOOBIG)
nres_modadd(_MIPP_ mr_mip->w8,mr_mip->A,mr_mip->w8);
else
{
convert(_MIPP_ mr_mip->Asize,mr_mip->w2);
nres(_MIPP_ mr_mip->w2,mr_mip->w2);
nres_modadd(_MIPP_ mr_mip->w8,mr_mip->w2,mr_mip->w8);
} /* w8=3*x^2+A */
nres_premult(_MIPP_ p->Y,2,mr_mip->w6); /* w6=2y */
if (nres_moddiv(_MIPP_ mr_mip->w8,mr_mip->w6,mr_mip->w8)>1)
{
epoint_set(_MIPP_ NULL,NULL,0,p);
mr_berror(_MIPP_ MR_ERR_COMPOSITE_MODULUS);
return;
}
/* w8 is slope m on exit */
nres_modmult(_MIPP_ mr_mip->w8,mr_mip->w8,mr_mip->w2); /* w2=m^2 */
nres_premult(_MIPP_ p->X,2,mr_mip->w1);
nres_modsub(_MIPP_ mr_mip->w2,mr_mip->w1,mr_mip->w1); /* w1=m^2-2x */
nres_modsub(_MIPP_ p->X,mr_mip->w1,mr_mip->w2);
nres_modmult(_MIPP_ mr_mip->w2,mr_mip->w8,mr_mip->w2);
nres_modsub(_MIPP_ mr_mip->w2,p->Y,p->Y);
copy(mr_mip->w1,p->X);
return;
#ifndef MR_AFFINE_ONLY
}
if (size(p->Y)==0)
{ /* set to point at infinity */
epoint_set(_MIPP_ NULL,NULL,0,p);
return;
}
convert(_MIPP_ 1,mr_mip->w1);
if (mr_abs(mr_mip->Asize) < MR_TOOBIG)
{
if (mr_mip->Asize!=0)
{
if (p->marker==MR_EPOINT_NORMALIZED) nres(_MIPP_ mr_mip->w1,mr_mip->w2);
else nres_modmult(_MIPP_ p->Z,p->Z,mr_mip->w2);
}
if (mr_mip->Asize==(-3))
{ /* a is -3. Goody. 4 sqrs, 4 muls */
nres_modsub(_MIPP_ p->X,mr_mip->w2,mr_mip->w3);
nres_modadd(_MIPP_ p->X,mr_mip->w2,mr_mip->w8);
nres_modmult(_MIPP_ mr_mip->w3,mr_mip->w8,mr_mip->w3);
nres_modadd(_MIPP_ mr_mip->w3,mr_mip->w3,mr_mip->w8);
nres_modadd(_MIPP_ mr_mip->w8,mr_mip->w3,mr_mip->w8);
}
else
{ /* a is small */
if (mr_mip->Asize!=0)
{ /* a is non zero! */
nres_modmult(_MIPP_ mr_mip->w2,mr_mip->w2,mr_mip->w3);
nres_premult(_MIPP_ mr_mip->w3,mr_mip->Asize,mr_mip->w3);
}
nres_modmult(_MIPP_ p->X,p->X,mr_mip->w1);
nres_modadd(_MIPP_ mr_mip->w1,mr_mip->w1,mr_mip->w8);
nres_modadd(_MIPP_ mr_mip->w8,mr_mip->w1,mr_mip->w8);
if (mr_mip->Asize!=0) nres_modadd(_MIPP_ mr_mip->w8,mr_mip->w3,mr_mip->w8);
}
}
else
{ /* a is not special */
if (p->marker==MR_EPOINT_NORMALIZED) nres(_MIPP_ mr_mip->w1,mr_mip->w2);
else nres_modmult(_MIPP_ p->Z,p->Z,mr_mip->w2);
nres_modmult(_MIPP_ mr_mip->w2,mr_mip->w2,mr_mip->w3);
nres_modmult(_MIPP_ mr_mip->w3,mr_mip->A,mr_mip->w3);
nres_modmult(_MIPP_ p->X,p->X,mr_mip->w1);
nres_modadd(_MIPP_ mr_mip->w1,mr_mip->w1,mr_mip->w8);
nres_modadd(_MIPP_ mr_mip->w8,mr_mip->w1,mr_mip->w8);
nres_modadd(_MIPP_ mr_mip->w8,mr_mip->w3,mr_mip->w8);
}
/* w8 contains numerator of slope 3x^2+A.z^4 *
* denominator is now placed in Z */
nres_modadd(_MIPP_ p->Y,p->Y,mr_mip->w2); /* new - w2=2*Y */
if (p->marker==MR_EPOINT_NORMALIZED)
copy(mr_mip->w2,p->Z);
else nres_modmult(_MIPP_ mr_mip->w2,p->Z,p->Z);
nres_modmult(_MIPP_ mr_mip->w2,mr_mip->w2,mr_mip->w2); /* new */
nres_modmult(_MIPP_ p->X,mr_mip->w2,mr_mip->w3);
nres_modadd(_MIPP_ mr_mip->w3,mr_mip->w3,p->X);
nres_modmult(_MIPP_ mr_mip->w8,mr_mip->w8,mr_mip->w1);
nres_modsub(_MIPP_ mr_mip->w1,p->X,p->X);
nres_modmult(_MIPP_ mr_mip->w2,mr_mip->w2,mr_mip->w2);
/* divide by 2 - new */
if (remain(_MIPP_ mr_mip->w2,2)!=0)
mr_padd(_MIPP_ mr_mip->w2,mr_mip->modulus,mr_mip->w2);
subdiv(_MIPP_ mr_mip->w2,2,mr_mip->w2);
nres_modsub(_MIPP_ mr_mip->w3,p->X,mr_mip->w3);
nres_modmult(_MIPP_ mr_mip->w3,mr_mip->w8,mr_mip->w3);
nres_modsub(_MIPP_ mr_mip->w3,mr_mip->w2,p->Y);
p->marker=MR_EPOINT_GENERAL;
return;
#endif
}
static BOOL ecurve_padd(_MIPD_ epoint *p,epoint *pa)
{ /* primitive add two epoints on the active ecurve - pa+=p; *
* note that if p is normalized, its Z coordinate isn't used */
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
#ifndef MR_AFFINE_ONLY
if (mr_mip->coord==MR_AFFINE)
{ /* 1 sqr, 1 mul, 1 div */
#endif
nres_modsub(_MIPP_ p->Y,pa->Y,mr_mip->w8);
nres_modsub(_MIPP_ p->X,pa->X,mr_mip->w6);
if (size(mr_mip->w6)==0)
{ /* divide by 0 */
if (size(mr_mip->w8)==0)
{ /* should have doubled ! */
return FALSE;
}
else
{ /* point at infinity */
epoint_set(_MIPP_ NULL,NULL,0,pa);
return TRUE;
}
}
if (nres_moddiv(_MIPP_ mr_mip->w8,mr_mip->w6,mr_mip->w8)>1)
{
epoint_set(_MIPP_ NULL,NULL,0,pa);
mr_berror(_MIPP_ MR_ERR_COMPOSITE_MODULUS);
return TRUE;
}
nres_modmult(_MIPP_ mr_mip->w8,mr_mip->w8,mr_mip->w2); /* w2=m^2 */
nres_modsub(_MIPP_ mr_mip->w2,p->X,mr_mip->w1); /* w1=m^2-x1-x2 */
nres_modsub(_MIPP_ mr_mip->w1,pa->X,mr_mip->w1);
nres_modsub(_MIPP_ pa->X,mr_mip->w1,mr_mip->w2);
nres_modmult(_MIPP_ mr_mip->w2,mr_mip->w8,mr_mip->w2);
nres_modsub(_MIPP_ mr_mip->w2,pa->Y,pa->Y);
copy(mr_mip->w1,pa->X);
pa->marker=MR_EPOINT_NORMALIZED;
return TRUE;
#ifndef MR_AFFINE_ONLY
}
if (p->marker!=MR_EPOINT_NORMALIZED)
{
nres_modmult(_MIPP_ p->Z,p->Z,mr_mip->w6);
nres_modmult(_MIPP_ pa->X,mr_mip->w6,mr_mip->w1);
nres_modmult(_MIPP_ mr_mip->w6,p->Z,mr_mip->w6);
nres_modmult(_MIPP_ pa->Y,mr_mip->w6,mr_mip->w8);
}
else
{
copy(pa->X,mr_mip->w1);
copy(pa->Y,mr_mip->w8);
}
if (pa->marker==MR_EPOINT_NORMALIZED)
{
convert(_MIPP_ 1,mr_mip->w6);
nres(_MIPP_ mr_mip->w6,mr_mip->w6);
}
else nres_modmult(_MIPP_ pa->Z,pa->Z,mr_mip->w6);
nres_modmult(_MIPP_ p->X,mr_mip->w6,mr_mip->w4);
if (pa->marker!=MR_EPOINT_NORMALIZED)
nres_modmult(_MIPP_ mr_mip->w6,pa->Z,mr_mip->w6);
nres_modmult(_MIPP_ p->Y,mr_mip->w6,mr_mip->w5);
nres_modsub(_MIPP_ mr_mip->w1,mr_mip->w4,mr_mip->w1);
nres_modsub(_MIPP_ mr_mip->w8,mr_mip->w5,mr_mip->w8);
/* w8 contains the numerator of the slope */
if (size(mr_mip->w1)==0)
{
if (size(mr_mip->w8)==0)
{ /* should have doubled ! */
return FALSE;
}
else
{ /* point at infinity */
epoint_set(_MIPP_ NULL,NULL,0,pa);
return TRUE;
}
}
nres_modadd(_MIPP_ mr_mip->w4,mr_mip->w4,mr_mip->w6);
nres_modadd(_MIPP_ mr_mip->w1,mr_mip->w6,mr_mip->w4);
nres_modadd(_MIPP_ mr_mip->w5,mr_mip->w5,mr_mip->w6);
nres_modadd(_MIPP_ mr_mip->w8,mr_mip->w6,mr_mip->w5);
if (p->marker!=MR_EPOINT_NORMALIZED)
{
if (pa->marker!=MR_EPOINT_NORMALIZED)
nres_modmult(_MIPP_ pa->Z,p->Z,mr_mip->w3);
else
copy(p->Z,mr_mip->w3);
nres_modmult(_MIPP_ mr_mip->w3,mr_mip->w1,pa->Z);
}
else
{
if (pa->marker!=MR_EPOINT_NORMALIZED)
nres_modmult(_MIPP_ pa->Z,mr_mip->w1,pa->Z);
else
copy(mr_mip->w1,pa->Z);
}
nres_modmult(_MIPP_ mr_mip->w1,mr_mip->w1,mr_mip->w6);
nres_modmult(_MIPP_ mr_mip->w1,mr_mip->w6,mr_mip->w1);
nres_modmult(_MIPP_ mr_mip->w6,mr_mip->w4,mr_mip->w6);
nres_modmult(_MIPP_ mr_mip->w8,mr_mip->w8,mr_mip->w4);
nres_modsub(_MIPP_ mr_mip->w4,mr_mip->w6,pa->X);
nres_modsub(_MIPP_ mr_mip->w6,pa->X,mr_mip->w6);
nres_modsub(_MIPP_ mr_mip->w6,pa->X,mr_mip->w6);
nres_modmult(_MIPP_ mr_mip->w8,mr_mip->w6,mr_mip->w2);
nres_modmult(_MIPP_ mr_mip->w1,mr_mip->w5,mr_mip->w1);
nres_modsub(_MIPP_ mr_mip->w2,mr_mip->w1,mr_mip->w5);
/* divide by 2 */
if (remain(_MIPP_ mr_mip->w5,2)!=0)
mr_padd(_MIPP_ mr_mip->w5,mr_mip->modulus,mr_mip->w5);
subdiv(_MIPP_ mr_mip->w5,2,mr_mip->w5);
copy(mr_mip->w5,pa->Y);
pa->marker=MR_EPOINT_GENERAL;
return TRUE;
#endif
}
void epoint_copy(epoint *a,epoint *b)
{
if (a==b || b==NULL) return;
copy(a->X,b->X);
copy(a->Y,b->Y);
#ifndef MR_AFFINE_ONLY
if (a->marker==MR_EPOINT_GENERAL) copy(a->Z,b->Z);
#endif
b->marker=a->marker;
return;
}
BOOL epoint_comp(_MIPD_ epoint *a,epoint *b)
{
BOOL result;
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return FALSE;
if (a==b) return TRUE;
if (a->marker==MR_EPOINT_INFINITY)
{
if (b->marker==MR_EPOINT_INFINITY) return TRUE;
else return FALSE;
}
if (b->marker==MR_EPOINT_INFINITY)
return FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -