Skip to main content

bls_sig_cli/
verify.rs

1use crate::{
2    core::{KeyValidationError, PublicKey, Signature, SignatureError},
3    util::hash_to_g2,
4};
5
6use ark_bls12_381::{Bls12_381, G1Affine};
7use ark_ec::{AffineRepr, pairing::Pairing};
8
9pub fn key_validate(pk: &PublicKey) -> Result<String, KeyValidationError> {
10    if !pk.is_on_curve() {
11        return Err(KeyValidationError::NotOnCurve);
12    }
13
14    if pk.is_zero() {
15        return Err(KeyValidationError::Identity);
16    }
17
18    if !pk.is_in_correct_subgroup_assuming_on_curve() {
19        return Err(KeyValidationError::WrongSubgroup);
20    }
21
22    Ok(String::from("Public Key is valid."))
23}
24
25pub fn core_verify(pk: &PublicKey, msg: &[u8], sig: &Signature) -> Result<(), SignatureError> {
26    if !sig.is_on_curve() {
27        return Err(SignatureError::InvalidSignature);
28    }
29    if !sig.is_in_correct_subgroup_assuming_on_curve() {
30        return Err(SignatureError::InvalidSignatureSubgroup);
31    }
32    if let Err(e) = key_validate(pk) {
33        return Err(SignatureError::InvalidPublicKey(e));
34    }
35    let q = hash_to_g2(msg)?;
36
37    let c1 = Bls12_381::pairing(pk, q);
38    let c2 = Bls12_381::pairing(G1Affine::generator(), sig);
39
40    if c1 == c2 {
41        println!("Verification succesful!");
42        Ok(())
43    } else {
44        Err(SignatureError::InvalidSignature)
45    }
46}