use core::fmt;
#[cfg(feature = "dev")]
use arbitrary::Arbitrary;
use ed25519_dalek::SigningKey;
use rand_core::CryptoRngCore;
use signature::{Keypair, Signer};
use crate::prelude::*;
wrapper! {
#[derive(PartialEq, Eq, Clone)]
NamespaceSecret; SigningKey
}
impl fmt::Debug for NamespaceSecret {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl NamespaceSecret {
pub fn corresponding_namespace_id(&self) -> NamespaceId {
NamespaceId::from_ed25519_verifying_key(self.0.verifying_key())
}
}
#[cfg(feature = "dev")]
impl<'a> Arbitrary<'a> for NamespaceSecret {
fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {
Ok(Self(SigningKey::from_bytes(&Arbitrary::arbitrary(u)?)))
}
}
pub fn randomly_generate_namespace<R: CryptoRngCore + ?Sized>(
csprng: &mut R,
) -> (NamespaceId, NamespaceSecret) {
let signing_key = SigningKey::generate(csprng);
let verifying_key = signing_key.verifying_key();
(
NamespaceId::from_ed25519_verifying_key(verifying_key),
NamespaceSecret(signing_key),
)
}
pub fn randomly_generate_communal_namespace<R: CryptoRngCore + ?Sized>(
csprng: &mut R,
) -> (NamespaceId, NamespaceSecret) {
loop {
let (pk, sk) = randomly_generate_namespace(csprng);
if pk.is_communal() {
return (pk, sk);
}
}
}
pub fn randomly_generate_owned_namespace<R: CryptoRngCore + ?Sized>(
csprng: &mut R,
) -> (NamespaceId, NamespaceSecret) {
loop {
let (pk, sk) = randomly_generate_namespace(csprng);
if !pk.is_communal() {
return (pk, sk);
}
}
}
impl Keypair for NamespaceSecret {
type VerifyingKey = NamespaceId;
fn verifying_key(&self) -> Self::VerifyingKey {
self.corresponding_namespace_id()
}
}
impl Signer<NamespaceSignature> for NamespaceSecret {
fn try_sign(&self, msg: &[u8]) -> Result<NamespaceSignature, signature::Error> {
self.0.try_sign(msg).map(Into::into)
}
}