keyhole/splicenseblock.hexpat
2024-09-06 23:05:57 +00:00

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;