1 # Edwards curve arithmetic
2 edwards_add(p,a,d, X1,Y1,Z1,T1, X2,Y2,Z2,T2, X3,Y3,Z3,T3) mod(p) {
17 edwards_sel(s, X1,Y1,Z1,T1, X2,Y2,Z2,T2, X3,Y3,Z3,T3){
18 X3 = s != 0 ? X1 : X2;
19 Y3 = s != 0 ? Y1 : Y2;
20 Z3 = s != 0 ? Z1 : Z2;
21 T3 = s != 0 ? T1 : T2;
23 edwards_new(x,y,z,t, X,Y,Z,T) {
29 edwards_scale(p,a,d, s, X1,Y1,Z1,T1, X3,Y3,Z3,T3) {
30 X2,Y2,Z2,T2 = edwards_new(X1,Y1,Z1,T1);
31 X4,Y4,Z4,T4 = edwards_new( 0, 1, 1, 0);
32 X3,Y3,Z3,T3 = edwards_sel(s % 2, X2,Y2,Z2,T2, X4,Y4,Z4,T4);
33 k = s >> 1; j = p >> 1;
35 X2,Y2,Z2,T2 = edwards_add(p,a,d, X2,Y2,Z2,T2, X2,Y2,Z2,T2);
36 X4,Y4,Z4,T4 = edwards_add(p,a,d, X2,Y2,Z2,T2, X3,Y3,Z3,T3);
37 X3,Y3,Z3,T3 = edwards_sel(k % 2, X4,Y4,Z4,T4, X3,Y3,Z3,T3);
38 k = k >> 1; j = j >> 1;