aboutsummaryrefslogtreecommitdiff
path: root/src/crypto/crypto_ops_builder/ref10CommentedCombined/ge_frombytes.c
diff options
context:
space:
mode:
authorRiccardo Spagni <ric@spagni.net>2015-10-26 18:12:15 +0200
committerRiccardo Spagni <ric@spagni.net>2015-10-26 18:24:59 +0200
commit7003e7c1565c1d391d6b907dc8667083092b9543 (patch)
tree6218bba2ad3cdaa4a8c0be027587db736a2cc946 /src/crypto/crypto_ops_builder/ref10CommentedCombined/ge_frombytes.c
parentMerge pull request #448 (diff)
parentMerge branch 'master' of https://github.com/fluffypony/bitmonero (diff)
downloadmonero-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.c50
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;
+}