Small improvements to signer/agent
Signed-off-by: Alexis Sellier <alexis@radicle.xyz>
This commit is contained in:
parent
092ccfdcbc
commit
41f53f3fae
|
|
@ -28,6 +28,11 @@ impl Agent {
|
||||||
pub fn register(&mut self, key: &crypto::SecretKey) -> Result<(), ssh::Error> {
|
pub fn register(&mut self, key: &crypto::SecretKey) -> Result<(), ssh::Error> {
|
||||||
self.client.add_identity(&SecretKey::from(*key), &[])
|
self.client.add_identity(&SecretKey::from(*key), &[])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get a signer from this agent, given the public key.
|
||||||
|
pub fn signer(self, key: PublicKey) -> AgentSigner {
|
||||||
|
AgentSigner::new(self, key)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Deref for Agent {
|
impl Deref for Agent {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use anyhow::anyhow;
|
use anyhow::{anyhow, Context as _};
|
||||||
use radicle::{crypto, crypto::ssh};
|
use radicle::{crypto, crypto::ssh};
|
||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
use std::{env, io};
|
use std::{env, io};
|
||||||
|
|
@ -7,16 +7,20 @@ fn main() -> anyhow::Result<()> {
|
||||||
let profile = radicle::Profile::load()?;
|
let profile = radicle::Profile::load()?;
|
||||||
let mut agent = ssh::agent::Agent::connect()?;
|
let mut agent = ssh::agent::Agent::connect()?;
|
||||||
|
|
||||||
println!("({})", ssh::fmt::key(profile.id()));
|
println!("key: {}", ssh::fmt::key(profile.id()));
|
||||||
|
println!("hash: {}", ssh::fmt::fingerprint(profile.id()));
|
||||||
|
|
||||||
match env::args().nth(1).as_deref() {
|
match env::args().nth(1).as_deref() {
|
||||||
Some("add") => {
|
Some("add") => {
|
||||||
|
print!("passphrase: ");
|
||||||
|
io::stdout().flush()?;
|
||||||
|
|
||||||
let mut passphrase = String::new();
|
let mut passphrase = String::new();
|
||||||
io::stdin().lock().read_line(&mut passphrase)?;
|
io::stdin().lock().read_line(&mut passphrase)?;
|
||||||
|
|
||||||
let secret = profile
|
let secret = profile
|
||||||
.keystore
|
.keystore
|
||||||
.secret_key(&passphrase)?
|
.secret_key(passphrase.trim())?
|
||||||
.ok_or_else(|| anyhow!("Key not found in {:?}", profile.keystore.path()))?;
|
.ok_or_else(|| anyhow!("Key not found in {:?}", profile.keystore.path()))?;
|
||||||
|
|
||||||
agent.register(&secret)?;
|
agent.register(&secret)?;
|
||||||
|
|
@ -34,7 +38,7 @@ fn main() -> anyhow::Result<()> {
|
||||||
let mut stdin = Vec::new();
|
let mut stdin = Vec::new();
|
||||||
io::stdin().read_to_end(&mut stdin)?;
|
io::stdin().read_to_end(&mut stdin)?;
|
||||||
|
|
||||||
let sig = agent.sign(profile.id(), &stdin)?;
|
let sig = agent.sign(profile.id(), &stdin).context("Signing failed")?;
|
||||||
let sig = crypto::Signature::from(sig);
|
let sig = crypto::Signature::from(sig);
|
||||||
|
|
||||||
println!("{}", &sig);
|
println!("{}", &sig);
|
||||||
|
|
@ -42,7 +46,13 @@ fn main() -> anyhow::Result<()> {
|
||||||
Some(other) => {
|
Some(other) => {
|
||||||
anyhow::bail!("Unknown command `{}`", other);
|
anyhow::bail!("Unknown command `{}`", other);
|
||||||
}
|
}
|
||||||
None => {}
|
None => {
|
||||||
|
if agent.signer(profile.public_key).is_ready()? {
|
||||||
|
println!("ready: yes");
|
||||||
|
} else {
|
||||||
|
println!("ready: no");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
||||||
|
|
@ -100,8 +100,7 @@ impl Profile {
|
||||||
pub fn signer(&self) -> Result<AgentSigner, Error> {
|
pub fn signer(&self) -> Result<AgentSigner, Error> {
|
||||||
match Agent::connect() {
|
match Agent::connect() {
|
||||||
Ok(agent) => {
|
Ok(agent) => {
|
||||||
let signer = AgentSigner::new(agent, self.public_key);
|
let signer = agent.signer(self.public_key);
|
||||||
|
|
||||||
if signer.is_ready()? {
|
if signer.is_ready()? {
|
||||||
Ok(signer)
|
Ok(signer)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue