shithub: drawterm

ref: 7b58000c3d019d157fa5f1cc5621b0923e5b8539

View raw version
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);
	}