1use crate::error::BbsError;
2use zkryptium::bbsplus::keys::{BBSplusPublicKey, BBSplusSecretKey};
3use zkryptium::keys::pair::KeyPair as ZkKeyPair;
4use zkryptium::schemes::algorithms::BbsBls12381Sha256;
5
6#[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 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 pub fn from_bytes(secret_bytes: &[u8], public_bytes: &[u8]) -> Result<Self, BbsError> {
43 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 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 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}