left_expr.rs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. #[test]
  8. fn left_expr_test() -> Result<(), Box<dyn std::error::Error>> {
  9. sigma_compiler! { proof,
  10. (x, y, pub a, rand r, rand s),
  11. (C, D, const cind A, const cind B),
  12. D = y*A + s*B,
  13. (2*a-1)*C + D = x*A + r*B,
  14. }
  15. type Scalar = <G as Group>::Scalar;
  16. let mut rng = rand::thread_rng();
  17. let A = G::hash_from_bytes::<Sha512>(b"Generator A");
  18. let B = G::generator();
  19. let r = Scalar::random(&mut rng);
  20. let s = Scalar::random(&mut rng);
  21. let a = Scalar::from_u128(9);
  22. let x = Scalar::from_u128(5);
  23. let y = Scalar::from_u128(12);
  24. let D = y * A + s * B;
  25. let C = (x * A + r * B - D) * (a + a - Scalar::ONE).invert();
  26. let instance = proof::Instance { C, D, A, B, a };
  27. let witness = proof::Witness { x, y, r, s };
  28. let proof = proof::prove(&instance, &witness, b"left_expr_test", &mut rng)?;
  29. Ok(proof::verify(&instance, &proof, b"left_expr_test")?)
  30. }
  31. #[test]
  32. fn left_expr_vec_test() -> Result<(), Box<dyn std::error::Error>> {
  33. sigma_compiler! { proof,
  34. (vec x, vec y, z, pub vec a, pub b, rand vec r, rand vec s, rand t),
  35. (vec C, vec D, E, const cind A, const cind B),
  36. E = z*A + t*B,
  37. D = y*A + s*B,
  38. (2*a-1)*C + b*D + E = x*A + r*B,
  39. }
  40. type Scalar = <G as Group>::Scalar;
  41. let mut rng = rand::thread_rng();
  42. let A = G::hash_from_bytes::<Sha512>(b"Generator A");
  43. let B = G::generator();
  44. let vlen = 5usize;
  45. let r: Vec<Scalar> = (0..vlen).map(|_| Scalar::random(&mut rng)).collect();
  46. let s: Vec<Scalar> = (0..vlen).map(|_| Scalar::random(&mut rng)).collect();
  47. let t = Scalar::random(&mut rng);
  48. let a: Vec<Scalar> = (0..vlen).map(|i| Scalar::from_u128(i as u128)).collect();
  49. let b = Scalar::from_u128(17);
  50. let x: Vec<Scalar> = (0..vlen)
  51. .map(|i| Scalar::from_u128((2 * i) as u128))
  52. .collect();
  53. let y: Vec<Scalar> = (0..vlen)
  54. .map(|i| Scalar::from_u128((3 * i) as u128))
  55. .collect();
  56. let z = Scalar::from_u128(12);
  57. let E = z * A + t * B;
  58. let D: Vec<G> = (0..vlen).map(|i| y[i] * A + s[i] * B).collect();
  59. let C: Vec<G> = (0..vlen)
  60. .map(|i| (x[i] * A + r[i] * B - b * D[i] - E) * (a[i] + a[i] - Scalar::ONE).invert())
  61. .collect();
  62. let instance = proof::Instance {
  63. C,
  64. D,
  65. E,
  66. A,
  67. B,
  68. a,
  69. b,
  70. };
  71. let witness = proof::Witness { x, y, z, r, s, t };
  72. let proof = proof::prove(&instance, &witness, b"left_expr_vec_test", &mut rng)?;
  73. Ok(proof::verify(&instance, &proof, b"left_expr_vec_test")?)
  74. }