]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libauthsrv/decaf.mp
add swiss german kbmap (thanks mike)
[plan9front.git] / sys / src / libauthsrv / decaf.mp
1 # negate r when n > (p-1)/2
2 decaf_neg(p, n, r) {
3         mod(p) m = -r;
4         r = n > (p-1)>>1 ? m : r;
5 }
6
7 #       field F_p
8 #       curve a*x**2+y**2==1+d*x**2*y**2
9 #       input X,Y,Z,T (extended coordinates)
10 decaf_encode(p,a,d, X,Y,Z,T, s) mod(p) {
11         r = misqrt((a-d)*(Z+Y)*(Z-Y), p);
12         u = (a-d)*r;
13         decaf_neg(p, -2*u*Z, r);
14         s = u*(r*(a*Z*X-d*Y*T)+Y)/a;
15         decaf_neg(p, s, s);
16 }
17
18 #       field F_p
19 #       curve a*x**2+y**2==1+d*x**2*y**2
20 #       input s
21 #       output in extended coordinates
22 decaf_decode(p,a,d, s, ok,X,Y,Z,T) {
23         if(s > (p-1)>>1){
24                 ok = 0;
25         } else mod(p) {
26                 ss = s^2;
27                 Z = 1+a*ss;
28                 u = Z^2 - 4*d*ss;
29                 v = u*ss;
30                 if(v == 0)
31                         ok = 1;
32                 else {
33                         ok = msqrt(v, p);
34                         if(ok != 0){
35                                 v = 1/ok;
36                                 ok = 1;
37                         }
38                 }
39                 if(ok != 0) {
40                         decaf_neg(p, u*v, v);
41                         w = v * s * (2-Z);
42                         if(s == 0)
43                                 w = w + 1;
44                         X = 2*s;
45                         Y = w * Z;
46                         T = w * X;
47                 }
48         }
49 }