void ECP_mul_1024()

in src/cg21/cg21_utilities.c [59:137]


void ECP_mul_1024(ECP_SECP256K1 *P,BIG_1024_58 e[HFLEN_2048])
{
    /* fixed size windows */
    int nb;
    int s;
    int ns;
    BIG_1024_58 mt[HFLEN_2048];
    BIG_1024_58 t[HFLEN_2048];
    ECP_SECP256K1 Q;
    ECP_SECP256K1 W[8];
    ECP_SECP256K1 C;

    int w[1+(4*NLEN_256_56*BASEBITS_256_56+3)/4];

    if (ECP_SECP256K1_isinf(P)) {
        return;
    }

    if (BIG_1024_58_iszilch(*e))
    {
        ECP_SECP256K1_inf(P);
        return;
    }

    ECP_SECP256K1_affine(P);

    /* precompute table */

    ECP_SECP256K1_copy(&Q,P);
    ECP_SECP256K1_dbl(&Q);

    ECP_SECP256K1_copy(&W[0],P);

    for (int i=1; i<8; i++)
    {
        ECP_SECP256K1_copy(&W[i],&W[i-1]);
        ECP_SECP256K1_add(&W[i],&Q);
    }

    /* make exponent odd - add 2P if even, P if odd */
    BIG_1024_58_copy(*t,*e);
    s=BIG_1024_58_parity(*t);
    BIG_1024_58_inc(*t,1);
    BIG_1024_58_norm(*t);
    ns=BIG_1024_58_parity(*t);
    BIG_1024_58_copy(*mt,*t);
    BIG_1024_58_inc(*mt,1);
    BIG_1024_58_norm(*mt);
    BIG_1024_58_cmove(*t,*mt,s);
    ECP_cmove_local(&Q,P,ns);

    ECP_SECP256K1_copy(&C,&Q);

    nb = 1+ (BIGBITS_1024_58+3)/4;

    /* convert exponent to signed 4-bit window */
    for (int i=0; i<nb; i++)
    {
        w[i]=BIG_1024_58_lastbits(*t,5)-16;
        BIG_1024_58_dec(*t,w[i]);
        BIG_1024_58_norm(*t);
        BIG_1024_58_fshr(*t,4);
    }

    w[nb]=BIG_1024_58_lastbits(*t,5);
    ECP_SECP256K1_copy(P,&W[(w[nb]-1)/2]);

    for (int i=nb-1; i>=0; i--)
    {
        ECP_select(&Q,W,w[i]);
        ECP_SECP256K1_dbl(P);
        ECP_SECP256K1_dbl(P);
        ECP_SECP256K1_dbl(P);
        ECP_SECP256K1_dbl(P);
        ECP_SECP256K1_add(P,&Q);
    }
    ECP_SECP256K1_sub(P,&C); /* apply correction */
    ECP_SECP256K1_affine(P);
}