#![recursion_limit = "4096"]
#![cfg_attr(not(kani), allow(unexpected_cfgs))]
pub mod crypto;
pub mod transport;
#[cfg(feature = "qkd")]
pub mod qkd;
pub mod handshake;
pub mod client;
pub mod server;
pub mod config;
pub mod agent;
pub mod x11;
pub mod pty;
pub mod auth;
pub mod audit;
pub mod vault;
pub mod p2p;
pub mod pty_thread;
pub mod shell_handler_thread;
pub mod port_forward;
pub use port_forward::{PortForwardManager, ForwardType};
pub mod subsystems;
pub mod sftp_client;
pub mod multiplex;
pub mod proxy;
pub mod known_hosts;
pub mod compression;
pub mod session;
pub mod certificate;
#[cfg(feature = "gssapi")]
pub mod gssapi;
pub mod security_tiers;
use serde::{Deserialize, Serialize};
use thiserror::Error;
use crate::security_tiers::SecurityTier;
#[derive(Error, Debug)]
pub enum QsshError {
#[error("Connection error: {0}")]
Connection(String),
#[error("Cryptographic error: {0}")]
Crypto(String),
#[error("QKD error: {0}")]
Qkd(String),
#[error("Protocol error: {0}")]
Protocol(String),
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("Configuration error: {0}")]
Config(String),
}
pub type Result<T> = std::result::Result<T, QsshError>;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QsshConfig {
pub server: String,
pub username: String,
#[serde(skip_serializing)]
pub password: Option<String>,
pub port_forwards: Vec<PortForward>,
pub use_qkd: bool,
pub qkd_endpoint: Option<String>,
pub qkd_cert_path: Option<String>,
pub qkd_key_path: Option<String>,
pub qkd_ca_path: Option<String>,
pub pq_algorithm: PqAlgorithm,
#[serde(default)]
pub kex_algorithm: KexAlgorithm,
pub key_rotation_interval: u64,
pub security_tier: SecurityTier,
pub quantum_native: bool,
}
impl Default for QsshConfig {
fn default() -> Self {
Self {
server: "localhost:22222".to_string(),
username: "user".to_string(),
password: None,
port_forwards: Vec::new(),
use_qkd: false,
qkd_endpoint: None,
qkd_cert_path: None,
qkd_key_path: None,
qkd_ca_path: None,
pq_algorithm: PqAlgorithm::Falcon512,
kex_algorithm: KexAlgorithm::MlKem1024,
key_rotation_interval: 3600,
security_tier: SecurityTier::default(), quantum_native: true, }
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PortForward {
pub local_port: u16,
pub remote_host: String,
pub remote_port: u16,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub enum PqAlgorithm {
SphincsPlus,
Falcon512,
Falcon1024,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash, Default)]
pub enum KexAlgorithm {
FalconSignedShares,
MlKem768,
#[default]
MlKem1024,
#[cfg(feature = "hybrid-kex")]
HybridX25519MlKem768,
}
impl std::fmt::Display for KexAlgorithm {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
KexAlgorithm::FalconSignedShares => write!(f, "falcon-signed-shares"),
KexAlgorithm::MlKem768 => write!(f, "mlkem768 (FIPS 203, Level 3)"),
KexAlgorithm::MlKem1024 => write!(f, "mlkem1024 (FIPS 203, Level 5)"),
#[cfg(feature = "hybrid-kex")]
KexAlgorithm::HybridX25519MlKem768 => write!(f, "hybrid-x25519-mlkem768"),
}
}
}
impl std::fmt::Display for PqAlgorithm {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PqAlgorithm::SphincsPlus => write!(f, "SPHINCS+ (hash-based, quantum-safe)"),
PqAlgorithm::Falcon512 => write!(f, "Falcon-512 (NTRU lattice, NIST Level 1)"),
PqAlgorithm::Falcon1024 => write!(f, "Falcon-1024 (NTRU lattice, NIST Level 5)"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuantumCapabilities {
pub supports_qkd: bool,
pub supports_sphincs: bool,
pub supports_falcon: bool,
pub qkd_endpoints: Vec<String>,
}
pub use client::QsshClient;
pub use client::ReconnectConfig;
pub use server::QsshServer;
#[cfg(test)]
mod default_kex_tests {
use super::{KexAlgorithm, QsshConfig};
#[test]
fn enum_default_kex_is_confidential_mlkem1024() {
assert_eq!(KexAlgorithm::default(), KexAlgorithm::MlKem1024);
assert_ne!(KexAlgorithm::default(), KexAlgorithm::FalconSignedShares);
}
#[test]
fn qsshconfig_default_kex_is_confidential_mlkem1024() {
assert_eq!(QsshConfig::default().kex_algorithm, KexAlgorithm::MlKem1024);
assert_ne!(
QsshConfig::default().kex_algorithm,
KexAlgorithm::FalconSignedShares
);
}
}