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
12pub trait Share: Sized + Debug + Eq + PartialEq + Clone + Default {
14 type Identifier: ShareIdentifier;
16
17 type Value: ShareElement
19 + for<'a> From<&'a Self::Identifier>
20 + for<'a> Mul<&'a Self::Identifier, Output = Self::Value>;
21
22 fn with_identifier_and_value(identifier: Self::Identifier, value: Self::Value) -> Self;
24 fn identifier(&self) -> &Self::Identifier;
26 fn identifier_mut(&mut self) -> &mut Self::Identifier;
28 fn value(&self) -> &Self::Value;
30 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#[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 #[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 #[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}