#[cfg(any(feature = "alloc", feature = "std"))]
mod biguint;
mod group_element;
#[cfg(feature = "bigint")]
mod monty_residue;
mod prime_field;
#[cfg(feature = "primitive")]
mod primitive;
#[cfg(feature = "bigint")]
mod residue;
#[cfg(feature = "bigint")]
pub mod uint;
#[cfg(feature = "bigint")]
pub mod uint5;
#[cfg(any(feature = "alloc", feature = "std"))]
pub use biguint::*;
pub use group_element::*;
#[cfg(feature = "bigint")]
pub use monty_residue::*;
pub use prime_field::*;
#[cfg(feature = "primitive")]
pub use primitive::*;
#[cfg(feature = "bigint")]
pub use residue::*;
use crate::*;
use core::{
fmt::Debug,
ops::{Add, AddAssign, Deref, DerefMut, Mul, MulAssign, Neg, Sub, SubAssign},
};
#[cfg(feature = "bigint")]
use elliptic_curve::bigint::{Encoding, Random, Zero as CryptoZero};
use rand_core::{CryptoRng, RngCore};
use subtle::Choice;
pub trait ShareElement:
Sized
+ Clone
+ Default
+ Debug
+ Eq
+ PartialEq
+ Deref<Target = Self::Inner>
+ DerefMut<Target = Self::Inner>
+ AsRef<Self::Inner>
+ AsMut<Self::Inner>
+ From<Self::Inner>
{
type Serialization: AsRef<[u8]> + AsMut<[u8]> + 'static;
type Inner: ShareElementInner;
fn random(rng: impl RngCore + CryptoRng) -> Self;
fn zero() -> Self;
fn one() -> Self;
fn is_zero(&self) -> Choice;
fn serialize(&self) -> Self::Serialization;
fn deserialize(serialized: &Self::Serialization) -> VsssResult<Self>;
fn from_slice(slice: &[u8]) -> VsssResult<Self>;
#[cfg(any(feature = "alloc", feature = "std"))]
fn to_vec(&self) -> Vec<u8>;
}
pub trait ShareIdentifier: ShareElement<Inner: ShareIdentifierInner> {
fn inc(&mut self, increment: &Self);
fn invert(&self) -> VsssResult<Self>;
fn random_coefficient(rng: impl RngCore + CryptoRng) -> Self {
<Self as ShareElement>::random(rng)
}
}
pub trait ShareVerifier<S: Share>:
ShareElement
+ Copy
+ Add<Output = Self>
+ Sub<Output = Self>
+ AddAssign
+ SubAssign
+ Neg<Output = Self>
+ Mul<S::Identifier, Output = Self>
+ Mul<S::Value, Output = Self>
+ MulAssign<S::Identifier>
+ MulAssign<S::Value>
+ for<'a> Mul<&'a S::Identifier, Output = Self>
+ for<'a> Mul<&'a S::Value, Output = Self>
+ for<'a> MulAssign<&'a S::Identifier>
+ for<'a> MulAssign<&'a S::Value>
{
}
impl<
S: Share,
SV: ShareElement
+ Copy
+ Add<Output = Self>
+ Sub<Output = Self>
+ AddAssign
+ SubAssign
+ Neg<Output = Self>
+ Mul<S::Identifier, Output = Self>
+ Mul<S::Value, Output = Self>
+ MulAssign<S::Identifier>
+ MulAssign<S::Value>
+ for<'a> Mul<&'a S::Identifier, Output = Self>
+ for<'a> Mul<&'a S::Value, Output = Self>
+ for<'a> MulAssign<&'a S::Identifier>
+ for<'a> MulAssign<&'a S::Value>,
> ShareVerifier<S> for SV
{
}
pub trait ShareElementInner:
Sized
+ Debug
+ Eq
+ PartialEq
+ Clone
+ Default
+ 'static
+ Add<Output = Self>
+ Sub<Output = Self>
+ AddAssign
+ SubAssign
+ for<'a> Add<&'a Self, Output = Self>
+ for<'a> Sub<&'a Self, Output = Self>
+ for<'a> AddAssign<&'a Self>
+ for<'a> SubAssign<&'a Self>
{
}
impl<
I: Sized
+ Debug
+ Eq
+ PartialEq
+ Clone
+ Default
+ 'static
+ Add<Output = Self>
+ Sub<Output = Self>
+ AddAssign
+ SubAssign
+ for<'a> Add<&'a Self, Output = Self>
+ for<'a> Sub<&'a Self, Output = Self>
+ for<'a> AddAssign<&'a Self>
+ for<'a> SubAssign<&'a Self>,
> ShareElementInner for I
{
}
pub trait ShareIdentifierInner:
ShareElementInner
+ Mul<Output = Self>
+ MulAssign
+ for<'a> Mul<&'a Self, Output = Self>
+ for<'a> MulAssign<&'a Self>
{
}
impl<
E: ShareElementInner
+ Mul<Output = Self>
+ MulAssign
+ for<'a> Mul<&'a Self, Output = Self>
+ for<'a> MulAssign<&'a Self>,
> ShareIdentifierInner for E
{
}