]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libauthsrv/edwards.mp
libaml: fix gc bug, need to amltake()/amldrop() temporary buffer
[plan9front.git] / sys / src / libauthsrv / edwards.mp
1 # Edwards curve arithmetic
2 edwards_add(p,a,d, X1,Y1,Z1,T1, X2,Y2,Z2,T2, X3,Y3,Z3,T3) mod(p) {
3         A = X1*X2;
4         B = Y1*Y2;
5         C = d*T1*T2;
6         D = Z1*Z2;
7         E = (X1+Y1)*(X2+Y2);
8         E = E - A - B;
9         F = D - C;
10         G = D + C;
11         H = B - a*A;
12         X3 = E*F;
13         Y3 = G*H;
14         Z3 = F*G;
15         T3 = E*H;
16 }
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;
22 }
23 edwards_new(x,y,z,t, X,Y,Z,T) {
24         X = x;
25         Y = y;
26         Z = z;
27         T = t;
28 }
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;
34         while(j != 0){
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;
39         }
40 }