use russh_cryptovec::CryptoVec;
use russh_keys::encoding::*;
use russh_keys::key::*;
#[doc(hidden)]
pub trait PubKey {
fn push_to(&self, buffer: &mut CryptoVec);
}
impl PubKey for PublicKey {
fn push_to(&self, buffer: &mut CryptoVec) {
match self {
PublicKey::Ed25519(ref public) => {
buffer.push_u32_be((ED25519.0.len() + public.as_bytes().len() + 8) as u32);
buffer.extend_ssh_string(ED25519.0.as_bytes());
buffer.extend_ssh_string(public.as_bytes());
}
#[cfg(feature = "openssl")]
PublicKey::RSA { ref key, .. } => {
#[allow(clippy::unwrap_used)] let rsa = key.0.rsa().unwrap();
let e = rsa.e().to_vec();
let n = rsa.n().to_vec();
buffer.push_u32_be((4 + SSH_RSA.0.len() + mpint_len(&n) + mpint_len(&e)) as u32);
buffer.extend_ssh_string(SSH_RSA.0.as_bytes());
buffer.extend_ssh_mpint(&e);
buffer.extend_ssh_mpint(&n);
}
}
}
}
impl PubKey for KeyPair {
fn push_to(&self, buffer: &mut CryptoVec) {
match self {
KeyPair::Ed25519(ref key) => {
let public = key.public.as_bytes();
buffer.push_u32_be((ED25519.0.len() + public.len() + 8) as u32);
buffer.extend_ssh_string(ED25519.0.as_bytes());
buffer.extend_ssh_string(public);
}
#[cfg(feature = "openssl")]
KeyPair::RSA { ref key, .. } => {
let e = key.e().to_vec();
let n = key.n().to_vec();
buffer.push_u32_be((4 + SSH_RSA.0.len() + mpint_len(&n) + mpint_len(&e)) as u32);
buffer.extend_ssh_string(SSH_RSA.0.as_bytes());
buffer.extend_ssh_mpint(&e);
buffer.extend_ssh_mpint(&n);
}
}
}
}