void ge25519_scalarmult_base(ge25519_p3 *r, const sc25519 *s) { signed char b[64]; signed char i; //1 byte ge25519_aff t; //64 bytes ge25519_p1p1 tp1p1; //128 bytes sc25519_window4(b,s); choose_t((ge25519_aff *)r, b[63]); fe25519_setone(&r->z); fe25519_mul(&r->t, &r->x, &r->y); for(i=62;i>=0;i--) { dbl_p1p1(&tp1p1, (ge25519_p2 *)r); p1p1_to_p2((ge25519_p2 *)r, &tp1p1); dbl_p1p1(&tp1p1, (ge25519_p2 *)r); p1p1_to_p2((ge25519_p2 *)r, &tp1p1); dbl_p1p1(&tp1p1, (ge25519_p2 *)r); p1p1_to_p2((ge25519_p2 *)r, &tp1p1); dbl_p1p1(&tp1p1, (ge25519_p2 *)r); p1p1_to_p3(r, &tp1p1); choose_t(&t, b[i]); ge25519_mixadd2(r, &t); } }
void ge25519_scalarmult_base(ge25519_p3 *r, const sc25519 *s) { signed char b[85]; int i; ge25519_aff t; sc25519_window3(b,s); choose_t((ge25519_aff *)r, 0, b[0]); fe25519_setone(&r->z); fe25519_mul(&r->t, &r->x, &r->y); for(i=1;i<85;i++) { choose_t(&t, (unsigned long long) i, b[i]); ge25519_mixadd2(r, &t); } }