diff options
Diffstat (limited to 'nitrocli/src')
-rw-r--r-- | nitrocli/src/error.rs | 45 | ||||
-rw-r--r-- | nitrocli/src/main.rs | 85 | ||||
-rw-r--r-- | nitrocli/src/nitrokey.rs | 24 |
3 files changed, 153 insertions, 1 deletions
diff --git a/nitrocli/src/error.rs b/nitrocli/src/error.rs new file mode 100644 index 0000000..65992f0 --- /dev/null +++ b/nitrocli/src/error.rs @@ -0,0 +1,45 @@ +// error.rs + +// ************************************************************************* +// * Copyright (C) 2017 Daniel Mueller (deso@posteo.net) * +// * * +// * This program is free software: you can redistribute it and/or modify * +// * it under the terms of the GNU General Public License as published by * +// * the Free Software Foundation, either version 3 of the License, or * +// * (at your option) any later version. * +// * * +// * This program is distributed in the hope that it will be useful, * +// * but WITHOUT ANY WARRANTY; without even the implied warranty of * +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +// * GNU General Public License for more details. * +// * * +// * You should have received a copy of the GNU General Public License * +// * along with this program. If not, see <http://www.gnu.org/licenses/>. * +// ************************************************************************* + +use libhid; +use std::fmt; + + +#[derive(Debug)] +pub enum Error { + HidError(libhid::Error), + Error(String), +} + + +impl From<libhid::Error> for Error { + fn from(e: libhid::Error) -> Error { + return Error::HidError(e); + } +} + + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *&self { + &Error::HidError(ref e) => return write!(f, "hidapi error: {}", e), + &Error::Error(ref e) => return write!(f, "{}", e), + } + } +} diff --git a/nitrocli/src/main.rs b/nitrocli/src/main.rs index 57e6a7a..bdbfe37 100644 --- a/nitrocli/src/main.rs +++ b/nitrocli/src/main.rs @@ -18,7 +18,90 @@ // ************************************************************************* +#![deny(missing_docs)] + +//! Nitrocli is a program providing a command line interface to certain +//! commands of the Nitrokey Storage device. + +extern crate hid as libhid; + + +mod error; +mod nitrokey; + +use error::Error; +use std::process; +use std::result; + +type Result<T> = result::Result<T, Error>; +type NitroFunc = Fn(&mut libhid::Handle) -> Result<()>; + + +/// Find and open the nitrokey device and execute a function on it. +fn nitrokey_do(function: &NitroFunc) -> Result<()> { + let hid = libhid::init()?; + // The Manager::find method is plain stupid as it still returns an + // iterable. Using it does not help in more concise error handling. + for device in hid.devices() { + if device.vendor_id() == nitrokey::VID && device.product_id() == nitrokey::PID { + return function(&mut device.open()?); + } + } + return Err(Error::Error("Nitrokey device not found".to_string())); +} + + +/// Open the encrypted volume on the nitrokey. +fn open() -> Result<()> { + return nitrokey_do(&|handle| { + println!("Found nitrokey. Opening encrypted volume..."); + return Ok(()); + }); +} + + +/// Close the previously opened encrypted volume. +fn close() -> Result<()> { + return nitrokey_do(&|handle| { + println!("Found nitrokey. Closing encrypted volume..."); + return Ok(()); + }); +} + + +// A macro for generating a match of the different supported commands. +// Each supplied command is converted into a string and matched against. +macro_rules! commands { + ( $str:expr, [ $( $command:expr), *] ) => { + match &*$str.to_string() { + $( + stringify!($command) => { + if let Err(err) = $command() { + println!("{}", err); + return 1 + } + return 0 + }, + )* + x => { + println!("Invalid command: {}", x); + println!("Available commands: {}", stringify!( $($command)* )); + return 1 + }, + } + } +} + +fn run() -> i32 { + let argv: Vec<String> = std::env::args().collect(); + if argv.len() != 2 { + println!("Usage: {} <command>", argv[0]); + return 1; + } + + commands!(&argv[1], [open, close]); +} fn main() { - println!("Hello, world!"); + process::exit(run()); } diff --git a/nitrocli/src/nitrokey.rs b/nitrocli/src/nitrokey.rs new file mode 100644 index 0000000..763bc4c --- /dev/null +++ b/nitrocli/src/nitrokey.rs @@ -0,0 +1,24 @@ +// nitrokey.rs + +// ************************************************************************* +// * Copyright (C) 2017 Daniel Mueller (deso@posteo.net) * +// * * +// * This program is free software: you can redistribute it and/or modify * +// * it under the terms of the GNU General Public License as published by * +// * the Free Software Foundation, either version 3 of the License, or * +// * (at your option) any later version. * +// * * +// * This program is distributed in the hope that it will be useful, * +// * but WITHOUT ANY WARRANTY; without even the implied warranty of * +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +// * GNU General Public License for more details. * +// * * +// * You should have received a copy of the GNU General Public License * +// * along with this program. If not, see <http://www.gnu.org/licenses/>. * +// ************************************************************************* + + +// The Nitrokey Storage vendor ID. +pub const VID: u16 = 0x20A0; +// The Nitrokey Storage product ID. +pub const PID: u16 = 0x4109; |