ref: f208e59263d823ebdd8f4160825be3de63556a10
dir: /libauthsrv/decaf.mpc/
void decaf_neg(mpint *p, mpint *n, mpint *r){ mpint *m = mpnew(0); mpmodsub(mpzero, r, p, m); mpint *tmp1 = mpnew(0); mpsub(p, mpone, tmp1); mpright(tmp1, 1, tmp1); mpsel(-mpcmp(n, tmp1) >> (sizeof(int)*8-1), m, r, r); mpfree(tmp1); mpfree(m); } void decaf_encode(mpint *p, mpint *a, mpint *d, mpint *X, mpint *Y, mpint *Z, mpint *T, mpint *s){ mpint *u = mpnew(0); mpint *r = mpnew(0); mpint *tmp1 = mpnew(0); mpint *tmp2 = mpnew(0); mpint *tmp3 = mpnew(0); mpmodsub(a, d, p, tmp3); mpint *tmp4 = mpnew(0); mpmodadd(Z, Y, p, tmp4); mpmodmul(tmp3, tmp4, p, tmp2); mpfree(tmp3); mpfree(tmp4); tmp4 = mpnew(0); mpmodsub(Z, Y, p, tmp4); mpmodmul(tmp2, tmp4, p, tmp1); mpfree(tmp2); mpfree(tmp4); misqrt(tmp1, p, r); mpfree(tmp1); tmp1 = mpnew(0); mpmodsub(a, d, p, tmp1); mpmodmul(tmp1, r, p, u); mpfree(tmp1); tmp1 = mpnew(0); tmp4 = mpnew(0); mpmodadd(u, u, p, tmp4); // 2*u mpmodmul(tmp4, Z, p, tmp1); mpfree(tmp4); mpmodsub(mpzero, tmp1, p, tmp1); decaf_neg(p, tmp1, r); mpfree(tmp1); tmp1 = mpnew(0); tmp4 = mpnew(0); tmp2 = mpnew(0); tmp3 = mpnew(0); mpmodmul(a, Z, p, tmp3); mpmodmul(tmp3, X, p, tmp2); mpfree(tmp3); tmp3 = mpnew(0); mpint *tmp5 = mpnew(0); mpmodmul(d, Y, p, tmp5); mpmodmul(tmp5, T, p, tmp3); mpfree(tmp5); mpmodsub(tmp2, tmp3, p, tmp2); mpfree(tmp3); mpmodmul(r, tmp2, p, tmp4); mpfree(tmp2); mpmodadd(tmp4, Y, p, tmp4); mpmodmul(u, tmp4, p, tmp1); mpfree(tmp4); tmp4 = mpnew(0); mpinvert(a, p, tmp4); mpmodmul(tmp1, tmp4, p, s); mpfree(tmp4); mpfree(tmp1); decaf_neg(p, s, s); mpfree(u); mpfree(r); } void decaf_decode(mpint *p, mpint *a, mpint *d, mpint *s, mpint *ok, mpint *X, mpint *Y, mpint *Z, mpint *T){ mpint *w = mpnew(0); mpint *v = mpnew(0); mpint *u = mpnew(0); mpint *ss = mpnew(0); mpint *tmp1 = mpnew(0); mpsub(p, mpone, tmp1); mpright(tmp1, 1, tmp1); if(mpcmp(s, tmp1) > 0){ mpassign(mpzero, ok); }else{ mpmodmul(s, s, p, ss); mpmodmul(a, ss, p, Z); mpmodadd(mpone, Z, p, Z); mpmodmul(Z, Z, p, u); mpint *tmp2 = mpnew(0); mpint *tmp3 = mpnew(0); mpint *tmp4 = mpnew(0); uitomp(4UL, tmp4); mpmodmul(tmp4, d, p, tmp3); mpfree(tmp4); mpmodmul(tmp3, ss, p, tmp2); mpfree(tmp3); mpmodsub(u, tmp2, p, u); mpfree(tmp2); mpmodmul(u, ss, p, v); if(mpcmp(v, mpzero) == 0){ mpassign(mpone, ok); }else{ msqrt(v, p, ok); if(mpcmp(ok, mpzero) != 0){ mpinvert(ok, p, v); mpassign(mpone, ok); } } if(mpcmp(ok, mpzero) != 0){ mpint *tmp5 = mpnew(0); mpmodmul(u, v, p, tmp5); decaf_neg(p, tmp5, v); mpfree(tmp5); tmp5 = mpnew(0); mpmodmul(v, s, p, tmp5); mpint *tmp6 = mpnew(0); mpmodsub(mptwo, Z, p, tmp6); mpmodmul(tmp5, tmp6, p, w); mpfree(tmp5); mpfree(tmp6); if(mpcmp(s, mpzero) == 0){ mpmodadd(w, mpone, p, w); } mpmodadd(s, s, p, X); // 2*s mpmodmul(w, Z, p, Y); mpmodmul(w, X, p, T); } } mpfree(tmp1); mpfree(w); mpfree(v); mpfree(u); mpfree(ss); }