1use crate::*;
6use core::{
7 marker::PhantomData,
8 ops::{Deref, DerefMut},
9};
10use generic_array::{ArrayLength, GenericArray};
11
12pub trait ReadableShareSet<S>: AsRef<[S]>
14where
15 S: Share,
16{
17 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
35pub trait WriteableShareSet<S>: ReadableShareSet<S> + AsMut<[S]>
37where
38 S: Share,
39{
40 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 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 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
118pub trait FeldmanVerifierSet<S, G>: Sized
121where
122 S: Share,
123 G: ShareVerifier<S>,
124{
125 fn empty_feldman_set_with_capacity(size_hint: usize, generator: G) -> Self;
127
128 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 fn generator(&self) -> G;
137
138 fn verifiers(&self) -> &[G];
140
141 fn verifiers_mut(&mut self) -> &mut [G];
143
144 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 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 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
186pub trait PedersenVerifierSet<S, G>: Sized
189where
190 S: Share,
191 G: ShareVerifier<S>,
192{
193 fn empty_pedersen_set_with_capacity(
195 size_hint: usize,
196 secret_generator: G,
197 blinder_generator: G,
198 ) -> Self;
199
200 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 fn secret_generator(&self) -> G;
217
218 fn blinder_generator(&self) -> G;
220
221 fn blind_verifiers(&self) -> &[G];
223
224 fn blind_verifiers_mut(&mut self) -> &mut [G];
226
227 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 let commitments = self.blind_verifiers();
257 let mut rhs = commitments[0];
259 for v in &commitments[1..] {
260 *i.as_mut() *= x.as_ref();
261
262 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#[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 pub inner: [V; L],
338 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#[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 pub inner: GenericArray<V, L>,
470 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#[derive(Debug, Clone, Default)]
623#[repr(transparent)]
624pub struct VecFeldmanVerifierSet<S, V>
625where
626 S: Share,
627 V: ShareVerifier<S>,
628{
629 pub inner: Vec<V>,
631 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#[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 pub inner: [V; L],
782 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#[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 pub inner: GenericArray<V, L>,
953 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#[derive(Debug, Clone, Default)]
1126#[repr(transparent)]
1127pub struct VecPedersenVerifierSet<S, V>
1128where
1129 S: Share,
1130 V: ShareVerifier<S>,
1131{
1132 pub inner: Vec<V>,
1134 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}