Add scan key encryption

This commit is contained in:
Alex Silva 2024-03-29 11:30:22 +01:00
parent e7d2ace04a
commit 58de1c14ba
2 changed files with 28 additions and 15 deletions

View File

@ -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<GenerateCreateUserReturn> {
let mut output_list: Vec<OutputList> = 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)
}

View File

@ -98,10 +98,11 @@ impl UserKeys {
#[tsify(into_wasm_abi, from_wasm_abi)]
pub struct User {
recover_data: Vec<u8>,
revoke_data: Vec<u8>,
revoke_data: Option<Vec<u8>>,
sharding: Sharding,
pre_id: String,
recovered_spend_key: Option<String>,
recovered_scan_key: Option<String>,
}
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::<u8>::with_capacity(64); // 32 * 2
let mut recover_data = Vec::<u8>::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,
})
}