use pki_types::{AlgorithmIdentifier, InvalidSignature, SignatureVerificationAlgorithm};
use signature::Verifier;
use webpki::alg_id;
#[derive(Debug)]
struct Ed25519Verify;
impl SignatureVerificationAlgorithm for Ed25519Verify {
fn public_key_alg_id(&self) -> AlgorithmIdentifier {
alg_id::ED25519
}
fn signature_alg_id(&self) -> AlgorithmIdentifier {
alg_id::ED25519
}
fn verify_signature(
&self,
public_key: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<(), InvalidSignature> {
let public_key = public_key.try_into().map_err(|_| InvalidSignature)?;
let signature =
ed25519_dalek::Signature::from_slice(signature).map_err(|_| InvalidSignature)?;
ed25519_dalek::VerifyingKey::from_bytes(public_key)
.map_err(|_| InvalidSignature)?
.verify(message, &signature)
.map_err(|_| InvalidSignature)
}
}
pub const ED25519: &dyn SignatureVerificationAlgorithm = &Ed25519Verify;