Skip to main content

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