lethe 0.8.0

A secure, free, cross-platform and open-source drive wiping utility
pub mod stage;
pub use stage::*;

pub mod mem;

use std::collections::BTreeMap;

#[derive(Debug, Clone)]
pub struct Scheme {
    pub description: String,
    pub stages: Vec<Stage>,
}

pub struct SchemeRepo {
    schemes: BTreeMap<&'static str, Scheme>,
}

impl SchemeRepo {
    pub fn new(schemes: BTreeMap<&'static str, Scheme>) -> SchemeRepo {
        SchemeRepo { schemes }
    }

    pub fn default() -> SchemeRepo {
        let mut schemes = BTreeMap::new();

        schemes.insert(
            "zero",
            Scheme {
                description: "Single zeroes fill".to_string(),
                stages: vec![Stage::zero()],
            },
        );

        schemes.insert(
            "random",
            Scheme {
                description: "Single random fill".to_string(),
                stages: vec![Stage::random()],
            },
        );

        schemes.insert(
            "random2x",
            Scheme {
                description: "Double random fill".to_string(),
                stages: vec![Stage::random(), Stage::random()],
            },
        );

        schemes.insert(
            "badblocks",
            Scheme {
                description: "Inspired by a badblocks tool -w action.".to_string(),
                stages: vec![
                    Stage::constant(0xaa),
                    Stage::constant(0x55),
                    Stage::constant(0xff),
                    Stage::constant(0x00),
                ],
            },
        );

        schemes.insert(
            "gost",
            Scheme {
                description: "GOST R 50739-95 (fake)".to_string(),
                stages: vec![Stage::zero(), Stage::random()],
            },
        );

        schemes.insert(
            "dod",
            Scheme {
                description: "DoD 5220.22-M / CSEC ITSG-06 / NAVSO P-5239-26".to_string(),
                stages: vec![Stage::zero(), Stage::one(), Stage::random()],
            },
        );

        schemes.insert(
            "vsitr",
            Scheme {
                description: "VSITR / RCMP TSSIT OPS-II".to_string(),
                stages: vec![
                    Stage::zero(),
                    Stage::one(),
                    Stage::zero(),
                    Stage::one(),
                    Stage::zero(),
                    Stage::one(),
                    Stage::random(),
                ],
            },
        );

        Self::new(schemes)
    }

    pub fn all(&self) -> &BTreeMap<&'static str, Scheme> {
        &self.schemes
    }

    pub fn find(&self, name: &str) -> Option<&Scheme> {
        self.schemes.get(name)
    }
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn test_scheme_find() {
        let repo = SchemeRepo::default();

        assert!(repo.find("missing").is_none());

        let scheme = repo.find("random");
        assert!(scheme.is_some());
    }
}