| 135 | |
| 136 | #[test] |
| 137 | fn basic() { |
| 138 | let mut rng = OsRng::default(); |
| 139 | let g1 = G1Affine::rand(&mut rng); |
| 140 | let g2 = G1Affine::rand(&mut rng); |
| 141 | let g3 = G1Affine::rand(&mut rng); |
| 142 | let h1 = G1Affine::rand(&mut rng); |
| 143 | let h2 = G1Affine::rand(&mut rng); |
| 144 | let h3 = G1Affine::rand(&mut rng); |
| 145 | |
| 146 | let a1 = Fr::rand(&mut rng); |
| 147 | let a2 = Fr::rand(&mut rng); |
| 148 | let a3 = Fr::rand(&mut rng); |
| 149 | let a4 = Fr::rand(&mut rng); |
| 150 | let a5 = Fr::rand(&mut rng); |
| 151 | let a6 = Fr::rand(&mut rng); |
| 152 | |
| 153 | let c1 = (g1 * a1).into_affine(); |
| 154 | let c2 = (g1 * a2).into_affine(); |
| 155 | let c3 = (g1 * a3).into_affine(); |
| 156 | |
| 157 | let mut checker = RandomizedMultChecker::new_using_rng(&mut rng); |
| 158 | checker.add_1(g1, &a1, c1); |
| 159 | checker.add_1(g1, &a2, c2); |
| 160 | checker.add_1(g1, &a3, c3); |
| 161 | assert!(checker.verify()); |
| 162 | |
| 163 | // Checking if g1 * a2 == c3 fails |
| 164 | let mut checker = RandomizedMultChecker::new_using_rng(&mut rng); |
| 165 | checker.add_1(g1, &a1, c1); |
| 166 | checker.add_1(g1, &a2, c2); // this is invalid |
| 167 | checker.add_1(g1, &a2, c3); |
| 168 | assert!(!checker.verify()); |
| 169 | |
| 170 | let c1 = (g1 * a1).into_affine(); |
| 171 | let c2 = (g2 * a2).into_affine(); |
| 172 | let c3 = (g3 * a3).into_affine(); |
| 173 | |
| 174 | let mut checker = RandomizedMultChecker::new_using_rng(&mut rng); |
| 175 | checker.add_1(g1, &a1, c1); |
| 176 | checker.add_1(g2, &a2, c2); |
| 177 | checker.add_1(g3, &a3, c3); |
| 178 | assert!(checker.verify()); |
| 179 | |
| 180 | // Checking if g2 * a3 == c3 fails |
| 181 | let mut checker = RandomizedMultChecker::new_using_rng(&mut rng); |
| 182 | checker.add_1(g1, &a1, c1); |
| 183 | checker.add_1(g2, &a2, c2); // this is invalid |
| 184 | checker.add_1(g2, &a3, c3); |
| 185 | assert!(!checker.verify()); |
| 186 | |
| 187 | let c1 = (g1 * a1 + h1 * a4).into_affine(); |
| 188 | let c2 = (g1 * a2 + h1 * a5).into_affine(); |
| 189 | let c3 = (g1 * a3 + h1 * a6).into_affine(); |
| 190 | |
| 191 | let mut checker = RandomizedMultChecker::new_using_rng(&mut rng); |
| 192 | checker.add_2(g1, &a1, h1, &a4, c1); |
| 193 | checker.add_2(g1, &a2, h1, &a5, c2); |
| 194 | checker.add_2(g1, &a3, h1, &a6, c3); |