use num_traits::{Num, One, PrimInt, Signed, Unsigned, Zero};
use zeroize::Zeroize;
use crate::traits::modular::UnsignedModularInt;
pub trait PublicKeyParts<T>
where
T: UnsignedModularInt,
{
fn n(&self) -> &T;
fn e(&self) -> &T;
fn size(&self) -> usize {
(self.n().bits() + 7) / 8
}
}
pub trait PrivateKeyParts<T>: PublicKeyParts<T>
where
T: UnsignedModularInt,
{
fn d(&self) -> &T;
fn primes(&self) -> &[T];
fn dp(&self) -> Option<&T>;
fn dq(&self) -> Option<&T>;
fn qinv(&self) -> Option<&T>
where
T: Signed;
fn crt_values(&self) -> Option<&[CrtValue<T>]>;
}
#[derive(Debug, Clone)]
pub struct CrtValue<T>
where
T: UnsignedModularInt + Clone,
{
pub(crate) exp: T,
pub(crate) coeff: T,
pub(crate) r: T,
}
impl<T> Zeroize for CrtValue<T>
where
T: UnsignedModularInt + Clone,
{
fn zeroize(&mut self) {
self.exp.zeroize();
self.coeff.zeroize();
self.r.zeroize();
}
}
impl<T> Drop for CrtValue<T>
where
T: UnsignedModularInt + Clone,
{
fn drop(&mut self) {
self.zeroize();
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_count_bits() {
let _crt = CrtValue::<u64> {
exp: 0,
coeff: 0,
r: 0,
};
}
}