usig/
signature.rs

1use std::{collections::HashMap, fmt::Debug, marker::PhantomData};
2
3use derivative::Derivative;
4use rand::rngs::OsRng;
5use serde::{Deserialize, Serialize};
6
7use shared_ids::ReplicaId;
8use signature::{Signer, Verifier};
9use trait_alias_macro::pub_trait_alias_macro;
10
11use crate::{Count, Counter, SignHalf, Usig, UsigError, VerifyHalf};
12
13pub_trait_alias_macro!(SignatureType = for<'a> Deserialize<'a> + Serialize + Clone + Debug);
14
15#[derive(Derivative, Deserialize, Serialize)]
16#[serde(bound = "")]
17#[derivative(Debug(bound = ""), Clone(bound = ""))]
18pub struct Signature<S: SignatureType> {
19    counter: u64,
20    signature: S,
21}
22
23impl<S: SignatureType> Counter for Signature<S> {
24    fn counter(&self) -> Count {
25        Count(self.counter)
26    }
27}
28
29#[derive(Derivative)]
30#[derivative(Debug(bound = ""))]
31pub struct UsigSignatureSignHalf<
32    Q: SignatureType,
33    S: Signer<Q> + Debug,
34    V: Verifier<Q> + Clone + Debug + for<'a> Deserialize<'a> + Serialize,
35> {
36    counter: u64,
37    private_key: S,
38    public_key: V,
39    phantom_data: PhantomData<Q>,
40}
41
42impl<
43        Q: SignatureType,
44        S: Signer<Q> + Debug,
45        V: Verifier<Q> + Clone + Debug + for<'a> Deserialize<'a> + Serialize,
46    > UsigSignatureSignHalf<Q, S, V>
47{
48    pub fn new(private_key: S, public_key: V) -> Self {
49        Self {
50            counter: 0,
51            private_key,
52            public_key,
53            phantom_data: PhantomData::default(),
54        }
55    }
56}
57
58impl<
59        Q: SignatureType,
60        S: Signer<Q> + Debug,
61        V: Verifier<Q> + Clone + Debug + for<'a> Deserialize<'a> + Serialize,
62    > SignHalf for UsigSignatureSignHalf<Q, S, V>
63{
64    type Signature = Signature<Q>;
65    type Attestation = V;
66
67    fn sign(&mut self, message: impl AsRef<[u8]>) -> Result<Self::Signature, UsigError> {
68        let counter = self.counter;
69        self.counter += 1;
70        let mut data = Vec::<u8>::new();
71        data.extend_from_slice(&counter.to_be_bytes());
72        data.extend_from_slice(message.as_ref());
73        let signature = self.private_key.sign(&data);
74        Ok(Signature { counter, signature })
75    }
76
77    fn attest(&mut self) -> Result<Self::Attestation, UsigError> {
78        Ok(self.public_key.clone())
79    }
80}
81
82#[derive(Derivative)]
83#[derivative(Debug(bound = ""), Default(bound = ""))]
84
85pub struct UsigSignatureVerifyHalf<
86    Q: SignatureType,
87    V: Verifier<Q> + Clone + Debug + for<'a> Deserialize<'a> + Serialize,
88> {
89    other_keys: HashMap<ReplicaId, V>,
90    phantom_data: PhantomData<Q>,
91}
92
93impl<Q: SignatureType, V: Verifier<Q> + Clone + Debug + for<'a> Deserialize<'a> + Serialize>
94    VerifyHalf for UsigSignatureVerifyHalf<Q, V>
95{
96    type Signature = Signature<Q>;
97    type Attestation = V;
98
99    fn verify(
100        &self,
101        id: ReplicaId,
102        message: impl AsRef<[u8]>,
103        signature: &Self::Signature,
104    ) -> Result<(), UsigError> {
105        if let Some(key) = self.other_keys.get(&id) {
106            let mut data = Vec::<u8>::new();
107            data.extend_from_slice(&signature.counter.to_be_bytes());
108            data.extend_from_slice(message.as_ref());
109
110            key.verify(&data, &signature.signature)
111                .is_ok()
112                .then_some(())
113                .ok_or(UsigError::InvalidSignature)
114        } else {
115            Err(UsigError::UnknownId(id))
116        }
117    }
118
119    fn add_remote_party(&mut self, id: ReplicaId, attestation: Self::Attestation) -> bool {
120        self.other_keys.insert(id, attestation);
121        true
122    }
123}
124
125#[derive(Derivative)]
126#[derivative(Debug(bound = ""))]
127pub struct UsigSignature<
128    Q: SignatureType,
129    S: Signer<Q> + Debug,
130    V: Verifier<Q> + Clone + Debug + for<'a> Deserialize<'a> + Serialize,
131> {
132    sign_half: UsigSignatureSignHalf<Q, S, V>,
133    verify_half: UsigSignatureVerifyHalf<Q, V>,
134}
135
136impl<
137        Q: SignatureType,
138        S: Signer<Q> + Debug,
139        V: Verifier<Q> + Clone + Debug + for<'a> Deserialize<'a> + Serialize,
140    > UsigSignature<Q, S, V>
141{
142    pub fn new(private_key: S, public_key: V) -> Self {
143        Self {
144            sign_half: UsigSignatureSignHalf::new(private_key, public_key),
145            verify_half: UsigSignatureVerifyHalf::default(),
146        }
147    }
148}
149
150impl<
151        Q: SignatureType,
152        S: Signer<Q> + Debug,
153        V: Verifier<Q> + Clone + Debug + for<'a> Deserialize<'a> + Serialize,
154    > Usig for UsigSignature<Q, S, V>
155{
156    type Signature = Signature<Q>;
157    type Attestation = V;
158
159    fn sign(&mut self, message: impl AsRef<[u8]>) -> Result<Self::Signature, UsigError> {
160        self.sign_half.sign(message)
161    }
162
163    fn attest(&mut self) -> Result<Self::Attestation, UsigError> {
164        self.sign_half.attest()
165    }
166
167    fn verify(
168        &self,
169        id: ReplicaId,
170        message: impl AsRef<[u8]>,
171        signature: &Self::Signature,
172    ) -> Result<(), UsigError> {
173        self.verify_half.verify(id, message, signature)
174    }
175
176    fn add_remote_party(&mut self, id: ReplicaId, attestation: Self::Attestation) -> bool {
177        self.verify_half.add_remote_party(id, attestation)
178    }
179
180    type SignHalf = UsigSignatureSignHalf<Q, S, V>;
181    type VerifyHalf = UsigSignatureVerifyHalf<Q, V>;
182
183    fn split(self) -> (Self::SignHalf, Self::VerifyHalf) {
184        (self.sign_half, self.verify_half)
185    }
186}
187
188pub type UsigEd25519 =
189    UsigSignature<ed25519_dalek::Signature, ed25519_dalek::SigningKey, ed25519_dalek::VerifyingKey>;
190
191pub fn new_ed25519() -> UsigEd25519 {
192    let keypair = ed25519_dalek::SigningKey::generate(&mut OsRng::default());
193    let public_key = keypair.verifying_key();
194    UsigSignature::new(keypair, public_key)
195}
196
197#[cfg(test)]
198mod tests {
199    use super::new_ed25519;
200    use crate as usig;
201    use crate::tests;
202
203    tests!(new_ed25519());
204}