windows-nt/Source/XPSP1/NT/ds/security/cryptoapi/pkisign/mssign32/signhlp.h
2020-09-26 16:20:57 +08:00

474 lines
16 KiB
C

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1999
//
// File: signhlp.h
//
// Contents: Digital Signing Helper APIs
//
// History: June-25-1997 Xiaohs Created
//----------------------------------------------------------------------------
#ifndef _SIGNHLP_H
#define _SIGNHLP_H
#ifdef __cplusplus
extern "C" {
#endif
//--------------------------------------------------------------------------
//
// Copy all the certs from store name to hDescStore
//
//--------------------------------------------------------------------------
HRESULT MoveStoreName(HCRYPTPROV hCryptProv,
DWORD dwCertEncodingType,
HCERTSTORE hDescStore,
DWORD dwStoreName,
DWORD dwStoreFlag);
//--------------------------------------------------------------------------
//
// Copy all the certs from hSrcStore to hDescStore
//
//--------------------------------------------------------------------------
HRESULT MoveStore(HCERTSTORE hDescStore,
HCERTSTORE hSrcStore);
//--------------------------------------------------------------------------
//
// Build up the certificate chain. Put the whole chain to the store
//
//
//--------------------------------------------------------------------------
HRESULT BuildCertChain(HCRYPTPROV hCryptProv,
DWORD dwCertEncodingType,
HCERTSTORE hStore,
HCERTSTORE hOptionalStore,
PCCERT_CONTEXT pSigningCert,
DWORD dwCertPolicy);
//+-------------------------------------------------------------------------
// Build the spc certificate store from the cert chain
//--------------------------------------------------------------------------
HRESULT BuildStoreFromStore(HCRYPTPROV hPvkProv,
DWORD dwKeySpec,
HCRYPTPROV hCryptProv,
DWORD dwCertEncodingType,
SIGNER_CERT_STORE_INFO *pCertStoreInfo,
HCERTSTORE *phSpcStore,
PCCERT_CONTEXT *ppSignCert);
//+-------------------------------------------------------------------------
// Build the spc certificate store from a spc file
//--------------------------------------------------------------------------
HRESULT BuildStoreFromSpcFile(HCRYPTPROV hPvkProv,
DWORD dwKeySpec,
HCRYPTPROV hCryptProv,
DWORD dwCertEncodingType,
LPCWSTR pwszSpcFile,
HCERTSTORE *phSpcStore,
PCCERT_CONTEXT *ppSignCert);
//+-------------------------------------------------------------------------
// Build the spc certificate store from either a spc file or the
// cert chain
//--------------------------------------------------------------------------
HRESULT BuildCertStore(HCRYPTPROV hPvkProv,
DWORD dwKeySpec,
HCRYPTPROV hCryptProv,
DWORD dwCertEncodingType,
SIGNER_CERT *pSignerCert,
HCERTSTORE *phSpcStore,
PCCERT_CONTEXT *ppSigningCert);
//-----------------------------------------------------------------------------
//
// Parse the private key information from a pCertContext's property
// CERT_PVK_FILE_PROP_ID
//
//----------------------------------------------------------------------------
BOOL GetProviderInfoFromCert(PCCERT_CONTEXT pCertContext,
CRYPT_KEY_PROV_INFO *pKeyProvInfo);
//+-------------------------------------------------------------------------
// Get hCryptProv handle and key spec for the certificate
//--------------------------------------------------------------------------
BOOL WINAPI GetCryptProvFromCert(
HWND hwnd,
PCCERT_CONTEXT pCert,
HCRYPTPROV *phCryptProv,
DWORD *pdwKeySpec,
BOOL *pfDidCryptAcquire,
LPWSTR *ppwszTmpContainer,
LPWSTR *ppwszProviderName,
DWORD *pdwProviderType
);
//This is a subst of GetCryptProvFromCert. This function does not consider
//the private key file property of the certificate
BOOL WINAPI CryptProvFromCert(
HWND hwnd,
PCCERT_CONTEXT pCert,
HCRYPTPROV *phCryptProv,
DWORD *pdwKeySpec,
BOOL *pfDidCryptAcquire
);
//+-------------------------------------------------------------------------
// Free hCryptProv handle and key spec for the certificate
//--------------------------------------------------------------------------
void WINAPI FreeCryptProvFromCert(BOOL fAcquired,
HCRYPTPROV hProv,
LPWSTR pwszCapiProvider,
DWORD dwProviderType,
LPWSTR pwszTmpContainer);
//+-----------------------------------------------------------------------
// Check the input parameters of Signcode. Make sure they are valid.
//
//+-----------------------------------------------------------------------
BOOL CheckSigncodeParam(
SIGNER_SUBJECT_INFO *pSubjectInfo,
SIGNER_CERT *pSignerCert,
SIGNER_SIGNATURE_INFO *pSignatureInfo,
SIGNER_PROVIDER_INFO *pProviderInfo);
//+-----------------------------------------------------------------------
// Check the SIGNER_SUBJECT_INFO
//
//+-----------------------------------------------------------------------
BOOL CheckSigncodeSubjectInfo(
PSIGNER_SUBJECT_INFO pSubjectInfo);
//+-----------------------------------------------------------------------
//
//
// Parameters:
// Return Values:
// Error Codes:
//
//------------------------------------------------------------------------
HRESULT WINAPI
AddTimeStampSubj(IN DWORD dwEncodingType,
IN HCRYPTPROV hCryptProv,
IN LPSIP_SUBJECTINFO pSipInfo,
IN DWORD *pdwIndex,
IN PBYTE pbTimeStampResponse,
IN DWORD cbTimeStampResponse,
IN PBYTE pbEncodedSignerInfo,
IN DWORD cbEncodedSignerInfo,
OUT PBYTE* ppbMessage,
OUT DWORD* pcbMessage);
//+-----------------------------------------------------------------------
//
//
// Parameters:
// Return Values:
// Error Codes:
//
//------------------------------------------------------------------------
HRESULT WINAPI
GetSignedMessageDigest(IN SIGNER_SUBJECT_INFO *pSubjectInfo, //Required: The subject based on which to create a timestamp request
IN LPVOID pSipData,
IN OUT PBYTE* ppbDigest,
IN OUT DWORD* pcbDigest);
//+-----------------------------------------------------------------------
//
//
// Parameters:
// Return Values:
// Error Codes:
//
//------------------------------------------------------------------------
HRESULT WINAPI
GetSignedMessageDigestSubj(IN DWORD dwEncodingType,
IN HCRYPTPROV hCryptProv,
IN struct SIP_SUBJECTINFO_ *pSipInfo, // SIP information
IN DWORD* pdwIndex,
IN OUT PBYTE* ppbTimeDigest,
IN OUT DWORD* pcbTimeDigest);
//+-----------------------------------------------------------------------
//
//
// Parameters:
// Return Values:
// Error Codes:
//
//------------------------------------------------------------------------
HRESULT WINAPI
TimeStampRequest(IN DWORD dwEncodingType,
IN PCRYPT_ATTRIBUTES psRequest,
IN PBYTE pbDigest,
IN DWORD cbDigest,
OUT PBYTE pbTimeRequest,
IN OUT DWORD* pcbTimeRequest);
//+-----------------------------------------------------------------------
// FileToSubjectType
//
// Parameters:
// Return Values:
// Error Codes:
// E_INVALIDARG
// Invalid arguement passed in (Requires a file name
// and pointer to a guid ptr)
// TRUST_E_SUBJECT_FORM_UNKNOWN
// Unknow file type
// See also:
// GetFileInformationByHandle()
// CreateFile()
//
//------------------------------------------------------------------------
HRESULT SignOpenFile(LPCWSTR pwszFilename,
HANDLE* pFileHandle);
//+-----------------------------------------------------------------------
// SignGetFileType
//
// Parameters:
// Return Values:
// Error Codes:
// E_INVALIDARG
// Invalid arguement passed in (Requires a file name
// and pointer to a guid ptr)
// See also:
// GetFileInformationByHandle()
// CreateFile()
//
//------------------------------------------------------------------------
HRESULT SignGetFileType(HANDLE hFile,
const WCHAR *pwszFile,
GUID* pGuid);
//+-----------------------------------------------------------------------
// SpcGetFileType
//
// Parameters:
// Return Values:
// Error Codes:
// E_INVALIDARG
// Invalid arguement passed in (Requires a file name
// and pointer to a guid ptr)
// See also:
// GetFileInformationByHandle()
// CreateFile()
//
//------------------------------------------------------------------------
HRESULT SpcGetFileType(HANDLE hFile,
GUID* pGuid);
//+-----------------------------------------------------------------------
// SpcOpenFile
//
// Parameters:
// Return Values:
// Error Codes:
// E_INVALIDARG
// Invalid arguement passed in (Requires a file name
// and pointer to a handle);
// See also:
// GetFileInformationByHandle()
// CreateFile()
//
//------------------------------------------------------------------------
HRESULT SpcOpenFile(LPCWSTR pwszFileName,
HANDLE* pFileHandle);
//+-------------------------------------------------------------------------
// Find the the cert from the hprov
// Parameter Returns:
// pReturnCert - context of the cert found (must pass in cert context);
// Returns:
// S_OK - everything worked
// E_OUTOFMEMORY - memory failure
// E_INVALIDARG - no pReturnCert supplied
// CRYPT_E_NO_MATCH - could not locate certificate in store
//
HRESULT
SpcGetCertFromKey(IN DWORD dwCertEncodingType,
IN HCERTSTORE hStore,
IN HCRYPTPROV hProv,
IN DWORD hKeySpec,
OUT PCCERT_CONTEXT* pReturnCert);
//+-------------------------------------------------------------------------
//If all of the following three conditions are true, we should not put
// commercial or individual authenticated attributes into signer info
//
//1. the enhanced key usage extension of the signer's certificate has no code signing usage (szOID_PKIX_KP_CODE_SIGNING)
//2. basic constraints extension of the signer's cert is missing, or it is neither commercial nor individual
//3. user did not specify -individual or -commercial in signcode.exe.
//--------------------------------------------------------------------------
BOOL NeedStatementTypeAttr(IN PCCERT_CONTEXT psSigningContext,
IN BOOL fCommercial,
IN BOOL fIndividual);
//+-------------------------------------------------------------------------
// Returns TRUE if the Signer Cert has a Key Usage Restriction extension and
// only the commercial key purpose policy object identifier.
//
// Returns FALSE if it contains both a commercial and individual purpose
// policy object identifier.
//--------------------------------------------------------------------------
HRESULT CheckCommercial(IN PCCERT_CONTEXT pSignerCert,
IN BOOL fCommercial,
IN BOOL fIndividual,
OUT BOOL *pfCommercial);
//+-------------------------------------------------------------------------
// Encode the StatementType authenticated attribute value
//--------------------------------------------------------------------------
HRESULT CreateStatementType(IN BOOL fCommercial,
OUT BYTE **ppbEncoded,
IN OUT DWORD *pcbEncoded);
//+-------------------------------------------------------------------------
// Encode the SpOpusInfo authenticated attribute value
//--------------------------------------------------------------------------
HRESULT CreateOpusInfo(IN LPCWSTR pwszOpusName,
IN LPCWSTR pwszOpusInfo,
OUT BYTE **ppbEncoded,
IN OUT DWORD *pcbEncoded);
//+-----------------------------------------------------------------------
//
//
// Parameters:
// Return Values:
// Error Codes:
//
//------------------------------------------------------------------------
HRESULT SpcLoadSipFlags(GUID* pSubjectGuid,
DWORD *dwFlags);
//+-----------------------------------------------------------------------
//
//
// Parameters:
// Return Values:
// Error Codes:
//
//------------------------------------------------------------------------
HINSTANCE GetInstanceHandle();
//+-----------------------------------------------------------------------
//
//
// Parameters:
// Return Values:
// Error Codes:
//
//------------------------------------------------------------------------
void WINAPI PvkFreeCryptProv(IN HCRYPTPROV hProv,
IN LPCWSTR pwszCapiProvider,
IN DWORD dwProviderType,
IN LPWSTR pwszTmpContainer);
//+-----------------------------------------------------------------------
//
//
// Parameters:
// Return Values:
// Error Codes:
//
//------------------------------------------------------------------------
HRESULT WINAPI PvkGetCryptProv( IN HWND hwnd,
IN LPCWSTR pwszCaption,
IN LPCWSTR pwszCapiProvider,
IN DWORD dwProviderType,
IN LPCWSTR pwszPvkFile,
IN LPCWSTR pwszKeyContainerName,
IN DWORD *pdwKeySpec,
OUT LPWSTR *ppwszTmpContainer,
OUT HCRYPTPROV *phCryptProv);
//+-----------------------------------------------------------------------
// Check to see if the certificate is a glue cert
//------------------------------------------------------------------------
HRESULT SignIsGlueCert(IN PCCERT_CONTEXT pCert);
//+-----------------------------------------------------------------------
// Return hr based on GetLastError().
//------------------------------------------------------------------------
HRESULT WINAPI SignError();
//+-----------------------------------------------------------------------
// Check if there is TAG in front of a PKCS7 signed message
//------------------------------------------------------------------------
BOOL WINAPI SignNoContentWrap(IN const BYTE *pbDER,
IN DWORD cbDER);
//-------------------------------------------------------------------------
//
// WSZtoSZ:
// Convert a wchar string to a multi-byte string.
//
//-------------------------------------------------------------------------
HRESULT WSZtoSZ(LPWSTR wsz, LPSTR *psz);
//-------------------------------------------------------------------------
//
// BytesToBase64:
// convert bytes to base64 bstr
//
//-------------------------------------------------------------------------
HRESULT BytesToBase64(BYTE *pb, DWORD cb, CHAR **pszEncode, DWORD *pdwEncode);
//-------------------------------------------------------------------------
//
// BytesToBase64:
// conver base64 bstr to bytes
//
//-------------------------------------------------------------------------
HRESULT Base64ToBytes(CHAR *pEncode, DWORD cbEncode, BYTE **ppb, DWORD *pcb);
#ifdef __cplusplus
}
#endif
#endif