evidence 0.1.0

Type-level tags for cryptographic primitives
Documentation
//! Ed25519 signature implementation.

use ed25519_dalek::{Signer as DalekSigner, Verifier};
use future_form::{FutureForm, Local, Sendable};

use super::{AsyncSigner, SignaturePrimitive, Signer};

/// Ed25519 signature primitive.
///
/// Uses the ed25519-dalek crate for the underlying implementation.
#[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)
    }
}