vsss_rs/
element.rs

1//! Share identifiers for secret sharing schemes.
2
3#[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
36/// A value used to represent a share element for secret shares.
37/// A share element can either be the share identifier or the share value.
38pub 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    /// The serialized form of the share element.
52    type Serialization: AsRef<[u8]> + AsMut<[u8]> + 'static;
53    /// The inner type of the share element.
54    type Inner: ShareElementInner;
55
56    /// Generate a random share element.
57    fn random(rng: impl RngCore + CryptoRng) -> Self;
58    /// Defines an additive identity element for the share identifier.
59    fn zero() -> Self;
60    /// Defines a multiplicative identity element for the share identifier.
61    fn one() -> Self;
62    /// Check if the share identifier is zero.
63    fn is_zero(&self) -> Choice;
64    /// Serialize the share identifier.
65    fn serialize(&self) -> Self::Serialization;
66    /// Deserialize the share identifier.
67    fn deserialize(serialized: &Self::Serialization) -> VsssResult<Self>;
68    /// Attempt to convert the byte sequence to a share element.
69    fn from_slice(slice: &[u8]) -> VsssResult<Self>;
70    #[cfg(any(feature = "alloc", feature = "std"))]
71    /// Serialize the share identifier to a byte vector.
72    fn to_vec(&self) -> Vec<u8>;
73}
74
75/// A share identifier for secret sharing schemes.
76pub trait ShareIdentifier: ShareElement<Inner: ShareIdentifierInner> {
77    /// Add to the identifier by the increment value.
78    fn inc(&mut self, increment: &Self);
79
80    /// Invert the share identifier.
81    fn invert(&self) -> VsssResult<Self>;
82}
83
84/// Objects that represent the ability to verify shamir shares
85pub 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
125/// A share element inner type for secret sharing schemes.
126pub 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
165/// A share identifier inner type for secret sharing schemes.
166pub 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}