Subversion Repositories planix.SVN

Rev

Rev 33 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
26 7u83 1
# Elliptic curve group operations in jacobian coordinates:
2
#	x=X/Z^2
3
#	x=Y/Z^3
4
 
5
jacobian_new(x,y,z, X,Y,Z) {
6
	X = x;
7
	Y = y;
8
	Z = z;
9
}
10
jacobian_inf(X,Y,Z) {
11
	X,Y,Z = jacobian_new(0,1,0);
12
}
13
jacobian_affine(p, X,Y,Z) mod(p) {
14
	if(Z != 0) {
15
		ZZ = Z^2;
16
		ZZZ = ZZ*Z;
17
		X = X / ZZ;
18
		Y = Y / ZZZ;
19
		Z = 1;
20
	}
21
}
22
jacobian_dbl(p,a, X1,Y1,Z1, X3,Y3,Z3) mod(p) {
23
	if(Y1 == 0) {
24
		X3,Y3,Z3 = jacobian_inf();
25
	} else {
26
		XX = X1^2;
27
		YY = Y1^2;
28
		YYYY = YY^2;
29
		ZZ = Z1^2;
30
		S = 2*((X1+YY)^2-XX-YYYY);
31
		M = 3*XX+a*ZZ^2;
32
		Z3 = (Y1+Z1)^2-YY-ZZ;	
33
		X3 = M^2-2*S;
34
		Y3 = M*(S-X3)-8*YYYY;
35
	}
36
}
37
jacobian_add(p,a, X1,Y1,Z1, X2,Y2,Z2, X3,Y3,Z3) mod(p) {
38
	Z1Z1 = Z1^2;
39
	Z2Z2 = Z2^2;
40
	U1 = X1*Z2Z2;
41
	U2 = X2*Z1Z1;
42
	S1 = Y1*Z2*Z2Z2;
43
	S2 = Y2*Z1*Z1Z1;
44
	if(U1 == U2) {
45
		if(S1 != S2) {
46
			X3,Y3,Z3 = jacobian_inf();
47
		} else {
48
			X3,Y3,Z3 = jacobian_dbl(p,a, X1,Y1,Z1);
49
		}
50
	} else {
51
		H = U2-U1;
52
		I = (2*H)^2;
53
		J = H*I;
54
		r = 2*(S2-S1);
55
		V = U1*I;
56
		X3 = r^2-J-2*V;
57
		Y3 = r*(V-X3)-2*S1*J;
58
		Z3 = ((Z1+Z2)^2-Z1Z1-Z2Z2)*H;
59
	}
60
}