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)]
SubspaceSecret; SigningKey
}
impl fmt::Debug for SubspaceSecret {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl SubspaceSecret {
pub fn corresponding_subspace_id(&self) -> SubspaceId {
SubspaceId::from_ed25519_verifying_key(self.0.verifying_key())
}
}
#[cfg(feature = "dev")]
impl<'a> Arbitrary<'a> for SubspaceSecret {
fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {
Ok(Self(SigningKey::from_bytes(&Arbitrary::arbitrary(u)?)))
}
}
pub fn randomly_generate_subspace<R: CryptoRngCore + ?Sized>(
csprng: &mut R,
) -> (SubspaceId, SubspaceSecret) {
let signing_key = SigningKey::generate(csprng);
let verifying_key = signing_key.verifying_key();
(
SubspaceId::from_ed25519_verifying_key(verifying_key),
SubspaceSecret(signing_key),
)
}
impl Keypair for SubspaceSecret {
type VerifyingKey = SubspaceId;
fn verifying_key(&self) -> Self::VerifyingKey {
self.corresponding_subspace_id()
}
}
impl Signer<SubspaceSignature> for SubspaceSecret {
fn try_sign(&self, msg: &[u8]) -> Result<SubspaceSignature, signature::Error> {
self.0.try_sign(msg).map(Into::into)
}
}