aboutsummaryrefslogtreecommitdiff
path: root/src/crypto/shen_ed25519_ref/ref10/ge_frombytes.c
diff options
context:
space:
mode:
authorShenNoether <Shen.Noether@gmx.com>2015-08-23 14:48:50 -0600
committerShenNoether <Shen.Noether@gmx.com>2015-08-23 14:48:50 -0600
commit0a4bc84b2f681dfd89b501648f65a951d876e2d8 (patch)
tree9f37622b56f26724b4c057dd28f4c9a0ee7ecd74 /src/crypto/shen_ed25519_ref/ref10/ge_frombytes.c
parentrevert to 776b4fc91a821be152f0f23e6873aabb78a72029 (diff)
downloadmonero-0a4bc84b2f681dfd89b501648f65a951d876e2d8.tar.xz
Added ref10 shen_ed25519_ref code, which includes code that can replace crypto-ops with a version straight from Bernstein's ref 10
Diffstat (limited to 'src/crypto/shen_ed25519_ref/ref10/ge_frombytes.c')
-rw-r--r--src/crypto/shen_ed25519_ref/ref10/ge_frombytes.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/crypto/shen_ed25519_ref/ref10/ge_frombytes.c b/src/crypto/shen_ed25519_ref/ref10/ge_frombytes.c
new file mode 100644
index 000000000..1a059ee93
--- /dev/null
+++ b/src/crypto/shen_ed25519_ref/ref10/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;
+}