dpp/bls/
native_bls.rs

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