submodule.rs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #![allow(non_snake_case)]
  2. use cmz::*;
  3. use curve25519_dalek::ristretto::RistrettoPoint;
  4. use curve25519_dalek::scalar::Scalar;
  5. use group::Group;
  6. use rand::{CryptoRng, RngCore};
  7. use sha2::Sha512;
  8. pub mod cred {
  9. use super::*;
  10. CMZ! { Basic<RistrettoPoint>: x, y, z }
  11. }
  12. pub mod submod {
  13. use super::cred::Basic;
  14. use super::*;
  15. CMZ14Protocol! { issue_proto,
  16. ,
  17. N: Basic { x: J, y: H, z: I },
  18. }
  19. CMZ14Protocol! { basic_proto,
  20. A: Basic { x: H, y: R, z: I },
  21. N: Basic { x: J, y: H, z: I },
  22. }
  23. #[test]
  24. fn test_submodule() -> Result<(), CMZError> {
  25. let mut rng = rand::thread_rng();
  26. cmz_group_init(RistrettoPoint::hash_from_bytes::<Sha512>(
  27. b"CMZ Generator A",
  28. ));
  29. let (privkey, pubkey) = Basic::cmz14_gen_keys(&mut rng);
  30. let mut basic_iss = Basic::using_pubkey(&pubkey);
  31. basic_iss.x = Some(Scalar::ZERO);
  32. basic_iss.y = Some(Scalar::ONE);
  33. basic_iss.z = Some(Scalar::ONE);
  34. let (ireq, istate) = issue_proto::prepare(&mut rng, b"issue_proto", basic_iss).unwrap();
  35. let (ireply, _) = issue_proto::handle(
  36. &mut rng,
  37. b"issue_proto",
  38. ireq,
  39. |N: &mut Basic| {
  40. N.set_privkey(&privkey);
  41. N.z = Some(Scalar::ONE);
  42. Ok(())
  43. },
  44. |_N: &Basic| Ok(()),
  45. )?;
  46. let basic_cred = match istate.finalize(ireply) {
  47. Ok(c) => c,
  48. Err((err, _)) => return Err(err),
  49. };
  50. let mut basic_new = Basic::using_pubkey(&pubkey);
  51. basic_new.y = Some(2u128.into());
  52. basic_new.z = Some(3u128.into());
  53. let (req, state) =
  54. basic_proto::prepare(&mut rng, b"basic_proto", &basic_cred, basic_new).unwrap();
  55. let (reply, _) = basic_proto::handle(
  56. &mut rng,
  57. b"basic_proto",
  58. req,
  59. |A: &mut Basic, N: &mut Basic| {
  60. A.set_privkey(&privkey);
  61. A.z = Some(Scalar::ONE);
  62. N.set_privkey(&privkey);
  63. N.z = Some(3u128.into());
  64. Ok(())
  65. },
  66. |_A: &Basic, _N: &Basic| Ok(()),
  67. )?;
  68. let res = state.finalize(reply);
  69. match res {
  70. Ok(_) => Ok(()),
  71. Err((err, _state)) => Err(err),
  72. }
  73. }
  74. }