#[cfg(feature = "alloc")]
use alloc::boxed::Box;
#[cfg(feature = "alloc")]
use alloc::vec::Vec;
pub mod ecdsa;
pub mod ed25519;
pub mod rsa;
#[cfg(feature = "alloc")]
pub use ecdsa::{EcdsaP256HostKey, EcdsaP384HostKey, EcdsaP521HostKey};
#[cfg(feature = "alloc")]
pub use ed25519::Ed25519HostKey;
#[cfg(feature = "alloc")]
pub use rsa::{RsaSha1HostKey, RsaSha2_256HostKey, RsaSha2_512HostKey};
pub trait HostKeyAlgorithm {
const NAME: &'static str;
}
#[cfg(feature = "alloc")]
pub trait HostKey {
fn algorithm(&self) -> &'static str;
fn public_blob(&self) -> Vec<u8>;
fn sign(&self, msg: &[u8]) -> crate::Result<Vec<u8>>;
}
#[cfg(feature = "alloc")]
pub trait HostKeyVerify {
fn algorithm(&self) -> &'static str;
fn verify(&self, msg: &[u8], sig_blob: &[u8]) -> crate::Result<()>;
fn from_public_blob(blob: &[u8]) -> crate::Result<Self>
where
Self: Sized;
}
#[cfg(feature = "alloc")]
pub fn host_key_verify_by_name(name: &str, blob: &[u8]) -> crate::Result<Box<dyn HostKeyVerify>> {
match name {
"ssh-ed25519" => Ok(Box::new(Ed25519HostKey::from_public_blob(blob)?)),
"ecdsa-sha2-nistp256" => Ok(Box::new(EcdsaP256HostKey::from_public_blob(blob)?)),
"ecdsa-sha2-nistp384" => Ok(Box::new(EcdsaP384HostKey::from_public_blob(blob)?)),
"ecdsa-sha2-nistp521" => Ok(Box::new(EcdsaP521HostKey::from_public_blob(blob)?)),
"ssh-rsa" => Ok(Box::new(RsaSha1HostKey::from_public_blob(blob)?)),
"rsa-sha2-256" => Ok(Box::new(RsaSha2_256HostKey::from_public_blob(blob)?)),
"rsa-sha2-512" => Ok(Box::new(RsaSha2_512HostKey::from_public_blob(blob)?)),
_ => Err(crate::Error::Unsupported("host-key algorithm")),
}
}