forked from tock/tockloader-rs
-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathserialization.rs
More file actions
158 lines (125 loc) · 4.93 KB
/
Copy pathserialization.rs
File metadata and controls
158 lines (125 loc) · 4.93 KB
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
use tbf_parser::parse::*;
use tbf_parser::types::Flags;
// Serialization
#[test]
fn serialize_identical_with_original() {
let buffer: Vec<u8> = include_bytes!("./flashes/simple.dat").to_vec();
let (_, header_len, _) = parse_tbf_header_lengths(&buffer[0..8].try_into().unwrap())
.ok()
.unwrap();
let header = parse_tbf_header(&buffer[0..header_len as usize], 2).unwrap();
let serialized = header.serialize();
// Check if serialize matches original buffer
assert_eq!(&buffer[0..16], &serialized[..]);
}
// Flag modifications
#[test]
fn flags_modifications() {
let mut buffer = include_bytes!("./flashes/footerSHA256.dat").to_vec();
let (_, header_len, _) = parse_tbf_header_lengths(&buffer[0..8].try_into().unwrap())
.ok()
.unwrap();
let mut header = parse_tbf_header(&buffer[0..header_len as usize], 2).unwrap();
assert!(header.enabled());
header.set_sticky(true);
// Set sticky without parsing
assert!(header.sticky());
// Unset
header.set_sticky(false);
// Disable
header.set_enabled(false);
let serialized = header.serialize();
buffer[0..16].copy_from_slice(&serialized);
let reparsed = parse_tbf_header(&buffer[0..header_len as usize], 2).unwrap();
assert!(!reparsed.enabled());
// Enable
let mut header = reparsed;
header.set_enabled(true);
let serialized = header.serialize();
buffer[0..16].copy_from_slice(&serialized);
let reparsed = parse_tbf_header(&buffer[0..header_len as usize], 2).unwrap();
assert!(reparsed.enabled());
}
#[test]
fn padding_header_set_flags() {
let buffer = vec![
0x02, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x10,
0x00,
];
let (_, header_len, _) = parse_tbf_header_lengths(&buffer[0..8].try_into().unwrap())
.ok()
.unwrap();
let mut header = parse_tbf_header(&buffer[0..header_len as usize], 2).unwrap();
assert!(!header.is_app());
let flags = Flags::Enabled | Flags::Sticky;
header.set_flags(flags);
let serialized = header.serialize();
let flags = u32::from_le_bytes(serialized[8..12].try_into().unwrap());
assert_eq!(flags, (Flags::Enabled | Flags::Sticky).as_u32());
}
#[test]
fn fields_preserved() {
let buffer = include_bytes!("./flashes/simple.dat").to_vec();
let (_, header_len, _) = parse_tbf_header_lengths(&buffer[0..8].try_into().unwrap())
.ok()
.unwrap();
let mut header = parse_tbf_header(&buffer[0..header_len as usize], 2).unwrap();
let header_size = header.header_size();
let total_size = header.total_size();
header.set_flags(Flags::Enabled | Flags::Sticky);
let serialized = header.serialize();
let _version = u16::from_le_bytes(serialized[0..2].try_into().unwrap());
let _header_size = u16::from_le_bytes(serialized[2..4].try_into().unwrap());
let _total_size = u32::from_le_bytes(serialized[4..8].try_into().unwrap());
// Check other fields are unchanged
assert_eq!(_version, 2);
assert_eq!(header_size, _header_size);
assert_eq!(total_size, _total_size);
}
// Complete use //
#[test]
fn serialization_multiple_checks() {
let mut buffer = include_bytes!("./flashes/footerRSA4096.dat").to_vec();
let (_, header_len, _) = parse_tbf_header_lengths(&buffer[0..8].try_into().unwrap())
.ok()
.unwrap();
let mut header = parse_tbf_header(&buffer[0..header_len as usize], 2).unwrap();
assert!(header.enabled());
// Disable
header.set_enabled(false);
let serialized = header.serialize();
buffer[0..16].copy_from_slice(&serialized);
let header = parse_tbf_header(&buffer[0..header_len as usize], 2).unwrap();
assert!(!header.enabled());
// Enable and set sticky
let mut header = header;
header.set_enabled(true);
header.set_sticky(true);
let serialized = header.serialize();
buffer[0..16].copy_from_slice(&serialized);
let header = parse_tbf_header(&buffer[0..header_len as usize], 2).unwrap();
assert!(header.enabled());
assert!(header.sticky());
// Disable sticky with high bits
let flags = !Flags::Sticky;
let mut header = header;
header.set_flags(flags);
let serialized = header.serialize();
buffer[0..16].copy_from_slice(&serialized);
let header = parse_tbf_header(&buffer[0..header_len as usize], 2).unwrap();
assert!(header.enabled());
assert!(!header.sticky());
let flags_buffer = u32::from_le_bytes(buffer[8..12].try_into().unwrap());
assert_eq!(flags_buffer, (!Flags::Sticky).as_u32());
}
#[test]
fn corrupt() {
let mut buffer = include_bytes!("./flashes/simple.dat").to_vec();
let (_, header_len, _) = parse_tbf_header_lengths(&buffer[0..8].try_into().unwrap())
.ok()
.unwrap();
// Corrupt the checksum manually and check for parsing error
buffer[12] ^= 0x6D;
let result = parse_tbf_header(&buffer[0..header_len as usize], 2);
assert!(result.is_err());
}