use super::{limb, BoxedLimbs, Limb, LimbMask, Modulus};
use crate::error;
use alloc::boxed::Box;
pub struct PrivateExponent {
limbs: Box<[Limb]>,
}
impl PrivateExponent {
pub fn from_be_bytes_padded<M>(
input: untrusted::Input,
p: &Modulus<M>,
) -> Result<Self, error::Unspecified> {
let dP = BoxedLimbs::from_be_bytes_padded_less_than(input, p)?;
if limb::limbs_are_even_constant_time(&dP) != LimbMask::False {
return Err(error::Unspecified);
}
Ok(Self {
limbs: dP.into_limbs(),
})
}
#[cfg(test)]
pub fn from_be_bytes_for_test_only<M>(
input: untrusted::Input,
p: &Modulus<M>,
) -> Result<Self, error::Unspecified> {
if let r @ Ok(_) = Self::from_be_bytes_padded(input, p) {
return r;
}
let dP = BoxedLimbs::<M>::positive_minimal_width_from_be_bytes(input)?;
Ok(Self {
limbs: dP.into_limbs(),
})
}
#[inline]
pub(super) fn limbs(&self) -> &[Limb] {
&self.limbs
}
}