1use crate::bls_signatures::{
2 Bls12381G2Impl, Pairing, PublicKey, SecretKey, Signature, SignatureSchemes,
3};
4use crate::{BlsModule, ProtocolError, PublicKeyValidationError};
5
6#[derive(Default)]
7pub struct NativeBlsModule;
8impl BlsModule for NativeBlsModule {
9 fn validate_public_key(&self, pk: &[u8]) -> Result<(), PublicKeyValidationError> {
10 match PublicKey::<Bls12381G2Impl>::try_from(pk) {
11 Ok(_) => Ok(()),
12 Err(e) => Err(PublicKeyValidationError::new(e.to_string())),
13 }
14 }
15
16 fn verify_signature(
17 &self,
18 signature: &[u8],
19 data: &[u8],
20 public_key: &[u8],
21 ) -> Result<bool, ProtocolError> {
22 let public_key = PublicKey::<Bls12381G2Impl>::try_from(public_key)?;
23 let signature_96_bytes =
24 signature
25 .try_into()
26 .map_err(|_| ProtocolError::BlsSignatureSizeError {
27 got: signature.len() as u32,
28 })?;
29 let Some(g2_element) =
30 <Bls12381G2Impl as Pairing>::Signature::from_compressed(&signature_96_bytes)
31 .into_option()
32 else {
33 return Ok(false); };
35
36 let signature = Signature::Basic(g2_element);
37
38 match signature.verify(&public_key, data) {
39 Ok(_) => Ok(true),
40 Err(_) => Ok(false),
41 }
42 }
43
44 fn private_key_to_public_key(&self, private_key: &[u8]) -> Result<Vec<u8>, ProtocolError> {
45 let fixed_len_key: [u8; 32] =
46 private_key
47 .try_into()
48 .map_err(|_| ProtocolError::PrivateKeySizeError {
49 got: private_key.len() as u32,
50 })?;
51 let pk = SecretKey::<Bls12381G2Impl>::from_be_bytes(&fixed_len_key)
52 .into_option()
53 .ok_or(ProtocolError::InvalidBLSPrivateKeyError(
54 "key not valid".to_string(),
55 ))?;
56 let public_key = pk.public_key();
57 let public_key_bytes = public_key.0.to_compressed().to_vec();
58 Ok(public_key_bytes)
59 }
60
61 fn sign(&self, data: &[u8], private_key: &[u8]) -> Result<Vec<u8>, ProtocolError> {
62 let fixed_len_key: [u8; 32] =
63 private_key
64 .try_into()
65 .map_err(|_| ProtocolError::PrivateKeySizeError {
66 got: private_key.len() as u32,
67 })?;
68 let pk = SecretKey::<Bls12381G2Impl>::from_be_bytes(&fixed_len_key)
69 .into_option()
70 .ok_or(ProtocolError::InvalidBLSPrivateKeyError(
71 "key not valid".to_string(),
72 ))?;
73 Ok(pk
74 .sign(SignatureSchemes::Basic, data)?
75 .as_raw_value()
76 .to_compressed()
77 .to_vec())
78 }
79}