baseid_bbs/
keys.rs

1use crate::error::BbsError;
2use zkryptium::bbsplus::keys::{BBSplusPublicKey, BBSplusSecretKey};
3use zkryptium::keys::pair::KeyPair as ZkKeyPair;
4use zkryptium::schemes::algorithms::BbsBls12381Sha256;
5
6/// A BBS+ key pair (BLS12-381 G2).
7#[derive(Clone)]
8pub struct BbsKeyPair {
9    pub secret_key: Vec<u8>,
10    pub public_key: Vec<u8>,
11}
12
13impl std::fmt::Debug for BbsKeyPair {
14    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15        f.debug_struct("BbsKeyPair")
16            .field("public_key_len", &self.public_key.len())
17            .field("secret_key", &"[REDACTED]")
18            .finish()
19    }
20}
21
22impl BbsKeyPair {
23    /// Generate a new BBS+ key pair.
24    pub fn generate() -> Result<Self, BbsError> {
25        use rand::Rng;
26        let mut rng = rand::thread_rng();
27        let ikm: Vec<u8> = (0..32).map(|_| rng.gen()).collect();
28
29        let zk_kp = ZkKeyPair::<BbsBls12381Sha256>::generate(&ikm, None, None)
30            .map_err(|e| BbsError::KeyGeneration(format!("{:?}", e)))?;
31
32        let sk = zk_kp.private_key();
33        let pk = zk_kp.public_key();
34
35        Ok(Self {
36            secret_key: sk.to_bytes().to_vec(),
37            public_key: pk.to_bytes().to_vec(),
38        })
39    }
40
41    /// Reconstruct from serialized bytes.
42    pub fn from_bytes(secret_bytes: &[u8], public_bytes: &[u8]) -> Result<Self, BbsError> {
43        // Validate by attempting to parse
44        let _sk = BBSplusSecretKey::from_bytes(secret_bytes)
45            .map_err(|e| BbsError::KeyGeneration(format!("invalid secret key: {:?}", e)))?;
46        let _pk = BBSplusPublicKey::from_bytes(public_bytes)
47            .map_err(|e| BbsError::KeyGeneration(format!("invalid public key: {:?}", e)))?;
48
49        Ok(Self {
50            secret_key: secret_bytes.to_vec(),
51            public_key: public_bytes.to_vec(),
52        })
53    }
54
55    /// Get the zkryptium secret key.
56    pub(crate) fn zk_secret_key(&self) -> Result<BBSplusSecretKey, BbsError> {
57        BBSplusSecretKey::from_bytes(&self.secret_key)
58            .map_err(|e| BbsError::KeyGeneration(format!("{:?}", e)))
59    }
60
61    /// Get the zkryptium public key.
62    pub(crate) fn zk_public_key(&self) -> Result<BBSplusPublicKey, BbsError> {
63        BBSplusPublicKey::from_bytes(&self.public_key)
64            .map_err(|e| BbsError::KeyGeneration(format!("{:?}", e)))
65    }
66}