1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//! Reset the device: clear all stored objects, restore the default auth key,
//! and reboot
//!
//! <https://developers.yubico.com/YubiHSM2/Commands/Reset.html>

use super::{Command, CommandType, Response};
use adapter::Adapter;
use session::{Session, SessionError, SessionErrorKind};

/// Reset the `YubiHSM2` to a factory default state and reboot
pub fn reset<A: Adapter>(mut session: Session<A>) -> Result<(), SessionError> {
    // Resetting the session does not send a valid response
    if let Err(e) = session.send_command(ResetCommand {}) {
        match e.kind() {
            // TODO: we don't handle the yubihsm-connector response to reset correctly
            SessionErrorKind::ProtocolError => Ok(()),
            _ => Err(e),
        }
    } else {
        Ok(())
    }
}

/// Request parameters for `command::reset`
#[derive(Serialize, Deserialize, Debug)]
pub(crate) struct ResetCommand {}

impl Command for ResetCommand {
    type ResponseType = ResetResponse;
}

/// Response from `command::reset`
#[derive(Serialize, Deserialize, Debug)]
pub struct ResetResponse(pub(crate) u8);

impl Response for ResetResponse {
    const COMMAND_TYPE: CommandType = CommandType::Reset;
}