soroban_cli/signer/
secure_store.rs1use sep5::SeedPhrase;
2
3use crate::{
4 config::{
5 address::KeyName,
6 locator,
7 secret::{self, Secret},
8 },
9 print::Print,
10 signer::keyring::{self, StellarEntry},
11};
12
13#[derive(thiserror::Error, Debug)]
14pub enum Error {
15 #[error(transparent)]
16 Config(#[from] locator::Error),
17
18 #[error(transparent)]
19 Secret(#[from] secret::Error),
20
21 #[error(transparent)]
22 Keyring(#[from] keyring::Error),
23
24 #[error("Storing an existing private key in Secure Store is not supported")]
25 DoesNotSupportPrivateKey,
26
27 #[error(transparent)]
28 SeedPhrase(#[from] sep5::Error),
29}
30
31pub fn save_secret(
32 print: &Print,
33 entry_name: &KeyName,
34 seed_phrase: SeedPhrase,
35) -> Result<Secret, Error> {
36 let entry_name_with_prefix = format!(
38 "{}{}-{}",
39 keyring::SECURE_STORE_ENTRY_PREFIX,
40 keyring::SECURE_STORE_ENTRY_SERVICE,
41 entry_name
42 );
43
44 let secret: Secret = entry_name_with_prefix.parse()?;
46
47 if let Secret::SecureStore { entry_name } = &secret {
48 write_to_secure_store(entry_name, seed_phrase, print)?;
49 }
50
51 Ok(secret)
52}
53
54fn write_to_secure_store(
55 entry_name: &str,
56 seed_phrase: SeedPhrase,
57 print: &Print,
58) -> Result<(), Error> {
59 print.infoln(format!("Writing to secure store: {entry_name}"));
60 let entry = StellarEntry::new(entry_name)?;
61 if let Ok(key) = entry.get_public_key(None) {
62 print.warnln(format!(
63 "A key for {entry_name} already exists in your operating system's secure store: {key}"
64 ));
65 } else {
66 print.infoln(format!(
67 "Saving a new key to your operating system's secure store: {entry_name}"
68 ));
69 entry.set_seed_phrase(seed_phrase)?;
70 };
71 Ok(())
72}