blob: e0a8d7c12a449218e576bfbaed04bc6e9d226fab [file] [log] [blame]
// Copyright 2018 Google LLC
//
// Use of this source code is governed by an MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT.
use std::fmt::{self, Debug, Display, Formatter};
use util::Sealed;
/// The bit length of an RSA key.
///
/// The [`RsaPrivKey`] and [`RsaPubKey`] types take a `B: RsaKeyBits` type
/// parameter indicating the key's length in bits.
///
/// We only support bit lengths of 2048 or greater, as smaller bit lengths are
/// considered insecure. If 2048 is considered insecure at some point in the
/// future, then we will remove support for it, which will be a breaking change.
///
/// [`RsaPrivKey`]: ::public::rsa::RsaPrivKey
/// [`RsaPubKey`]: ::public::rsa::RsaPubKey
pub trait RsaKeyBits: Sized + Copy + Clone + Default + Display + Debug + Sealed {
/// The number of bits.
const BITS: usize;
}
/// 2048 bits.
///
/// `B2048` indicates a 2048-bit RSA key; it implements [`RsaKeyBits`].
#[derive(Copy, Clone, Default, Debug, Eq, PartialEq, Hash)]
pub struct B2048;
/// 3072 bits.
///
/// `B3072` indicates a 3072-bit RSA key; it implements [`RsaKeyBits`].
#[derive(Copy, Clone, Default, Debug, Eq, PartialEq, Hash)]
pub struct B3072;
/// 4096 bits.
///
/// `B4096` indicates a 4096-bit RSA key; it implements [`RsaKeyBits`].
#[derive(Copy, Clone, Default, Debug, Eq, PartialEq, Hash)]
pub struct B4096;
/// 6144 bits.
///
/// `B6144` indicates a 6144-bit RSA key; it implements [`RsaKeyBits`].
#[derive(Copy, Clone, Default, Debug, Eq, PartialEq, Hash)]
pub struct B6144;
/// 8192 bits.
///
/// `B8192` indicates a 8192-bit RSA key; it implements [`RsaKeyBits`].
#[derive(Copy, Clone, Default, Debug, Eq, PartialEq, Hash)]
pub struct B8192;
macro_rules! impl_bits {
($name:ident, $bits:expr) => {
impl RsaKeyBits for $name {
const BITS: usize = $bits;
}
impl Display for $name {
fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
write!(f, "{} bits", $bits)
}
}
impl Sealed for $name {}
};
}
impl_bits!(B2048, 2048);
impl_bits!(B3072, 3072);
impl_bits!(B4096, 4096);
impl_bits!(B6144, 6144);
impl_bits!(B8192, 8192);