diff options
author | Riccardo Spagni <ric@spagni.net> | 2015-10-26 18:12:15 +0200 |
---|---|---|
committer | Riccardo Spagni <ric@spagni.net> | 2015-10-26 18:24:59 +0200 |
commit | 7003e7c1565c1d391d6b907dc8667083092b9543 (patch) | |
tree | 6218bba2ad3cdaa4a8c0be027587db736a2cc946 /src/crypto/crypto_ops_builder/ref10CommentedCombined/ge_frombytes.c | |
parent | Merge pull request #448 (diff) | |
parent | Merge branch 'master' of https://github.com/fluffypony/bitmonero (diff) | |
download | monero-7003e7c1565c1d391d6b907dc8667083092b9543.tar.xz |
Merge pull request #450
cbdf197 renamed folder (Riccardo Spagni)
bb0c161 renamed folder (Riccardo Spagni)
Diffstat (limited to 'src/crypto/crypto_ops_builder/ref10CommentedCombined/ge_frombytes.c')
-rw-r--r-- | src/crypto/crypto_ops_builder/ref10CommentedCombined/ge_frombytes.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/crypto/crypto_ops_builder/ref10CommentedCombined/ge_frombytes.c b/src/crypto/crypto_ops_builder/ref10CommentedCombined/ge_frombytes.c new file mode 100644 index 000000000..1a059ee93 --- /dev/null +++ b/src/crypto/crypto_ops_builder/ref10CommentedCombined/ge_frombytes.c @@ -0,0 +1,50 @@ +#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; +} |