Skip to main content

vsss_rs/
share.rs

1use super::*;
2use core::{
3    cmp::Ordering,
4    fmt::Debug,
5    hash::{Hash, Hasher},
6    ops::Mul,
7};
8use elliptic_curve::PrimeField;
9#[cfg(feature = "zeroize")]
10use zeroize::{Zeroize, ZeroizeOnDrop};
11
12/// A share.
13pub trait Share: Sized + Debug + Eq + PartialEq + Clone + Default {
14    /// The identifier type for the share.
15    type Identifier: ShareIdentifier;
16
17    /// The value type for the share.
18    type Value: ShareElement
19        + for<'a> From<&'a Self::Identifier>
20        + for<'a> Mul<&'a Self::Identifier, Output = Self::Value>;
21
22    /// A new share with a given value
23    fn with_identifier_and_value(identifier: Self::Identifier, value: Self::Value) -> Self;
24    /// The identifier for this share
25    fn identifier(&self) -> &Self::Identifier;
26    /// The mutable identifier for this share
27    fn identifier_mut(&mut self) -> &mut Self::Identifier;
28    /// Serialize the share value.
29    fn value(&self) -> &Self::Value;
30    /// The mutable share value
31    fn value_mut(&mut self) -> &mut Self::Value;
32}
33
34impl<I, V> Share for (I, V)
35where
36    I: ShareIdentifier,
37    V: ShareElement + for<'a> From<&'a I> + for<'a> Mul<&'a I, Output = V>,
38{
39    type Identifier = I;
40    type Value = V;
41
42    fn with_identifier_and_value(identifier: I, value: V) -> Self {
43        (identifier, value)
44    }
45
46    fn identifier(&self) -> &I {
47        &self.0
48    }
49
50    fn identifier_mut(&mut self) -> &mut I {
51        &mut self.0
52    }
53
54    fn value(&self) -> &V {
55        &self.1
56    }
57
58    fn value_mut(&mut self) -> &mut V {
59        &mut self.1
60    }
61}
62
63/// A default share implementation providing named fields for the identifier and value.
64#[derive(Debug, Clone, Eq, PartialEq, Default)]
65#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
66pub struct DefaultShare<I, V>
67where
68    I: ShareIdentifier,
69    V: ShareElement + for<'a> From<&'a I> + for<'a> Mul<&'a I, Output = V>,
70{
71    /// The share identifier
72    #[cfg_attr(feature = "serde", serde(bound(serialize = "I: serde::Serialize")))]
73    #[cfg_attr(
74        feature = "serde",
75        serde(bound(deserialize = "I: serde::Deserialize<'de>"))
76    )]
77    pub identifier: I,
78    /// The share value
79    #[cfg_attr(feature = "serde", serde(bound(serialize = "V: serde::Serialize")))]
80    #[cfg_attr(
81        feature = "serde",
82        serde(bound(deserialize = "V: serde::Deserialize<'de>"))
83    )]
84    pub value: V,
85}
86
87impl<I, V> Copy for DefaultShare<I, V>
88where
89    I: ShareIdentifier + Copy,
90    V: ShareElement + for<'a> From<&'a I> + for<'a> Mul<&'a I, Output = V> + Copy,
91{
92}
93
94impl<I, V> Ord for DefaultShare<I, V>
95where
96    I: ShareIdentifier + Ord + PartialOrd,
97    V: ShareElement + for<'a> From<&'a I> + for<'a> Mul<&'a I, Output = V>,
98{
99    fn cmp(&self, other: &Self) -> Ordering {
100        self.identifier.cmp(&other.identifier)
101    }
102}
103
104impl<I, V> PartialOrd for DefaultShare<I, V>
105where
106    I: ShareIdentifier + Ord + PartialOrd,
107    V: ShareElement + for<'a> From<&'a I> + for<'a> Mul<&'a I, Output = V>,
108{
109    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
110        Some(self.cmp(other))
111    }
112}
113
114impl<I, V> Hash for DefaultShare<I, V>
115where
116    I: ShareIdentifier + Hash,
117    V: ShareElement + for<'a> From<&'a I> + for<'a> Mul<&'a I, Output = V>,
118{
119    fn hash<H: Hasher>(&self, state: &mut H) {
120        self.identifier.hash(state);
121    }
122}
123
124#[cfg(feature = "zeroize")]
125impl<I, V> Zeroize for DefaultShare<I, V>
126where
127    I: ShareIdentifier + Zeroize,
128    V: ShareElement + for<'a> From<&'a I> + for<'a> Mul<&'a I, Output = V> + Zeroize,
129{
130    fn zeroize(&mut self) {
131        self.identifier.zeroize();
132        self.value.zeroize();
133    }
134}
135
136#[cfg(feature = "zeroize")]
137impl<I, V> ZeroizeOnDrop for DefaultShare<I, V>
138where
139    I: ShareIdentifier + ZeroizeOnDrop,
140    V: ShareElement + for<'a> From<&'a I> + for<'a> Mul<&'a I, Output = V> + ZeroizeOnDrop,
141{
142}
143
144impl<F: PrimeField> From<(F, F)> for DefaultShare<IdentifierPrimeField<F>, ValuePrimeField<F>> {
145    fn from((identifier, value): (F, F)) -> Self {
146        Self {
147            identifier: IdentifierPrimeField(identifier),
148            value: IdentifierPrimeField(value),
149        }
150    }
151}
152
153impl<F: PrimeField> From<DefaultShare<IdentifierPrimeField<F>, ValuePrimeField<F>>> for (F, F) {
154    fn from(share: DefaultShare<IdentifierPrimeField<F>, ValuePrimeField<F>>) -> Self {
155        (share.identifier.0, share.value.0)
156    }
157}
158
159impl<G: Group + GroupEncoding + Default> From<(G::Scalar, G)>
160    for DefaultShare<IdentifierPrimeField<G::Scalar>, ValueGroup<G>>
161{
162    fn from((identifier, value): (G::Scalar, G)) -> Self {
163        Self {
164            identifier: IdentifierPrimeField(identifier),
165            value: ValueGroup(value),
166        }
167    }
168}
169
170impl<G: Group + GroupEncoding + Default>
171    From<DefaultShare<IdentifierPrimeField<G::Scalar>, ValueGroup<G>>> for (G::Scalar, G)
172{
173    fn from(share: DefaultShare<IdentifierPrimeField<G::Scalar>, ValueGroup<G>>) -> Self {
174        (share.identifier.0, share.value.0)
175    }
176}
177
178impl<I, V> Share for DefaultShare<I, V>
179where
180    I: ShareIdentifier,
181    V: ShareElement + for<'a> From<&'a I> + for<'a> Mul<&'a I, Output = V>,
182{
183    type Identifier = I;
184    type Value = V;
185
186    fn with_identifier_and_value(identifier: Self::Identifier, value: Self::Value) -> Self {
187        Self { identifier, value }
188    }
189
190    fn identifier(&self) -> &Self::Identifier {
191        &self.identifier
192    }
193
194    fn identifier_mut(&mut self) -> &mut Self::Identifier {
195        &mut self.identifier
196    }
197
198    fn value(&self) -> &Self::Value {
199        &self.value
200    }
201
202    fn value_mut(&mut self) -> &mut Self::Value {
203        &mut self.value
204    }
205}