pubscalars_or_and_vec.rs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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_vecsize(vecsize: usize) {
  58. pubscalars_or_vec_test_vecsize_val(vecsize, 0, Some(0)).unwrap_err();
  59. pubscalars_or_vec_test_vecsize_val(vecsize, 1, Some(0)).unwrap_err();
  60. pubscalars_or_vec_test_vecsize_val(vecsize, 2, Some(0)).unwrap_err();
  61. if vecsize == 1 {
  62. pubscalars_or_vec_test_vecsize_val(vecsize, 3, Some(0)).unwrap();
  63. } else {
  64. pubscalars_or_vec_test_vecsize_val(vecsize, 3, Some(0)).unwrap_err();
  65. }
  66. pubscalars_or_vec_test_vecsize_val(vecsize, 4, Some(0)).unwrap_err();
  67. pubscalars_or_vec_test_vecsize_val(vecsize, 0, Some(1)).unwrap();
  68. pubscalars_or_vec_test_vecsize_val(vecsize, 1, Some(1)).unwrap_err();
  69. pubscalars_or_vec_test_vecsize_val(vecsize, 2, Some(1)).unwrap_err();
  70. pubscalars_or_vec_test_vecsize_val(vecsize, 3, Some(1)).unwrap_err();
  71. pubscalars_or_vec_test_vecsize_val(vecsize, 4, Some(1)).unwrap_err();
  72. pubscalars_or_vec_test_vecsize_val(vecsize, 0, None).unwrap_err();
  73. pubscalars_or_vec_test_vecsize_val(vecsize, 1, None).unwrap_err();
  74. pubscalars_or_vec_test_vecsize_val(vecsize, 2, None).unwrap_err();
  75. pubscalars_or_vec_test_vecsize_val(vecsize, 3, None).unwrap();
  76. pubscalars_or_vec_test_vecsize_val(vecsize, 4, None).unwrap_err();
  77. }
  78. #[test]
  79. fn pubscalars_or_and_vec_0_test() {
  80. pubscalars_or_vec_vecsize(0);
  81. }
  82. #[test]
  83. fn pubscalars_or_and_vec_1_test() {
  84. pubscalars_or_vec_vecsize(1);
  85. }
  86. #[test]
  87. fn pubscalars_or_and_vec_2_test() {
  88. pubscalars_or_vec_vecsize(2);
  89. }
  90. #[test]
  91. fn pubscalars_or_and_vec_3_test() {
  92. pubscalars_or_vec_vecsize(3);
  93. }