1use crate::*;
6use core::{
7 marker::PhantomData,
8 ops::{Deref, DerefMut},
9};
10use generic_array::{ArrayLength, GenericArray};
11use hybrid_array::{Array, ArraySize};
12
13pub trait ReadableShareSet<S>: AsRef<[S]>
15where
16 S: Share,
17{
18 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
36pub trait WriteableShareSet<S>: ReadableShareSet<S> + AsMut<[S]>
38where
39 S: Share,
40{
41 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 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 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
129pub trait FeldmanVerifierSet<S, G>: Sized
132where
133 S: Share,
134 G: ShareVerifier<S>,
135{
136 fn empty_feldman_set_with_capacity(size_hint: usize, generator: G) -> Self;
138
139 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 fn generator(&self) -> G;
148
149 fn verifiers(&self) -> &[G];
151
152 fn verifiers_mut(&mut self) -> &mut [G];
154
155 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 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 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
197pub trait PedersenVerifierSet<S, G>: Sized
200where
201 S: Share,
202 G: ShareVerifier<S>,
203{
204 fn empty_pedersen_set_with_capacity(
206 size_hint: usize,
207 secret_generator: G,
208 blinder_generator: G,
209 ) -> Self;
210
211 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 fn secret_generator(&self) -> G;
228
229 fn blinder_generator(&self) -> G;
231
232 fn blind_verifiers(&self) -> &[G];
234
235 fn blind_verifiers_mut(&mut self) -> &mut [G];
237
238 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 let commitments = self.blind_verifiers();
268 let mut rhs = commitments[0];
270 for v in &commitments[1..] {
271 *i.as_mut() *= x.as_ref();
272
273 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#[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 pub inner: [V; L],
369 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#[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 pub inner: GenericArray<V, L>,
501 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#[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 pub inner: Array<V, L>,
642 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#[derive(Debug, Clone, Default)]
794#[repr(transparent)]
795pub struct VecFeldmanVerifierSet<S, V>
796where
797 S: Share,
798 V: ShareVerifier<S>,
799{
800 pub inner: Vec<V>,
802 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#[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 pub inner: [V; L],
953 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#[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 pub inner: GenericArray<V, L>,
1154 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
1286pub struct HybridArrayPedersenVerifierSet<S, V, L>
1295where
1296 S: Share,
1297 V: ShareVerifier<S>,
1298 L: ArraySize,
1299{
1300 pub inner: Array<V, L>,
1302 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#[derive(Debug, Clone, Default)]
1474#[repr(transparent)]
1475pub struct VecPedersenVerifierSet<S, V>
1476where
1477 S: Share,
1478 V: ShareVerifier<S>,
1479{
1480 pub inner: Vec<V>,
1482 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}