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}