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
use ms_dtyp::ULONG;
use crate::{
KERB_VALIDATION_INFO, PAC_CLIENT_CLAIMS_INFO, PAC_CLIENT_INFO,
PAC_CREDENTIAL_INFO, PAC_DEVICE_CLAIMS_INFO, PAC_DEVICE_INFO,
PAC_SIGNATURE_DATA, S4U_DELEGATION_INFO, UPN_DNS_INFO,
};
pub const PAC_LOGON_INFO: ULONG = 0x00000001;
pub const PAC_CREDENTIALS_INFO: ULONG = 0x00000002;
pub const PAC_SERVER_CHECKSUM: ULONG = 0x00000006;
pub const PAC_PRIVSVR_CHECKSUM: ULONG = 0x00000007;
pub const PAC_CLIENT_INFO_TYPE: ULONG = 0x0000000a;
pub const PAC_DELEGATION_INFO: ULONG = 0x0000000b;
pub const PAC_UPN_DNS_INFO: ULONG = 0x0000000c;
pub const PAC_CLIENT_CLAIMS_INFO_TYPE: ULONG = 0x0000000d;
pub const PAC_DEVICE_INFO_TYPE: ULONG = 0x0000000e;
pub const PAC_DEVICE_CLAIMS_INFO_TYPE: ULONG = 0x0000000f;
#[derive(Clone, Debug, PartialEq)]
pub enum PAC_INFO_BUFFER {
LOGON_INFO(KERB_VALIDATION_INFO),
CREDENTIALS_INFO(PAC_CREDENTIAL_INFO),
SERVER_CHECKSUM(PAC_SIGNATURE_DATA),
PRIVSRV_CHECKSUM(PAC_SIGNATURE_DATA),
CLIENT_INFO(PAC_CLIENT_INFO),
DELEGATION_INFO(S4U_DELEGATION_INFO),
UPN_DNS_INFO(UPN_DNS_INFO),
CLIENT_CLAIMS_INFO(PAC_CLIENT_CLAIMS_INFO),
DEVICE_INFO(PAC_DEVICE_INFO),
DEVICE_CLAIMS_INFO(PAC_DEVICE_CLAIMS_INFO),
Raw(ULONG, Vec<u8>)
}
impl PAC_INFO_BUFFER {
pub fn ulType(&self) -> ULONG {
match self {
Self::LOGON_INFO(_) => PAC_LOGON_INFO,
Self::CREDENTIALS_INFO(_) => PAC_CREDENTIALS_INFO,
Self::SERVER_CHECKSUM(_) => PAC_SERVER_CHECKSUM,
Self::PRIVSRV_CHECKSUM(_) => PAC_PRIVSVR_CHECKSUM,
Self::CLIENT_INFO(_) => PAC_CLIENT_INFO_TYPE,
Self::DELEGATION_INFO(_) => PAC_DELEGATION_INFO,
Self::UPN_DNS_INFO(_) => PAC_UPN_DNS_INFO,
Self::CLIENT_CLAIMS_INFO(_) => PAC_CLIENT_CLAIMS_INFO_TYPE,
Self::DEVICE_INFO(_) => PAC_DEVICE_INFO_TYPE,
Self::DEVICE_CLAIMS_INFO(_) => PAC_DEVICE_CLAIMS_INFO_TYPE,
Self::Raw(ulType, _) => *ulType,
}
}
pub fn build_data(&self) -> Vec<u8> {
match self {
Self::LOGON_INFO(kerb_info) => kerb_info.build(),
Self::CLIENT_INFO(client_info) => client_info.build(),
Self::SERVER_CHECKSUM(sign_data) => sign_data.clone().build(),
Self::PRIVSRV_CHECKSUM(sign_data) => sign_data.clone().build(),
_ => unimplemented!("No implemented build_data for this type of buffer info")
}
}
}