Page MenuHomePhabricator

D8885.id30133.diff
No OneTemporary

D8885.id30133.diff

diff --git a/native/native_rust_library/src/argon2_tools.rs b/native/native_rust_library/src/argon2_tools.rs
new file mode 100644
--- /dev/null
+++ b/native/native_rust_library/src/argon2_tools.rs
@@ -0,0 +1,65 @@
+use argon2::{Algorithm, Argon2, Params, Version};
+
+pub const BACKUP_KEY_LENGTH: usize = 32; //256-bit digest
+
+pub fn compute_backup_key(
+ password: &str,
+ backup_id: &str,
+) -> Result<[u8; BACKUP_KEY_LENGTH], argon2::Error> {
+ let mut backup_key = [0u8; BACKUP_KEY_LENGTH];
+ let argon_params = Params::new(
+ Params::DEFAULT_M_COST,
+ Params::DEFAULT_T_COST,
+ Params::DEFAULT_P_COST,
+ Some(BACKUP_KEY_LENGTH),
+ )?;
+
+ Argon2::new(Algorithm::Argon2i, Version::V0x13, argon_params)
+ .hash_password_into(
+ password.as_bytes(),
+ backup_id.as_bytes(),
+ &mut backup_key,
+ )?;
+
+ Ok(backup_key)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_compute_backup_key() {
+ let password = "password123";
+ let backup_id = "backup_123";
+
+ let result = compute_backup_key(password, backup_id);
+ assert!(result.is_ok());
+
+ let key = result.unwrap();
+ assert_eq!(key.len(), BACKUP_KEY_LENGTH);
+ }
+
+ #[test]
+ fn test_compute_backup_key_error() {
+ let password = "password123";
+ let backup_id = "";
+
+ let result = compute_backup_key(password, backup_id);
+ assert!(result.is_err());
+ }
+
+ #[test]
+ fn test_compute_backup_key_accuracy() {
+ let password = "password123";
+ let backup_id = "backup_123";
+
+ let result1 = compute_backup_key(password, backup_id);
+ let result2 = compute_backup_key(password, backup_id);
+ assert!(result1.is_ok());
+ assert!(result2.is_ok());
+ let key1 = result1.unwrap();
+ let key2 = result2.unwrap();
+ assert_eq!(key1, key2);
+ }
+}
diff --git a/native/native_rust_library/src/lib.rs b/native/native_rust_library/src/lib.rs
--- a/native/native_rust_library/src/lib.rs
+++ b/native/native_rust_library/src/lib.rs
@@ -11,6 +11,8 @@
mod crypto_tools;
mod identity_client;
+mod argon2_tools;
+
mod identity {
tonic::include_proto!("identity.client");
}
@@ -22,6 +24,7 @@
OpaqueLoginStartRequest, PreKey, RegistrationFinishRequest,
RegistrationStartRequest, WalletLoginRequest,
};
+use argon2_tools::compute_backup_key;
lazy_static! {
pub static ref RUNTIME: Arc<Runtime> = Arc::new(
@@ -101,6 +104,12 @@
// Crypto Tools
fn generate_device_id(device_type: DeviceType) -> Result<String>;
+
+ // Argon2
+ fn compute_backup_key(
+ password: &str,
+ backup_id: &str,
+ ) -> Result<[u8; 32]>;
}
unsafe extern "C++" {

File Metadata

Mime Type
text/plain
Expires
Sat, Sep 28, 4:52 PM (10 h, 29 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2197248
Default Alt Text
D8885.id30133.diff (2 KB)

Event Timeline