1#[cfg(any(feature = "alloc", feature = "std"))]
4mod biguint;
5mod group_element;
6mod prime_field;
7#[cfg(feature = "primitive")]
8mod primitive;
9#[cfg(feature = "bigint")]
10mod residue;
11#[cfg(feature = "bigint")]
12mod uint;
13
14#[cfg(any(feature = "alloc", feature = "std"))]
15pub use biguint::*;
16pub use group_element::*;
17pub use prime_field::*;
18#[cfg(feature = "primitive")]
19pub use primitive::*;
20#[cfg(feature = "bigint")]
21pub use residue::*;
22#[cfg(feature = "bigint")]
23pub use uint::*;
24
25use crate::*;
26
27use core::{
28 fmt::Debug,
29 ops::{Add, AddAssign, Deref, DerefMut, Mul, MulAssign, Neg, Sub, SubAssign},
30};
31#[cfg(feature = "bigint")]
32use crypto_bigint::{Encoding, Random, Zero as CryptoZero};
33use rand_core::{CryptoRng, RngCore};
34use subtle::Choice;
35
36pub trait ShareElement:
39 Sized
40 + Clone
41 + Default
42 + Debug
43 + Eq
44 + PartialEq
45 + Deref<Target = Self::Inner>
46 + DerefMut<Target = Self::Inner>
47 + AsRef<Self::Inner>
48 + AsMut<Self::Inner>
49 + From<Self::Inner>
50{
51 type Serialization: AsRef<[u8]> + AsMut<[u8]> + 'static;
53 type Inner: ShareElementInner;
55
56 fn random(rng: impl RngCore + CryptoRng) -> Self;
58 fn zero() -> Self;
60 fn one() -> Self;
62 fn is_zero(&self) -> Choice;
64 fn serialize(&self) -> Self::Serialization;
66 fn deserialize(serialized: &Self::Serialization) -> VsssResult<Self>;
68 fn from_slice(slice: &[u8]) -> VsssResult<Self>;
70 #[cfg(any(feature = "alloc", feature = "std"))]
71 fn to_vec(&self) -> Vec<u8>;
73}
74
75pub trait ShareIdentifier: ShareElement<Inner: ShareIdentifierInner> {
77 fn inc(&mut self, increment: &Self);
79
80 fn invert(&self) -> VsssResult<Self>;
82}
83
84pub trait ShareVerifier<S: Share>:
86 ShareElement
87 + Copy
88 + Add<Output = Self>
89 + Sub<Output = Self>
90 + AddAssign
91 + SubAssign
92 + Neg<Output = Self>
93 + Mul<S::Identifier, Output = Self>
94 + Mul<S::Value, Output = Self>
95 + MulAssign<S::Identifier>
96 + MulAssign<S::Value>
97 + for<'a> Mul<&'a S::Identifier, Output = Self>
98 + for<'a> Mul<&'a S::Value, Output = Self>
99 + for<'a> MulAssign<&'a S::Identifier>
100 + for<'a> MulAssign<&'a S::Value>
101{
102}
103
104impl<
105 S: Share,
106 SV: ShareElement
107 + Copy
108 + Add<Output = Self>
109 + Sub<Output = Self>
110 + AddAssign
111 + SubAssign
112 + Neg<Output = Self>
113 + Mul<S::Identifier, Output = Self>
114 + Mul<S::Value, Output = Self>
115 + MulAssign<S::Identifier>
116 + MulAssign<S::Value>
117 + for<'a> Mul<&'a S::Identifier, Output = Self>
118 + for<'a> Mul<&'a S::Value, Output = Self>
119 + for<'a> MulAssign<&'a S::Identifier>
120 + for<'a> MulAssign<&'a S::Value>,
121 > ShareVerifier<S> for SV
122{
123}
124
125pub trait ShareElementInner:
127 Sized
128 + Debug
129 + Eq
130 + PartialEq
131 + Clone
132 + Default
133 + 'static
134 + Add<Output = Self>
135 + Sub<Output = Self>
136 + AddAssign
137 + SubAssign
138 + for<'a> Add<&'a Self, Output = Self>
139 + for<'a> Sub<&'a Self, Output = Self>
140 + for<'a> AddAssign<&'a Self>
141 + for<'a> SubAssign<&'a Self>
142{
143}
144
145impl<
146 I: Sized
147 + Debug
148 + Eq
149 + PartialEq
150 + Clone
151 + Default
152 + 'static
153 + Add<Output = Self>
154 + Sub<Output = Self>
155 + AddAssign
156 + SubAssign
157 + for<'a> Add<&'a Self, Output = Self>
158 + for<'a> Sub<&'a Self, Output = Self>
159 + for<'a> AddAssign<&'a Self>
160 + for<'a> SubAssign<&'a Self>,
161 > ShareElementInner for I
162{
163}
164
165pub trait ShareIdentifierInner:
167 ShareElementInner
168 + Mul<Output = Self>
169 + MulAssign
170 + for<'a> Mul<&'a Self, Output = Self>
171 + for<'a> MulAssign<&'a Self>
172{
173}
174
175impl<
176 E: ShareElementInner
177 + Mul<Output = Self>
178 + MulAssign
179 + for<'a> Mul<&'a Self, Output = Self>
180 + for<'a> MulAssign<&'a Self>,
181 > ShareIdentifierInner for E
182{
183}