105 lines
2.7 KiB
Plaintext
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);
|
|
}
|