@@ -7,32 +7,78 @@ impl G1Projective {
77}
88
99impl G1Projective {
10+ // http://koclab.cs.ucsb.edu/teaching/ccs130h/2018/09projective.pdf
1011 pub fn add ( p : Wires , q : Wires ) -> Circuit {
1112 assert_eq ! ( p. len( ) , Self :: N_BITS ) ;
1213 assert_eq ! ( q. len( ) , Self :: N_BITS ) ;
1314 let mut circuit = Circuit :: empty ( ) ;
1415
15- let px = p[ 0 ..Fq :: N_BITS ] . to_vec ( ) ;
16- let py = p[ Fq :: N_BITS ..2 * Fq :: N_BITS ] . to_vec ( ) ;
17- let pz = p[ 2 * Fq :: N_BITS ..3 * Fq :: N_BITS ] . to_vec ( ) ;
18- let qx = q[ 0 ..Fq :: N_BITS ] . to_vec ( ) ;
19- let qy = q[ Fq :: N_BITS ..2 * Fq :: N_BITS ] . to_vec ( ) ;
20- let qz = q[ 2 * Fq :: N_BITS ..3 * Fq :: N_BITS ] . to_vec ( ) ;
16+ let x1 = p[ 0 ..Fq :: N_BITS ] . to_vec ( ) ;
17+ let y1 = p[ Fq :: N_BITS ..2 * Fq :: N_BITS ] . to_vec ( ) ;
18+ let z1 = p[ 2 * Fq :: N_BITS ..3 * Fq :: N_BITS ] . to_vec ( ) ;
19+ let x2 = q[ 0 ..Fq :: N_BITS ] . to_vec ( ) ;
20+ let y2 = q[ Fq :: N_BITS ..2 * Fq :: N_BITS ] . to_vec ( ) ;
21+ let z2 = q[ 2 * Fq :: N_BITS ..3 * Fq :: N_BITS ] . to_vec ( ) ;
2122
22- todo ! ( ) ;
23+ let z1s = circuit. extend ( Fq :: square ( z1. clone ( ) ) ) ;
24+ let z2s = circuit. extend ( Fq :: square ( z2. clone ( ) ) ) ;
25+ let u1 = circuit. extend ( Fq :: mul ( x1. clone ( ) , z2s. clone ( ) ) ) ;
26+ let u2 = circuit. extend ( Fq :: mul ( x2. clone ( ) , z1s. clone ( ) ) ) ;
27+ let s1 = circuit. extend ( Fq :: mul ( y1. clone ( ) , z2s. clone ( ) ) ) ;
28+ let s2 = circuit. extend ( Fq :: mul ( y2. clone ( ) , z1s. clone ( ) ) ) ;
29+ let r = circuit. extend ( Fq :: sub ( s1. clone ( ) , s2. clone ( ) ) ) ;
30+ let h = circuit. extend ( Fq :: sub ( u1. clone ( ) , u2. clone ( ) ) ) ;
31+ let h2 = circuit. extend ( Fq :: square ( h. clone ( ) ) ) ;
32+ let g = circuit. extend ( Fq :: mul ( h. clone ( ) , h2. clone ( ) ) ) ;
33+ let v = circuit. extend ( Fq :: mul ( u1. clone ( ) , h2. clone ( ) ) ) ;
34+ let r2 = circuit. extend ( Fq :: square ( r. clone ( ) ) ) ;
35+ let r2g = circuit. extend ( Fq :: add ( r2. clone ( ) , g. clone ( ) ) ) ;
36+ let vd = circuit. extend ( Fq :: double ( v. clone ( ) ) ) ;
37+ let x3 = circuit. extend ( Fq :: sub ( r2g. clone ( ) , vd. clone ( ) ) ) ;
38+ let vx3 = circuit. extend ( Fq :: sub ( v. clone ( ) , x3. clone ( ) ) ) ;
39+ let w = circuit. extend ( Fq :: mul ( r. clone ( ) , vx3. clone ( ) ) ) ;
40+ let s1g = circuit. extend ( Fq :: mul ( s1. clone ( ) , g. clone ( ) ) ) ;
41+ let y3 = circuit. extend ( Fq :: sub ( w. clone ( ) , s1g. clone ( ) ) ) ;
42+ let z1z2 = circuit. extend ( Fq :: mul ( z1. clone ( ) , z2. clone ( ) ) ) ;
43+ let z3 = circuit. extend ( Fq :: mul ( z1z2. clone ( ) , h. clone ( ) ) ) ;
2344
45+ circuit. add_wires ( x3) ;
46+ circuit. add_wires ( y3) ;
47+ circuit. add_wires ( z3) ;
48+
2449 circuit
2550 }
2651
2752 pub fn double ( p : Wires ) -> Circuit {
2853 assert_eq ! ( p. len( ) , Self :: N_BITS ) ;
2954 let mut circuit = Circuit :: empty ( ) ;
3055
31- let px = p[ 0 ..Fq :: N_BITS ] . to_vec ( ) ;
32- let py = p[ Fq :: N_BITS ..2 * Fq :: N_BITS ] . to_vec ( ) ;
33- let pz = p[ 2 * Fq :: N_BITS ..3 * Fq :: N_BITS ] . to_vec ( ) ;
56+ let x = p[ 0 ..Fq :: N_BITS ] . to_vec ( ) ;
57+ let y = p[ Fq :: N_BITS ..2 * Fq :: N_BITS ] . to_vec ( ) ;
58+ let z = p[ 2 * Fq :: N_BITS ..3 * Fq :: N_BITS ] . to_vec ( ) ;
3459
35- todo ! ( ) ;
60+ let x2 = circuit. extend ( Fq :: square ( x. clone ( ) ) ) ;
61+ let y2 = circuit. extend ( Fq :: square ( y. clone ( ) ) ) ;
62+ let m = circuit. extend ( Fq :: triple ( x2. clone ( ) ) ) ;
63+ let t = circuit. extend ( Fq :: square ( y2. clone ( ) ) ) ;
64+ let xy2 = circuit. extend ( Fq :: mul ( x. clone ( ) , y2. clone ( ) ) ) ;
65+ let xy2d = circuit. extend ( Fq :: double ( xy2. clone ( ) ) ) ;
66+ let s = circuit. extend ( Fq :: double ( xy2d. clone ( ) ) ) ;
67+ let m2 = circuit. extend ( Fq :: square ( m. clone ( ) ) ) ;
68+ let sd = circuit. extend ( Fq :: double ( s. clone ( ) ) ) ;
69+ let xr = circuit. extend ( Fq :: sub ( m2. clone ( ) , sd. clone ( ) ) ) ;
70+ let sxr = circuit. extend ( Fq :: sub ( s. clone ( ) , xr. clone ( ) ) ) ;
71+ let msxr = circuit. extend ( Fq :: mul ( m. clone ( ) , sxr. clone ( ) ) ) ;
72+ let td = circuit. extend ( Fq :: double ( t. clone ( ) ) ) ;
73+ let tdd = circuit. extend ( Fq :: double ( td. clone ( ) ) ) ;
74+ let tddd = circuit. extend ( Fq :: double ( tdd. clone ( ) ) ) ;
75+ let yr = circuit. extend ( Fq :: sub ( msxr. clone ( ) , tddd. clone ( ) ) ) ;
76+ let yz = circuit. extend ( Fq :: mul ( y. clone ( ) , z. clone ( ) ) ) ;
77+ let zr = circuit. extend ( Fq :: double ( yz. clone ( ) ) ) ;
78+
79+ circuit. add_wires ( xr) ;
80+ circuit. add_wires ( yr) ;
81+ circuit. add_wires ( zr) ;
3682
3783 circuit
3884 }
0 commit comments