Skip to main content

crypto_signer/
dispatch_verifier.rs

1// SPDX-FileCopyrightText: Copyright © 2026 ReallyMe LLC. All rights reserved
2//
3// SPDX-License-Identifier: Apache-2.0
4
5use crypto_core::Algorithm;
6use crypto_dispatch::AlgorithmError;
7
8use crate::{Verifier, VerifierError, VerifierFailureKind};
9
10/// Public-key verifier implemented through `crypto_dispatch::verify`.
11///
12/// Public keys are not secret, but the wrapper still keeps the bytes
13/// private to prevent accidental mutation between construction and use.
14#[derive(Debug)]
15pub struct DispatchVerifier {
16    alg: Algorithm,
17    public_key: Vec<u8>,
18}
19
20impl DispatchVerifier {
21    /// Create a dispatch-backed verifier from a public key.
22    pub fn new(alg: Algorithm, public_key: Vec<u8>) -> Self {
23        Self { alg, public_key }
24    }
25
26    /// The public key this verifier checks against.
27    pub fn public_key(&self) -> &[u8] {
28        &self.public_key
29    }
30}
31
32impl Verifier for DispatchVerifier {
33    fn alg(&self) -> Algorithm {
34        self.alg
35    }
36
37    fn verify(&self, message: &[u8], signature: &[u8]) -> Result<(), VerifierError> {
38        crypto_dispatch::verify(self.alg, &self.public_key, message, signature).map_err(|source| {
39            let kind = match &source {
40                AlgorithmError::SignatureInvalid(_) => VerifierFailureKind::SignatureInvalid,
41                _ => VerifierFailureKind::DispatchRejected,
42            };
43            VerifierError::VerifyFailed {
44                algorithm: self.alg,
45                kind,
46                source,
47            }
48        })
49    }
50}