37 lines
1.1 KiB
Rust
37 lines
1.1 KiB
Rust
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<u8>);
|
|
|
|
impl Password {
|
|
pub(crate) fn salt(self) -> Result<SaltedPasswordData, ()> {
|
|
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()
|
|
}
|
|
}
|