Skip to main content

over_there/core/transport/auth/
split.rs

1use super::{Authenticator, Digest, Signer, Verifier};
2use std::sync::Arc;
3
4/// Splits authenticator into signer and verifier halves that point to
5/// the same underlying authenticator via arc
6pub fn split<A>(authenticator: A) -> (SignerHalf<A>, VerifierHalf<A>)
7where
8    A: Authenticator,
9{
10    let arc_self = Arc::new(authenticator);
11    let arc_self_2 = Arc::clone(&arc_self);
12
13    let s_half = SignerHalf { signer: arc_self };
14    let v_half = VerifierHalf {
15        verifier: arc_self_2,
16    };
17    (s_half, v_half)
18}
19
20/// Splits authenticator into signer and verifier halves by cloning the
21/// authenticator
22pub fn clone_split<A>(original: A) -> (A, A)
23where
24    A: Authenticator + Clone,
25{
26    let clone = original.clone();
27    (original, clone)
28}
29
30pub struct SignerHalf<S>
31where
32    S: Signer,
33{
34    signer: Arc<S>,
35}
36
37impl<S> Signer for SignerHalf<S>
38where
39    S: Signer,
40{
41    fn sign(&self, message: &[u8]) -> Digest {
42        self.signer.sign(message)
43    }
44}
45
46pub struct VerifierHalf<V>
47where
48    V: Verifier,
49{
50    verifier: Arc<V>,
51}
52
53impl<V> Verifier for VerifierHalf<V>
54where
55    V: Verifier,
56{
57    fn verify(&self, message: &[u8], signature: &Digest) -> bool {
58        self.verifier.verify(message, signature)
59    }
60}