use ed25519_dalek::{Signature, Signer, SigningKey, VerifyingKey};
use rand::rngs::OsRng;
use zeroize::ZeroizeOnDrop;
#[derive(ZeroizeOnDrop)]
pub struct DyoloIdentity {
signing_key: SigningKey,
}
impl DyoloIdentity {
pub fn generate() -> Self {
Self { signing_key: SigningKey::generate(&mut OsRng) }
}
pub fn from_signing_bytes(bytes: &[u8; 32]) -> Self {
Self { signing_key: SigningKey::from_bytes(bytes) }
}
pub fn to_signing_bytes(&self) -> [u8; 32] {
self.signing_key.to_bytes()
}
pub fn verifying_key(&self) -> VerifyingKey {
self.signing_key.verifying_key()
}
pub(crate) fn sign(&self, message: &[u8]) -> Signature {
self.signing_key.sign(message)
}
}
impl std::fmt::Debug for DyoloIdentity {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let vk = self.verifying_key();
let bytes = vk.as_bytes();
write!(
f,
"DyoloIdentity(vk:{:02x}{:02x}{:02x}{:02x}…)",
bytes[0], bytes[1], bytes[2], bytes[3]
)
}
}