use crate::error::VfsResult;
use crate::source::DynSource;
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum EncryptionScheme {
Bitlocker,
Luks1,
Luks2,
FileVault,
ApfsEncrypted,
VeraCrypt,
}
#[non_exhaustive]
#[derive(Debug, Clone)]
pub enum Credential {
Password(String),
RecoveryKey(String),
KeyBytes(Vec<u8>),
KeyFile(std::path::PathBuf),
}
pub trait CredentialSource: Send + Sync {
fn credentials_for(&self, scheme: EncryptionScheme, target: &str) -> Vec<Credential>;
}
#[derive(Debug, Default, Clone, Copy)]
pub struct NoCredentials;
impl CredentialSource for NoCredentials {
fn credentials_for(&self, _scheme: EncryptionScheme, _target: &str) -> Vec<Credential> {
Vec::new()
}
}
pub trait EncryptionLayer: Send + Sync {
fn scheme(&self) -> EncryptionScheme;
fn open(&self, creds: &dyn CredentialSource) -> VfsResult<DynSource>;
#[cfg(feature = "findings")]
fn findings(&self) -> VfsResult<Vec<forensicnomicon::report::Finding>> {
Ok(Vec::new())
}
}
#[cfg(test)]
mod tests {
use super::{Credential, CredentialSource, EncryptionScheme, NoCredentials};
#[test]
fn no_credentials_offers_nothing() {
let creds = NoCredentials;
let none: Vec<Credential> = creds.credentials_for(EncryptionScheme::Bitlocker, "vol-guid");
assert!(none.is_empty());
assert!(creds
.credentials_for(EncryptionScheme::VeraCrypt, "")
.is_empty());
}
}