 import "adts/claims.idl";
  
 // XXX: use RPC_SID directly.
 // typedef struct _RPC_SID *PISID;

 const ULONG PAC_INFO_BUFFER_TYPE_LOGON_INFO = 0x00000001;
 const ULONG PAC_INFO_BUFFER_TYPE_CREDENTIALS_INFO = 0x00000002;
 const ULONG PAC_INFO_BUFFER_TYPE_SERVER_CHECKSUM = 0x00000006;
 const ULONG PAC_INFO_BUFFER_TYPE_KDC_CHECKSUM = 0x00000007;
 const ULONG PAC_INFO_BUFFER_TYPE_CLIENT_NAME_AND_TICKET_INFO = 0x0000000A;
 const ULONG PAC_INFO_BUFFER_TYPE_CONSTRAINED_DELEGATION_INFO = 0x0000000B;
 const ULONG PAC_INFO_BUFFER_TYPE_UPN_AND_DNS_INFO = 0x0000000C;
 const ULONG PAC_INFO_BUFFER_TYPE_CLIENT_CLAIMS_INFO = 0x0000000D;
 const ULONG PAC_INFO_BUFFER_TYPE_DEVICE_INFO = 0x0000000E;
 const ULONG PAC_INFO_BUFFER_TYPE_DEVICE_CLAIMS_INFO = 0x0000000F;
 const ULONG PAC_INFO_BUFFER_TYPE_TICKET_CHECKSUM = 0x00000010;
 const ULONG PAC_INFO_BUFFER_TYPE_ATTRIBUTES = 0x00000011;
 const ULONG PAC_INFO_BUFFER_TYPE_REQUESTOR_SID = 0x00000012;
 const ULONG PAC_INFO_BUFFER_TYPE_EXTENDED_KDC_CHECKSUM = 0x00000013;
 const ULONG PAC_INFO_BUFFER_TYPE_REQUESTOR_GUID = 0x00000014;

 const ULONG ENCRYPTION_TYPE_NONE = 0x00000000;
 const ULONG ENCRYPTION_TYPE_DES_CBC_CRC = 0x00000001;
 const ULONG ENCRYPTION_TYPE_DES_CBC_MD5 = 0x00000003;
 const ULONG ENCRYPTION_TYPE_AES128_CTS_HMAC_SHA1_96 = 0x00000011;
 const ULONG ENCRYPTION_TYPE_AES256_CTS_HMAC_SHA1_96 = 0x00000012;
 const ULONG ENCRYPTION_TYPE_RC4_HMAC = 0x000000017;
  
 typedef struct _KERB_SID_AND_ATTRIBUTES{
     PRPC_SID Sid;
     ULONG Attributes;
 } KERB_SID_AND_ATTRIBUTES, *PKERB_SID_AND_ATTRIBUTES;
  
 typedef struct _GROUP_MEMBERSHIP {
     ULONG RelativeId;
     ULONG Attributes;
 } GROUP_MEMBERSHIP, *PGROUP_MEMBERSHIP;
  
 typedef struct DOMAIN_GROUP_MEMBERSHIP {
     PRPC_SID DomainId;
     ULONG GroupCount;
     [size_is(GroupCount)] PGROUP_MEMBERSHIP GroupIds;
 } DOMAIN_GROUP_MEMBERSHIP, *PDOMAIN_GROUP_MEMBERSHIP;
  
 typedef struct _PACTYPE {
     ULONG cBuffers;
     ULONG Version;
     [size_is(cBuffers)] PAC_INFO_BUFFER * Buffers[];
 } PACTYPE, *PPACTYPE;
  
 typedef struct _PAC_INFO_BUFFER {
     ULONG ulType;
     ULONG cbBufferSize;
     ULONG64 Offset;
 } PAC_INFO_BUFFER, *PPAC_INFO_BUFFER;
  
 typedef struct _CYPHER_BLOCK {
     CHAR data[8];
 }CYPHER_BLOCK;
  
 typedef struct _USER_SESSION_KEY {
     CYPHER_BLOCK data[2];
 }USER_SESSION_KEY;
  
 typedef struct _KERB_VALIDATION_INFO {
     FILETIME LogonTime;            
     FILETIME LogoffTime;
     FILETIME KickOffTime;
     FILETIME PasswordLastSet;
     FILETIME PasswordCanChange;
     FILETIME PasswordMustChange;   
     RPC_UNICODE_STRING EffectiveName;
     RPC_UNICODE_STRING FullName;
     RPC_UNICODE_STRING LogonScript;
     RPC_UNICODE_STRING ProfilePath;
     RPC_UNICODE_STRING HomeDirectory;
     RPC_UNICODE_STRING HomeDirectoryDrive;
     USHORT LogonCount;
     USHORT BadPasswordCount;
     ULONG UserId;
     ULONG PrimaryGroupId;
     ULONG GroupCount;
     [size_is(GroupCount)]
     PGROUP_MEMBERSHIP GroupIds;
     ULONG UserFlags;
     USER_SESSION_KEY UserSessionKey;
     RPC_UNICODE_STRING LogonServer;
     RPC_UNICODE_STRING LogonDomainName;
     PRPC_SID LogonDomainId;
     ULONG Reserved1[2];
     ULONG UserAccountControl;
     ULONG Reserved3[7];
     ULONG SidCount;
     [size_is(SidCount)]
     PKERB_SID_AND_ATTRIBUTES ExtraSids;
     PRPC_SID ResourceGroupDomainSid;
     ULONG ResourceGroupCount;
     [size_is(ResourceGroupCount)]
     PGROUP_MEMBERSHIP ResourceGroupIds;
 } KERB_VALIDATION_INFO, *PKERB_VALIDATION_INFO;
  
 typedef struct _PAC_CREDENTIAL_INFO {
     ULONG Version;
     ULONG EncryptionType;
     [size_is(*)] UCHAR * SerializedData[];
 } PAC_CREDENTIAL_INFO, *PPAC_CREDENTIAL_INFO;
  
 typedef struct _PAC_CREDENTIAL_DATA {
     ULONG CredentialCount;
     [size_is(CredentialCount)] 
          SECPKG_SUPPLEMENTAL_CRED Credentials[*];
 } PAC_CREDENTIAL_DATA, *PPAC_CREDENTIAL_DATA;
  
 typedef struct _SECPKG_SUPPLEMENTAL_CRED {
     RPC_UNICODE_STRING PackageName;
     ULONG CredentialSize;
     [size_is(CredentialSize)]
     PUCHAR Credentials;
     [ignore] PNTLM_SUPPLEMENTAL_CREDENTIAL NtlmSupplementalCredential;
 } SECPKG_SUPPLEMENTAL_CRED, *PSECPKG_SUPPLEMENTAL_CRED;
  
 typedef struct _NTLM_SUPPLEMENTAL_CREDENTIAL {
     ULONG Version;
     ULONG Flags;
     UCHAR LmPassword[16];
     UCHAR NtPassword[16];
 } NTLM_SUPPLEMENTAL_CREDENTIAL, *PNTLM_SUPPLEMENTAL_CREDENTIAL;
  
 typedef struct _PAC_CLIENT_INFO {
     FILETIME ClientId;
     USHORT NameLength;
     [size_is(NameLength/2)] WCHAR * Name;
 } PAC_CLIENT_INFO, *PPAC_CLIENT_INFO;

 const ULONG SIGNATURE_TYPE_KERB_CHECKSUM_HMAC_MD5 = 0xFFFFFF76;
 const ULONG SIGNATURE_TYPE_HMAC_SHA1_96_AES128 = 0x0000000F;
 const ULONG SIGNATURE_TYPE_HMAC_SHA1_96_AES256 = 0x00000010;

 const ULONG PAC_WAS_REQUESTED = 0x00000001;
 const ULONG PAC_WAS_GIVEN_IMPLICITLY = 0x00000002;
  
 typedef struct _PAC_SIGNATURE_DATA {
     ULONG SignatureType;
     [size_is(SignatureType == SIGNATURE_TYPE_KERB_CHECKSUM_HMAC_MD5 ? 16 : 12)] UCHAR * Signature[];     // size is from the PAC_INFO_BUFFER - sizeof(ULONG)
 } PAC_SIGNATURE_DATA, *PPAC_SIGNATURE_DATA;
  
 typedef struct _S4U_DELEGATION_INFO {
     RPC_UNICODE_STRING S4U2proxyTarget;
     ULONG TransitedListSize;
     [size_is( TransitedListSize )]
     PRPC_UNICODE_STRING S4UTransitedServices;
 } S4U_DELEGATION_INFO, *PS4U_DELEGATION_INFO;
  
 typedef struct _UPN_DNS_INFO {
     USHORT UpnLength;
     USHORT UpnOffset;
     USHORT DnsDomainNameLength;
     USHORT DnsDomainNameOffset;
     ULONG Flags;
     [size_is(*)] BYTE * Raw[];
     [ignore] USHORT SamNameLength;
     [ignore] USHORT SamNameOffset;
     [ignore] USHORT SidLength;
     [ignore] USHORT SidOffset;
     [ignore] WCHAR * Upn[];
     [ignore] WCHAR * DnsDomainName[];
     [ignore] WCHAR * SamName[];
     [ignore] PRPC_SID Sid;
 } UPN_DNS_INFO, *PUPN_DNS_INFO;
  
 typedef struct _PAC_CLIENT_CLAIMS_INFO {
     PCLAIMS_SET_METADATA Claims;
 } PAC_CLIENT_CLAIMS_INFO, *PPAC_CLIENT_CLAIMS_INFO;
  
 typedef struct _PAC_DEVICE_INFO {
     ULONG UserId;
     ULONG PrimaryGroupId;
     PRPC_SID AccountDomainId;
     ULONG AccountGroupCount;
     [size_is(AccountGroupCount)] PGROUP_MEMBERSHIP AccountGroupIds;
     ULONG SidCount;
     [size_is(SidCount)] PKERB_SID_AND_ATTRIBUTES ExtraSids;
     ULONG DomainGroupCount;
     [size_is(DomainGroupCount)] PDOMAIN_GROUP_MEMBERSHIP DomainGroup;  
 } PAC_DEVICE_INFO, *PPAC_DEVICE_INFO;
  
 typedef struct _PAC_DEVICE_CLAIMS_INFO {
     PCLAIMS_SET_METADATA Claims;
 } PAC_DEVICE_CLAIMS_INFO, *PPAC_DEVICE_CLAIMS_INFO;
  
 typedef struct _PAC_ATTRIBUTES_INFO {
     ULONG FlagsLength;                  // specified in bits
     ULONG Flags;
 } PAC_ATTRIBUTES_INFO, *PPAC_ATTRIBUTES_INFO;
