⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mrecgf2m.c

📁 大数运算库
💻 C
📖 第 1 页 / 共 5 页
字号:
            modmult2(_MIPP_ p->Y,p->X,mr_mip->w1);
            add2(mr_mip->w1,mr_mip->w2,mr_mip->w1);
            if (compare(mr_mip->w1,mr_mip->w5)==0) valid=TRUE;
        }
        else
        { /* no y supplied - calculate one. Solve quadratic */
            if (size(p->X)==0) 
            {
                if (mr_mip->Bsize==MR_TOOBIG) 
                    copy(mr_mip->B,mr_mip->w1);
                else convert(_MIPP_ mr_mip->Bsize,mr_mip->w1); 

                sqroot2(_MIPP_ mr_mip->w1,p->Y);
                valid=TRUE;
            }
            else
            {
                inverse2(_MIPP_ mr_mip->w6,mr_mip->w6);  /* 1/x^2 */
                modmult2(_MIPP_ mr_mip->w5,mr_mip->w6,mr_mip->w5);
                valid=quad2(_MIPP_ mr_mip->w5,mr_mip->w5);     
                incr2(mr_mip->w5,cb^parity2(mr_mip->w5),mr_mip->w5);
                modmult2(_MIPP_ mr_mip->w5,p->X,p->Y);
            }
        }
    }
    if (valid)
    {
        p->marker=MR_EPOINT_NORMALIZED;
        MR_OUT
        return TRUE;
    }
    MR_OUT
    return FALSE;
}

BOOL epoint2_norm(_MIPD_ epoint *p)
{ /* normalise a point */
#ifndef MR_GENERIC_MT
    miracl *mr_mip=get_mip();
#endif

    if (mr_mip->coord==MR_AFFINE) return TRUE;
    if (p->marker!=MR_EPOINT_GENERAL) return TRUE;

    if (mr_mip->ERNUM) return FALSE;

    MR_IN(126)

    if (!inverse2(_MIPP_ p->Z,mr_mip->w8))
    {
        MR_OUT
        return FALSE;
    }

    modsquare2(_MIPP_ mr_mip->w8,mr_mip->w1);          /* 1/ZZ */
    modmult2(_MIPP_ p->X,mr_mip->w1,p->X);             /* X/ZZ */
    modmult2(_MIPP_ mr_mip->w1,mr_mip->w8,mr_mip->w1); /* 1/ZZZ */ 
    modmult2(_MIPP_ p->Y,mr_mip->w1,p->Y);             /* Y/ZZZ */
    convert(_MIPP_ 1,p->Z);

    p->marker=MR_EPOINT_NORMALIZED;
    MR_OUT
    return TRUE;
}

int epoint2_get(_MIPD_ epoint* p,big x,big y)
{ /* Get point co-ordinates in affine, normal form       *
   * (converted from projective form). If x==y, supplies *
   * x only. Return value is LSB of y/x (useful for      *
   * point compression                                   */
    int lsb;
#ifndef MR_GENERIC_MT
    miracl *mr_mip=get_mip();
#endif
    
    if (p->marker==MR_EPOINT_INFINITY)
    {
        zero(x);
        zero(y);
        return 0;
    }
    if (mr_mip->ERNUM) return 0;

    MR_IN(127)

    epoint2_norm(_MIPP_ p);

    copy(p->X,x);
    copy(p->Y,mr_mip->w5);

    if (x!=y) copy(mr_mip->w5,y);
    if (size(x)==0)
    {
        MR_OUT
        return 0;
    }
    if (mr_mip->SS)
    {
        lsb=parity2(p->Y);
    }
    else
    {
        inverse2(_MIPP_ x,mr_mip->w5);
        modmult2(_MIPP_ mr_mip->w5,p->Y,mr_mip->w5);

        lsb=parity2(mr_mip->w5);
    }
    MR_OUT
    return lsb;
}

static void ecurve2_double(_MIPD_ epoint *p)
{ /* double epoint on active curve */
#ifndef MR_GENERIC_MT
    miracl *mr_mip=get_mip();
#endif

    if (p->marker==MR_EPOINT_INFINITY)
    { /* 2 times infinity == infinity! */
        return;
    }

    if (mr_mip->coord==MR_AFFINE)
    {
        if (mr_mip->SS)
        { /* super-singular */
            modsquare2(_MIPP_ p->X,p->X);
            incr2(p->X,1,mr_mip->w8);
            modsquare2(_MIPP_ p->X,p->X);
            modsquare2(_MIPP_ p->Y,p->Y);
            modsquare2(_MIPP_ p->Y,p->Y);
            add2(p->Y,p->X,p->Y);   /* y=x^4+y^4   */
            incr2(p->X,1,p->X);     /* x=x^4+1     */
            return;
        }    

        if (size(p->X)==0)
        { /* set to point at infinity */
            epoint2_set(_MIPP_ NULL,NULL,0,p);
            return;
        }
        inverse2(_MIPP_ p->X,mr_mip->w8);
        modmult2(_MIPP_ mr_mip->w8,p->Y,mr_mip->w8);
        add2(mr_mip->w8,p->X,mr_mip->w8);   /* w8 is slope m */

        modsquare2(_MIPP_ mr_mip->w8,mr_mip->w6);  /* w6 =m^2 */
        add2(mr_mip->w6,mr_mip->w8,mr_mip->w1);
        if (mr_mip->Asize==MR_TOOBIG)
            add2(mr_mip->w1,mr_mip->A,mr_mip->w1); 
        else
            incr2(mr_mip->w1,mr_mip->Asize,mr_mip->w1); /* w1 = x3 */

        add2(p->X,mr_mip->w1,mr_mip->w6);
        modmult2(_MIPP_ mr_mip->w6,mr_mip->w8,mr_mip->w6);
        copy(mr_mip->w1,p->X);
        add2(mr_mip->w6,mr_mip->w1,mr_mip->w6);
        add2(p->Y,mr_mip->w6,p->Y);
        return;
    }

    if (size(p->X)==0)
    { /* set to infinity */
        epoint2_set(_MIPP_ NULL,NULL,0,p);
        return;
    }

    if (p->marker!=MR_EPOINT_NORMALIZED)
    {
        modmult2(_MIPP_ p->Y,p->Z,p->Y);             /* t2 = t2 * t3 */
        modsquare2(_MIPP_ p->Z,p->Z);                /* t3 = t3^2 */
        modmult2(_MIPP_ mr_mip->C,p->Z,mr_mip->w4);  /* t4 = c * t3 */ 
        modmult2(_MIPP_ p->Z,p->X,p->Z);             /* t3 = t3 * t1 */
    }
    else
    {
        copy(mr_mip->C,mr_mip->w4);
        copy(p->X,p->Z);
    }
    add2(p->Y,p->Z,p->Y);                 /* t2 = t2 + t3 */
    add2(mr_mip->w4,p->X,mr_mip->w4);     /* t4 = t4 + t1 */
    modsquare2(_MIPP_ mr_mip->w4,mr_mip->w4);    /* t4 = t4^2 */ 
    modsquare2(_MIPP_ mr_mip->w4,mr_mip->w4);    /* t4 = t4^2 */
    modsquare2(_MIPP_ p->X,mr_mip->w1);          /* t1 = t1^2 */
    add2(p->Y,mr_mip->w1,p->Y);           /* t2 = t2 + t1 */
    modmult2(_MIPP_ p->Y,mr_mip->w4,p->Y);       /* t2 = t2 * t4 */
    modsquare2(_MIPP_ mr_mip->w1,mr_mip->w1);    /* t1 = t1^2 */
    modmult2(_MIPP_ mr_mip->w1,p->Z,mr_mip->w1); /* t1 = t1 * t3 */
    add2(p->Y,mr_mip->w1,p->Y);           /* t2 = t2 + t1 */
    copy(mr_mip->w4,p->X);

    p->marker=MR_EPOINT_GENERAL;
}

static BOOL ecurve2_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 */
 
#ifndef MR_GENERIC_MT
    miracl *mr_mip=get_mip();
#endif
    if (mr_mip->coord==MR_AFFINE)
    {
        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  */

        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
        {
            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);
        }
        pa->marker=MR_EPOINT_NORMALIZED;
        return TRUE;
    }

    if (p->marker!=MR_EPOINT_NORMALIZED)
    {
        modsquare2(_MIPP_ p->Z,mr_mip->w6);           /* t7 = t6^2    */
        modmult2(_MIPP_ pa->X,mr_mip->w6,mr_mip->w1); /* t1 = t1 * t7 */
        modmult2(_MIPP_ mr_mip->w6,p->Z,mr_mip->w6);  /* t7 = t7 * t6 */
        modmult2(_MIPP_ pa->Y,mr_mip->w6,mr_mip->w2); /* t2 = t2 * t7 */ 
    }
    else
    {
        copy(pa->X,mr_mip->w1);
        copy(pa->Y,mr_mip->w2);
    }
    if (pa->marker==MR_EPOINT_NORMALIZED)
        convert(_MIPP_ 1,mr_mip->w6);
    else
        modsquare2(_MIPP_ pa->Z,mr_mip->w6);           /* t7 = t3^2    */
    modmult2(_MIPP_ mr_mip->w6,p->X,mr_mip->w8);       /* t8 = t4 * t7 */
    add2(mr_mip->w1,mr_mip->w8,mr_mip->w1);     /* t1 = t1 + t8 */
    if (pa->marker!=MR_EPOINT_NORMALIZED)
        modmult2(_MIPP_ mr_mip->w6,pa->Z,mr_mip->w6);  /* t7 = t7 * t3 */
    modmult2(_MIPP_ mr_mip->w6,p->Y,mr_mip->w8);       /* t8 = t7 * t5 */
    add2(mr_mip->w2,mr_mip->w8,mr_mip->w2);     /* t2 = t2 + t8 */
    if (size(mr_mip->w1)==0)
    {
        if (size(mr_mip->w2)==0)
        { /* should have doubled! */
            return FALSE;
        }
        else
        { /* point at infinity */
            epoint2_set(_MIPP_ NULL,NULL,0,pa);
            return TRUE;
        }
    }
    modmult2(_MIPP_ p->X,mr_mip->w2,mr_mip->w4);      /* t4 = t2 * t4 */
    if (pa->marker!=MR_EPOINT_NORMALIZED)
        modmult2(_MIPP_ pa->Z,mr_mip->w1,mr_mip->w3);  /* t3 = t3 * t1 */
    else 
        copy(mr_mip->w1,mr_mip->w3);
    modmult2(_MIPP_ p->Y,mr_mip->w3,mr_mip->w5);      /* t5 = t5 * t3 */
    add2(mr_mip->w4,mr_mip->w5,mr_mip->w4);           /* t4 = t4 + t5 */
    modsquare2(_MIPP_ mr_mip->w3,mr_mip->w5);         /* t5 = t3^2    */
    modmult2(_MIPP_ mr_mip->w4,mr_mip->w5,mr_mip->w6); /* t7 = t4 * t5 */

    if (p->marker!=MR_EPOINT_NORMALIZED) 
        modmult2(_MIPP_ mr_mip->w3,p->Z,mr_mip->w3);  /* t3 = t3 * t6 */
    add2(mr_mip->w2,mr_mip->w3,mr_mip->w4);    /* t4 = t2 + t3 */
    modmult2(_MIPP_ mr_mip->w2,mr_mip->w4,mr_mip->w2);/* t2 = t2 * t4 */
    modsquare2(_MIPP_ mr_mip->w1,mr_mip->w5);         /* t5 = t1^2    */
    modmult2(_MIPP_ mr_mip->w1,mr_mip->w5,mr_mip->w1);/* t1 = t1 * t5 */
    if (mr_mip->Asize>0)
    {
        modsquare2(_MIPP_ mr_mip->w3,mr_mip->w8);     /* t8 = t3^2    */
        if (mr_mip->Asize>1)
        {
            if (mr_mip->Asize==MR_TOOBIG)
                copy(mr_mip->A,mr_mip->w5);
            else 
                convert(_MIPP_ mr_mip->Asize,mr_mip->w5);
            modmult2(_MIPP_ mr_mip->w8,mr_mip->w5,mr_mip->w8);
        }
        add2(mr_mip->w1,mr_mip->w8,mr_mip->w1);/* t1 = t1 + t8 */
    }
    add2(mr_mip->w1,mr_mip->w2,pa->X);         /* t1 = t1 + t2 */
    modmult2(_MIPP_ mr_mip->w4,pa->X,mr_mip->w4);/* t4 = t4 * t1 */
    add2(mr_mip->w4,mr_mip->w6,pa->Y);         /* t2 = t4 + t7 */
    copy(mr_mip->w3,pa->Z);

    pa->marker=MR_EPOINT_GENERAL;
    return TRUE;
}

void epoint2_copy(epoint *a,epoint *b)
{   
    if (a==b) return;
    copy(a->X,b->X);
    copy(a->Y,b->Y);
    if (a->marker==MR_EPOINT_GENERAL) copy(a->Z,b->Z);
    b->marker=a->marker;
    return;
}

BOOL epoint2_comp(_MIPD_ epoint *a,epoint *b)
{
    int ia,ib;
#ifndef MR_GENERIC_MT
    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 && 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 pointe to the line slope is returned *
    * only if curve is super-singular                   */
#ifndef MR_GENERIC_MT
    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 */
#ifndef MR_GENERIC_MT
    miracl *mr_mip=get_mip();
#endif
    if (mr_mip->ERNUM) return;
    if (p->marker==MR_EPOINT_INFINITY) return;
    MR_IN(130)
    if (p->marker==MR_EPOINT_GENERAL)
    {
        modmult2(_MIPP_ p->X,p->Z,mr_mip->w1);
        add2(p->Y,mr_mip->w1,p->Y);
    }
    else 
    {
        if (mr_mip->SS)  incr2(p->Y,1,p->Y);
        else             add2(p->Y,p->X,p->Y);
                        
    }
    MR_OUT
}

big ecurve2_sub(_MIPD_ epoint *p,epoint *pa)
{
    big r;
#ifndef MR_GENERIC_MT
    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;
}

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;
#ifndef MR_GENERIC_MT
    miracl *mr_mip=get_mip();
#endif
    if (mr_mip->ERNUM) return;

    MR_IN(132)
    if (mr_mip->coord==MR_AFFINE && !mr_mip->SS)
    {
        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 (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;
                }
                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)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -