use alloc::boxed::Box;
use crypto_bigint::{
modular::{BoxedMontyForm, BoxedMontyParams},
BoxedUint, NonZero,
};
use zeroize::Zeroize;
pub trait PublicKeyParts {
fn n(&self) -> &NonZero<BoxedUint>;
fn e(&self) -> &BoxedUint;
fn size(&self) -> usize {
(self.n().bits() as usize).div_ceil(8)
}
fn n_params(&self) -> &BoxedMontyParams;
fn n_bits_precision(&self) -> u32 {
self.n().bits_precision()
}
fn n_bytes(&self) -> Box<[u8]> {
self.n().to_be_bytes_trimmed_vartime()
}
fn e_bytes(&self) -> Box<[u8]> {
self.e().to_be_bytes_trimmed_vartime()
}
}
pub trait PrivateKeyParts: PublicKeyParts {
fn d(&self) -> &BoxedUint;
fn primes(&self) -> &[BoxedUint];
fn dp(&self) -> Option<&BoxedUint>;
fn dq(&self) -> Option<&BoxedUint>;
fn qinv(&self) -> Option<&BoxedMontyForm>;
fn crt_values(&self) -> Option<&[CrtValue]>;
fn p_params(&self) -> Option<&BoxedMontyParams>;
fn q_params(&self) -> Option<&BoxedMontyParams>;
}
#[derive(Debug, Clone)]
pub struct CrtValue {
pub(crate) exp: BoxedUint,
pub(crate) coeff: BoxedUint,
pub(crate) r: BoxedUint,
}
impl Zeroize for CrtValue {
fn zeroize(&mut self) {
self.exp.zeroize();
self.coeff.zeroize();
self.r.zeroize();
}
}
impl Drop for CrtValue {
fn drop(&mut self) {
self.zeroize();
}
}