epoint_set

epoint_set定义在miracl.h

extern BOOL epoint_set(_MIPT_ big,big,int,epoint*);

函数功能:初始化椭圆曲线上的一个点,如果x或者yNULL,直接设置为无穷点。如果x==y,(如果可能的话)计算y,根据cb确定yLSB 0/1;否则忽略cb,检验坐标(x,y)

返回值:如果坐标设置成功,返回TRUE;否则返回FALSE

参数_MIPT_:可能为空,非空为miracl *类型。

参数x

参数y

参数cb

参数p

1. 源码分析

epoint_set实现在mrcurve.c

BOOL epoint_set(_MIPD_ big x,big y,int cb,epoint *p)
{ /* initialise a point on active ecurve            *
   * if x or y == NULL, set to point at infinity    *
   * if x==y, a y co-ordinate is calculated - if    *
   * possible - and cb suggests LSB 0/1  of y       *
   * (which "decompresses" y). Otherwise, check     *
   * validity of given (x,y) point, ignoring cb.    *
   * Returns TRUE for valid point, otherwise FALSE. */

    BOOL valid;

#ifdef MR_OS_THREADS
    miracl *mr_mip=get_mip();
#endif
    if (mr_mip->ERNUM) return FALSE;

    // 设置`MIRACL`线程的深度
    MR_IN(97)

    // 只要x或y有一个为空,
    if (x==NULL || y==NULL)
    {
        copy(mr_mip->one,p->X); // 将one复制给X
        zero(p->Y); 
        p->marker=MR_EPOINT_INFINITY; // 状态设置为无穷大
        MR_OUT
        return TRUE;
    }

    valid=FALSE;
    nres(_MIPP_ x,p->X);
    if (x!=y)
    { /* Check directly that x^2+Ay^2 == x^2.y^2+B */
        nres(_MIPP_ y,p->Y);
        nres_modmult(_MIPP_ p->X,p->X,mr_mip->w1);
        nres_modmult(_MIPP_ p->Y,p->Y,mr_mip->w2);
        nres_modmult(_MIPP_ mr_mip->w1,mr_mip->w2,mr_mip->w3);
        nres_modadd(_MIPP_ mr_mip->w3,mr_mip->B,mr_mip->w3);


        if (mr_abs(mr_mip->Asize)==MR_TOOBIG)
            nres_modmult(_MIPP_ mr_mip->w2,mr_mip->A,mr_mip->w2);
        else
            nres_premult(_MIPP_ mr_mip->w2,mr_mip->Asize,mr_mip->w2);   
        nres_modadd(_MIPP_ mr_mip->w2,mr_mip->w1,mr_mip->w2);
        if (mr_compare(mr_mip->w2,mr_mip->w3)==0) valid=TRUE;
    }
    else
    { /* find RHS */
        epoint_getrhs(_MIPP_ p->X,mr_mip->w7);
     /* no y supplied - calculate one. Find square root */
#ifndef MR_NOSUPPORT_COMPRESSION
        valid=nres_sqroot(_MIPP_ mr_mip->w7,p->Y);
    /* check LSB - have we got the right root? */
        redc(_MIPP_ p->Y,mr_mip->w1);
        if (remain(_MIPP_ mr_mip->w1,2)!=cb) 
            mr_psub(_MIPP_ mr_mip->modulus,p->Y,p->Y);

#else
        mr_berror(_MIPP_ MR_ERR_NOT_SUPPORTED);
        MR_OUT
        return FALSE;
#endif
    } 
    if (valid)
    {
        p->marker=MR_EPOINT_NORMALIZED;
        MR_OUT
        return TRUE;
    }

    MR_OUT
    return FALSE;
}

关于BOOL类型的定义和可选值,参考字符常量

get_mip返回miracl *指针,如果没有定义MR_OS_THREADS,由_MIPD_接收。

MR_EPOINT_INFINITY表示无穷大,其值参考字符常量

copy将x轴坐标复制给y轴坐标。

MR_IN和MR_OUT设置线程的进退码。

© phdlisl all right reserved,powered by GitbookUpdate in 2025-10-11

results matching ""

    No results matching ""