pub mod client;
pub mod keytab;
pub mod name;
pub mod provider;
pub mod security_layer;
pub mod server;
use std::path::PathBuf;
#[derive(Debug, Clone)]
pub struct GssapiConfig {
pub keytab_path: PathBuf,
pub service_name: String,
pub principal_to_local_rules: Vec<name::Rule>,
pub realm: Option<String>,
pub kdc: Option<String>,
}
#[derive(Debug, thiserror::Error)]
pub enum GssError {
#[error("GSS context establishment failed: {0}")]
Context(String),
#[error("GSS wrap/unwrap failed: {0}")]
Wrap(String),
#[error("keytab error: {0}")]
Keytab(String),
#[error("no source principal available")]
NoSrcPrincipal,
}
#[derive(Debug)]
pub enum AcceptStep {
Continue(Vec<u8>),
Established(Option<Vec<u8>>),
}
#[derive(Debug)]
pub enum InitStep {
Continue(Vec<u8>),
Established(Option<Vec<u8>>),
}
pub trait GssAcceptor: Send + Sync {
fn accept(&mut self, client_token: &[u8]) -> Result<AcceptStep, GssError>;
fn wrap(&self, plaintext: &[u8], confidential: bool) -> Result<Vec<u8>, GssError>;
fn unwrap(&self, token: &[u8]) -> Result<Vec<u8>, GssError>;
fn src_principal(&self) -> Result<String, GssError>;
}
pub trait GssInitiator: Send {
fn step(&mut self, server_token: Option<&[u8]>) -> Result<InitStep, GssError>;
fn wrap(&self, plaintext: &[u8], confidential: bool) -> Result<Vec<u8>, GssError>;
fn unwrap(&self, token: &[u8]) -> Result<Vec<u8>, GssError>;
}