vsss_rs/
set.rs

1//! Sets are used for storing shares and other data associated with
2//! secret sharing operations like splitting, combining, and verifying
3//! Sizes greater than 32 should probably use Vec instead of fixed sizes
4//! due to stack allocations
5use crate::*;
6use core::{
7    marker::PhantomData,
8    ops::{Deref, DerefMut},
9};
10use generic_array::{ArrayLength, GenericArray};
11
12/// Represents a readable data store for secret shares
13pub trait ReadableShareSet<S>: AsRef<[S]>
14where
15    S: Share,
16{
17    /// Convert the given shares into a field element
18    fn combine(&self) -> VsssResult<S::Value> {
19        let shares = self.as_ref();
20        if shares.len() < 2 {
21            return Err(Error::SharingMinThreshold);
22        }
23        for s in shares {
24            if s.identifier().is_zero().into() {
25                return Err(Error::SharingInvalidIdentifier);
26            }
27        }
28        if dup_checker(shares) {
29            return Err(Error::SharingDuplicateIdentifier);
30        }
31        interpolate(shares)
32    }
33}
34
35/// Represents a data store for secret shares
36pub trait WriteableShareSet<S>: ReadableShareSet<S> + AsMut<[S]>
37where
38    S: Share,
39{
40    /// Create a new writeable share set
41    fn create(size_hint: usize) -> Self;
42}
43
44impl<S, B: AsRef<[S]>> ReadableShareSet<S> for B where S: Share {}
45
46fn interpolate<S>(shares: &[S]) -> VsssResult<S::Value>
47where
48    S: Share,
49{
50    let mut secret = S::Value::default();
51    // Calculate lagrange interpolation
52    for (i, x_i) in shares.iter().enumerate() {
53        let mut num = S::Identifier::one();
54        let mut den = S::Identifier::one();
55        for (j, x_j) in shares.iter().enumerate() {
56            if i == j {
57                continue;
58            }
59
60            // x_j / (x_j - x_i) * ...
61            let d = x_j.identifier().as_ref().clone() - x_i.identifier().as_ref().clone();
62            *den.as_mut() *= d;
63            *num.as_mut() *= x_j.identifier().as_ref();
64        }
65
66        let den = den.invert().expect("shouldn't be zero");
67        let basis: S::Identifier = (num.as_ref().clone() * den.as_ref()).into();
68        let t = x_i.value().clone() * &basis;
69        *secret.as_mut() += t.as_ref();
70    }
71
72    Ok(secret)
73}
74
75impl<S, const L: usize> WriteableShareSet<S> for [S; L]
76where
77    S: Share,
78{
79    fn create(_size_hint: usize) -> Self {
80        core::array::from_fn(|_| S::default())
81    }
82}
83
84impl<S, L> WriteableShareSet<S> for GenericArray<S, L>
85where
86    S: Share,
87    L: ArrayLength,
88{
89    fn create(_size_hint: usize) -> Self {
90        Self::try_from_iter((0..L::to_usize()).map(|_| S::default())).unwrap()
91    }
92}
93
94#[cfg(any(feature = "alloc", feature = "std"))]
95impl<S> WriteableShareSet<S> for Vec<S>
96where
97    S: Share,
98{
99    fn create(size_hint: usize) -> Self {
100        (0..size_hint).map(|_| S::default()).collect()
101    }
102}
103
104fn dup_checker<S>(set: &[S]) -> bool
105where
106    S: Share,
107{
108    for (i, x_i) in set.iter().enumerate() {
109        for x_j in set.iter().skip(i + 1) {
110            if x_i.identifier() == x_j.identifier() {
111                return true;
112            }
113        }
114    }
115    false
116}
117
118/// Objects that represent the ability to verify shamir shares using
119/// Feldman verifiers
120pub trait FeldmanVerifierSet<S, G>: Sized
121where
122    S: Share,
123    G: ShareVerifier<S>,
124{
125    /// Create a new verifier set
126    fn empty_feldman_set_with_capacity(size_hint: usize, generator: G) -> Self;
127
128    /// Create a verifier set from an existing set of verifiers and generator
129    fn feldman_set_with_generator_and_verifiers(generator: G, verifiers: &[G]) -> Self {
130        let mut set = Self::empty_feldman_set_with_capacity(verifiers.len(), generator);
131        set.verifiers_mut().copy_from_slice(verifiers);
132        set
133    }
134
135    /// The generator used for the verifiers
136    fn generator(&self) -> G;
137
138    /// The verifiers
139    fn verifiers(&self) -> &[G];
140
141    /// The verifiers as writeable
142    fn verifiers_mut(&mut self) -> &mut [G];
143
144    /// Verify a share with this set
145    fn verify_share(&self, share: &S) -> VsssResult<()> {
146        if (share.value().is_zero() | share.identifier().is_zero()).into() {
147            return Err(Error::InvalidShare);
148        }
149        if self.generator().is_zero().into() {
150            return Err(Error::InvalidGenerator("Generator is identity"));
151        }
152
153        let s = share.value();
154
155        let mut i = S::Identifier::one();
156
157        // FUTURE: execute this sum of products
158        // c_0 * c_1^i * c_2^{i^2} ... c_t^{i^t}
159        // as a constant time operation using <https://cr.yp.to/papers/pippenger.pdf>
160        // or Guide to Elliptic Curve Cryptography book,
161        // "Algorithm 3.48 Simultaneous multiple point multiplication"
162        // without precomputing the addition but still reduces doublings
163
164        // c_0
165        let commitments = self.verifiers();
166        let mut rhs = commitments[0];
167        for v in &commitments[1..] {
168            *i.as_mut() *= share.identifier().as_ref();
169
170            // c_0 * c_1^i * c_2^{i^2} ... c_t^{i^t}
171            rhs += *v * i.clone();
172        }
173
174        let lhs = self.generator() * s;
175
176        let res: G = rhs - lhs;
177
178        if res.is_zero().into() {
179            Ok(())
180        } else {
181            Err(Error::InvalidShare)
182        }
183    }
184}
185
186/// Objects that represent the ability to verify shamir shares using
187/// Pedersen verifiers
188pub trait PedersenVerifierSet<S, G>: Sized
189where
190    S: Share,
191    G: ShareVerifier<S>,
192{
193    /// Create a new verifier set
194    fn empty_pedersen_set_with_capacity(
195        size_hint: usize,
196        secret_generator: G,
197        blinder_generator: G,
198    ) -> Self;
199
200    /// Create a verifier set from an existing set of verifiers and generators
201    fn pedersen_set_with_generators_and_verifiers(
202        secret_generator: G,
203        blinder_generator: G,
204        verifiers: &[G],
205    ) -> Self {
206        let mut set = Self::empty_pedersen_set_with_capacity(
207            verifiers.len(),
208            secret_generator,
209            blinder_generator,
210        );
211        set.blind_verifiers_mut().copy_from_slice(verifiers);
212        set
213    }
214
215    /// The generator used for the verifiers of secrets
216    fn secret_generator(&self) -> G;
217
218    /// The generator used for the verifiers of blinders
219    fn blinder_generator(&self) -> G;
220
221    /// The verifiers
222    fn blind_verifiers(&self) -> &[G];
223
224    /// The verifiers as writeable
225    fn blind_verifiers_mut(&mut self) -> &mut [G];
226
227    /// Verify a share and blinder with this set
228    fn verify_share_and_blinder(&self, share: &S, blinder: &S) -> VsssResult<()> {
229        if (share.value().is_zero() | blinder.value().is_zero() | share.identifier().is_zero())
230            .into()
231        {
232            return Err(Error::InvalidShare);
233        }
234        let blind_generator = self.blinder_generator();
235        let generator = self.secret_generator();
236
237        if generator == G::default() || blind_generator == G::default() {
238            return Err(Error::InvalidGenerator(
239                "Generator or Blind generator is an identity",
240            ));
241        }
242
243        let secret = share.value();
244        let blinder = blinder.value();
245        let x = share.identifier();
246
247        let mut i = S::Identifier::one();
248
249        // FUTURE: execute this sum of products
250        // c_0 * c_1^i * c_2^{i^2} ... c_t^{i^t}
251        // as a constant time operation using <https://cr.yp.to/papers/pippenger.pdf>
252        // or Guide to Elliptic Curve Cryptography book,
253        // "Algorithm 3.48 Simultaneous multiple point multiplication"
254        // without precomputing the addition but still reduces doublings
255
256        let commitments = self.blind_verifiers();
257        // c_0
258        let mut rhs = commitments[0];
259        for v in &commitments[1..] {
260            *i.as_mut() *= x.as_ref();
261
262            // c_0 * c_1^i * c_2^{i^2} ... c_t^{i^t}
263            rhs += *v * i.clone();
264        }
265
266        let g: G = generator * secret;
267        let h: G = blind_generator * blinder;
268
269        let res = rhs - g - h;
270
271        if res == G::default() {
272            Ok(())
273        } else {
274            Err(Error::InvalidShare)
275        }
276    }
277}
278
279impl<S: Share, G: ShareVerifier<S>, const L: usize> FeldmanVerifierSet<S, G> for [G; L] {
280    fn empty_feldman_set_with_capacity(_size_hint: usize, generator: G) -> Self {
281        let mut t = [G::default(); L];
282        t[0] = generator;
283        t
284    }
285
286    fn generator(&self) -> G {
287        self[0]
288    }
289
290    fn verifiers(&self) -> &[G] {
291        &self[1..]
292    }
293
294    fn verifiers_mut(&mut self) -> &mut [G] {
295        self[1..].as_mut()
296    }
297}
298
299impl<S: Share, G: ShareVerifier<S>, L: ArrayLength> FeldmanVerifierSet<S, G>
300    for GenericArray<G, L>
301{
302    fn empty_feldman_set_with_capacity(_size_hint: usize, generator: G) -> Self {
303        let mut t = Self::default();
304        t[0] = generator;
305        t
306    }
307
308    fn generator(&self) -> G {
309        self[0]
310    }
311
312    fn verifiers(&self) -> &[G] {
313        &self[1..]
314    }
315
316    fn verifiers_mut(&mut self) -> &mut [G] {
317        self[1..].as_mut()
318    }
319}
320
321/// A wrapper around a fixed size array of verifiers
322/// Allows for convenient type aliasing
323/// ```
324/// use vsss_rs::{DefaultShare, IdentifierPrimeField, ShareVerifierGroup, ArrayFeldmanVerifierSet};
325///
326/// type K256Share = DefaultShare<IdentifierPrimeField<k256::Scalar>, IdentifierPrimeField<k256::Scalar>>;
327/// type K256FeldmanVerifierSet = ArrayFeldmanVerifierSet<K256Share, ShareVerifierGroup<k256::ProjectivePoint>, 3>;
328/// ```
329#[derive(Debug, Clone, Copy)]
330#[repr(transparent)]
331pub struct ArrayFeldmanVerifierSet<S, V, const L: usize>
332where
333    S: Share,
334    V: ShareVerifier<S>,
335{
336    /// The inner array set to threshold + 1
337    pub inner: [V; L],
338    /// Marker for phantom data
339    pub _marker: PhantomData<S>,
340}
341
342impl<S, V, const L: usize> From<[V; L]> for ArrayFeldmanVerifierSet<S, V, L>
343where
344    S: Share,
345    V: ShareVerifier<S>,
346{
347    fn from(inner: [V; L]) -> Self {
348        Self {
349            inner,
350            _marker: PhantomData,
351        }
352    }
353}
354
355impl<S, V, const L: usize> From<&[V; L]> for ArrayFeldmanVerifierSet<S, V, L>
356where
357    S: Share,
358    V: ShareVerifier<S>,
359{
360    fn from(inner: &[V; L]) -> Self {
361        Self {
362            inner: *inner,
363            _marker: PhantomData,
364        }
365    }
366}
367
368impl<S, V, const L: usize> From<ArrayFeldmanVerifierSet<S, V, L>> for [V; L]
369where
370    S: Share,
371    V: ShareVerifier<S>,
372{
373    fn from(set: ArrayFeldmanVerifierSet<S, V, L>) -> Self {
374        set.inner
375    }
376}
377
378impl<S, V, const L: usize> From<&ArrayFeldmanVerifierSet<S, V, L>> for [V; L]
379where
380    S: Share,
381    V: ShareVerifier<S>,
382{
383    fn from(set: &ArrayFeldmanVerifierSet<S, V, L>) -> Self {
384        set.inner
385    }
386}
387
388impl<S, V, const L: usize> Deref for ArrayFeldmanVerifierSet<S, V, L>
389where
390    S: Share,
391    V: ShareVerifier<S>,
392{
393    type Target = [V; L];
394
395    fn deref(&self) -> &Self::Target {
396        &self.inner
397    }
398}
399
400impl<S, V, const L: usize> DerefMut for ArrayFeldmanVerifierSet<S, V, L>
401where
402    S: Share,
403    V: ShareVerifier<S>,
404{
405    fn deref_mut(&mut self) -> &mut Self::Target {
406        &mut self.inner
407    }
408}
409
410impl<S, V, const L: usize> Default for ArrayFeldmanVerifierSet<S, V, L>
411where
412    S: Share,
413    V: ShareVerifier<S>,
414    [V; L]: Default,
415{
416    fn default() -> Self {
417        Self {
418            inner: Default::default(),
419            _marker: PhantomData,
420        }
421    }
422}
423
424impl<S, V, const L: usize> FeldmanVerifierSet<S, V> for ArrayFeldmanVerifierSet<S, V, L>
425where
426    S: Share,
427    V: ShareVerifier<S>,
428{
429    fn empty_feldman_set_with_capacity(size_hint: usize, generator: V) -> Self {
430        Self {
431            inner: <[V; L] as FeldmanVerifierSet<S, V>>::empty_feldman_set_with_capacity(
432                size_hint, generator,
433            ),
434            _marker: PhantomData,
435        }
436    }
437
438    fn generator(&self) -> V {
439        <[V; L]>::generator(&self.inner)
440    }
441
442    fn verifiers(&self) -> &[V] {
443        <[V; L]>::verifiers(&self.inner)
444    }
445
446    fn verifiers_mut(&mut self) -> &mut [V] {
447        <[V; L]>::verifiers_mut(&mut self.inner)
448    }
449}
450
451/// A wrapper around a generic array of verifiers
452/// Allows for convenient type aliasing
453/// ```
454/// use vsss_rs::{DefaultShare, IdentifierPrimeField, ValueGroup, GenericArrayFeldmanVerifierSet};
455/// use generic_array::typenum::U3;
456///
457/// type K256Share = DefaultShare<IdentifierPrimeField<k256::Scalar>, IdentifierPrimeField<k256::Scalar>>;
458/// type K256FeldmanVerifierSet = GenericArrayFeldmanVerifierSet<K256Share, ValueGroup<k256::ProjectivePoint>, U3>;
459/// ```
460#[derive(Debug, Clone)]
461#[repr(transparent)]
462pub struct GenericArrayFeldmanVerifierSet<S, V, L>
463where
464    S: Share,
465    V: ShareVerifier<S>,
466    L: ArrayLength,
467{
468    /// The inner generic array set to threshold + 1
469    pub inner: GenericArray<V, L>,
470    /// Marker for phantom data
471    pub _marker: PhantomData<S>,
472}
473
474impl<S, V, L> From<GenericArray<V, L>> for GenericArrayFeldmanVerifierSet<S, V, L>
475where
476    S: Share,
477    V: ShareVerifier<S>,
478    L: ArrayLength,
479{
480    fn from(inner: GenericArray<V, L>) -> Self {
481        Self {
482            inner,
483            _marker: PhantomData,
484        }
485    }
486}
487
488impl<S, V, L> From<&GenericArray<V, L>> for GenericArrayFeldmanVerifierSet<S, V, L>
489where
490    S: Share,
491    V: ShareVerifier<S>,
492    L: ArrayLength,
493{
494    fn from(inner: &GenericArray<V, L>) -> Self {
495        Self {
496            inner: inner.clone(),
497            _marker: PhantomData,
498        }
499    }
500}
501
502impl<S, V, L> From<GenericArrayFeldmanVerifierSet<S, V, L>> for GenericArray<V, L>
503where
504    S: Share,
505    V: ShareVerifier<S>,
506    L: ArrayLength,
507{
508    fn from(set: GenericArrayFeldmanVerifierSet<S, V, L>) -> Self {
509        set.inner
510    }
511}
512
513impl<S, V, L> From<&GenericArrayFeldmanVerifierSet<S, V, L>> for GenericArray<V, L>
514where
515    S: Share,
516    V: ShareVerifier<S>,
517    L: ArrayLength,
518{
519    fn from(set: &GenericArrayFeldmanVerifierSet<S, V, L>) -> Self {
520        set.inner.clone()
521    }
522}
523
524impl<S, V, L> Deref for GenericArrayFeldmanVerifierSet<S, V, L>
525where
526    S: Share,
527    V: ShareVerifier<S>,
528    L: ArrayLength,
529{
530    type Target = GenericArray<V, L>;
531
532    fn deref(&self) -> &Self::Target {
533        &self.inner
534    }
535}
536
537impl<S, V, L> DerefMut for GenericArrayFeldmanVerifierSet<S, V, L>
538where
539    S: Share,
540    V: ShareVerifier<S>,
541    L: ArrayLength,
542{
543    fn deref_mut(&mut self) -> &mut Self::Target {
544        &mut self.inner
545    }
546}
547
548impl<S, V, L> Default for GenericArrayFeldmanVerifierSet<S, V, L>
549where
550    S: Share,
551    V: ShareVerifier<S>,
552    L: ArrayLength,
553    GenericArray<V, L>: Default,
554{
555    fn default() -> Self {
556        Self {
557            inner: Default::default(),
558            _marker: PhantomData,
559        }
560    }
561}
562
563impl<S, V, L> FeldmanVerifierSet<S, V> for GenericArrayFeldmanVerifierSet<S, V, L>
564where
565    S: Share,
566    V: ShareVerifier<S>,
567    L: ArrayLength,
568{
569    fn empty_feldman_set_with_capacity(size_hint: usize, generator: V) -> Self {
570        Self {
571            inner:
572                <GenericArray<V, L> as FeldmanVerifierSet<S, V>>::empty_feldman_set_with_capacity(
573                    size_hint, generator,
574                ),
575            _marker: PhantomData,
576        }
577    }
578
579    fn generator(&self) -> V {
580        <GenericArray<V, L>>::generator(&self.inner)
581    }
582
583    fn verifiers(&self) -> &[V] {
584        <GenericArray<V, L>>::verifiers(&self.inner)
585    }
586
587    fn verifiers_mut(&mut self) -> &mut [V] {
588        <GenericArray<V, L>>::verifiers_mut(&mut self.inner)
589    }
590}
591
592#[cfg(any(feature = "alloc", feature = "std"))]
593impl<S: Share, G: ShareVerifier<S>> FeldmanVerifierSet<S, G> for Vec<G> {
594    fn empty_feldman_set_with_capacity(size_hint: usize, generator: G) -> Self {
595        vec![generator; size_hint + 1]
596    }
597
598    fn generator(&self) -> G {
599        self[0]
600    }
601
602    fn verifiers(&self) -> &[G] {
603        &self[1..]
604    }
605
606    fn verifiers_mut(&mut self) -> &mut [G] {
607        self[1..].as_mut()
608    }
609}
610
611#[cfg(any(feature = "alloc", feature = "std"))]
612/// A wrapper around a Vec of verifiers
613/// Allows for convenient type aliasing
614/// ```
615/// #[cfg(any(feature = "alloc", feature = "std"))]
616/// {
617///     use vsss_rs::{DefaultShare, IdentifierPrimeField, ValueGroup, VecFeldmanVerifierSet};
618///     type K256Share = DefaultShare<IdentifierPrimeField<k256::Scalar>, IdentifierPrimeField<k256::Scalar>>;
619///     type K256FeldmanVerifierSet = VecFeldmanVerifierSet<K256Share, ValueGroup<k256::ProjectivePoint>>;
620/// }
621/// ```
622#[derive(Debug, Clone, Default)]
623#[repr(transparent)]
624pub struct VecFeldmanVerifierSet<S, V>
625where
626    S: Share,
627    V: ShareVerifier<S>,
628{
629    /// The inner vec set to threshold + 1
630    pub inner: Vec<V>,
631    /// Marker for phantom data
632    pub _marker: PhantomData<S>,
633}
634
635#[cfg(any(feature = "alloc", feature = "std"))]
636impl<S, V> From<Vec<V>> for VecFeldmanVerifierSet<S, V>
637where
638    S: Share,
639    V: ShareVerifier<S>,
640{
641    fn from(value: Vec<V>) -> Self {
642        Self {
643            inner: value,
644            _marker: PhantomData,
645        }
646    }
647}
648
649#[cfg(any(feature = "alloc", feature = "std"))]
650impl<S, V> From<&Vec<V>> for VecFeldmanVerifierSet<S, V>
651where
652    S: Share,
653    V: ShareVerifier<S>,
654{
655    fn from(value: &Vec<V>) -> Self {
656        Self {
657            inner: value.clone(),
658            _marker: PhantomData,
659        }
660    }
661}
662
663#[cfg(any(feature = "alloc", feature = "std"))]
664impl<S, V> From<VecFeldmanVerifierSet<S, V>> for Vec<V>
665where
666    S: Share,
667    V: ShareVerifier<S>,
668{
669    fn from(value: VecFeldmanVerifierSet<S, V>) -> Self {
670        value.inner
671    }
672}
673
674#[cfg(any(feature = "alloc", feature = "std"))]
675impl<S, V> From<&VecFeldmanVerifierSet<S, V>> for Vec<V>
676where
677    S: Share,
678    V: ShareVerifier<S>,
679{
680    fn from(value: &VecFeldmanVerifierSet<S, V>) -> Self {
681        value.inner.clone()
682    }
683}
684
685#[cfg(any(feature = "alloc", feature = "std"))]
686impl<S, V> Deref for VecFeldmanVerifierSet<S, V>
687where
688    S: Share,
689    V: ShareVerifier<S>,
690{
691    type Target = Vec<V>;
692
693    fn deref(&self) -> &Self::Target {
694        &self.inner
695    }
696}
697
698#[cfg(any(feature = "alloc", feature = "std"))]
699impl<S, V> DerefMut for VecFeldmanVerifierSet<S, V>
700where
701    S: Share,
702    V: ShareVerifier<S>,
703{
704    fn deref_mut(&mut self) -> &mut Self::Target {
705        &mut self.inner
706    }
707}
708
709#[cfg(any(feature = "alloc", feature = "std"))]
710impl<S, V> FeldmanVerifierSet<S, V> for VecFeldmanVerifierSet<S, V>
711where
712    S: Share,
713    V: ShareVerifier<S>,
714{
715    fn empty_feldman_set_with_capacity(size_hint: usize, generator: V) -> Self {
716        Self {
717            inner: <Vec<V> as FeldmanVerifierSet<S, V>>::empty_feldman_set_with_capacity(
718                size_hint, generator,
719            ),
720            _marker: PhantomData,
721        }
722    }
723
724    fn generator(&self) -> V {
725        <Vec<V>>::generator(&self.inner)
726    }
727
728    fn verifiers(&self) -> &[V] {
729        <Vec<V>>::verifiers(&self.inner)
730    }
731
732    fn verifiers_mut(&mut self) -> &mut [V] {
733        <Vec<V>>::verifiers_mut(&mut self.inner)
734    }
735}
736
737impl<S: Share, G: ShareVerifier<S>, const L: usize> PedersenVerifierSet<S, G> for [G; L] {
738    fn empty_pedersen_set_with_capacity(
739        _size_hint: usize,
740        secret_generator: G,
741        blinder_generator: G,
742    ) -> Self {
743        let mut t = [G::default(); L];
744        t[0] = secret_generator;
745        t[1] = blinder_generator;
746        t
747    }
748
749    fn secret_generator(&self) -> G {
750        self[0]
751    }
752
753    fn blinder_generator(&self) -> G {
754        self[1]
755    }
756
757    fn blind_verifiers(&self) -> &[G] {
758        &self[2..]
759    }
760
761    fn blind_verifiers_mut(&mut self) -> &mut [G] {
762        self[2..].as_mut()
763    }
764}
765
766/// A wrapper around arrays of verifiers
767/// Allows for convenient type aliasing
768/// ```
769/// use vsss_rs::{DefaultShare, IdentifierPrimeField, ValueGroup, ArrayPedersenVerifierSet};
770/// type K256Share = DefaultShare<IdentifierPrimeField<k256::Scalar>, IdentifierPrimeField<k256::Scalar>>;
771/// type K256PedersenVerifierSet = ArrayPedersenVerifierSet<K256Share, ValueGroup<k256::ProjectivePoint>, 4>;
772/// ```
773#[derive(Debug, Clone, Copy)]
774#[repr(transparent)]
775pub struct ArrayPedersenVerifierSet<S, V, const L: usize>
776where
777    S: Share,
778    V: ShareVerifier<S>,
779{
780    /// The inner array set to threshold + 2
781    pub inner: [V; L],
782    /// Marker for phantom data
783    pub _marker: PhantomData<S>,
784}
785
786impl<S, V, const L: usize> From<[V; L]> for ArrayPedersenVerifierSet<S, V, L>
787where
788    S: Share,
789    V: ShareVerifier<S>,
790{
791    fn from(inner: [V; L]) -> Self {
792        Self {
793            inner,
794            _marker: PhantomData,
795        }
796    }
797}
798
799impl<S, V, const L: usize> From<&[V; L]> for ArrayPedersenVerifierSet<S, V, L>
800where
801    S: Share,
802    V: ShareVerifier<S>,
803{
804    fn from(inner: &[V; L]) -> Self {
805        Self {
806            inner: *inner,
807            _marker: PhantomData,
808        }
809    }
810}
811
812impl<S, V, const L: usize> From<ArrayPedersenVerifierSet<S, V, L>> for [V; L]
813where
814    S: Share,
815    V: ShareVerifier<S>,
816{
817    fn from(set: ArrayPedersenVerifierSet<S, V, L>) -> Self {
818        set.inner
819    }
820}
821
822impl<S, V, const L: usize> From<&ArrayPedersenVerifierSet<S, V, L>> for [V; L]
823where
824    S: Share,
825    V: ShareVerifier<S>,
826{
827    fn from(set: &ArrayPedersenVerifierSet<S, V, L>) -> Self {
828        set.inner
829    }
830}
831
832impl<S, V, const L: usize> Deref for ArrayPedersenVerifierSet<S, V, L>
833where
834    S: Share,
835    V: ShareVerifier<S>,
836{
837    type Target = [V; L];
838
839    fn deref(&self) -> &Self::Target {
840        &self.inner
841    }
842}
843
844impl<S, V, const L: usize> DerefMut for ArrayPedersenVerifierSet<S, V, L>
845where
846    S: Share,
847    V: ShareVerifier<S>,
848{
849    fn deref_mut(&mut self) -> &mut Self::Target {
850        &mut self.inner
851    }
852}
853
854impl<S, V, const L: usize> Default for ArrayPedersenVerifierSet<S, V, L>
855where
856    S: Share,
857    V: ShareVerifier<S>,
858    [V; L]: Default,
859{
860    fn default() -> Self {
861        Self {
862            inner: Default::default(),
863            _marker: PhantomData,
864        }
865    }
866}
867
868impl<S, V, const L: usize> PedersenVerifierSet<S, V> for ArrayPedersenVerifierSet<S, V, L>
869where
870    S: Share,
871    V: ShareVerifier<S>,
872{
873    fn empty_pedersen_set_with_capacity(
874        size_hint: usize,
875        secret_generator: V,
876        blinder_generator: V,
877    ) -> Self {
878        Self {
879            inner: <[V; L] as PedersenVerifierSet<S, V>>::empty_pedersen_set_with_capacity(
880                size_hint,
881                secret_generator,
882                blinder_generator,
883            ),
884            _marker: PhantomData,
885        }
886    }
887
888    fn secret_generator(&self) -> V {
889        <[V; L]>::secret_generator(&self.inner)
890    }
891
892    fn blinder_generator(&self) -> V {
893        <[V; L]>::blinder_generator(&self.inner)
894    }
895
896    fn blind_verifiers(&self) -> &[V] {
897        <[V; L]>::blind_verifiers(&self.inner)
898    }
899
900    fn blind_verifiers_mut(&mut self) -> &mut [V] {
901        <[V; L]>::blind_verifiers_mut(&mut self.inner)
902    }
903}
904
905impl<S: Share, G: ShareVerifier<S>, L: ArrayLength> PedersenVerifierSet<S, G>
906    for GenericArray<G, L>
907{
908    fn empty_pedersen_set_with_capacity(
909        _size_hint: usize,
910        secret_generator: G,
911        blinder_generator: G,
912    ) -> Self {
913        let mut t = Self::default();
914        t[0] = secret_generator;
915        t[1] = blinder_generator;
916        t
917    }
918
919    fn secret_generator(&self) -> G {
920        self[0]
921    }
922
923    fn blinder_generator(&self) -> G {
924        self[1]
925    }
926
927    fn blind_verifiers(&self) -> &[G] {
928        &self[2..]
929    }
930
931    fn blind_verifiers_mut(&mut self) -> &mut [G] {
932        self[2..].as_mut()
933    }
934}
935
936/// A wrapper around a generic array of verifiers
937/// Allows for convenient type aliasing
938/// ```
939/// use vsss_rs::{DefaultShare, IdentifierPrimeField, ValueGroup, GenericArrayPedersenVerifierSet};
940/// use generic_array::typenum::U4;
941/// type K256Share = DefaultShare<IdentifierPrimeField<k256::Scalar>, IdentifierPrimeField<k256::Scalar>>;
942/// type K256PedersenVerifierSet = GenericArrayPedersenVerifierSet<K256Share, ValueGroup<k256::ProjectivePoint>, U4>;
943#[derive(Debug, Clone)]
944#[repr(transparent)]
945pub struct GenericArrayPedersenVerifierSet<S, V, L>
946where
947    S: Share,
948    V: ShareVerifier<S>,
949    L: ArrayLength,
950{
951    /// The inner generic array set to threshold + 2
952    pub inner: GenericArray<V, L>,
953    /// Marker for phantom data
954    pub _marker: PhantomData<S>,
955}
956
957impl<S, V, L> From<GenericArray<V, L>> for GenericArrayPedersenVerifierSet<S, V, L>
958where
959    S: Share,
960    V: ShareVerifier<S>,
961    L: ArrayLength,
962{
963    fn from(inner: GenericArray<V, L>) -> Self {
964        Self {
965            inner,
966            _marker: PhantomData,
967        }
968    }
969}
970
971impl<S, V, L> From<&GenericArray<V, L>> for GenericArrayPedersenVerifierSet<S, V, L>
972where
973    S: Share,
974    V: ShareVerifier<S>,
975    L: ArrayLength,
976{
977    fn from(inner: &GenericArray<V, L>) -> Self {
978        Self {
979            inner: inner.clone(),
980            _marker: PhantomData,
981        }
982    }
983}
984
985impl<S, V, L> From<GenericArrayPedersenVerifierSet<S, V, L>> for GenericArray<V, L>
986where
987    S: Share,
988    V: ShareVerifier<S>,
989    L: ArrayLength,
990{
991    fn from(set: GenericArrayPedersenVerifierSet<S, V, L>) -> Self {
992        set.inner
993    }
994}
995
996impl<S, V, L> From<&GenericArrayPedersenVerifierSet<S, V, L>> for GenericArray<V, L>
997where
998    S: Share,
999    V: ShareVerifier<S>,
1000    L: ArrayLength,
1001{
1002    fn from(set: &GenericArrayPedersenVerifierSet<S, V, L>) -> Self {
1003        set.inner.clone()
1004    }
1005}
1006
1007impl<S, V, L> Deref for GenericArrayPedersenVerifierSet<S, V, L>
1008where
1009    S: Share,
1010    V: ShareVerifier<S>,
1011    L: ArrayLength,
1012{
1013    type Target = GenericArray<V, L>;
1014
1015    fn deref(&self) -> &Self::Target {
1016        &self.inner
1017    }
1018}
1019
1020impl<S, V, L> DerefMut for GenericArrayPedersenVerifierSet<S, V, L>
1021where
1022    S: Share,
1023    V: ShareVerifier<S>,
1024    L: ArrayLength,
1025{
1026    fn deref_mut(&mut self) -> &mut Self::Target {
1027        &mut self.inner
1028    }
1029}
1030
1031impl<S, V, L> Default for GenericArrayPedersenVerifierSet<S, V, L>
1032where
1033    S: Share,
1034    V: ShareVerifier<S>,
1035    L: ArrayLength,
1036    GenericArray<V, L>: Default,
1037{
1038    fn default() -> Self {
1039        Self {
1040            inner: Default::default(),
1041            _marker: PhantomData,
1042        }
1043    }
1044}
1045
1046impl<S, V, L> PedersenVerifierSet<S, V> for GenericArrayPedersenVerifierSet<S, V, L>
1047where
1048    S: Share,
1049    V: ShareVerifier<S>,
1050    L: ArrayLength,
1051{
1052    fn empty_pedersen_set_with_capacity(
1053        size_hint: usize,
1054        secret_generator: V,
1055        blinder_generator: V,
1056    ) -> Self {
1057        Self {
1058            inner:
1059                <GenericArray<V, L> as PedersenVerifierSet<S, V>>::empty_pedersen_set_with_capacity(
1060                    size_hint,
1061                    secret_generator,
1062                    blinder_generator,
1063                ),
1064            _marker: PhantomData,
1065        }
1066    }
1067
1068    fn secret_generator(&self) -> V {
1069        <GenericArray<V, L>>::secret_generator(&self.inner)
1070    }
1071
1072    fn blinder_generator(&self) -> V {
1073        <GenericArray<V, L>>::blinder_generator(&self.inner)
1074    }
1075
1076    fn blind_verifiers(&self) -> &[V] {
1077        <GenericArray<V, L>>::blind_verifiers(&self.inner)
1078    }
1079
1080    fn blind_verifiers_mut(&mut self) -> &mut [V] {
1081        <GenericArray<V, L>>::blind_verifiers_mut(&mut self.inner)
1082    }
1083}
1084
1085#[cfg(any(feature = "alloc", feature = "std"))]
1086impl<S: Share, V: ShareVerifier<S>> PedersenVerifierSet<S, V> for Vec<V> {
1087    fn empty_pedersen_set_with_capacity(
1088        size_hint: usize,
1089        secret_generator: V,
1090        blinder_generator: V,
1091    ) -> Self {
1092        let mut t = vec![blinder_generator; size_hint + 2];
1093        t[0] = secret_generator;
1094        t
1095    }
1096
1097    fn secret_generator(&self) -> V {
1098        self[0]
1099    }
1100
1101    fn blinder_generator(&self) -> V {
1102        self[1]
1103    }
1104
1105    fn blind_verifiers(&self) -> &[V] {
1106        &self[2..]
1107    }
1108
1109    fn blind_verifiers_mut(&mut self) -> &mut [V] {
1110        self[2..].as_mut()
1111    }
1112}
1113
1114#[cfg(any(feature = "alloc", feature = "std"))]
1115/// A wrapper around a Vec of verifiers
1116/// Allows for convenient type aliasing
1117/// ```
1118/// #[cfg(any(feature = "alloc", feature = "std"))]
1119/// {
1120///    use vsss_rs::{DefaultShare, IdentifierPrimeField, ValueGroup, VecPedersenVerifierSet};
1121///   type K256Share = DefaultShare<IdentifierPrimeField<k256::Scalar>, IdentifierPrimeField<k256::Scalar>>;
1122///  type K256PedersenVerifierSet = VecPedersenVerifierSet<K256Share, ValueGroup<k256::ProjectivePoint>>;
1123/// }
1124/// ```
1125#[derive(Debug, Clone, Default)]
1126#[repr(transparent)]
1127pub struct VecPedersenVerifierSet<S, V>
1128where
1129    S: Share,
1130    V: ShareVerifier<S>,
1131{
1132    /// The inner vec set to threshold + 2
1133    pub inner: Vec<V>,
1134    /// Marker for phantom data
1135    pub _marker: PhantomData<S>,
1136}
1137
1138#[cfg(any(feature = "alloc", feature = "std"))]
1139impl<S, V> From<Vec<V>> for VecPedersenVerifierSet<S, V>
1140where
1141    S: Share,
1142    V: ShareVerifier<S>,
1143{
1144    fn from(inner: Vec<V>) -> Self {
1145        Self {
1146            inner,
1147            _marker: PhantomData,
1148        }
1149    }
1150}
1151
1152#[cfg(any(feature = "alloc", feature = "std"))]
1153impl<S, V> From<&Vec<V>> for VecPedersenVerifierSet<S, V>
1154where
1155    S: Share,
1156    V: ShareVerifier<S>,
1157{
1158    fn from(inner: &Vec<V>) -> Self {
1159        Self {
1160            inner: (*inner).clone(),
1161            _marker: PhantomData,
1162        }
1163    }
1164}
1165
1166#[cfg(any(feature = "alloc", feature = "std"))]
1167impl<S, V> From<VecPedersenVerifierSet<S, V>> for Vec<V>
1168where
1169    S: Share,
1170    V: ShareVerifier<S>,
1171{
1172    fn from(set: VecPedersenVerifierSet<S, V>) -> Self {
1173        set.inner
1174    }
1175}
1176
1177#[cfg(any(feature = "alloc", feature = "std"))]
1178impl<S, V> From<&VecPedersenVerifierSet<S, V>> for Vec<V>
1179where
1180    S: Share,
1181    V: ShareVerifier<S>,
1182{
1183    fn from(set: &VecPedersenVerifierSet<S, V>) -> Self {
1184        set.inner.clone()
1185    }
1186}
1187
1188#[cfg(any(feature = "alloc", feature = "std"))]
1189impl<S, V> Deref for VecPedersenVerifierSet<S, V>
1190where
1191    S: Share,
1192    V: ShareVerifier<S>,
1193{
1194    type Target = Vec<V>;
1195
1196    fn deref(&self) -> &Self::Target {
1197        &self.inner
1198    }
1199}
1200
1201#[cfg(any(feature = "alloc", feature = "std"))]
1202impl<S, V> DerefMut for VecPedersenVerifierSet<S, V>
1203where
1204    S: Share,
1205    V: ShareVerifier<S>,
1206{
1207    fn deref_mut(&mut self) -> &mut Self::Target {
1208        &mut self.inner
1209    }
1210}
1211
1212#[cfg(any(feature = "alloc", feature = "std"))]
1213impl<S, V> PedersenVerifierSet<S, V> for VecPedersenVerifierSet<S, V>
1214where
1215    S: Share,
1216    V: ShareVerifier<S>,
1217{
1218    fn empty_pedersen_set_with_capacity(
1219        size_hint: usize,
1220        secret_generator: V,
1221        blinder_generator: V,
1222    ) -> Self {
1223        Self {
1224            inner: <Vec<V> as PedersenVerifierSet<S, V>>::empty_pedersen_set_with_capacity(
1225                size_hint,
1226                secret_generator,
1227                blinder_generator,
1228            ),
1229            _marker: PhantomData,
1230        }
1231    }
1232
1233    fn secret_generator(&self) -> V {
1234        <Vec<V>>::secret_generator(&self.inner)
1235    }
1236
1237    fn blinder_generator(&self) -> V {
1238        <Vec<V>>::blinder_generator(&self.inner)
1239    }
1240
1241    fn blind_verifiers(&self) -> &[V] {
1242        <Vec<V>>::blind_verifiers(&self.inner)
1243    }
1244
1245    fn blind_verifiers_mut(&mut self) -> &mut [V] {
1246        <Vec<V>>::blind_verifiers_mut(&mut self.inner)
1247    }
1248}
1249
1250#[test]
1251fn test_feldman_with_generator_and_verifiers() {
1252    type IdK256 = IdentifierPrimeField<k256::Scalar>;
1253    type VK256 = ValuePrimeField<k256::Scalar>;
1254    type ShareVerifierK256 = ShareVerifierGroup<k256::ProjectivePoint>;
1255    type K256Share = (IdK256, VK256);
1256
1257    let set = <[ShareVerifierK256; 8] as FeldmanVerifierSet<K256Share, ShareVerifierK256>>::feldman_set_with_generator_and_verifiers(
1258        ValueGroup(k256::ProjectivePoint::GENERATOR),
1259        &[ValueGroup(k256::ProjectivePoint::IDENTITY); 7]);
1260    assert_eq!(
1261        ValueGroup(k256::ProjectivePoint::GENERATOR),
1262        <[ShareVerifierK256; 8] as FeldmanVerifierSet<K256Share, ShareVerifierK256>>::generator(
1263            &set
1264        )
1265    );
1266    assert_eq!(
1267        [ValueGroup(k256::ProjectivePoint::IDENTITY); 7],
1268        <[ShareVerifierK256; 8] as FeldmanVerifierSet<K256Share, ShareVerifierK256>>::verifiers(
1269            &set
1270        )
1271    );
1272}