mirror of
https://github.com/massgravel/keyhole.git
synced 2024-11-22 21:39:49 +00:00
142 lines
2.9 KiB
Plaintext
142 lines
2.9 KiB
Plaintext
#include <std/mem.pat>
|
|
|
|
struct UTF16CStr {
|
|
char16 data[while(std::mem::read_unsigned($, 2) != 0x0)];
|
|
char16 terminator[[hidden]];
|
|
};
|
|
|
|
enum LicenseType : u16 {
|
|
Unknown = 0,
|
|
App = 1,
|
|
Lease = 2,
|
|
Device = 3,
|
|
Dev = 4,
|
|
Lob = 5,
|
|
Upgrade = 6,
|
|
};
|
|
|
|
bitfield BasicPolicies {
|
|
lease_required : 1;
|
|
is_primary : 1;
|
|
expired : 1;
|
|
is_device_locked : 1;
|
|
padding : 12;
|
|
};
|
|
|
|
struct LicenseInformation {
|
|
u16 version;
|
|
LicenseType type;
|
|
s32 issued;
|
|
BasicPolicies policies;
|
|
};
|
|
|
|
// SHA256 of PFN (lowercase)
|
|
struct LicenseEntryId {
|
|
u8 data[32];
|
|
};
|
|
|
|
enum PolicyType : u8 {
|
|
NONE = 0x01,
|
|
STRING = 0x11,
|
|
BINARY = 0x31,
|
|
DWORD = 0x41,
|
|
MULTI_SZ = 0x71
|
|
};
|
|
|
|
struct Policy {
|
|
u16 something1[[hidden]];
|
|
u16 something2[[hidden]];
|
|
u8 pad0[[hidden]];
|
|
PolicyType type;
|
|
u16 pad1[[hidden]];
|
|
u16 priority;
|
|
u16 name_sz;
|
|
u16 data_sz;
|
|
char16 name[name_sz / 2];
|
|
|
|
u32 end = $ + data_sz;
|
|
match (type) {
|
|
(PolicyType::STRING): {
|
|
UTF16CStr data;
|
|
}
|
|
(PolicyType::DWORD): {
|
|
u32 data;
|
|
}
|
|
(PolicyType::MULTI_SZ): {
|
|
UTF16CStr data[];
|
|
}
|
|
(_): {
|
|
u8 data[while($ < end)];
|
|
}
|
|
}
|
|
u16 terminator[[hidden]];
|
|
};
|
|
|
|
enum BlockType : u32 {
|
|
SignedBlock = 0x14,
|
|
DeviceLicenseExpirationTime = 0x1f,
|
|
PollingTime = 0xd3,
|
|
LicenseExpirationTime = 0x20,
|
|
ClepSignState = 0x12d,
|
|
LicenseDeviceId = 0xd2,
|
|
UnkBlock1 = 0xd1,
|
|
LicenseId = 0xcb,
|
|
HardwareId = 0xd0,
|
|
UnkBlock2 = 0xcf,
|
|
UplinkKeyId = 0x18,
|
|
UnkBlock3 = 0x0,
|
|
UnkBlock4 = 0x12e,
|
|
UnkBlock5 = 0xd5,
|
|
PackageFullName = 0xce,
|
|
LicenseInformation = 0xc9,
|
|
PackedContentKeys = 0xca,
|
|
EncryptedDeviceKey = 0x1,
|
|
DeviceLicenseDeviceId = 0x2,
|
|
LicenseEntryIds = 0xcd,
|
|
LicensePolicies = 0xd4,
|
|
KeyholderPublicSigningKey = 0xdc,
|
|
KeyholderPolicies = 0xdd,
|
|
KeyholderKeyLicenseId = 0xde,
|
|
SignatureBlock = 0xcc,
|
|
};
|
|
|
|
|
|
|
|
|
|
struct TLVBlock {
|
|
BlockType type;
|
|
u32 size;
|
|
|
|
u32 end = $ + size;
|
|
match (type) {
|
|
(BlockType::SignedBlock): {
|
|
TLVBlock block[while($ < end)];
|
|
}
|
|
(BlockType::DeviceLicenseExpirationTime | BlockType::PollingTime | BlockType::LicenseExpirationTime): {
|
|
s32 time;
|
|
}
|
|
(BlockType::PackageFullName): {
|
|
UTF16CStr name;
|
|
}
|
|
(BlockType::LicenseInformation): {
|
|
LicenseInformation information;
|
|
}
|
|
(BlockType::LicenseEntryIds): {
|
|
u16 count[[hidden]];
|
|
LicenseEntryId ids[count];
|
|
}
|
|
(BlockType::LicensePolicies): {
|
|
Policy policies[while($ < end)];
|
|
}
|
|
(BlockType::SignatureBlock): {
|
|
u16 something0[[hidden]];
|
|
u16 origin;
|
|
u8 data[while($ < end)];
|
|
}
|
|
(_): { u8 data[size]; }
|
|
}
|
|
};
|
|
|
|
|
|
|
|
TLVBlock blocks[while($ < std::mem::size())] @ 0; |