xbox-kernel/public/sdk/inc/mssip.h
2020-09-30 17:17:25 +02:00

443 lines
19 KiB
C

//+-------------------------------------------------------------------------
//
// Microsoft Windows - Internet Security
//
// Copyright (C) Microsoft Corporation, 1996 - 1997
//
// File: mssip.h
//
// Contents: Microsoft SIP Provider Main Include File
//
// History: 19-Feb-1997 pberkman Created
//
//--------------------------------------------------------------------------
#ifndef MSSIP_H
#define MSSIP_H
#ifdef __cplusplus
extern "C"
{
#endif
#pragma pack (8)
typedef CRYPT_HASH_BLOB CRYPT_DIGEST_DATA;
//
// dwflags
//
#define MSSIP_FLAGS_PROHIBIT_RESIZE_ON_CREATE 0x00010000
#define MSSIP_FLAGS_USE_CATALOG 0x00020000
#define SPC_INC_PE_RESOURCES_FLAG 0x80
#define SPC_INC_PE_DEBUG_INFO_FLAG 0x40
#define SPC_INC_PE_IMPORT_ADDR_TABLE_FLAG 0x20
//////////////////////////////////////////////////////////////////////////////
//
// SIP_SUBJECTINFO
//----------------------------------------------------------------------------
// pass this structure to all defined SIPs. Make sure to initialize
// the ENTIRE structure to binary zero before the FIRST call is made. Do
// not initialize it BETWEEN calls!
//
typedef struct SIP_SUBJECTINFO_
{
DWORD cbSize; // set to sizeof(SIP_SUBJECTINFO)
GUID *pgSubjectType; // subject type
HANDLE hFile; // set to File handle that represents the subject
// set to INVALID_HANDLE VALUE to allow
// SIP to use pwsFileName for persistent
// storage types (will handle open/close)
LPCWSTR pwsFileName; // set to file name
LPCWSTR pwsDisplayName; // optional: set to display name of
// subject.
DWORD dwReserved1; // do not use!
DWORD dwIntVersion; // DO NOT SET OR CLEAR THIS.
// This member is used by the sip for
// passing the internal version number
// between the ..get and verify... functions.
HCRYPTPROV hProv;
CRYPT_ALGORITHM_IDENTIFIER DigestAlgorithm;
DWORD dwFlags;
DWORD dwEncodingType;
DWORD dwReserved2; // do not use!
DWORD fdwCAPISettings; // setreg settings
DWORD fdwSecuritySettings; // IE security settings
DWORD dwIndex; // message index of last "Get"
DWORD dwUnionChoice;
# define MSSIP_ADDINFO_NONE 0
# define MSSIP_ADDINFO_FLAT 1
# define MSSIP_ADDINFO_CATMEMBER 2
# define MSSIP_ADDINFO_BLOB 3
# define MSSIP_ADDINFO_NONMSSIP 500 // everything < is reserved by MS.
union
{
struct MS_ADDINFO_FLAT_ *psFlat;
struct MS_ADDINFO_CATALOGMEMBER_ *psCatMember;
struct MS_ADDINFO_BLOB_ *psBlob;
};
LPVOID pClientData; // data pased in from client to SIP
} SIP_SUBJECTINFO, *LPSIP_SUBJECTINFO;
//////////////////////////////////////////////////////////////////////////////
//
// MS_ADDINFO_FLAT
//----------------------------------------------------------------------------
// Flat or End-To-End types
// needed for flat type files during indirect calls
// "Digest" of file.
//
typedef struct MS_ADDINFO_FLAT_
{
DWORD cbStruct;
struct SIP_INDIRECT_DATA_ *pIndirectData;
} MS_ADDINFO_FLAT, *PMS_ADDINFO_FLAT;
//////////////////////////////////////////////////////////////////////////////
//
// MS_ADDINFO_CATALOGMEMBER
//----------------------------------------------------------------------------
// Catalog Member verification.
//
typedef struct MS_ADDINFO_CATALOGMEMBER_
{
DWORD cbStruct; // = sizeof(MS_ADDINFO_CATALOGMEMBER)
struct CRYPTCATSTORE_ *pStore; // defined in mscat.h
struct CRYPTCATMEMBER_ *pMember; // defined in mscat.h
} MS_ADDINFO_CATALOGMEMBER, *PMS_ADDINFO_CATALOGMEMBER;
//////////////////////////////////////////////////////////////////////////////
//
// MS_ADDINFO_BLOB
//----------------------------------------------------------------------------
// Memory "blob" verification.
//
typedef struct MS_ADDINFO_BLOB_
{
DWORD cbStruct;
DWORD cbMemObject;
BYTE *pbMemObject;
DWORD cbMemSignedMsg;
BYTE *pbMemSignedMsg;
} MS_ADDINFO_BLOB, *PMS_ADDINFO_BLOB;
//////////////////////////////////////////////////////////////////////////////
//
// SIP_INDIRECT_DATA
//----------------------------------------------------------------------------
// Indirect data structure is used to store the hash of the subject
// along with data that is relevant to the subject. This can include
// names etc.
//
typedef struct SIP_INDIRECT_DATA_
{
CRYPT_ATTRIBUTE_TYPE_VALUE Data; // Encoded attribute
CRYPT_ALGORITHM_IDENTIFIER DigestAlgorithm; // Digest algorithm used to hash
CRYPT_HASH_BLOB Digest; // Hash of subject
} SIP_INDIRECT_DATA, *PSIP_INDIRECT_DATA;
#pragma pack()
//////////////////////////////////////////////////////////////////////////////
//
// CryptSIPGetSignedDataMsg
//----------------------------------------------------------------------------
// Returns the message specified by the index count. Data, specific to
// the subject is passed in through pSubjectInfo. To retrieve the
// size of the signature, set pbData to NULL.
//
// Returns:
// TRUE: No fatal errors
// FALSE: Errors occured. See GetLastError()
//
// Last Errors:
// ERROR_NOT_ENOUGH_MEMORY: error allocating memory
// TRUST_E_SUBJECT_FORM_UNKNOWN: unknown subject type.
// ERROR_INVALID_PARAMETER: bad argument passed in
// ERROR_BAD_FORMAT: file/data format is not correct
// for the requested SIP.
// CRYPT_E_NO_MATCH: the signature could not be found
// based on the dwIndex provided.
// ERROR_INSUFFICIENT_BUFFER: the pbSignedDataMsg was not big
// enough to hold the data. pcbSignedDataMsg
// contains the required size.
//
extern BOOL WINAPI CryptSIPGetSignedDataMsg(
IN SIP_SUBJECTINFO *pSubjectInfo,
OUT DWORD *pdwEncodingType,
IN DWORD dwIndex,
IN OUT DWORD *pcbSignedDataMsg,
OUT BYTE *pbSignedDataMsg);
typedef BOOL (WINAPI * pCryptSIPGetSignedDataMsg)(
IN SIP_SUBJECTINFO *pSubjectInfo,
OUT DWORD *pdwEncodingType,
IN DWORD dwIndex,
IN OUT DWORD *pcbSignedDataMsg,
OUT BYTE *pbSignedDataMsg);
//////////////////////////////////////////////////////////////////////////////
//
// CryptSIPPuttSignedDataMsg
//----------------------------------------------------------------------------
// Adds a signature to the subject. The index that it was
// stored with is returned for future reference.
//
// Returns:
// TRUE: No fatal errors
// FALSE: Errors occured. See GetLastError()
//
// Last Errors:
// ERROR_NOT_ENOUGH_MEMORY: error allocating memory
// TRUST_E_SUBJECT_FORM_UNKNOWN: unknown subject type.
// CRYPT_E_BAD_LEN: the length specified in
// psData->dwSignature was
// insufficient.
// CRYPT_E_NO_MATCH: could not find the specified index
// ERROR_INVALID_PARAMETER: bad argument passed in
// ERROR_BAD_FORMAT: file/data format is not correct
// for the requested SIP.
// CRYPT_E_FILERESIZED: returned when signing a fixed-length
// file (e.g.: CABs) and the message
// is larger than the pre-allocated
// size. The 'put' function will re-
// size the file and return this error.
// The CreateIndirect function MUST be
// called again to recalculate the
// indirect data (hash). Then, call the
// 'put' function again.
//
extern BOOL WINAPI CryptSIPPutSignedDataMsg(
IN SIP_SUBJECTINFO *pSubjectInfo,
IN DWORD dwEncodingType,
OUT DWORD *pdwIndex,
IN DWORD cbSignedDataMsg,
IN BYTE *pbSignedDataMsg);
typedef BOOL (WINAPI * pCryptSIPPutSignedDataMsg)(
IN SIP_SUBJECTINFO *pSubjectInfo,
IN DWORD dwEncodingType,
OUT DWORD *pdwIndex,
IN DWORD cbSignedDataMsg,
IN BYTE *pbSignedDataMsg);
//////////////////////////////////////////////////////////////////////////////
//
// CryptSIPCreateIndirectData
//----------------------------------------------------------------------------
// Returns a PSIP_INDIRECT_DATA structure filled in the hash, digest alogrithm
// and an encoded attribute. If pcIndirectData points to a DWORD and
// psIndirect data points to null the the size of the data should be returned
// in pcIndirectData.
//
// Returns:
// TRUE: No fatal errors
// FALSE: Errors occured. See GetLastError()
//
// Last Errors:
// NTE_BAD_ALGID: Bad Algorithm Identifyer
// ERROR_NOT_ENOUGH_MEMORY: error allocating memory
// TRUST_E_SUBJECT_FORM_UNKNOWN: unknown subject type.
// ERROR_INVALID_PARAMETER: bad argument passed in
// ERROR_BAD_FORMAT: file/data format is not correct
// for the requested SIP.
//
extern BOOL WINAPI CryptSIPCreateIndirectData(
IN SIP_SUBJECTINFO *pSubjectInfo,
IN OUT DWORD *pcbIndirectData,
OUT SIP_INDIRECT_DATA *pIndirectData);
typedef BOOL (WINAPI * pCryptSIPCreateIndirectData)(
IN SIP_SUBJECTINFO *pSubjectInfo,
IN OUT DWORD *pcbIndirectData,
OUT SIP_INDIRECT_DATA *pIndirectData);
//////////////////////////////////////////////////////////////////////////////
//
// CryptSIPVerifyIndirectData
//----------------------------------------------------------------------------
// Takes the information stored in the indirect data and compares it to the
// subject.
//
// Returns:
// TRUE: No fatal errors
// FALSE: Errors occured. See GetLastError()
//
// Last Errors:
// NTE_BAD_ALGID: Bad Algorithm Identifyer
// ERROR_NOT_ENOUGH_MEMORY: error allocating memory
// TRUST_E_SUBJECT_FORM_UNKNOWN: unknown subject type.
// CRYPT_E_NO_MATCH: could not find the specified index
// CRYPT_E_SECURITY_SETTINGS: due to security settings, the file
// was not verified.
// ERROR_INVALID_PARAMETER: bad argument passed in
// ERROR_BAD_FORMAT: file/data format is not correct
// for the requested SIP.
extern BOOL WINAPI CryptSIPVerifyIndirectData(
IN SIP_SUBJECTINFO *pSubjectInfo,
IN SIP_INDIRECT_DATA *pIndirectData);
typedef BOOL (WINAPI * pCryptSIPVerifyIndirectData)(
IN SIP_SUBJECTINFO *pSubjectInfo,
IN SIP_INDIRECT_DATA *pIndirectData);
//////////////////////////////////////////////////////////////////////////////
//
// CryptSIPRemoveSignedDataMsg
//----------------------------------------------------------------------------
// Removes the signature at the specified index
//
// Returns:
// TRUE: No fatal errors
// FALSE: Errors occured. See GetLastError()
//
// Last Errors:
// TRUST_E_SUBJECT_FORM_UNKNOWN: unknown subject type.
// CRYPT_E_NO_MATCH: could not find the specified index
// ERROR_INVALID_PARAMETER: bad argument passed in
// ERROR_BAD_FORMAT: file/data format is not correct
// for the requested SIP.
//
extern BOOL WINAPI CryptSIPRemoveSignedDataMsg(
IN SIP_SUBJECTINFO *pSubjectInfo,
IN DWORD dwIndex);
typedef BOOL (WINAPI * pCryptSIPRemoveSignedDataMsg)(
IN SIP_SUBJECTINFO *pSubjectInfo,
IN DWORD dwIndex);
#pragma pack(8)
//////////////////////////////////////////////////////////////////////////////
//
// SIP_DISPATCH_INFO
//----------------------------------------------------------------------------
//
typedef struct SIP_DISPATCH_INFO_
{
DWORD cbSize; // = sizeof(SIP_DISPATCH_INFO)
HANDLE hSIP; // used internal
pCryptSIPGetSignedDataMsg pfGet;
pCryptSIPPutSignedDataMsg pfPut;
pCryptSIPCreateIndirectData pfCreate;
pCryptSIPVerifyIndirectData pfVerify;
pCryptSIPRemoveSignedDataMsg pfRemove;
} SIP_DISPATCH_INFO, *LPSIP_DISPATCH_INFO;
//
// the sip exports this function to allow verification and signing
// processes to pass in the file handle and check if the sip supports
// this type of file. if it does, the sip will return TRUE and fill
// out the pgSubject with the appropiate GUID.
//
typedef BOOL (WINAPI *pfnIsFileSupported)(IN HANDLE hFile,
OUT GUID *pgSubject);
typedef BOOL (WINAPI *pfnIsFileSupportedName)(IN WCHAR *pwszFileName,
OUT GUID *pgSubject);
typedef struct SIP_ADD_NEWPROVIDER_
{
DWORD cbStruct;
GUID *pgSubject;
WCHAR *pwszDLLFileName;
WCHAR *pwszMagicNumber; // optional
WCHAR *pwszIsFunctionName; // optiona: pfnIsFileSupported
WCHAR *pwszGetFuncName;
WCHAR *pwszPutFuncName;
WCHAR *pwszCreateFuncName;
WCHAR *pwszVerifyFuncName;
WCHAR *pwszRemoveFuncName;
WCHAR *pwszIsFunctionNameFmt2; // optiona: pfnIsFileSupported
} SIP_ADD_NEWPROVIDER, *PSIP_ADD_NEWPROVIDER;
#define SIP_MAX_MAGIC_NUMBER 4
#pragma pack()
//////////////////////////////////////////////////////////////////////////////
//
// CryptLoadSIP
//----------------------------------------------------------------------------
//
// Returns:
// TRUE: No fatal errors
// FALSE: Errors occured. See GetLastError()
//
extern BOOL WINAPI CryptSIPLoad(IN const GUID *pgSubject, // GUID for the requried sip
IN DWORD dwFlags, // Reserved - MUST BE ZERO
IN OUT SIP_DISPATCH_INFO *pSipDispatch); // Table of functions
//////////////////////////////////////////////////////////////////////////////
//
// CryptSIPRetrieveSubjectGuid (defined in crypt32.dll)
//----------------------------------------------------------------------------
// looks at the file's "Magic Number" and tries to determine which
// SIP's object ID is right for the file type.
//
// NOTE: This function only supports the MSSIP32.DLL set of SIPs.
//
// Returns:
// TRUE: No fatal errors
// FALSE: Errors occured. See GetLastError()
//
extern BOOL WINAPI CryptSIPRetrieveSubjectGuid(IN LPCWSTR FileName, // wide file name
IN OPTIONAL HANDLE hFileIn, // or handle of open file
OUT GUID *pgSubject); // defined SIP's GUID
//////////////////////////////////////////////////////////////////////////////
//
// CryptSIPAddProvider
//----------------------------------------------------------------------------
//
// Returns:
// TRUE: No fatal errors
// FALSE: Errors occured. See GetLastError()
//
extern BOOL WINAPI CryptSIPAddProvider(IN SIP_ADD_NEWPROVIDER *psNewProv);
//////////////////////////////////////////////////////////////////////////////
//
// CryptSIPRemoveProvider
//----------------------------------------------------------------------------
//
// Returns:
// TRUE: No fatal errors
// FALSE: Errors occured. See GetLastError()
//
extern BOOL WINAPI CryptSIPRemoveProvider(IN GUID *pgProv);
#ifdef __cplusplus
}
#endif
#endif // MSSIP_H