📄 mrec2m.c
字号:
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
#ifndef MR_AFFINE_ONLY
if (mr_mip->coord==MR_AFFINE)
{
#endif
add2(p->Y,pa->Y,mr_mip->w8);
add2(p->X,pa->X,mr_mip->w6);
if (size(mr_mip->w6)==0)
{ /* divide by zero */
if (size(mr_mip->w8)==0)
{ /* should have doubled! */
return FALSE;
}
else
{ /* point at infinity */
epoint2_set(_MIPP_ NULL,NULL,0,pa);
return TRUE;
}
}
inverse2(_MIPP_ mr_mip->w6,mr_mip->w5);
modmult2(_MIPP_ mr_mip->w8,mr_mip->w5,mr_mip->w8); /* w8=m */
modsquare2(_MIPP_ mr_mip->w8,mr_mip->w5); /* m^2 */
#ifndef MR_NO_SS
if (mr_mip->SS)
{
add2(pa->X,p->X,pa->X);
add2(pa->X,mr_mip->w5,pa->X);
add2(pa->X,p->X,pa->Y);
modmult2(_MIPP_ pa->Y,mr_mip->w8,pa->Y);
add2(pa->Y,p->Y,pa->Y);
incr2(pa->Y,1,pa->Y);
}
else
{
#endif
add2(mr_mip->w5,mr_mip->w8,mr_mip->w5);
add2(mr_mip->w5,mr_mip->w6,mr_mip->w5);
if (mr_mip->Asize==MR_TOOBIG)
add2(mr_mip->w5,mr_mip->A,mr_mip->w5);
else
incr2(mr_mip->w5,mr_mip->Asize,mr_mip->w5); /* w5=x3 */
add2(pa->X,mr_mip->w5,mr_mip->w6);
modmult2(_MIPP_ mr_mip->w6,mr_mip->w8,mr_mip->w6);
copy(mr_mip->w5,pa->X);
add2(mr_mip->w6,mr_mip->w5,mr_mip->w6);
add2(pa->Y,mr_mip->w6,pa->Y);
#ifndef MR_NO_SS
}
#endif
pa->marker=MR_EPOINT_NORMALIZED;
return TRUE;
#ifndef MR_AFFINE_ONLY
}
#ifndef MR_NO_SS
if (mr_mip->SS)
{ /* pa+=p */
if (p->marker!=MR_EPOINT_NORMALIZED)
{
modmult2(_MIPP_ pa->Y,p->Z,mr_mip->w4); /* w4=y1.z2 */
modmult2(_MIPP_ pa->X,p->Z,mr_mip->w1); /* w1=x1.z2 */
if (pa->marker==MR_EPOINT_NORMALIZED) copy(p->Z,mr_mip->w2);
else modmult2(_MIPP_ pa->Z,p->Z,mr_mip->w2); /* w2=z1.z2 */
}
else
{
if (pa->marker==MR_EPOINT_NORMALIZED) convert(_MIPP_ 1,mr_mip->w2);
else copy(pa->Z,mr_mip->w2);
copy(pa->Y,mr_mip->w4);
copy(pa->X,mr_mip->w1);
}
if (pa->marker!=MR_EPOINT_NORMALIZED)
{
modmult2(_MIPP_ p->Y,pa->Z,mr_mip->w8); /* w8=y2.z1 */
modmult2(_MIPP_ p->X,pa->Z,mr_mip->w5); /* w5=x2.z1 */
}
else
{
copy(p->Y,mr_mip->w8);
copy(p->X,mr_mip->w5);
}
add2(mr_mip->w4,mr_mip->w8,mr_mip->w8); /* A=y2.z1+y1.z2 */
add2(mr_mip->w1,mr_mip->w5,mr_mip->w1); /* B=x2.z1+x1.z2 */
if (size(mr_mip->w8)==0)
{
if (size(mr_mip->w1)==0)
{ /* should have doubled! */
return FALSE;
}
else
{ /* point at infinity */
epoint2_set(_MIPP_ NULL,NULL,0,pa);
return TRUE;
}
}
modsquare2(_MIPP_ mr_mip->w1,pa->X); /* X=B^2 */
modmult2(_MIPP_ pa->X,mr_mip->w1,pa->Z); /* Z=B^3 */
modmult2(_MIPP_ pa->X,mr_mip->w5,pa->Y); /* Y=x2.z1.B^2 */
modsquare2(_MIPP_ mr_mip->w8,mr_mip->w3); /* w3=A^2 */
modmult2(_MIPP_ mr_mip->w3,mr_mip->w2,mr_mip->w5); /* w5=A^2.z1.z2 */
add2(pa->Y,mr_mip->w5,pa->Y); /* Y=x2.z1.B^2 + A^2.z1.z2 */
modmult2(_MIPP_ pa->Y,mr_mip->w8,pa->Y); /* Y=A.Y */
modsquare2(_MIPP_ pa->X,pa->X); /* X=B^4 */
modmult2(_MIPP_ mr_mip->w1,mr_mip->w5,mr_mip->w8); /* w8=B*w5 */
add2(pa->X,mr_mip->w8,pa->X); /* X finished */
modmult2(_MIPP_ mr_mip->w4,pa->Z,mr_mip->w1); /* B^3.y1.z2 */
add2(pa->Y,mr_mip->w1,pa->Y);
modmult2(_MIPP_ pa->Z,mr_mip->w2,pa->Z);
add2(pa->Y,pa->Z,pa->Y);
pa->marker=MR_EPOINT_GENERAL;
return TRUE;
}
#endif
if (p->marker!=MR_EPOINT_NORMALIZED)
{
if (pa->marker!=MR_EPOINT_NORMALIZED)
modmult2(_MIPP_ p->X,pa->Z,mr_mip->w1); /* A1=x1.z2 =w1 */
else
copy(p->X,mr_mip->w1);
modmult2(_MIPP_ pa->X,p->Z,pa->X); /* A2=x2.z1 =X3 */
add2(mr_mip->w1,pa->X,mr_mip->w2); /* C= A1+A2 =w2 */
modsquare2(_MIPP_ mr_mip->w1,mr_mip->w3); /* B1=A1*A1 =w3 */
modsquare2(_MIPP_ pa->X,mr_mip->w4); /* B2=A2*A2 =w4 */
add2(mr_mip->w3,mr_mip->w4,mr_mip->w5); /* D=B1+B2 =w5 */
if (pa->marker!=MR_EPOINT_NORMALIZED)
{
modsquare2(_MIPP_ pa->Z,mr_mip->w6);
modmult2(_MIPP_ mr_mip->w6,p->Y,mr_mip->w6); /* E1=y1.z2^2 = w6 */
}
else
copy(p->Y,mr_mip->w6);
modsquare2(_MIPP_ p->Z,mr_mip->w8);
modmult2(_MIPP_ mr_mip->w8,pa->Y,mr_mip->w8); /* E2=y2.z1^2 = w8 */
add2(mr_mip->w3,mr_mip->w6,mr_mip->w3); /* E1+B1 = w3 */
add2(mr_mip->w4,mr_mip->w8,mr_mip->w4); /* E2+B2 = w4 */
add2(mr_mip->w8,mr_mip->w6,mr_mip->w8); /* F=E1+E2 */
if (size(mr_mip->w2)==0)
{
if (size(mr_mip->w8)==0)
{ /* should have doubled */
return FALSE;
}
else
{
epoint2_set(_MIPP_ NULL,NULL,0,pa);
return TRUE;
}
}
modmult2(_MIPP_ mr_mip->w8,mr_mip->w2,mr_mip->w8); /* G=CF */
if (pa->marker!=MR_EPOINT_NORMALIZED)
modmult2(_MIPP_ pa->Z,p->Z,pa->Z);
else
copy(p->Z,pa->Z);
modmult2(_MIPP_ pa->Z,mr_mip->w5,pa->Z); /* Z3=z1.z2.D */
modmult2(_MIPP_ mr_mip->w1,mr_mip->w4,mr_mip->w2);
modmult2(_MIPP_ pa->X,mr_mip->w3,pa->X);
add2(pa->X,mr_mip->w2,pa->X); /* x3 = A1(E2+B2)+A2(E1+B1) */
modmult2(_MIPP_ mr_mip->w1,mr_mip->w8,mr_mip->w1); /* A1*G */
modmult2(_MIPP_ mr_mip->w6,mr_mip->w5,mr_mip->w6); /* E1*D */
add2(mr_mip->w1,mr_mip->w6,pa->Y);
modmult2(_MIPP_ pa->Y,mr_mip->w5,pa->Y);
add2(mr_mip->w8,pa->Z,mr_mip->w8);
modmult2(_MIPP_ mr_mip->w8,pa->X,mr_mip->w8);
add2(pa->Y,mr_mip->w8,pa->Y);
}
else
{
if (pa->marker!=MR_EPOINT_NORMALIZED)
{
modsquare2(_MIPP_ pa->Z,mr_mip->w1);
modmult2(_MIPP_ mr_mip->w1,p->Y,mr_mip->w1);
add2(mr_mip->w1,pa->Y,mr_mip->w1); /* U=z2^2.y1 + y2 */
modmult2(_MIPP_ pa->Z,p->X,mr_mip->w2);
add2(mr_mip->w2,pa->X,mr_mip->w2); /* S=z2x1+x2 */
}
else
{
add2(p->Y,pa->Y,mr_mip->w1);
add2(p->X,pa->X,mr_mip->w2);
}
if (size(mr_mip->w2)==0)
{
if (size(mr_mip->w1)==0)
{ /* should have doubled! */
return FALSE;
}
else
{
epoint2_set(_MIPP_ NULL,NULL,0,pa);
return TRUE;
}
}
if (pa->marker!=MR_EPOINT_NORMALIZED)
modmult2(_MIPP_ pa->Z,mr_mip->w2,mr_mip->w3); /* T=z2.S */
else
copy(mr_mip->w2,mr_mip->w3);
modsquare2(_MIPP_ mr_mip->w3,pa->Z); /* z3=T^2 */
modmult2(_MIPP_ pa->Z,p->X,mr_mip->w4); /* V=z3.x1 */
add2(p->X,p->Y,mr_mip->w5); /* C=x1+y1 */
modsquare2(_MIPP_ mr_mip->w1,pa->X);
modsquare2(_MIPP_ mr_mip->w2,mr_mip->w2); /* S^2 */
add2(mr_mip->w2,mr_mip->w1,mr_mip->w2);
if (mr_mip->Asize>0) /* T(U+S^2+BT) */
{
if (mr_mip->Asize>1)
{
if (mr_mip->Asize==MR_TOOBIG)
copy(mr_mip->A,mr_mip->w6);
else
convert(_MIPP_ mr_mip->Asize,mr_mip->w6);
modmult2(_MIPP_ mr_mip->w6,mr_mip->w3,mr_mip->w6);
add2(mr_mip->w2,mr_mip->w6,mr_mip->w2);
}
else
add2(mr_mip->w2,mr_mip->w3,mr_mip->w2);
}
modmult2(_MIPP_ mr_mip->w2,mr_mip->w3,mr_mip->w2);
add2(pa->X,mr_mip->w2,pa->X);
add2(mr_mip->w4,pa->X,mr_mip->w4); /* V+X */
modmult2(_MIPP_ mr_mip->w3,mr_mip->w1,mr_mip->w3); /* T*U */
add2(pa->Z,mr_mip->w3,pa->Y); /* Z3+T*U */
modmult2(_MIPP_ pa->Y,mr_mip->w4,pa->Y);
modsquare2(_MIPP_ pa->Z,mr_mip->w1);
modmult2(_MIPP_ mr_mip->w1,mr_mip->w5,mr_mip->w1); /*z3^2.C */
add2(pa->Y,mr_mip->w1,pa->Y);
}
pa->marker=MR_EPOINT_GENERAL;
return TRUE;
#endif
}
void epoint2_copy(epoint *a,epoint *b)
{
if (a==b) 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 epoint2_comp(_MIPD_ epoint *a,epoint *b)
{
int ia,ib;
#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;
MR_IN(128)
ia=epoint2_get(_MIPP_ a,mr_mip->w9,mr_mip->w9);
ib=epoint2_get(_MIPP_ b,mr_mip->w10,mr_mip->w10);
MR_OUT
if (ia==ib && mr_compare(mr_mip->w9,mr_mip->w10)==0) return TRUE;
return FALSE;
}
big ecurve2_add(_MIPD_ epoint *p,epoint *pa)
{ /* pa=pa+p; */
/* An ephemeral pointer to the line slope is returned *
* only if curve is super-singular */
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return NULL;
MR_IN(129)
if (p==pa)
{
ecurve2_double(_MIPP_ pa);
MR_OUT
return mr_mip->w8;
}
if (pa->marker==MR_EPOINT_INFINITY)
{
epoint2_copy(p,pa);
MR_OUT
return NULL;
}
if (p->marker==MR_EPOINT_INFINITY)
{
MR_OUT
return NULL;
}
if (!ecurve2_padd(_MIPP_ p,pa)) ecurve2_double(_MIPP_ pa);
MR_OUT
return mr_mip->w8;
}
void epoint2_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(130)
#ifndef MR_AFFINE_ONLY
if (p->marker==MR_EPOINT_GENERAL)
{
#ifndef MR_NO_SS
if (mr_mip->SS)
{
add2(p->Y,p->Z,p->Y);
}
else
{
#endif
modmult2(_MIPP_ p->X,p->Z,mr_mip->w1);
add2(p->Y,mr_mip->w1,p->Y);
#ifndef MR_NO_SS
}
#endif
}
else
{
#endif
#ifndef MR_NO_SS
if (mr_mip->SS) incr2(p->Y,1,p->Y);
else
#endif
add2(p->Y,p->X,p->Y);
#ifndef MR_AFFINE_ONLY
}
#endif
MR_OUT
}
big ecurve2_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(131)
if (p==pa)
{
epoint2_set(_MIPP_ NULL,NULL,0,pa);
MR_OUT
return NULL;
}
if (p->marker==MR_EPOINT_INFINITY)
{
MR_OUT
return NULL;
}
epoint2_negate(_MIPP_ p);
r=ecurve2_add(_MIPP_ p,pa);
epoint2_negate(_MIPP_ p);
MR_OUT
return r;
}
#ifndef MR_NO_ECC_MULTIADD
#ifndef MR_STATIC
void ecurve2_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;
char *mem;
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return;
MR_IN(132)
#ifndef MR_NO_SS
if (mr_mip->SS)
{
for (i=0;i<m;i++) ecurve2_add(_MIPP_ x[i],w[i]);
MR_OUT
return;
}
#endif
#ifndef MR_AFFINE_ONLY
if (mr_mip->coord==MR_AFFINE)
{
#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); /* unity */
mem=memalloc(_MIPP_ 3*m);
for (i=0;i<m;i++)
{
A[i]=mirvar_mem(_MIPP_ mem,3*i);
B[i]=mirvar_mem(_MIPP_ mem,3*i+1);
C[i]=mirvar_mem(_MIPP_ mem,3*i+2);
flag[i]=0;
if (mr_compare(x[i]->X,w[i]->X)==0 && mr_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;
}
modsquare2(_MIPP_ x[i]->X,A[i]);
add2(A[i],x[i]->Y,A[i]);
copy(x[i]->X,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;
}
add2(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;
}
add2(x[i]->Y,w[i]->Y,A[i]);
}
}
multi_inverse2(_MIPP_ m,B,C); /* one inversion only */
for (i=0;i<m;i++)
{
if (flag[i]==1)
{ /* point at infinity */
epoint2_set(_MIPP_ NULL,NULL,0,w[i]);
continue;
}
if (flag[i]==2)
{
continue;
}
if (flag[i]==3)
{
epoint2_copy(x[i],w[i]);
continue;
}
modmult2(_MIPP_ A[i],C[i],mr_mip->w8);
modsquare2(_MIPP_ mr_mip->w8,mr_mip->w6); /* m^2 */
add2(mr_mip->w6,mr_mip->w8,mr_mip->w6);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -