about summary refs log tree commit diff
path: root/knowing/src/password.rs
diff options
context:
space:
mode:
authorgennyble <gen@nyble.dev>2026-09-25 03:56:11 -0500
committergennyble <gen@nyble.dev>2026-09-25 03:56:11 -0500
commitba592de54cd3dce52eb2096dabbe748107f5db2b (patch)
tree4a23377e9788630e09c669e9ed18aecd27673ee7 /knowing/src/password.rs
parentf4d8e8d03c1b80d5c59ee85631d5a78048892a32 (diff)
splorm auth
Diffstat (limited to 'knowing/src/password.rs')
-rw-r--r--knowing/src/password.rs35
1 files changed, 35 insertions, 0 deletions
diff --git a/knowing/src/password.rs b/knowing/src/password.rs
new file mode 100644
index 0000000..013a9f7
--- /dev/null
+++ b/knowing/src/password.rs
@@ -0,0 +1,35 @@
+use argon2::{Argon2, PasswordHasher, PasswordVerifier as ArgonPasswordVerifier};
+use somethings::auth::HashedPassword;
+
+use crate::Error;
+
+pub trait IntoHashedPassword {
+	fn hash_password(self) -> HashedPassword;
+}
+
+impl IntoHashedPassword for String {
+	fn hash_password(self) -> HashedPassword {
+		let a2 = Argon2::default();
+		let a2_hash = a2.hash_password(self.as_bytes()).unwrap();
+
+		HashedPassword::new(a2_hash.to_string())
+	}
+}
+
+pub trait PasswordVerifier: Sized {
+	fn get_password_hash(&self) -> &HashedPassword;
+	fn verify_password(&self, plain: String) -> Result<(), Error> {
+		let a2_phash = argon2::PasswordHash::new(&self.get_password_hash().to_string())
+			.map_err(|_| Error::AuthenticationFailed)?;
+
+		Argon2::default()
+			.verify_password(plain.as_bytes(), &a2_phash)
+			.map_err(|_| Error::AuthenticationFailed)
+	}
+}
+
+impl PasswordVerifier for HashedPassword {
+	fn get_password_hash(&self) -> &HashedPassword {
+		self
+	}
+}