From 7107e1bf602bb04c1b1174f3e4e7d807f32bfd55 Mon Sep 17 00:00:00 2001 From: Jacob Heider Date: Wed, 27 Nov 2024 17:28:45 -0500 Subject: [PATCH] reduce repetition by adding keychain functions to config struct --- bpb/src/config.rs | 21 ++++++++++++++++++--- bpb/src/key_data.rs | 3 ++- bpb/src/main.rs | 36 +++++++----------------------------- 3 files changed, 27 insertions(+), 33 deletions(-) diff --git a/bpb/src/config.rs b/bpb/src/config.rs index cadb790..c364f8b 100644 --- a/bpb/src/config.rs +++ b/bpb/src/config.rs @@ -3,8 +3,10 @@ use std::io::{Read, Write}; use failure::Error; use lazy_static::lazy_static; +use crate::keychain::{add_keychain_item, get_keychain_item}; + lazy_static! { - static ref SERVICE_NAME: String = option_env!("BPB_SERVICE_NAME") + pub static ref SERVICE_NAME: String = option_env!("BPB_SERVICE_NAME") .unwrap_or("xyz.tea.BASE.bpb") .to_string(); } @@ -49,8 +51,13 @@ impl Config { &self.public.userid } - pub fn service(&self) -> &str { - &SERVICE_NAME + pub fn get_keychain_secret(&self) -> Result<[u8; 32], Error> { + let secret_str = get_keychain_item(&SERVICE_NAME, self.user_id())?; + to_32_bytes(&secret_str) + } + + pub fn add_keychain_secret(&self, secret: &str) -> Result<(), Error> { + add_keychain_item(&SERVICE_NAME, self.user_id(), secret) } } @@ -68,3 +75,11 @@ fn keys_file() -> std::path::PathBuf { std::path::PathBuf::from(std::env::var("HOME").unwrap()).join(".config/pkgx/bpb.toml") } } + +fn to_32_bytes(slice: &String) -> Result<[u8; 32], Error> { + let vector = hex::decode(slice)?; + let mut array = [0u8; 32]; + let len = std::cmp::min(vector.len(), 32); + array[..len].copy_from_slice(&vector[..len]); + Ok(array) +} diff --git a/bpb/src/key_data.rs b/bpb/src/key_data.rs index f38ff5b..a2062c9 100644 --- a/bpb/src/key_data.rs +++ b/bpb/src/key_data.rs @@ -20,7 +20,8 @@ impl KeyData { } } - pub fn load(config: &Config, secret: [u8; 32]) -> Result { + pub fn load(config: &Config) -> Result { + let secret = config.get_keychain_secret()?; let keypair = ed25519::SigningKey::from_bytes(&secret); Ok(KeyData::create( keypair, diff --git a/bpb/src/main.rs b/bpb/src/main.rs index 7da80d5..722cd41 100644 --- a/bpb/src/main.rs +++ b/bpb/src/main.rs @@ -11,9 +11,9 @@ mod tests; use std::time::SystemTime; +use config::SERVICE_NAME; use ed25519_dalek as ed25519; use failure::Error; -use keychain::{add_keychain_item, get_keychain_item}; use rand::RngCore; use crate::config::Config; @@ -63,7 +63,7 @@ fn generate_keypair(userid: String) -> Result<(), Error> { eprintln!( "A keypair already exists. If you (really) want to reinitialize your state\n\ run `security delete-generic-password -s {}` first.", - _config.service() + SERVICE_NAME.as_str() ); return Ok(()); } @@ -80,12 +80,10 @@ fn generate_keypair(userid: String) -> Result<(), Error> { let config = Config::create(public_key, userid, timestamp)?; config.write()?; - let service = config.service(); - let account = config.user_id(); let hex = hex::encode(keypair.to_bytes()); - add_keychain_item(service, account, &hex)?; + config.add_keychain_secret(&hex)?; - let keydata = KeyData::load(&config, keypair.to_bytes())?; + let keydata = KeyData::load(&config)?; println!("{}", keydata.public()); Ok(()) @@ -93,12 +91,8 @@ fn generate_keypair(userid: String) -> Result<(), Error> { fn print_public_key() -> Result<(), Error> { let config = Config::load()?; - let service = config.service(); - let account = config.user_id(); - let secret_str = get_keychain_item(service, account)?; - let secret = to_32_bytes(&secret_str)?; - let keypair = KeyData::load(&config, secret)?; + let keypair = KeyData::load(&config)?; println!("{}", keypair.public()); Ok(()) } @@ -111,13 +105,7 @@ fn verify_commit() -> Result<(), Error> { stdin.read_to_string(&mut commit)?; let config = Config::load()?; - let service = config.service(); - let account = config.user_id(); - let secret_str = get_keychain_item(service, account)?; - let secret = to_32_bytes(&secret_str)?; - - let config = Config::load()?; - let keypair = KeyData::load(&config, secret)?; + let keypair = KeyData::load(&config)?; let sig = keypair.sign(commit.as_bytes())?; @@ -138,10 +126,8 @@ fn delegate() -> ! { fn upgrade() -> Result<(), Error> { let mut file = std::fs::File::open(legacy_keys_file())?; let (config, secret) = LegacyConfig::convert(&mut file)?; - let service = config.service(); - let account = config.user_id(); let hex = hex::encode(secret); - add_keychain_item(service, account, &hex)?; + config.add_keychain_secret(&hex)?; config.write() } @@ -149,11 +135,3 @@ fn legacy_keys_file() -> String { std::env::var("BPB_KEYS") .unwrap_or_else(|_| format!("{}/.bpb_keys.toml", std::env::var("HOME").unwrap())) } - -fn to_32_bytes(slice: &String) -> Result<[u8; 32], Error> { - let vector = hex::decode(slice)?; - let mut array = [0u8; 32]; - let len = std::cmp::min(vector.len(), 32); - array[..len].copy_from_slice(&vector[..len]); - Ok(array) -}