Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 18 additions & 3 deletions bpb/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down Expand Up @@ -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)
}
}

Expand All @@ -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)
}
3 changes: 2 additions & 1 deletion bpb/src/key_data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ impl KeyData {
}
}

pub fn load(config: &Config, secret: [u8; 32]) -> Result<KeyData, Error> {
pub fn load(config: &Config) -> Result<KeyData, Error> {
let secret = config.get_keychain_secret()?;
let keypair = ed25519::SigningKey::from_bytes(&secret);
Ok(KeyData::create(
keypair,
Expand Down
36 changes: 7 additions & 29 deletions bpb/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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(());
}
Expand All @@ -80,25 +80,19 @@ 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(())
}

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(())
}
Expand All @@ -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())?;

Expand All @@ -138,22 +126,12 @@ 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()
}

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)
}
Loading