diff --git a/ferveo/src/lib.rs b/ferveo/src/lib.rs index 89b08052..df215e7e 100644 --- a/ferveo/src/lib.rs +++ b/ferveo/src/lib.rs @@ -80,6 +80,10 @@ pub enum Error { #[error("Invalid share index: {0}")] InvalidShareIndex(u32), + /// Failed to verify a share update + #[error("Invalid share update")] + InvalidShareUpdate, + /// Failed to produce a precomputed variant decryption share #[error("Invalid DKG parameters for precomputed variant: number of shares {0}, threshold {1}")] InvalidDkgParametersForPrecomputedVariant(u32, u32), diff --git a/ferveo/src/pvss.rs b/ferveo/src/pvss.rs index 6e50264d..bd3867de 100644 --- a/ferveo/src/pvss.rs +++ b/ferveo/src/pvss.rs @@ -255,10 +255,12 @@ pub fn do_verify_full( // We verify that e(G, Y_i) = e(A_i, ek_i) for validator i // See #4 in 4.2.3 section of https://eprint.iacr.org/2022/898.pdf // e(G,Y) = e(A, ek) + // TODO: consider using multipairing let is_valid = E::pairing(pvss_params.g, *y_i) == E::pairing(a_i, ek_i); if !is_valid { return Ok(false); } + // TODO: Should we return Err()? } Ok(true) diff --git a/ferveo/src/refresh.rs b/ferveo/src/refresh.rs index d2a5ac48..4b2f2469 100644 --- a/ferveo/src/refresh.rs +++ b/ferveo/src/refresh.rs @@ -241,6 +241,17 @@ impl ShareUpdate { ) // TODO: Cast return elements into ShareRecoveryUpdate } + + // TODO: Unit tests + pub fn verify(&self, target_validator_public_key: E::G2) -> Result { + let is_valid = E::pairing(E::G1::generator(), self.update) + == E::pairing(self.commitment, target_validator_public_key); + if is_valid{ + Ok(true) + } else { + Err(Error::InvalidShareUpdate) + } + } } // TODO: working here