use serde::Deserialize; use sodiumoxide::crypto::pwhash::argon2id13::{pwhash, MEMLIMIT_INTERACTIVE, OPSLIMIT_INTERACTIVE}; use uuid::Uuid; #[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, Deserialize, sqlx::Type)] #[sqlx(transparent)] pub(crate) struct ApiKey(pub(crate) Uuid); #[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, Deserialize, sqlx::Type)] #[sqlx(transparent)] pub(crate) struct Username(String); #[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, Deserialize)] pub(crate) struct Password(String); #[derive(sqlx::Type)] #[sqlx(transparent)] pub(crate) struct SaltedPasswordData(pub(crate) Vec); impl Password { pub(crate) fn salt(self) -> Result { Ok(SaltedPasswordData( pwhash( self.0.as_bytes(), OPSLIMIT_INTERACTIVE, MEMLIMIT_INTERACTIVE, )? .as_ref() .to_vec(), )) } pub(crate) fn as_bytes(&self) -> &[u8] { self.0.as_bytes() } }