From 58de1c14ba20cc88ff08cd14eaf6995f58b5f969 Mon Sep 17 00:00:00 2001 From: Alex Silva Date: Fri, 29 Mar 2024 11:30:22 +0100 Subject: [PATCH] Add scan key encryption --- crates/sp_client/src/api.rs | 10 ---------- crates/sp_client/src/user.rs | 33 ++++++++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/crates/sp_client/src/api.rs b/crates/sp_client/src/api.rs index 48489dd..97d8cfb 100644 --- a/crates/sp_client/src/api.rs +++ b/crates/sp_client/src/api.rs @@ -72,11 +72,6 @@ pub fn setup() { wasm_logger::init(wasm_logger::Config::default()); } -#[wasm_bindgen] -pub fn test_fn() { - log::info!("test"); -} - // Should be transfered to annother module pub struct GenerateSPWallet { pub sp_client: SpClient, @@ -135,7 +130,6 @@ pub fn create_user( birthday: u32, ) -> ApiResult { let mut output_list: Vec = Vec::new(); - log::info!("Ok0"); //recover let sp_wallet_recover = generate_sp_wallet(label.clone(), birthday, true)?; output_list.push(sp_wallet_recover.sp_outputs); @@ -149,7 +143,6 @@ pub fn create_user( } }; let recover_keys = UserKeys::add_keys_recover(recover_scan_key, recover_spend_key); - log::info!("Ok1"); //revoke let sp_wallet_revoke = generate_sp_wallet(label.clone(), birthday, true)?; output_list.push(sp_wallet_revoke.sp_outputs); @@ -178,7 +171,6 @@ pub fn create_user( let main_keys = UserKeys::add_keys_main(main_scan_key, main_spend_key); let user_keys = UserKeys::new(recover_keys, revoke_keys, main_keys); - log::info!("Ok2"); let user = User::new(user_keys, password)?; @@ -186,8 +178,6 @@ pub fn create_user( user, output_list_vec: output_list, }; - log::info!("Ok3"); - Ok(generate_user) } diff --git a/crates/sp_client/src/user.rs b/crates/sp_client/src/user.rs index fcadd92..530f650 100644 --- a/crates/sp_client/src/user.rs +++ b/crates/sp_client/src/user.rs @@ -98,10 +98,11 @@ impl UserKeys { #[tsify(into_wasm_abi, from_wasm_abi)] pub struct User { recover_data: Vec, - revoke_data: Vec, + revoke_data: Option>, sharding: Sharding, pre_id: String, recovered_spend_key: Option, + recovered_scan_key: Option, } impl User { @@ -119,14 +120,17 @@ impl User { revoke_data.extend_from_slice(revoke_scan_key.as_ref()); revoke_data.extend_from_slice(revoke_spend_key.as_ref()); - // split recover spend key + // Take the 2 recover keys + let recover_scan_key = user_keys.get_keys(user_keys.recover_keys.clone()).scan_key; let recover_spend_key = user_keys.get_keys(user_keys.recover_keys.clone()).spend_key; + // split recover spend key let (part1_key, part2_key) = recover_spend_key.as_ref().split_at(SECRET_KEY_SIZE / 2); - let mut recover_data = Vec::::with_capacity(64); // 32 * 2 + let mut recover_data = Vec::::with_capacity(180); // 32 * 3 + (12+16)*3 - // generate 2 tokens of 32B entropy + // generate 3 tokens of 32B entropy let mut entropy_1: [u8; 32] = Aes256Gcm::generate_key(&mut rng).into(); let mut entropy_2: [u8; 32] = Aes256Gcm::generate_key(&mut rng).into(); + let mut entropy_3: [u8; 32] = Aes256Gcm::generate_key(&mut rng).into(); recover_data.extend_from_slice(&entropy_1); recover_data.extend_from_slice(&entropy_2); @@ -176,6 +180,24 @@ impl User { engine.write_all(&cipher_recover_part1); let pre_id = sha256::Hash::from_engine(engine); + //scan key: + let mut engine = sha256::HashEngine::default(); + engine.write_all(&user_password.as_bytes()); + engine.write_all(&entropy_3); + let hash3 = sha256::Hash::from_engine(engine); + + let scan_key_encryption = Aes256Encryption::import_key( + Purpose::Login, + recover_scan_key.secret_bytes().to_vec(), + hash3.to_byte_array(), + Aes256Gcm::generate_nonce(&mut rng).into(), + )?; + + // encrypt the scan key + let cipher_scan_key = scan_key_encryption.encrypt_with_aes_key()?; + + recover_data.extend_from_slice(&cipher_scan_key); + //Create PRDList //@todo //Send messages PRDList @@ -184,10 +206,11 @@ impl User { Ok(User { recover_data, - revoke_data, + revoke_data: Some(revoke_data), sharding, pre_id: pre_id.to_string(), recovered_spend_key: None, + recovered_scan_key: None, }) }