66 lines
1.6 KiB
Rust
66 lines
1.6 KiB
Rust
|
|
//! 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();
|
||
|
|
}
|
||
|
|
}
|