From cd894c27e0b0d5746b95b9c2933da3ba6e9a3f5b Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 5 Apr 2020 02:17:25 -0400 Subject: basic implementation of the cryptographic stuff --- src/identity.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/identity.rs (limited to 'src/identity.rs') diff --git a/src/identity.rs b/src/identity.rs new file mode 100644 index 0000000..85b4853 --- /dev/null +++ b/src/identity.rs @@ -0,0 +1,44 @@ +use crate::prelude::*; + +pub struct Identity { + pub email: String, + pub enc_key: Vec, + pub mac_key: Vec, + pub master_password_hash: Vec, +} + +impl Identity { + pub fn new(email: &str, password: &str, iterations: u32) -> Result { + let mut key = vec![0u8; 32]; + pbkdf2::pbkdf2::>( + password.as_bytes(), + email.as_bytes(), + iterations as usize, + &mut key, + ); + + let mut hash = vec![0u8; 32]; + pbkdf2::pbkdf2::>( + &key, + password.as_bytes(), + 1, + &mut hash, + ); + + let hkdf = hkdf::Hkdf::::from_prk(&key) + .map_err(|_| Error::HkdfFromPrk)?; + hkdf.expand(b"enc", &mut key) + .map_err(|_| Error::HkdfExpand)?; + + let mut mac_key = vec![0u8; 32]; + hkdf.expand(b"mac", &mut mac_key) + .map_err(|_| Error::HkdfExpand)?; + + Ok(Self { + email: email.to_string(), + enc_key: key, + mac_key, + master_password_hash: hash, + }) + } +} -- cgit v1.2.3-54-g00ecf