#[cfg(feature = "ssh-agent")]
use smol::{io, net::unix::UnixStream};
#[cfg(feature = "ssh-agent")]
fn main() -> io::Result<()> {
use radicle_keystore::sign::{ssh, Signer, SshAgent};
use rand::rngs::OsRng;
smol::block_on(async {
let sk = ed25519_zebra::SigningKey::new(OsRng {});
let pk = ed25519_zebra::VerificationKey::from(&sk);
let public = ssh::ed25519::PublicKey(pk.into());
let agent = SshAgent::new(public);
ssh::add_key::<UnixStream>(&agent, sk, &[]).await.unwrap();
println!("connecting to ssh-agent");
let signer = agent
.connect::<UnixStream>()
.await
.expect("could not connect to ssh-agent");
println!("asking agent to sign some data");
let sig = signer
.sign(b"cooper")
.await
.expect("signing via ssh-agent failed");
println!("verifying signature");
pk.verify(&ed25519_zebra::Signature::from(sig.0), b"cooper")
.expect("ssh-agent didn't return a valid signature");
println!("it worksed");
let keys = ssh::list_keys::<UnixStream>(&agent)
.await
.expect("could not list keys");
if keys.contains(&public) {
println!("added key succesfully")
}
ssh::remove_key::<UnixStream>(&agent, &public)
.await
.expect("could not remove key from ssh-agent");
let keys = ssh::list_keys::<UnixStream>(&agent)
.await
.expect("could not list keys");
if !keys.contains(&public) {
println!("removed key successfully")
}
Ok(())
})
}
#[cfg(not(feature = "ssh-agent"))]
fn main() {
eprintln!("this example requires the `ssh-agent` feature")
}