sentc_crypto_std_keys/core/asym/
mod.rs1use alloc::vec::Vec;
2
3use sentc_crypto_core::cryptomat::{CryptoAlg, Pk, SignK, Sk, SkComposer, StaticKeyPair, SymKey, VerifyK};
4use sentc_crypto_core::Error;
5
6use crate::core::asym::ecies::{EciesPk, EciesSk};
7use crate::core::asym::ecies_kyber_hybrid::{EciesKyberHybridPk, EciesKyberHybridSk};
8use crate::core::asym::pqc_kyber::{KyberPk, KyberSk};
9
10pub(crate) mod ecies;
11pub(crate) mod ecies_kyber_hybrid;
12pub(crate) mod pqc_kyber;
13
14macro_rules! deref_macro {
15 ($self:expr, $method:ident $(, $args:expr)*) => {
16 match $self {
17 Self::Ecies(inner) => inner.$method($($args),*),
18 Self::Kyber(inner) => inner.$method($($args),*),
19 Self::EciesKyberHybrid(inner) => inner.$method($($args),*),
20 }
21 };
22}
23
24macro_rules! crypto_alg_impl {
25 ($name:ty) => {
26 impl CryptoAlg for $name
27 {
28 fn get_alg_str(&self) -> &'static str
29 {
30 deref_macro!(self, get_alg_str)
31 }
32 }
33 };
34}
35
36macro_rules! get_inner_key {
37 ($st:ty,$t:ident) => {
38 impl $st
39 {
40 pub fn ecies_from_bytes_owned(bytes: Vec<u8>) -> Result<Self, Error>
41 {
42 Ok(Self::Ecies(bytes.try_into()?))
43 }
44
45 pub fn kyber_from_bytes_owned(bytes: Vec<u8>) -> Result<Self, Error>
46 {
47 Ok(Self::Kyber(bytes.try_into()?))
48 }
49
50 pub fn ecies_kyber_hybrid_from_bytes_owned(bytes_x: Vec<u8>, bytes_k: Vec<u8>) -> Result<Self, Error>
51 {
52 Ok(Self::EciesKyberHybrid($t::from_bytes_owned(bytes_x, bytes_k)?))
53 }
54 }
55 };
56}
57
58#[derive(Clone)]
59pub enum PublicKey
60{
61 Ecies(EciesPk),
62 Kyber(KyberPk),
63 EciesKyberHybrid(EciesKyberHybridPk),
64}
65
66get_inner_key!(PublicKey, EciesKyberHybridPk);
67crypto_alg_impl!(PublicKey);
68
69impl Pk for PublicKey
70{
71 fn sign_public_key<S: SignK>(&self, sign_key: &S) -> Result<S::Signature, Error>
72 {
73 let out = match self {
74 PublicKey::Ecies(k) => k.sign_public_key(sign_key)?,
75 PublicKey::Kyber(k) => k.sign_public_key(sign_key)?,
76 PublicKey::EciesKyberHybrid(k) => k.sign_public_key(sign_key)?,
77 };
78
79 Ok(out)
80 }
81
82 fn verify_public_key<V: VerifyK>(&self, verify_key: &V, sig: &V::Signature) -> Result<bool, Error>
83 {
84 deref_macro!(self, verify_public_key, verify_key, sig)
85 }
86
87 fn encrypt(&self, data: &[u8]) -> Result<Vec<u8>, Error>
88 {
89 deref_macro!(self, encrypt, data)
90 }
91}
92
93pub enum SecretKey
94{
95 Ecies(EciesSk),
96 Kyber(KyberSk),
97 EciesKyberHybrid(EciesKyberHybridSk),
98}
99
100get_inner_key!(SecretKey, EciesKyberHybridSk);
101crypto_alg_impl!(SecretKey);
102
103impl Sk for SecretKey
104{
105 fn encrypt_by_master_key<M: SymKey>(&self, master_key: &M) -> Result<Vec<u8>, Error>
106 {
107 deref_macro!(self, encrypt_by_master_key, master_key)
108 }
109
110 fn decrypt(&self, ciphertext: &[u8]) -> Result<Vec<u8>, Error>
111 {
112 deref_macro!(self, decrypt, ciphertext)
113 }
114}
115
116impl SkComposer for SecretKey
117{
118 type SecretKey = Self;
119
120 fn decrypt_by_master_key<M: SymKey>(master_key: &M, encrypted_key: &[u8], alg_str: &str) -> Result<Self::SecretKey, Error>
121 {
122 let decrypted_bytes = master_key.decrypt(encrypted_key)?;
123
124 let key = match alg_str {
125 ecies::ECIES_OUTPUT => Self::Ecies(decrypted_bytes.try_into()?),
126 pqc_kyber::KYBER_OUTPUT => Self::Kyber(decrypted_bytes.try_into()?),
127 ecies_kyber_hybrid::ECIES_KYBER_HYBRID_OUTPUT => Self::EciesKyberHybrid(decrypted_bytes.try_into()?),
128 _ => return Err(Error::AlgNotFound),
129 };
130
131 Ok(key)
132 }
133}
134
135impl StaticKeyPair for SecretKey
136{
137 type SecretKey = Self;
138 type PublicKey = PublicKey;
139
140 fn generate_static_keypair() -> Result<(Self::SecretKey, Self::PublicKey), Error>
141 {
142 #[cfg(feature = "ecies_kyber_hybrid")]
143 let (sk, pk) = ecies_kyber_hybrid::EciesKyberHybridKeyPair::generate_static_keypair()?;
144
145 #[cfg(feature = "ecies")]
146 let (sk, pk) = ecies::EciesKeyPair::generate_static_keypair()?;
147
148 Ok((sk.into(), pk.into()))
149 }
150}