rustls-rustcrypto-gated 0.0.2-alpha

n0-computer's feature-gated branch (feature-flag-algorithms-v0.0.2, commit aa51a5c) of RustCrypto's rustls-rustcrypto, published under this name unchanged so a chip build can select P-256 alone: `default-features = false, features = ["std", "p256"]`. Not a remake and not maintained here; the Janus ESP packages depend on it by version because crates.io cannot carry a git dependency.
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;