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