mirror of
https://github.com/Qortal/piratewallet-light-cli.git
synced 2025-02-01 03:12:15 +00:00
Support for wallet encryption
This commit is contained in:
parent
ebf3c71339
commit
e3a0fd2dea
@ -90,13 +90,15 @@ impl ToBase58Check for [u8] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct LightWallet {
|
pub struct LightWallet {
|
||||||
seed: [u8; 32], // Seed phrase for this wallet.
|
locked: bool, // Is the wallet's spending keys locked?
|
||||||
|
|
||||||
// List of keys, actually in this wallet. This may include more
|
seed: [u8; 32], // Seed phrase for this wallet. If wallet is locked, this is encrypted
|
||||||
// than keys derived from the seed, for example, if user imports
|
|
||||||
// a private key
|
// List of keys, actually in this wallet. If the wallet is locked, the `extsks` will be
|
||||||
|
// encrypted (but the fvks are not encrpyted)
|
||||||
extsks: Arc<RwLock<Vec<ExtendedSpendingKey>>>,
|
extsks: Arc<RwLock<Vec<ExtendedSpendingKey>>>,
|
||||||
extfvks: Arc<RwLock<Vec<ExtendedFullViewingKey>>>,
|
extfvks: Arc<RwLock<Vec<ExtendedFullViewingKey>>>,
|
||||||
|
|
||||||
pub address: Arc<RwLock<Vec<PaymentAddress<Bls12>>>>,
|
pub address: Arc<RwLock<Vec<PaymentAddress<Bls12>>>>,
|
||||||
|
|
||||||
// Transparent keys. TODO: Make it not pubic
|
// Transparent keys. TODO: Make it not pubic
|
||||||
@ -115,7 +117,7 @@ pub struct LightWallet {
|
|||||||
|
|
||||||
impl LightWallet {
|
impl LightWallet {
|
||||||
pub fn serialized_version() -> u64 {
|
pub fn serialized_version() -> u64 {
|
||||||
return 3;
|
return 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_taddr_from_bip39seed(config: &LightClientConfig, bip39_seed: &[u8], pos: u32) -> SecretKey {
|
fn get_taddr_from_bip39seed(config: &LightClientConfig, bip39_seed: &[u8], pos: u32) -> SecretKey {
|
||||||
@ -172,6 +174,7 @@ impl LightWallet {
|
|||||||
= LightWallet::get_zaddr_from_bip39seed(&config, &bip39_seed.as_bytes(), 0);
|
= LightWallet::get_zaddr_from_bip39seed(&config, &bip39_seed.as_bytes(), 0);
|
||||||
|
|
||||||
Ok(LightWallet {
|
Ok(LightWallet {
|
||||||
|
locked: false,
|
||||||
seed: seed_bytes,
|
seed: seed_bytes,
|
||||||
extsks: Arc::new(RwLock::new(vec![extsk])),
|
extsks: Arc::new(RwLock::new(vec![extsk])),
|
||||||
extfvks: Arc::new(RwLock::new(vec![extfvk])),
|
extfvks: Arc::new(RwLock::new(vec![extfvk])),
|
||||||
@ -189,6 +192,12 @@ impl LightWallet {
|
|||||||
assert!(version <= LightWallet::serialized_version());
|
assert!(version <= LightWallet::serialized_version());
|
||||||
info!("Reading wallet version {}", version);
|
info!("Reading wallet version {}", version);
|
||||||
|
|
||||||
|
let locked = if version >= 4 {
|
||||||
|
reader.read_u8()? > 0
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
};
|
||||||
|
|
||||||
// Seed
|
// Seed
|
||||||
let mut seed_bytes = [0u8; 32];
|
let mut seed_bytes = [0u8; 32];
|
||||||
reader.read_exact(&mut seed_bytes)?;
|
reader.read_exact(&mut seed_bytes)?;
|
||||||
@ -196,9 +205,14 @@ impl LightWallet {
|
|||||||
// Read the spending keys
|
// Read the spending keys
|
||||||
let extsks = Vector::read(&mut reader, |r| ExtendedSpendingKey::read(r))?;
|
let extsks = Vector::read(&mut reader, |r| ExtendedSpendingKey::read(r))?;
|
||||||
|
|
||||||
// Calculate the viewing keys
|
let extfvks = if version >= 4 {
|
||||||
let extfvks = extsks.iter().map(|sk| ExtendedFullViewingKey::from(sk))
|
// Read the viewing keys
|
||||||
.collect::<Vec<ExtendedFullViewingKey>>();
|
Vector::read(&mut reader, |r| ExtendedFullViewingKey::read(r))?
|
||||||
|
} else {
|
||||||
|
// Calculate the viewing keys
|
||||||
|
extsks.iter().map(|sk| ExtendedFullViewingKey::from(sk))
|
||||||
|
.collect::<Vec<ExtendedFullViewingKey>>()
|
||||||
|
};
|
||||||
|
|
||||||
// Calculate the addresses
|
// Calculate the addresses
|
||||||
let addresses = extfvks.iter().map( |fvk| fvk.default_address().unwrap().1 )
|
let addresses = extfvks.iter().map( |fvk| fvk.default_address().unwrap().1 )
|
||||||
@ -230,6 +244,7 @@ impl LightWallet {
|
|||||||
let birthday = reader.read_u64::<LittleEndian>()?;
|
let birthday = reader.read_u64::<LittleEndian>()?;
|
||||||
|
|
||||||
Ok(LightWallet{
|
Ok(LightWallet{
|
||||||
|
locked: locked,
|
||||||
seed: seed_bytes,
|
seed: seed_bytes,
|
||||||
extsks: Arc::new(RwLock::new(extsks)),
|
extsks: Arc::new(RwLock::new(extsks)),
|
||||||
extfvks: Arc::new(RwLock::new(extfvks)),
|
extfvks: Arc::new(RwLock::new(extfvks)),
|
||||||
@ -246,6 +261,9 @@ impl LightWallet {
|
|||||||
// Write the version
|
// Write the version
|
||||||
writer.write_u64::<LittleEndian>(LightWallet::serialized_version())?;
|
writer.write_u64::<LittleEndian>(LightWallet::serialized_version())?;
|
||||||
|
|
||||||
|
// Write if it is locked
|
||||||
|
writer.write_u8(if self.locked {1} else {0})?;
|
||||||
|
|
||||||
// Write the seed
|
// Write the seed
|
||||||
writer.write_all(&self.seed)?;
|
writer.write_all(&self.seed)?;
|
||||||
|
|
||||||
@ -257,6 +275,11 @@ impl LightWallet {
|
|||||||
|w, sk| sk.write(w)
|
|w, sk| sk.write(w)
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
// Write the FVKs
|
||||||
|
Vector::write(&mut writer, &self.extfvks.read().unwrap(),
|
||||||
|
|w, fvk| fvk.write(w)
|
||||||
|
)?;
|
||||||
|
|
||||||
// Write the transparent private key
|
// Write the transparent private key
|
||||||
Vector::write(&mut writer, &self.tkeys.read().unwrap(),
|
Vector::write(&mut writer, &self.tkeys.read().unwrap(),
|
||||||
|w, pk| w.write_all(&pk[..])
|
|w, pk| w.write_all(&pk[..])
|
||||||
|
Loading…
Reference in New Issue
Block a user