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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
use std::fmt::Display;
#[derive(Clone, Debug, PartialEq)]
pub enum Slot {
Slot1,
Slot2,
}
#[derive(Clone, Debug, PartialEq)]
pub enum Mode {
Sha1,
Otp,
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct SyncLevel(u8);
impl SyncLevel {
pub fn fast() -> SyncLevel {
SyncLevel(0)
}
pub fn secure() -> SyncLevel {
SyncLevel(100)
}
pub fn custom(level: u8) -> SyncLevel {
if level > 100 {
SyncLevel(100)
} else {
SyncLevel(level)
}
}
}
impl Display for SyncLevel{
fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
write!(f, "{}", self.0)
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
#[repr(u8)]
pub enum Command {
Configuration1 = 0x01,
Configuration2 = 0x03,
Update1 = 0x04,
Update2 = 0x05,
Swap = 0x06,
DeviceSerial = 0x10,
DeviceConfig = 0x11,
ChallengeOtp1 = 0x20,
ChallengeOtp2 = 0x28,
ChallengeHmac1 = 0x30,
ChallengeHmac2 = 0x38,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Config {
pub product_id: u16,
pub vendor_id: u16,
pub variable: bool,
pub slot: Slot,
pub mode: Mode,
pub command: Command,
}
#[allow(dead_code)]
impl Config {
pub fn default() -> Config {
Config {
product_id: 0x00,
vendor_id: 0x1050,
variable: true,
slot: Slot::Slot1,
mode: Mode::Sha1,
command: Command::ChallengeHmac1,
}
}
pub fn set_vendor_id(mut self, vendor_id: u16) -> Self {
self.vendor_id = vendor_id;
self
}
pub fn set_product_id(mut self, product_id: u16) -> Self {
self.product_id = product_id;
self
}
pub fn set_variable_size(mut self, variable: bool) -> Self {
self.variable = variable;
self
}
pub fn set_slot(mut self, slot: Slot) -> Self {
self.slot = slot;
self
}
pub fn set_mode(mut self, mode: Mode) -> Self {
self.mode = mode;
self
}
pub fn set_command(mut self, command: Command) -> Self {
self.command = command;
self
}
}