pubscalars_or_and_vec.rs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #![allow(non_snake_case)]
  2. use curve25519_dalek::ristretto::RistrettoPoint as G;
  3. use group::ff::PrimeField;
  4. use group::Group;
  5. use sha2::Sha512;
  6. use sigma_compiler::*;
  7. fn pubscalars_or_vec_test_vecsize_val(
  8. vecsize: usize,
  9. b_val: u128,
  10. x_val: Option<u128>,
  11. ) -> Result<(), sigma_rs::errors::Error> {
  12. sigma_compiler! { proof,
  13. (vec x, vec y, pub vec a, pub vec b, rand vec r, rand vec s),
  14. (vec C, vec D, const cind A, const cind B),
  15. C = x*A + r*B,
  16. D = y*A + s*B,
  17. OR (
  18. AND (
  19. b = 2*a,
  20. x = 1,
  21. ),
  22. AND (
  23. b = 2*a - 3,
  24. x = y,
  25. )
  26. )
  27. }
  28. type Scalar = <G as Group>::Scalar;
  29. let mut rng = rand::thread_rng();
  30. let A = G::hash_from_bytes::<Sha512>(b"Generator A");
  31. let B = G::generator();
  32. let r: Vec<Scalar> = (0..vecsize).map(|_| Scalar::random(&mut rng)).collect();
  33. let s: Vec<Scalar> = (0..vecsize).map(|_| Scalar::random(&mut rng)).collect();
  34. let y: Vec<Scalar> = (0..vecsize).map(|i| Scalar::from_u128(i as u128)).collect();
  35. let x: Vec<Scalar> = (0..vecsize)
  36. .map(|i| {
  37. if let Some(xv) = x_val {
  38. Scalar::from_u128(xv)
  39. } else {
  40. y[i]
  41. }
  42. })
  43. .collect();
  44. let a: Vec<Scalar> = (0..vecsize)
  45. .map(|i| Scalar::from_u128((i + 12) as u128))
  46. .collect();
  47. let b: Vec<Scalar> = (0..vecsize)
  48. .map(|i| a[i] + a[i] - Scalar::from_u128(b_val))
  49. .collect();
  50. let C: Vec<G> = (0..vecsize).map(|i| x[i] * A + r[i] * B).collect();
  51. let D: Vec<G> = (0..vecsize).map(|i| y[i] * A + s[i] * B).collect();
  52. let instance = proof::Instance { C, D, A, B, a, b };
  53. let witness = proof::Witness { x, y, r, s };
  54. let proof = proof::prove(&instance, &witness, b"pubscalars_vec_test", &mut rng)?;
  55. proof::verify(&instance, &proof, b"pubscalars_vec_test")
  56. }
  57. fn pubscalars_or_vec_emptyvec() {
  58. pubscalars_or_vec_test_vecsize_val(0, 0, Some(0)).unwrap();
  59. pubscalars_or_vec_test_vecsize_val(0, 1, Some(0)).unwrap();
  60. pubscalars_or_vec_test_vecsize_val(0, 2, Some(0)).unwrap();
  61. pubscalars_or_vec_test_vecsize_val(0, 3, Some(0)).unwrap();
  62. pubscalars_or_vec_test_vecsize_val(0, 4, Some(0)).unwrap();
  63. pubscalars_or_vec_test_vecsize_val(0, 0, Some(1)).unwrap();
  64. pubscalars_or_vec_test_vecsize_val(0, 1, Some(1)).unwrap();
  65. pubscalars_or_vec_test_vecsize_val(0, 2, Some(1)).unwrap();
  66. pubscalars_or_vec_test_vecsize_val(0, 3, Some(1)).unwrap();
  67. pubscalars_or_vec_test_vecsize_val(0, 4, Some(1)).unwrap();
  68. pubscalars_or_vec_test_vecsize_val(0, 0, None).unwrap();
  69. pubscalars_or_vec_test_vecsize_val(0, 1, None).unwrap();
  70. pubscalars_or_vec_test_vecsize_val(0, 2, None).unwrap();
  71. pubscalars_or_vec_test_vecsize_val(0, 3, None).unwrap();
  72. pubscalars_or_vec_test_vecsize_val(0, 4, None).unwrap();
  73. }
  74. fn pubscalars_or_vec_vecsize(vecsize: usize) {
  75. pubscalars_or_vec_test_vecsize_val(vecsize, 0, Some(0)).unwrap_err();
  76. pubscalars_or_vec_test_vecsize_val(vecsize, 1, Some(0)).unwrap_err();
  77. pubscalars_or_vec_test_vecsize_val(vecsize, 2, Some(0)).unwrap_err();
  78. if vecsize == 1 {
  79. pubscalars_or_vec_test_vecsize_val(vecsize, 3, Some(0)).unwrap();
  80. } else {
  81. pubscalars_or_vec_test_vecsize_val(vecsize, 3, Some(0)).unwrap_err();
  82. }
  83. pubscalars_or_vec_test_vecsize_val(vecsize, 4, Some(0)).unwrap_err();
  84. pubscalars_or_vec_test_vecsize_val(vecsize, 0, Some(1)).unwrap();
  85. pubscalars_or_vec_test_vecsize_val(vecsize, 1, Some(1)).unwrap_err();
  86. pubscalars_or_vec_test_vecsize_val(vecsize, 2, Some(1)).unwrap_err();
  87. pubscalars_or_vec_test_vecsize_val(vecsize, 3, Some(1)).unwrap_err();
  88. pubscalars_or_vec_test_vecsize_val(vecsize, 4, Some(1)).unwrap_err();
  89. pubscalars_or_vec_test_vecsize_val(vecsize, 0, None).unwrap_err();
  90. pubscalars_or_vec_test_vecsize_val(vecsize, 1, None).unwrap_err();
  91. pubscalars_or_vec_test_vecsize_val(vecsize, 2, None).unwrap_err();
  92. pubscalars_or_vec_test_vecsize_val(vecsize, 3, None).unwrap();
  93. pubscalars_or_vec_test_vecsize_val(vecsize, 4, None).unwrap_err();
  94. }
  95. #[test]
  96. fn pubscalars_or_and_vec_0_test() {
  97. pubscalars_or_vec_emptyvec();
  98. }
  99. #[test]
  100. fn pubscalars_or_and_vec_1_test() {
  101. pubscalars_or_vec_vecsize(1);
  102. }
  103. #[test]
  104. fn pubscalars_or_and_vec_2_test() {
  105. pubscalars_or_vec_vecsize(2);
  106. }
  107. #[test]
  108. fn pubscalars_or_and_vec_3_test() {
  109. pubscalars_or_vec_vecsize(3);
  110. }