Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

606 lines
17 KiB

//--------------------------------------------------------------
// Copyright (C) Microsoft Corporation, 1996 - 1997
//
// File: private.h
//
// Contents: The private include file for cryptext.dll.
//
// History: May-13-1999 xiaohs Created
//
//--------------------------------------------------------------
#ifndef CEP_PRIVATE_H
#define CEP_PRIVATE_H
#ifdef __cplusplus
extern "C" {
#endif
#define GET_TAG_OP "operation="
#define GET_TAG_MSG "&message="
#define GET_OP_CA "GetCACert"
#define GET_OP_PKI "PKIOperation"
#define CONTENT_TYPE_CA_RA "application/x-x509-ca-ra-cert"
#define CONTENT_TYPE_PKI "application/x-pki-message"
#define CONTENT_TYPE_HTML "text/html"
#define ACCESS_MESSAGE "401 You do not have permission to enroll for an IPSEC intermediate offline certificate template for SCEP"
#define OPERATION_GET_CACERT 1
#define OPERATION_GET_PKI 2
#define MESSAGE_TYPE_CERT_RESPONSE 3
#define MESSAGE_TYPE_CERT_REQUEST 19
#define MESSAGE_TYPE_GET_CERT_INITIAL 20
#define MESSAGE_TYPE_GET_CERT 21
#define MESSAGE_TYPE_GET_CRL 22
#define MESSAGE_STATUS_SUCCESS 0
#define MESSAGE_STATUS_FAILURE 2
#define MESSAGE_STATUS_PENDING 3
#define MESSAGE_FAILURE_BAD_ALG_ID 0
#define MESSAGE_FAILURE_BAD_MESSAGE_CHECK 1
#define MESSAGE_FAILURE_BAD_REQUEST 2
#define MESSAGE_FAILURE_BAD_TIME 3
#define MESSAGE_FAILURE_BAD_CERT_ID 4
#define CEP_CONTEXT_CERT 1
#define CEP_CONTEXT_CRL 2
//together we should have 6 attributes: TransactionID, MessageType, PkiStatus,
//ErrorInfo, senderNonce, and recipientNonce
#define CEP_RESPONSE_AUTH_ATTR_COUNT 6
#define szOIDVerisign_MessageType "2.16.840.1.113733.1.9.2"
#define szOIDVerisign_PkiStatus "2.16.840.1.113733.1.9.3"
#define szOIDVerisign_FailInfo "2.16.840.1.113733.1.9.4"
#define szOIDVerisign_SenderNonce "2.16.840.1.113733.1.9.5"
#define szOIDVerisign_RecipientNonce "2.16.840.1.113733.1.9.6"
#define szOIDVerisign_TransactionID "2.16.840.1.113733.1.9.7"
#define MAX_STRING_SIZE 512
#define PENDING_ALLOC_SIZE 20
#define FILETIME_TICKS_PER_SECOND 10000000
#define OVERLAP_TWO_WEEKS 60*60*24*14
#define OVERLAP_ONE_HOUR 60*60*1
#define CEP_REQUEST_SIGNATURE 0x01
#define CEP_REQUEST_EXCHANGE 0x02
#define CEP_TEMPLATE_ATTR L"CertificateTemplate:"
//-----------------------------------------------------------------------
// Externs
//
//------------------------------------------------------------------------
extern CRITICAL_SECTION CriticalSec;
extern CRITICAL_SECTION PasswordCriticalSec;
//need for the web page display
extern DWORD g_dwPasswordValidity;
//needed for the pending retrieval table
extern DWORD g_dwRequestDuration;
extern LPWSTR g_pwszComputerName;
//**************************************************************************
//
// The defines for the transactionID and requestID mapping table
//
struct _CEP_TIME_ENTRY;
//-----------------------------------------------------------------------
// CEP_HASH_ENTRY
//
//------------------------------------------------------------------------
typedef struct _CEP_HASH_ENTRY
{
LPSTR pszTransactionID;
DWORD dwRequestID;
BOOL fFinished;
_CEP_TIME_ENTRY *pTimeEntry;
_CEP_HASH_ENTRY *pNext;
_CEP_HASH_ENTRY *pPrevious;
}CEP_HASH_ENTRY;
//-----------------------------------------------------------------------
// CEP_TIME_ENTRY
//
//------------------------------------------------------------------------
typedef struct _CEP_TIME_ENTRY
{
FILETIME TimeStamp;
CEP_HASH_ENTRY *pHashEntry;
_CEP_TIME_ENTRY *pNext;
_CEP_TIME_ENTRY *pPrevious;
}CEP_TIME_ENTRY;
//-----------------------------------------------------------------------
// CEP_HASH_TABLE_INFO
//
//------------------------------------------------------------------------
//we hash based on the 1st byte
#define CEP_HASH_TABLE_SIZE 256
#define CEP_REFRESH_DAY 7
typedef struct _CEP_HASH_TABLE_INFO
{
CEP_HASH_ENTRY *rgHashEntry[CEP_HASH_TABLE_SIZE]; //the hash table
CEP_TIME_ENTRY *pTimeOld; //the list of hash entry with its timestamp
CEP_TIME_ENTRY *pTimeNew;
}CEP_HASH_TABLE_INFO;
//**************************************************************************
//
// The defines for the password hash table
//
//-----------------------------------------------------------------------
// CEP_PASSWORD_TABLE
//
//------------------------------------------------------------------------
#define CEP_PASSWORD_LENGTH 8
#define CEP_MAX_PASSWORD 1000
#define CEP_PASSWORD_VALIDITY 60 //in minutes
#define UPPER_BITS 0xF0
#define LOWER_BITS 0x0F
struct _CEP_PASSWORD_VALIDITY_ENTRY;
//-----------------------------------------------------------------------
// CEP_PASSWORD_ENTRY
//
//------------------------------------------------------------------------
typedef struct _CEP_PASSWORD_ENTRY
{
LPWSTR pwszPassword;
DWORD dwUsageRequested;
_CEP_PASSWORD_VALIDITY_ENTRY *pValidityEntry;
_CEP_PASSWORD_ENTRY *pNext;
_CEP_PASSWORD_ENTRY *pPrevious;
}CEP_PASSWORD_ENTRY;
//-----------------------------------------------------------------------
// CEP_PASSWORD_VALIDITY_ENTRY
//
//------------------------------------------------------------------------
typedef struct _CEP_PASSWORD_VALIDITY_ENTRY
{
FILETIME TimeStamp;
CEP_PASSWORD_ENTRY *pPasswordEntry;
_CEP_PASSWORD_VALIDITY_ENTRY *pNext;
_CEP_PASSWORD_VALIDITY_ENTRY *pPrevious;
}CEP_PASSWORD_VALIDITY_ENTRY;
//-----------------------------------------------------------------------
// CEP_PASSWORD_TABLE_INFO
//
//------------------------------------------------------------------------
typedef struct _CEP_PASSWORD_TABLE_INFO
{
CEP_PASSWORD_ENTRY *rgPasswordEntry[CEP_HASH_TABLE_SIZE]; //the hash table
CEP_PASSWORD_VALIDITY_ENTRY *pTimeOld; //the list of hash entry with its timestamp
CEP_PASSWORD_VALIDITY_ENTRY *pTimeNew;
}CEP_PASSWORD_TABLE_INFO;
//**************************************************************************
//
// The defines for the request hash table
//
//**************************************************************************
#define CEP_MD5_HASH_SIZE 16
#define CEP_REQUEST_DURATION 20
struct _CEP_REQUEST_VALIDITY_ENTRY;
//-----------------------------------------------------------------------
// CEP_REQUEST_ENTRY
//
//------------------------------------------------------------------------
typedef struct _CEP_REQUEST_ENTRY
{
BYTE pbHash[CEP_MD5_HASH_SIZE];
DWORD dwRequestID;
_CEP_REQUEST_VALIDITY_ENTRY *pValidityEntry;
_CEP_REQUEST_ENTRY *pNext;
_CEP_REQUEST_ENTRY *pPrevious;
}CEP_REQUEST_ENTRY;
//-----------------------------------------------------------------------
// CEP_REQUEST_VALIDITY_ENTRY
//
//------------------------------------------------------------------------
typedef struct _CEP_REQUEST_VALIDITY_ENTRY
{
FILETIME TimeStamp;
CEP_REQUEST_ENTRY *pRequestEntry;
_CEP_REQUEST_VALIDITY_ENTRY *pNext;
_CEP_REQUEST_VALIDITY_ENTRY *pPrevious;
}CEP_REQUEST_VALIDITY_ENTRY;
//-----------------------------------------------------------------------
// CEP_REQUEST_TABLE_INFO
//
//------------------------------------------------------------------------
typedef struct _CEP_REQUEST_TABLE_INFO
{
CEP_REQUEST_ENTRY *rgRequestEntry[CEP_HASH_TABLE_SIZE]; //the hash table
CEP_REQUEST_VALIDITY_ENTRY *pTimeOld; //the list of hash entry with its timestamp
CEP_REQUEST_VALIDITY_ENTRY *pTimeNew;
}CEP_REQUEST_TABLE_INFO;
//
// The defines for CA and RA message
//
//-----------------------------------------------------------------------
// CEP_CA_INFO
//
//------------------------------------------------------------------------
typedef struct _CEP_CA_INFO
{
BSTR bstrCAMachine;
BSTR bstrCAName;
BSTR bstrCAConfig;
BSTR bstrDSName;
LPWSTR pwszCAHash;
HCRYPTPROV hProv;
BOOL fEnterpriseCA;
ICertRequest *pICertRequest;
LPWSTR pwszTemplateSig;
LPWSTR pwszTemplateEnt;
}CEP_CA_INFO;
//-----------------------------------------------------------------------
// CEP_RA_INFO
//
//------------------------------------------------------------------------
typedef struct _CEP_RA_INFO
{
HCRYPTPROV hRAProv;
DWORD dwKeySpec;
PCCERT_CONTEXT pRACert;
PCCERT_CONTEXT pRASign;
BOOL fFree;
HCRYPTPROV hSignProv;
DWORD dwSignKeySpec;
BOOL fSignFree;
DWORD dwRefreshDays;
BOOL fPassword;
}CEP_RA_INFO;
//-----------------------------------------------------------------------
// CEP_MESSAGE_INFO
//
//------------------------------------------------------------------------
typedef struct _CEP_MESSAGE_INFO
{
CERT_BLOB TransactionID; //internally a string
DWORD dwMessageType;
DWORD dwStatus;
DWORD dwErrorInfo;
CERT_BLOB SenderNonce;
CERT_BLOB RecipientNonce;
CERT_BLOB SerialNumber;
PCCERT_CONTEXT pSigningCert;
}CEP_MESSAGE_INFO;
//-----------------------------------------------------------------------
//
// Function prototypes
//
//------------------------------------------------------------------------
BOOL WINAPI InitRequestTable();
BOOL WINAPI ReleaseRequestTable();
BOOL WINAPI CEPRequestRetrieveRequestIDFromHash(BYTE *pbHash,
DWORD *pdwRequestID);
BOOL WINAPI CEPRequestAddHashAndRequestID(BYTE *pbHash,
DWORD dwRequestID);
BOOL WINAPI InitPasswordTable();
BOOL WINAPI ReleasePasswordTable();
BOOL WINAPI CEPAddPasswordToTable(LPWSTR pwszPassword);
BOOL WINAPI CEPVerifyPasswordAndDeleteFromTable(LPWSTR pwszPassword, DWORD dwUsage);
BOOL InitHashTable();
BOOL ReleaseHashTable();
BOOL GetRAInfo(CEP_RA_INFO *pRAInfo);
BOOL GetCACertFromInfo(CEP_CA_INFO *pCAInfo, HCERTSTORE *pHCACertStore);
BOOL InitCAInformation(CEP_CA_INFO *pCAInfo);
BOOL FreeCAInformation(CEP_CA_INFO *pCAInfo);
BOOL FreeRAInformation(CEP_RA_INFO *pRAInfo);
LPSTR GetTagValue(LPSTR szString, LPSTR szTag);
BOOL OperationGetCACert(HCERTSTORE hCACertStore,
LPSTR szMsg,
BYTE **ppbData,
DWORD *pcbData);
BOOL OperationGetPKI( CEP_RA_INFO *pRAInfo,
CEP_CA_INFO *pCAInfo,
LPSTR szMsg,
BYTE **ppbData,
DWORD *pcbData);
BOOL WINAPI GetSerialNumberFromBlob(BYTE *pbEncoded,
DWORD cbEncoded,
CRYPT_INTEGER_BLOB *pSerialNumber);
BOOL GetReturnInfoAndContent(CEP_RA_INFO *pRAInfo,
CEP_CA_INFO *pCAInfo,
LPSTR szMsg,
BYTE **ppbData,
DWORD *pcbData,
CEP_MESSAGE_INFO *pMsgInfo);
BOOL WINAPI DecryptMsg(CEP_RA_INFO *pRAInfo,
BYTE *pbReqEnv,
DWORD cbReqEnv,
BYTE **ppbReqDecrypt,
DWORD *pcbReqDecrypt);
BOOL WINAPI GetContentFromPKCS7(BYTE *pbMessage,
DWORD cbMessage,
BYTE **ppbContent,
DWORD *pbContent,
CEP_MESSAGE_INFO *pMsgInfo);
void WINAPI FreeMessageInfo(CEP_MESSAGE_INFO *pMsgInfo);
BOOL WINAPI AllocAndCopyBlob(CERT_BLOB *pDestBlob,
CERT_BLOB *pSrcBlob);
BOOL WINAPI CEPAllocAndDecode( LPCSTR lpszStructType,
BYTE *pbEncoded,
DWORD cbEncoded,
void **ppb,
DWORD *pcb);
BOOL WINAPI CEPRetrievePasswordFromRequest(BYTE *pbRequest,
DWORD cbRequest,
LPWSTR *ppwszPassword,
DWORD *pdwUsage);
BOOL WINAPI AltNameExist(BYTE *pbRequest, DWORD cbRequest);
BOOL WINAPI SameCert(CERT_INFO *pCertInfoOne, CERT_INFO *pCertInfoTwo);
BOOL WINAPI SameBlob(CRYPT_INTEGER_BLOB *pBlobOne, CRYPT_INTEGER_BLOB *pBlobTwo);
BOOL EnvelopData(PCCERT_CONTEXT pSigningCert,
BYTE *pbContent,
DWORD cbContent,
BYTE **ppbEnvelop,
DWORD *pcbEnvelop);
BOOL CEPHashGetRequestID( DWORD dwRefreshDays,
CERT_BLOB *pTrasactionID,
DWORD *pdwRequestID);
BOOL CEPHashMarkTransactionFinished(DWORD dwRequestID, CERT_BLOB *pTransactionID);
BOOL CEPHashAddRequestAndTransaction(DWORD dwRefreshDays,
DWORD dwRequestID,
CERT_BLOB *pTransactionID);
BOOL CEPHashIsCurrentTimeEntry(FILETIME *pTimeStamp, DWORD dwRefreshDays, DWORD dwMinutes);
BOOL WINAPI ProcessGetCRL(CEP_CA_INFO *pCAInfo,
BYTE *pbRequest,
DWORD cbRequest,
BYTE **ppbData,
DWORD *pcbData,
CEP_MESSAGE_INFO *pMsgInfo);
BOOL WINAPI ProcessGetCert(CEP_CA_INFO *pCAInfo,
BYTE *pbRequest,
DWORD cbRequest,
BYTE **ppbData,
DWORD *pcbData,
CEP_MESSAGE_INFO *pMsgInfo);
BOOL ProcessCertInitial( DWORD dwRefreshDays,
CEP_CA_INFO *pCAInfo,
BYTE *pbRequest,
DWORD cbRequest,
BYTE **ppbData,
DWORD *pcbData,
CEP_MESSAGE_INFO *pMsgInfo);
BOOL ProcessCertRequest( DWORD dwRefreshDays,
BOOL fPassword,
PCCERT_CONTEXT pRAEncrypt,
PCCERT_CONTEXT pRACert,
CEP_CA_INFO *pCAInfo,
BYTE *pbRequest,
DWORD cbRequest,
BYTE **ppbData,
DWORD *pcbData,
CEP_MESSAGE_INFO *pMsgInfo);
BOOL PackageBlobToPKCS7(DWORD dwCEP_Context,
BYTE *pbEncoded,
DWORD cbEncoded,
BYTE **ppbData,
DWORD *pcbData);
BOOL GenerateSenderNonce(CRYPT_INTEGER_BLOB *pBlob);
BOOL SignData(CEP_MESSAGE_INFO *pMsgInfo,
CEP_RA_INFO *pRAInfo,
BYTE *pbEnvelop,
DWORD cbEnvelop,
BYTE **ppbData,
DWORD *pcbData);
BOOL CEPAllocAndEncodeName(DWORD dwValueType,
BYTE *pbData,
DWORD cbData,
BYTE **ppbEncoded,
DWORD *pcbEncoded);
BOOL CEPAllocAndEncodeDword(DWORD dwValueType,
DWORD dwData,
BYTE **ppbEncoded,
DWORD *pcbEncoded);
BOOL WINAPI CEPAllocAndEncode(LPCSTR lpszStructType,
void *pStructInfo,
BYTE **ppbEncoded,
DWORD *pcbEncoded);
BOOL WINAPI AddAltNameInRequest(PCCERT_CONTEXT pRACert,
BYTE *pb10,
DWORD cb10,
LPWSTR pwszDNS,
CRYPT_DATA_BLOB *pIPAddress,
BYTE **ppb7,
DWORD *pcb7);
BOOL WINAPI CreateAltNameExtenions(LPWSTR pwszDNS,
CRYPT_DATA_BLOB *pIPAddress,
BYTE **pbExt,
DWORD *pcbExt);
BOOL WINAPI GetAltNameElement(BYTE *pb10,
DWORD cb10,
LPWSTR *ppwszDNS,
CRYPT_DATA_BLOB *pIPAddress);
BOOL ConvertIPStringToBinary(LPWSTR pwszIP,
CRYPT_DATA_BLOB *pIPAddress);
BOOL WINAPI AllocAndCopyString(CERT_BLOB *pDestBlob,
LPSTR psz);
BOOL WINAPI RetrieveContextFromSerialNumber(CEP_CA_INFO *pCAInfo,
CERT_BLOB *pSerialNumber,
PCCERT_CONTEXT *ppCertContext);
BOOL WINAPI GetConfigInfo(DWORD *pdwRefreshDays, BOOL *pfPassword);
BOOL CEPGetTokenFromPKCS10(BOOL fPassword,
PCCERT_CONTEXT pRAEncrypt,
BYTE *pbRequest,
DWORD cbRequest,
HANDLE *phToken);
BOOL GetLogonInfoFromValue(PCCERT_CONTEXT pRAEncrypt,
LPWSTR pwszString,
LPWSTR *ppwszDomain,
LPWSTR *ppwszUser,
LPWSTR *ppwszPassword);
BOOL CEPDecryptPassword(PCCERT_CONTEXT pRAEncrypt,
LPWSTR pwszEncrypt,
LPWSTR *ppwszDecrypt);
BOOL WINAPI IsAnonymousAccess(EXTENSION_CONTROL_BLOCK *pECB);
HRESULT WINAPI CheckACLOnCertTemplate(BOOL fSelf, LPWSTR pwszCAName, LPWSTR pwszCertType);
BOOL WINAPI OperationDisplayAccessHTML(BYTE **ppbData, DWORD *pcbData);
BOOL WINAPI OperationGetDisplayInfoForCEP(LPWSTR pwszCAHash,
HCRYPTPROV hProv,
BOOL fPassword,
BYTE **ppbData,
DWORD *pcbData);
BOOL WINAPI LoadIDToTemplate(UINT idsMsg,
BYTE **ppbData,
DWORD *pcbData);
BOOL WINAPI LoadWZToTemplate(LPWSTR pwsz,
BYTE **ppbData,
DWORD *pcbData);
BOOL WINAPI FormatMessageUnicode(LPWSTR *ppwszFormat,UINT ids,...);
BOOL WINAPI CopyWZToBuffer( LPWSTR pwszData,
BYTE **ppbData,
DWORD *pcbData);
BOOL WINAPI LoadIDAndHRToTempalte(UINT idsMsg,
HRESULT hr,
BYTE **ppbData,
DWORD *pcbData);
BOOL WINAPI ConvertByteToWstr(BYTE *pbData,
DWORD cbData,
LPWSTR *ppwsz,
BOOL fSpace);
BOOL WINAPI CEPGetCertFromPKCS10(CEP_CA_INFO *pCAInfo,
BYTE *pbRequest,
DWORD cbRequest,
BYTE **ppbData,
DWORD *pcbData,
CEP_MESSAGE_INFO *pMsgInfo);
void WINAPI LogSCEPEvent(IN DWORD dwLogLevel,
IN BOOL fError,
IN HRESULT hr,
IN DWORD dwEventId,
IN DWORD dwParamCount,
...
);
#ifdef __cplusplus
} // Balance extern "C" above
#endif
#endif //CEP_PRIVATE_H