diff options
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/list-devices.rs | 26 | ||||
| -rw-r--r-- | examples/otp.rs | 43 | 
2 files changed, 69 insertions, 0 deletions
| diff --git a/examples/list-devices.rs b/examples/list-devices.rs new file mode 100644 index 0000000..9c14533 --- /dev/null +++ b/examples/list-devices.rs @@ -0,0 +1,26 @@ +// Copyright (C) 2020 Robin Krahl <robin.krahl@ireas.org> +// SPDX-License-Identifier: CC-0 + +//! Enumerates all connected Nitrokey devices and prints some information about them. + +use nitrokey::Device as _; + +fn main() -> Result<(), nitrokey::Error> { +    let mut manager = nitrokey::take()?; +    let device_infos = nitrokey::list_devices()?; +    if device_infos.is_empty() { +        println!("No Nitrokey device found"); +    } else { +        println!("path\t\tmodel\tfirmware version\tserial number"); +        for device_info in device_infos { +            let device = manager.connect_path(device_info.path.clone())?; +            let model = device.get_model(); +            let status = device.get_status()?; +            println!( +                "{}\t{}\t{}\t\t\t{:08x}", +                device_info.path, model, status.firmware_version, status.serial_number +            ); +        } +    } +    Ok(()) +} diff --git a/examples/otp.rs b/examples/otp.rs new file mode 100644 index 0000000..819de28 --- /dev/null +++ b/examples/otp.rs @@ -0,0 +1,43 @@ +// Copyright (C) 2020 Robin Krahl <robin.krahl@ireas.org> +// SPDX-License-Identifier: CC-0 + +//! Connects to a Nitrokey device, configures an TOTP slot and generates a one-time password from +//! it. + +use std::time; + +use nitrokey::{Authenticate, ConfigureOtp, Device, GenerateOtp}; + +fn main() -> Result<(), nitrokey::Error> { +    let mut manager = nitrokey::take()?; +    let device = manager.connect()?; + +    // Configure the OTP slot (requires admin PIN) +    let data = nitrokey::OtpSlotData::new( +        1, +        "test", +        "3132333435363738393031323334353637383930", +        nitrokey::OtpMode::SixDigits, +    ); +    let mut admin = device.authenticate_admin("12345678")?; +    admin.write_totp_slot(data, 30)?; +    let mut device = admin.device(); + +    // Set the time for the OTP generation +    let time = time::SystemTime::now() +        .duration_since(time::UNIX_EPOCH) +        .expect("Invalid system time"); +    device.set_time(time.as_secs(), true)?; + +    // Generate a one-time password -- depending on the configuration, we have to set the user PIN +    let config = device.get_config()?; +    let otp = if config.user_password { +        let user = device.authenticate_user("123456")?; +        user.get_totp_code(1) +    } else { +        device.get_totp_code(1) +    }?; +    println!("Generated OTP code: {}", otp); + +    Ok(()) +} | 
