1use bitflags::bitflags;
2use crate::enums::constants::*;
3use nom7::number::complete::{*,{le_u16, le_u32, le_u8}};
4use nom7::bytes::streaming::take;
5use nom7::combinator::cond;
6use nom7::multi::count;
7use nom7::IResult;
8
9#[derive(Debug)]
17pub struct SecurityDescriptor {
18 pub revision: u8,
19 pub sbz1: u8,
20 pub control: u16,
21 pub offset_owner: u32,
22 pub offset_group: u32,
23 pub offset_sacl: u32,
24 pub offset_dacl: u32,
25}
26
27impl SecurityDescriptor {
28 pub fn parse(i: &[u8]) -> IResult<&[u8], SecurityDescriptor>
29 {
30 let (i, revision) = le_u8(i)?;
31 let (i, sbz1) = le_u8(i)?;
32 let (i, control) = le_u16(i)?;
33 let (i, offset_owner) = le_u32(i)?;
34 let (i, offset_group) = le_u32(i)?;
35 let (i, offset_sacl) = le_u32(i)?;
36 let (i, offset_dacl) = le_u32(i)?;
37
38 let nt = SecurityDescriptor {
39 revision,
40 sbz1,
41 control,
42 offset_owner,
43 offset_group,
44 offset_sacl,
45 offset_dacl,
46 };
47 Ok((i, nt))
48 }
49}
50
51#[derive(Debug, Clone)]
54pub struct LdapSidIdentifiedAuthority {
55 pub value: Vec<u8>,
56}
57
58impl LdapSidIdentifiedAuthority {
59 pub fn parse(i: &[u8]) -> IResult<&[u8], LdapSidIdentifiedAuthority>
60 {
61 let (i, value) = take(6_usize)(i)?;
62
63 let sid_authority = LdapSidIdentifiedAuthority {
64 value: value.to_vec(),
65 };
66 Ok((i, sid_authority))
67 }
68}
69
70#[derive(Clone, Debug)]
73pub struct LdapSid {
74 pub revision: u8,
75 pub sub_authority_count: u8,
76 pub identifier_authority: LdapSidIdentifiedAuthority,
77 pub sub_authority: Vec<u32>,
78}
79
80impl LdapSid {
81 pub fn parse(i: &[u8]) -> IResult<&[u8], LdapSid>
82 {
83 let (i, revision) = le_u8(i)?;
84 let (i, sub_authority_count) = le_u8(i)?;
85 let (i, identifier_authority) = LdapSidIdentifiedAuthority::parse(i)?;
86 let (i, sub_authority) = count(le_u32, sub_authority_count as usize)(i)?;
87
88 let ldap_sid = LdapSid {
89 revision,
90 sub_authority_count,
91 identifier_authority,
92 sub_authority: sub_authority.to_vec(),
93 };
94 Ok((i, ldap_sid))
95 }
96}
97
98#[derive(Debug)]
101pub struct Acl {
102 pub acl_revision: u8,
103 pub sbz1: u8,
104 pub acl_size: u16,
105 pub ace_count: u16,
106 pub sbz2: u16,
107 pub data: Vec<Ace>,
109}
110
111impl Acl {
112 pub fn parse(i: &[u8]) -> IResult<&[u8], Acl>
113 {
114 let (i, acl_revision) = le_u8(i)?;
115 let (i, sbz1) = le_u8(i)?;
116 let (i, acl_size) = le_u16(i)?;
117 let (i, ace_count) = le_u16(i)?;
118 let (i, sbz2) = le_u16(i)?;
119 let (i, data) = count(Ace::parse, ace_count as usize)(i)?;
120
121 let acl = Acl {
122 acl_revision,
123 sbz1,
124 acl_size,
125 ace_count,
126 sbz2,
127 data,
128 };
129 Ok((i, acl))
130 }
131}
132
133#[derive(Debug)]
136pub struct Ace {
137 pub ace_type: u8,
138 pub ace_flags: u8,
139 pub ace_size: u16,
140 pub data: AceFormat,
141}
142
143impl Ace {
144 pub fn parse(i: &[u8]) -> IResult<&[u8], Ace>
145 {
146 let (i, ace_type) = le_u8(i)?;
147 let (i, ace_flags) = le_u8(i)?;
148 let (i, ace_size) = le_u16(i)?;
149 let (i, data) = take(ace_size as usize - 4)(i)?;
150 let (_j,ace_data_formatted) = AceFormat::parse(data, ace_type)?;
151
152 let ace = Ace {
153 ace_type,
154 ace_flags,
155 ace_size,
156 data: ace_data_formatted,
157 };
158 Ok((i, ace))
159 }
160}
161
162#[derive(Clone, Debug)]
164pub enum AceFormat {
165 AceAllowed(AccessAllowedAce),
166 AceObjectAllowed(AccessAllowedObjectAce),
167 Empty,
168}
169
170impl AceFormat {
171 pub fn parse(i: &[u8], ace_type: u8) -> IResult<&[u8], AceFormat>
172 {
173 #[allow(clippy::if_same_then_else)]
174 if ace_type == ACCESS_ALLOWED_ACE_TYPE {
175 let data = AceFormat::AceAllowed(AccessAllowedAce::parse(i)?.1);
176 Ok((i, data))
177 }
178 else if ace_type == ACCESS_DENIED_ACE_TYPE {
179 let data = AceFormat::AceAllowed(AccessAllowedAce::parse(i)?.1);
180 Ok((i, data))
181 }
182 else if ace_type == ACCESS_ALLOWED_OBJECT_ACE_TYPE {
183 let data = AceFormat::AceObjectAllowed(AccessAllowedObjectAce::parse(i)?.1);
184 Ok((i, data))
185 }
186 else if ace_type == ACCESS_DENIED_OBJECT_ACE_TYPE {
187 let data = AceFormat::AceObjectAllowed(AccessAllowedObjectAce::parse(i)?.1);
188 Ok((i, data))
189 }
190 else {
191 panic!("Error during ACE data parsing to AceFormat!")
192 }
193 }
194
195 pub fn get_mask(value: &AceFormat) -> Option<u32>
196 {
197 match value {
198 AceFormat::AceAllowed(ace) => Some(ace.mask),
199 AceFormat::AceObjectAllowed(ace) => Some(ace.mask),
200 AceFormat::Empty => None,
201 }
202 }
203
204 pub fn get_sid(value: AceFormat) -> Option<LdapSid>
205 {
206 match value {
207 AceFormat::AceAllowed(ace) => Some(ace.sid),
208 AceFormat::AceObjectAllowed(ace) => Some(ace.sid),
209 AceFormat::Empty => None,
210 }
211 }
212
213 pub fn get_flags(value: &AceFormat) -> Option<ObjectAceFlags>
214 {
215 match value {
216 AceFormat::AceAllowed(_) => None,
217 AceFormat::AceObjectAllowed(ace) => Some(ace.flags),
218 AceFormat::Empty => None,
219 }
220 }
221
222 pub fn get_object_type(value: &AceFormat) -> Option<u128>
223 {
224 match value {
225 AceFormat::AceAllowed(_) => None,
226 AceFormat::AceObjectAllowed(ace) => ace.object_type,
227 AceFormat::Empty => None,
228 }
229 }
230
231 pub fn get_inherited_object_type(value: &AceFormat) -> Option<u128>
232 {
233 match value {
234 AceFormat::AceAllowed(_) => None,
235 AceFormat::AceObjectAllowed(ace) => ace.inherited_object_type,
236 AceFormat::Empty => None,
237 }
238 }
239}
240
241#[derive(Clone, Debug)]
244pub struct AccessAllowedAce {
245 pub mask: u32,
246 pub sid: LdapSid,
247}
248
249impl AccessAllowedAce {
250 pub fn parse(i: &[u8]) -> IResult<&[u8], AccessAllowedAce>
251 {
252 let (i, mask) = le_u32(i)?;
253 let (i, sid) = LdapSid::parse(i)?;
254
255 let access_allowed_ace = AccessAllowedAce {
256 mask,
257 sid,
258 };
259 Ok((i, access_allowed_ace))
260 }
261}
262
263#[derive(Clone, Debug)]
266pub struct AccessAllowedObjectAce {
267 pub mask: u32,
268 pub flags: ObjectAceFlags,
269 pub object_type: Option<u128>,
270 pub inherited_object_type: Option<u128>,
271 pub sid: LdapSid,
272}
273
274impl AccessAllowedObjectAce {
275 pub fn parse(i: &[u8]) -> IResult<&[u8], AccessAllowedObjectAce>
276 {
277 let (i, mask) = le_u32(i)?;
278 let (i, flags) = ObjectAceFlags::parse(i)?;
279 let (i, object_type) = cond(flags.contains(ObjectAceFlags::ACE_OBJECT_PRESENT),le_u128)(i)?;
280 let (i, inherited_object_type) = cond(flags.contains(ObjectAceFlags::ACE_INHERITED_OBJECT_PRESENT),le_u128)(i)?;
281 let (i, sid) = LdapSid::parse(i)?;
282
283 let access_allowed_object_ace = AccessAllowedObjectAce {
284 mask,
285 flags,
286 object_type,
287 inherited_object_type,
288 sid,
289 };
290 Ok((i, access_allowed_object_ace))
291 }
292}
293
294bitflags! {
295 #[derive(Clone, Debug, Copy)]
297 pub struct ObjectAceFlags : u32 {
298 const ACE_OBJECT_PRESENT = 0x0001;
299 const ACE_INHERITED_OBJECT_PRESENT = 0x0002;
300 }
301}
302
303impl ObjectAceFlags {
304 pub fn parse(i: &[u8]) -> IResult<&[u8], ObjectAceFlags>
305 {
306 let (i, flags) = le_u32(i)?;
307 let object_ace_flags = ObjectAceFlags::from_bits(flags).unwrap();
308 Ok((i, object_ace_flags))
309 }
310}
311
312#[cfg(test)]
315mod tests {
316
317 use crate::enums::{SecurityDescriptor, Ace, Acl};
318
319 #[test]
320 #[rustfmt::skip]
321 pub fn test_security_descriptor() {
322
323 let original = vec![
324 1,
327 0,
329 4, 140,
331 120, 9, 0, 0,
333 0, 0, 0, 0,
335 0, 0, 0, 0,
337 20, 0, 0, 0
339 ];
340
341 let nt = SecurityDescriptor::parse(&original).unwrap().1;
342 assert_eq!(nt.revision, 1);
343 assert_eq!(nt.sbz1, 0);
344 assert_eq!(nt.control, 35844);
345 assert_eq!(nt.offset_owner, 2424);
346 assert_eq!(nt.offset_group, 0);
347 assert_eq!(nt.offset_sacl, 0);
348 assert_eq!(nt.offset_dacl, 20);
349
350 println!("[NT SecurityDescriptor]: {:?}",&nt)
351 }
352
353 #[test]
354 #[rustfmt::skip]
355 pub fn test_ace() {
356
357 let original_ace = vec![
358 0x00,
360 0x12,
362 0x18, 0x00,
364 0xbd, 0x01, 0x0f, 0x00,
367 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00
369 ];
370
371 let result = Ace::parse(&original_ace).unwrap().1;
372 assert_eq!(result.ace_type, 0);
373 println!("ACE_ALLOWED: {:?}",result);
374
375
376 let original_ace_object = vec![
377 0x05,
379 0x12,
381 0x2c, 0x00,
383 0x94, 0x00, 0x02, 0x00,
386 0x02, 0x00, 0x00, 0x00,
389 0xba, 0x7a, 0x96, 0xbf, 0xe6, 0x0d, 0xd0, 0x11, 0xa2, 0x85, 0x00, 0xaa, 0x00, 0x30, 0x49, 0xe2,
391 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00
393 ];
394
395 let result = Ace::parse(&original_ace_object).unwrap().1;
396 assert_eq!(result.ace_type, 5);
397 println!("ACE_ALLOWED_OBJECT: {:?}",result);
398 }
399
400 #[test]
401 #[rustfmt::skip]
402 pub fn test_acl_admin() {
403
404 let original_acl = vec![0x04, 0x00, 0x04, 0x0b, 0x34, 0x00, 0x00, 0x00, 0x05, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x16, 0x4c, 0xc0, 0x20, 0xd0, 0x11, 0xa7, 0x68, 0x00, 0xaa, 0x00, 0x6e, 0x05, 0x29, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x15, 0x00, 0x00, 0x00, 0xc1, 0x20, 0x09, 0x42, 0x30, 0x14, 0x92, 0xf5, 0x91, 0xfe, 0x95, 0x5f, 0x29, 0x02, 0x00, 0x00, 0x05, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x20, 0x20, 0x5f, 0xa5, 0x79, 0xd0, 0x11, 0x90, 0x20, 0x00, 0xc0, 0x4f, 0xc2, 0xd4, 0xcf, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x15, 0x00, 0x00, 0x00, 0xc1, 0x20, 0x09, 0x42, 0x30, 0x14, 0x92, 0xf5, 0x91, 0xfe, 0x95, 0x5f, 0x29, 0x02, 0x00, 0x00, 0x05, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0xc2, 0x0a, 0xbc, 0xa9, 0x79, 0xd0, 0x11, 0x90, 0x20, 0x00, 0xc0, 0x4f, 0xc2, 0xd4, 0xcf, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x15, 0x00, 0x00, 0x00, 0xc1, 0x20, 0x09, 0x42, 0x30, 0x14, 0x92, 0xf5, 0x91, 0xfe, 0x95, 0x5f, 0x29, 0x02, 0x00, 0x00, 0x05, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf8, 0x88, 0x70, 0x03, 0xe1, 0x0a, 0xd2, 0x11, 0xb4, 0x22, 0x00, 0xa0, 0xc9, 0x68, 0xf9, 0x39, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x15, 0x00, 0x00, 0x00, 0xc1, 0x20, 0x09, 0x42, 0x30, 0x14, 0x92, 0xf5, 0x91, 0xfe, 0x95, 0x5f, 0x29, 0x02, 0x00, 0x00, 0x05, 0x00, 0x38, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x7f, 0x7a, 0x96, 0xbf, 0xe6, 0x0d, 0xd0, 0x11, 0xa2, 0x85, 0x00, 0xaa, 0x00, 0x30, 0x49, 0xe2, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x15, 0x00, 0x00, 0x00, 0xc1, 0x20, 0x09, 0x42, 0x30, 0x14, 0x92, 0xf5, 0x91, 0xfe, 0x95, 0x5f, 0x05, 0x02, 0x00, 0x00, 0x05, 0x00, 0x2c, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1d, 0xb1, 0xa9, 0x46, 0xae, 0x60, 0x5a, 0x40, 0xb7, 0xe8, 0xff, 0x8a, 0x58, 0xd4, 0x56, 0xd2, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x30, 0x02, 0x00, 0x00, 0x05, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x9a, 0xb6, 0x6d, 0x22, 0x94, 0xd1, 0x11, 0xae, 0xbd, 0x00, 0x00, 0xf8, 0x03, 0x67, 0xc1, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x31, 0x02, 0x00, 0x00, 0x05, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x62, 0xbc, 0x05, 0x58, 0xc9, 0xbd, 0x28, 0x44, 0xa5, 0xe2, 0x85, 0x6a, 0x0f, 0x4c, 0x18, 0x5e, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x31, 0x02, 0x00, 0x00, 0x05, 0x00, 0x28, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x53, 0x1a, 0x72, 0xab, 0x2f, 0x1e, 0xd0, 0x11, 0x98, 0x19, 0x00, 0xaa, 0x00, 0x40, 0x52, 0x9b, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x28, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x53, 0x1a, 0x72, 0xab, 0x2f, 0x1e, 0xd0, 0x11, 0x98, 0x19, 0x00, 0xaa, 0x00, 0x40, 0x52, 0x9b, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, 0x00, 0x05, 0x00, 0x28, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x54, 0x1a, 0x72, 0xab, 0x2f, 0x1e, 0xd0, 0x11, 0x98, 0x19, 0x00, 0xaa, 0x00, 0x40, 0x52, 0x9b, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, 0x00, 0x05, 0x00, 0x28, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x56, 0x1a, 0x72, 0xab, 0x2f, 0x1e, 0xd0, 0x11, 0x98, 0x19, 0x00, 0xaa, 0x00, 0x40, 0x52, 0x9b, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, 0x00, 0x05, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x42, 0x2f, 0xba, 0x59, 0xa2, 0x79, 0xd0, 0x11, 0x90, 0x20, 0x00, 0xc0, 0x4f, 0xc2, 0xd3, 0xcf, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x54, 0x01, 0x8d, 0xe4, 0xf8, 0xbc, 0xd1, 0x11, 0x87, 0x02, 0x00, 0xc0, 0x4f, 0xb9, 0x60, 0x50, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x86, 0xb8, 0xb5, 0x77, 0x4a, 0x94, 0xd1, 0x11, 0xae, 0xbd, 0x00, 0x00, 0xf8, 0x03, 0x67, 0xc1, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xb3, 0x95, 0x57, 0xe4, 0x55, 0x94, 0xd1, 0x11, 0xae, 0xbd, 0x00, 0x00, 0xf8, 0x03, 0x67, 0xc1, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x28, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x86, 0xb8, 0xb5, 0x77, 0x4a, 0x94, 0xd1, 0x11, 0xae, 0xbd, 0x00, 0x00, 0xf8, 0x03, 0x67, 0xc1, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, 0x00, 0x05, 0x00, 0x28, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xb2, 0x95, 0x57, 0xe4, 0x55, 0x94, 0xd1, 0x11, 0xae, 0xbd, 0x00, 0x00, 0xf8, 0x03, 0x67, 0xc1, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, 0x00, 0x05, 0x00, 0x28, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xb3, 0x95, 0x57, 0xe4, 0x55, 0x94, 0xd1, 0x11, 0xae, 0xbd, 0x00, 0x00, 0xf8, 0x03, 0x67, 0xc1, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0xff, 0x01, 0x0f, 0x00, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x15, 0x00, 0x00, 0x00, 0xc1, 0x20, 0x09, 0x42, 0x30, 0x14, 0x92, 0xf5, 0x91, 0xfe, 0x95, 0x5f, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0xff, 0x01, 0x0f, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x94, 0x00, 0x02, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0xff, 0x01, 0x0f, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x12, 0x00, 0x00, 0x00, 0x05, 0x1a, 0x5c, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x42, 0x16, 0x4c, 0xc0, 0x20, 0xd0, 0x11, 0xa7, 0x68, 0x00, 0xaa, 0x00, 0x6e, 0x05, 0x29, 0x14, 0xcc, 0x28, 0x48, 0x37, 0x14, 0xbc, 0x45, 0x9b, 0x07, 0xad, 0x6f, 0x01, 0x5e, 0x5f, 0x28, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x12, 0x3c, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x42, 0x16, 0x4c, 0xc0, 0x20, 0xd0, 0x11, 0xa7, 0x68, 0x00, 0xaa, 0x00, 0x6e, 0x05, 0x29, 0xba, 0x7a, 0x96, 0xbf, 0xe6, 0x0d, 0xd0, 0x11, 0xa2, 0x85, 0x00, 0xaa, 0x00, 0x30, 0x49, 0xe2, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x05, 0x1a, 0x5c, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x20, 0x20, 0x5f, 0xa5, 0x79, 0xd0, 0x11, 0x90, 0x20, 0x00, 0xc0, 0x4f, 0xc2, 0xd4, 0xcf, 0x14, 0xcc, 0x28, 0x48, 0x37, 0x14, 0xbc, 0x45, 0x9b, 0x07, 0xad, 0x6f, 0x01, 0x5e, 0x5f, 0x28, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x12, 0x3c, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x20, 0x20, 0x5f, 0xa5, 0x79, 0xd0, 0x11, 0x90, 0x20, 0x00, 0xc0, 0x4f, 0xc2, 0xd4, 0xcf, 0xba, 0x7a, 0x96, 0xbf, 0xe6, 0x0d, 0xd0, 0x11, 0xa2, 0x85, 0x00, 0xaa, 0x00, 0x30, 0x49, 0xe2, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x05, 0x1a, 0x5c, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0xc2, 0x0a, 0xbc, 0xa9, 0x79, 0xd0, 0x11, 0x90, 0x20, 0x00, 0xc0, 0x4f, 0xc2, 0xd4, 0xcf, 0x14, 0xcc, 0x28, 0x48, 0x37, 0x14, 0xbc, 0x45, 0x9b, 0x07, 0xad, 0x6f, 0x01, 0x5e, 0x5f, 0x28, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x12, 0x3c, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0xc2, 0x0a, 0xbc, 0xa9, 0x79, 0xd0, 0x11, 0x90, 0x20, 0x00, 0xc0, 0x4f, 0xc2, 0xd4, 0xcf, 0xba, 0x7a, 0x96, 0xbf, 0xe6, 0x0d, 0xd0, 0x11, 0xa2, 0x85, 0x00, 0xaa, 0x00, 0x30, 0x49, 0xe2, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x05, 0x1a, 0x5c, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x42, 0x2f, 0xba, 0x59, 0xa2, 0x79, 0xd0, 0x11, 0x90, 0x20, 0x00, 0xc0, 0x4f, 0xc2, 0xd3, 0xcf, 0x14, 0xcc, 0x28, 0x48, 0x37, 0x14, 0xbc, 0x45, 0x9b, 0x07, 0xad, 0x6f, 0x01, 0x5e, 0x5f, 0x28, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x12, 0x3c, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x42, 0x2f, 0xba, 0x59, 0xa2, 0x79, 0xd0, 0x11, 0x90, 0x20, 0x00, 0xc0, 0x4f, 0xc2, 0xd3, 0xcf, 0xba, 0x7a, 0x96, 0xbf, 0xe6, 0x0d, 0xd0, 0x11, 0xa2, 0x85, 0x00, 0xaa, 0x00, 0x30, 0x49, 0xe2, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x05, 0x1a, 0x5c, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf8, 0x88, 0x70, 0x03, 0xe1, 0x0a, 0xd2, 0x11, 0xb4, 0x22, 0x00, 0xa0, 0xc9, 0x68, 0xf9, 0x39, 0x14, 0xcc, 0x28, 0x48, 0x37, 0x14, 0xbc, 0x45, 0x9b, 0x07, 0xad, 0x6f, 0x01, 0x5e, 0x5f, 0x28, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x12, 0x3c, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf8, 0x88, 0x70, 0x03, 0xe1, 0x0a, 0xd2, 0x11, 0xb4, 0x22, 0x00, 0xa0, 0xc9, 0x68, 0xf9, 0x39, 0xba, 0x7a, 0x96, 0xbf, 0xe6, 0x0d, 0xd0, 0x11, 0xa2, 0x85, 0x00, 0xaa, 0x00, 0x30, 0x49, 0xe2, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x05, 0x1a, 0x58, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xa6, 0x6d, 0x02, 0x9b, 0x3c, 0x0d, 0x5c, 0x46, 0x8b, 0xee, 0x51, 0x99, 0xd7, 0x16, 0x5c, 0xba, 0x86, 0x7a, 0x96, 0xbf, 0xe6, 0x0d, 0xd0, 0x11, 0xa2, 0x85, 0x00, 0xaa, 0x00, 0x30, 0x49, 0xe2, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1a, 0x58, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xa6, 0x6d, 0x02, 0x9b, 0x3c, 0x0d, 0x5c, 0x46, 0x8b, 0xee, 0x51, 0x99, 0xd7, 0x16, 0x5c, 0xba, 0x86, 0x7a, 0x96, 0xbf, 0xe6, 0x0d, 0xd0, 0x11, 0xa2, 0x85, 0x00, 0xaa, 0x00, 0x30, 0x49, 0xe2, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1a, 0x58, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x6d, 0x9e, 0xc6, 0xb7, 0xc7, 0x2c, 0xd2, 0x11, 0x85, 0x4e, 0x00, 0xa0, 0xc9, 0x83, 0xf6, 0x08, 0x86, 0x7a, 0x96, 0xbf, 0xe6, 0x0d, 0xd0, 0x11, 0xa2, 0x85, 0x00, 0xaa, 0x00, 0x30, 0x49, 0xe2, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1a, 0x58, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x6d, 0x9e, 0xc6, 0xb7, 0xc7, 0x2c, 0xd2, 0x11, 0x85, 0x4e, 0x00, 0xa0, 0xc9, 0x83, 0xf6, 0x08, 0x9c, 0x7a, 0x96, 0xbf, 0xe6, 0x0d, 0xd0, 0x11, 0xa2, 0x85, 0x00, 0xaa, 0x00, 0x30, 0x49, 0xe2, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x12, 0x38, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x6d, 0x9e, 0xc6, 0xb7, 0xc7, 0x2c, 0xd2, 0x11, 0x85, 0x4e, 0x00, 0xa0, 0xc9, 0x83, 0xf6, 0x08, 0xba, 0x7a, 0x96, 0xbf, 0xe6, 0x0d, 0xd0, 0x11, 0xa2, 0x85, 0x00, 0xaa, 0x00, 0x30, 0x49, 0xe2, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x09, 0x00, 0x00, 0x00, 0x05, 0x1a, 0x58, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x93, 0x7b, 0x1b, 0xea, 0x48, 0x5e, 0xd5, 0x46, 0xbc, 0x6c, 0x4d, 0xf4, 0xfd, 0xa7, 0x8a, 0x35, 0x86, 0x7a, 0x96, 0xbf, 0xe6, 0x0d, 0xd0, 0x11, 0xa2, 0x85, 0x00, 0xaa, 0x00, 0x30, 0x49, 0xe2, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1a, 0x4c, 0x00, 0x94, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0xcc, 0x28, 0x48, 0x37, 0x14, 0xbc, 0x45, 0x9b, 0x07, 0xad, 0x6f, 0x01, 0x5e, 0x5f, 0x28, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1a, 0x4c, 0x00, 0x94, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x9c, 0x7a, 0x96, 0xbf, 0xe6, 0x0d, 0xd0, 0x11, 0xa2, 0x85, 0x00, 0xaa, 0x00, 0x30, 0x49, 0xe2, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x12, 0x2c, 0x00, 0x94, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0xba, 0x7a, 0x96, 0xbf, 0xe6, 0x0d, 0xd0, 0x11, 0xa2, 0x85, 0x00, 0xaa, 0x00, 0x30, 0x49, 0xe2, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x05, 0x12, 0x28, 0x00, 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xde, 0x47, 0xe6, 0x91, 0x6f, 0xd9, 0x70, 0x4b, 0x95, 0x57, 0xd6, 0x3f, 0xf4, 0xf3, 0xcc, 0xd8, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, 0x00, 0x05, 0x12, 0x38, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0xd6, 0x47, 0x5b, 0x90, 0x60, 0xb2, 0x40, 0x9f, 0x37, 0x2a, 0x4d, 0xe8, 0x8f, 0x30, 0x63, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x15, 0x00, 0x00, 0x00, 0xc1, 0x20, 0x09, 0x42, 0x30, 0x14, 0x92, 0xf5, 0x91, 0xfe, 0x95, 0x5f, 0x0e, 0x02, 0x00, 0x00, 0x05, 0x12, 0x38, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0xd6, 0x47, 0x5b, 0x90, 0x60, 0xb2, 0x40, 0x9f, 0x37, 0x2a, 0x4d, 0xe8, 0x8f, 0x30, 0x63, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x15, 0x00, 0x00, 0x00, 0xc1, 0x20, 0x09, 0x42, 0x30, 0x14, 0x92, 0xf5, 0x91, 0xfe, 0x95, 0x5f, 0x0f, 0x02, 0x00, 0x00, 0x05, 0x12, 0x38, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xbe, 0x3b, 0x0e, 0xf3, 0xf0, 0x9f, 0xd1, 0x11, 0xb6, 0x03, 0x00, 0x00, 0xf8, 0x03, 0x67, 0xc1, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x15, 0x00, 0x00, 0x00, 0xc1, 0x20, 0x09, 0x42, 0x30, 0x14, 0x92, 0xf5, 0x91, 0xfe, 0x95, 0x5f, 0x52, 0x04, 0x00, 0x00, 0x05, 0x12, 0x38, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xbf, 0x3b, 0x0e, 0xf3, 0xf0, 0x9f, 0xd1, 0x11, 0xb6, 0x03, 0x00, 0x00, 0xf8, 0x03, 0x67, 0xc1, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x15, 0x00, 0x00, 0x00, 0xc1, 0x20, 0x09, 0x42, 0x30, 0x14, 0x92, 0xf5, 0x91, 0xfe, 0x95, 0x5f, 0x52, 0x04, 0x00, 0x00, 0x05, 0x12, 0x28, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe5, 0xc3, 0x78, 0x3f, 0x9a, 0xf7, 0xbd, 0x46, 0xa0, 0xb8, 0x9d, 0x18, 0x11, 0x6d, 0xdc, 0x79, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x12, 0x24, 0x00, 0xff, 0x01, 0x0f, 0x00, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x15, 0x00, 0x00, 0x00, 0xc1, 0x20, 0x09, 0x42, 0x30, 0x14, 0x92, 0xf5, 0x91, 0xfe, 0x95, 0x5f, 0x07, 0x02, 0x00, 0x00, 0x00, 0x12, 0x18, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x00, 0x12, 0x18, 0x00, 0xbd, 0x01, 0x0f, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00];
411 let acl = Acl::parse(&original_acl).unwrap().1;
412
413 assert_eq!(acl.acl_revision, 4);
414 assert_eq!(acl.acl_size, 2820);
415 assert_eq!(acl.ace_count, 52);
416
417 println!("ACL: {:?}",&acl.data);
419 let mut count = 1;
420 for ace in &acl.data {
421 println!("[{}: ACE] {:?}\n",count,ace);
422 println!("[{} ACE.DATA] {:?}\n", count, &ace.data);
423 count +=1;
424 }
425 }
426}