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.

130 lines
3.2 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. #![allow(unused_imports)]
  2. use crate::{
  3. g1, g2, Bls12_377, Fq, Fq12, Fq2, Fr, G1Affine, G1Projective, G1TEProjective, G2Affine,
  4. G2Projective,
  5. };
  6. use ark_ec::{
  7. models::SWModelParameters, short_weierstrass_jacobian, AffineCurve, PairingEngine,
  8. ProjectiveCurve,
  9. };
  10. use ark_ff::{
  11. fields::{Field, FpParameters, PrimeField, SquareRootField},
  12. One, Zero,
  13. };
  14. use ark_serialize::CanonicalSerialize;
  15. use ark_std::{rand::Rng, test_rng};
  16. use core::ops::{AddAssign, MulAssign};
  17. use ark_algebra_test_templates::{
  18. curves::{curve_tests, edwards_tests, sw_tests},
  19. groups::group_test,
  20. };
  21. #[test]
  22. fn test_g1_projective_curve() {
  23. curve_tests::<G1Projective>();
  24. sw_tests::<g1::Parameters>();
  25. edwards_tests::<g1::Parameters>();
  26. }
  27. #[test]
  28. fn test_g1_projective_group() {
  29. let mut rng = test_rng();
  30. let a: G1Projective = rng.gen();
  31. let b: G1Projective = rng.gen();
  32. group_test(a, b);
  33. let c = rng.gen();
  34. let d = rng.gen();
  35. group_test::<G1TEProjective>(c, d);
  36. }
  37. #[test]
  38. fn test_g1_generator() {
  39. let generator = G1Affine::prime_subgroup_generator();
  40. assert!(generator.is_on_curve());
  41. assert!(generator.is_in_correct_subgroup_assuming_on_curve());
  42. }
  43. #[test]
  44. fn test_g2_projective_curve() {
  45. curve_tests::<G2Projective>();
  46. sw_tests::<g2::Parameters>();
  47. }
  48. #[test]
  49. fn test_g2_projective_group() {
  50. let mut rng = test_rng();
  51. let a: G2Projective = rng.gen();
  52. let b: G2Projective = rng.gen();
  53. group_test(a, b);
  54. }
  55. #[test]
  56. fn test_g2_generator() {
  57. let generator = G2Affine::prime_subgroup_generator();
  58. assert!(generator.is_on_curve());
  59. assert!(generator.is_in_correct_subgroup_assuming_on_curve());
  60. }
  61. #[test]
  62. fn test_bilinearity() {
  63. let mut rng = test_rng();
  64. let a: G1Projective = rng.gen();
  65. let b: G2Projective = rng.gen();
  66. let s: Fr = rng.gen();
  67. let mut sa = a;
  68. sa.mul_assign(s);
  69. let mut sb = b;
  70. sb.mul_assign(s);
  71. let ans1 = Bls12_377::pairing(sa, b);
  72. let ans2 = Bls12_377::pairing(a, sb);
  73. let ans3 = Bls12_377::pairing(a, b).pow(s.into_repr());
  74. assert_eq!(ans1, ans2);
  75. assert_eq!(ans2, ans3);
  76. assert_ne!(ans1, Fq12::one());
  77. assert_ne!(ans2, Fq12::one());
  78. assert_ne!(ans3, Fq12::one());
  79. assert_eq!(ans1.pow(Fr::characteristic()), Fq12::one());
  80. assert_eq!(ans2.pow(Fr::characteristic()), Fq12::one());
  81. assert_eq!(ans3.pow(Fr::characteristic()), Fq12::one());
  82. }
  83. #[test]
  84. fn test_g1_generator_raw() {
  85. let mut x = Fq::zero();
  86. let mut i = 0;
  87. loop {
  88. // y^2 = x^3 + b
  89. let mut rhs = x;
  90. rhs.square_in_place();
  91. rhs.mul_assign(&x);
  92. rhs.add_assign(&g1::Parameters::COEFF_B);
  93. if let Some(y) = rhs.sqrt() {
  94. let p = G1Affine::new(x, if y < -y { y } else { -y }, false);
  95. assert!(!p.is_in_correct_subgroup_assuming_on_curve());
  96. let g1 = p.scale_by_cofactor();
  97. if !g1.is_zero() {
  98. assert_eq!(i, 1);
  99. let g1 = G1Affine::from(g1);
  100. assert!(g1.is_in_correct_subgroup_assuming_on_curve());
  101. assert_eq!(g1, G1Affine::prime_subgroup_generator());
  102. break;
  103. }
  104. }
  105. i += 1;
  106. x.add_assign(&Fq::one());
  107. }
  108. }