vsss_rs_std/verifier/
pedersen.rs1use crate::*;
7use elliptic_curve::{
8 ff::PrimeField,
9 group::{Group, GroupEncoding, ScalarMul},
10};
11use serde::{Deserialize, Serialize};
12
13#[derive(Clone, Debug, Deserialize, Serialize)]
16pub struct PedersenVerifier<F: PrimeField, G: Group + GroupEncoding + ScalarMul<F>> {
17 #[serde(
19 serialize_with = "serialize_group",
20 deserialize_with = "deserialize_group"
21 )]
22 pub generator: G,
23 #[serde(bound(serialize = "FeldmanVerifier<F, G>: Serialize"))]
25 #[serde(bound(deserialize = "FeldmanVerifier<F, G>: Deserialize<'de>"))]
26 pub feldman_verifier: FeldmanVerifier<F, G>,
27 #[serde(
29 serialize_with = "serialize_group_vec",
30 deserialize_with = "deserialize_group_vec"
31 )]
32 pub commitments: Vec<G>,
33}
34
35impl<F: PrimeField, G: Group + GroupEncoding + ScalarMul<F>> PedersenVerifier<F, G> {
36 pub fn verify(&self, share: &Share, blind_share: &Share) -> VsssResult<()> {
38 let secret = share.as_field_element::<F>()?;
39 let blinding = blind_share.as_field_element::<F>()?;
40
41 let x = F::from(share.identifier() as u64);
42 let mut i = F::ONE;
43
44 let mut rhs = self.commitments[0];
53 for v in &self.commitments[1..] {
54 i *= x;
55
56 rhs += *v * i;
58 }
59
60 let g: G = (-self.feldman_verifier.generator) * secret;
61 let h: G = (-self.generator) * blinding;
62
63 let res: G = rhs + g + h;
64
65 if res.is_identity().into() {
66 Ok(())
67 } else {
68 Err(Error::InvalidShare)
69 }
70 }
71}