#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PwHashLimits {
Minimum,
Interactive,
Moderate,
Sensitive,
}
thread_local! {
static PWHASH_LIMITS: std::cell::RefCell<PwHashLimits> = const { std::cell::RefCell::new(PwHashLimits::Moderate) };
}
impl PwHashLimits {
pub fn current() -> Self {
PWHASH_LIMITS.with(|s| *s.borrow())
}
pub fn with_exec<R, F>(self, f: F) -> R
where
F: FnOnce() -> R,
{
PWHASH_LIMITS.with(move |s| {
*s.borrow_mut() = self;
let res = f();
*s.borrow_mut() = PwHashLimits::Moderate;
res
})
}
pub fn as_mem_limit(&self) -> u32 {
match self {
Self::Minimum => sodoken::argon2::ARGON2_ID_MEMLIMIT_MIN,
Self::Interactive => {
sodoken::argon2::ARGON2_ID_MEMLIMIT_INTERACTIVE
}
Self::Moderate => sodoken::argon2::ARGON2_ID_MEMLIMIT_MODERATE,
Self::Sensitive => sodoken::argon2::ARGON2_ID_MEMLIMIT_SENSITIVE,
}
}
pub fn as_ops_limit(&self) -> u32 {
match self {
Self::Minimum => sodoken::argon2::ARGON2_ID_OPSLIMIT_MIN,
Self::Interactive => {
sodoken::argon2::ARGON2_ID_OPSLIMIT_INTERACTIVE
}
Self::Moderate => sodoken::argon2::ARGON2_ID_OPSLIMIT_MODERATE,
Self::Sensitive => sodoken::argon2::ARGON2_ID_OPSLIMIT_SENSITIVE,
}
}
}