Userkeys and api update

This commit is contained in:
Alex Silva 2024-03-29 10:15:01 +01:00
parent 9fe0687a4e
commit 9c551f5a5a
2 changed files with 141 additions and 32 deletions

View File

@ -1,7 +1,10 @@
use std::collections::HashMap;
use rand::Rng; use rand::Rng;
use anyhow::Error as AnyhowError; use anyhow::Error as AnyhowError;
use serde_json::Error as SerdeJsonError; use serde_json::Error as SerdeJsonError;
use shamir::SecretData;
use sp_backend::bitcoin::secp256k1::SecretKey; use sp_backend::bitcoin::secp256k1::SecretKey;
use sp_backend::silentpayments::Error as SpError; use sp_backend::silentpayments::Error as SpError;
@ -15,7 +18,7 @@ use sp_backend::spclient::SpendKey;
use sp_backend::spclient::{derive_keys_from_seed, OutputList, SpClient}; use sp_backend::spclient::{derive_keys_from_seed, OutputList, SpClient};
use web_sys::js_sys::JsString; use web_sys::js_sys::JsString;
use crate::user::User; use crate::user::{User, UserKeys};
type ApiResult<T: FromWasmAbi> = Result<T, ApiError>; type ApiResult<T: FromWasmAbi> = Result<T, ApiError>;
@ -59,9 +62,9 @@ impl Into<JsValue> for ApiError {
#[derive(Tsify, Serialize, Deserialize)] #[derive(Tsify, Serialize, Deserialize)]
#[tsify(into_wasm_abi)] #[tsify(into_wasm_abi)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
pub struct generate_create_user_return { pub struct GenerateCreateUserReturn {
pub user: User, pub user: User,
pub output_list: OutputList pub output_list_vec: Vec<OutputList>,
} }
#[wasm_bindgen] #[wasm_bindgen]
@ -69,11 +72,22 @@ pub fn setup() {
wasm_logger::init(wasm_logger::Config::default()); 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,
pub sp_outputs: OutputList,
}
pub fn generate_sp_wallet( pub fn generate_sp_wallet(
label: Option<String>, label: Option<String>,
birthday: u32, birthday: u32,
is_testnet: bool, is_testnet: bool,
) -> ApiResult<generate_sp_wallet_return> { ) -> ApiResult<GenerateSPWallet> {
let mut seed = [0u8; 64]; let mut seed = [0u8; 64];
rand::thread_rng().fill(&mut seed); rand::thread_rng().fill(&mut seed);
let (scan_sk, spend_sk) = derive_keys_from_seed(&seed, is_testnet)?; let (scan_sk, spend_sk) = derive_keys_from_seed(&seed, is_testnet)?;
@ -90,7 +104,7 @@ pub fn generate_sp_wallet(
our_address.to_string() our_address.to_string()
); );
let sp_client_json = serde_json::to_string(&sp_client)?; //let sp_client_json = serde_json::to_string(&sp_client)?;
// Generate an empty outputs // Generate an empty outputs
let sp_outputs = OutputList::new( let sp_outputs = OutputList::new(
@ -98,11 +112,11 @@ pub fn generate_sp_wallet(
our_address.get_spend_key(), our_address.get_spend_key(),
birthday, birthday,
); );
let sp_outputs_json = serde_json::to_string(&sp_outputs)?; //let sp_outputs_json = serde_json::to_string(&sp_outputs)?;
let res = generate_sp_wallet_return { let res = GenerateSPWallet {
sp_client_json, sp_client,
sp_outputs_json, sp_outputs,
}; };
Ok(res) Ok(res)
@ -116,26 +130,64 @@ pub fn get_receiving_address(sp_client: String) -> String {
#[wasm_bindgen] #[wasm_bindgen]
pub fn create_user( pub fn create_user(
password: JsString, password: String,
image_to_recover: &[u8],
image_to_revoke: &[u8],
label: Option<String>, label: Option<String>,
birthday: u32, birthday: u32,
) -> ApiResult<User> { ) -> 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);
let recover_scan_key = sp_wallet_recover.sp_client.get_scan_key();
let recover_spend_key = match sp_wallet_recover.sp_client.get_spend_key() {
SpendKey::Secret(key) => key,
SpendKey::Public(_) => {
return Err(ApiError::from(AnyhowError::msg(
"No recover spend key created on Signet",
)))
}
};
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);
let revoke_scan_key = sp_wallet_revoke.sp_client.get_scan_key();
let revoke_spend_key = match sp_wallet_revoke.sp_client.get_spend_key() {
SpendKey::Secret(key) => key,
SpendKey::Public(_) => {
return Err(ApiError::from(AnyhowError::msg(
"No revoke spend key created on Signet",
)))
}
};
let revoke_keys = UserKeys::add_keys_revoke(revoke_scan_key, revoke_spend_key);
//mainet
let sp_wallet_main = generate_sp_wallet(label, birthday, false)?;
output_list.push(sp_wallet_main.sp_outputs);
let main_scan_key = sp_wallet_main.sp_client.get_scan_key();
let main_spend_key = match sp_wallet_main.sp_client.get_spend_key() {
SpendKey::Secret(key) => key,
SpendKey::Public(_) => {
return Err(ApiError::from(AnyhowError::msg(
"No spend key created on Mainet",
)))
}
};
let main_keys = UserKeys::add_keys_main(main_scan_key, main_spend_key);
// todo: struct with sp_client{revoke, recover, main} let user_keys = UserKeys::new(recover_keys, revoke_keys, main_keys);
let sp_client_recover = generate_sp_wallet(label, birthday, true)?; log::info!("Ok2");
let sp_client_revoke = generate_sp_wallet(label, birthday, true)?;
let sp_client_main = generate_sp_wallet(label, birthday, false)?;
let user = User::new( let user = User::new(user_keys, password)?;
recover_spend_key,
revoke_spend_key,
revoke_scan_key,
&password,
image_to_recover,
image_to_revoke,
)?;
Ok(user) let generate_user = GenerateCreateUserReturn {
user,
output_list_vec: output_list,
};
log::info!("Ok3");
Ok(generate_user)
} }

View File

@ -37,6 +37,62 @@ use crate::aesgcm::{Aes256Encryption, Purpose};
//extern crate shamir; //extern crate shamir;
//use shamir::SecretData; //use shamir::SecretData;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum KeyType {
Recover(SpKeys),
Revoke(SpKeys),
Main(SpKeys),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpKeys {
pub scan_key: SecretKey,
pub spend_key: SecretKey,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserKeys {
pub recover_keys: KeyType,
pub revoke_keys: KeyType,
pub main_keys: KeyType,
}
impl UserKeys {
pub fn new(recover_keys: KeyType, revoke_keys: KeyType, main_keys: KeyType) -> Self {
UserKeys {
recover_keys,
revoke_keys,
main_keys,
}
}
pub fn add_keys_recover(scan_key: SecretKey, spend_key: SecretKey) -> KeyType {
let sp_keys = SpKeys {
scan_key,
spend_key,
};
KeyType::Recover((sp_keys))
}
pub fn add_keys_revoke(scan_key: SecretKey, spend_key: SecretKey) -> KeyType {
let sp_keys = SpKeys {
scan_key,
spend_key,
};
KeyType::Revoke((sp_keys))
}
pub fn add_keys_main(scan_key: SecretKey, spend_key: SecretKey) -> KeyType {
let sp_keys = SpKeys {
scan_key,
spend_key,
};
KeyType::Main((sp_keys))
}
pub fn get_keys(&self, key_type: KeyType) -> SpKeys {
match key_type {
KeyType::Recover(keys) => keys,
KeyType::Revoke(keys) => keys,
KeyType::Main(keys) => keys,
}
}
}
#[derive(Debug, Serialize, Deserialize, Clone, Tsify)] #[derive(Debug, Serialize, Deserialize, Clone, Tsify)]
#[tsify(into_wasm_abi, from_wasm_abi)] #[tsify(into_wasm_abi, from_wasm_abi)]
@ -50,20 +106,21 @@ pub struct User {
impl User { impl User {
pub fn new( pub fn new(
recover_spend_key: SecretKey, user_keys: UserKeys,
revoke_spend_key: SecretKey,
revoke_scan_key: SecretKey,
user_password: String, user_password: String,
) -> Result<Self> { ) -> Result<Self> {
let mut rng = thread_rng(); let mut rng = thread_rng();
// image revoke // image revoke
// We just take the 2 revoke keys // We just take the 2 revoke keys
let revoke_scan_key = user_keys.get_keys(user_keys.revoke_keys.clone()).scan_key;
let revoke_spend_key = user_keys.get_keys(user_keys.revoke_keys.clone()).spend_key;
let mut revoke_data = Vec::with_capacity(64); let mut revoke_data = Vec::with_capacity(64);
revoke_data.extend_from_slice(revoke_scan_key.as_ref()); revoke_data.extend_from_slice(revoke_scan_key.as_ref());
revoke_data.extend_from_slice(revoke_spend_key.as_ref()); revoke_data.extend_from_slice(revoke_spend_key.as_ref());
// split recover spend key // split recover spend key
let recover_spend_key = user_keys.get_keys(user_keys.recover_keys.clone()).spend_key;
let (part1_key, part2_key) = recover_spend_key.as_ref().split_at(SECRET_KEY_SIZE / 2); 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(64); // 32 * 2
@ -347,7 +404,7 @@ pub fn read_exif(image: &[u8]) -> Result<Vec<u8>, String> {
// let base64_string = base64::encode(decoded_data); // let base64_string = base64::encode(decoded_data);
// base64_string // base64_string
// } // }
/*
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; // Import everything from the outer module use super::*; // Import everything from the outer module
@ -389,4 +446,4 @@ mod tests {
assert!(format!("{}", retrieved_recover_spend.unwrap().display_secret()) == RECOVER_SPEND) assert!(format!("{}", retrieved_recover_spend.unwrap().display_secret()) == RECOVER_SPEND)
} }
} }*/