aboutsummaryrefslogtreecommitdiffstats
path: root/src/bin/rbw-agent
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2020-04-18 01:28:48 -0400
committerJesse Luehrs <doy@tozt.net>2020-04-18 01:28:48 -0400
commit777b810db4675305854c373dcd57aedc40061e5d (patch)
treeed35c77e39416073fb5222aebdb5ef484c238dd3 /src/bin/rbw-agent
parent3babc8801c0d09b7868be9be7751f7cfdf32c8bb (diff)
downloadrbw-777b810db4675305854c373dcd57aedc40061e5d.tar.gz
rbw-777b810db4675305854c373dcd57aedc40061e5d.zip
add encryption to the agent protocol
Diffstat (limited to 'src/bin/rbw-agent')
-rw-r--r--src/bin/rbw-agent/actions.rs33
-rw-r--r--src/bin/rbw-agent/agent.rs4
2 files changed, 37 insertions, 0 deletions
diff --git a/src/bin/rbw-agent/actions.rs b/src/bin/rbw-agent/actions.rs
index 2cb012c..7289a25 100644
--- a/src/bin/rbw-agent/actions.rs
+++ b/src/bin/rbw-agent/actions.rs
@@ -192,6 +192,28 @@ pub async fn decrypt(
Ok(())
}
+pub async fn encrypt(
+ sock: &mut crate::sock::Sock,
+ state: std::sync::Arc<tokio::sync::RwLock<crate::agent::State>>,
+ plaintext: &str,
+) -> anyhow::Result<()> {
+ let state = state.read().await;
+ let keys = if let Some(keys) = &state.priv_key {
+ keys
+ } else {
+ return Err(anyhow::anyhow!(
+ "failed to find encryption keys in in-memory state"
+ ));
+ };
+ let cipherstring =
+ rbw::cipherstring::CipherString::encrypt(keys, plaintext.as_bytes())
+ .context("failed to encrypt plaintext secret")?;
+
+ respond_encrypt(sock, cipherstring.to_string()).await?;
+
+ Ok(())
+}
+
async fn respond_ack(sock: &mut crate::sock::Sock) -> anyhow::Result<()> {
sock.send(&rbw::protocol::Response::Ack)
.await
@@ -211,6 +233,17 @@ async fn respond_decrypt(
Ok(())
}
+async fn respond_encrypt(
+ sock: &mut crate::sock::Sock,
+ cipherstring: String,
+) -> anyhow::Result<()> {
+ sock.send(&rbw::protocol::Response::Encrypt { cipherstring })
+ .await
+ .context("failed to send response")?;
+
+ Ok(())
+}
+
async fn config_email() -> anyhow::Result<String> {
let config = rbw::config::Config::load_async()
.await
diff --git a/src/bin/rbw-agent/agent.rs b/src/bin/rbw-agent/agent.rs
index 21600c3..e80e1c6 100644
--- a/src/bin/rbw-agent/agent.rs
+++ b/src/bin/rbw-agent/agent.rs
@@ -142,6 +142,10 @@ async fn handle_request(
.await?;
true
}
+ rbw::protocol::Action::Encrypt { plaintext } => {
+ crate::actions::encrypt(sock, state.clone(), &plaintext).await?;
+ true
+ }
rbw::protocol::Action::Quit => std::process::exit(0),
};