ssi_crypto/
verification.rs1use crate::{Algorithm, AlgorithmInstance, PublicKey};
2
3#[derive(Debug, thiserror::Error)]
4pub enum VerificationError {
5 #[error("unsupported algorithm `{0}`")]
6 UnsupportedAlgorithm(Algorithm),
7
8 #[error("secret key is not compatible with the signature algorithm")]
9 IncompatibleKey,
10
11 #[error("invalid signature")]
12 InvalidSignature,
13}
14
15impl AlgorithmInstance {
16 #[allow(unused)]
17 pub fn verify(
18 &self,
19 key: &PublicKey,
20 signing_bytes: &[u8],
21 signature_bytes: &[u8],
22 ) -> Result<bool, VerificationError> {
23 match self {
24 #[cfg(feature = "ed25519")]
25 Self::EdDSA => match key {
26 PublicKey::Ed25519(key) => {
27 use ed25519_dalek::Verifier;
28 let signature: ed25519_dalek::Signature = signature_bytes
29 .try_into()
30 .map_err(|_| VerificationError::InvalidSignature)?;
31 Ok(key.verify(signing_bytes, &signature).is_ok())
32 }
33 #[allow(unreachable_patterns)]
34 _ => Err(VerificationError::IncompatibleKey),
35 },
36 #[cfg(feature = "secp256k1")]
37 Self::ES256K => match key {
38 PublicKey::Secp256k1(key) => {
39 use k256::ecdsa::signature::Verifier;
40 let verifying_key = k256::ecdsa::VerifyingKey::from(key);
41 let sig = k256::ecdsa::Signature::try_from(signature_bytes)
42 .map_err(|_| VerificationError::InvalidSignature)?;
43 Ok(verifying_key.verify(signing_bytes, &sig).is_ok())
44 }
45 #[allow(unreachable_patterns)]
46 _ => Err(VerificationError::IncompatibleKey),
47 },
48 #[cfg(feature = "secp256r1")]
49 Self::ES256 => match key {
50 PublicKey::P256(key) => {
51 use p256::ecdsa::signature::Verifier;
52 let verifying_key = p256::ecdsa::VerifyingKey::from(key);
53 let sig = p256::ecdsa::Signature::try_from(signature_bytes)
54 .map_err(|_| VerificationError::InvalidSignature)?;
55 Ok(verifying_key.verify(signing_bytes, &sig).is_ok())
56 }
57 #[allow(unreachable_patterns)]
58 _ => Err(VerificationError::IncompatibleKey),
59 },
60 #[cfg(feature = "secp384r1")]
61 Self::ES384 => match key {
62 PublicKey::P384(key) => {
63 use p384::ecdsa::signature::Verifier;
64 let verifying_key = p384::ecdsa::VerifyingKey::from(key);
65 let sig = p384::ecdsa::Signature::try_from(signature_bytes)
66 .map_err(|_| VerificationError::InvalidSignature)?;
67 Ok(verifying_key.verify(signing_bytes, &sig).is_ok())
68 }
69 #[allow(unreachable_patterns)]
70 _ => Err(VerificationError::IncompatibleKey),
71 },
72 other => Err(VerificationError::UnsupportedAlgorithm(other.algorithm())),
73 }
74 }
75}