use crate::{Result, format::Header};
#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))]
pub struct Params {
memory_cost: u32,
time_cost: u32,
parallelism: u32,
}
impl Params {
#[inline]
pub fn new(ciphertext: impl AsRef<[u8]>) -> Result<Self> {
let inner = |ciphertext: &[u8]| -> Result<Self> {
let params = Header::parse(ciphertext).map(|h| h.params())?;
Ok(params)
};
inner(ciphertext.as_ref())
}
#[must_use]
#[inline]
pub const fn memory_cost(&self) -> u32 {
self.memory_cost
}
#[must_use]
#[inline]
pub const fn time_cost(&self) -> u32 {
self.time_cost
}
#[must_use]
#[inline]
pub const fn parallelism(&self) -> u32 {
self.parallelism
}
}
impl From<Params> for argon2::Params {
#[inline]
fn from(params: Params) -> Self {
Self::new(
params.memory_cost(),
params.time_cost(),
params.parallelism(),
None,
)
.expect("`Params` should be valid as `argon2::Params`")
}
}
impl From<argon2::Params> for Params {
#[inline]
fn from(params: argon2::Params) -> Self {
let (memory_cost, time_cost, parallelism) =
(params.m_cost(), params.t_cost(), params.p_cost());
Self {
memory_cost,
time_cost,
parallelism,
}
}
}