Verify Schnorr proofs and proof of knowledge of public key if designated verifier proof
(
&self,
revealed_msgs: &BTreeMap<usize, G::ScalarField>,
challenge: &G::ScalarField,
params: &MACParams<G>,
verifier_pub_key: Option<&G>,
)
| 545 | |
| 546 | /// Verify Schnorr proofs and proof of knowledge of public key if designated verifier proof |
| 547 | pub fn verify_common( |
| 548 | &self, |
| 549 | revealed_msgs: &BTreeMap<usize, G::ScalarField>, |
| 550 | challenge: &G::ScalarField, |
| 551 | params: &MACParams<G>, |
| 552 | verifier_pub_key: Option<&G>, |
| 553 | ) -> Result<(), KVACError> { |
| 554 | // Adjust challenge if designated verifier proof provided |
| 555 | let chal = if let Some(dvp) = &self.designated_verifier_pk_proof { |
| 556 | if let Some(vpk) = verifier_pub_key { |
| 557 | dvp.verify(vpk, ¶ms.g_tilde)?; |
| 558 | *challenge - dvp.challenge |
| 559 | } else { |
| 560 | return Err(KVACError::MissingVerifierPubKeyForDesignatedVerifierProof); |
| 561 | } |
| 562 | } else { |
| 563 | *challenge |
| 564 | }; |
| 565 | if !self |
| 566 | .sc_B_bar |
| 567 | .verify(&self.B_bar, &self.A_hat, &self.D, &chal) |
| 568 | { |
| 569 | return Err(KVACError::InvalidSchnorrProof); |
| 570 | } |
| 571 | let mut bases = Vec::with_capacity(2 + params.g_vec.len() - revealed_msgs.len()); |
| 572 | let mut bases_revealed = Vec::with_capacity(revealed_msgs.len()); |
| 573 | let mut exponents = Vec::with_capacity(revealed_msgs.len()); |
| 574 | for i in 0..params.g_vec.len() { |
| 575 | if revealed_msgs.contains_key(&i) { |
| 576 | let message = revealed_msgs.get(&i).unwrap(); |
| 577 | bases_revealed.push(params.g_vec[i]); |
| 578 | exponents.push(*message); |
| 579 | } else { |
| 580 | bases.push(params.g_vec[i]); |
| 581 | } |
| 582 | } |
| 583 | bases.push(self.D); |
| 584 | let y = match self.hw_sig_type { |
| 585 | HardwareSignatureType::Schnorr => { |
| 586 | bases.push(params.g); |
| 587 | -(G::Group::msm_unchecked(&bases_revealed, &exponents) |
| 588 | + params.g_0 |
| 589 | + self.blinded_pk) |
| 590 | } |
| 591 | HardwareSignatureType::Ecdsa => { |
| 592 | // As described in the paper |
| 593 | // let F = (G::Group::msm_unchecked(&bases_revealed, &exponents) + params.g_0).into_affine(); |
| 594 | // bases.push(F); |
| 595 | // self.blinded_pk.into_group().neg() |
| 596 | |
| 597 | // An optimized approach with other benefits. See more details in comments in the proof generation code |
| 598 | bases.push(self.blinded_pk); |
| 599 | -(G::Group::msm_unchecked(&bases_revealed, &exponents) + params.g_0) |
| 600 | } |
| 601 | }; |
| 602 | |
| 603 | self.sc_resp_msgs |
| 604 | .is_valid(&bases, &y.into(), &self.t_msgs, &chal)?; |