mpc_driver/signers/
eddsa.rsuse crate::Result;
use ed25519::signature::{Signer, Verifier};
use ed25519_dalek::{SecretKey, SigningKey, VerifyingKey};
use rand::rngs::OsRng;
use std::borrow::Cow;
pub use ed25519_dalek::Signature;
pub struct EddsaSigner<'a> {
signing_key: Cow<'a, SigningKey>,
verifying_key: VerifyingKey,
}
impl<'a> EddsaSigner<'a> {
pub fn new(signing_key: Cow<'a, SigningKey>) -> Self {
let verifying_key = signing_key.verifying_key();
Self {
signing_key,
verifying_key,
}
}
pub fn from_bytes(signing_key: &SecretKey) -> SigningKey {
SigningKey::from_bytes(signing_key)
}
pub fn random() -> SigningKey {
SigningKey::generate(&mut OsRng)
}
pub fn sign<B: AsRef<[u8]>>(&self, message: B) -> Signature {
let signer = DalekSigner {
signing_key: self.signing_key.as_ref(),
};
signer.sign(message)
}
pub fn verifying_key(&self) -> &VerifyingKey {
&self.verifying_key
}
pub fn verify<B: AsRef<[u8]>>(
&self,
message: B,
signature: &Signature,
) -> Result<()> {
let verifier = DalekVerifier {
verifying_key: self.verifying_key(),
};
verifier.verify(message, &signature)
}
}
struct DalekSigner<'a, S>
where
S: Signer<ed25519::Signature>,
{
pub signing_key: &'a S,
}
impl<'a, S> DalekSigner<'a, S>
where
S: Signer<ed25519::Signature>,
{
pub fn sign<B: AsRef<[u8]>>(
&self,
message: B,
) -> ed25519::Signature {
self.signing_key.sign(message.as_ref())
}
}
struct DalekVerifier<'a, V> {
pub verifying_key: &'a V,
}
impl<'a, V> DalekVerifier<'a, V>
where
V: Verifier<ed25519::Signature>,
{
pub fn verify<B: AsRef<[u8]>>(
&self,
message: B,
signature: &ed25519::Signature,
) -> Result<()> {
Ok(self
.verifying_key
.verify(message.as_ref(), signature)
.map_err(Box::from)?)
}
}