|
|
@@ -0,0 +1,71 @@
|
|
|
+use cmz::*;
|
|
|
+use curve25519_dalek::ristretto::RistrettoPoint;
|
|
|
+use curve25519_dalek::scalar::Scalar;
|
|
|
+use group::Group;
|
|
|
+use rand::{CryptoRng, RngCore};
|
|
|
+use sha2::Sha512;
|
|
|
+
|
|
|
+CMZ! { Basic<RistrettoPoint> :
|
|
|
+ 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::<Sha512>(
|
|
|
+ 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 = bincode::serialize(&basic_cred).unwrap();
|
|
|
+
|
|
|
+ let basic_cred_deser = bincode::deserialize::<Basic>(&basic_cred_bytes).unwrap();
|
|
|
+
|
|
|
+ assert_eq!(
|
|
|
+ *basic_cred_deser.get_privkey(),
|
|
|
+ CMZPrivkey::<RistrettoPoint>::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::<Sha512>(
|
|
|
+ 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);
|
|
|
+}
|