You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

615 lines
23 KiB

  1. #![macro_use]
  2. extern crate ark_relations;
  3. pub mod fields {
  4. use ark_ff::{BitIteratorLE, Field, PrimeField, UniformRand};
  5. use ark_r1cs_std::prelude::*;
  6. use ark_relations::r1cs::{ConstraintSystem, SynthesisError};
  7. use ark_std::{test_rng, vec::Vec};
  8. pub fn field_test<F, ConstraintF, AF>() -> Result<(), SynthesisError>
  9. where
  10. F: Field,
  11. ConstraintF: PrimeField,
  12. AF: FieldVar<F, ConstraintF>,
  13. AF: TwoBitLookupGadget<ConstraintF, TableConstant = F>,
  14. for<'a> &'a AF: FieldOpsBounds<'a, F, AF>,
  15. {
  16. let modes = [
  17. AllocationMode::Input,
  18. AllocationMode::Witness,
  19. AllocationMode::Constant,
  20. ];
  21. for &mode in &modes {
  22. let cs = ConstraintSystem::<ConstraintF>::new_ref();
  23. let mut rng = test_rng();
  24. let a_native = F::rand(&mut rng);
  25. let b_native = F::rand(&mut rng);
  26. let a = AF::new_variable(ark_relations::ns!(cs, "generate_a"), || Ok(a_native), mode)?;
  27. let b = AF::new_variable(ark_relations::ns!(cs, "generate_b"), || Ok(b_native), mode)?;
  28. let b_const = AF::new_constant(ark_relations::ns!(cs, "b_as_constant"), b_native)?;
  29. let zero = AF::zero();
  30. let zero_native = zero.value()?;
  31. zero.enforce_equal(&zero)?;
  32. let one = AF::one();
  33. let one_native = one.value()?;
  34. one.enforce_equal(&one)?;
  35. one.enforce_not_equal(&zero)?;
  36. let one_dup = &zero + &one;
  37. one_dup.enforce_equal(&one)?;
  38. let two = &one + &one;
  39. two.enforce_equal(&two)?;
  40. two.enforce_equal(&one.double()?)?;
  41. two.enforce_not_equal(&one)?;
  42. two.enforce_not_equal(&zero)?;
  43. // a + 0 = a
  44. let a_plus_zero = &a + &zero;
  45. assert_eq!(a_plus_zero.value()?, a_native);
  46. a_plus_zero.enforce_equal(&a)?;
  47. a_plus_zero.enforce_not_equal(&a.double()?)?;
  48. // a - 0 = a
  49. let a_minus_zero = &a - &zero;
  50. assert_eq!(a_minus_zero.value()?, a_native);
  51. a_minus_zero.enforce_equal(&a)?;
  52. // a - a = 0
  53. let a_minus_a = &a - &a;
  54. assert_eq!(a_minus_a.value()?, zero_native);
  55. a_minus_a.enforce_equal(&zero)?;
  56. // a + b = b + a
  57. let a_b = &a + &b;
  58. let b_a = &b + &a;
  59. assert_eq!(a_b.value()?, a_native + &b_native);
  60. a_b.enforce_equal(&b_a)?;
  61. // (a + b) + a = a + (b + a)
  62. let ab_a = &a_b + &a;
  63. let a_ba = &a + &b_a;
  64. assert_eq!(ab_a.value()?, a_native + &b_native + &a_native);
  65. ab_a.enforce_equal(&a_ba)?;
  66. let b_times_a_plus_b = &a_b * &b;
  67. let b_times_b_plus_a = &b_a * &b;
  68. assert_eq!(
  69. b_times_a_plus_b.value()?,
  70. b_native * &(b_native + &a_native)
  71. );
  72. assert_eq!(
  73. b_times_a_plus_b.value()?,
  74. (b_native + &a_native) * &b_native
  75. );
  76. assert_eq!(
  77. b_times_a_plus_b.value()?,
  78. (a_native + &b_native) * &b_native
  79. );
  80. b_times_b_plus_a.enforce_equal(&b_times_a_plus_b)?;
  81. // a * 1 = a
  82. assert_eq!((&a * &one).value()?, a_native * &one_native);
  83. // a * b = b * a
  84. let ab = &a * &b;
  85. let ba = &b * &a;
  86. assert_eq!(ab.value()?, ba.value()?);
  87. assert_eq!(ab.value()?, a_native * &b_native);
  88. let ab_const = &a * &b_const;
  89. let b_const_a = &b_const * &a;
  90. assert_eq!(ab_const.value()?, b_const_a.value()?);
  91. assert_eq!(ab_const.value()?, ab.value()?);
  92. assert_eq!(ab_const.value()?, a_native * &b_native);
  93. // (a * b) * a = a * (b * a)
  94. let ab_a = &ab * &a;
  95. let a_ba = &a * &ba;
  96. assert_eq!(ab_a.value()?, a_ba.value()?);
  97. assert_eq!(ab_a.value()?, a_native * &b_native * &a_native);
  98. let aa = &a * &a;
  99. let a_squared = a.square()?;
  100. a_squared.enforce_equal(&aa)?;
  101. assert_eq!(aa.value()?, a_squared.value()?);
  102. assert_eq!(aa.value()?, a_native.square());
  103. let aa = &a * a_native;
  104. a_squared.enforce_equal(&aa)?;
  105. assert_eq!(aa.value()?, a_squared.value()?);
  106. assert_eq!(aa.value()?, a_native.square());
  107. let a_b2 = &a + b_native;
  108. a_b.enforce_equal(&a_b2)?;
  109. assert_eq!(a_b.value()?, a_b2.value()?);
  110. let a_inv = a.inverse()?;
  111. a_inv.mul_equals(&a, &one)?;
  112. assert_eq!(a_inv.value()?, a.value()?.inverse().unwrap());
  113. assert_eq!(a_inv.value()?, a_native.inverse().unwrap());
  114. let a_b_inv = a.mul_by_inverse(&b)?;
  115. a_b_inv.mul_equals(&b, &a)?;
  116. assert_eq!(a_b_inv.value()?, a_native * b_native.inverse().unwrap());
  117. // a * a * a = a^3
  118. let bits = BitIteratorLE::without_trailing_zeros([3u64])
  119. .map(Boolean::constant)
  120. .collect::<Vec<_>>();
  121. assert_eq!(a_native.pow([0x3]), a.pow_le(&bits)?.value()?);
  122. // a * a * a = a^3
  123. assert_eq!(a_native.pow([0x3]), a.pow_by_constant(&[0x3])?.value()?);
  124. assert!(cs.is_satisfied().unwrap());
  125. let mut constants = [F::zero(); 4];
  126. for c in &mut constants {
  127. *c = UniformRand::rand(&mut test_rng());
  128. }
  129. let bits = [
  130. Boolean::<ConstraintF>::constant(false),
  131. Boolean::constant(true),
  132. ];
  133. let lookup_result = AF::two_bit_lookup(&bits, constants.as_ref())?;
  134. assert_eq!(lookup_result.value()?, constants[2]);
  135. assert!(cs.is_satisfied().unwrap());
  136. let f = F::from(1u128 << 64);
  137. let f_bits = ark_ff::BitIteratorLE::new(&[0u64, 1u64]).collect::<Vec<_>>();
  138. let fv = AF::new_variable(ark_relations::ns!(cs, "alloc u128"), || Ok(f), mode)?;
  139. assert_eq!(fv.to_bits_le()?.value().unwrap()[..128], f_bits[..128]);
  140. assert!(cs.is_satisfied().unwrap());
  141. let r_native: F = UniformRand::rand(&mut test_rng());
  142. let r = AF::new_variable(ark_relations::ns!(cs, "r_native"), || Ok(r_native), mode)
  143. .unwrap();
  144. let _ = r.to_non_unique_bits_le()?;
  145. assert!(cs.is_satisfied().unwrap());
  146. let _ = r.to_bits_le()?;
  147. assert!(cs.is_satisfied().unwrap());
  148. let ab_false = &a + (AF::from(Boolean::Constant(false)) * b_native);
  149. let ab_true = &a + (AF::from(Boolean::Constant(true)) * b_native);
  150. assert_eq!(ab_false.value()?, a_native);
  151. assert_eq!(ab_true.value()?, a_native + &b_native);
  152. if !cs.is_satisfied().unwrap() {
  153. panic!(
  154. "Unsatisfied in mode {:?}.\n{:?}",
  155. mode,
  156. cs.which_is_unsatisfied().unwrap()
  157. );
  158. }
  159. assert!(cs.is_satisfied().unwrap());
  160. }
  161. Ok(())
  162. }
  163. pub fn frobenius_tests<F: Field, ConstraintF, AF>(maxpower: usize) -> Result<(), SynthesisError>
  164. where
  165. F: Field,
  166. ConstraintF: Field,
  167. AF: FieldVar<F, ConstraintF>,
  168. for<'a> &'a AF: FieldOpsBounds<'a, F, AF>,
  169. {
  170. let modes = [
  171. AllocationMode::Input,
  172. AllocationMode::Witness,
  173. AllocationMode::Constant,
  174. ];
  175. for &mode in &modes {
  176. let cs = ConstraintSystem::<ConstraintF>::new_ref();
  177. let mut rng = test_rng();
  178. for i in 0..=maxpower {
  179. let mut a = F::rand(&mut rng);
  180. let mut a_gadget = AF::new_variable(ark_relations::ns!(cs, "a"), || Ok(a), mode)?;
  181. a_gadget.frobenius_map_in_place(i)?;
  182. a.frobenius_map(i);
  183. assert_eq!(a_gadget.value()?, a);
  184. }
  185. assert!(cs.is_satisfied().unwrap());
  186. }
  187. Ok(())
  188. }
  189. }
  190. pub mod curves {
  191. use ark_ec::{
  192. short_weierstrass::Projective as SWProjective, twisted_edwards::Projective as TEProjective,
  193. CurveGroup, Group,
  194. };
  195. use ark_ff::{BitIteratorLE, Field, One, PrimeField};
  196. use ark_relations::r1cs::{ConstraintSystem, SynthesisError};
  197. use ark_std::{test_rng, vec::Vec, UniformRand};
  198. use ark_r1cs_std::prelude::*;
  199. pub fn group_test<C, ConstraintF, GG>() -> Result<(), SynthesisError>
  200. where
  201. C: CurveGroup,
  202. ConstraintF: Field,
  203. GG: CurveVar<C, ConstraintF>,
  204. for<'a> &'a GG: GroupOpsBounds<'a, C, GG>,
  205. {
  206. let modes = [
  207. AllocationMode::Input,
  208. AllocationMode::Witness,
  209. AllocationMode::Constant,
  210. ];
  211. for &mode in &modes {
  212. let cs = ConstraintSystem::<ConstraintF>::new_ref();
  213. let mut rng = test_rng();
  214. let a_native = C::rand(&mut rng);
  215. let b_native = C::rand(&mut rng);
  216. let a = GG::new_variable(ark_relations::ns!(cs, "generate_a"), || Ok(a_native), mode)
  217. .unwrap();
  218. let b = GG::new_variable(ark_relations::ns!(cs, "generate_b"), || Ok(b_native), mode)
  219. .unwrap();
  220. let zero = GG::zero();
  221. assert_eq!(zero.value()?, zero.value()?);
  222. // a == a
  223. assert_eq!(a.value()?, a.value()?);
  224. // a + 0 = a
  225. assert_eq!((&a + &zero).value()?, a.value()?);
  226. // a - 0 = a
  227. assert_eq!((&a - &zero).value()?, a.value()?);
  228. // a - a = 0
  229. assert_eq!((&a - &a).value()?, zero.value()?);
  230. // a + b = b + a
  231. let a_b = &a + &b;
  232. let b_a = &b + &a;
  233. assert_eq!(a_b.value()?, b_a.value()?);
  234. a_b.enforce_equal(&b_a)?;
  235. assert!(cs.is_satisfied().unwrap());
  236. // (a + b) + a = a + (b + a)
  237. let ab_a = &a_b + &a;
  238. let a_ba = &a + &b_a;
  239. assert_eq!(ab_a.value()?, a_ba.value()?);
  240. ab_a.enforce_equal(&a_ba)?;
  241. assert!(cs.is_satisfied().unwrap());
  242. // a.double() = a + a
  243. let a_a = &a + &a;
  244. let mut a2 = a.clone();
  245. a2.double_in_place()?;
  246. a2.enforce_equal(&a_a)?;
  247. assert_eq!(a2.value()?, a_native.double());
  248. assert_eq!(a_a.value()?, a_native.double());
  249. assert_eq!(a2.value()?, a_a.value()?);
  250. assert!(cs.is_satisfied().unwrap());
  251. // b.double() = b + b
  252. let mut b2 = b.clone();
  253. b2.double_in_place()?;
  254. let b_b = &b + &b;
  255. b2.enforce_equal(&b_b)?;
  256. assert!(cs.is_satisfied().unwrap());
  257. assert_eq!(b2.value()?, b_b.value()?);
  258. let _ = a.to_bytes()?;
  259. assert!(cs.is_satisfied().unwrap());
  260. let _ = a.to_non_unique_bytes()?;
  261. assert!(cs.is_satisfied().unwrap());
  262. let _ = b.to_bytes()?;
  263. let _ = b.to_non_unique_bytes()?;
  264. if !cs.is_satisfied().unwrap() {
  265. panic!(
  266. "Unsatisfied in mode {:?}.\n{:?}",
  267. mode,
  268. cs.which_is_unsatisfied().unwrap()
  269. );
  270. }
  271. assert!(cs.is_satisfied().unwrap());
  272. let modulus = <C::ScalarField as PrimeField>::MODULUS.as_ref().to_vec();
  273. let mut max = modulus.clone();
  274. for limb in &mut max {
  275. *limb = u64::MAX;
  276. }
  277. let modulus_last_limb_bits = <C::ScalarField as PrimeField>::MODULUS_BIT_SIZE % 64;
  278. *max.last_mut().unwrap() >>= 64 - modulus_last_limb_bits;
  279. let scalars = [
  280. C::ScalarField::rand(&mut rng)
  281. .into_bigint()
  282. .as_ref()
  283. .to_vec(),
  284. vec![u64::rand(&mut rng)],
  285. (-C::ScalarField::one()).into_bigint().as_ref().to_vec(),
  286. <C::ScalarField as PrimeField>::MODULUS.as_ref().to_vec(),
  287. max,
  288. vec![0; 50],
  289. vec![1000012341233u64; 36],
  290. ];
  291. let mut input = vec![];
  292. // Check scalar mul with edge cases
  293. for scalar in scalars.iter() {
  294. let native_result = a_native.mul_bigint(scalar);
  295. let native_result = native_result.into_affine();
  296. let scalar_bits: Vec<bool> = BitIteratorLE::new(&scalar).collect();
  297. input =
  298. Vec::new_witness(ark_relations::ns!(cs, "bits"), || Ok(scalar_bits)).unwrap();
  299. let result = a
  300. .scalar_mul_le(input.iter())
  301. .expect(&format!("Mode: {:?}", mode));
  302. let result_val = result.value()?.into_affine();
  303. assert_eq!(
  304. result_val, native_result,
  305. "gadget & native values are diff. after scalar mul {:?}",
  306. scalar,
  307. );
  308. assert!(cs.is_satisfied().unwrap());
  309. }
  310. let result = zero.scalar_mul_le(input.iter())?;
  311. let result_val = result.value()?.into_affine();
  312. result.enforce_equal(&zero)?;
  313. assert_eq!(
  314. result_val,
  315. C::zero().into_affine(),
  316. "gadget & native values are diff. after scalar mul of zero"
  317. );
  318. assert!(cs.is_satisfied().unwrap());
  319. }
  320. Ok(())
  321. }
  322. pub fn sw_test<P, GG>() -> Result<(), SynthesisError>
  323. where
  324. P: ark_ec::models::short_weierstrass::SWCurveConfig,
  325. GG: CurveVar<SWProjective<P>, <P::BaseField as Field>::BasePrimeField>,
  326. for<'a> &'a GG: GroupOpsBounds<'a, SWProjective<P>, GG>,
  327. {
  328. group_test::<SWProjective<P>, _, GG>()?;
  329. let modes = [
  330. AllocationMode::Input,
  331. AllocationMode::Witness,
  332. AllocationMode::Constant,
  333. ];
  334. for &mode in &modes {
  335. let mut rng = test_rng();
  336. let cs = ConstraintSystem::<<P::BaseField as Field>::BasePrimeField>::new_ref();
  337. let a = SWProjective::<P>::rand(&mut rng);
  338. let b = SWProjective::<P>::rand(&mut rng);
  339. let a_affine = a.into_affine();
  340. let b_affine = b.into_affine();
  341. let ns = ark_relations::ns!(cs, "allocating variables");
  342. let mut gadget_a = GG::new_variable(cs.clone(), || Ok(a), mode)?;
  343. let gadget_b = GG::new_variable(cs.clone(), || Ok(b), mode)?;
  344. let zero = GG::zero();
  345. drop(ns);
  346. assert_eq!(gadget_a.value()?.into_affine().x, a_affine.x);
  347. assert_eq!(gadget_a.value()?.into_affine().y, a_affine.y);
  348. assert_eq!(gadget_b.value()?.into_affine().x, b_affine.x);
  349. assert_eq!(gadget_b.value()?.into_affine().y, b_affine.y);
  350. assert_eq!(cs.which_is_unsatisfied().unwrap(), None);
  351. // Check addition
  352. let ab = a + &b;
  353. let ab_affine = ab.into_affine();
  354. let gadget_ab = &gadget_a + &gadget_b;
  355. let gadget_ba = &gadget_b + &gadget_a;
  356. gadget_ba.enforce_equal(&gadget_ab)?;
  357. let ab_val = gadget_ab.value()?.into_affine();
  358. assert_eq!(ab_val, ab_affine, "Result of addition is unequal");
  359. assert!(cs.is_satisfied().unwrap());
  360. let gadget_a_zero = &gadget_a + &zero;
  361. gadget_a_zero.enforce_equal(&gadget_a)?;
  362. // Check doubling
  363. let aa = &a.double();
  364. let aa_affine = aa.into_affine();
  365. gadget_a.double_in_place()?;
  366. let aa_val = gadget_a.value()?.into_affine();
  367. assert_eq!(
  368. aa_val, aa_affine,
  369. "Gadget and native values are unequal after double."
  370. );
  371. assert!(cs.is_satisfied().unwrap());
  372. if !cs.is_satisfied().unwrap() {
  373. panic!(
  374. "Unsatisfied in mode {:?}.\n{:?}",
  375. mode,
  376. cs.which_is_unsatisfied().unwrap()
  377. );
  378. }
  379. assert!(cs.is_satisfied().unwrap());
  380. }
  381. Ok(())
  382. }
  383. pub fn te_test<P, GG>() -> Result<(), SynthesisError>
  384. where
  385. P: ark_ec::twisted_edwards::TECurveConfig,
  386. GG: CurveVar<TEProjective<P>, <P::BaseField as Field>::BasePrimeField>,
  387. for<'a> &'a GG: GroupOpsBounds<'a, TEProjective<P>, GG>,
  388. {
  389. group_test::<TEProjective<P>, _, GG>()?;
  390. let modes = [
  391. AllocationMode::Input,
  392. AllocationMode::Witness,
  393. AllocationMode::Constant,
  394. ];
  395. for &mode in &modes {
  396. let mut rng = test_rng();
  397. let cs = ConstraintSystem::<<P::BaseField as Field>::BasePrimeField>::new_ref();
  398. let a = TEProjective::<P>::rand(&mut rng);
  399. let b = TEProjective::<P>::rand(&mut rng);
  400. let a_affine = a.into_affine();
  401. let b_affine = b.into_affine();
  402. let ns = ark_relations::ns!(cs, "allocating variables");
  403. let mut gadget_a = GG::new_variable(cs.clone(), || Ok(a), mode)?;
  404. let gadget_b = GG::new_variable(cs.clone(), || Ok(b), mode)?;
  405. drop(ns);
  406. assert_eq!(gadget_a.value()?.into_affine().x, a_affine.x);
  407. assert_eq!(gadget_a.value()?.into_affine().y, a_affine.y);
  408. assert_eq!(gadget_b.value()?.into_affine().x, b_affine.x);
  409. assert_eq!(gadget_b.value()?.into_affine().y, b_affine.y);
  410. assert_eq!(cs.which_is_unsatisfied()?, None);
  411. // Check addition
  412. let ab = a + &b;
  413. let ab_affine = ab.into_affine();
  414. let gadget_ab = &gadget_a + &gadget_b;
  415. let gadget_ba = &gadget_b + &gadget_a;
  416. gadget_ba.enforce_equal(&gadget_ab)?;
  417. let ab_val = gadget_ab.value()?.into_affine();
  418. assert_eq!(ab_val, ab_affine, "Result of addition is unequal");
  419. assert!(cs.is_satisfied().unwrap());
  420. // Check doubling
  421. let aa = &a.double();
  422. let aa_affine = aa.into_affine();
  423. gadget_a.double_in_place()?;
  424. let aa_val = gadget_a.value()?.into_affine();
  425. assert_eq!(
  426. aa_val, aa_affine,
  427. "Gadget and native values are unequal after double."
  428. );
  429. assert!(cs.is_satisfied().unwrap());
  430. if !cs.is_satisfied().unwrap() {
  431. panic!(
  432. "Unsatisfied in mode {:?}.\n{:?}",
  433. mode,
  434. cs.which_is_unsatisfied().unwrap()
  435. );
  436. }
  437. assert!(cs.is_satisfied().unwrap());
  438. }
  439. Ok(())
  440. }
  441. }
  442. pub mod pairing {
  443. use ark_ec::{
  444. pairing::{Pairing, PairingOutput},
  445. CurveGroup,
  446. };
  447. use ark_ff::{BitIteratorLE, Field, PrimeField};
  448. use ark_r1cs_std::prelude::*;
  449. use ark_relations::r1cs::{ConstraintSystem, SynthesisError};
  450. use ark_std::{test_rng, vec::Vec, UniformRand};
  451. #[allow(dead_code)]
  452. pub fn bilinearity_test<E: Pairing, P: PairingVar<E>>() -> Result<(), SynthesisError>
  453. where
  454. for<'a> &'a P::G1Var: GroupOpsBounds<'a, E::G1, P::G1Var>,
  455. for<'a> &'a P::G2Var: GroupOpsBounds<'a, E::G2, P::G2Var>,
  456. for<'a> &'a P::GTVar: FieldOpsBounds<'a, E::TargetField, P::GTVar>,
  457. {
  458. let modes = [
  459. AllocationMode::Input,
  460. AllocationMode::Witness,
  461. AllocationMode::Constant,
  462. ];
  463. for &mode in &modes {
  464. let cs = ConstraintSystem::<<E::G1 as CurveGroup>::BaseField>::new_ref();
  465. let mut rng = test_rng();
  466. let a = E::G1::rand(&mut rng);
  467. let b = E::G2::rand(&mut rng);
  468. let s = E::ScalarField::rand(&mut rng);
  469. let mut sa = a;
  470. sa *= s;
  471. let mut sb = b;
  472. sb *= s;
  473. let a_g = P::G1Var::new_variable(cs.clone(), || Ok(a.into_affine()), mode)?;
  474. let b_g = P::G2Var::new_variable(cs.clone(), || Ok(b.into_affine()), mode)?;
  475. let sa_g = P::G1Var::new_variable(cs.clone(), || Ok(sa.into_affine()), mode)?;
  476. let sb_g = P::G2Var::new_variable(cs.clone(), || Ok(sb.into_affine()), mode)?;
  477. let mut _preparation_num_constraints = cs.num_constraints();
  478. let a_prep_g = P::prepare_g1(&a_g)?;
  479. let b_prep_g = P::prepare_g2(&b_g)?;
  480. _preparation_num_constraints = cs.num_constraints() - _preparation_num_constraints;
  481. let sa_prep_g = P::prepare_g1(&sa_g)?;
  482. let sb_prep_g = P::prepare_g2(&sb_g)?;
  483. let (ans1_g, ans1_n) = {
  484. let _ml_constraints = cs.num_constraints();
  485. let ml_g = P::miller_loop(&[sa_prep_g], &[b_prep_g.clone()])?;
  486. let _fe_constraints = cs.num_constraints();
  487. let ans_g = P::final_exponentiation(&ml_g)?;
  488. let ans_n = E::pairing(sa, b);
  489. (ans_g, ans_n)
  490. };
  491. let (ans2_g, ans2_n) = {
  492. let ans_g = P::pairing(a_prep_g.clone(), sb_prep_g)?;
  493. let ans_n = E::pairing(a, sb);
  494. (ans_g, ans_n)
  495. };
  496. let (ans3_g, ans3_n) = {
  497. let s_iter = BitIteratorLE::without_trailing_zeros(s.into_bigint())
  498. .map(Boolean::constant)
  499. .collect::<Vec<_>>();
  500. let mut ans_g = P::pairing(a_prep_g, b_prep_g)?;
  501. let mut ans_n = E::pairing(a, b);
  502. ans_n = PairingOutput(ans_n.0.pow(s.into_bigint()));
  503. ans_g = ans_g.pow_le(&s_iter)?;
  504. (ans_g, ans_n)
  505. };
  506. ans1_g.enforce_equal(&ans2_g)?;
  507. ans2_g.enforce_equal(&ans3_g)?;
  508. assert_eq!(ans1_g.value()?, ans1_n.0, "Failed native test 1");
  509. assert_eq!(ans2_g.value()?, ans2_n.0, "Failed native test 2");
  510. assert_eq!(ans3_g.value()?, ans3_n.0, "Failed native test 3");
  511. assert_eq!(ans1_n.0, ans2_n.0, "Failed ans1_native == ans2_native");
  512. assert_eq!(ans2_n.0, ans3_n.0, "Failed ans2_native == ans3_native");
  513. assert_eq!(ans1_g.value()?, ans3_g.value()?, "Failed ans1 == ans3");
  514. assert_eq!(ans1_g.value()?, ans2_g.value()?, "Failed ans1 == ans2");
  515. assert_eq!(ans2_g.value()?, ans3_g.value()?, "Failed ans2 == ans3");
  516. if !cs.is_satisfied().unwrap() {
  517. panic!(
  518. "Unsatisfied in mode {:?}.\n{:?}",
  519. mode,
  520. cs.which_is_unsatisfied().unwrap()
  521. );
  522. }
  523. assert!(cs.is_satisfied().unwrap(), "cs is not satisfied");
  524. }
  525. Ok(())
  526. }
  527. }