Skip to content
Snippets Groups Projects

add vault

Merged Hugo Trentesaux requested to merge hugo-keystore into master
1 file
+ 23
18
Compare changes
  • Side-by-side
  • Inline
+ 23
18
@@ -10,7 +10,7 @@ pub enum Subcommand {
@@ -10,7 +10,7 @@ pub enum Subcommand {
List,
List,
/// Show where vault stores secret
/// Show where vault stores secret
Where,
Where,
/// Generate new key (unimplemented)
/// Generate a mnemonic
Generate,
Generate,
/// Import mnemonic with interactive prompt
/// Import mnemonic with interactive prompt
Import,
Import,
@@ -58,33 +58,38 @@ pub fn handle_command(data: Data, command: Subcommand) -> Result<(), GcliError>
@@ -58,33 +58,38 @@ pub fn handle_command(data: Data, command: Subcommand) -> Result<(), GcliError>
println!("{}", data.project_dir.data_dir().to_str().unwrap());
println!("{}", data.project_dir.data_dir().to_str().unwrap());
}
}
Subcommand::Generate => {
Subcommand::Generate => {
let mnemonic = bip39::Mnemonic::generate(12).unwrap(); // TODO allow word count
// TODO allow custom word count
 
let mnemonic = bip39::Mnemonic::generate(12).unwrap();
println!("{mnemonic}");
println!("{mnemonic}");
}
}
Subcommand::Import => {
Subcommand::Import => {
// --- currently only support mnemonic secret
let mnemonic = rpassword::prompt_password("Mnemonic: ")?;
// get secret
println!("Enter password to protect the key");
let secret = rpassword::prompt_password("Mnemonic: ")?;
// check validity by deriving keypair
let keypair = pair_from_str(&secret)?;
// ask password to protect key
let password = rpassword::prompt_password("Password: ")?;
let password = rpassword::prompt_password("Password: ")?;
// write encrypted secret in file identitfied by pubkey
let address = store_mnemonic(&data, &mnemonic, password)?;
let path = data
println!("Stored secret for {address}");
.project_dir
.data_dir()
.join(keypair.public().to_string());
let mut file = std::fs::OpenOptions::new()
.create(true)
.write(true)
.open(path)?;
file.write_all(&encrypt(secret.as_bytes(), password).map_err(|e| anyhow!(e))?[..])?;
}
}
};
};
Ok(())
Ok(())
}
}
 
/// store mnemonic protected with password
 
pub fn store_mnemonic(
 
data: &Data,
 
mnemonic: &str,
 
password: String,
 
) -> Result<AccountId, GcliError> {
 
// check validity by deriving keypair
 
let keypair = pair_from_str(&mnemonic)?;
 
let address = keypair.public();
 
// write encrypted mnemonic in file identified by pubkey
 
let path = data.project_dir.data_dir().join(address.to_string());
 
let mut file = std::fs::File::create(path)?;
 
file.write_all(&encrypt(mnemonic.as_bytes(), password).map_err(|e| anyhow!(e))?[..])?;
 
Ok(keypair.public().into())
 
}
 
/// try get secret in keystore
/// try get secret in keystore
pub fn try_fetch_secret(data: &Data, address: AccountId) -> Result<Option<String>, GcliError> {
pub fn try_fetch_secret(data: &Data, address: AccountId) -> Result<Option<String>, GcliError> {
let path = data.project_dir.data_dir().join(address.to_string());
let path = data.project_dir.data_dir().join(address.to_string());
Loading