cryptsetup-rs 0.3.2

Rust wrapper around the libcryptsetup library, allowing manipulation of LUKS devices in Linux
Documentation
#![deny(warnings)]
#[warn(unused_must_use)]
extern crate cryptsetup_rs;
extern crate env_logger;

use cryptsetup_rs::*;
use std::env;

fn dump_slot(crypt_device: &dyn Luks1CryptDevice, slot: Keyslot) -> Result<()> {
    let status = match crypt_device.keyslot_status(slot) {
        crypt_keyslot_info::CRYPT_SLOT_INVALID => "INVALID",
        crypt_keyslot_info::CRYPT_SLOT_INACTIVE => "DISABLED",
        crypt_keyslot_info::CRYPT_SLOT_ACTIVE | crypt_keyslot_info::CRYPT_SLOT_ACTIVE_LAST => "ENABLED",
        crypt_keyslot_info::CRYPT_SLOT_UNBOUND => "UNBOUND",
    };

    println!("Key Slot {}: {}", slot, status);
    match status {
        "ENABLED" => (), // TODO  add keyslot information
        _ => (),
    }
    Ok(())
}

fn dump(device_path: &str) -> Result<()> {
    let dev = open(device_path)?.luks1()?;

    println!("LUKS header information for {}", dev.device_name());
    println!();
    println!("{:<16}{}", "Version:", "1");
    println!("{:<16}{}", "Cipher name:", dev.cipher());
    println!("{:<16}{}", "Cipher mode:", dev.cipher_mode());
    println!("{:<16}{}", "Hash spec:", dev.hash_spec());
    println!("{:<16}{}", "Payload offset:", dev.payload_offset());
    println!("{:<16}{}", "MK bits:", dev.mk_bits());

    print!("{:<16}", "MK digest:");
    for b in dev.mk_digest().iter() {
        print!("{:x} ", b);
    }
    println!();

    let salt = dev.mk_salt();
    print!("{:<16}", "MK salt:");
    for b in salt[0..16].iter() {
        print!("{:x} ", b);
    }
    println!();
    print!("{:<16}", "");
    for b in salt[16..32].iter() {
        print!("{:x} ", b);
    }
    println!();

    println!("{:<16}{}", "MK iterations:", dev.mk_iterations());
    println!("{:<16}{}", "UUID:", dev.uuid());

    println!();

    for slot in 0..8 {
        dump_slot(&dev, slot)?;
    }

    Ok(())
}

fn main() {
    let args: Vec<String> = env::args().skip(1).collect();
    if args.len() != 1 {
        println!("Usage: luks_dump <device path>");
        ::std::process::exit(1);
    }
    let device_path = args[0].as_str();

    if let Err(e) = dump(device_path) {
        println!("Error: {:?}", e);
        ::std::process::exit(2);
    }
}