windows-nt/Source/XPSP1/NT/ds/security/inc/pac.hxx
2020-09-26 16:20:57 +08:00

183 lines
4.2 KiB
C++

//+-----------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (c) Microsoft Corporation 1991 - 1995
//
// File: pac.hxx
//
// Contents: internal structures and definitions for PACs
//
//
// History: 24-May-95 SuChang Created
//
//------------------------------------------------------------------------
#ifndef __PAC_HXX__
#define __PAC_HXX__
extern "C" {
#include <samrpc.h>
#include <logonmsv.h>
#include <samisrv.h>
}
//
// Type Tags for the PAC_INFO_BUFFER that specify one of the three
// structures below.
//
#define PAC_LOGON_INFO 1 // NDR encoded NETLOGON_SAM_VALIDATION_INFO3
#define PAC_CREDENTIAL_TYPE 2 // supp. credentials
#define PAC_SERVER_CHECKSUM 6 // Signature by server
#define PAC_PRIVSVR_CHECKSUM 7 // Signature by privsvr
#define PAC_CLIENT_INFO_TYPE 10 // client name & ticket id
//
// The offset is to use for transmitting, the pointer is for in-memory
// use
//
typedef struct _PAC_INFO_BUFFER {
ULONG ulType;
ULONG cbBufferSize;
union {
PBYTE Data;
ULONG64 Offset;
};
} PAC_INFO_BUFFER, *PPAC_INFO_BUFFER;
typedef struct _PACTYPE {
ULONG cBuffers;
ULONG Version; // for padding
PAC_INFO_BUFFER Buffers[ANYSIZE_ARRAY];
} PACTYPE, *PPACTYPE;
#define PAC_VERSION 0
//
// A PAC may also contain a signature from the KDC. This is used for
// PAC_SERVER_CHECKSUM and PAC_PRIVSVR_CHECKSUM.
//
#include <pshpack1.h>
typedef struct _PAC_SIGNATURE_DATA {
ULONG SignatureType;
UCHAR Signature[ANYSIZE_ARRAY]; // size is from the PAC_INFO_BUFFER - sizeof(ULONG)
} PAC_SIGNATURE_DATA, *PPAC_SIGNATURE_DATA;
#include <poppack.h>
#define PAC_SIGNATURE_SIZE(_x_) (FIELD_OFFSET(PAC_SIGNATURE_DATA, Signature) + (_x_))
#define PAC_CHECKSUM_SIZE(_x_) ((_x_) - FIELD_OFFSET(PAC_SIGNATURE_DATA, Signature))
//
// This type is NDR encoded
//
#ifndef PAC_CREDENTIAL_DATA_DEFINED
#define PAC_CREDENTIAL_DATA_DEFINED
typedef struct _PAC_CREDENTIAL_DATA {
ULONG CredentialCount;
SECPKG_SUPPLEMENTAL_CRED Credentials[ANYSIZE_ARRAY];
} PAC_CREDENTIAL_DATA, *PPAC_CREDENTIAL_DATA;
#endif
#include <pshpack1.h>
typedef struct _PAC_CREDENTIAL_INFO {
ULONG Version;
ULONG EncryptionType;
UCHAR Data[ANYSIZE_ARRAY];
} PAC_CREDENTIAL_INFO, *PPAC_CREDENTIAL_INFO;
typedef struct _PAC_CLIENT_INFO {
TimeStamp ClientId;
USHORT NameLength;
WCHAR Name[ANYSIZE_ARRAY];
} PAC_CLIENT_INFO, *PPAC_CLIENT_INFO;
#include <poppack.h>
ULONG PAC_GetSize( IN PACTYPE *pPac );
ULONG PAC_Marshal( IN PACTYPE *pPac,
IN ULONG cbBuffer,
OUT PBYTE pBuffer);
ULONG
PAC_UnMarshal(
IN PPACTYPE pBuffer,
ULONG cbSize
);
BOOLEAN
PAC_ReMarshal( IN PPACTYPE pPac,
IN ULONG cbSize );
NTSTATUS
PAC_Init(
IN PSAMPR_USER_ALL_INFORMATION UserAll,
IN OPTIONAL PSAMPR_GET_GROUPS_BUFFER GroupsBuffer,
IN OPTIONAL PSID_AND_ATTRIBUTES_LIST ExtraGroups,
IN PSID LogonDomainId,
IN PUNICODE_STRING LogonDomainName,
IN PUNICODE_STRING LogonServer,
IN ULONG SignatureSize,
IN ULONG AdditionalDataCount,
IN PPAC_INFO_BUFFER * AdditionalData,
OUT PACTYPE ** ppPac
);
NTSTATUS
PAC_InitAndUpdateGroups(
IN PNETLOGON_VALIDATION_SAM_INFO3 OldValidationInfo,
IN PSAMPR_PSID_ARRAY ResourceGroups,
IN PPACTYPE OldPac,
OUT PACTYPE ** ppPac
);
PPAC_INFO_BUFFER
PAC_Find( IN PPACTYPE pPac,
IN ULONG ulType,
IN PPAC_INFO_BUFFER pElem);
NTSTATUS
PAC_UnmarshallValidationInfo(
OUT PNETLOGON_VALIDATION_SAM_INFO3 * ValidationInfo,
IN PBYTE MarshalledInfo,
OUT ULONG ValidationInfoSize
);
NTSTATUS
PAC_BuildCredentials(
IN PSAMPR_USER_ALL_INFORMATION UserAll,
OUT PBYTE * Credentials,
OUT PULONG CredentialSize
);
NTSTATUS
PAC_UnmarshallCredentials(
OUT PSECPKG_SUPPLEMENTAL_CRED_ARRAY * Credentials,
IN PBYTE MarshalledInfo,
OUT ULONG CredentialInfoSize
);
NTSTATUS
PAC_EncodeCredentialData(
IN PSECPKG_SUPPLEMENTAL_CRED_ARRAY CredentialData,
OUT PBYTE * EncodedData,
OUT PULONG DataSize
);
#include <pac2.hxx>
#endif // __PAC_HXX__