137 lines
3.0 KiB
Plaintext
137 lines
3.0 KiB
Plaintext
/* This file has been generated from Jehanne with
|
|
* a port of mpc from 9front
|
|
*
|
|
* To regenerate use:
|
|
* mpc file.mp > file.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);
|
|
}
|