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);
}