use crate::types::{PublicKey, SecretKey};
use curve25519_dalek::scalar::Scalar;
use rand::rngs::SysRng;
use rand_core::UnwrapErr;
pub struct Identity {
pub public_key: PublicKey,
pub secret_key: SecretKey,
}
pub fn generate_identity() -> Identity {
let mut rng = UnwrapErr(SysRng);
let scalar = Scalar::random(&mut rng);
let secret_key = SecretKey { scalar };
let public_key = secret_key.public_key();
Identity {
public_key,
secret_key,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn two_identities_are_different() {
let a = generate_identity();
let b = generate_identity();
assert_ne!(a.public_key, b.public_key);
assert_ne!(a.secret_key.to_bytes(), b.secret_key.to_bytes());
}
#[test]
fn public_key_is_derived_from_secret_key() {
let id = generate_identity();
let restored = SecretKey::from_bytes(&id.secret_key.to_bytes()).unwrap();
assert_eq!(restored.public_key(), id.public_key);
}
}