#[tokio::main]
async fn main() {
let socket = tokio::net::TcpStream::connect(("localhost", 2222)).await
.expect("Could not open a TCP socket");
let config = makiko::ClientConfig::default();
let (client, mut client_rx, client_fut) = makiko::Client::open(socket, config)
.expect("Could not open client");
tokio::task::spawn(async move {
client_fut.await.expect("Error in client future");
});
tokio::task::spawn(async move {
loop {
let event = client_rx.recv().await
.expect("Error while receiving client event");
let Some(event) = event else {
break
};
match event {
makiko::ClientEvent::ServerPubkey(pubkey, accept) => {
println!("Server pubkey type {}, fingerprint {}", pubkey.type_str(), pubkey.fingerprint());
accept.accept();
},
_ => {},
}
}
});
let privkey = makiko::keys::decode_pem_privkey_nopass(PRIVKEY_PEM)
.expect("Could not decode a private key from PEM")
.privkey().cloned()
.expect("Private key is encrypted");
let pubkey_algo = &makiko::pubkey::SSH_ED25519;
let auth_res = client.auth_pubkey("edward".into(), privkey, pubkey_algo).await
.expect("Error when trying to authenticate");
match auth_res {
makiko::AuthPubkeyResult::Success => {
println!("We have successfully authenticated using a private key");
},
makiko::AuthPubkeyResult::Failure(failure) => {
panic!("The server rejected authentication: {:?}", failure);
}
}
}
const PRIVKEY_PEM: &[u8] = br#"
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACDyVJsRfh+NmkQKg2Dh6rPVodiQ3nC+dVoGMoMtYcbMJQAAAJBPdwHAT3cB
wAAAAAtzc2gtZWQyNTUxOQAAACDyVJsRfh+NmkQKg2Dh6rPVodiQ3nC+dVoGMoMtYcbMJQ
AAAEA5ct+xfc9qlJ4I2Jee8HIrAhN55yxmtUmvKpjT7q6QXPJUmxF+H42aRAqDYOHqs9Wh
2JDecL51WgYygy1hxswlAAAABmVkd2FyZAECAwQFBgc=
-----END OPENSSH PRIVATE KEY-----
"#;