use ed25519_dalek::{Signer as DalekSigner, Verifier};
use future_form::{FutureForm, Local, Sendable};
use super::{AsyncSigner, SignaturePrimitive, Signer};
#[derive(Debug, Clone, Copy)]
pub enum Ed25519 {}
impl SignaturePrimitive for Ed25519 {
type VerifyingKey = ed25519_dalek::VerifyingKey;
type Signature = ed25519_dalek::Signature;
type SigningKey = ed25519_dalek::SigningKey;
type Error = ed25519_dalek::SignatureError;
fn sign(key: &Self::SigningKey, message: &[u8]) -> Self::Signature {
DalekSigner::sign(key, message)
}
fn verify(
key: &Self::VerifyingKey,
message: &[u8],
signature: &Self::Signature,
) -> Result<(), Self::Error> {
key.verify(message, signature)
}
}
impl Signer<Ed25519> for ed25519_dalek::SigningKey {
fn sign(&self, message: &[u8]) -> ed25519_dalek::Signature {
DalekSigner::sign(self, message)
}
fn verifying_key(&self) -> ed25519_dalek::VerifyingKey {
ed25519_dalek::SigningKey::verifying_key(self)
}
}
#[future_form::future_form(Sendable, Local)]
impl<K: FutureForm> AsyncSigner<Ed25519, K> for ed25519_dalek::SigningKey {
fn sign<'a>(&'a self, message: &'a [u8]) -> K::Future<'a, ed25519_dalek::Signature> {
let sig = DalekSigner::sign(self, message);
K::ready(sig)
}
fn verifying_key(&self) -> ed25519_dalek::VerifyingKey {
ed25519_dalek::SigningKey::verifying_key(self)
}
}