Skip to main content

dpp/bls/
native_bls.rs

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); // We should not error because the signature could be given by an invalid source
29        };
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}