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() -> sigma_proofs::errors::Result<()> {
  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. proof::verify(&instance, &proof, b"left_expr_test")
  30. }
  31. #[test]
  32. fn left_expr_vec_test() -> sigma_proofs::errors::Result<()> {
  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. proof::verify(&instance, &proof, b"left_expr_vec_test")
  74. }