jehanne/sys/src/lib/authsrv/edwards.mpc

105 lines
2.7 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 edwards_add(mpint *p, mpint *a, mpint *d, mpint *X1, mpint *Y1, mpint *Z1, mpint *T1, mpint *X2, mpint *Y2, mpint *Z2, mpint *T2, mpint *X3, mpint *Y3, mpint *Z3, mpint *T3){
mpint *H = mpnew(0);
mpint *G = mpnew(0);
mpint *F = mpnew(0);
mpint *E = mpnew(0);
mpint *D = mpnew(0);
mpint *C = mpnew(0);
mpint *B = mpnew(0);
mpint *A = mpnew(0);
mpmodmul(X1, X2, p, A);
mpmodmul(Y1, Y2, p, B);
mpint *tmp1 = mpnew(0);
mpmodmul(d, T1, p, tmp1);
mpmodmul(tmp1, T2, p, C);
mpfree(tmp1);
mpmodmul(Z1, Z2, p, D);
tmp1 = mpnew(0);
mpmodadd(X1, Y1, p, tmp1);
mpint *tmp2 = mpnew(0);
mpmodadd(X2, Y2, p, tmp2);
mpmodmul(tmp1, tmp2, p, E);
mpfree(tmp1);
mpfree(tmp2);
mpmodsub(E, A, p, E);
mpmodsub(E, B, p, E);
mpmodsub(D, C, p, F);
mpmodadd(D, C, p, G);
mpmodmul(a, A, p, H);
mpmodsub(B, H, p, H);
mpmodmul(E, F, p, X3);
mpmodmul(G, H, p, Y3);
mpmodmul(F, G, p, Z3);
mpmodmul(E, H, p, T3);
mpfree(H);
mpfree(G);
mpfree(F);
mpfree(E);
mpfree(D);
mpfree(C);
mpfree(B);
mpfree(A);
}
void edwards_sel(mpint *s, mpint *X1, mpint *Y1, mpint *Z1, mpint *T1, mpint *X2, mpint *Y2, mpint *Z2, mpint *T2, mpint *X3, mpint *Y3, mpint *Z3, mpint *T3){
mpsel(mpcmp(s, mpzero), X1, X2, X3);
mpsel(mpcmp(s, mpzero), Y1, Y2, Y3);
mpsel(mpcmp(s, mpzero), Z1, Z2, Z3);
mpsel(mpcmp(s, mpzero), T1, T2, T3);
}
void edwards_new(mpint *x, mpint *y, mpint *z, mpint *t, mpint *X, mpint *Y, mpint *Z, mpint *T){
mpassign(x, X);
mpassign(y, Y);
mpassign(z, Z);
mpassign(t, T);
}
void edwards_scale(mpint *p, mpint *a, mpint *d, mpint *s, mpint *X1, mpint *Y1, mpint *Z1, mpint *T1, mpint *X3, mpint *Y3, mpint *Z3, mpint *T3){
mpint *j = mpnew(0);
mpint *k = mpnew(0);
mpint *T4 = mpnew(0);
mpint *Z4 = mpnew(0);
mpint *Y4 = mpnew(0);
mpint *X4 = mpnew(0);
mpint *T2 = mpnew(0);
mpint *Z2 = mpnew(0);
mpint *Y2 = mpnew(0);
mpint *X2 = mpnew(0);
edwards_new(X1, Y1, Z1, T1, X2, Y2, Z2, T2);
edwards_new(mpzero, mpone, mpone, mpzero, X4, Y4, Z4, T4);
mpint *tmp1 = mpnew(0);
mpmod(s, mptwo, tmp1);
edwards_sel(tmp1, X2, Y2, Z2, T2, X4, Y4, Z4, T4, X3, Y3, Z3, T3);
mpfree(tmp1);
mpright(s, 1, k);
mpright(p, 1, j);
for(;;){
if(mpcmp(j, mpzero) != 0){
edwards_add(p, a, d, X2, Y2, Z2, T2, X2, Y2, Z2, T2, X2, Y2, Z2, T2);
edwards_add(p, a, d, X2, Y2, Z2, T2, X3, Y3, Z3, T3, X4, Y4, Z4, T4);
mpint *tmp2 = mpnew(0);
mpmod(k, mptwo, tmp2);
edwards_sel(tmp2, X4, Y4, Z4, T4, X3, Y3, Z3, T3, X3, Y3, Z3, T3);
mpfree(tmp2);
mpright(k, 1, k);
mpright(j, 1, j);
}else{
break;
}
}
mpfree(j);
mpfree(k);
mpfree(T4);
mpfree(Z4);
mpfree(Y4);
mpfree(X4);
mpfree(T2);
mpfree(Z2);
mpfree(Y2);
mpfree(X2);
}