use crate::*;
use core::{
marker::PhantomData,
ops::{Deref, DerefMut},
};
use generic_array::{ArrayLength, GenericArray};
use hybrid_array::{Array, ArraySize};
pub trait ReadableShareSet<S>: AsRef<[S]>
where
S: Share,
{
fn combine(&self) -> VsssResult<S::Value> {
let shares = self.as_ref();
if shares.len() < 2 {
return Err(Error::SharingMinThreshold);
}
for s in shares {
if s.identifier().is_zero().into() {
return Err(Error::SharingInvalidIdentifier);
}
}
if dup_checker(shares) {
return Err(Error::SharingDuplicateIdentifier);
}
interpolate(shares)
}
}
pub trait WriteableShareSet<S>: ReadableShareSet<S> + AsMut<[S]>
where
S: Share,
{
fn create(size_hint: usize) -> Self;
}
impl<S, B: AsRef<[S]>> ReadableShareSet<S> for B where S: Share {}
fn interpolate<S>(shares: &[S]) -> VsssResult<S::Value>
where
S: Share,
{
let mut secret = S::Value::default();
for (i, x_i) in shares.iter().enumerate() {
let mut num = S::Identifier::one();
let mut den = S::Identifier::one();
for (j, x_j) in shares.iter().enumerate() {
if i == j {
continue;
}
let d = x_j.identifier().as_ref().clone() - x_i.identifier().as_ref().clone();
*den.as_mut() *= d;
*num.as_mut() *= x_j.identifier().as_ref();
}
let den = den.invert().expect("shouldn't be zero");
let basis: S::Identifier = (num.as_ref().clone() * den.as_ref()).into();
let t = x_i.value().clone() * &basis;
*secret.as_mut() += t.as_ref();
}
Ok(secret)
}
impl<S, const L: usize> WriteableShareSet<S> for [S; L]
where
S: Share,
{
fn create(_size_hint: usize) -> Self {
core::array::from_fn(|_| S::default())
}
}
impl<S, L> WriteableShareSet<S> for GenericArray<S, L>
where
S: Share,
L: ArrayLength,
{
fn create(_size_hint: usize) -> Self {
Self::try_from_iter((0..L::to_usize()).map(|_| S::default())).unwrap()
}
}
impl<S, L> WriteableShareSet<S> for Array<S, L>
where
S: Share,
L: ArraySize,
{
fn create(_size_hint: usize) -> Self {
Self::try_from_iter((0..L::to_usize()).map(|_| S::default())).unwrap()
}
}
#[cfg(any(feature = "alloc", feature = "std"))]
impl<S> WriteableShareSet<S> for Vec<S>
where
S: Share,
{
fn create(size_hint: usize) -> Self {
(0..size_hint).map(|_| S::default()).collect()
}
}
fn dup_checker<S>(set: &[S]) -> bool
where
S: Share,
{
for (i, x_i) in set.iter().enumerate() {
for x_j in set.iter().skip(i + 1) {
if x_i.identifier() == x_j.identifier() {
return true;
}
}
}
false
}
pub trait FeldmanVerifierSet<S, G>: Sized
where
S: Share,
G: ShareVerifier<S>,
{
fn empty_feldman_set_with_capacity(size_hint: usize, generator: G) -> Self;
fn feldman_set_with_generator_and_verifiers(generator: G, verifiers: &[G]) -> Self {
let mut set = Self::empty_feldman_set_with_capacity(verifiers.len(), generator);
set.verifiers_mut().copy_from_slice(verifiers);
set
}
fn generator(&self) -> G;
fn verifiers(&self) -> &[G];
fn verifiers_mut(&mut self) -> &mut [G];
fn verify_share(&self, share: &S) -> VsssResult<()> {
if (share.value().is_zero() | share.identifier().is_zero()).into() {
return Err(Error::InvalidShare);
}
if self.generator().is_zero().into() {
return Err(Error::InvalidGenerator("Generator is identity"));
}
let s = share.value();
let mut i = S::Identifier::one();
let commitments = self.verifiers();
let mut rhs = commitments[0];
for v in &commitments[1..] {
*i.as_mut() *= share.identifier().as_ref();
rhs += *v * i.clone();
}
let lhs = self.generator() * s;
let res: G = rhs - lhs;
if res.is_zero().into() {
Ok(())
} else {
Err(Error::InvalidShare)
}
}
}
pub trait PedersenVerifierSet<S, G>: Sized
where
S: Share,
G: ShareVerifier<S>,
{
fn empty_pedersen_set_with_capacity(
size_hint: usize,
secret_generator: G,
blinder_generator: G,
) -> Self;
fn pedersen_set_with_generators_and_verifiers(
secret_generator: G,
blinder_generator: G,
verifiers: &[G],
) -> Self {
let mut set = Self::empty_pedersen_set_with_capacity(
verifiers.len(),
secret_generator,
blinder_generator,
);
set.blind_verifiers_mut().copy_from_slice(verifiers);
set
}
fn secret_generator(&self) -> G;
fn blinder_generator(&self) -> G;
fn blind_verifiers(&self) -> &[G];
fn blind_verifiers_mut(&mut self) -> &mut [G];
fn verify_share_and_blinder(&self, share: &S, blinder: &S) -> VsssResult<()> {
if (share.value().is_zero() | blinder.value().is_zero() | share.identifier().is_zero())
.into()
{
return Err(Error::InvalidShare);
}
let blind_generator = self.blinder_generator();
let generator = self.secret_generator();
if generator == G::default() || blind_generator == G::default() {
return Err(Error::InvalidGenerator(
"Generator or Blind generator is an identity",
));
}
let secret = share.value();
let blinder = blinder.value();
let x = share.identifier();
let mut i = S::Identifier::one();
let commitments = self.blind_verifiers();
let mut rhs = commitments[0];
for v in &commitments[1..] {
*i.as_mut() *= x.as_ref();
rhs += *v * i.clone();
}
let g: G = generator * secret;
let h: G = blind_generator * blinder;
let res = rhs - g - h;
if res == G::default() {
Ok(())
} else {
Err(Error::InvalidShare)
}
}
}
impl<S: Share, G: ShareVerifier<S>, const L: usize> FeldmanVerifierSet<S, G> for [G; L] {
fn empty_feldman_set_with_capacity(_size_hint: usize, generator: G) -> Self {
let mut t = [G::default(); L];
t[0] = generator;
t
}
fn generator(&self) -> G {
self[0]
}
fn verifiers(&self) -> &[G] {
&self[1..]
}
fn verifiers_mut(&mut self) -> &mut [G] {
self[1..].as_mut()
}
}
impl<S: Share, G: ShareVerifier<S>, L: ArrayLength> FeldmanVerifierSet<S, G>
for GenericArray<G, L>
{
fn empty_feldman_set_with_capacity(_size_hint: usize, generator: G) -> Self {
let mut t = Self::default();
t[0] = generator;
t
}
fn generator(&self) -> G {
self[0]
}
fn verifiers(&self) -> &[G] {
&self[1..]
}
fn verifiers_mut(&mut self) -> &mut [G] {
self[1..].as_mut()
}
}
impl<S: Share, G: ShareVerifier<S>, L: ArraySize> FeldmanVerifierSet<S, G> for Array<G, L> {
fn empty_feldman_set_with_capacity(_size_hint: usize, generator: G) -> Self {
let mut t = Self::default();
t[0] = generator;
t
}
fn generator(&self) -> G {
self[0]
}
fn verifiers(&self) -> &[G] {
&self[1..]
}
fn verifiers_mut(&mut self) -> &mut [G] {
self[1..].as_mut()
}
}
#[derive(Debug, Clone, Copy)]
#[repr(transparent)]
pub struct ArrayFeldmanVerifierSet<S, V, const L: usize>
where
S: Share,
V: ShareVerifier<S>,
{
pub inner: [V; L],
pub _marker: PhantomData<S>,
}
impl<S, V, const L: usize> From<[V; L]> for ArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
{
fn from(inner: [V; L]) -> Self {
Self {
inner,
_marker: PhantomData,
}
}
}
impl<S, V, const L: usize> From<&[V; L]> for ArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
{
fn from(inner: &[V; L]) -> Self {
Self {
inner: *inner,
_marker: PhantomData,
}
}
}
impl<S, V, const L: usize> From<ArrayFeldmanVerifierSet<S, V, L>> for [V; L]
where
S: Share,
V: ShareVerifier<S>,
{
fn from(set: ArrayFeldmanVerifierSet<S, V, L>) -> Self {
set.inner
}
}
impl<S, V, const L: usize> From<&ArrayFeldmanVerifierSet<S, V, L>> for [V; L]
where
S: Share,
V: ShareVerifier<S>,
{
fn from(set: &ArrayFeldmanVerifierSet<S, V, L>) -> Self {
set.inner
}
}
impl<S, V, const L: usize> Deref for ArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
{
type Target = [V; L];
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<S, V, const L: usize> DerefMut for ArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
{
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
impl<S, V, const L: usize> Default for ArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
[V; L]: Default,
{
fn default() -> Self {
Self {
inner: Default::default(),
_marker: PhantomData,
}
}
}
impl<S, V, const L: usize> FeldmanVerifierSet<S, V> for ArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
{
fn empty_feldman_set_with_capacity(size_hint: usize, generator: V) -> Self {
Self {
inner: <[V; L] as FeldmanVerifierSet<S, V>>::empty_feldman_set_with_capacity(
size_hint, generator,
),
_marker: PhantomData,
}
}
fn generator(&self) -> V {
<[V; L]>::generator(&self.inner)
}
fn verifiers(&self) -> &[V] {
<[V; L]>::verifiers(&self.inner)
}
fn verifiers_mut(&mut self) -> &mut [V] {
<[V; L]>::verifiers_mut(&mut self.inner)
}
}
#[derive(Debug, Clone)]
#[repr(transparent)]
pub struct GenericArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
{
pub inner: GenericArray<V, L>,
pub _marker: PhantomData<S>,
}
impl<S, V, L> From<GenericArray<V, L>> for GenericArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
{
fn from(inner: GenericArray<V, L>) -> Self {
Self {
inner,
_marker: PhantomData,
}
}
}
impl<S, V, L> From<&GenericArray<V, L>> for GenericArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
{
fn from(inner: &GenericArray<V, L>) -> Self {
Self {
inner: inner.clone(),
_marker: PhantomData,
}
}
}
impl<S, V, L> From<GenericArrayFeldmanVerifierSet<S, V, L>> for GenericArray<V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
{
fn from(set: GenericArrayFeldmanVerifierSet<S, V, L>) -> Self {
set.inner
}
}
impl<S, V, L> From<&GenericArrayFeldmanVerifierSet<S, V, L>> for GenericArray<V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
{
fn from(set: &GenericArrayFeldmanVerifierSet<S, V, L>) -> Self {
set.inner.clone()
}
}
impl<S, V, L> Deref for GenericArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
{
type Target = GenericArray<V, L>;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<S, V, L> DerefMut for GenericArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
{
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
impl<S, V, L> Default for GenericArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
GenericArray<V, L>: Default,
{
fn default() -> Self {
Self {
inner: Default::default(),
_marker: PhantomData,
}
}
}
impl<S, V, L> FeldmanVerifierSet<S, V> for GenericArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
{
fn empty_feldman_set_with_capacity(size_hint: usize, generator: V) -> Self {
Self {
inner:
<GenericArray<V, L> as FeldmanVerifierSet<S, V>>::empty_feldman_set_with_capacity(
size_hint, generator,
),
_marker: PhantomData,
}
}
fn generator(&self) -> V {
<GenericArray<V, L>>::generator(&self.inner)
}
fn verifiers(&self) -> &[V] {
<GenericArray<V, L>>::verifiers(&self.inner)
}
fn verifiers_mut(&mut self) -> &mut [V] {
<GenericArray<V, L>>::verifiers_mut(&mut self.inner)
}
}
#[derive(Debug, Clone)]
#[repr(transparent)]
pub struct HybridArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
{
pub inner: Array<V, L>,
pub _marker: PhantomData<S>,
}
impl<S, V, L> From<Array<V, L>> for HybridArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
{
fn from(inner: Array<V, L>) -> Self {
Self {
inner,
_marker: PhantomData,
}
}
}
impl<S, V, L> From<&Array<V, L>> for HybridArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
{
fn from(inner: &Array<V, L>) -> Self {
Self {
inner: inner.clone(),
_marker: PhantomData,
}
}
}
impl<S, V, L> From<HybridArrayFeldmanVerifierSet<S, V, L>> for Array<V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
{
fn from(set: HybridArrayFeldmanVerifierSet<S, V, L>) -> Self {
set.inner
}
}
impl<S, V, L> From<&HybridArrayFeldmanVerifierSet<S, V, L>> for Array<V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
{
fn from(set: &HybridArrayFeldmanVerifierSet<S, V, L>) -> Self {
set.inner.clone()
}
}
impl<S, V, L> Deref for HybridArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
{
type Target = Array<V, L>;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<S, V, L> DerefMut for HybridArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
{
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
impl<S, V, L> Default for HybridArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
Array<V, L>: Default,
{
fn default() -> Self {
Self {
inner: Default::default(),
_marker: PhantomData,
}
}
}
impl<S, V, L> FeldmanVerifierSet<S, V> for HybridArrayFeldmanVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
{
fn empty_feldman_set_with_capacity(size_hint: usize, generator: V) -> Self {
Self {
inner: <Array<V, L> as FeldmanVerifierSet<S, V>>::empty_feldman_set_with_capacity(
size_hint, generator,
),
_marker: PhantomData,
}
}
fn generator(&self) -> V {
<Array<V, L>>::generator(&self.inner)
}
fn verifiers(&self) -> &[V] {
<Array<V, L>>::verifiers(&self.inner)
}
fn verifiers_mut(&mut self) -> &mut [V] {
<Array<V, L>>::verifiers_mut(&mut self.inner)
}
}
#[cfg(any(feature = "alloc", feature = "std"))]
impl<S: Share, G: ShareVerifier<S>> FeldmanVerifierSet<S, G> for Vec<G> {
fn empty_feldman_set_with_capacity(size_hint: usize, generator: G) -> Self {
vec![generator; size_hint + 1]
}
fn generator(&self) -> G {
self[0]
}
fn verifiers(&self) -> &[G] {
&self[1..]
}
fn verifiers_mut(&mut self) -> &mut [G] {
self[1..].as_mut()
}
}
#[cfg(any(feature = "alloc", feature = "std"))]
#[derive(Debug, Clone, Default)]
#[repr(transparent)]
pub struct VecFeldmanVerifierSet<S, V>
where
S: Share,
V: ShareVerifier<S>,
{
pub inner: Vec<V>,
pub _marker: PhantomData<S>,
}
#[cfg(any(feature = "alloc", feature = "std"))]
impl<S, V> From<Vec<V>> for VecFeldmanVerifierSet<S, V>
where
S: Share,
V: ShareVerifier<S>,
{
fn from(value: Vec<V>) -> Self {
Self {
inner: value,
_marker: PhantomData,
}
}
}
#[cfg(any(feature = "alloc", feature = "std"))]
impl<S, V> From<&Vec<V>> for VecFeldmanVerifierSet<S, V>
where
S: Share,
V: ShareVerifier<S>,
{
fn from(value: &Vec<V>) -> Self {
Self {
inner: value.clone(),
_marker: PhantomData,
}
}
}
#[cfg(any(feature = "alloc", feature = "std"))]
impl<S, V> From<VecFeldmanVerifierSet<S, V>> for Vec<V>
where
S: Share,
V: ShareVerifier<S>,
{
fn from(value: VecFeldmanVerifierSet<S, V>) -> Self {
value.inner
}
}
#[cfg(any(feature = "alloc", feature = "std"))]
impl<S, V> From<&VecFeldmanVerifierSet<S, V>> for Vec<V>
where
S: Share,
V: ShareVerifier<S>,
{
fn from(value: &VecFeldmanVerifierSet<S, V>) -> Self {
value.inner.clone()
}
}
#[cfg(any(feature = "alloc", feature = "std"))]
impl<S, V> Deref for VecFeldmanVerifierSet<S, V>
where
S: Share,
V: ShareVerifier<S>,
{
type Target = Vec<V>;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
#[cfg(any(feature = "alloc", feature = "std"))]
impl<S, V> DerefMut for VecFeldmanVerifierSet<S, V>
where
S: Share,
V: ShareVerifier<S>,
{
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
#[cfg(any(feature = "alloc", feature = "std"))]
impl<S, V> FeldmanVerifierSet<S, V> for VecFeldmanVerifierSet<S, V>
where
S: Share,
V: ShareVerifier<S>,
{
fn empty_feldman_set_with_capacity(size_hint: usize, generator: V) -> Self {
Self {
inner: <Vec<V> as FeldmanVerifierSet<S, V>>::empty_feldman_set_with_capacity(
size_hint, generator,
),
_marker: PhantomData,
}
}
fn generator(&self) -> V {
<Vec<V>>::generator(&self.inner)
}
fn verifiers(&self) -> &[V] {
<Vec<V>>::verifiers(&self.inner)
}
fn verifiers_mut(&mut self) -> &mut [V] {
<Vec<V>>::verifiers_mut(&mut self.inner)
}
}
impl<S: Share, G: ShareVerifier<S>, const L: usize> PedersenVerifierSet<S, G> for [G; L] {
fn empty_pedersen_set_with_capacity(
_size_hint: usize,
secret_generator: G,
blinder_generator: G,
) -> Self {
let mut t = [G::default(); L];
t[0] = secret_generator;
t[1] = blinder_generator;
t
}
fn secret_generator(&self) -> G {
self[0]
}
fn blinder_generator(&self) -> G {
self[1]
}
fn blind_verifiers(&self) -> &[G] {
&self[2..]
}
fn blind_verifiers_mut(&mut self) -> &mut [G] {
self[2..].as_mut()
}
}
#[derive(Debug, Clone, Copy)]
#[repr(transparent)]
pub struct ArrayPedersenVerifierSet<S, V, const L: usize>
where
S: Share,
V: ShareVerifier<S>,
{
pub inner: [V; L],
pub _marker: PhantomData<S>,
}
impl<S, V, const L: usize> From<[V; L]> for ArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
{
fn from(inner: [V; L]) -> Self {
Self {
inner,
_marker: PhantomData,
}
}
}
impl<S, V, const L: usize> From<&[V; L]> for ArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
{
fn from(inner: &[V; L]) -> Self {
Self {
inner: *inner,
_marker: PhantomData,
}
}
}
impl<S, V, const L: usize> From<ArrayPedersenVerifierSet<S, V, L>> for [V; L]
where
S: Share,
V: ShareVerifier<S>,
{
fn from(set: ArrayPedersenVerifierSet<S, V, L>) -> Self {
set.inner
}
}
impl<S, V, const L: usize> From<&ArrayPedersenVerifierSet<S, V, L>> for [V; L]
where
S: Share,
V: ShareVerifier<S>,
{
fn from(set: &ArrayPedersenVerifierSet<S, V, L>) -> Self {
set.inner
}
}
impl<S, V, const L: usize> Deref for ArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
{
type Target = [V; L];
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<S, V, const L: usize> DerefMut for ArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
{
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
impl<S, V, const L: usize> Default for ArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
[V; L]: Default,
{
fn default() -> Self {
Self {
inner: Default::default(),
_marker: PhantomData,
}
}
}
impl<S, V, const L: usize> PedersenVerifierSet<S, V> for ArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
{
fn empty_pedersen_set_with_capacity(
size_hint: usize,
secret_generator: V,
blinder_generator: V,
) -> Self {
Self {
inner: <[V; L] as PedersenVerifierSet<S, V>>::empty_pedersen_set_with_capacity(
size_hint,
secret_generator,
blinder_generator,
),
_marker: PhantomData,
}
}
fn secret_generator(&self) -> V {
<[V; L]>::secret_generator(&self.inner)
}
fn blinder_generator(&self) -> V {
<[V; L]>::blinder_generator(&self.inner)
}
fn blind_verifiers(&self) -> &[V] {
<[V; L]>::blind_verifiers(&self.inner)
}
fn blind_verifiers_mut(&mut self) -> &mut [V] {
<[V; L]>::blind_verifiers_mut(&mut self.inner)
}
}
impl<S: Share, G: ShareVerifier<S>, L: ArrayLength> PedersenVerifierSet<S, G>
for GenericArray<G, L>
{
fn empty_pedersen_set_with_capacity(
_size_hint: usize,
secret_generator: G,
blinder_generator: G,
) -> Self {
let mut t = Self::default();
t[0] = secret_generator;
t[1] = blinder_generator;
t
}
fn secret_generator(&self) -> G {
self[0]
}
fn blinder_generator(&self) -> G {
self[1]
}
fn blind_verifiers(&self) -> &[G] {
&self[2..]
}
fn blind_verifiers_mut(&mut self) -> &mut [G] {
self[2..].as_mut()
}
}
impl<S: Share, G: ShareVerifier<S>, L: ArraySize> PedersenVerifierSet<S, G> for Array<G, L> {
fn empty_pedersen_set_with_capacity(
_size_hint: usize,
secret_generator: G,
blinder_generator: G,
) -> Self {
let mut t = Self::default();
t[0] = secret_generator;
t[1] = blinder_generator;
t
}
fn secret_generator(&self) -> G {
self[0]
}
fn blinder_generator(&self) -> G {
self[1]
}
fn blind_verifiers(&self) -> &[G] {
&self[2..]
}
fn blind_verifiers_mut(&mut self) -> &mut [G] {
self[2..].as_mut()
}
}
#[derive(Debug, Clone)]
#[repr(transparent)]
pub struct GenericArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
{
pub inner: GenericArray<V, L>,
pub _marker: PhantomData<S>,
}
impl<S, V, L> From<GenericArray<V, L>> for GenericArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
{
fn from(inner: GenericArray<V, L>) -> Self {
Self {
inner,
_marker: PhantomData,
}
}
}
impl<S, V, L> From<&GenericArray<V, L>> for GenericArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
{
fn from(inner: &GenericArray<V, L>) -> Self {
Self {
inner: inner.clone(),
_marker: PhantomData,
}
}
}
impl<S, V, L> From<GenericArrayPedersenVerifierSet<S, V, L>> for GenericArray<V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
{
fn from(set: GenericArrayPedersenVerifierSet<S, V, L>) -> Self {
set.inner
}
}
impl<S, V, L> From<&GenericArrayPedersenVerifierSet<S, V, L>> for GenericArray<V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
{
fn from(set: &GenericArrayPedersenVerifierSet<S, V, L>) -> Self {
set.inner.clone()
}
}
impl<S, V, L> Deref for GenericArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
{
type Target = GenericArray<V, L>;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<S, V, L> DerefMut for GenericArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
{
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
impl<S, V, L> Default for GenericArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
GenericArray<V, L>: Default,
{
fn default() -> Self {
Self {
inner: Default::default(),
_marker: PhantomData,
}
}
}
impl<S, V, L> PedersenVerifierSet<S, V> for GenericArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArrayLength,
{
fn empty_pedersen_set_with_capacity(
size_hint: usize,
secret_generator: V,
blinder_generator: V,
) -> Self {
Self {
inner:
<GenericArray<V, L> as PedersenVerifierSet<S, V>>::empty_pedersen_set_with_capacity(
size_hint,
secret_generator,
blinder_generator,
),
_marker: PhantomData,
}
}
fn secret_generator(&self) -> V {
<GenericArray<V, L>>::secret_generator(&self.inner)
}
fn blinder_generator(&self) -> V {
<GenericArray<V, L>>::blinder_generator(&self.inner)
}
fn blind_verifiers(&self) -> &[V] {
<GenericArray<V, L>>::blind_verifiers(&self.inner)
}
fn blind_verifiers_mut(&mut self) -> &mut [V] {
<GenericArray<V, L>>::blind_verifiers_mut(&mut self.inner)
}
}
pub struct HybridArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
{
pub inner: Array<V, L>,
pub _marker: PhantomData<S>,
}
impl<S, V, L> From<Array<V, L>> for HybridArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
{
fn from(inner: Array<V, L>) -> Self {
Self {
inner,
_marker: PhantomData,
}
}
}
impl<S, V, L> From<&Array<V, L>> for HybridArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
{
fn from(inner: &Array<V, L>) -> Self {
Self {
inner: inner.clone(),
_marker: PhantomData,
}
}
}
impl<S, V, L> From<HybridArrayPedersenVerifierSet<S, V, L>> for Array<V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
{
fn from(set: HybridArrayPedersenVerifierSet<S, V, L>) -> Self {
set.inner
}
}
impl<S, V, L> From<&HybridArrayPedersenVerifierSet<S, V, L>> for Array<V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
{
fn from(set: &HybridArrayPedersenVerifierSet<S, V, L>) -> Self {
set.inner.clone()
}
}
impl<S, V, L> Deref for HybridArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
{
type Target = Array<V, L>;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<S, V, L> DerefMut for HybridArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
{
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
impl<S, V, L> Default for HybridArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
Array<V, L>: Default,
{
fn default() -> Self {
Self {
inner: Default::default(),
_marker: PhantomData,
}
}
}
impl<S, V, L> PedersenVerifierSet<S, V> for HybridArrayPedersenVerifierSet<S, V, L>
where
S: Share,
V: ShareVerifier<S>,
L: ArraySize,
{
fn empty_pedersen_set_with_capacity(
size_hint: usize,
secret_generator: V,
blinder_generator: V,
) -> Self {
Self {
inner: <Array<V, L> as PedersenVerifierSet<S, V>>::empty_pedersen_set_with_capacity(
size_hint,
secret_generator,
blinder_generator,
),
_marker: PhantomData,
}
}
fn secret_generator(&self) -> V {
<Array<V, L>>::secret_generator(&self.inner)
}
fn blinder_generator(&self) -> V {
<Array<V, L>>::blinder_generator(&self.inner)
}
fn blind_verifiers(&self) -> &[V] {
<Array<V, L>>::blind_verifiers(&self.inner)
}
fn blind_verifiers_mut(&mut self) -> &mut [V] {
<Array<V, L>>::blind_verifiers_mut(&mut self.inner)
}
}
#[cfg(any(feature = "alloc", feature = "std"))]
impl<S: Share, V: ShareVerifier<S>> PedersenVerifierSet<S, V> for Vec<V> {
fn empty_pedersen_set_with_capacity(
size_hint: usize,
secret_generator: V,
blinder_generator: V,
) -> Self {
let mut t = vec![blinder_generator; size_hint + 2];
t[0] = secret_generator;
t
}
fn secret_generator(&self) -> V {
self[0]
}
fn blinder_generator(&self) -> V {
self[1]
}
fn blind_verifiers(&self) -> &[V] {
&self[2..]
}
fn blind_verifiers_mut(&mut self) -> &mut [V] {
self[2..].as_mut()
}
}
#[cfg(any(feature = "alloc", feature = "std"))]
#[derive(Debug, Clone, Default)]
#[repr(transparent)]
pub struct VecPedersenVerifierSet<S, V>
where
S: Share,
V: ShareVerifier<S>,
{
pub inner: Vec<V>,
pub _marker: PhantomData<S>,
}
#[cfg(any(feature = "alloc", feature = "std"))]
impl<S, V> From<Vec<V>> for VecPedersenVerifierSet<S, V>
where
S: Share,
V: ShareVerifier<S>,
{
fn from(inner: Vec<V>) -> Self {
Self {
inner,
_marker: PhantomData,
}
}
}
#[cfg(any(feature = "alloc", feature = "std"))]
impl<S, V> From<&Vec<V>> for VecPedersenVerifierSet<S, V>
where
S: Share,
V: ShareVerifier<S>,
{
fn from(inner: &Vec<V>) -> Self {
Self {
inner: (*inner).clone(),
_marker: PhantomData,
}
}
}
#[cfg(any(feature = "alloc", feature = "std"))]
impl<S, V> From<VecPedersenVerifierSet<S, V>> for Vec<V>
where
S: Share,
V: ShareVerifier<S>,
{
fn from(set: VecPedersenVerifierSet<S, V>) -> Self {
set.inner
}
}
#[cfg(any(feature = "alloc", feature = "std"))]
impl<S, V> From<&VecPedersenVerifierSet<S, V>> for Vec<V>
where
S: Share,
V: ShareVerifier<S>,
{
fn from(set: &VecPedersenVerifierSet<S, V>) -> Self {
set.inner.clone()
}
}
#[cfg(any(feature = "alloc", feature = "std"))]
impl<S, V> Deref for VecPedersenVerifierSet<S, V>
where
S: Share,
V: ShareVerifier<S>,
{
type Target = Vec<V>;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
#[cfg(any(feature = "alloc", feature = "std"))]
impl<S, V> DerefMut for VecPedersenVerifierSet<S, V>
where
S: Share,
V: ShareVerifier<S>,
{
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
#[cfg(any(feature = "alloc", feature = "std"))]
impl<S, V> PedersenVerifierSet<S, V> for VecPedersenVerifierSet<S, V>
where
S: Share,
V: ShareVerifier<S>,
{
fn empty_pedersen_set_with_capacity(
size_hint: usize,
secret_generator: V,
blinder_generator: V,
) -> Self {
Self {
inner: <Vec<V> as PedersenVerifierSet<S, V>>::empty_pedersen_set_with_capacity(
size_hint,
secret_generator,
blinder_generator,
),
_marker: PhantomData,
}
}
fn secret_generator(&self) -> V {
<Vec<V>>::secret_generator(&self.inner)
}
fn blinder_generator(&self) -> V {
<Vec<V>>::blinder_generator(&self.inner)
}
fn blind_verifiers(&self) -> &[V] {
<Vec<V>>::blind_verifiers(&self.inner)
}
fn blind_verifiers_mut(&mut self) -> &mut [V] {
<Vec<V>>::blind_verifiers_mut(&mut self.inner)
}
}
#[test]
fn test_feldman_with_generator_and_verifiers() {
type IdK256 = IdentifierPrimeField<k256::Scalar>;
type VK256 = ValuePrimeField<k256::Scalar>;
type ShareVerifierK256 = ShareVerifierGroup<k256::ProjectivePoint>;
type K256Share = (IdK256, VK256);
let set = <[ShareVerifierK256; 8] as FeldmanVerifierSet<K256Share, ShareVerifierK256>>::feldman_set_with_generator_and_verifiers(
ValueGroup(k256::ProjectivePoint::GENERATOR),
&[ValueGroup(k256::ProjectivePoint::IDENTITY); 7]);
assert_eq!(
ValueGroup(k256::ProjectivePoint::GENERATOR),
<[ShareVerifierK256; 8] as FeldmanVerifierSet<K256Share, ShareVerifierK256>>::generator(
&set
)
);
assert_eq!(
[ValueGroup(k256::ProjectivePoint::IDENTITY); 7],
<[ShareVerifierK256; 8] as FeldmanVerifierSet<K256Share, ShareVerifierK256>>::verifiers(
&set
)
);
}