mirror of https://github.com/PurpleI2P/i2pd.git
I2P: End-to-End encrypted and anonymous Internet
https://i2pd.website/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
987 B
50 lines
987 B
#include "ge.h" |
|
|
|
static const fe d = { |
|
#include "d.h" |
|
} ; |
|
|
|
static const fe sqrtm1 = { |
|
#include "sqrtm1.h" |
|
} ; |
|
|
|
int ge_frombytes_negate_vartime(ge_p3 *h,const unsigned char *s) |
|
{ |
|
fe u; |
|
fe v; |
|
fe v3; |
|
fe vxx; |
|
fe check; |
|
|
|
fe_frombytes(h->Y,s); |
|
fe_1(h->Z); |
|
fe_sq(u,h->Y); |
|
fe_mul(v,u,d); |
|
fe_sub(u,u,h->Z); /* u = y^2-1 */ |
|
fe_add(v,v,h->Z); /* v = dy^2+1 */ |
|
|
|
fe_sq(v3,v); |
|
fe_mul(v3,v3,v); /* v3 = v^3 */ |
|
fe_sq(h->X,v3); |
|
fe_mul(h->X,h->X,v); |
|
fe_mul(h->X,h->X,u); /* x = uv^7 */ |
|
|
|
fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */ |
|
fe_mul(h->X,h->X,v3); |
|
fe_mul(h->X,h->X,u); /* x = uv^3(uv^7)^((q-5)/8) */ |
|
|
|
fe_sq(vxx,h->X); |
|
fe_mul(vxx,vxx,v); |
|
fe_sub(check,vxx,u); /* vx^2-u */ |
|
if (fe_isnonzero(check)) { |
|
fe_add(check,vxx,u); /* vx^2+u */ |
|
if (fe_isnonzero(check)) return -1; |
|
fe_mul(h->X,h->X,sqrtm1); |
|
} |
|
|
|
if (fe_isnegative(h->X) == (s[31] >> 7)) |
|
fe_neg(h->X,h->X); |
|
|
|
fe_mul(h->T,h->X,h->Y); |
|
return 0; |
|
}
|
|
|