| //! Traits related to the key components |
| |
| use num_bigint::{BigInt, BigUint}; |
| use zeroize::Zeroize; |
| |
| /// Components of an RSA public key. |
| pub trait PublicKeyParts { |
| /// Returns the modulus of the key. |
| fn n(&self) -> &BigUint; |
| |
| /// Returns the public exponent of the key. |
| fn e(&self) -> &BigUint; |
| |
| /// Returns the modulus size in bytes. Raw signatures and ciphertexts for |
| /// or by this public key will have the same size. |
| fn size(&self) -> usize { |
| (self.n().bits() + 7) / 8 |
| } |
| } |
| |
| /// Components of an RSA private key. |
| pub trait PrivateKeyParts: PublicKeyParts { |
| /// Returns the private exponent of the key. |
| fn d(&self) -> &BigUint; |
| |
| /// Returns the prime factors. |
| fn primes(&self) -> &[BigUint]; |
| |
| /// Returns the precomputed dp value, D mod (P-1) |
| fn dp(&self) -> Option<&BigUint>; |
| |
| /// Returns the precomputed dq value, D mod (Q-1) |
| fn dq(&self) -> Option<&BigUint>; |
| |
| /// Returns the precomputed qinv value, Q^-1 mod P |
| fn qinv(&self) -> Option<&BigInt>; |
| |
| /// Returns an iterator over the CRT Values |
| fn crt_values(&self) -> Option<&[CrtValue]>; |
| } |
| |
| /// Contains the precomputed Chinese remainder theorem values. |
| #[derive(Debug, Clone)] |
| pub struct CrtValue { |
| /// D mod (prime - 1) |
| pub(crate) exp: BigInt, |
| /// R·Coeff ≡ 1 mod Prime. |
| pub(crate) coeff: BigInt, |
| /// product of primes prior to this (inc p and q) |
| pub(crate) r: BigInt, |
| } |
| |
| 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(); |
| } |
| } |