basic.rs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. use cmz::*;
  2. use curve25519_dalek::ristretto::RistrettoPoint;
  3. use curve25519_dalek::scalar::Scalar;
  4. use group::Group;
  5. use rand::{CryptoRng, RngCore};
  6. CMZ! { Basic<RistrettoPoint> :
  7. attr1,
  8. attr2
  9. }
  10. CMZ14Protocol! { basic_issue,
  11. ,
  12. A: Basic { attr1: S, attr2: S },
  13. }
  14. CMZ14Protocol! { basic_proto,
  15. A: Basic {
  16. attr1: H,
  17. attr2: H,
  18. }, , }
  19. #[test]
  20. fn test_basic() {
  21. let mut rng = rand::thread_rng();
  22. let (privkey, pubkey) = Basic::cmz14_gen_keys(&mut rng);
  23. // Serialize and deserialize
  24. let privkey_bytes = postcard::to_allocvec(&privkey).unwrap();
  25. let pubkey_bytes = postcard::to_allocvec(&pubkey).unwrap();
  26. let privkey_serde = postcard::from_bytes::<CMZPrivkey<RistrettoPoint>>(&privkey_bytes).unwrap();
  27. let pubkey_serde = postcard::from_bytes::<CMZPubkey<RistrettoPoint>>(&pubkey_bytes).unwrap();
  28. assert!(privkey == privkey_serde);
  29. assert!(pubkey == pubkey_serde);
  30. // A showing proof needs an issued credential. An unissued credential has
  31. // the identity as its MAC, which is rejected as an invalid instance point.
  32. let (request, state) =
  33. basic_issue::prepare(&mut rng, b"issue_basic", Basic::using_pubkey(&pubkey_serde)).unwrap();
  34. let (reply, _) = basic_issue::handle(
  35. &mut rng,
  36. b"issue_basic",
  37. request,
  38. |a: &mut Basic| {
  39. a.set_privkey(&privkey_serde);
  40. a.attr1 = Some(Scalar::ZERO);
  41. a.attr2 = Some(Scalar::ONE);
  42. Ok(())
  43. },
  44. |_a: &Basic| Ok(()),
  45. )
  46. .unwrap();
  47. let basic_cred = state.finalize(reply).map_err(|(err, _state)| err).unwrap();
  48. let basic_cred_bytes = postcard::to_allocvec(&basic_cred).unwrap();
  49. println!("{:#?}", basic_cred);
  50. println!("{:#?}", basic_cred_bytes);
  51. let (req, state) = basic_proto::prepare(&mut rng, b"test_basic", &basic_cred).unwrap();
  52. println!("{req:#?}");
  53. println!("{state:#?}");
  54. }