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