use cmz::*; use curve25519_dalek::ristretto::RistrettoPoint; use curve25519_dalek::scalar::Scalar; use group::Group; use rand::{CryptoRng, RngCore}; use sha2::Sha512; CMZ! { Basic : attr1, attr2 } CMZ14Protocol! { basic_proto, A: Basic { attr1: H, attr2: H, }, , } // Test that the default serialization of a credential does _not_ // include any private key material. Thanks to Morgan Hill from // Radically Open Security. #[test] fn test_default_serialize() { let mut rng = rand::thread_rng(); cmz_group_init(RistrettoPoint::hash_from_bytes::( b"CMZ Generator A", )); let (privkey, pubkey) = Basic::cmz14_gen_keys(&mut rng); let mut basic_cred = Basic::using_privkey(&privkey); basic_cred.attr1 = Some(Scalar::ZERO); basic_cred.attr2 = Some(Scalar::ONE); basic_cred.create_MAC(&mut rng, &privkey).unwrap(); let basic_cred_bytes = postcard::to_allocvec(&basic_cred).unwrap(); let basic_cred_deser = postcard::from_bytes::(&basic_cred_bytes).unwrap(); assert_eq!( *basic_cred_deser.get_privkey(), CMZPrivkey::::default() ); assert_eq!(*basic_cred_deser.get_pubkey(), pubkey); } // Test that the serialization with privkey of a credential _does_ // include the private key material. #[test] fn test_priv_serialize() { let mut rng = rand::thread_rng(); cmz_group_init(RistrettoPoint::hash_from_bytes::( b"CMZ Generator A", )); let (privkey, pubkey) = Basic::cmz14_gen_keys(&mut rng); let mut basic_cred = Basic::using_privkey(&privkey); basic_cred.attr1 = Some(Scalar::ZERO); basic_cred.attr2 = Some(Scalar::ONE); basic_cred.create_MAC(&mut rng, &privkey).unwrap(); let basic_cred_bytes = basic_cred.serialize_with_privkey(); let basic_cred_deser = Basic::deserialize_with_privkey(&basic_cred_bytes).unwrap(); assert_eq!(*basic_cred_deser.get_privkey(), privkey); assert_eq!(*basic_cred_deser.get_pubkey(), pubkey); }