basic.rs 2.0 KB

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