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}