Skip to main content

sentc_crypto_std_keys/core/asym/
mod.rs

1use 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}