174 lines
4.1 KiB
C
174 lines
4.1 KiB
C
/* this file has been autogenerated in Jehanne
|
|
* using a port of 9front mpc tool:
|
|
*
|
|
* echo '#include "os.h"' > jacobian.c
|
|
* echo '#include <mp.h>' >> jacobian.c
|
|
* mpc jacobian.mp >> jacobian.c
|
|
*/
|
|
#include "os.h"
|
|
#include <mp.h>
|
|
void jacobian_new(mpint *x, mpint *y, mpint *z, mpint *X, mpint *Y, mpint *Z){
|
|
mpassign(x, X);
|
|
mpassign(y, Y);
|
|
mpassign(z, Z);
|
|
}
|
|
void jacobian_inf(mpint *X, mpint *Y, mpint *Z){
|
|
jacobian_new(mpzero, mpone, mpzero, X, Y, Z);
|
|
}
|
|
void jacobian_affine(mpint *p, mpint *X, mpint *Y, mpint *Z){
|
|
mpint *ZZZ = mpnew(0);
|
|
mpint *ZZ = mpnew(0);
|
|
if(mpcmp(Z, mpzero) != 0){
|
|
mpmodmul(Z, Z, p, ZZ);
|
|
mpmodmul(ZZ, Z, p, ZZZ);
|
|
mpint *tmp1 = mpnew(0);
|
|
mpinvert(ZZ, p, tmp1);
|
|
mpmodmul(X, tmp1, p, X);
|
|
mpfree(tmp1);
|
|
tmp1 = mpnew(0);
|
|
mpinvert(ZZZ, p, tmp1);
|
|
mpmodmul(Y, tmp1, p, Y);
|
|
mpfree(tmp1);
|
|
mpassign(mpone, Z);
|
|
}
|
|
mpfree(ZZZ);
|
|
mpfree(ZZ);
|
|
}
|
|
void jacobian_dbl(mpint *p, mpint *a, mpint *X1, mpint *Y1, mpint *Z1, mpint *X3, mpint *Y3, mpint *Z3){
|
|
mpint *M = mpnew(0);
|
|
mpint *S = mpnew(0);
|
|
mpint *ZZ = mpnew(0);
|
|
mpint *YYYY = mpnew(0);
|
|
mpint *YY = mpnew(0);
|
|
mpint *XX = mpnew(0);
|
|
if(mpcmp(Y1, mpzero) == 0){
|
|
jacobian_inf(X3, Y3, Z3);
|
|
}else{
|
|
mpmodmul(X1, X1, p, XX);
|
|
mpmodmul(Y1, Y1, p, YY);
|
|
mpmodmul(YY, YY, p, YYYY);
|
|
mpmodmul(Z1, Z1, p, ZZ);
|
|
mpint *tmp1 = mpnew(0);
|
|
mpmodadd(X1, YY, p, tmp1);
|
|
mpmodmul(tmp1, tmp1, p, tmp1);
|
|
mpmodsub(tmp1, XX, p, tmp1);
|
|
mpmodsub(tmp1, YYYY, p, tmp1);
|
|
mpmodadd(tmp1, tmp1, p, S); // 2*tmp1
|
|
mpfree(tmp1);
|
|
tmp1 = mpnew(0);
|
|
uitomp(3UL, tmp1);
|
|
mpmodmul(tmp1, XX, p, M);
|
|
mpfree(tmp1);
|
|
tmp1 = mpnew(0);
|
|
mpint *tmp2 = mpnew(0);
|
|
mpmodmul(ZZ, ZZ, p, tmp2);
|
|
mpmodmul(a, tmp2, p, tmp1);
|
|
mpfree(tmp2);
|
|
mpmodadd(M, tmp1, p, M);
|
|
mpfree(tmp1);
|
|
mpmodadd(Y1, Z1, p, Z3);
|
|
mpmodmul(Z3, Z3, p, Z3);
|
|
mpmodsub(Z3, YY, p, Z3);
|
|
mpmodsub(Z3, ZZ, p, Z3);
|
|
mpmodmul(M, M, p, X3);
|
|
tmp1 = mpnew(0);
|
|
mpmodadd(S, S, p, tmp1); // 2*S
|
|
mpmodsub(X3, tmp1, p, X3);
|
|
mpfree(tmp1);
|
|
tmp1 = mpnew(0);
|
|
mpmodsub(S, X3, p, tmp1);
|
|
mpmodmul(M, tmp1, p, Y3);
|
|
mpfree(tmp1);
|
|
tmp1 = mpnew(0);
|
|
tmp2 = mpnew(0);
|
|
uitomp(8UL, tmp2);
|
|
mpmodmul(tmp2, YYYY, p, tmp1);
|
|
mpfree(tmp2);
|
|
mpmodsub(Y3, tmp1, p, Y3);
|
|
mpfree(tmp1);
|
|
}
|
|
mpfree(M);
|
|
mpfree(S);
|
|
mpfree(ZZ);
|
|
mpfree(YYYY);
|
|
mpfree(YY);
|
|
mpfree(XX);
|
|
}
|
|
void jacobian_add(mpint *p, mpint *a, mpint *X1, mpint *Y1, mpint *Z1, mpint *X2, mpint *Y2, mpint *Z2, mpint *X3, mpint *Y3, mpint *Z3){
|
|
mpint *V = mpnew(0);
|
|
mpint *r = mpnew(0);
|
|
mpint *J = mpnew(0);
|
|
mpint *I = mpnew(0);
|
|
mpint *H = mpnew(0);
|
|
mpint *S2 = mpnew(0);
|
|
mpint *S1 = mpnew(0);
|
|
mpint *U2 = mpnew(0);
|
|
mpint *U1 = mpnew(0);
|
|
mpint *Z2Z2 = mpnew(0);
|
|
mpint *Z1Z1 = mpnew(0);
|
|
mpmodmul(Z1, Z1, p, Z1Z1);
|
|
mpmodmul(Z2, Z2, p, Z2Z2);
|
|
mpmodmul(X1, Z2Z2, p, U1);
|
|
mpmodmul(X2, Z1Z1, p, U2);
|
|
mpint *tmp1 = mpnew(0);
|
|
mpmodmul(Y1, Z2, p, tmp1);
|
|
mpmodmul(tmp1, Z2Z2, p, S1);
|
|
mpfree(tmp1);
|
|
tmp1 = mpnew(0);
|
|
mpmodmul(Y2, Z1, p, tmp1);
|
|
mpmodmul(tmp1, Z1Z1, p, S2);
|
|
mpfree(tmp1);
|
|
if(mpcmp(U1, U2) == 0){
|
|
if(mpcmp(S1, S2) != 0){
|
|
jacobian_inf(X3, Y3, Z3);
|
|
}else{
|
|
jacobian_dbl(p, a, X1, Y1, Z1, X3, Y3, Z3);
|
|
}
|
|
}else{
|
|
mpmodsub(U2, U1, p, H);
|
|
mpmodadd(H, H, p, I); // 2*H
|
|
mpmodmul(I, I, p, I);
|
|
mpmodmul(H, I, p, J);
|
|
mpint *tmp2 = mpnew(0);
|
|
mpmodsub(S2, S1, p, tmp2);
|
|
mpmodadd(tmp2, tmp2, p, r); // 2*tmp2
|
|
mpfree(tmp2);
|
|
mpmodmul(U1, I, p, V);
|
|
mpmodmul(r, r, p, X3);
|
|
mpmodsub(X3, J, p, X3);
|
|
tmp2 = mpnew(0);
|
|
mpmodadd(V, V, p, tmp2); // 2*V
|
|
mpmodsub(X3, tmp2, p, X3);
|
|
mpfree(tmp2);
|
|
tmp2 = mpnew(0);
|
|
mpmodsub(V, X3, p, tmp2);
|
|
mpmodmul(r, tmp2, p, Y3);
|
|
mpfree(tmp2);
|
|
tmp2 = mpnew(0);
|
|
mpint *tmp3 = mpnew(0);
|
|
mpmodadd(S1, S1, p, tmp3); // 2*S1
|
|
mpmodmul(tmp3, J, p, tmp2);
|
|
mpfree(tmp3);
|
|
mpmodsub(Y3, tmp2, p, Y3);
|
|
mpfree(tmp2);
|
|
tmp2 = mpnew(0);
|
|
mpmodadd(Z1, Z2, p, tmp2);
|
|
mpmodmul(tmp2, tmp2, p, tmp2);
|
|
mpmodsub(tmp2, Z1Z1, p, tmp2);
|
|
mpmodsub(tmp2, Z2Z2, p, tmp2);
|
|
mpmodmul(tmp2, H, p, Z3);
|
|
mpfree(tmp2);
|
|
}
|
|
mpfree(V);
|
|
mpfree(r);
|
|
mpfree(J);
|
|
mpfree(I);
|
|
mpfree(H);
|
|
mpfree(S2);
|
|
mpfree(S1);
|
|
mpfree(U2);
|
|
mpfree(U1);
|
|
mpfree(Z2Z2);
|
|
mpfree(Z1Z1);
|
|
}
|