summaryrefslogtreecommitdiffstats
path: root/atuin-client/src/encryption.rs
diff options
context:
space:
mode:
Diffstat (limited to 'atuin-client/src/encryption.rs')
-rw-r--r--atuin-client/src/encryption.rs39
1 files changed, 35 insertions, 4 deletions
diff --git a/atuin-client/src/encryption.rs b/atuin-client/src/encryption.rs
index 37153f94..19b773ab 100644
--- a/atuin-client/src/encryption.rs
+++ b/atuin-client/src/encryption.rs
@@ -29,20 +29,51 @@ pub fn load_key(settings: &Settings) -> Result<secretbox::Key> {
let path = settings.key_path.as_str();
if PathBuf::from(path).exists() {
- let bytes = std::fs::read(path)?;
- let key: secretbox::Key = rmp_serde::from_read_ref(&bytes)?;
+ let key = std::fs::read_to_string(path)?;
+ let key = decode_key(key)?;
Ok(key)
} else {
let key = secretbox::gen_key();
- let buf = rmp_serde::to_vec(&key)?;
+ let encoded = encode_key(key.clone())?;
let mut file = File::create(path)?;
- file.write_all(&buf)?;
+ file.write_all(encoded.as_bytes())?;
Ok(key)
}
}
+pub fn load_encoded_key(settings: &Settings) -> Result<String> {
+ let path = settings.key_path.as_str();
+
+ if PathBuf::from(path).exists() {
+ let key = std::fs::read_to_string(path)?;
+ Ok(key)
+ } else {
+ let key = secretbox::gen_key();
+ let encoded = encode_key(key)?;
+
+ let mut file = File::create(path)?;
+ file.write_all(encoded.as_bytes())?;
+
+ Ok(encoded)
+ }
+}
+
+pub fn encode_key(key: secretbox::Key) -> Result<String> {
+ let buf = rmp_serde::to_vec(&key)?;
+ let buf = base64::encode(buf);
+
+ Ok(buf)
+}
+
+pub fn decode_key(key: String) -> Result<secretbox::Key> {
+ let buf = base64::decode(key)?;
+ let buf: secretbox::Key = rmp_serde::from_read_ref(&buf)?;
+
+ Ok(buf)
+}
+
pub fn encrypt(history: &History, key: &secretbox::Key) -> Result<EncryptedHistory> {
// serialize with msgpack
let buf = rmp_serde::to_vec(history)?;