Headers diff for wintrust.dll between 5.131.3790.3959-Windows 5.0 and 6.0.6001.18000-Windows 6.0 versions



 mscat.h (5.131.3790.3959-Windows 5.0)   mscat.h (6.0.6001.18000-Windows 6.0) 
skipping to change at line 50 skipping to change at line 50
#define CRYPTCAT_MAX_MEMBERTAG 64 #define CRYPTCAT_MAX_MEMBERTAG 64
// //
// fdwOpenFlags // fdwOpenFlags
// //
#define CRYPTCAT_OPEN_CREATENEW 0x00000001 // creates/overwrite s #define CRYPTCAT_OPEN_CREATENEW 0x00000001 // creates/overwrite s
#define CRYPTCAT_OPEN_ALWAYS 0x00000002 // opens/creates #define CRYPTCAT_OPEN_ALWAYS 0x00000002 // opens/creates
#define CRYPTCAT_OPEN_EXISTING 0x00000004 // opens only #define CRYPTCAT_OPEN_EXISTING 0x00000004 // opens only
#define CRYPTCAT_OPEN_EXCLUDE_PAGE_HASHES 0x00010000 // Exclude page hash
es in SPC_INDIRECT_DATA
// The above CRYPTCAT_OPEN_EXCLUDE_PAGE_HASHES takes precedence if also set.
#define CRYPTCAT_OPEN_INCLUDE_PAGE_HASHES 0x00020000 // Include page hash
es in SPC_INDIRECT_DATA
#define CRYPTCAT_OPEN_VERIFYSIGHASH 0x10000000 // verifies the sign ature (not the certs!) #define CRYPTCAT_OPEN_VERIFYSIGHASH 0x10000000 // verifies the sign ature (not the certs!)
// 6-Feb-2006 philh: added
#define CRYPTCAT_OPEN_NO_CONTENT_HCRYPTMSG 0x20000000 // does CryptMsgDeco
de without content
#define CRYPTCAT_OPEN_SORTED 0x40000000 // does CertCreateCo
ntext(CERT_CREATE_CONTEXT_SORTED_FLAG)
#define CRYPTCAT_OPEN_FLAGS_MASK 0xffff0000 // mask for upper wo
rd
// //
// fdwMemberFlags (used internal -- do not fill) // fdwMemberFlags (used internal -- do not fill)
// //
// 6-Feb-2006 philh: added
#define CRYPTCAT_MEMBER_SORTED 0x40000000
// //
// dwAttrTypeAndAction // dwAttrTypeAndAction
// //
#define CRYPTCAT_ATTR_AUTHENTICATED 0x10000000 #define CRYPTCAT_ATTR_AUTHENTICATED 0x10000000
#define CRYPTCAT_ATTR_UNAUTHENTICATED 0x20000000 #define CRYPTCAT_ATTR_UNAUTHENTICATED 0x20000000
#define CRYPTCAT_ATTR_NAMEASCII 0x00000001 // ascii string #define CRYPTCAT_ATTR_NAMEASCII 0x00000001 // ascii string
#define CRYPTCAT_ATTR_NAMEOBJID 0x00000002 // crypt obj id #define CRYPTCAT_ATTR_NAMEOBJID 0x00000002 // crypt obj id
#define CRYPTCAT_ATTR_DATAASCII 0x00010000 // do not decode sim ple ascii chars #define CRYPTCAT_ATTR_DATAASCII 0x00010000 // do not decode sim ple ascii chars
skipping to change at line 109 skipping to change at line 122
DWORD dwPublicVersion; DWORD dwPublicVersion;
LPWSTR pwszP7File; LPWSTR pwszP7File;
HCRYPTPROV hProv; HCRYPTPROV hProv;
DWORD dwEncodingType; DWORD dwEncodingType;
DWORD fdwStoreFlags; DWORD fdwStoreFlags;
HANDLE hReserved; // pStack(members) (null if init /pbData) INTERNAL! HANDLE hReserved; // pStack(members) (null if init /pbData) INTERNAL!
// 18-Sep-1997 pberkman: added // 18-Sep-1997 pberkman: added
HANDLE hAttrs; // pStack(Catalog attrs) INTERNA L! HANDLE hAttrs; // pStack(Catalog attrs) INTERNA L!
// 6-Feb-2006 philh: added
// Following is only set if opened with CRYPTCAT_OPEN_NO_CONTENT_HCRYPTMSG
HCRYPTMSG hCryptMsg;
// Following is only set if opened with CRYPTCAT_OPEN_SORTED
HANDLE hSorted; // INTERNAL ONLY!
} CRYPTCATSTORE; } CRYPTCATSTORE;
typedef struct CRYPTCATMEMBER_ typedef struct CRYPTCATMEMBER_
{ {
DWORD cbStruct; // = sizeof(CRYPTCATMEMBER) DWORD cbStruct; // = sizeof(CRYPTCATMEMBER)
LPWSTR pwszReferenceTag; LPWSTR pwszReferenceTag;
LPWSTR pwszFileName; // used only by the CDF APIs LPWSTR pwszFileName; // used only by the CDF APIs
GUID gSubjectType; // may be zeros -- see sEnco dedMemberInfo GUID gSubjectType; // may be zeros -- see sEnco dedMemberInfo
DWORD fdwMemberFlags; DWORD fdwMemberFlags;
struct SIP_INDIRECT_DATA_ *pIndirectData; // may be null -- see sEncod edIndirectData struct SIP_INDIRECT_DATA_ *pIndirectData; // may be null -- see sEncod edIndirectData
skipping to change at line 188 skipping to change at line 207
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Usage: // Usage:
// open the catalog for Get/Put operations. // open the catalog for Get/Put operations.
// //
// Return: // Return:
// INVALID_HANDLE_VALUE: an error occured while opening Catalog // INVALID_HANDLE_VALUE: an error occured while opening Catalog
// //
// Errors: // Errors:
// ERROR_INVALID_PARAMETER: an input parameter is incorrect // ERROR_INVALID_PARAMETER: an input parameter is incorrect
// //
extern HANDLE WINAPI CryptCATOpen(IN LPWSTR pwszFileName, extern HANDLE WINAPI CryptCATOpen(__in LPWSTR pwszFileName,
IN DWORD fdwOpenFlags, IN DWORD fdwOpenFlags,
IN OPTIONAL HCRYPTPROV hProv, IN OPTIONAL HCRYPTPROV hProv,
IN OPTIONAL DWORD dwPublicVersion, IN OPTIONAL DWORD dwPublicVersion,
IN OPTIONAL DWORD dwEncodingType); IN OPTIONAL DWORD dwEncodingType);
// WOB #1496767
/////////////////////////////////////////////////////////////////////////////
//
// Set or clear page-hashes bit:
// --------------------------------------------------------------------------
// Usage:
// set a new value into the bit that suppresses page-hash generation.
//
// Errors:
// ERROR_INVALID_PARAMETER: an input parameter is incorrect
//
extern void WINAPI
CryptCATSetCreatePageHashesFlag( IN HANDLE hCatalog, IN BOOL newCreatePageHashes
Flag );
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// Close: // Close:
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Usage: // Usage:
// close the catalog handle. // close the catalog handle.
// //
// Errors: // Errors:
// ERROR_INVALID_PARAMETER: an input parameter is incorrect // ERROR_INVALID_PARAMETER: an input parameter is incorrect
// //
skipping to change at line 258 skipping to change at line 291
// CryptCATGetCatAttrInfo // CryptCATGetCatAttrInfo
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Usage: // Usage:
// //
// *** DO NOT FREE THE POINTER OR ANY OF ITS MEMBERS! *** // *** DO NOT FREE THE POINTER OR ANY OF ITS MEMBERS! ***
// //
// Errors: // Errors:
// ERROR_INVALID_PARAMETER: an input parameter is incorrect // ERROR_INVALID_PARAMETER: an input parameter is incorrect
// //
extern CRYPTCATATTRIBUTE * WINAPI CryptCATGetCatAttrInfo(IN HANDLE hCatalog, extern CRYPTCATATTRIBUTE * WINAPI CryptCATGetCatAttrInfo(IN HANDLE hCatalog,
IN LPWSTR pwszReference Tag); __in LPWSTR pwszReferen ceTag);
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// CryptCATPutCatAttrInfo // CryptCATPutCatAttrInfo
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Usage: // Usage:
// Allocates and adds the attribute to the catalog. Returns a pointer // Allocates and adds the attribute to the catalog. Returns a pointer
// to the allocated attribute. // to the allocated attribute.
// //
// *** DO NOT FREE THE POINTER OR ANY OF ITS MEMBERS! *** // *** DO NOT FREE THE POINTER OR ANY OF ITS MEMBERS! ***
// //
// Errors: // Errors:
// ERROR_INVALID_PARAMETER: an input parameter is incorrect // ERROR_INVALID_PARAMETER: an input parameter is incorrect
// //
extern CRYPTCATATTRIBUTE * WINAPI CryptCATPutCatAttrInfo(IN HANDLE hCatalog, extern CRYPTCATATTRIBUTE * WINAPI CryptCATPutCatAttrInfo(IN HANDLE hCatalog,
IN LPWSTR pwszReference Tag, __in LPWSTR pwszReferen ceTag,
IN DWORD dwAttrTypeAndA ction, IN DWORD dwAttrTypeAndA ction,
IN DWORD cbData, IN DWORD cbData,
IN BYTE *pbData); IN BYTE *pbData);
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// CryptCATEnumerateCatAttr // CryptCATEnumerateCatAttr
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Usage: // Usage:
// Enumerates through the list of attributes associated with the catalog. // Enumerates through the list of attributes associated with the catalog.
skipping to change at line 312 skipping to change at line 345
// Retrieve the Tag info (member info) structure from the catalog // Retrieve the Tag info (member info) structure from the catalog
// PKCS#7, fill the CRYPTCATMEMBER structure, and return. -- Opens a // PKCS#7, fill the CRYPTCATMEMBER structure, and return. -- Opens a
// member context. // member context.
// //
// *** DO NOT FREE THE POINTER OR ANY OF ITS MEMBERS! *** // *** DO NOT FREE THE POINTER OR ANY OF ITS MEMBERS! ***
// //
// Errors: // Errors:
// ERROR_INVALID_PARAMETER: an input parameter is incorrect // ERROR_INVALID_PARAMETER: an input parameter is incorrect
// //
extern CRYPTCATMEMBER * WINAPI CryptCATGetMemberInfo(IN HANDLE hCatalog, extern CRYPTCATMEMBER * WINAPI CryptCATGetMemberInfo(IN HANDLE hCatalog,
IN LPWSTR pwszReferenceTag) __in LPWSTR pwszReferenceTa
; g);
// 6-Feb-2006 philh: added
/////////////////////////////////////////////////////////////////////////////
//
// CryptCATAllocSortedMemberInfo
// --------------------------------------------------------------------------
// Usage:
// If CryptCATOpen is called with CRYPTCAT_OPEN_SORTED, this function
// must be called instead of the above CryptCATGetMemberInfo().
//
// The returned member context must be freed by calling
// CryptCATFreeSortedMemberInfo()
//
// Errors:
// ERROR_INVALID_PARAMETER: an input parameter is incorrect
//
extern CRYPTCATMEMBER * WINAPI CryptCATAllocSortedMemberInfo(IN HANDLE hCatalog,
__in LPWSTR pwszReferenceTa
g);
// 6-Feb-2006 philh: added
/////////////////////////////////////////////////////////////////////////////
//
// CryptCATFreeSortedMemberInfo
// --------------------------------------------------------------------------
// Usage:
// Free member context returned by the above
// CryptCATAllocSortedMemberInfo().
//
// Errors:
// ERROR_INVALID_PARAMETER: an input parameter is incorrect
//
extern void WINAPI CryptCATFreeSortedMemberInfo(IN HANDLE hCatalog,
IN CRYPTCATMEMBER *pCatMem
ber);
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// CryptCATGetAttr: // CryptCATGetAttr:
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Usage: // Usage:
// get pwszReferenceTag attribute information for a member. // get pwszReferenceTag attribute information for a member.
// //
// Errors: // Errors:
// ERROR_INVALID_PARAMETER: an input parameter is incorrect // ERROR_INVALID_PARAMETER: an input parameter is incorrect
// //
extern CRYPTCATATTRIBUTE * WINAPI CryptCATGetAttrInfo(IN HANDLE hCatalog, extern CRYPTCATATTRIBUTE * WINAPI CryptCATGetAttrInfo(IN HANDLE hCatalog,
IN CRYPTCATMEMBER *pCatMem ber, IN CRYPTCATMEMBER *pCatMem ber,
IN LPWSTR pwszReferenceTag ); __in LPWSTR pwszReferenceT ag);
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// CryptCATPutMemberInfo // CryptCATPutMemberInfo
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Usage: // Usage:
// Allocates and adds the member to the catalog. Returns a pointer // Allocates and adds the member to the catalog. Returns a pointer
// to the allocated member. // to the allocated member.
// //
// *** DO NOT FREE THE POINTER OR ANY OF ITS MEMBERS! *** // *** DO NOT FREE THE POINTER OR ANY OF ITS MEMBERS! ***
// //
// Errors: // Errors:
// ERROR_INVALID_PARAMETER: an input parameter is incorrect // ERROR_INVALID_PARAMETER: an input parameter is incorrect
// CRYPT_E_EXISTS: the reference tag already exists // CRYPT_E_EXISTS: the reference tag already exists
// CRYPT_E_NOT_FOUND: the attr was not found // CRYPT_E_NOT_FOUND: the attr was not found
// //
extern CRYPTCATMEMBER * WINAPI CryptCATPutMemberInfo(IN HANDLE hCatalog, extern CRYPTCATMEMBER * WINAPI CryptCATPutMemberInfo(IN HANDLE hCatalog,
IN OPTIONAL LPWSTR pwszFile __in_opt LPWSTR pwszFile
Name, Name,
IN LPWSTR pwszRefe __in LPWSTR pwszRefe
renceTag, renceTag,
IN GUID *pgSubject Type, IN GUID *pgSubject Type,
IN DWORD dwCertVer sion, IN DWORD dwCertVer sion,
IN DWORD cbSIPIndi rectData, IN DWORD cbSIPIndi rectData,
IN BYTE *pbSIPIndi rectData); IN BYTE *pbSIPIndi rectData);
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// CryptCATPutAttrInfo // CryptCATPutAttrInfo
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Usage: // Usage:
// Allocates and adds the attribute to the member. Returns a pointer // Allocates and adds the attribute to the member. Returns a pointer
// to the allocated attribute. // to the allocated attribute.
// //
// *** DO NOT FREE THE POINTER OR ANY OF ITS MEMBERS! *** // *** DO NOT FREE THE POINTER OR ANY OF ITS MEMBERS! ***
// //
// Errors: // Errors:
// ERROR_INVALID_PARAMETER: an input parameter is incorrect // ERROR_INVALID_PARAMETER: an input parameter is incorrect
// //
extern CRYPTCATATTRIBUTE * WINAPI CryptCATPutAttrInfo(IN HANDLE hCatalog, extern CRYPTCATATTRIBUTE * WINAPI CryptCATPutAttrInfo(IN HANDLE hCatalog,
IN CRYPTCATMEMBER *pCatMem ber, IN CRYPTCATMEMBER *pCatMem ber,
IN LPWSTR pwszReferenceTag , __in LPWSTR pwszReferenceT ag,
IN DWORD dwAttrTypeAndActi on, IN DWORD dwAttrTypeAndActi on,
IN DWORD cbData, IN DWORD cbData,
IN BYTE *pbData); IN BYTE *pbData);
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// CryptCATEnumerateMember // CryptCATEnumerateMember
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Usage: // Usage:
// Enumerates through the list of members in the store. Returns a pointer // Enumerates through the list of members in the store. Returns a pointer
skipping to change at line 419 skipping to change at line 487
// //
// CryptCATCDFOpen // CryptCATCDFOpen
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Usage: // Usage:
// Opens the specified CDF file and initialized the structure // Opens the specified CDF file and initialized the structure
// //
// Errors: // Errors:
// ERROR_INVALID_PARAMETER: an input parameter is incorrect // ERROR_INVALID_PARAMETER: an input parameter is incorrect
// ERROR_FILE_NOT_FOUND: the CDF file was not found // ERROR_FILE_NOT_FOUND: the CDF file was not found
// //
extern CRYPTCATCDF * WINAPI CryptCATCDFOpen(IN LPWSTR pwszFilePath, extern CRYPTCATCDF * WINAPI CryptCATCDFOpen(__in LPWSTR pwszFilePath,
IN OPTIONAL PFN_CDF_PARSE_ERROR_CALL __in_opt PFN_CDF_PARSE_ERROR_CALLBAC
BACK pfnParseError); K pfnParseError);
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// CryptCATCDFClose // CryptCATCDFClose
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Usage: // Usage:
// Closes the CDF file and deallocates the structure // Closes the CDF file and deallocates the structure
// //
// Errors: // Errors:
// ERROR_INVALID_PARAMETER: an input parameter is incorrect // ERROR_INVALID_PARAMETER: an input parameter is incorrect
skipping to change at line 498 skipping to change at line 566
// TRUE if it is. // TRUE if it is.
// FALSE if it isn't or an error occured. // FALSE if it isn't or an error occured.
// //
// //
// Errors: // Errors:
// ERROR_INVALID_PARAMETER: an input parameter is incorrect // ERROR_INVALID_PARAMETER: an input parameter is incorrect
// ERROR_NOT_ENOUGH_MEMORY: a memory allocation failed // ERROR_NOT_ENOUGH_MEMORY: a memory allocation failed
// {file errors} a file error occured // {file errors} a file error occured
// //
extern BOOL WINAPI IsCatalogFile(IN OPTIONAL HANDLE hFile, extern BOOL WINAPI IsCatalogFile(IN OPTIONAL HANDLE hFile,
IN OPTIONAL WCHAR *pwszFileName); __in_opt WCHAR *pwszFileName);
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// //
// CryptCATAdminAcquireContext // CryptCATAdminAcquireContext
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Usage: // Usage:
// Opens a new Admin Context based on the pgSubsystem Id. // Opens a new Admin Context based on the pgSubsystem Id.
// //
// the Guid passed in will be converted to a string and used as the // the Guid passed in will be converted to a string and used as the
// sub-directory under %SystemRoot%\CatRoot to store all Catalog files // sub-directory under %SystemRoot%\CatRoot to store all Catalog files
skipping to change at line 662 skipping to change at line 730
// ERROR_NOT_ENOUGH_MEMORY: a memory allocation failed // ERROR_NOT_ENOUGH_MEMORY: a memory allocation failed
// ERROR_BAD_FORMAT: the file is not a catalog file. // ERROR_BAD_FORMAT: the file is not a catalog file.
// ERROR_DATABASE_FAILURE: an error occurred while processing // ERROR_DATABASE_FAILURE: an error occurred while processing
// the database. // the database.
// //
// Comments: // Comments:
// the dwFlags parameter is reserved for future use and must be assigned // the dwFlags parameter is reserved for future use and must be assigned
// to NULL. // to NULL.
// //
extern HCATINFO WINAPI CryptCATAdminAddCatalog(IN HCATADMIN hCatAdmin, extern HCATINFO WINAPI CryptCATAdminAddCatalog(IN HCATADMIN hCatAdmin,
IN WCHAR *pwszCatalogFile, __in PWSTR pwszCatalogFile,
IN OPTIONAL WCHAR *pwszSelectBase __in_opt PWSTR pwszSelectBaseName
Name, ,
IN DWORD dwFlags); IN DWORD dwFlags);
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// //
// CryptCATAdminRemoveCatalog // CryptCATAdminRemoveCatalog
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Usage: // Usage:
// Call this function to remove a catalog file from the CAT Maintenance // Call this function to remove a catalog file from the CAT Maintenance
// subsystem. // subsystem.
// //
skipping to change at line 736 skipping to change at line 804
// Errors: // Errors:
// ERROR_INVALID_PARAMETER: an input parameter is incorrect // ERROR_INVALID_PARAMETER: an input parameter is incorrect
// ERROR_NOT_ENOUGH_MEMORY: if the fully qualified path is longer // ERROR_NOT_ENOUGH_MEMORY: if the fully qualified path is longer
// than MAX_PATH // than MAX_PATH
// //
// Comments: // Comments:
// the dwFlags parameter is reserved for future use and must be assigned // the dwFlags parameter is reserved for future use and must be assigned
// to NULL. // to NULL.
// //
extern BOOL WINAPI CryptCATAdminResolveCatalogPath(IN HCATADMIN hCatAdmin, extern BOOL WINAPI CryptCATAdminResolveCatalogPath(IN HCATADMIN hCatAdmin,
IN WCHAR *pwszCatalogFile, __in WCHAR *pwszCatalogFile,
IN OUT CATALOG_INFO *psCatInf __inout CATALOG_INFO *psCatIn
o, fo,
IN DWORD dwFlags); IN DWORD dwFlags);
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// //
// CryptCATAdminPauseServiceForBackup // CryptCATAdminPauseServiceForBackup
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Usage: // Usage:
// call this function to pause the catalog sub-system in preparation // call this function to pause the catalog sub-system in preparation
// for backing up the catalog sub-systems files. // for backing up the catalog sub-systems files.
// //
 End of changes. 16 change blocks. 
21 lines changed or deleted 97 lines changed or added


 wincrypt.h (5.131.3790.3959-Windows 5.0)   wincrypt.h (6.0.6001.18000-Windows 6.0) 
skipping to change at line 15 skipping to change at line 15
// //
// File: wincrypt.h // File: wincrypt.h
// //
// Contents: Cryptographic API Prototypes and Definitions // Contents: Cryptographic API Prototypes and Definitions
// //
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
#ifndef __WINCRYPT_H__ #ifndef __WINCRYPT_H__
#define __WINCRYPT_H__ #define __WINCRYPT_H__
#include <specstrings.h> /* for SAL annotations */
#if defined (_MSC_VER) #if defined (_MSC_VER)
#if ( _MSC_VER >= 800 ) #if ( _MSC_VER >= 800 )
#if _MSC_VER >= 1200 #if _MSC_VER >= 1200
#pragma warning(push) #pragma warning(push)
#endif #endif
#pragma warning(disable:4201) /* Nameless struct/union */ #pragma warning(disable:4201) /* Nameless struct/union */
#endif #endif
#if (_MSC_VER > 1020) #if (_MSC_VER > 1020)
skipping to change at line 36 skipping to change at line 38
#endif #endif
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#ifndef _HRESULT_DEFINED #ifndef _HRESULT_DEFINED
#define _HRESULT_DEFINED #define _HRESULT_DEFINED
typedef LONG HRESULT; typedef __success(return >= 0) long HRESULT;
#endif
#endif // !_HRESULT_DEFINED
#ifndef WINADVAPI #ifndef WINADVAPI
#define WINADVAPI #define WINADVAPI
#endif #endif
#ifndef WINAPI #ifndef WINAPI
#define WINAPI __stdcall #define WINAPI __stdcall
#endif #endif
#ifndef CALLBACK #ifndef CALLBACK
skipping to change at line 72 skipping to change at line 73
#endif #endif
#ifndef OUT #ifndef OUT
#define OUT #define OUT
#endif #endif
#ifndef OPTIONAL #ifndef OPTIONAL
#define OPTIONAL #define OPTIONAL
#endif #endif
#if (NTDDI_VERSION >= NTDDI_WINLH)
#if !defined(WINCRYPT32API)
#if !defined(_CRYPT32_) #if !defined(_CRYPT32_)
#define WINCRYPT32API DECLSPEC_IMPORT #define WINCRYPT32API DECLSPEC_IMPORT
#else #else
#define WINCRYPT32API #define WINCRYPT32API
#endif #endif
#endif
#else
#if !defined(_CRYPT32_)
#define WINCRYPT32API DECLSPEC_IMPORT
#else
#define WINCRYPT32API
#endif
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
#if !defined(WINCRYPT32STRINGAPI)
#if !defined(_CRYPT32STRING_) #if !defined(_CRYPT32STRING_)
# define WINCRYPT32STRINGAPI WINCRYPT32API #define WINCRYPT32STRINGAPI WINCRYPT32API
#else #else
# define WINCRYPT32STRINGAPI #define WINCRYPT32STRINGAPI
#endif
#endif #endif
// //
// Algorithm IDs and Flags // Algorithm IDs and Flags
// //
// ALG_ID crackers // ALG_ID crackers
#define GET_ALG_CLASS(x) (x & (7 << 13)) #define GET_ALG_CLASS(x) (x & (7 << 13))
#define GET_ALG_TYPE(x) (x & (15 << 9)) #define GET_ALG_TYPE(x) (x & (15 << 9))
#define GET_ALG_SID(x) (x & (511)) #define GET_ALG_SID(x) (x & (511))
// Algorithm classes // Algorithm classes
// certenrolld_begin -- ALG_CLASS_*
#define ALG_CLASS_ANY (0) #define ALG_CLASS_ANY (0)
#define ALG_CLASS_SIGNATURE (1 << 13) #define ALG_CLASS_SIGNATURE (1 << 13)
#define ALG_CLASS_MSG_ENCRYPT (2 << 13) #define ALG_CLASS_MSG_ENCRYPT (2 << 13)
#define ALG_CLASS_DATA_ENCRYPT (3 << 13) #define ALG_CLASS_DATA_ENCRYPT (3 << 13)
#define ALG_CLASS_HASH (4 << 13) #define ALG_CLASS_HASH (4 << 13)
#define ALG_CLASS_KEY_EXCHANGE (5 << 13) #define ALG_CLASS_KEY_EXCHANGE (5 << 13)
#define ALG_CLASS_ALL (7 << 13) #define ALG_CLASS_ALL (7 << 13)
// certenrolld_end
// Algorithm types // Algorithm types
#define ALG_TYPE_ANY (0) #define ALG_TYPE_ANY (0)
#define ALG_TYPE_DSS (1 << 9) #define ALG_TYPE_DSS (1 << 9)
#define ALG_TYPE_RSA (2 << 9) #define ALG_TYPE_RSA (2 << 9)
#define ALG_TYPE_BLOCK (3 << 9) #define ALG_TYPE_BLOCK (3 << 9)
#define ALG_TYPE_STREAM (4 << 9) #define ALG_TYPE_STREAM (4 << 9)
#define ALG_TYPE_DH (5 << 9) #define ALG_TYPE_DH (5 << 9)
#define ALG_TYPE_SECURECHANNEL (6 << 9) #define ALG_TYPE_SECURECHANNEL (6 << 9)
skipping to change at line 126 skipping to change at line 145
#define ALG_SID_RSA_PKCS 1 #define ALG_SID_RSA_PKCS 1
#define ALG_SID_RSA_MSATWORK 2 #define ALG_SID_RSA_MSATWORK 2
#define ALG_SID_RSA_ENTRUST 3 #define ALG_SID_RSA_ENTRUST 3
#define ALG_SID_RSA_PGP 4 #define ALG_SID_RSA_PGP 4
// Some DSS sub-ids // Some DSS sub-ids
// //
#define ALG_SID_DSS_ANY 0 #define ALG_SID_DSS_ANY 0
#define ALG_SID_DSS_PKCS 1 #define ALG_SID_DSS_PKCS 1
#define ALG_SID_DSS_DMS 2 #define ALG_SID_DSS_DMS 2
#if (NTDDI_VERSION >= NTDDI_WINLH)
#define ALG_SID_ECDSA 3
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
// Block cipher sub ids // Block cipher sub ids
// DES sub_ids // DES sub_ids
#define ALG_SID_DES 1 #define ALG_SID_DES 1
#define ALG_SID_3DES 3 #define ALG_SID_3DES 3
#define ALG_SID_DESX 4 #define ALG_SID_DESX 4
#define ALG_SID_IDEA 5 #define ALG_SID_IDEA 5
#define ALG_SID_CAST 6 #define ALG_SID_CAST 6
#define ALG_SID_SAFERSK64 7 #define ALG_SID_SAFERSK64 7
#define ALG_SID_SAFERSK128 8 #define ALG_SID_SAFERSK128 8
#define ALG_SID_3DES_112 9 #define ALG_SID_3DES_112 9
#define ALG_SID_CYLINK_MEK 12 #define ALG_SID_CYLINK_MEK 12
#define ALG_SID_RC5 13 #define ALG_SID_RC5 13
#if (NTDDI_VERSION >= NTDDI_WINXP)
#define ALG_SID_AES_128 14 #define ALG_SID_AES_128 14
#define ALG_SID_AES_192 15 #define ALG_SID_AES_192 15
#define ALG_SID_AES_256 16 #define ALG_SID_AES_256 16
#define ALG_SID_AES 17 #define ALG_SID_AES 17
#endif //(NTDDI_VERSION >= NTDDI_WINXP)
// Fortezza sub-ids // Fortezza sub-ids
#define ALG_SID_SKIPJACK 10 #define ALG_SID_SKIPJACK 10
#define ALG_SID_TEK 11 #define ALG_SID_TEK 11
// KP_MODE // KP_MODE
#define CRYPT_MODE_CBCI 6 // ANSI CBC Interleaved #define CRYPT_MODE_CBCI 6 // ANSI CBC Interleaved
#define CRYPT_MODE_CFBP 7 // ANSI CFB Pipelined #define CRYPT_MODE_CFBP 7 // ANSI CFB Pipelined
#define CRYPT_MODE_OFBP 8 // ANSI OFB Pipelined #define CRYPT_MODE_OFBP 8 // ANSI OFB Pipelined
#define CRYPT_MODE_CBCOFM 9 // ANSI CBC + OF Masking #define CRYPT_MODE_CBCOFM 9 // ANSI CBC + OF Masking
skipping to change at line 167 skipping to change at line 191
// Stream cipher sub-ids // Stream cipher sub-ids
#define ALG_SID_RC4 1 #define ALG_SID_RC4 1
#define ALG_SID_SEAL 2 #define ALG_SID_SEAL 2
// Diffie-Hellman sub-ids // Diffie-Hellman sub-ids
#define ALG_SID_DH_SANDF 1 #define ALG_SID_DH_SANDF 1
#define ALG_SID_DH_EPHEM 2 #define ALG_SID_DH_EPHEM 2
#define ALG_SID_AGREED_KEY_ANY 3 #define ALG_SID_AGREED_KEY_ANY 3
#define ALG_SID_KEA 4 #define ALG_SID_KEA 4
#if (NTDDI_VERSION >= NTDDI_WINLH)
#define ALG_SID_ECDH 5
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
// Hash sub ids // Hash sub ids
#define ALG_SID_MD2 1 #define ALG_SID_MD2 1
#define ALG_SID_MD4 2 #define ALG_SID_MD4 2
#define ALG_SID_MD5 3 #define ALG_SID_MD5 3
#define ALG_SID_SHA 4 #define ALG_SID_SHA 4
#define ALG_SID_SHA1 4 #define ALG_SID_SHA1 4
#define ALG_SID_MAC 5 #define ALG_SID_MAC 5
#define ALG_SID_RIPEMD 6 #define ALG_SID_RIPEMD 6
#define ALG_SID_RIPEMD160 7 #define ALG_SID_RIPEMD160 7
#define ALG_SID_SSL3SHAMD5 8 #define ALG_SID_SSL3SHAMD5 8
#define ALG_SID_HMAC 9 #define ALG_SID_HMAC 9
#define ALG_SID_TLS1PRF 10 #define ALG_SID_TLS1PRF 10
#if (NTDDI_VERSION >= NTDDI_WINXP)
#define ALG_SID_HASH_REPLACE_OWF 11 #define ALG_SID_HASH_REPLACE_OWF 11
#endif //(NTDDI_VERSION >= NTDDI_WINXP)
#if (NTDDI_VERSION >= NTDDI_WS03)
#define ALG_SID_SHA_256 12 #define ALG_SID_SHA_256 12
#define ALG_SID_SHA_384 13 #define ALG_SID_SHA_384 13
#define ALG_SID_SHA_512 14 #define ALG_SID_SHA_512 14
#endif //(NTDDI_VERSION >= NTDDI_WS03)
// secure channel sub ids // secure channel sub ids
#define ALG_SID_SSL3_MASTER 1 #define ALG_SID_SSL3_MASTER 1
#define ALG_SID_SCHANNEL_MASTER_HASH 2 #define ALG_SID_SCHANNEL_MASTER_HASH 2
#define ALG_SID_SCHANNEL_MAC_KEY 3 #define ALG_SID_SCHANNEL_MAC_KEY 3
#define ALG_SID_PCT1_MASTER 4 #define ALG_SID_PCT1_MASTER 4
#define ALG_SID_SSL2_MASTER 5 #define ALG_SID_SSL2_MASTER 5
#define ALG_SID_TLS1_MASTER 6 #define ALG_SID_TLS1_MASTER 6
#define ALG_SID_SCHANNEL_ENC_KEY 7 #define ALG_SID_SCHANNEL_ENC_KEY 7
#if (NTDDI_VERSION >= NTDDI_WINLH)
// misc ECC sub ids
#define ALG_SID_ECMQV 1
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
// Our silly example sub-id // Our silly example sub-id
#define ALG_SID_EXAMPLE 80 #define ALG_SID_EXAMPLE 80
// certenrolls_begin -- PROV_ENUMALGS_EX
#ifndef ALGIDDEF #ifndef ALGIDDEF
#define ALGIDDEF #define ALGIDDEF
typedef unsigned int ALG_ID; typedef unsigned int ALG_ID;
#endif #endif
// certenrolls_end
// algorithm identifier definitions // algorithm identifier definitions
#define CALG_MD2 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD2) #define CALG_MD2 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD2)
#define CALG_MD4 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD4) #define CALG_MD4 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD4)
#define CALG_MD5 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD5) #define CALG_MD5 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD5)
#define CALG_SHA (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA) #define CALG_SHA (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA)
#define CALG_SHA1 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA1) #define CALG_SHA1 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA1)
#define CALG_MAC (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MAC) #define CALG_MAC (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MAC)
#define CALG_RSA_SIGN (ALG_CLASS_SIGNATURE | ALG_TYPE_RSA | ALG_SID_RS A_ANY) #define CALG_RSA_SIGN (ALG_CLASS_SIGNATURE | ALG_TYPE_RSA | ALG_SID_RS A_ANY)
#define CALG_DSS_SIGN (ALG_CLASS_SIGNATURE | ALG_TYPE_DSS | ALG_SID_DS S_ANY) #define CALG_DSS_SIGN (ALG_CLASS_SIGNATURE | ALG_TYPE_DSS | ALG_SID_DS S_ANY)
#if (NTDDI_VERSION >= NTDDI_WINXP)
#define CALG_NO_SIGN (ALG_CLASS_SIGNATURE | ALG_TYPE_ANY | ALG_SID_AN Y) #define CALG_NO_SIGN (ALG_CLASS_SIGNATURE | ALG_TYPE_ANY | ALG_SID_AN Y)
#endif //(NTDDI_VERSION >= NTDDI_WINXP)
#define CALG_RSA_KEYX (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_RSA|ALG_SID_RSA _ANY) #define CALG_RSA_KEYX (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_RSA|ALG_SID_RSA _ANY)
#define CALG_DES (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_D ES) #define CALG_DES (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_D ES)
#define CALG_3DES_112 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_3 DES_112) #define CALG_3DES_112 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_3 DES_112)
#define CALG_3DES (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_3 DES) #define CALG_3DES (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_3 DES)
#define CALG_DESX (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_D ESX) #define CALG_DESX (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_D ESX)
#define CALG_RC2 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_R C2) #define CALG_RC2 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_R C2)
#define CALG_RC4 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_STREAM|ALG_SID_ RC4) #define CALG_RC4 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_STREAM|ALG_SID_ RC4)
#define CALG_SEAL (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_STREAM|ALG_SID_ SEAL) #define CALG_SEAL (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_STREAM|ALG_SID_ SEAL)
#define CALG_DH_SF (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_DH_S ANDF) #define CALG_DH_SF (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_DH_S ANDF)
#define CALG_DH_EPHEM (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_DH_E PHEM) #define CALG_DH_EPHEM (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_DH_E PHEM)
skipping to change at line 239 skipping to change at line 279
#define CALG_SSL3_MASTER (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|AL G_SID_SSL3_MASTER) #define CALG_SSL3_MASTER (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|AL G_SID_SSL3_MASTER)
#define CALG_SCHANNEL_MASTER_HASH (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNE L|ALG_SID_SCHANNEL_MASTER_HASH) #define CALG_SCHANNEL_MASTER_HASH (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNE L|ALG_SID_SCHANNEL_MASTER_HASH)
#define CALG_SCHANNEL_MAC_KEY (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|AL G_SID_SCHANNEL_MAC_KEY) #define CALG_SCHANNEL_MAC_KEY (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|AL G_SID_SCHANNEL_MAC_KEY)
#define CALG_SCHANNEL_ENC_KEY (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|AL G_SID_SCHANNEL_ENC_KEY) #define CALG_SCHANNEL_ENC_KEY (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|AL G_SID_SCHANNEL_ENC_KEY)
#define CALG_PCT1_MASTER (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|AL G_SID_PCT1_MASTER) #define CALG_PCT1_MASTER (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|AL G_SID_PCT1_MASTER)
#define CALG_SSL2_MASTER (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|AL G_SID_SSL2_MASTER) #define CALG_SSL2_MASTER (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|AL G_SID_SSL2_MASTER)
#define CALG_TLS1_MASTER (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|AL G_SID_TLS1_MASTER) #define CALG_TLS1_MASTER (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|AL G_SID_TLS1_MASTER)
#define CALG_RC5 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_R C5) #define CALG_RC5 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_R C5)
#define CALG_HMAC (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_HMAC) #define CALG_HMAC (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_HMAC)
#define CALG_TLS1PRF (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_TLS1PRF ) #define CALG_TLS1PRF (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_TLS1PRF )
#if (NTDDI_VERSION >= NTDDI_WINXP)
#define CALG_HASH_REPLACE_OWF (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_HASH_RE PLACE_OWF) #define CALG_HASH_REPLACE_OWF (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_HASH_RE PLACE_OWF)
#define CALG_AES_128 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_A ES_128) #define CALG_AES_128 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_A ES_128)
#define CALG_AES_192 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_A ES_192) #define CALG_AES_192 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_A ES_192)
#define CALG_AES_256 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_A ES_256) #define CALG_AES_256 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_A ES_256)
#define CALG_AES (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_A ES) #define CALG_AES (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_A ES)
#endif //(NTDDI_VERSION >= NTDDI_WINXP)
#if (NTDDI_VERSION >= NTDDI_WS03)
#define CALG_SHA_256 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_256 ) #define CALG_SHA_256 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_256 )
#define CALG_SHA_384 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_384 ) #define CALG_SHA_384 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_384 )
#define CALG_SHA_512 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_512 ) #define CALG_SHA_512 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_512 )
#endif //(NTDDI_VERSION >= NTDDI_WS03)
#if (NTDDI_VERSION >= NTDDI_WINLH)
#define CALG_ECDH (ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_DH | ALG_SID_
ECDH)
#define CALG_ECMQV (ALG_CLASS_KEY_EXCHANGE | ALG_TYPE_ANY | ALG_SID
_ECMQV)
#define CALG_ECDSA (ALG_CLASS_SIGNATURE | ALG_TYPE_DSS | ALG_SID_EC
DSA)
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
#if (NTDDI_VERSION < NTDDI_WINXP)
// resource number for signatures in the CSP
#define SIGNATURE_RESOURCE_NUMBER 0x29A
typedef struct _VTableProvStruc {
DWORD Version;
FARPROC FuncVerifyImage;
FARPROC FuncReturnhWnd;
DWORD dwProvType;
BYTE *pbContextInfo;
DWORD cbContextInfo;
LPSTR pszProvName;
} VTableProvStruc, *PVTableProvStruc;
#endif //(NTDDI_VERSION < NTDDI_WINXP)
// Used for certenroll.idl:
// certenrolls_begin -- HCRYPT*
typedef ULONG_PTR HCRYPTPROV; typedef ULONG_PTR HCRYPTPROV;
typedef ULONG_PTR HCRYPTKEY; typedef ULONG_PTR HCRYPTKEY;
typedef ULONG_PTR HCRYPTHASH; typedef ULONG_PTR HCRYPTHASH;
// certenrolls_end
// dwFlags definitions for CryptAcquireContext // dwFlags definitions for CryptAcquireContext
#define CRYPT_VERIFYCONTEXT 0xF0000000 #define CRYPT_VERIFYCONTEXT 0xF0000000
#define CRYPT_NEWKEYSET 0x00000008 #define CRYPT_NEWKEYSET 0x00000008
#define CRYPT_DELETEKEYSET 0x00000010 #define CRYPT_DELETEKEYSET 0x00000010
#define CRYPT_MACHINE_KEYSET 0x00000020 #define CRYPT_MACHINE_KEYSET 0x00000020
#define CRYPT_SILENT 0x00000040 #define CRYPT_SILENT 0x00000040
#if (NTDDI_VERSION >= NTDDI_WINLH)
#define CRYPT_DEFAULT_CONTAINER_OPTIONAL 0x00000080
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
// dwFlag definitions for CryptGenKey // dwFlag definitions for CryptGenKey
#define CRYPT_EXPORTABLE 0x00000001 #define CRYPT_EXPORTABLE 0x00000001
#define CRYPT_USER_PROTECTED 0x00000002 #define CRYPT_USER_PROTECTED 0x00000002
#define CRYPT_CREATE_SALT 0x00000004 #define CRYPT_CREATE_SALT 0x00000004
#define CRYPT_UPDATE_KEY 0x00000008 #define CRYPT_UPDATE_KEY 0x00000008
#define CRYPT_NO_SALT 0x00000010 #define CRYPT_NO_SALT 0x00000010
#define CRYPT_PREGEN 0x00000040 #define CRYPT_PREGEN 0x00000040
#define CRYPT_RECIPIENT 0x00000010 #define CRYPT_RECIPIENT 0x00000010
#define CRYPT_INITIATOR 0x00000040 #define CRYPT_INITIATOR 0x00000040
#define CRYPT_ONLINE 0x00000080 #define CRYPT_ONLINE 0x00000080
#define CRYPT_SF 0x00000100 #define CRYPT_SF 0x00000100
#define CRYPT_CREATE_IV 0x00000200 #define CRYPT_CREATE_IV 0x00000200
#define CRYPT_KEK 0x00000400 #define CRYPT_KEK 0x00000400
#define CRYPT_DATA_KEY 0x00000800 #define CRYPT_DATA_KEY 0x00000800
#define CRYPT_VOLATILE 0x00001000 #define CRYPT_VOLATILE 0x00001000
#define CRYPT_SGCKEY 0x00002000 #define CRYPT_SGCKEY 0x00002000
#if (NTDDI_VERSION >= NTDDI_WINXP)
#define CRYPT_ARCHIVABLE 0x00004000 #define CRYPT_ARCHIVABLE 0x00004000
#endif //(NTDDI_VERSION >= NTDDI_WINXP)
#if (NTDDI_VERSION >= NTDDI_WINLH)
#define CRYPT_FORCE_KEY_PROTECTION_HIGH 0x00008000
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
#define RSA1024BIT_KEY 0x04000000 #define RSA1024BIT_KEY 0x04000000
// dwFlags definitions for CryptDeriveKey // dwFlags definitions for CryptDeriveKey
#define CRYPT_SERVER 0x00000400 #define CRYPT_SERVER 0x00000400
#define KEY_LENGTH_MASK 0xFFFF0000 #define KEY_LENGTH_MASK 0xFFFF0000
// dwFlag definitions for CryptExportKey // dwFlag definitions for CryptExportKey
#define CRYPT_Y_ONLY 0x00000001 #define CRYPT_Y_ONLY 0x00000001
#define CRYPT_SSL2_FALLBACK 0x00000002 #define CRYPT_SSL2_FALLBACK 0x00000002
#define CRYPT_DESTROYKEY 0x00000004 #define CRYPT_DESTROYKEY 0x00000004
#define CRYPT_OAEP 0x00000040 // used with RSA encryptions/decrypt ions #define CRYPT_OAEP 0x00000040 // used with RSA encryptions/decrypt ions
// CryptExportKey, CryptImportKey, // CryptExportKey, CryptImportKey,
// CryptEncrypt and CryptDecrypt // CryptEncrypt and CryptDecrypt
#define CRYPT_BLOB_VER3 0x00000080 // export version 3 of a blob type #define CRYPT_BLOB_VER3 0x00000080 // export version 3 of a blob type
#if (NTDDI_VERSION >= NTDDI_WINXP)
#define CRYPT_IPSEC_HMAC_KEY 0x00000100 // CryptImportKey only #define CRYPT_IPSEC_HMAC_KEY 0x00000100 // CryptImportKey only
#endif //(NTDDI_VERSION >= NTDDI_WINXP)
#if (NTDDI_VERSION >= NTDDI_WS03)
// dwFlags definitions for CryptDecrypt // dwFlags definitions for CryptDecrypt
// See also CRYPT_OAEP, above. // See also CRYPT_OAEP, above.
// Note, the following flag is not supported for CryptEncrypt // Note, the following flag is not supported for CryptEncrypt
#define CRYPT_DECRYPT_RSA_NO_PADDING_CHECK 0x00000020 #define CRYPT_DECRYPT_RSA_NO_PADDING_CHECK 0x00000020
#endif //(NTDDI_VERSION >= NTDDI_WS03)
// dwFlags definitions for CryptCreateHash // dwFlags definitions for CryptCreateHash
#define CRYPT_SECRETDIGEST 0x00000001 #define CRYPT_SECRETDIGEST 0x00000001
#if (NTDDI_VERSION >= NTDDI_WINXP)
// dwFlags definitions for CryptHashData // dwFlags definitions for CryptHashData
#define CRYPT_OWF_REPL_LM_HASH 0x00000001 // this is only for the OWF replacem ent CSP #define CRYPT_OWF_REPL_LM_HASH 0x00000001 // this is only for the OWF replacem ent CSP
#endif //(NTDDI_VERSION >= NTDDI_WINXP)
// dwFlags definitions for CryptHashSessionKey // dwFlags definitions for CryptHashSessionKey
#define CRYPT_LITTLE_ENDIAN 0x00000001 #define CRYPT_LITTLE_ENDIAN 0x00000001
// dwFlags definitions for CryptSignHash and CryptVerifySignature // dwFlags definitions for CryptSignHash and CryptVerifySignature
#define CRYPT_NOHASHOID 0x00000001 #define CRYPT_NOHASHOID 0x00000001
#define CRYPT_TYPE2_FORMAT 0x00000002 #define CRYPT_TYPE2_FORMAT 0x00000002
#define CRYPT_X931_FORMAT 0x00000004 #define CRYPT_X931_FORMAT 0x00000004
// dwFlag definitions for CryptSetProviderEx and CryptGetDefaultProvider // dwFlag definitions for CryptSetProviderEx and CryptGetDefaultProvider
#define CRYPT_MACHINE_DEFAULT 0x00000001 #define CRYPT_MACHINE_DEFAULT 0x00000001
#define CRYPT_USER_DEFAULT 0x00000002 #define CRYPT_USER_DEFAULT 0x00000002
#define CRYPT_DELETE_DEFAULT 0x00000004 #define CRYPT_DELETE_DEFAULT 0x00000004
// exported key blob definitions // exported key blob definitions
// certenrolld_begin -- *BLOB
#define SIMPLEBLOB 0x1 #define SIMPLEBLOB 0x1
#define PUBLICKEYBLOB 0x6 #define PUBLICKEYBLOB 0x6
#define PRIVATEKEYBLOB 0x7 #define PRIVATEKEYBLOB 0x7
#define PLAINTEXTKEYBLOB 0x8 #define PLAINTEXTKEYBLOB 0x8
#define OPAQUEKEYBLOB 0x9 #define OPAQUEKEYBLOB 0x9
#define PUBLICKEYBLOBEX 0xA #define PUBLICKEYBLOBEX 0xA
#define SYMMETRICWRAPKEYBLOB 0xB #define SYMMETRICWRAPKEYBLOB 0xB
#if (NTDDI_VERSION >= NTDDI_WS03)
#define KEYSTATEBLOB 0xC #define KEYSTATEBLOB 0xC
#endif //(NTDDI_VERSION >= NTDDI_WS03)
// certenrolld_end
// certenrolld_begin -- AT_*
#define AT_KEYEXCHANGE 1 #define AT_KEYEXCHANGE 1
#define AT_SIGNATURE 2 #define AT_SIGNATURE 2
// certenrolld_end
#define CRYPT_USERDATA 1 #define CRYPT_USERDATA 1
// dwParam // dwParam
#define KP_IV 1 // Initialization vector #define KP_IV 1 // Initialization vector
#define KP_SALT 2 // Salt value #define KP_SALT 2 // Salt value
#define KP_PADDING 3 // Padding values #define KP_PADDING 3 // Padding values
#define KP_MODE 4 // Mode of the cipher #define KP_MODE 4 // Mode of the cipher
#define KP_MODE_BITS 5 // Number of bits to feedback #define KP_MODE_BITS 5 // Number of bits to feedback
#define KP_PERMISSIONS 6 // Key permissions DWORD #define KP_PERMISSIONS 6 // Key permissions DWORD
skipping to change at line 369 skipping to change at line 456
#define KP_PRECOMP_SHA 25 #define KP_PRECOMP_SHA 25
#define KP_CERTIFICATE 26 // for setting Secure Channel certificat e data (PCT1) #define KP_CERTIFICATE 26 // for setting Secure Channel certificat e data (PCT1)
#define KP_CLEAR_KEY 27 // for setting Secure Channel clear key data (PCT1) #define KP_CLEAR_KEY 27 // for setting Secure Channel clear key data (PCT1)
#define KP_PUB_EX_LEN 28 #define KP_PUB_EX_LEN 28
#define KP_PUB_EX_VAL 29 #define KP_PUB_EX_VAL 29
#define KP_KEYVAL 30 #define KP_KEYVAL 30
#define KP_ADMIN_PIN 31 #define KP_ADMIN_PIN 31
#define KP_KEYEXCHANGE_PIN 32 #define KP_KEYEXCHANGE_PIN 32
#define KP_SIGNATURE_PIN 33 #define KP_SIGNATURE_PIN 33
#define KP_PREHASH 34 #define KP_PREHASH 34
#if (NTDDI_VERSION >= NTDDI_WS03)
#define KP_ROUNDS 35 #define KP_ROUNDS 35
#endif //(NTDDI_VERSION >= NTDDI_WS03)
#define KP_OAEP_PARAMS 36 // for setting OAEP params on RSA keys #define KP_OAEP_PARAMS 36 // for setting OAEP params on RSA keys
#define KP_CMS_KEY_INFO 37 #define KP_CMS_KEY_INFO 37
#define KP_CMS_DH_KEY_INFO 38 #define KP_CMS_DH_KEY_INFO 38
#define KP_PUB_PARAMS 39 // for setting public parameters #define KP_PUB_PARAMS 39 // for setting public parameters
#define KP_VERIFY_PARAMS 40 // for verifying DSA and DH parameters #define KP_VERIFY_PARAMS 40 // for verifying DSA and DH parameters
#define KP_HIGHEST_VERSION 41 // for TLS protocol version setting #define KP_HIGHEST_VERSION 41 // for TLS protocol version setting
#if (NTDDI_VERSION >= NTDDI_WS03)
#define KP_GET_USE_COUNT 42 // for use with PP_CRYPT_COUNT_KEY_USE c ontexts #define KP_GET_USE_COUNT 42 // for use with PP_CRYPT_COUNT_KEY_USE c ontexts
#endif //(NTDDI_VERSION >= NTDDI_WS03)
// KP_PADDING // KP_PADDING
#define PKCS5_PADDING 1 // PKCS 5 (sec 6.2) padding method #define PKCS5_PADDING 1 // PKCS 5 (sec 6.2) padding method
#define RANDOM_PADDING 2 #define RANDOM_PADDING 2
#define ZERO_PADDING 3 #define ZERO_PADDING 3
// KP_MODE // KP_MODE
#define CRYPT_MODE_CBC 1 // Cipher block chaining #define CRYPT_MODE_CBC 1 // Cipher block chaining
#define CRYPT_MODE_ECB 2 // Electronic code book #define CRYPT_MODE_ECB 2 // Electronic code book
#define CRYPT_MODE_OFB 3 // Output feedback mode #define CRYPT_MODE_OFB 3 // Output feedback mode
skipping to change at line 399 skipping to change at line 490
// KP_PERMISSIONS // KP_PERMISSIONS
#define CRYPT_ENCRYPT 0x0001 // Allow encryption #define CRYPT_ENCRYPT 0x0001 // Allow encryption
#define CRYPT_DECRYPT 0x0002 // Allow decryption #define CRYPT_DECRYPT 0x0002 // Allow decryption
#define CRYPT_EXPORT 0x0004 // Allow key to be exported #define CRYPT_EXPORT 0x0004 // Allow key to be exported
#define CRYPT_READ 0x0008 // Allow parameters to be read #define CRYPT_READ 0x0008 // Allow parameters to be read
#define CRYPT_WRITE 0x0010 // Allow parameters to be set #define CRYPT_WRITE 0x0010 // Allow parameters to be set
#define CRYPT_MAC 0x0020 // Allow MACs to be used with key #define CRYPT_MAC 0x0020 // Allow MACs to be used with key
#define CRYPT_EXPORT_KEY 0x0040 // Allow key to be used for exporting ke ys #define CRYPT_EXPORT_KEY 0x0040 // Allow key to be used for exporting ke ys
#define CRYPT_IMPORT_KEY 0x0080 // Allow key to be used for importing ke ys #define CRYPT_IMPORT_KEY 0x0080 // Allow key to be used for importing ke ys
#if (NTDDI_VERSION >= NTDDI_WINXP)
#define CRYPT_ARCHIVE 0x0100 // Allow key to be exported at creation only #define CRYPT_ARCHIVE 0x0100 // Allow key to be exported at creation only
#endif //(NTDDI_VERSION >= NTDDI_WINXP)
#define HP_ALGID 0x0001 // Hash algorithm #define HP_ALGID 0x0001 // Hash algorithm
#define HP_HASHVAL 0x0002 // Hash value #define HP_HASHVAL 0x0002 // Hash value
#define HP_HASHSIZE 0x0004 // Hash value size #define HP_HASHSIZE 0x0004 // Hash value size
#define HP_HMAC_INFO 0x0005 // information for creating an HMAC #define HP_HMAC_INFO 0x0005 // information for creating an HMAC
#define HP_TLS1PRF_LABEL 0x0006 // label for TLS1 PRF #define HP_TLS1PRF_LABEL 0x0006 // label for TLS1 PRF
#define HP_TLS1PRF_SEED 0x0007 // seed for TLS1 PRF #define HP_TLS1PRF_SEED 0x0007 // seed for TLS1 PRF
#define CRYPT_FAILED FALSE #define CRYPT_FAILED FALSE
#define CRYPT_SUCCEED TRUE #define CRYPT_SUCCEED TRUE
skipping to change at line 447 skipping to change at line 540
#define PP_ADMIN_PIN 31 #define PP_ADMIN_PIN 31
#define PP_KEYEXCHANGE_PIN 32 #define PP_KEYEXCHANGE_PIN 32
#define PP_SIGNATURE_PIN 33 #define PP_SIGNATURE_PIN 33
#define PP_SIG_KEYSIZE_INC 34 #define PP_SIG_KEYSIZE_INC 34
#define PP_KEYX_KEYSIZE_INC 35 #define PP_KEYX_KEYSIZE_INC 35
#define PP_UNIQUE_CONTAINER 36 #define PP_UNIQUE_CONTAINER 36
#define PP_SGC_INFO 37 #define PP_SGC_INFO 37
#define PP_USE_HARDWARE_RNG 38 #define PP_USE_HARDWARE_RNG 38
#define PP_KEYSPEC 39 #define PP_KEYSPEC 39
#define PP_ENUMEX_SIGNING_PROT 40 #define PP_ENUMEX_SIGNING_PROT 40
#if (NTDDI_VERSION >= NTDDI_WS03)
#define PP_CRYPT_COUNT_KEY_USE 41 #define PP_CRYPT_COUNT_KEY_USE 41
#endif //(NTDDI_VERSION >= NTDDI_WS03)
#if (NTDDI_VERSION >= NTDDI_WINLH)
#define PP_USER_CERTSTORE 42
#define PP_SMARTCARD_READER 43
#define PP_SMARTCARD_GUID 45
#define PP_ROOT_CERTSTORE 46
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
#define CRYPT_FIRST 1 #define CRYPT_FIRST 1
#define CRYPT_NEXT 2 #define CRYPT_NEXT 2
#define CRYPT_SGC_ENUM 4 #define CRYPT_SGC_ENUM 4
#define CRYPT_IMPL_HARDWARE 1 #define CRYPT_IMPL_HARDWARE 1
#define CRYPT_IMPL_SOFTWARE 2 #define CRYPT_IMPL_SOFTWARE 2
#define CRYPT_IMPL_MIXED 3 #define CRYPT_IMPL_MIXED 3
#define CRYPT_IMPL_UNKNOWN 4 #define CRYPT_IMPL_UNKNOWN 4
#define CRYPT_IMPL_REMOVABLE 8 #define CRYPT_IMPL_REMOVABLE 8
skipping to change at line 486 skipping to change at line 587
// //
// CryptSetProvParam // CryptSetProvParam
// //
#define PP_CLIENT_HWND 1 #define PP_CLIENT_HWND 1
#define PP_CONTEXT_INFO 11 #define PP_CONTEXT_INFO 11
#define PP_KEYEXCHANGE_KEYSIZE 12 #define PP_KEYEXCHANGE_KEYSIZE 12
#define PP_SIGNATURE_KEYSIZE 13 #define PP_SIGNATURE_KEYSIZE 13
#define PP_KEYEXCHANGE_ALG 14 #define PP_KEYEXCHANGE_ALG 14
#define PP_SIGNATURE_ALG 15 #define PP_SIGNATURE_ALG 15
#define PP_DELETEKEY 24 #define PP_DELETEKEY 24
#if (NTDDI_VERSION >= NTDDI_WINLH)
#define PP_PIN_PROMPT_STRING 44
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
// certenrolld_begin -- PROV_RSA_*
#define PROV_RSA_FULL 1 #define PROV_RSA_FULL 1
#define PROV_RSA_SIG 2 #define PROV_RSA_SIG 2
#define PROV_DSS 3 #define PROV_DSS 3
#define PROV_FORTEZZA 4 #define PROV_FORTEZZA 4
#define PROV_MS_EXCHANGE 5 #define PROV_MS_EXCHANGE 5
#define PROV_SSL 6 #define PROV_SSL 6
#define PROV_RSA_SCHANNEL 12 #define PROV_RSA_SCHANNEL 12
#define PROV_DSS_DH 13 #define PROV_DSS_DH 13
#define PROV_EC_ECDSA_SIG 14 #define PROV_EC_ECDSA_SIG 14
#define PROV_EC_ECNRA_SIG 15 #define PROV_EC_ECNRA_SIG 15
#define PROV_EC_ECDSA_FULL 16 #define PROV_EC_ECDSA_FULL 16
#define PROV_EC_ECNRA_FULL 17 #define PROV_EC_ECNRA_FULL 17
#define PROV_DH_SCHANNEL 18 #define PROV_DH_SCHANNEL 18
#define PROV_SPYRUS_LYNKS 20 #define PROV_SPYRUS_LYNKS 20
#define PROV_RNG 21 #define PROV_RNG 21
#define PROV_INTEL_SEC 22 #define PROV_INTEL_SEC 22
#if (NTDDI_VERSION >= NTDDI_WINXP)
#define PROV_REPLACE_OWF 23 #define PROV_REPLACE_OWF 23
#define PROV_RSA_AES 24 #define PROV_RSA_AES 24
#endif //(NTDDI_VERSION >= NTDDI_WINXP)
// certenrolld_end
#if (NTDDI_VERSION <= NTDDI_WINXP)
//
// STT defined Providers
//
#define PROV_STT_MER 7
#define PROV_STT_ACQ 8
#define PROV_STT_BRND 9
#define PROV_STT_ROOT 10
#define PROV_STT_ISS 11
#endif //(NTDDI_VERSION <= NTDDI_WINXP)
// //
// Provider friendly names // Provider friendly names
// //
#define MS_DEF_PROV_A "Microsoft Base Cryptographic Provider v1.0" #define MS_DEF_PROV_A "Microsoft Base Cryptographic Provider v1.0"
#define MS_DEF_PROV_W L"Microsoft Base Cryptographic Provider v1.0" #define MS_DEF_PROV_W L"Microsoft Base Cryptographic Provider v1.0"
#ifdef UNICODE #ifdef UNICODE
#define MS_DEF_PROV MS_DEF_PROV_W #define MS_DEF_PROV MS_DEF_PROV_W
#else #else
#define MS_DEF_PROV MS_DEF_PROV_A #define MS_DEF_PROV MS_DEF_PROV_A
skipping to change at line 589 skipping to change at line 708
#endif #endif
#define MS_SCARD_PROV_A "Microsoft Base Smart Card Crypto Provider" #define MS_SCARD_PROV_A "Microsoft Base Smart Card Crypto Provider"
#define MS_SCARD_PROV_W L"Microsoft Base Smart Card Crypto Provider" #define MS_SCARD_PROV_W L"Microsoft Base Smart Card Crypto Provider"
#ifdef UNICODE #ifdef UNICODE
#define MS_SCARD_PROV MS_SCARD_PROV_W #define MS_SCARD_PROV MS_SCARD_PROV_W
#else #else
#define MS_SCARD_PROV MS_SCARD_PROV_A #define MS_SCARD_PROV MS_SCARD_PROV_A
#endif #endif
#if (NTDDI_VERSION >= NTDDI_WS03)
#define MS_ENH_RSA_AES_PROV_A "Microsoft Enhanced RSA and AES Cryptographic Pr ovider" #define MS_ENH_RSA_AES_PROV_A "Microsoft Enhanced RSA and AES Cryptographic Pr ovider"
#define MS_ENH_RSA_AES_PROV_W L"Microsoft Enhanced RSA and AES Cryptographic P rovider" #define MS_ENH_RSA_AES_PROV_W L"Microsoft Enhanced RSA and AES Cryptographic P rovider"
#elif (NTDDI_VERSION == NTDDI_WINXP)
#define MS_ENH_RSA_AES_PROV_A "Microsoft Enhanced RSA and AES Cryptographic Pr
ovider (Prototype)"
#define MS_ENH_RSA_AES_PROV_W L"Microsoft Enhanced RSA and AES Cryptographic P
rovider (Prototype)"
#endif //(NTDDI_VERSION >= NTDDI_WS03)
#if (NTDDI_VERSION >= NTDDI_WINXP)
#ifdef UNICODE #ifdef UNICODE
#define MS_ENH_RSA_AES_PROV MS_ENH_RSA_AES_PROV_W #define MS_ENH_RSA_AES_PROV MS_ENH_RSA_AES_PROV_W
#else #else
#define MS_ENH_RSA_AES_PROV MS_ENH_RSA_AES_PROV_A #define MS_ENH_RSA_AES_PROV MS_ENH_RSA_AES_PROV_A
#endif #endif
#endif //(NTDDI_VERSION >= NTDDI_WINXP)
#define MAXUIDLEN 64 #define MAXUIDLEN 64
// Exponentiation Offload Reg Location // Exponentiation Offload Reg Location
#define EXPO_OFFLOAD_REG_VALUE "ExpoOffload" #define EXPO_OFFLOAD_REG_VALUE "ExpoOffload"
#define EXPO_OFFLOAD_FUNC_NAME "OffloadModExpo" #define EXPO_OFFLOAD_FUNC_NAME "OffloadModExpo"
// //
// Registry key in which the following private key-related // Registry key in which the following private key-related
// values are created. // values are created.
skipping to change at line 650 skipping to change at line 776
// UI-protected). // UI-protected).
// //
// To enable the new behavior, create the registry DWORD value // To enable the new behavior, create the registry DWORD value
// szKEY_CACHE_ENABLED and set it to 1. The registry DWORD value // szKEY_CACHE_ENABLED and set it to 1. The registry DWORD value
// szKEY_CACHE_SECONDS must also be created and set to the number of seconds // szKEY_CACHE_SECONDS must also be created and set to the number of seconds
// that a cached private key may still be considered usable. // that a cached private key may still be considered usable.
// //
#define szKEY_CACHE_ENABLED "CachePrivateKeys" #define szKEY_CACHE_ENABLED "CachePrivateKeys"
#define szKEY_CACHE_SECONDS "PrivateKeyLifetimeSeconds" #define szKEY_CACHE_SECONDS "PrivateKeyLifetimeSeconds"
#if (NTDDI_VERSION >= NTDDI_WINXP)
// //
// In platforms later than (and not including) Windows Server 2003, private // In platforms later than (and not including) Windows Server 2003, private
// keys are always cached for a period of time per-process, even when // keys are always cached for a period of time per-process, even when
// not being used in any context. // not being used in any context.
// //
// The differences between the process-wide caching settings described below // The differences between the process-wide caching settings described below
// and the Optional Key Timeouts described above are subtle. // and the Optional Key Timeouts described above are subtle.
// //
// - The Optional Key Timeout policy is applied only when an attempt is made // - The Optional Key Timeout policy is applied only when an attempt is made
// to use a specific private key with an open context handle (HCRYPTPROV). // to use a specific private key with an open context handle (HCRYPTPROV).
skipping to change at line 692 skipping to change at line 819
// //
#define szPRIV_KEY_CACHE_MAX_ITEMS "PrivKeyCacheMaxItems" #define szPRIV_KEY_CACHE_MAX_ITEMS "PrivKeyCacheMaxItems"
#define cPRIV_KEY_CACHE_MAX_ITEMS_DEFAULT 20 #define cPRIV_KEY_CACHE_MAX_ITEMS_DEFAULT 20
// //
// Registry value for controlling the interval at which the private key // Registry value for controlling the interval at which the private key
// cache is proactively purged of outdated keys. // cache is proactively purged of outdated keys.
// //
#define szPRIV_KEY_CACHE_PURGE_INTERVAL_SECONDS "PrivKeyCachePurgeIntervalSecond s" #define szPRIV_KEY_CACHE_PURGE_INTERVAL_SECONDS "PrivKeyCachePurgeIntervalSecond s"
#define cPRIV_KEY_CACHE_PURGE_INTERVAL_SECONDS_DEFAULT 86400 // 1 day #define cPRIV_KEY_CACHE_PURGE_INTERVAL_SECONDS_DEFAULT 86400 // 1 day
#endif //(NTDDI_VERSION >= NTDDI_WINXP)
#define CUR_BLOB_VERSION 2 #define CUR_BLOB_VERSION 2
// structure for use with CryptSetKeyParam for CMS keys // structure for use with CryptSetKeyParam for CMS keys
// DO NOT USE THIS STRUCTURE!!!!! // DO NOT USE THIS STRUCTURE!!!!!
typedef struct _CMS_KEY_INFO { typedef struct _CMS_KEY_INFO {
DWORD dwVersion; // sizeof(CMS_KEY_INFO) DWORD dwVersion; // sizeof(CMS_KEY_INFO)
ALG_ID Algid; // algorithmm id for the key to be converted ALG_ID Algid; // algorithmm id for the key to be converted
BYTE *pbOID; // pointer to OID to hash in wit h Z BYTE *pbOID; // pointer to OID to hash in wit h Z
DWORD cbOID; // length of OID to hash in with Z DWORD cbOID; // length of OID to hash in with Z
skipping to change at line 736 skipping to change at line 864
// uses of dwFlags SCHANNEL_ALG structure // uses of dwFlags SCHANNEL_ALG structure
#define INTERNATIONAL_USAGE 0x00000001 #define INTERNATIONAL_USAGE 0x00000001
typedef struct _PROV_ENUMALGS { typedef struct _PROV_ENUMALGS {
ALG_ID aiAlgid; ALG_ID aiAlgid;
DWORD dwBitLen; DWORD dwBitLen;
DWORD dwNameLen; DWORD dwNameLen;
CHAR szName[20]; CHAR szName[20];
} PROV_ENUMALGS; } PROV_ENUMALGS;
// certenrolls_begin -- PROV_ENUMALGS_EX
typedef struct _PROV_ENUMALGS_EX { typedef struct _PROV_ENUMALGS_EX {
ALG_ID aiAlgid; ALG_ID aiAlgid;
DWORD dwDefaultLen; DWORD dwDefaultLen;
DWORD dwMinLen; DWORD dwMinLen;
DWORD dwMaxLen; DWORD dwMaxLen;
DWORD dwProtocols; DWORD dwProtocols;
DWORD dwNameLen; DWORD dwNameLen;
CHAR szName[20]; CHAR szName[20];
DWORD dwLongNameLen; DWORD dwLongNameLen;
CHAR szLongName[40]; CHAR szLongName[40];
} PROV_ENUMALGS_EX; } PROV_ENUMALGS_EX;
// certenrolls_end
typedef struct _PUBLICKEYSTRUC { typedef struct _PUBLICKEYSTRUC {
BYTE bType; BYTE bType;
BYTE bVersion; BYTE bVersion;
WORD reserved; WORD reserved;
ALG_ID aiKeyAlg; ALG_ID aiKeyAlg;
} BLOBHEADER, PUBLICKEYSTRUC; } BLOBHEADER, PUBLICKEYSTRUC;
typedef struct _RSAPUBKEY { typedef struct _RSAPUBKEY {
DWORD magic; // Has to be RSA1 DWORD magic; // Has to be RSA1
skipping to change at line 801 skipping to change at line 931
GUID Type; GUID Type;
GUID Subtype; GUID Subtype;
} KEY_TYPE_SUBTYPE, *PKEY_TYPE_SUBTYPE; } KEY_TYPE_SUBTYPE, *PKEY_TYPE_SUBTYPE;
typedef struct _CERT_FORTEZZA_DATA_PROP { typedef struct _CERT_FORTEZZA_DATA_PROP {
unsigned char SerialNumber[8]; unsigned char SerialNumber[8];
int CertIndex; int CertIndex;
unsigned char CertLabel[36]; unsigned char CertLabel[36];
} CERT_FORTEZZA_DATA_PROP; } CERT_FORTEZZA_DATA_PROP;
#if (NTDDI_VERSION >= NTDDI_WS03)
typedef struct _CRYPT_RC4_KEY_STATE { typedef struct _CRYPT_RC4_KEY_STATE {
unsigned char Key[16]; unsigned char Key[16];
unsigned char SBox[256]; unsigned char SBox[256];
unsigned char i; unsigned char i;
unsigned char j; unsigned char j;
} CRYPT_RC4_KEY_STATE, *PCRYPT_RC4_KEY_STATE; } CRYPT_RC4_KEY_STATE, *PCRYPT_RC4_KEY_STATE;
typedef struct _CRYPT_DES_KEY_STATE { typedef struct _CRYPT_DES_KEY_STATE {
unsigned char Key[8]; unsigned char Key[8];
unsigned char IV[8]; unsigned char IV[8];
unsigned char Feedback[8]; unsigned char Feedback[8];
} CRYPT_DES_KEY_STATE, *PCRYPT_DES_KEY_STATE; } CRYPT_DES_KEY_STATE, *PCRYPT_DES_KEY_STATE;
typedef struct _CRYPT_3DES_KEY_STATE { typedef struct _CRYPT_3DES_KEY_STATE {
unsigned char Key[24]; unsigned char Key[24];
unsigned char IV[8]; unsigned char IV[8];
unsigned char Feedback[8]; unsigned char Feedback[8];
} CRYPT_3DES_KEY_STATE, *PCRYPT_3DES_KEY_STATE; } CRYPT_3DES_KEY_STATE, *PCRYPT_3DES_KEY_STATE;
#endif //(NTDDI_VERSION >= NTDDI_WS03)
#if (NTDDI_VERSION >= NTDDI_WINLH)
typedef struct _CRYPT_AES_128_KEY_STATE {
unsigned char Key[16];
unsigned char IV[16];
unsigned char EncryptionState[11][16]; // 10 rounds + 1
unsigned char DecryptionState[11][16];
unsigned char Feedback[16];
} CRYPT_AES_128_KEY_STATE, *PCRYPT_AES_128_KEY_STATE;
typedef struct _CRYPT_AES_256_KEY_STATE {
unsigned char Key[32];
unsigned char IV[16];
unsigned char EncryptionState[15][16]; // 14 rounds + 1
unsigned char DecryptionState[15][16];
unsigned char Feedback[16];
} CRYPT_AES_256_KEY_STATE, *PCRYPT_AES_256_KEY_STATE;
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CRYPTOAPI BLOB definitions // CRYPTOAPI BLOB definitions
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// certenrolls_begin -- *_BLOB
typedef struct _CRYPTOAPI_BLOB { typedef struct _CRYPTOAPI_BLOB {
DWORD cbData; DWORD cbData;
BYTE *pbData; __field_bcount(cbData) BYTE *pbData;
} CRYPT_INTEGER_BLOB, *PCRYPT_INTEGER_BLOB, } CRYPT_INTEGER_BLOB, *PCRYPT_INTEGER_BLOB,
CRYPT_UINT_BLOB, *PCRYPT_UINT_BLOB, CRYPT_UINT_BLOB, *PCRYPT_UINT_BLOB,
CRYPT_OBJID_BLOB, *PCRYPT_OBJID_BLOB, CRYPT_OBJID_BLOB, *PCRYPT_OBJID_BLOB,
CERT_NAME_BLOB, *PCERT_NAME_BLOB, CERT_NAME_BLOB, *PCERT_NAME_BLOB,
CERT_RDN_VALUE_BLOB, *PCERT_RDN_VALUE_BLOB, CERT_RDN_VALUE_BLOB, *PCERT_RDN_VALUE_BLOB,
CERT_BLOB, *PCERT_BLOB, CERT_BLOB, *PCERT_BLOB,
CRL_BLOB, *PCRL_BLOB, CRL_BLOB, *PCRL_BLOB,
DATA_BLOB, *PDATA_BLOB, DATA_BLOB, *PDATA_BLOB,
CRYPT_DATA_BLOB, *PCRYPT_DATA_BLOB, CRYPT_DATA_BLOB, *PCRYPT_DATA_BLOB,
CRYPT_HASH_BLOB, *PCRYPT_HASH_BLOB, CRYPT_HASH_BLOB, *PCRYPT_HASH_BLOB,
CRYPT_DIGEST_BLOB, *PCRYPT_DIGEST_BLOB, CRYPT_DIGEST_BLOB, *PCRYPT_DIGEST_BLOB,
CRYPT_DER_BLOB, *PCRYPT_DER_BLOB, CRYPT_DER_BLOB, *PCRYPT_DER_BLOB,
CRYPT_ATTR_BLOB, *PCRYPT_ATTR_BLOB; CRYPT_ATTR_BLOB, *PCRYPT_ATTR_BLOB;
// certenrolls_end
// structure for use with CryptSetKeyParam for CMS keys // structure for use with CryptSetKeyParam for CMS keys
typedef struct _CMS_DH_KEY_INFO { typedef struct _CMS_DH_KEY_INFO {
DWORD dwVersion; // sizeof(CMS_DH_KEY_INF O) DWORD dwVersion; // sizeof(CMS_DH_KEY_INF O)
ALG_ID Algid; // algorithmm id for the key to be converted ALG_ID Algid; // algorithmm id for the key to be converted
LPSTR pszContentEncObjId; // pointer to OID to hash in with Z LPSTR pszContentEncObjId; // pointer to OID to hash in with Z
CRYPT_DATA_BLOB PubInfo; // OPTIONAL - public information CRYPT_DATA_BLOB PubInfo; // OPTIONAL - public information
void *pReserved; // reserved - should be NULL void *pReserved; // reserved - should be NULL
} CMS_DH_KEY_INFO, *PCMS_DH_KEY_INFO; } CMS_DH_KEY_INFO, *PCMS_DH_KEY_INFO;
#if (NTDDI_VERSION >= NTDDI_WINLH)
WINADVAPI
BOOL
WINAPI
CryptAcquireContextA(
__out HCRYPTPROV *phProv,
__in_opt LPCSTR szContainer,
__in_opt LPCSTR szProvider,
__in DWORD dwProvType,
__in DWORD dwFlags
);
WINADVAPI
BOOL
WINAPI
CryptAcquireContextW(
__out HCRYPTPROV *phProv,
__in_opt LPCWSTR szContainer,
__in_opt LPCWSTR szProvider,
__in DWORD dwProvType,
__in DWORD dwFlags
);
#ifdef UNICODE
#define CryptAcquireContext CryptAcquireContextW
#else
#define CryptAcquireContext CryptAcquireContextA
#endif // !UNICODE
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
#if (NTDDI_VERSION >= NTDDI_WINXP) && (NTDDI_VERSION < NTDDI_WINLH)
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptAcquireContextA( CryptAcquireContextA(
HCRYPTPROV *phProv, HCRYPTPROV *phProv,
LPCSTR szContainer, LPCSTR szContainer,
LPCSTR szProvider, LPCSTR szProvider,
DWORD dwProvType, DWORD dwProvType,
DWORD dwFlags DWORD dwFlags
); );
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptAcquireContextW( CryptAcquireContextW(
HCRYPTPROV *phProv, HCRYPTPROV *phProv,
LPCWSTR szContainer, LPCWSTR szContainer,
LPCWSTR szProvider, LPCWSTR szProvider,
DWORD dwProvType, DWORD dwProvType,
DWORD dwFlags DWORD dwFlags
); );
#endif //(NTDDI_VERSION >= NTDDI_WINXP) && (NTDDI_VERSION < NTDDI_WINLH)
#if (NTDDI_VERSION < NTDDI_WINXP)
WINADVAPI
BOOL
WINAPI
CryptAcquireContextA(
HCRYPTPROV *phProv,
LPCSTR pszContainer,
LPCSTR pszProvider,
DWORD dwProvType,
DWORD dwFlags
);
WINADVAPI
BOOL
WINAPI
CryptAcquireContextW(
HCRYPTPROV *phProv,
LPCWSTR pszContainer,
LPCWSTR pszProvider,
DWORD dwProvType,
DWORD dwFlags
);
#endif //(NTDDI_VERSION < NTDDI_WINXP)
#if (NTDDI_VERSION < NTDDI_WINLH)
#ifdef UNICODE #ifdef UNICODE
#define CryptAcquireContext CryptAcquireContextW #define CryptAcquireContext CryptAcquireContextW
#else #else
#define CryptAcquireContext CryptAcquireContextA #define CryptAcquireContext CryptAcquireContextA
#endif // !UNICODE #endif // !UNICODE
#endif //(NTDDI_VERSION < NTDDI_WINLH)
#if (NTDDI_VERSION >= NTDDI_WINXP)
WINADVAPI
BOOL
WINAPI
CryptReleaseContext(
__in HCRYPTPROV hProv,
__in DWORD dwFlags
);
#endif //(NTDDI_VERSION >= NTDDI_WINXP)
#if (NTDDI_VERSION < NTDDI_WINXP)
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptReleaseContext( CryptReleaseContext(
HCRYPTPROV hProv, HCRYPTPROV hProv,
DWORD dwFlags ULONG_PTR dwFlags
); );
#endif //(NTDDI_VERSION < NTDDI_WINXP)
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptGenKey( CryptGenKey(
HCRYPTPROV hProv, __in HCRYPTPROV hProv,
ALG_ID Algid, __in ALG_ID Algid,
DWORD dwFlags, __in DWORD dwFlags,
HCRYPTKEY *phKey __out HCRYPTKEY *phKey
); );
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptDeriveKey( CryptDeriveKey(
HCRYPTPROV hProv, __in HCRYPTPROV hProv,
ALG_ID Algid, __in ALG_ID Algid,
HCRYPTHASH hBaseData, __in HCRYPTHASH hBaseData,
DWORD dwFlags, __in DWORD dwFlags,
HCRYPTKEY *phKey __out HCRYPTKEY *phKey
); );
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptDestroyKey( CryptDestroyKey(
HCRYPTKEY hKey __in HCRYPTKEY hKey
); );
#if (NTDDI_VERSION >= NTDDI_WINXP)
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptSetKeyParam( CryptSetKeyParam(
HCRYPTKEY hKey, __in HCRYPTKEY hKey,
DWORD dwParam, __in DWORD dwParam,
CONST BYTE *pbData, __in CONST BYTE *pbData,
DWORD dwFlags __in DWORD dwFlags
); );
#endif //(NTDDI_VERSION >= NTDDI_WINXP)
#if (NTDDI_VERSION < NTDDI_WINXP)
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptGetKeyParam( CryptSetKeyParam(
HCRYPTKEY hKey, HCRYPTKEY hKey,
DWORD dwParam, DWORD dwParam,
BYTE *pbData, BYTE *pbData,
DWORD *pdwDataLen,
DWORD dwFlags DWORD dwFlags
); );
#endif //(NTDDI_VERSION < NTDDI_WINXP)
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptGetKeyParam(
__in HCRYPTKEY hKey,
__in DWORD dwParam,
__out_bcount_part(*pdwDataLen, *pdwDataLen) BYTE *pbData,
__inout DWORD *pdwDataLen,
__in DWORD dwFlags
);
#if (NTDDI_VERSION >= NTDDI_WINXP)
WINADVAPI
BOOL
WINAPI
CryptSetHashParam(
__in HCRYPTHASH hHash,
__in DWORD dwParam,
__in CONST BYTE *pbData,
__in DWORD dwFlags
);
#endif //(NTDDI_VERSION >= NTDDI_WINXP)
#if (NTDDI_VERSION < NTDDI_WINXP)
WINADVAPI
BOOL
WINAPI
CryptSetHashParam( CryptSetHashParam(
HCRYPTHASH hHash, HCRYPTHASH hHash,
DWORD dwParam, DWORD dwParam,
CONST BYTE *pbData, BYTE*pbData,
DWORD dwFlags DWORD dwFlags
); );
#endif //(NTDDI_VERSION < NTDDI_WINXP)
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptGetHashParam( CryptGetHashParam(
HCRYPTHASH hHash, __in HCRYPTHASH hHash,
DWORD dwParam, __in DWORD dwParam,
BYTE *pbData, __out_bcount_part(*pdwDataLen, *pdwDataLen) BYTE *pbData,
DWORD *pdwDataLen, __inout DWORD *pdwDataLen,
DWORD dwFlags __in DWORD dwFlags
);
#if (NTDDI_VERSION >= NTDDI_WINXP)
WINADVAPI
BOOL
WINAPI
CryptSetProvParam(
__in HCRYPTPROV hProv,
__in DWORD dwParam,
__in CONST BYTE *pbData,
__in DWORD dwFlags
); );
#endif //(NTDDI_VERSION >= NTDDI_WINXP)
#if (NTDDI_VERSION < NTDDI_WINXP)
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptSetProvParam( CryptSetProvParam(
HCRYPTPROV hProv, HCRYPTPROV hProv,
DWORD dwParam, DWORD dwParam,
CONST BYTE *pbData, BYTE*pbData,
DWORD dwFlags DWORD dwFlags
); );
#endif //(NTDDI_VERSION < NTDDI_WINXP)
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptGetProvParam( CryptGetProvParam(
HCRYPTPROV hProv, __in HCRYPTPROV hProv,
DWORD dwParam, __in DWORD dwParam,
BYTE *pbData, __out_bcount_part_opt(*pdwDataLen, *pdwDataLen) BYTE *pbData,
DWORD *pdwDataLen, __inout DWORD *pdwDataLen,
DWORD dwFlags __in DWORD dwFlags
); );
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptGenRandom( CryptGenRandom(
HCRYPTPROV hProv, __in HCRYPTPROV hProv,
DWORD dwLen, __in DWORD dwLen,
BYTE *pbBuffer __inout_bcount(dwLen) BYTE *pbBuffer
); );
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptGetUserKey( CryptGetUserKey(
HCRYPTPROV hProv, __in HCRYPTPROV hProv,
DWORD dwKeySpec, __in DWORD dwKeySpec,
HCRYPTKEY *phUserKey __out HCRYPTKEY *phUserKey
); );
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptExportKey( CryptExportKey(
HCRYPTKEY hKey, __in HCRYPTKEY hKey,
HCRYPTKEY hExpKey, __in HCRYPTKEY hExpKey,
DWORD dwBlobType, __in DWORD dwBlobType,
DWORD dwFlags, __in DWORD dwFlags,
BYTE *pbData, __out_bcount_part_opt(*pdwDataLen, *pdwDataLen) BYTE *pbData,
DWORD *pdwDataLen __inout DWORD *pdwDataLen
); );
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptImportKey( CryptImportKey(
HCRYPTPROV hProv, __in HCRYPTPROV hProv,
CONST BYTE *pbData, __in_bcount(dwDataLen) CONST BYTE *pbData,
DWORD dwDataLen, __in DWORD dwDataLen,
HCRYPTKEY hPubKey, __in HCRYPTKEY hPubKey,
DWORD dwFlags, __in DWORD dwFlags,
HCRYPTKEY *phKey __out HCRYPTKEY *phKey
); );
WINADVAPI WINADVAPI
BOOL __success(0 < return) BOOL
WINAPI WINAPI
CryptEncrypt( CryptEncrypt(
HCRYPTKEY hKey, __in HCRYPTKEY hKey,
HCRYPTHASH hHash, __in HCRYPTHASH hHash,
BOOL Final, __in BOOL Final,
DWORD dwFlags, __in DWORD dwFlags,
BYTE *pbData, __inout_bcount_part(dwBufLen, *pdwDataLen) BYTE *pbData,
DWORD *pdwDataLen, __out DWORD *pdwDataLen,
DWORD dwBufLen __in DWORD dwBufLen
); );
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptDecrypt( CryptDecrypt(
HCRYPTKEY hKey, __in HCRYPTKEY hKey,
HCRYPTHASH hHash, __in HCRYPTHASH hHash,
BOOL Final, __in BOOL Final,
DWORD dwFlags, __in DWORD dwFlags,
BYTE *pbData, __inout_bcount_part(*pdwDataLen, *pdwDataLen) BYTE *pbData,
DWORD *pdwDataLen __deref_inout DWORD *pdwDataLen
); );
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptCreateHash( CryptCreateHash(
HCRYPTPROV hProv, __in HCRYPTPROV hProv,
ALG_ID Algid, __in ALG_ID Algid,
HCRYPTKEY hKey, __in HCRYPTKEY hKey,
DWORD dwFlags, __in DWORD dwFlags,
HCRYPTHASH *phHash __out HCRYPTHASH *phHash
); );
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptHashData( CryptHashData(
HCRYPTHASH hHash, __in HCRYPTHASH hHash,
CONST BYTE *pbData, __in_bcount(dwDataLen) CONST BYTE *pbData,
DWORD dwDataLen, __in DWORD dwDataLen,
DWORD dwFlags __in DWORD dwFlags
); );
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptHashSessionKey( CryptHashSessionKey(
HCRYPTHASH hHash, __in HCRYPTHASH hHash,
HCRYPTKEY hKey, __in HCRYPTKEY hKey,
DWORD dwFlags __in DWORD dwFlags
); );
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptDestroyHash( CryptDestroyHash(
HCRYPTHASH hHash __in HCRYPTHASH hHash
); );
#if (NTDDI_VERSION >= NTDDI_WINLH)
WINADVAPI
BOOL
WINAPI
CryptSignHashA(
__in HCRYPTHASH hHash,
__in DWORD dwKeySpec,
__in LPCSTR szDescription,
__in DWORD dwFlags,
__out_bcount_part_opt(*pdwSigLen, *pdwSigLen) BYTE *pbSignature,
__inout DWORD *pdwSigLen
);
WINADVAPI
BOOL
WINAPI
CryptSignHashW(
__in HCRYPTHASH hHash,
__in DWORD dwKeySpec,
__in LPCWSTR szDescription,
__in DWORD dwFlags,
__out_bcount_part_opt(*pdwSigLen, *pdwSigLen) BYTE *pbSignature,
__inout DWORD *pdwSigLen
);
#ifdef UNICODE
#define CryptSignHash CryptSignHashW
#else
#define CryptSignHash CryptSignHashA
#endif // !UNICODE
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
#if (NTDDI_VERSION >= NTDDI_WINXP) && (NTDDI_VERSION < NTDDI_WINLH)
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptSignHashA( CryptSignHashA(
HCRYPTHASH hHash, HCRYPTHASH hHash,
DWORD dwKeySpec, DWORD dwKeySpec,
LPCSTR szDescription, LPCSTR szDescription,
DWORD dwFlags, DWORD dwFlags,
BYTE *pbSignature, BYTE *pbSignature,
DWORD *pdwSigLen DWORD *pdwSigLen
skipping to change at line 1100 skipping to change at line 1393
BOOL BOOL
WINAPI WINAPI
CryptSignHashW( CryptSignHashW(
HCRYPTHASH hHash, HCRYPTHASH hHash,
DWORD dwKeySpec, DWORD dwKeySpec,
LPCWSTR szDescription, LPCWSTR szDescription,
DWORD dwFlags, DWORD dwFlags,
BYTE *pbSignature, BYTE *pbSignature,
DWORD *pdwSigLen DWORD *pdwSigLen
); );
#endif //(NTDDI_VERSION >= NTDDI_WINXP) && (NTDDI_VERSION < NTDDI_WINLH)
#if (NTDDI_VERSION < NTDDI_WINXP)
WINADVAPI
BOOL
WINAPI
CryptSignHashA(
HCRYPTHASH hHash,
DWORD dwKeySpec,
LPCSTR sDescription,
DWORD dwFlags,
BYTE *pbSignature,
DWORD *pdwSigLen
);
WINADVAPI
BOOL
WINAPI
CryptSignHashW(
HCRYPTHASH hHash,
DWORD dwKeySpec,
LPCWSTR sDescription,
DWORD dwFlags,
BYTE *pbSignature,
DWORD *pdwSigLen
);
#endif //(NTDDI_VERSION < NTDDI_WINXP)
#if (NTDDI_VERSION < NTDDI_WINLH)
#ifdef UNICODE #ifdef UNICODE
#define CryptSignHash CryptSignHashW #define CryptSignHash CryptSignHashW
#else #else
#define CryptSignHash CryptSignHashA #define CryptSignHash CryptSignHashA
#endif // !UNICODE #endif // !UNICODE
#endif //(NTDDI_VERSION < NTDDI_WINLH)
#if (NTDDI_VERSION >= NTDDI_WINLH)
WINADVAPI
BOOL
WINAPI
CryptVerifySignatureA(
__in HCRYPTHASH hHash,
__in_bcount(dwSigLen) CONST BYTE *pbSignature,
__in DWORD dwSigLen,
__in HCRYPTKEY hPubKey,
__in LPCSTR szDescription,
__in DWORD dwFlags
);
WINADVAPI
BOOL
WINAPI
CryptVerifySignatureW(
__in HCRYPTHASH hHash,
__in_bcount(dwSigLen) CONST BYTE *pbSignature,
__in DWORD dwSigLen,
__in HCRYPTKEY hPubKey,
__in LPCWSTR szDescription,
__in DWORD dwFlags
);
#ifdef UNICODE
#define CryptVerifySignature CryptVerifySignatureW
#else
#define CryptVerifySignature CryptVerifySignatureA
#endif // !UNICODE
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
#if (NTDDI_VERSION >= NTDDI_WINXP) && (NTDDI_VERSION < NTDDI_WINLH)
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptVerifySignatureA( CryptVerifySignatureA(
HCRYPTHASH hHash, HCRYPTHASH hHash,
CONST BYTE *pbSignature, CONST BYTE *pbSignature,
DWORD dwSigLen, DWORD dwSigLen,
HCRYPTKEY hPubKey, HCRYPTKEY hPubKey,
LPCSTR szDescription, LPCSTR szDescription,
DWORD dwFlags DWORD dwFlags
skipping to change at line 1128 skipping to change at line 1481
BOOL BOOL
WINAPI WINAPI
CryptVerifySignatureW( CryptVerifySignatureW(
HCRYPTHASH hHash, HCRYPTHASH hHash,
CONST BYTE *pbSignature, CONST BYTE *pbSignature,
DWORD dwSigLen, DWORD dwSigLen,
HCRYPTKEY hPubKey, HCRYPTKEY hPubKey,
LPCWSTR szDescription, LPCWSTR szDescription,
DWORD dwFlags DWORD dwFlags
); );
#endif //(NTDDI_VERSION >= NTDDI_WINXP) && (NTDDI_VERSION < NTDDI_WINLH)
#if (NTDDI_VERSION < NTDDI_WINXP)
WINADVAPI
BOOL
WINAPI
CryptVerifySignatureA(
HCRYPTHASH hHash,
CONST BYTE *pbSignature,
DWORD dwSigLen,
HCRYPTKEY hPubKey,
LPCSTR sDescription,
DWORD dwFlags
);
WINADVAPI
BOOL
WINAPI
CryptVerifySignatureW(
HCRYPTHASH hHash,
CONST BYTE *pbSignature,
DWORD dwSigLen,
HCRYPTKEY hPubKey,
LPCWSTR sDescription,
DWORD dwFlags
);
#endif //(NTDDI_VERSION < NTDDI_WINXP)
#if (NTDDI_VERSION < NTDDI_WINLH)
#ifdef UNICODE #ifdef UNICODE
#define CryptVerifySignature CryptVerifySignatureW #define CryptVerifySignature CryptVerifySignatureW
#else #else
#define CryptVerifySignature CryptVerifySignatureA #define CryptVerifySignature CryptVerifySignatureA
#endif // !UNICODE #endif // !UNICODE
#endif //(NTDDI_VERSION < NTDDI_WINLH)
#if (NTDDI_VERSION >= NTDDI_WINLH)
WINADVAPI
BOOL
WINAPI
CryptSetProviderA(
__in LPCSTR pszProvName,
__in DWORD dwProvType
);
WINADVAPI
BOOL
WINAPI
CryptSetProviderW(
__in LPCWSTR pszProvName,
__in DWORD dwProvType
);
#ifdef UNICODE
#define CryptSetProvider CryptSetProviderW
#else
#define CryptSetProvider CryptSetProviderA
#endif // !UNICODE
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
#if (NTDDI_VERSION < NTDDI_WINLH)
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptSetProviderA( CryptSetProviderA(
LPCSTR pszProvName, LPCSTR pszProvName,
DWORD dwProvType DWORD dwProvType
); );
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptSetProviderW( CryptSetProviderW(
LPCWSTR pszProvName, LPCWSTR pszProvName,
DWORD dwProvType DWORD dwProvType
); );
#ifdef UNICODE #ifdef UNICODE
#define CryptSetProvider CryptSetProviderW #define CryptSetProvider CryptSetProviderW
#else #else
#define CryptSetProvider CryptSetProviderA #define CryptSetProvider CryptSetProviderA
#endif // !UNICODE #endif // !UNICODE
#endif //(NTDDI_VERSION < NTDDI_WINLH)
#if (NTDDI_VERSION >= NTDDI_WINLH)
WINADVAPI
BOOL
WINAPI
CryptSetProviderExA(
__in LPCSTR pszProvName,
__in DWORD dwProvType,
__reserved DWORD *pdwReserved,
__in DWORD dwFlags
);
WINADVAPI
BOOL
WINAPI
CryptSetProviderExW(
__in LPCWSTR pszProvName,
__in DWORD dwProvType,
__reserved DWORD *pdwReserved,
__in DWORD dwFlags
);
#ifdef UNICODE
#define CryptSetProviderEx CryptSetProviderExW
#else
#define CryptSetProviderEx CryptSetProviderExA
#endif // !UNICODE
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
#if (NTDDI_VERSION < NTDDI_WINLH)
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptSetProviderExA( CryptSetProviderExA(
LPCSTR pszProvName, LPCSTR pszProvName,
DWORD dwProvType, DWORD dwProvType,
DWORD *pdwReserved, DWORD *pdwReserved,
DWORD dwFlags DWORD dwFlags
); );
WINADVAPI WINADVAPI
skipping to change at line 1177 skipping to change at line 1610
LPCWSTR pszProvName, LPCWSTR pszProvName,
DWORD dwProvType, DWORD dwProvType,
DWORD *pdwReserved, DWORD *pdwReserved,
DWORD dwFlags DWORD dwFlags
); );
#ifdef UNICODE #ifdef UNICODE
#define CryptSetProviderEx CryptSetProviderExW #define CryptSetProviderEx CryptSetProviderExW
#else #else
#define CryptSetProviderEx CryptSetProviderExA #define CryptSetProviderEx CryptSetProviderExA
#endif // !UNICODE #endif // !UNICODE
#endif //(NTDDI_VERSION < NTDDI_WINLH)
#if (NTDDI_VERSION >= NTDDI_WINLH)
WINADVAPI
BOOL
WINAPI
CryptGetDefaultProviderA(
__in DWORD dwProvType,
__reserved DWORD *pdwReserved,
__in DWORD dwFlags,
__out_bcount_part(*pcbProvName, *pcbProvName) LPSTR pszProvName,
__out DWORD *pcbProvName
);
WINADVAPI
BOOL
WINAPI
CryptGetDefaultProviderW(
__in DWORD dwProvType,
__reserved DWORD *pdwReserved,
__in DWORD dwFlags,
__out_bcount_part(*pcbProvName, *pcbProvName) LPWSTR pszProvName,
__out DWORD *pcbProvName
);
#ifdef UNICODE
#define CryptGetDefaultProvider CryptGetDefaultProviderW
#else
#define CryptGetDefaultProvider CryptGetDefaultProviderA
#endif // !UNICODE
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
#if (NTDDI_VERSION < NTDDI_WINLH)
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptGetDefaultProviderA( CryptGetDefaultProviderA(
DWORD dwProvType, DWORD dwProvType,
DWORD *pdwReserved, DWORD *pdwReserved,
DWORD dwFlags, DWORD dwFlags,
LPSTR pszProvName, LPSTR pszProvName,
DWORD *pcbProvName DWORD *pcbProvName
); );
skipping to change at line 1203 skipping to change at line 1666
DWORD *pdwReserved, DWORD *pdwReserved,
DWORD dwFlags, DWORD dwFlags,
LPWSTR pszProvName, LPWSTR pszProvName,
DWORD *pcbProvName DWORD *pcbProvName
); );
#ifdef UNICODE #ifdef UNICODE
#define CryptGetDefaultProvider CryptGetDefaultProviderW #define CryptGetDefaultProvider CryptGetDefaultProviderW
#else #else
#define CryptGetDefaultProvider CryptGetDefaultProviderA #define CryptGetDefaultProvider CryptGetDefaultProviderA
#endif // !UNICODE #endif // !UNICODE
#endif //(NTDDI_VERSION < NTDDI_WINLH)
#if (NTDDI_VERSION >= NTDDI_WINLH)
WINADVAPI
BOOL
WINAPI
CryptEnumProviderTypesA(
__in DWORD dwIndex,
__reserved DWORD *pdwReserved,
__in DWORD dwFlags,
__out DWORD *pdwProvType,
__out_bcount_part(*pcbTypeName, *pcbTypeName) LPSTR szTypeName,
__out DWORD *pcbTypeName
);
WINADVAPI
BOOL
WINAPI
CryptEnumProviderTypesW(
__in DWORD dwIndex,
__reserved DWORD *pdwReserved,
__in DWORD dwFlags,
__out DWORD *pdwProvType,
__out_bcount_part(*pcbTypeName, *pcbTypeName) LPWSTR szTypeName,
__out DWORD *pcbTypeName
);
#ifdef UNICODE
#define CryptEnumProviderTypes CryptEnumProviderTypesW
#else
#define CryptEnumProviderTypes CryptEnumProviderTypesA
#endif // !UNICODE
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
#if (NTDDI_VERSION >= NTDDI_WINXP) && (NTDDI_VERSION < NTDDI_WINLH)
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptEnumProviderTypesA( CryptEnumProviderTypesA(
DWORD dwIndex, DWORD dwIndex,
DWORD *pdwReserved, DWORD *pdwReserved,
DWORD dwFlags, DWORD dwFlags,
DWORD *pdwProvType, DWORD *pdwProvType,
LPSTR szTypeName, LPSTR szTypeName,
DWORD *pcbTypeName DWORD *pcbTypeName
skipping to change at line 1226 skipping to change at line 1721
BOOL BOOL
WINAPI WINAPI
CryptEnumProviderTypesW( CryptEnumProviderTypesW(
DWORD dwIndex, DWORD dwIndex,
DWORD *pdwReserved, DWORD *pdwReserved,
DWORD dwFlags, DWORD dwFlags,
DWORD *pdwProvType, DWORD *pdwProvType,
LPWSTR szTypeName, LPWSTR szTypeName,
DWORD *pcbTypeName DWORD *pcbTypeName
); );
#endif //(NTDDI_VERSION >= NTDDI_WINXP) && (NTDDI_VERSION < NTDDI_WINLH)
#if (NTDDI_VERSION < NTDDI_WINXP)
WINADVAPI
BOOL
WINAPI
CryptEnumProviderTypesA(
DWORD dwIndex,
DWORD * pdwReserved,
DWORD dwFlags,
DWORD * pdwProvType,
LPSTR pszTypeName,
DWORD * pcbTypeName
);
WINADVAPI
BOOL
WINAPI
CryptEnumProviderTypesW(
DWORD dwIndex,
DWORD * pdwReserved,
DWORD dwFlags,
DWORD * pdwProvType,
LPWSTR pszTypeName,
DWORD * pcbTypeName
);
#endif //(NTDDI_VERSION < NTDDI_WINXP)
#if (NTDDI_VERSION < NTDDI_WINLH)
#ifdef UNICODE #ifdef UNICODE
#define CryptEnumProviderTypes CryptEnumProviderTypesW #define CryptEnumProviderTypes CryptEnumProviderTypesW
#else #else
#define CryptEnumProviderTypes CryptEnumProviderTypesA #define CryptEnumProviderTypes CryptEnumProviderTypesA
#endif // !UNICODE #endif // !UNICODE
#endif //(NTDDI_VERSION < NTDDI_WINLH)
#if (NTDDI_VERSION >= NTDDI_WINLH)
WINADVAPI
BOOL
WINAPI
CryptEnumProvidersA(
__in DWORD dwIndex,
__reserved DWORD *pdwReserved,
__in DWORD dwFlags,
__out DWORD *pdwProvType,
__out_ecount_part_opt(*pcbProvName, *pcbProvName+1) LPSTR szProvName,
__inout DWORD *pcbProvName
);
WINADVAPI
BOOL
WINAPI
CryptEnumProvidersW(
__in DWORD dwIndex,
__reserved DWORD *pdwReserved,
__in DWORD dwFlags,
__out DWORD *pdwProvType,
__out_ecount_part_opt(*pcbProvName, *pcbProvName+1) LPWSTR szProvName,
__inout DWORD *pcbProvName
);
#ifdef UNICODE
#define CryptEnumProviders CryptEnumProvidersW
#else
#define CryptEnumProviders CryptEnumProvidersA
#endif // !UNICODE
#endif //(NTDDI_VERSION >= NTDDI_WINLH)
#if (NTDDI_VERSION >= NTDDI_WINXP) && (NTDDI_VERSION < NTDDI_WINLH)
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptEnumProvidersA( CryptEnumProvidersA(
DWORD dwIndex, DWORD dwIndex,
DWORD *pdwReserved, DWORD *pdwReserved,
DWORD dwFlags, DWORD dwFlags,
DWORD *pdwProvType, DWORD *pdwProvType,
LPSTR szProvName, LPSTR szProvName,
DWORD *pcbProvName DWORD *pcbProvName
skipping to change at line 1254 skipping to change at line 1809
BOOL BOOL
WINAPI WINAPI
CryptEnumProvidersW( CryptEnumProvidersW(
DWORD dwIndex, DWORD dwIndex,
DWORD *pdwReserved, DWORD *pdwReserved,
DWORD dwFlags, DWORD dwFlags,
DWORD *pdwProvType, DWORD *pdwProvType,
LPWSTR szProvName, LPWSTR szProvName,
DWORD *pcbProvName DWORD *pcbProvName
); );
#endif //(NTDDI_VERSION >= NTDDI_WINXP) && (NTDDI_VERSION < NTDDI_WINLH)
#if (NTDDI_VERSION < NTDDI_WINXP)
WINADVAPI
BOOL
WINAPI
CryptEnumProvidersA(
DWORD dwIndex,
DWORD * pdwReserved,
DWORD dwFlags,
DWORD * pdwProvType,
LPSTR pszProvName,
DWORD * pcbProvName
);
WINADVAPI
BOOL
WINAPI
CryptEnumProvidersW(
DWORD dwIndex,
DWORD * pdwReserved,
DWORD dwFlags,
DWORD * pdwProvType,
LPWSTR pszProvName,
DWORD * pcbProvName
);
#endif //(NTDDI_VERSION < NTDDI_WINXP)
#if (NTDDI_VERSION < NTDDI_WINLH)
#ifdef UNICODE #ifdef UNICODE
#define CryptEnumProviders CryptEnumProvidersW #define CryptEnumProviders CryptEnumProvidersW
#else #else
#define CryptEnumProviders CryptEnumProvidersA #define CryptEnumProviders CryptEnumProvidersA
#endif // !UNICODE #endif // !UNICODE
#endif //(NTDDI_VERSION < NTDDI_WINLH)
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptContextAddRef( CryptContextAddRef(
HCRYPTPROV hProv, __in HCRYPTPROV hProv,
DWORD *pdwReserved, __reserved DWORD *pdwReserved,
DWORD dwFlags __in DWORD dwFlags
); );
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptDuplicateKey( CryptDuplicateKey(
HCRYPTKEY hKey, __in HCRYPTKEY hKey,
DWORD *pdwReserved, __reserved DWORD *pdwReserved,
DWORD dwFlags, __in DWORD dwFlags,
HCRYPTKEY *phKey __out HCRYPTKEY *phKey
); );
WINADVAPI WINADVAPI
BOOL BOOL
WINAPI WINAPI
CryptDuplicateHash( CryptDuplicateHash(
HCRYPTHASH hHash, __in HCRYPTHASH hHash,
DWORD *pdwReserved, __reserved DWORD *pdwReserved,
DWORD dwFlags, __in DWORD dwFlags,
HCRYPTHASH *phHash __out HCRYPTHASH *phHash
); );
#if (NTDDI_VERSION >= NTDDI_WS03)
// //
// This function is provided in Microsoft Windows 2000 as a means of // This function is provided in Microsoft Windows 2000 as a means of
// installing the 128-bit encryption provider. This function is unavailable // installing the 128-bit encryption provider. This function is unavailable
// in Microsoft Windows XP, because Windows XP ships with the 128-bit // in Microsoft Windows XP, because Windows XP ships with the 128-bit
// encryption provider. // encryption provider.
// //
BOOL BOOL
__cdecl __cdecl
GetEncSChannel( GetEncSChannel(
BYTE **pData, BYTE **pData,
DWORD *dwDecSize DWORD *dwDecSize
); );
#endif //(NTDDI_VERSION >= NTDDI_WS03)
#if (NTDDI_VERSION == NTDDI_WINXP)
typedef struct {
DWORD dwVersion;
ALG_ID algId;
DWORD dwMinKeyLength;
DWORD dwMaxKeyLength;
DWORD dwRequiredFlags;
DWORD dwDisallowedFlags;
} _CRYPT_KEY_LIMITS_V01;
typedef _CRYPT_KEY_LIMITS_V01 CRYPT_KEY_LIMITS, *PCRYPT_KEY_LIMITS;
// Request Flag definitions
#define CRYPTLIMIT_USING_PCT 0x0001
#define CRYPTLIMIT_USING_SGC 0x0002
WINADVAPI
BOOL
WINAPI
CryptGetLocalKeyLimits(
IN ALG_ID algId,
IN DWORD dwFlags,
OUT PCRYPT_KEY_LIMITS pLimits,
IN OUT LPDWORD cbLimitLength);
#endif //(NTDDI_VERSION = NTDDI_WINXP)
#if !defined(_DDK_DRIVER_)
// In Longhorn, the following APIs were updated to support the new
// CNG (Cryptography Next Generation) BCrypt* and NCrypt* APIs in addition
// to the above CAPI1 APIs.
// Include the definitions for the CNG APIs
#include <bcrypt.h>
#include <ncrypt.h>
// This type is used when the API can take either the CAPI1 HCRYPTPROV or
// the CNG NCRYPT_KEY_HANDLE. Where appropriate, the HCRYPTPROV will be
// converted to a NCRYPT_KEY_HANDLE via the CNG NCryptTranslateHandle().
typedef ULONG_PTR HCRYPTPROV_OR_NCRYPT_KEY_HANDLE;
// This type is used where the HCRYPTPROV parameter is no longer used.
// The caller should always pass in NULL.
typedef ULONG_PTR HCRYPTPROV_LEGACY;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// In a CRYPT_BIT_BLOB the last byte may contain 0-7 unused bits. Therefore, th e // In a CRYPT_BIT_BLOB the last byte may contain 0-7 unused bits. Therefore, th e
// overall bit length is cbData * 8 - cUnusedBits. // overall bit length is cbData * 8 - cUnusedBits.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// certenrolls_begin -- CERT_CONTEXT
typedef struct _CRYPT_BIT_BLOB { typedef struct _CRYPT_BIT_BLOB {
DWORD cbData; DWORD cbData;
BYTE *pbData; BYTE *pbData;
DWORD cUnusedBits; DWORD cUnusedBits;
} CRYPT_BIT_BLOB, *PCRYPT_BIT_BLOB; } CRYPT_BIT_BLOB, *PCRYPT_BIT_BLOB;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Type used for any algorithm // Type used for any algorithm
// //
// Where the Parameters CRYPT_OBJID_BLOB is in its encoded representation. For most // Where the Parameters CRYPT_OBJID_BLOB is in its encoded representation. For most
// algorithm types, the Parameters CRYPT_OBJID_BLOB is NULL (Parameters.cbData = 0). // algorithm types, the Parameters CRYPT_OBJID_BLOB is NULL (Parameters.cbData = 0).
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CRYPT_ALGORITHM_IDENTIFIER { typedef struct _CRYPT_ALGORITHM_IDENTIFIER {
LPSTR pszObjId; LPSTR pszObjId;
CRYPT_OBJID_BLOB Parameters; CRYPT_OBJID_BLOB Parameters;
} CRYPT_ALGORITHM_IDENTIFIER, *PCRYPT_ALGORITHM_IDENTIFIER; } CRYPT_ALGORITHM_IDENTIFIER, *PCRYPT_ALGORITHM_IDENTIFIER;
// certenrolls_end
// Following are the definitions of various algorithm object identifiers // Following are the definitions of various algorithm object identifiers
// RSA // RSA
#define szOID_RSA "1.2.840.113549" #define szOID_RSA "1.2.840.113549"
#define szOID_PKCS "1.2.840.113549.1" #define szOID_PKCS "1.2.840.113549.1"
#define szOID_RSA_HASH "1.2.840.113549.2" #define szOID_RSA_HASH "1.2.840.113549.2"
#define szOID_RSA_ENCRYPT "1.2.840.113549.3" #define szOID_RSA_ENCRYPT "1.2.840.113549.3"
#define szOID_PKCS_1 "1.2.840.113549.1.1" #define szOID_PKCS_1 "1.2.840.113549.1.1"
#define szOID_PKCS_2 "1.2.840.113549.1.2" #define szOID_PKCS_2 "1.2.840.113549.1.2"
skipping to change at line 1349 skipping to change at line 1981
#define szOID_PKCS_10 "1.2.840.113549.1.10" #define szOID_PKCS_10 "1.2.840.113549.1.10"
#define szOID_PKCS_12 "1.2.840.113549.1.12" #define szOID_PKCS_12 "1.2.840.113549.1.12"
#define szOID_RSA_RSA "1.2.840.113549.1.1.1" #define szOID_RSA_RSA "1.2.840.113549.1.1.1"
#define szOID_RSA_MD2RSA "1.2.840.113549.1.1.2" #define szOID_RSA_MD2RSA "1.2.840.113549.1.1.2"
#define szOID_RSA_MD4RSA "1.2.840.113549.1.1.3" #define szOID_RSA_MD4RSA "1.2.840.113549.1.1.3"
#define szOID_RSA_MD5RSA "1.2.840.113549.1.1.4" #define szOID_RSA_MD5RSA "1.2.840.113549.1.1.4"
#define szOID_RSA_SHA1RSA "1.2.840.113549.1.1.5" #define szOID_RSA_SHA1RSA "1.2.840.113549.1.1.5"
#define szOID_RSA_SETOAEP_RSA "1.2.840.113549.1.1.6" #define szOID_RSA_SETOAEP_RSA "1.2.840.113549.1.1.6"
#define szOID_RSAES_OAEP "1.2.840.113549.1.1.7"
#define szOID_RSA_MGF1 "1.2.840.113549.1.1.8"
#define szOID_RSA_PSPECIFIED "1.2.840.113549.1.1.9"
#define szOID_RSA_SSA_PSS "1.2.840.113549.1.1.10"
#define szOID_RSA_SHA256RSA "1.2.840.113549.1.1.11"
#define szOID_RSA_SHA384RSA "1.2.840.113549.1.1.12"
#define szOID_RSA_SHA512RSA "1.2.840.113549.1.1.13"
#define szOID_RSA_DH "1.2.840.113549.1.3.1" #define szOID_RSA_DH "1.2.840.113549.1.3.1"
#define szOID_RSA_data "1.2.840.113549.1.7.1" #define szOID_RSA_data "1.2.840.113549.1.7.1"
#define szOID_RSA_signedData "1.2.840.113549.1.7.2" #define szOID_RSA_signedData "1.2.840.113549.1.7.2"
#define szOID_RSA_envelopedData "1.2.840.113549.1.7.3" #define szOID_RSA_envelopedData "1.2.840.113549.1.7.3"
#define szOID_RSA_signEnvData "1.2.840.113549.1.7.4" #define szOID_RSA_signEnvData "1.2.840.113549.1.7.4"
#define szOID_RSA_digestedData "1.2.840.113549.1.7.5" #define szOID_RSA_digestedData "1.2.840.113549.1.7.5"
#define szOID_RSA_hashedData "1.2.840.113549.1.7.5" #define szOID_RSA_hashedData "1.2.840.113549.1.7.5"
#define szOID_RSA_encryptedData "1.2.840.113549.1.7.6" #define szOID_RSA_encryptedData "1.2.840.113549.1.7.6"
skipping to change at line 1393 skipping to change at line 2033
#define szOID_RSA_DES_EDE3_CBC "1.2.840.113549.3.7" #define szOID_RSA_DES_EDE3_CBC "1.2.840.113549.3.7"
#define szOID_RSA_RC5_CBCPad "1.2.840.113549.3.9" #define szOID_RSA_RC5_CBCPad "1.2.840.113549.3.9"
#define szOID_ANSI_X942 "1.2.840.10046" #define szOID_ANSI_X942 "1.2.840.10046"
#define szOID_ANSI_X942_DH "1.2.840.10046.2.1" #define szOID_ANSI_X942_DH "1.2.840.10046.2.1"
#define szOID_X957 "1.2.840.10040" #define szOID_X957 "1.2.840.10040"
#define szOID_X957_DSA "1.2.840.10040.4.1" #define szOID_X957_DSA "1.2.840.10040.4.1"
#define szOID_X957_SHA1DSA "1.2.840.10040.4.3" #define szOID_X957_SHA1DSA "1.2.840.10040.4.3"
// iso(1) member-body(2) us(840) 10045 keyType(2) unrestricted(1)
#define szOID_ECC_PUBLIC_KEY "1.2.840.10045.2.1"
// iso(1) member-body(2) us(840) 10045 curves(3) prime(1) 7
#define szOID_ECC_CURVE_P256 "1.2.840.10045.3.1.7"
// iso(1) identified-organization(3) certicom(132) curve(0) 34
#define szOID_ECC_CURVE_P384 "1.3.132.0.34"
// iso(1) identified-organization(3) certicom(132) curve(0) 35
#define szOID_ECC_CURVE_P521 "1.3.132.0.35"
// iso(1) member-body(2) us(840) 10045 signatures(4) sha1(1)
#define szOID_ECDSA_SHA1 "1.2.840.10045.4.1"
// iso(1) member-body(2) us(840) 10045 signatures(4) specified(3)
#define szOID_ECDSA_SPECIFIED "1.2.840.10045.4.3"
// iso(1) member-body(2) us(840) 10045 signatures(4) specified(3) 2
#define szOID_ECDSA_SHA256 "1.2.840.10045.4.3.2"
// iso(1) member-body(2) us(840) 10045 signatures(4) specified(3) 3
#define szOID_ECDSA_SHA384 "1.2.840.10045.4.3.3"
// iso(1) member-body(2) us(840) 10045 signatures(4) specified(3) 4
#define szOID_ECDSA_SHA512 "1.2.840.10045.4.3.4"
// NIST AES CBC Algorithms
// joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistA
lgorithms(4) aesAlgs(1) }
#define szOID_NIST_AES128_CBC "2.16.840.1.101.3.4.1.2"
#define szOID_NIST_AES192_CBC "2.16.840.1.101.3.4.1.22"
#define szOID_NIST_AES256_CBC "2.16.840.1.101.3.4.1.42"
// For the above Algorithms, the AlgorithmIdentifier parameters must be
// present and the parameters field MUST contain an AES-IV:
//
// AES-IV ::= OCTET STRING (SIZE(16))
// NIST AES WRAP Algorithms
#define szOID_NIST_AES128_WRAP "2.16.840.1.101.3.4.1.5"
#define szOID_NIST_AES192_WRAP "2.16.840.1.101.3.4.1.25"
#define szOID_NIST_AES256_WRAP "2.16.840.1.101.3.4.1.45"
// x9-63-scheme OBJECT IDENTIFIER ::= { iso(1)
// identified-organization(3) tc68(133) country(16) x9(840)
// x9-63(63) schemes(0) }
// ECDH single pass ephemeral-static KeyAgreement KeyEncryptionAlgorithm
#define szOID_DH_SINGLE_PASS_STDDH_SHA1_KDF "1.3.133.16.840.63.0.2"
// For the above KeyEncryptionAlgorithm the following wrap algorithms are
// supported:
// szOID_RSA_SMIMEalgCMS3DESwrap
// szOID_RSA_SMIMEalgCMSRC2wrap
// szOID_NIST_AES128_WRAP
// szOID_NIST_AES192_WRAP
// szOID_NIST_AES256_WRAP
// ITU-T UsefulDefinitions // ITU-T UsefulDefinitions
#define szOID_DS "2.5" #define szOID_DS "2.5"
#define szOID_DSALG "2.5.8" #define szOID_DSALG "2.5.8"
#define szOID_DSALG_CRPT "2.5.8.1" #define szOID_DSALG_CRPT "2.5.8.1"
#define szOID_DSALG_HASH "2.5.8.2" #define szOID_DSALG_HASH "2.5.8.2"
#define szOID_DSALG_SIGN "2.5.8.3" #define szOID_DSALG_SIGN "2.5.8.3"
#define szOID_DSALG_RSA "2.5.8.1.1" #define szOID_DSALG_RSA "2.5.8.1.1"
// NIST OSE Implementors' Workshop (OIW) // NIST OSE Implementors' Workshop (OIW)
// http://nemo.ncsl.nist.gov/oiw/agreements/stable/OSI/12s_9506.w51 // http://nemo.ncsl.nist.gov/oiw/agreements/stable/OSI/12s_9506.w51
// http://nemo.ncsl.nist.gov/oiw/agreements/working/OSI/12w_9503.w51 // http://nemo.ncsl.nist.gov/oiw/agreements/working/OSI/12w_9503.w51
skipping to change at line 1466 skipping to change at line 2165
#define szOID_INFOSEC_SuiteASignature "2.16.840.1.101.2.1.1.13" #define szOID_INFOSEC_SuiteASignature "2.16.840.1.101.2.1.1.13"
#define szOID_INFOSEC_SuiteAConfidentiality "2.16.840.1.101.2.1.1.14" #define szOID_INFOSEC_SuiteAConfidentiality "2.16.840.1.101.2.1.1.14"
#define szOID_INFOSEC_SuiteAIntegrity "2.16.840.1.101.2.1.1.15" #define szOID_INFOSEC_SuiteAIntegrity "2.16.840.1.101.2.1.1.15"
#define szOID_INFOSEC_SuiteATokenProtection "2.16.840.1.101.2.1.1.16" #define szOID_INFOSEC_SuiteATokenProtection "2.16.840.1.101.2.1.1.16"
#define szOID_INFOSEC_SuiteAKeyManagement "2.16.840.1.101.2.1.1.17" #define szOID_INFOSEC_SuiteAKeyManagement "2.16.840.1.101.2.1.1.17"
#define szOID_INFOSEC_SuiteAKMandSig "2.16.840.1.101.2.1.1.18" #define szOID_INFOSEC_SuiteAKMandSig "2.16.840.1.101.2.1.1.18"
#define szOID_INFOSEC_mosaicUpdatedSig "2.16.840.1.101.2.1.1.19" #define szOID_INFOSEC_mosaicUpdatedSig "2.16.840.1.101.2.1.1.19"
#define szOID_INFOSEC_mosaicKMandUpdSig "2.16.840.1.101.2.1.1.20" #define szOID_INFOSEC_mosaicKMandUpdSig "2.16.840.1.101.2.1.1.20"
#define szOID_INFOSEC_mosaicUpdatedInteg "2.16.840.1.101.2.1.1.21" #define szOID_INFOSEC_mosaicUpdatedInteg "2.16.840.1.101.2.1.1.21"
// NIST Hash Algorithms
// joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nista
lgorithm(4) hashalgs(2)
#define szOID_NIST_sha256 "2.16.840.1.101.3.4.2.1"
#define szOID_NIST_sha384 "2.16.840.1.101.3.4.2.2"
#define szOID_NIST_sha512 "2.16.840.1.101.3.4.2.3"
typedef struct _CRYPT_OBJID_TABLE { typedef struct _CRYPT_OBJID_TABLE {
DWORD dwAlgId; DWORD dwAlgId;
LPCSTR pszObjId; LPCSTR pszObjId;
} CRYPT_OBJID_TABLE, *PCRYPT_OBJID_TABLE; } CRYPT_OBJID_TABLE, *PCRYPT_OBJID_TABLE;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// PKCS #1 HashInfo (DigestInfo) // PKCS #1 HashInfo (DigestInfo)
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CRYPT_HASH_INFO { typedef struct _CRYPT_HASH_INFO {
CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm; CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
CRYPT_HASH_BLOB Hash; CRYPT_HASH_BLOB Hash;
} CRYPT_HASH_INFO, *PCRYPT_HASH_INFO; } CRYPT_HASH_INFO, *PCRYPT_HASH_INFO;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Type used for an extension to an encoded content // Type used for an extension to an encoded content
// //
// Where the Value's CRYPT_OBJID_BLOB is in its encoded representation. // Where the Value's CRYPT_OBJID_BLOB is in its encoded representation.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// certenrolls_begin -- CERT_CONTEXT
typedef struct _CERT_EXTENSION { typedef struct _CERT_EXTENSION {
LPSTR pszObjId; LPSTR pszObjId;
BOOL fCritical; BOOL fCritical;
CRYPT_OBJID_BLOB Value; CRYPT_OBJID_BLOB Value;
} CERT_EXTENSION, *PCERT_EXTENSION; } CERT_EXTENSION, *PCERT_EXTENSION;
// certenrolls_end
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// AttributeTypeValue // AttributeTypeValue
// //
// Where the Value's CRYPT_OBJID_BLOB is in its encoded representation. // Where the Value's CRYPT_OBJID_BLOB is in its encoded representation.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// certenrolls_begin -- CRYPT_ATTRIBUTE_TYPE_VALUE
typedef struct _CRYPT_ATTRIBUTE_TYPE_VALUE { typedef struct _CRYPT_ATTRIBUTE_TYPE_VALUE {
LPSTR pszObjId; LPSTR pszObjId;
CRYPT_OBJID_BLOB Value; CRYPT_OBJID_BLOB Value;
} CRYPT_ATTRIBUTE_TYPE_VALUE, *PCRYPT_ATTRIBUTE_TYPE_VALUE; } CRYPT_ATTRIBUTE_TYPE_VALUE, *PCRYPT_ATTRIBUTE_TYPE_VALUE;
// certenrolls_end
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Attributes // Attributes
// //
// Where the Value's PATTR_BLOBs are in their encoded representation. // Where the Value's PATTR_BLOBs are in their encoded representation.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// certenrolls_begin -- CRYPT_ATTRIBUTE
typedef struct _CRYPT_ATTRIBUTE { typedef struct _CRYPT_ATTRIBUTE {
LPSTR pszObjId; LPSTR pszObjId;
DWORD cValue; DWORD cValue;
PCRYPT_ATTR_BLOB rgValue; PCRYPT_ATTR_BLOB rgValue;
} CRYPT_ATTRIBUTE, *PCRYPT_ATTRIBUTE; } CRYPT_ATTRIBUTE, *PCRYPT_ATTRIBUTE;
typedef struct _CRYPT_ATTRIBUTES { typedef struct _CRYPT_ATTRIBUTES {
IN DWORD cAttr; DWORD cAttr;
IN PCRYPT_ATTRIBUTE rgAttr; PCRYPT_ATTRIBUTE rgAttr;
} CRYPT_ATTRIBUTES, *PCRYPT_ATTRIBUTES; } CRYPT_ATTRIBUTES, *PCRYPT_ATTRIBUTES;
// certenrolls_end
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Attributes making up a Relative Distinguished Name (CERT_RDN) // Attributes making up a Relative Distinguished Name (CERT_RDN)
// //
// The interpretation of the Value depends on the dwValueType. // The interpretation of the Value depends on the dwValueType.
// See below for a list of the types. // See below for a list of the types.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CERT_RDN_ATTR { typedef struct _CERT_RDN_ATTR {
LPSTR pszObjId; LPSTR pszObjId;
DWORD dwValueType; DWORD dwValueType;
skipping to change at line 1608 skipping to change at line 2320
// the information has been added. // the information has been added.
#define szOID_DN_QUALIFIER "2.5.4.46" #define szOID_DN_QUALIFIER "2.5.4.46"
// Pilot user attribute types: // Pilot user attribute types:
#define szOID_DOMAIN_COMPONENT "0.9.2342.19200300.100.1.25" // IA5, UTF8 string #define szOID_DOMAIN_COMPONENT "0.9.2342.19200300.100.1.25" // IA5, UTF8 string
// used for PKCS 12 attributes // used for PKCS 12 attributes
#define szOID_PKCS_12_FRIENDLY_NAME_ATTR "1.2.840.113549.1.9.20" #define szOID_PKCS_12_FRIENDLY_NAME_ATTR "1.2.840.113549.1.9.20"
#define szOID_PKCS_12_LOCAL_KEY_ID "1.2.840.113549.1.9.21" #define szOID_PKCS_12_LOCAL_KEY_ID "1.2.840.113549.1.9.21"
#define szOID_PKCS_12_KEY_PROVIDER_NAME_ATTR "1.3.6.1.4.1.311.17.1" #define szOID_PKCS_12_KEY_PROVIDER_NAME_ATTR "1.3.6.1.4.1.311.17.1"
#define szOID_LOCAL_MACHINE_KEYSET "1.3.6.1.4.1.311.17.2" #define szOID_LOCAL_MACHINE_KEYSET "1.3.6.1.4.1.311.17.2"
#define szOID_PKCS_12_EXTENDED_ATTRIBUTES "1.3.6.1.4.1.311.17.3"
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Microsoft CERT_RDN attribute Object Identifiers // Microsoft CERT_RDN attribute Object Identifiers
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// Special RDN containing the KEY_ID. Its value type is CERT_RDN_OCTET_STRING. // Special RDN containing the KEY_ID. Its value type is CERT_RDN_OCTET_STRING.
#define szOID_KEYID_RDN "1.3.6.1.4.1.311.10.7.1" #define szOID_KEYID_RDN "1.3.6.1.4.1.311.10.7.1"
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CERT_RDN Attribute Value Types // CERT_RDN Attribute Value Types
// //
skipping to change at line 1720 skipping to change at line 2433
DWORD dwValueType; DWORD dwValueType;
CERT_RDN_VALUE_BLOB Value; CERT_RDN_VALUE_BLOB Value;
} CERT_NAME_VALUE, *PCERT_NAME_VALUE; } CERT_NAME_VALUE, *PCERT_NAME_VALUE;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Public Key Info // Public Key Info
// //
// The PublicKey is the encoded representation of the information as it is // The PublicKey is the encoded representation of the information as it is
// stored in the bit string // stored in the bit string
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// certenrolls_begin -- CERT_CONTEXT
typedef struct _CERT_PUBLIC_KEY_INFO { typedef struct _CERT_PUBLIC_KEY_INFO {
CRYPT_ALGORITHM_IDENTIFIER Algorithm; CRYPT_ALGORITHM_IDENTIFIER Algorithm;
CRYPT_BIT_BLOB PublicKey; CRYPT_BIT_BLOB PublicKey;
} CERT_PUBLIC_KEY_INFO, *PCERT_PUBLIC_KEY_INFO; } CERT_PUBLIC_KEY_INFO, *PCERT_PUBLIC_KEY_INFO;
// certenrolls_end
#define CERT_RSA_PUBLIC_KEY_OBJID szOID_RSA_RSA #define CERT_RSA_PUBLIC_KEY_OBJID szOID_RSA_RSA
#define CERT_DEFAULT_OID_PUBLIC_KEY_SIGN szOID_RSA_RSA #define CERT_DEFAULT_OID_PUBLIC_KEY_SIGN szOID_RSA_RSA
#define CERT_DEFAULT_OID_PUBLIC_KEY_XCHG szOID_RSA_RSA #define CERT_DEFAULT_OID_PUBLIC_KEY_XCHG szOID_RSA_RSA
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// structure that contains all the information in a PKCS#8 PrivateKeyInfo // structure that contains all the information in a PKCS#8 PrivateKeyInfo
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CRYPT_PRIVATE_KEY_INFO{ typedef struct _CRYPT_PRIVATE_KEY_INFO{
DWORD Version; DWORD Version;
skipping to change at line 1765 skipping to change at line 2480
// EncryptedPrivateKey - the encrypted private key blob // EncryptedPrivateKey - the encrypted private key blob
// pClearTextKey - a buffer to receive the clear text // pClearTextKey - a buffer to receive the clear text
// cbClearTextKey - the number of bytes of the pClearTextKey buffer // cbClearTextKey - the number of bytes of the pClearTextKey buffer
// note the if this is zero then this should be // note the if this is zero then this should be
// filled in with the size required to decrypt the // filled in with the size required to decrypt the
// key into, and pClearTextKey should be ignored // key into, and pClearTextKey should be ignored
// pVoidDecryptFunc - this is the pVoid that was passed into the call // pVoidDecryptFunc - this is the pVoid that was passed into the call
// and is preserved and passed back as context // and is preserved and passed back as context
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
typedef BOOL (CALLBACK *PCRYPT_DECRYPT_PRIVATE_KEY_FUNC)( typedef BOOL (CALLBACK *PCRYPT_DECRYPT_PRIVATE_KEY_FUNC)(
CRYPT_ALGORITHM_IDENTIFI __in CRYPT_ALGORITHM_IDENTIFIER Algorithm,
ER Algorithm, __in CRYPT_DATA_BLOB EncryptedPrivateKey,
CRYPT_DATA_BLOB __out_bcount_opt (*pcbClearTextKey) BYTE* pbClearTextKey,
EncryptedPrivateKey, __inout DWORD* pcbClearTextKey,
BYTE __in LPVOID pVoidDecryptFunc);
*pbClearTextKey,
DWORD
*pcbClearTextKey,
LPVOID
pVoidDecryptFunc);
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// this callback is given when creating a PKCS8 EncryptedPrivateKeyInfo. // this callback is given when creating a PKCS8 EncryptedPrivateKeyInfo.
// The caller is then expected to encrypt the private key and hand back // The caller is then expected to encrypt the private key and hand back
// the encrypted contents. // the encrypted contents.
// //
// the parameters are: // the parameters are:
// Algorithm - the algorithm used to encrypt the PrivateKeyInfo // Algorithm - the algorithm used to encrypt the PrivateKeyInfo
// pClearTextPrivateKey - the cleartext private key to be encrypted // pClearTextPrivateKey - the cleartext private key to be encrypted
// pbEncryptedKey - the output encrypted private key blob // pbEncryptedKey - the output encrypted private key blob
// cbEncryptedKey - the number of bytes of the pbEncryptedKey buffer // cbEncryptedKey - the number of bytes of the pbEncryptedKey buffer
// note the if this is zero then this should be // note the if this is zero then this should be
// filled in with the size required to encrypt the // filled in with the size required to encrypt the
// key into, and pbEncryptedKey should be ignored // key into, and pbEncryptedKey should be ignored
// pVoidEncryptFunc - this is the pVoid that was passed into the call // pVoidEncryptFunc - this is the pVoid that was passed into the call
// and is preserved and passed back as context // and is preserved and passed back as context
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
typedef BOOL (CALLBACK *PCRYPT_ENCRYPT_PRIVATE_KEY_FUNC)( typedef BOOL (CALLBACK *PCRYPT_ENCRYPT_PRIVATE_KEY_FUNC)(
CRYPT_ALGORITHM_IDENTIFI __out CRYPT_ALGORITHM_IDENTIFIER* pAlgorithm,
ER* pAlgorithm, __in CRYPT_DATA_BLOB* pClearTextPrivateKey,
CRYPT_DATA_BLOB* __out_bcount_opt (*pcbEncryptedKey) BYTE* pbEncryptedKey,
pClearTextPrivateKey, __inout DWORD* pcbEncryptedKey,
BYTE __in LPVOID pVoidEncryptFunc);
*pbEncryptedKey,
DWORD
*pcbEncryptedKey,
LPVOID
pVoidEncryptFunc);
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// this callback is given from the context of a ImportPKCS8 calls. the caller // this callback is given from the context of a ImportPKCS8 calls. the caller
// is then expected to hand back an HCRYPTPROV to receive the key being imported // is then expected to hand back an HCRYPTPROV to receive the key being imported
// //
// the parameters are: // the parameters are:
// pPrivateKeyInfo - pointer to a CRYPT_PRIVATE_KEY_INFO structure which // pPrivateKeyInfo - pointer to a CRYPT_PRIVATE_KEY_INFO structure which
// describes the key being imported // describes the key being imported
// EncryptedPrivateKey - the encrypted private key blob // EncryptedPrivateKey - the encrypted private key blob
// phCryptProv - a pointer to a HCRRYPTPROV to be filled in // phCryptProv - a pointer to a HCRRYPTPROV to be filled in
skipping to change at line 1850 skipping to change at line 2565
PCRYPT_ENCRYPT_PRIVATE_KEY_FUNC pEncryptPrivateKeyFunc; PCRYPT_ENCRYPT_PRIVATE_KEY_FUNC pEncryptPrivateKeyFunc;
LPVOID pVoidEncryptFunc; LPVOID pVoidEncryptFunc;
} CRYPT_PKCS8_EXPORT_PARAMS, *PCRYPT_PKCS8_EXPORT_PARAMS; } CRYPT_PKCS8_EXPORT_PARAMS, *PCRYPT_PKCS8_EXPORT_PARAMS;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Information stored in a certificate // Information stored in a certificate
// //
// The Issuer, Subject, Algorithm, PublicKey and Extension BLOBs are the // The Issuer, Subject, Algorithm, PublicKey and Extension BLOBs are the
// encoded representation of the information. // encoded representation of the information.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// certenrolls_begin -- CERT_CONTEXT
typedef struct _CERT_INFO { typedef struct _CERT_INFO {
DWORD dwVersion; DWORD dwVersion;
CRYPT_INTEGER_BLOB SerialNumber; CRYPT_INTEGER_BLOB SerialNumber;
CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm; CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm;
CERT_NAME_BLOB Issuer; CERT_NAME_BLOB Issuer;
FILETIME NotBefore; FILETIME NotBefore;
FILETIME NotAfter; FILETIME NotAfter;
CERT_NAME_BLOB Subject; CERT_NAME_BLOB Subject;
CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo; CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo;
CRYPT_BIT_BLOB IssuerUniqueId; CRYPT_BIT_BLOB IssuerUniqueId;
CRYPT_BIT_BLOB SubjectUniqueId; CRYPT_BIT_BLOB SubjectUniqueId;
DWORD cExtension; DWORD cExtension;
PCERT_EXTENSION rgExtension; PCERT_EXTENSION rgExtension;
} CERT_INFO, *PCERT_INFO; } CERT_INFO, *PCERT_INFO;
// certenrolls_end
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Certificate versions // Certificate versions
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CERT_V1 0 #define CERT_V1 0
#define CERT_V2 1 #define CERT_V2 1
#define CERT_V3 2 #define CERT_V3 2
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Certificate Information Flags // Certificate Information Flags
skipping to change at line 2088 skipping to change at line 2805
// on a seperate line. // on a seperate line.
// //
// If there is no formatting routine installed or registered // If there is no formatting routine installed or registered
// for the lpszStructType, the hex dump of the encoded BLOB will be returned. // for the lpszStructType, the hex dump of the encoded BLOB will be returned.
// User can set the flag CRYPT_FORMAT_STR_NO_HEX to disable the hex dump. // User can set the flag CRYPT_FORMAT_STR_NO_HEX to disable the hex dump.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptFormatObject( CryptFormatObject(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN DWORD dwFormatType, __in DWORD dwFormatType,
IN DWORD dwFormatStrType, __in DWORD dwFormatStrType,
IN void *pFormatStruct, __in_opt void *pFormatStruct,
IN LPCSTR lpszStructType, __in_opt LPCSTR lpszStructType,
IN const BYTE *pbEncoded, __in_bcount(cbEncoded) const BYTE *pbEncoded,
IN DWORD cbEncoded, __in DWORD cbEncoded,
OUT void *pbFormat, __out_bcount_part_opt(*pcbFormat, *pcbFormat) __typefix(WCHAR *) void *pbFor
IN OUT DWORD *pcbFormat mat,
__inout DWORD *pcbFormat
); );
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
// constants for dwFormatStrType of function CryptFormatObject // constants for dwFormatStrType of function CryptFormatObject
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
#define CRYPT_FORMAT_STR_MULTI_LINE 0x0001 #define CRYPT_FORMAT_STR_MULTI_LINE 0x0001
#define CRYPT_FORMAT_STR_NO_HEX 0x0010 #define CRYPT_FORMAT_STR_NO_HEX 0x0010
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
// constants for dwFormatType of function CryptFormatObject // constants for dwFormatType of function CryptFormatObject
// when format X509_NAME or X509_UNICODE_NAME // when format X509_NAME or X509_UNICODE_NAME
skipping to change at line 2166 skipping to change at line 2883
#define CRYPT_FORMAT_CRLF CRYPT_FORMAT_RDN_CRLF #define CRYPT_FORMAT_CRLF CRYPT_FORMAT_RDN_CRLF
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Encode / decode the specified data structure according to the certificate // Encode / decode the specified data structure according to the certificate
// encoding type. // encoding type.
// //
// See below for a list of the predefined data structures. // See below for a list of the predefined data structures.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef LPVOID (WINAPI *PFN_CRYPT_ALLOC)( typedef LPVOID (WINAPI *PFN_CRYPT_ALLOC)(
IN size_t cbSize __in size_t cbSize
); );
typedef VOID (WINAPI *PFN_CRYPT_FREE)( typedef VOID (WINAPI *PFN_CRYPT_FREE)(
IN LPVOID pv __in LPVOID pv
); );
typedef struct _CRYPT_ENCODE_PARA { typedef struct _CRYPT_ENCODE_PARA {
DWORD cbSize; DWORD cbSize;
PFN_CRYPT_ALLOC pfnAlloc; // OPTIONAL PFN_CRYPT_ALLOC pfnAlloc; // OPTIONAL
PFN_CRYPT_FREE pfnFree; // OPTIONAL PFN_CRYPT_FREE pfnFree; // OPTIONAL
} CRYPT_ENCODE_PARA, *PCRYPT_ENCODE_PARA; } CRYPT_ENCODE_PARA, *PCRYPT_ENCODE_PARA;
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptEncodeObjectEx( CryptEncodeObjectEx(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN LPCSTR lpszStructType, __in LPCSTR lpszStructType,
IN const void *pvStructInfo, __in const void *pvStructInfo,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL PCRYPT_ENCODE_PARA pEncodePara, __in_opt PCRYPT_ENCODE_PARA pEncodePara,
OUT void *pvEncoded, __out_opt void *pvEncoded,
IN OUT DWORD *pcbEncoded IN __out DWORD *pcbEncoded
); );
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptEncodeObject( CryptEncodeObject(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN LPCSTR lpszStructType, __in LPCSTR lpszStructType,
IN const void *pvStructInfo, __in const void *pvStructInfo,
OUT BYTE *pbEncoded, __out_bcount_part_opt(*pcbEncoded, *pcbEncoded) BYTE *pbEncoded,
IN OUT DWORD *pcbEncoded __inout DWORD *pcbEncoded
); );
// By default the signature bytes are reversed. The following flag can // By default the signature bytes are reversed. The following flag can
// be set to inhibit the byte reversal. // be set to inhibit the byte reversal.
// //
// This flag is applicable to // This flag is applicable to
// X509_CERT_TO_BE_SIGNED // X509_CERT_TO_BE_SIGNED
#define CRYPT_ENCODE_NO_SIGNATURE_BYTE_REVERSAL_FLAG 0x8 #define CRYPT_ENCODE_NO_SIGNATURE_BYTE_REVERSAL_FLAG 0x8
// When the following flag is set the called encode function allocates // When the following flag is set the called encode function allocates
skipping to change at line 2264 skipping to change at line 2981
typedef struct _CRYPT_DECODE_PARA { typedef struct _CRYPT_DECODE_PARA {
DWORD cbSize; DWORD cbSize;
PFN_CRYPT_ALLOC pfnAlloc; // OPTIONAL PFN_CRYPT_ALLOC pfnAlloc; // OPTIONAL
PFN_CRYPT_FREE pfnFree; // OPTIONAL PFN_CRYPT_FREE pfnFree; // OPTIONAL
} CRYPT_DECODE_PARA, *PCRYPT_DECODE_PARA; } CRYPT_DECODE_PARA, *PCRYPT_DECODE_PARA;
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptDecodeObjectEx( CryptDecodeObjectEx(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN LPCSTR lpszStructType, __in LPCSTR lpszStructType,
IN const BYTE *pbEncoded, __in_bcount(cbEncoded) const BYTE *pbEncoded,
IN DWORD cbEncoded, __in DWORD cbEncoded,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL PCRYPT_DECODE_PARA pDecodePara, __in_opt PCRYPT_DECODE_PARA pDecodePara,
OUT OPTIONAL void *pvStructInfo, __out_opt void *pvStructInfo,
IN OUT DWORD *pcbStructInfo IN __out DWORD *pcbStructInfo
); );
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptDecodeObject( CryptDecodeObject(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN LPCSTR lpszStructType, __in LPCSTR lpszStructType,
IN const BYTE *pbEncoded, __in_bcount(cbEncoded) const BYTE *pbEncoded,
IN DWORD cbEncoded, __in DWORD cbEncoded,
IN DWORD dwFlags, __in DWORD dwFlags,
OUT void *pvStructInfo, __out_bcount_part_opt(*pcbStructInfo, *pcbStructInfo) void *pvStructInfo,
IN OUT DWORD *pcbStructInfo __inout DWORD *pcbStructInfo
); );
// When the following flag is set the nocopy optimization is enabled. // When the following flag is set the nocopy optimization is enabled.
// This optimization where appropriate, updates the pvStructInfo fields // This optimization where appropriate, updates the pvStructInfo fields
// to point to content residing within pbEncoded instead of making a copy // to point to content residing within pbEncoded instead of making a copy
// of and appending to pvStructInfo. // of and appending to pvStructInfo.
// //
// Note, when set, pbEncoded can't be freed until pvStructInfo is freed. // Note, when set, pbEncoded can't be freed until pvStructInfo is freed.
#define CRYPT_DECODE_NOCOPY_FLAG 0x1 #define CRYPT_DECODE_NOCOPY_FLAG 0x1
skipping to change at line 2399 skipping to change at line 3116
#define X509_MULTI_BYTE_INTEGER ((LPCSTR) 28) #define X509_MULTI_BYTE_INTEGER ((LPCSTR) 28)
#define X509_ENUMERATED ((LPCSTR) 29) #define X509_ENUMERATED ((LPCSTR) 29)
#define X509_CHOICE_OF_TIME ((LPCSTR) 30) #define X509_CHOICE_OF_TIME ((LPCSTR) 30)
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// More predefined X509 certificate extension data structures that can be // More predefined X509 certificate extension data structures that can be
// encoded / decoded. // encoded / decoded.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define X509_AUTHORITY_KEY_ID2 ((LPCSTR) 31) #define X509_AUTHORITY_KEY_ID2 ((LPCSTR) 31)
#define X509_AUTHORITY_INFO_ACCESS ((LPCSTR) 32) #define X509_AUTHORITY_INFO_ACCESS ((LPCSTR) 32)
#define X509_SUBJECT_INFO_ACCESS X509_AUTHORITY_INFO_ACCESS
#define X509_CRL_REASON_CODE X509_ENUMERATED #define X509_CRL_REASON_CODE X509_ENUMERATED
#define PKCS_CONTENT_INFO ((LPCSTR) 33) #define PKCS_CONTENT_INFO ((LPCSTR) 33)
#define X509_SEQUENCE_OF_ANY ((LPCSTR) 34) #define X509_SEQUENCE_OF_ANY ((LPCSTR) 34)
#define X509_CRL_DIST_POINTS ((LPCSTR) 35) #define X509_CRL_DIST_POINTS ((LPCSTR) 35)
#define X509_ENHANCED_KEY_USAGE ((LPCSTR) 36) #define X509_ENHANCED_KEY_USAGE ((LPCSTR) 36)
#define PKCS_CTL ((LPCSTR) 37) #define PKCS_CTL ((LPCSTR) 37)
#define X509_MULTI_BYTE_UINT ((LPCSTR) 38) #define X509_MULTI_BYTE_UINT ((LPCSTR) 38)
#define X509_DSS_PUBLICKEY X509_MULTI_BYTE_UINT #define X509_DSS_PUBLICKEY X509_MULTI_BYTE_UINT
#define X509_DSS_PARAMETERS ((LPCSTR) 39) #define X509_DSS_PARAMETERS ((LPCSTR) 39)
#define X509_DSS_SIGNATURE ((LPCSTR) 40) #define X509_DSS_SIGNATURE ((LPCSTR) 40)
#define PKCS_RC2_CBC_PARAMETERS ((LPCSTR) 41) #define PKCS_RC2_CBC_PARAMETERS ((LPCSTR) 41)
#define PKCS_SMIME_CAPABILITIES ((LPCSTR) 42) #define PKCS_SMIME_CAPABILITIES ((LPCSTR) 42)
// Qualified Certificate Statements Extension uses the same encode/decode
// function as PKCS_SMIME_CAPABILITIES. Its data structures are identical
// except for the names of the fields.
#define X509_QC_STATEMENTS_EXT ((LPCSTR) 42)
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// data structures for private keys // data structures for private keys
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define PKCS_RSA_PRIVATE_KEY ((LPCSTR) 43) #define PKCS_RSA_PRIVATE_KEY ((LPCSTR) 43)
#define PKCS_PRIVATE_KEY_INFO ((LPCSTR) 44) #define PKCS_PRIVATE_KEY_INFO ((LPCSTR) 44)
#define PKCS_ENCRYPTED_PRIVATE_KEY_INFO ((LPCSTR) 45) #define PKCS_ENCRYPTED_PRIVATE_KEY_INFO ((LPCSTR) 45)
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// certificate policy qualifier // certificate policy qualifier
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
skipping to change at line 2434 skipping to change at line 3157
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Diffie-Hellman Key Exchange // Diffie-Hellman Key Exchange
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define X509_DH_PUBLICKEY X509_MULTI_BYTE_UINT #define X509_DH_PUBLICKEY X509_MULTI_BYTE_UINT
#define X509_DH_PARAMETERS ((LPCSTR) 47) #define X509_DH_PARAMETERS ((LPCSTR) 47)
#define PKCS_ATTRIBUTES ((LPCSTR) 48) #define PKCS_ATTRIBUTES ((LPCSTR) 48)
#define PKCS_SORTED_CTL ((LPCSTR) 49) #define PKCS_SORTED_CTL ((LPCSTR) 49)
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// ECC Signature
//--------------------------------------------------------------------------
// Uses the same encode/decode function as X509_DH_PARAMETERS. Its data
// structure is identical except for the names of the fields.
#define X509_ECC_SIGNATURE ((LPCSTR) 47)
//+-------------------------------------------------------------------------
// X942 Diffie-Hellman // X942 Diffie-Hellman
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define X942_DH_PARAMETERS ((LPCSTR) 50) #define X942_DH_PARAMETERS ((LPCSTR) 50)
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// The following is the same as X509_BITS, except before encoding, // The following is the same as X509_BITS, except before encoding,
// the bit length is decremented to exclude trailing zero bits. // the bit length is decremented to exclude trailing zero bits.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define X509_BITS_WITHOUT_TRAILING_ZEROES ((LPCSTR) 51) #define X509_BITS_WITHOUT_TRAILING_ZEROES ((LPCSTR) 51)
skipping to change at line 2471 skipping to change at line 3201
#define CMC_STATUS ((LPCSTR) 61) #define CMC_STATUS ((LPCSTR) 61)
#define CMC_ADD_EXTENSIONS ((LPCSTR) 62) #define CMC_ADD_EXTENSIONS ((LPCSTR) 62)
#define CMC_ADD_ATTRIBUTES ((LPCSTR) 63) #define CMC_ADD_ATTRIBUTES ((LPCSTR) 63)
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Certificate Template // Certificate Template
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define X509_CERTIFICATE_TEMPLATE ((LPCSTR) 64) #define X509_CERTIFICATE_TEMPLATE ((LPCSTR) 64)
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Online Certificate Status Protocol (OCSP) Data Structures
//--------------------------------------------------------------------------
#define OCSP_SIGNED_REQUEST ((LPCSTR) 65)
#define OCSP_REQUEST ((LPCSTR) 66)
#define OCSP_RESPONSE ((LPCSTR) 67)
#define OCSP_BASIC_SIGNED_RESPONSE ((LPCSTR) 68)
#define OCSP_BASIC_RESPONSE ((LPCSTR) 69)
//+-------------------------------------------------------------------------
// Logotype and Biometric Extensions
//--------------------------------------------------------------------------
#define X509_LOGOTYPE_EXT ((LPCSTR) 70)
#define X509_BIOMETRIC_EXT ((LPCSTR) 71)
#define CNG_RSA_PUBLIC_KEY_BLOB ((LPCSTR) 72)
#define X509_OBJECT_IDENTIFIER ((LPCSTR) 73)
#define X509_ALGORITHM_IDENTIFIER ((LPCSTR) 74)
#define PKCS_RSA_SSA_PSS_PARAMETERS ((LPCSTR) 75)
#define PKCS_RSAES_OAEP_PARAMETERS ((LPCSTR) 76)
#define ECC_CMS_SHARED_INFO ((LPCSTR) 77)
//+-------------------------------------------------------------------------
// Predefined PKCS #7 data structures that can be encoded / decoded. // Predefined PKCS #7 data structures that can be encoded / decoded.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define PKCS7_SIGNER_INFO ((LPCSTR) 500) #define PKCS7_SIGNER_INFO ((LPCSTR) 500)
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Predefined PKCS #7 data structures that can be encoded / decoded. // Predefined PKCS #7 data structures that can be encoded / decoded.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CMS_SIGNER_INFO ((LPCSTR) 501) #define CMS_SIGNER_INFO ((LPCSTR) 501)
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
skipping to change at line 2505 skipping to change at line 3258
#define szOID_KEY_USAGE_RESTRICTION "2.5.29.4" #define szOID_KEY_USAGE_RESTRICTION "2.5.29.4"
#define szOID_SUBJECT_ALT_NAME "2.5.29.7" #define szOID_SUBJECT_ALT_NAME "2.5.29.7"
#define szOID_ISSUER_ALT_NAME "2.5.29.8" #define szOID_ISSUER_ALT_NAME "2.5.29.8"
#define szOID_BASIC_CONSTRAINTS "2.5.29.10" #define szOID_BASIC_CONSTRAINTS "2.5.29.10"
#define szOID_KEY_USAGE "2.5.29.15" #define szOID_KEY_USAGE "2.5.29.15"
#define szOID_PRIVATEKEY_USAGE_PERIOD "2.5.29.16" #define szOID_PRIVATEKEY_USAGE_PERIOD "2.5.29.16"
#define szOID_BASIC_CONSTRAINTS2 "2.5.29.19" #define szOID_BASIC_CONSTRAINTS2 "2.5.29.19"
#define szOID_CERT_POLICIES "2.5.29.32" #define szOID_CERT_POLICIES "2.5.29.32"
#define szOID_ANY_CERT_POLICY "2.5.29.32.0" #define szOID_ANY_CERT_POLICY "2.5.29.32.0"
#define szOID_INHIBIT_ANY_POLICY "2.5.29.54"
#define szOID_AUTHORITY_KEY_IDENTIFIER2 "2.5.29.35" #define szOID_AUTHORITY_KEY_IDENTIFIER2 "2.5.29.35"
#define szOID_SUBJECT_KEY_IDENTIFIER "2.5.29.14" #define szOID_SUBJECT_KEY_IDENTIFIER "2.5.29.14"
#define szOID_SUBJECT_ALT_NAME2 "2.5.29.17" #define szOID_SUBJECT_ALT_NAME2 "2.5.29.17"
#define szOID_ISSUER_ALT_NAME2 "2.5.29.18" #define szOID_ISSUER_ALT_NAME2 "2.5.29.18"
#define szOID_CRL_REASON_CODE "2.5.29.21" #define szOID_CRL_REASON_CODE "2.5.29.21"
#define szOID_REASON_CODE_HOLD "2.5.29.23" #define szOID_REASON_CODE_HOLD "2.5.29.23"
#define szOID_CRL_DIST_POINTS "2.5.29.31" #define szOID_CRL_DIST_POINTS "2.5.29.31"
#define szOID_ENHANCED_KEY_USAGE "2.5.29.37" #define szOID_ENHANCED_KEY_USAGE "2.5.29.37"
#define szOID_ANY_ENHANCED_KEY_USAGE "2.5.29.37.0"
// szOID_CRL_NUMBER -- Base CRLs only. Monotonically increasing sequence // szOID_CRL_NUMBER -- Base CRLs only. Monotonically increasing sequence
// number for each CRL issued by a CA. // number for each CRL issued by a CA.
#define szOID_CRL_NUMBER "2.5.29.20" #define szOID_CRL_NUMBER "2.5.29.20"
// szOID_DELTA_CRL_INDICATOR -- Delta CRLs only. Marked critical. // szOID_DELTA_CRL_INDICATOR -- Delta CRLs only. Marked critical.
// Contains the minimum base CRL Number that can be used with a delta CRL. // Contains the minimum base CRL Number that can be used with a delta CRL.
#define szOID_DELTA_CRL_INDICATOR "2.5.29.27" #define szOID_DELTA_CRL_INDICATOR "2.5.29.27"
#define szOID_ISSUING_DIST_POINT "2.5.29.28" #define szOID_ISSUING_DIST_POINT "2.5.29.28"
// szOID_FRESHEST_CRL -- Base CRLs only. Formatted identically to a CDP // szOID_FRESHEST_CRL -- Base CRLs only. Formatted identically to a CDP
// extension that holds URLs to fetch the delta CRL. // extension that holds URLs to fetch the delta CRL.
#define szOID_FRESHEST_CRL "2.5.29.46" #define szOID_FRESHEST_CRL "2.5.29.46"
skipping to change at line 2546 skipping to change at line 3302
#define szOID_OS_VERSION "1.3.6.1.4.1.311.13.2.3" #define szOID_OS_VERSION "1.3.6.1.4.1.311.13.2.3"
// //
// Extension contain certificate type // Extension contain certificate type
#define szOID_ENROLLMENT_AGENT "1.3.6.1.4.1.311.20.2.1" #define szOID_ENROLLMENT_AGENT "1.3.6.1.4.1.311.20.2.1"
// Internet Public Key Infrastructure (PKIX) // Internet Public Key Infrastructure (PKIX)
#define szOID_PKIX "1.3.6.1.5.5.7" #define szOID_PKIX "1.3.6.1.5.5.7"
#define szOID_PKIX_PE "1.3.6.1.5.5.7.1" #define szOID_PKIX_PE "1.3.6.1.5.5.7.1"
#define szOID_AUTHORITY_INFO_ACCESS "1.3.6.1.5.5.7.1.1" #define szOID_AUTHORITY_INFO_ACCESS "1.3.6.1.5.5.7.1.1"
#define szOID_SUBJECT_INFO_ACCESS "1.3.6.1.5.5.7.1.11"
#define szOID_BIOMETRIC_EXT "1.3.6.1.5.5.7.1.2"
#define szOID_QC_STATEMENTS_EXT "1.3.6.1.5.5.7.1.3"
#define szOID_LOGOTYPE_EXT "1.3.6.1.5.5.7.1.12"
// Microsoft extensions or attributes // Microsoft extensions or attributes
#define szOID_CERT_EXTENSIONS "1.3.6.1.4.1.311.2.1.14" #define szOID_CERT_EXTENSIONS "1.3.6.1.4.1.311.2.1.14"
#define szOID_NEXT_UPDATE_LOCATION "1.3.6.1.4.1.311.10.2" #define szOID_NEXT_UPDATE_LOCATION "1.3.6.1.4.1.311.10.2"
#define szOID_REMOVE_CERTIFICATE "1.3.6.1.4.1.311.10.8.1" #define szOID_REMOVE_CERTIFICATE "1.3.6.1.4.1.311.10.8.1"
#define szOID_CROSS_CERT_DIST_POINTS "1.3.6.1.4.1.311.10.9.1" #define szOID_CROSS_CERT_DIST_POINTS "1.3.6.1.4.1.311.10.9.1"
// Microsoft PKCS #7 ContentType Object Identifiers // Microsoft PKCS #7 ContentType Object Identifiers
#define szOID_CTL "1.3.6.1.4.1.311.10.1" #define szOID_CTL "1.3.6.1.4.1.311.10.1"
skipping to change at line 2583 skipping to change at line 3343
// CryptUI // CryptUI
#define szOID_ANY_APPLICATION_POLICY "1.3.6.1.4.1.311.10.12.1" #define szOID_ANY_APPLICATION_POLICY "1.3.6.1.4.1.311.10.12.1"
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Object Identifiers for use with Auto Enrollment // Object Identifiers for use with Auto Enrollment
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define szOID_AUTO_ENROLL_CTL_USAGE "1.3.6.1.4.1.311.20.1" #define szOID_AUTO_ENROLL_CTL_USAGE "1.3.6.1.4.1.311.20.1"
// Extension contain certificate type // Extension contain certificate type
// AKA Certificate template extension (v1)
#define szOID_ENROLL_CERTTYPE_EXTENSION "1.3.6.1.4.1.311.20.2" #define szOID_ENROLL_CERTTYPE_EXTENSION "1.3.6.1.4.1.311.20.2"
#define szOID_CERT_MANIFOLD "1.3.6.1.4.1.311.20.3" #define szOID_CERT_MANIFOLD "1.3.6.1.4.1.311.20.3"
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Object Identifiers for use with the MS Certificate Server // Object Identifiers for use with the MS Certificate Server
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#ifndef szOID_CERTSRV_CA_VERSION #ifndef szOID_CERTSRV_CA_VERSION
#define szOID_CERTSRV_CA_VERSION "1.3.6.1.4.1.311.21.1" #define szOID_CERTSRV_CA_VERSION "1.3.6.1.4.1.311.21.1"
#endif #endif
skipping to change at line 2690 skipping to change at line 3451
// (KEY_ENCIPHERMENT or KEY_AGREEMENT) // (KEY_ENCIPHERMENT or KEY_AGREEMENT)
#define szOID_PKIX_KP_IPSEC_TUNNEL "1.3.6.1.5.5.7.3.6" #define szOID_PKIX_KP_IPSEC_TUNNEL "1.3.6.1.5.5.7.3.6"
// Consistent key usage bits: DIGITAL_SIGNATURE and/or // Consistent key usage bits: DIGITAL_SIGNATURE and/or
// (KEY_ENCIPHERMENT or KEY_AGREEMENT) // (KEY_ENCIPHERMENT or KEY_AGREEMENT)
#define szOID_PKIX_KP_IPSEC_USER "1.3.6.1.5.5.7.3.7" #define szOID_PKIX_KP_IPSEC_USER "1.3.6.1.5.5.7.3.7"
// Consistent key usage bits: DIGITAL_SIGNATURE or NON_REPUDIATION // Consistent key usage bits: DIGITAL_SIGNATURE or NON_REPUDIATION
#define szOID_PKIX_KP_TIMESTAMP_SIGNING "1.3.6.1.5.5.7.3.8" #define szOID_PKIX_KP_TIMESTAMP_SIGNING "1.3.6.1.5.5.7.3.8"
// OCSP response signer
#define szOID_PKIX_KP_OCSP_SIGNING "1.3.6.1.5.5.7.3.9"
// Following extension is present to indicate no revocation checking
// for the OCSP signer certificate
#define szOID_PKIX_OCSP_NOCHECK "1.3.6.1.5.5.7.48.1.5"
// OCSP Nonce
#define szOID_PKIX_OCSP_NONCE "1.3.6.1.5.5.7.48.1.2"
// IKE (Internet Key Exchange) Intermediate KP for an IPsec end entity. // IKE (Internet Key Exchange) Intermediate KP for an IPsec end entity.
// Defined in draft-ietf-ipsec-pki-req-04.txt, December 14, 1999. // Defined in draft-ietf-ipsec-pki-req-04.txt, December 14, 1999.
#define szOID_IPSEC_KP_IKE_INTERMEDIATE "1.3.6.1.5.5.8.2.2" #define szOID_IPSEC_KP_IKE_INTERMEDIATE "1.3.6.1.5.5.8.2.2"
// iso (1) org (3) dod (6) internet (1) security (5) kerberosv5 (2) pkinit (3) 5
#define szOID_PKINIT_KP_KDC "1.3.6.1.5.2.3.5"
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Microsoft Enhanced Key Usage (Purpose) Object Identifiers // Microsoft Enhanced Key Usage (Purpose) Object Identifiers
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Signer of CTLs // Signer of CTLs
#define szOID_KP_CTL_USAGE_SIGNING "1.3.6.1.4.1.311.10.3.1" #define szOID_KP_CTL_USAGE_SIGNING "1.3.6.1.4.1.311.10.3.1"
// Signer of TimeStamps // Signer of TimeStamps
#define szOID_KP_TIME_STAMP_SIGNING "1.3.6.1.4.1.311.10.3.2" #define szOID_KP_TIME_STAMP_SIGNING "1.3.6.1.4.1.311.10.3.2"
skipping to change at line 2750 skipping to change at line 3524
// The default WinVerifyTrust Authenticode policy is to treat all time stamped // The default WinVerifyTrust Authenticode policy is to treat all time stamped
// signatures as being valid forever. This OID limits the valid lifetime of the // signatures as being valid forever. This OID limits the valid lifetime of the
// signature to the lifetime of the certificate. This allows timestamped // signature to the lifetime of the certificate. This allows timestamped
// signatures to expire. Normally this OID will be used in conjunction with // signatures to expire. Normally this OID will be used in conjunction with
// szOID_PKIX_KP_CODE_SIGNING to indicate new time stamp semantics should be // szOID_PKIX_KP_CODE_SIGNING to indicate new time stamp semantics should be
// used. Support for this OID was added in WXP. // used. Support for this OID was added in WXP.
#define szOID_KP_LIFETIME_SIGNING "1.3.6.1.4.1.311.10.3.13" #define szOID_KP_LIFETIME_SIGNING "1.3.6.1.4.1.311.10.3.13"
#define szOID_KP_MOBILE_DEVICE_SOFTWARE "1.3.6.1.4.1.311.10.3.14" #define szOID_KP_MOBILE_DEVICE_SOFTWARE "1.3.6.1.4.1.311.10.3.14"
#define szOID_KP_SMART_DISPLAY "1.3.6.1.4.1.311.10.3.15"
#define szOID_KP_CSP_SIGNATURE "1.3.6.1.4.1.311.10.3.16"
#ifndef szOID_DRM #ifndef szOID_DRM
#define szOID_DRM "1.3.6.1.4.1.311.10.5.1" #define szOID_DRM "1.3.6.1.4.1.311.10.5.1"
#endif #endif
// Microsoft DRM EKU // Microsoft DRM EKU
#ifndef szOID_DRM_INDIVIDUALIZATION #ifndef szOID_DRM_INDIVIDUALIZATION
#define szOID_DRM_INDIVIDUALIZATION "1.3.6.1.4.1.311.10.5.2" #define szOID_DRM_INDIVIDUALIZATION "1.3.6.1.4.1.311.10.5.2"
#endif #endif
#ifndef szOID_LICENSES #ifndef szOID_LICENSES
skipping to change at line 2771 skipping to change at line 3549
#endif #endif
#ifndef szOID_LICENSE_SERVER #ifndef szOID_LICENSE_SERVER
#define szOID_LICENSE_SERVER "1.3.6.1.4.1.311.10.6.2" #define szOID_LICENSE_SERVER "1.3.6.1.4.1.311.10.6.2"
#endif #endif
#ifndef szOID_KP_SMARTCARD_LOGON #ifndef szOID_KP_SMARTCARD_LOGON
#define szOID_KP_SMARTCARD_LOGON "1.3.6.1.4.1.311.20.2.2" #define szOID_KP_SMARTCARD_LOGON "1.3.6.1.4.1.311.20.2.2"
#endif #endif
#define szOID_KP_KERNEL_MODE_CODE_SIGNING "1.3.6.1.4.1.311.61.1.1"
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Microsoft Attribute Object Identifiers // Microsoft Attribute Object Identifiers
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
#define szOID_YESNO_TRUST_ATTR "1.3.6.1.4.1.311.10.4.1" #define szOID_YESNO_TRUST_ATTR "1.3.6.1.4.1.311.10.4.1"
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Qualifiers that may be part of the szOID_CERT_POLICIES and // Qualifiers that may be part of the szOID_CERT_POLICIES and
// szOID_CERT_POLICIES95 extensions // szOID_CERT_POLICIES95 extensions
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
#define szOID_PKIX_POLICY_QUALIFIER_CPS "1.3.6.1.5.5.7.2.1" #define szOID_PKIX_POLICY_QUALIFIER_CPS "1.3.6.1.5.5.7.2.1"
#define szOID_PKIX_POLICY_QUALIFIER_USERNOTICE "1.3.6.1.5.5.7.2.2" #define szOID_PKIX_POLICY_QUALIFIER_USERNOTICE "1.3.6.1.5.5.7.2.2"
#define szOID_ROOT_PROGRAM_FLAGS "1.3.6.1.4.1.311.60.1.1"
// OID for old qualifer // OID for old qualifer
#define szOID_CERT_POLICIES_95_QUALIFIER1 "2.16.840.1.113733.1.7.1.1 " #define szOID_CERT_POLICIES_95_QUALIFIER1 "2.16.840.1.113733.1.7.1.1 "
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// X509_CERT // X509_CERT
// //
// The "to be signed" encoded content plus its signature. The ToBeSigned // The "to be signed" encoded content plus its signature. The ToBeSigned
// content is the CryptEncodeObject() output for one of the following: // content is the CryptEncodeObject() output for one of the following:
// X509_CERT_TO_BE_SIGNED, X509_CERT_CRL_TO_BE_SIGNED or // X509_CERT_TO_BE_SIGNED, X509_CERT_CRL_TO_BE_SIGNED or
// X509_CERT_REQUEST_TO_BE_SIGNED. // X509_CERT_REQUEST_TO_BE_SIGNED.
skipping to change at line 2836 skipping to change at line 3618
// //
// For CryptEncodeObject(), the pbEncoded is just the "to be signed". // For CryptEncodeObject(), the pbEncoded is just the "to be signed".
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// X509_EXTENSIONS // X509_EXTENSIONS
// szOID_CERT_EXTENSIONS // szOID_CERT_EXTENSIONS
// //
// pvStructInfo points to following CERT_EXTENSIONS. // pvStructInfo points to following CERT_EXTENSIONS.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// certenrolls_begin -- CERT_CONTEXTS
typedef struct _CERT_EXTENSIONS { typedef struct _CERT_EXTENSIONS {
DWORD cExtension; DWORD cExtension;
PCERT_EXTENSION rgExtension; PCERT_EXTENSION rgExtension;
} CERT_EXTENSIONS, *PCERT_EXTENSIONS; } CERT_EXTENSIONS, *PCERT_EXTENSIONS;
// certenrolls_end
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// X509_NAME_VALUE // X509_NAME_VALUE
// X509_ANY_STRING // X509_ANY_STRING
// //
// pvStructInfo points to CERT_NAME_VALUE. // pvStructInfo points to CERT_NAME_VALUE.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// X509_UNICODE_NAME_VALUE // X509_UNICODE_NAME_VALUE
skipping to change at line 3024 skipping to change at line 3808
FILETIME NotBefore; FILETIME NotBefore;
FILETIME NotAfter; FILETIME NotAfter;
} CERT_PRIVATE_KEY_VALIDITY, *PCERT_PRIVATE_KEY_VALIDITY; } CERT_PRIVATE_KEY_VALIDITY, *PCERT_PRIVATE_KEY_VALIDITY;
typedef struct _CERT_KEY_ATTRIBUTES_INFO { typedef struct _CERT_KEY_ATTRIBUTES_INFO {
CRYPT_DATA_BLOB KeyId; CRYPT_DATA_BLOB KeyId;
CRYPT_BIT_BLOB IntendedKeyUsage; CRYPT_BIT_BLOB IntendedKeyUsage;
PCERT_PRIVATE_KEY_VALIDITY pPrivateKeyUsagePeriod; // OPTIONAL PCERT_PRIVATE_KEY_VALIDITY pPrivateKeyUsagePeriod; // OPTIONAL
} CERT_KEY_ATTRIBUTES_INFO, *PCERT_KEY_ATTRIBUTES_INFO; } CERT_KEY_ATTRIBUTES_INFO, *PCERT_KEY_ATTRIBUTES_INFO;
// certenrolld_begin -- CERT_*_KEY_USAGE
// Byte[0] // Byte[0]
#define CERT_DIGITAL_SIGNATURE_KEY_USAGE 0x80 #define CERT_DIGITAL_SIGNATURE_KEY_USAGE 0x80
#define CERT_NON_REPUDIATION_KEY_USAGE 0x40 #define CERT_NON_REPUDIATION_KEY_USAGE 0x40
#define CERT_KEY_ENCIPHERMENT_KEY_USAGE 0x20 #define CERT_KEY_ENCIPHERMENT_KEY_USAGE 0x20
#define CERT_DATA_ENCIPHERMENT_KEY_USAGE 0x10 #define CERT_DATA_ENCIPHERMENT_KEY_USAGE 0x10
#define CERT_KEY_AGREEMENT_KEY_USAGE 0x08 #define CERT_KEY_AGREEMENT_KEY_USAGE 0x08
#define CERT_KEY_CERT_SIGN_KEY_USAGE 0x04 #define CERT_KEY_CERT_SIGN_KEY_USAGE 0x04
#define CERT_OFFLINE_CRL_SIGN_KEY_USAGE 0x02 #define CERT_OFFLINE_CRL_SIGN_KEY_USAGE 0x02
#define CERT_CRL_SIGN_KEY_USAGE 0x02 #define CERT_CRL_SIGN_KEY_USAGE 0x02
#define CERT_ENCIPHER_ONLY_KEY_USAGE 0x01 #define CERT_ENCIPHER_ONLY_KEY_USAGE 0x01
// Byte[1] // Byte[1]
#define CERT_DECIPHER_ONLY_KEY_USAGE 0x80 #define CERT_DECIPHER_ONLY_KEY_USAGE 0x80
// certenrolld_end
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// X509_KEY_USAGE_RESTRICTION // X509_KEY_USAGE_RESTRICTION
// szOID_KEY_USAGE_RESTRICTION // szOID_KEY_USAGE_RESTRICTION
// //
// pvStructInfo points to following CERT_KEY_USAGE_RESTRICTION_INFO. // pvStructInfo points to following CERT_KEY_USAGE_RESTRICTION_INFO.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CERT_POLICY_ID { typedef struct _CERT_POLICY_ID {
DWORD cCertPolicyElementId; DWORD cCertPolicyElementId;
LPSTR *rgpszCertPolicyElementId; // pszObjId LPSTR *rgpszCertPolicyElementId; // pszObjId
skipping to change at line 3066 skipping to change at line 3852
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// X509_ALTERNATE_NAME // X509_ALTERNATE_NAME
// szOID_SUBJECT_ALT_NAME // szOID_SUBJECT_ALT_NAME
// szOID_ISSUER_ALT_NAME // szOID_ISSUER_ALT_NAME
// szOID_SUBJECT_ALT_NAME2 // szOID_SUBJECT_ALT_NAME2
// szOID_ISSUER_ALT_NAME2 // szOID_ISSUER_ALT_NAME2
// //
// pvStructInfo points to following CERT_ALT_NAME_INFO. // pvStructInfo points to following CERT_ALT_NAME_INFO.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// certenrolls_begin -- CERT_ALT_NAME_INFO
typedef struct _CERT_OTHER_NAME { typedef struct _CERT_OTHER_NAME {
LPSTR pszObjId; LPSTR pszObjId;
CRYPT_OBJID_BLOB Value; CRYPT_OBJID_BLOB Value;
} CERT_OTHER_NAME, *PCERT_OTHER_NAME; } CERT_OTHER_NAME, *PCERT_OTHER_NAME;
typedef struct _CERT_ALT_NAME_ENTRY { typedef struct _CERT_ALT_NAME_ENTRY {
DWORD dwAltNameChoice; DWORD dwAltNameChoice;
union { union { // certenrolls_skip
PCERT_OTHER_NAME pOtherName; // 1 PCERT_OTHER_NAME pOtherName; // 1
LPWSTR pwszRfc822Name; // 2 (encoded IA5) LPWSTR pwszRfc822Name; // 2 (encoded IA5)
LPWSTR pwszDNSName; // 3 (encoded IA5) LPWSTR pwszDNSName; // 3 (encoded IA5)
// Not implemented x400Address; // 4 // Not implemented x400Address; // 4
CERT_NAME_BLOB DirectoryName; // 5 CERT_NAME_BLOB DirectoryName; // 5
// Not implemented pEdiPartyName; // 6 // Not implemented pEdiPartyName; // 6
LPWSTR pwszURL; // 7 (encoded IA5) LPWSTR pwszURL; // 7 (encoded IA5)
CRYPT_DATA_BLOB IPAddress; // 8 (Octet String) CRYPT_DATA_BLOB IPAddress; // 8 (Octet String)
LPSTR pszRegisteredID; // 9 (Object Identifer) LPSTR pszRegisteredID; // 9 (Object Identifer)
}; }; // certenrolls_skip
} CERT_ALT_NAME_ENTRY, *PCERT_ALT_NAME_ENTRY; } CERT_ALT_NAME_ENTRY, *PCERT_ALT_NAME_ENTRY;
// certenrolls_end
// certenrolld_begin -- CERT_ALT_NAME_*
#define CERT_ALT_NAME_OTHER_NAME 1 #define CERT_ALT_NAME_OTHER_NAME 1
#define CERT_ALT_NAME_RFC822_NAME 2 #define CERT_ALT_NAME_RFC822_NAME 2
#define CERT_ALT_NAME_DNS_NAME 3 #define CERT_ALT_NAME_DNS_NAME 3
#define CERT_ALT_NAME_X400_ADDRESS 4 #define CERT_ALT_NAME_X400_ADDRESS 4
#define CERT_ALT_NAME_DIRECTORY_NAME 5 #define CERT_ALT_NAME_DIRECTORY_NAME 5
#define CERT_ALT_NAME_EDI_PARTY_NAME 6 #define CERT_ALT_NAME_EDI_PARTY_NAME 6
#define CERT_ALT_NAME_URL 7 #define CERT_ALT_NAME_URL 7
#define CERT_ALT_NAME_IP_ADDRESS 8 #define CERT_ALT_NAME_IP_ADDRESS 8
#define CERT_ALT_NAME_REGISTERED_ID 9 #define CERT_ALT_NAME_REGISTERED_ID 9
// certenrolld_end
// certenrolls_begin -- CERT_ALT_NAME_INFO
typedef struct _CERT_ALT_NAME_INFO { typedef struct _CERT_ALT_NAME_INFO {
DWORD cAltEntry; DWORD cAltEntry;
PCERT_ALT_NAME_ENTRY rgAltEntry; PCERT_ALT_NAME_ENTRY rgAltEntry;
} CERT_ALT_NAME_INFO, *PCERT_ALT_NAME_INFO; } CERT_ALT_NAME_INFO, *PCERT_ALT_NAME_INFO;
// certenrolls_end
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Alternate name IA5 Error Location Definitions for // Alternate name IA5 Error Location Definitions for
// CRYPT_E_INVALID_IA5_STRING. // CRYPT_E_INVALID_IA5_STRING.
// //
// Error location is returned in *pcbEncoded by // Error location is returned in *pcbEncoded by
// CryptEncodeObject(X509_ALTERNATE_NAME) // CryptEncodeObject(X509_ALTERNATE_NAME)
// //
// Error location consists of: // Error location consists of:
// ENTRY_INDEX - 8 bits << 16 // ENTRY_INDEX - 8 bits << 16
skipping to change at line 3170 skipping to change at line 3962
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// X509_CERT_POLICIES // X509_CERT_POLICIES
// szOID_CERT_POLICIES // szOID_CERT_POLICIES
// szOID_CERT_POLICIES_95 NOTE--Only allowed for decoding!!! // szOID_CERT_POLICIES_95 NOTE--Only allowed for decoding!!!
// //
// pvStructInfo points to following CERT_POLICIES_INFO. // pvStructInfo points to following CERT_POLICIES_INFO.
// //
// NOTE: when decoding using szOID_CERT_POLICIES_95 the pszPolicyIdentifier // NOTE: when decoding using szOID_CERT_POLICIES_95 the pszPolicyIdentifier
// may contain an empty string // may contain an empty string
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// certenrolls_begin -- CERT_POLICY_QUALIFIER_INFO
typedef struct _CERT_POLICY_QUALIFIER_INFO { typedef struct _CERT_POLICY_QUALIFIER_INFO {
LPSTR pszPolicyQualifierId; // pszObjId LPSTR pszPolicyQualifierId; // pszObjId
CRYPT_OBJID_BLOB Qualifier; // optional CRYPT_OBJID_BLOB Qualifier; // optional
} CERT_POLICY_QUALIFIER_INFO, *PCERT_POLICY_QUALIFIER_INFO; } CERT_POLICY_QUALIFIER_INFO, *PCERT_POLICY_QUALIFIER_INFO;
typedef struct _CERT_POLICY_INFO { typedef struct _CERT_POLICY_INFO {
LPSTR pszPolicyIdentifier; // pszObjId LPSTR pszPolicyIdentifier; // pszObjId
DWORD cPolicyQualifier; // optional DWORD cPolicyQualifier; // optional
CERT_POLICY_QUALIFIER_INFO *rgPolicyQualifier; CERT_POLICY_QUALIFIER_INFO *rgPolicyQualifier;
} CERT_POLICY_INFO, *PCERT_POLICY_INFO; } CERT_POLICY_INFO, *PCERT_POLICY_INFO;
typedef struct _CERT_POLICIES_INFO { typedef struct _CERT_POLICIES_INFO {
DWORD cPolicyInfo; DWORD cPolicyInfo;
CERT_POLICY_INFO *rgPolicyInfo; CERT_POLICY_INFO *rgPolicyInfo;
} CERT_POLICIES_INFO, *PCERT_POLICIES_INFO; } CERT_POLICIES_INFO, *PCERT_POLICIES_INFO;
// certenrolls_end
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// X509_PKIX_POLICY_QUALIFIER_USERNOTICE // X509_PKIX_POLICY_QUALIFIER_USERNOTICE
// szOID_PKIX_POLICY_QUALIFIER_USERNOTICE // szOID_PKIX_POLICY_QUALIFIER_USERNOTICE
// //
// pvStructInfo points to following CERT_POLICY_QUALIFIER_USER_NOTICE. // pvStructInfo points to following CERT_POLICY_QUALIFIER_USER_NOTICE.
// //
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CERT_POLICY_QUALIFIER_NOTICE_REFERENCE { typedef struct _CERT_POLICY_QUALIFIER_NOTICE_REFERENCE {
LPSTR pszOrganization; LPSTR pszOrganization;
skipping to change at line 3225 skipping to change at line 4019
typedef struct _CERT_POLICY95_QUALIFIER1 { typedef struct _CERT_POLICY95_QUALIFIER1 {
LPWSTR pszPracticesReference; // optional LPWSTR pszPracticesReference; // optional
LPSTR pszNoticeIdentifier; // optional LPSTR pszNoticeIdentifier; // optional
LPSTR pszNSINoticeIdentifier; // optional LPSTR pszNSINoticeIdentifier; // optional
DWORD cCPSURLs; DWORD cCPSURLs;
CPS_URLS *rgCPSURLs; // optional CPS_URLS *rgCPSURLs; // optional
} CERT_POLICY95_QUALIFIER1, *PCERT_POLICY95_QUALIFIER1; } CERT_POLICY95_QUALIFIER1, *PCERT_POLICY95_QUALIFIER1;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// szOID_INHIBIT_ANY_POLICY data structure
//
// pvStructInfo points to an int.
//--------------------------------------------------------------------------
//+-------------------------------------------------------------------------
// X509_POLICY_MAPPINGS // X509_POLICY_MAPPINGS
// szOID_POLICY_MAPPINGS // szOID_POLICY_MAPPINGS
// szOID_LEGACY_POLICY_MAPPINGS // szOID_LEGACY_POLICY_MAPPINGS
// //
// pvStructInfo points to following CERT_POLICY_MAPPINGS_INFO. // pvStructInfo points to following CERT_POLICY_MAPPINGS_INFO.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CERT_POLICY_MAPPING { typedef struct _CERT_POLICY_MAPPING {
LPSTR pszIssuerDomainPolicy; // pszObjId LPSTR pszIssuerDomainPolicy; // pszObjId
LPSTR pszSubjectDomainPolicy; // pszObjId LPSTR pszSubjectDomainPolicy; // pszObjId
} CERT_POLICY_MAPPING, *PCERT_POLICY_MAPPING; } CERT_POLICY_MAPPING, *PCERT_POLICY_MAPPING;
skipping to change at line 3277 skipping to change at line 4077
// modulus INTEGER and a publicExponent INTEGER. The modulus is encoded // modulus INTEGER and a publicExponent INTEGER. The modulus is encoded
// as being a unsigned integer. When decoded, if the modulus was encoded // as being a unsigned integer. When decoded, if the modulus was encoded
// as unsigned integer with a leading 0 byte, the 0 byte is removed before // as unsigned integer with a leading 0 byte, the 0 byte is removed before
// converting to the CSP modulus bytes. // converting to the CSP modulus bytes.
// //
// For decode, the aiKeyAlg field of PUBLICKEYSTRUC is always set to // For decode, the aiKeyAlg field of PUBLICKEYSTRUC is always set to
// CALG_RSA_KEYX. // CALG_RSA_KEYX.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CNG_RSA_PUBLIC_KEY_BLOB
//
// pvStructInfo points to a BCRYPT_RSAKEY_BLOB immediately followed by the
// exponent and the modulus bytes. Both the exponent and modulus are
// big endian. The private key fields consisting of cbPrime1 and cbPrime2
// are set to zero.
//
// For dwCertEncodingType = X509_ASN_ENCODING, the CNG_RSA_PUBLIC_KEY_BLOB is
// encoded as a PKCS #1 RSAPublicKey consisting of a SEQUENCE of a
// modulus HUGEINTEGER and a publicExponent HUGEINTEGER.
//--------------------------------------------------------------------------
//+-------------------------------------------------------------------------
// X509_KEYGEN_REQUEST_TO_BE_SIGNED // X509_KEYGEN_REQUEST_TO_BE_SIGNED
// //
// pvStructInfo points to CERT_KEYGEN_REQUEST_INFO. // pvStructInfo points to CERT_KEYGEN_REQUEST_INFO.
// //
// For CryptDecodeObject(), the pbEncoded is the "to be signed" plus its // For CryptDecodeObject(), the pbEncoded is the "to be signed" plus its
// signature (output of a X509_CERT CryptEncodeObject()). // signature (output of a X509_CERT CryptEncodeObject()).
// //
// For CryptEncodeObject(), the pbEncoded is just the "to be signed". // For CryptEncodeObject(), the pbEncoded is just the "to be signed".
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
skipping to change at line 3415 skipping to change at line 4228
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// szOID_SUBJECT_KEY_IDENTIFIER // szOID_SUBJECT_KEY_IDENTIFIER
// //
// pvStructInfo points to a CRYPT_DATA_BLOB. // pvStructInfo points to a CRYPT_DATA_BLOB.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// X509_AUTHORITY_INFO_ACCESS // X509_AUTHORITY_INFO_ACCESS
// szOID_AUTHORITY_INFO_ACCESS // szOID_AUTHORITY_INFO_ACCESS
// //
// X509_SUBJECT_INFO_ACCESS
// szOID_SUBJECT_INFO_ACCESS
//
// pvStructInfo points to following CERT_AUTHORITY_INFO_ACCESS. // pvStructInfo points to following CERT_AUTHORITY_INFO_ACCESS.
// //
// For CRYPT_E_INVALID_IA5_STRING, the error location is returned in // For CRYPT_E_INVALID_IA5_STRING, the error location is returned in
// *pcbEncoded by CryptEncodeObject(X509_AUTHORITY_INFO_ACCESS) // *pcbEncoded by CryptEncodeObject(X509_AUTHORITY_INFO_ACCESS)
// //
// Error location consists of: // Error location consists of:
// ENTRY_INDEX - 8 bits << 16 // ENTRY_INDEX - 8 bits << 16
// VALUE_INDEX - 16 bits (unicode character index) // VALUE_INDEX - 16 bits (unicode character index)
// //
// See X509_ALTERNATE_NAME for ENTRY_INDEX and VALUE_INDEX error location // See X509_ALTERNATE_NAME for ENTRY_INDEX and VALUE_INDEX error location
// defines. // defines.
//
// Note, the szOID_SUBJECT_INFO_ACCESS extension has the same ASN.1
// encoding as the szOID_AUTHORITY_INFO_ACCESS extension.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CERT_ACCESS_DESCRIPTION { typedef struct _CERT_ACCESS_DESCRIPTION {
LPSTR pszAccessMethod; // pszObjId LPSTR pszAccessMethod; // pszObjId
CERT_ALT_NAME_ENTRY AccessLocation; CERT_ALT_NAME_ENTRY AccessLocation;
} CERT_ACCESS_DESCRIPTION, *PCERT_ACCESS_DESCRIPTION; } CERT_ACCESS_DESCRIPTION, *PCERT_ACCESS_DESCRIPTION;
typedef struct _CERT_AUTHORITY_INFO_ACCESS { typedef struct _CERT_AUTHORITY_INFO_ACCESS {
DWORD cAccDescr; DWORD cAccDescr;
PCERT_ACCESS_DESCRIPTION rgAccDescr; PCERT_ACCESS_DESCRIPTION rgAccDescr;
} CERT_AUTHORITY_INFO_ACCESS, *PCERT_AUTHORITY_INFO_ACCESS; } CERT_AUTHORITY_INFO_ACCESS, *PCERT_AUTHORITY_INFO_ACCESS,
CERT_SUBJECT_INFO_ACCESS, *PCERT_SUBJECT_INFO_ACCESS;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// PKIX Access Description: Access Method Object Identifiers // PKIX Access Description: Access Method Object Identifiers
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define szOID_PKIX_ACC_DESCR "1.3.6.1.5.5.7.48" #define szOID_PKIX_ACC_DESCR "1.3.6.1.5.5.7.48"
// For szOID_AUTHORITY_INFO_ACCESS
#define szOID_PKIX_OCSP "1.3.6.1.5.5.7.48.1" #define szOID_PKIX_OCSP "1.3.6.1.5.5.7.48.1"
#define szOID_PKIX_CA_ISSUERS "1.3.6.1.5.5.7.48.2" #define szOID_PKIX_CA_ISSUERS "1.3.6.1.5.5.7.48.2"
// For szOID_SUBJECT_INFO_ACCESS
#define szOID_PKIX_TIME_STAMPING "1.3.6.1.5.5.7.48.3"
#define szOID_PKIX_CA_REPOSITORY "1.3.6.1.5.5.7.48.5"
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// X509_CRL_REASON_CODE // X509_CRL_REASON_CODE
// szOID_CRL_REASON_CODE // szOID_CRL_REASON_CODE
// //
// pvStructInfo points to an int which can be set to one of the following // pvStructInfo points to an int which can be set to one of the following
// enumerated values: // enumerated values:
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CRL_REASON_UNSPECIFIED 0 #define CRL_REASON_UNSPECIFIED 0
#define CRL_REASON_KEY_COMPROMISE 1 #define CRL_REASON_KEY_COMPROMISE 1
#define CRL_REASON_CA_COMPROMISE 2 #define CRL_REASON_CA_COMPROMISE 2
skipping to change at line 3763 skipping to change at line 4589
// X509_DH_PARAMETERS // X509_DH_PARAMETERS
// //
// pvStructInfo points to following CERT_DH_PARAMETERS data structure. // pvStructInfo points to following CERT_DH_PARAMETERS data structure.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CERT_DH_PARAMETERS { typedef struct _CERT_DH_PARAMETERS {
CRYPT_UINT_BLOB p; CRYPT_UINT_BLOB p;
CRYPT_UINT_BLOB g; CRYPT_UINT_BLOB g;
} CERT_DH_PARAMETERS, *PCERT_DH_PARAMETERS; } CERT_DH_PARAMETERS, *PCERT_DH_PARAMETERS;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// X509_ECC_SIGNATURE
//
// pvStructInfo points to following CERT_ECC_SIGNATURE data structure.
//
// Note, identical to the above except for the names of the fields. Same
// underlying encode/decode functions are used.
//--------------------------------------------------------------------------
typedef struct _CERT_ECC_SIGNATURE {
CRYPT_UINT_BLOB r;
CRYPT_UINT_BLOB s;
} CERT_ECC_SIGNATURE, *PCERT_ECC_SIGNATURE;
//+-------------------------------------------------------------------------
// X942_DH_PARAMETERS // X942_DH_PARAMETERS
// //
// pvStructInfo points to following CERT_X942_DH_PARAMETERS data structure. // pvStructInfo points to following CERT_X942_DH_PARAMETERS data structure.
// //
// If q.cbData == 0, then, the following fields are zero'ed. // If q.cbData == 0, then, the following fields are zero'ed.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CERT_X942_DH_VALIDATION_PARAMS { typedef struct _CERT_X942_DH_VALIDATION_PARAMS {
CRYPT_BIT_BLOB seed; CRYPT_BIT_BLOB seed;
DWORD pgenCounter; DWORD pgenCounter;
} CERT_X942_DH_VALIDATION_PARAMS, *PCERT_X942_DH_VALIDATION_PARAMS; } CERT_X942_DH_VALIDATION_PARAMS, *PCERT_X942_DH_VALIDATION_PARAMS;
skipping to change at line 3800 skipping to change at line 4639
#define CRYPT_X942_KEY_LENGTH_BYTE_LENGTH 4 #define CRYPT_X942_KEY_LENGTH_BYTE_LENGTH 4
#define CRYPT_X942_PUB_INFO_BYTE_LENGTH (512/8) #define CRYPT_X942_PUB_INFO_BYTE_LENGTH (512/8)
typedef struct _CRYPT_X942_OTHER_INFO { typedef struct _CRYPT_X942_OTHER_INFO {
LPSTR pszContentEncryptionObjId; LPSTR pszContentEncryptionObjId;
BYTE rgbCounter[CRYPT_X942_COUNTER_BYTE_LENGTH]; BYTE rgbCounter[CRYPT_X942_COUNTER_BYTE_LENGTH];
BYTE rgbKeyLength[CRYPT_X942_KEY_LENGTH_BYTE_LENGTH]; BYTE rgbKeyLength[CRYPT_X942_KEY_LENGTH_BYTE_LENGTH];
CRYPT_DATA_BLOB PubInfo; // OPTIONAL CRYPT_DATA_BLOB PubInfo; // OPTIONAL
} CRYPT_X942_OTHER_INFO, *PCRYPT_X942_OTHER_INFO; } CRYPT_X942_OTHER_INFO, *PCRYPT_X942_OTHER_INFO;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// ECC_CMS_SHARED_INFO
//
// pvStructInfo points to following ECC_CMS_SHARED_INFO data structure.
//
// rgbSuppPubInfo is in Little Endian order.
//--------------------------------------------------------------------------
#define CRYPT_ECC_CMS_SHARED_INFO_SUPPPUBINFO_BYTE_LENGTH 4
typedef struct _CRYPT_ECC_CMS_SHARED_INFO {
CRYPT_ALGORITHM_IDENTIFIER Algorithm;
CRYPT_DATA_BLOB EntityUInfo; // OPTIONAL
BYTE rgbSuppPubInfo[CRYPT_ECC_CMS_SHARED_INFO_SUPPPUB
INFO_BYTE_LENGTH];
} CRYPT_ECC_CMS_SHARED_INFO, *PCRYPT_ECC_CMS_SHARED_INFO;
//+-------------------------------------------------------------------------
// PKCS_RC2_CBC_PARAMETERS // PKCS_RC2_CBC_PARAMETERS
// szOID_RSA_RC2CBC // szOID_RSA_RC2CBC
// //
// pvStructInfo points to following CRYPT_RC2_CBC_PARAMETERS data structure. // pvStructInfo points to following CRYPT_RC2_CBC_PARAMETERS data structure.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CRYPT_RC2_CBC_PARAMETERS { typedef struct _CRYPT_RC2_CBC_PARAMETERS {
DWORD dwVersion; DWORD dwVersion;
BOOL fIV; // set if has following IV BOOL fIV; // set if has following IV
BYTE rgbIV[8]; BYTE rgbIV[8];
} CRYPT_RC2_CBC_PARAMETERS, *PCRYPT_RC2_CBC_PARAMETERS; } CRYPT_RC2_CBC_PARAMETERS, *PCRYPT_RC2_CBC_PARAMETERS;
skipping to change at line 3827 skipping to change at line 4680
// PKCS_SMIME_CAPABILITIES // PKCS_SMIME_CAPABILITIES
// szOID_RSA_SMIMECapabilities // szOID_RSA_SMIMECapabilities
// //
// pvStructInfo points to following CRYPT_SMIME_CAPABILITIES data structure. // pvStructInfo points to following CRYPT_SMIME_CAPABILITIES data structure.
// //
// Note, for CryptEncodeObject(X509_ASN_ENCODING), Parameters.cbData == 0 // Note, for CryptEncodeObject(X509_ASN_ENCODING), Parameters.cbData == 0
// causes the encoded parameters to be omitted and not encoded as a NULL // causes the encoded parameters to be omitted and not encoded as a NULL
// (05 00) as is done when encoding a CRYPT_ALGORITHM_IDENTIFIER. This // (05 00) as is done when encoding a CRYPT_ALGORITHM_IDENTIFIER. This
// is per the SMIME specification for encoding capabilities. // is per the SMIME specification for encoding capabilities.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// certenrolls_begin -- CRYPT_SMIME_CAPABILITY
typedef struct _CRYPT_SMIME_CAPABILITY { typedef struct _CRYPT_SMIME_CAPABILITY {
LPSTR pszObjId; LPSTR pszObjId;
CRYPT_OBJID_BLOB Parameters; CRYPT_OBJID_BLOB Parameters;
} CRYPT_SMIME_CAPABILITY, *PCRYPT_SMIME_CAPABILITY; } CRYPT_SMIME_CAPABILITY, *PCRYPT_SMIME_CAPABILITY;
typedef struct _CRYPT_SMIME_CAPABILITIES { typedef struct _CRYPT_SMIME_CAPABILITIES {
DWORD cCapability; DWORD cCapability;
PCRYPT_SMIME_CAPABILITY rgCapability; PCRYPT_SMIME_CAPABILITY rgCapability;
} CRYPT_SMIME_CAPABILITIES, *PCRYPT_SMIME_CAPABILITIES; } CRYPT_SMIME_CAPABILITIES, *PCRYPT_SMIME_CAPABILITIES;
// certenrolls_end
//+-------------------------------------------------------------------------
// Qualified Certificate Statements Extension Data Structures
//
// X509_QC_STATEMENTS_EXT
// szOID_QC_STATEMENTS_EXT
//
// pvStructInfo points to following CERT_QC_STATEMENTS_EXT_INFO
// data structure.
//
// Note, identical to the above except for the names of the fields. Same
// underlying encode/decode functions are used.
//--------------------------------------------------------------------------
typedef struct _CERT_QC_STATEMENT {
LPSTR pszStatementId; // pszObjId
CRYPT_OBJID_BLOB StatementInfo; // OPTIONAL
} CERT_QC_STATEMENT, *PCERT_QC_STATEMENT;
typedef struct _CERT_QC_STATEMENTS_EXT_INFO {
DWORD cStatement;
PCERT_QC_STATEMENT rgStatement;
} CERT_QC_STATEMENTS_EXT_INFO, *PCERT_QC_STATEMENTS_EXT_INFO;
// QC Statment Ids
// European Union
#define szOID_QC_EU_COMPLIANCE "0.4.0.1862.1.1"
// Secure Signature Creation Device
#define szOID_QC_SSCD "0.4.0.1862.1.4"
//+-------------------------------------------------------------------------
// X509_OBJECT_IDENTIFIER
// szOID_ECC_PUBLIC_KEY
//
// pvStructInfo points to a LPSTR of the dot representation.
//--------------------------------------------------------------------------
//+-------------------------------------------------------------------------
// X509_ALGORITHM_IDENTIFIER
// szOID_ECDSA_SPECIFIED
//
// pvStructInfo points to a CRYPT_ALGORITHM_IDENTIFIER.
//--------------------------------------------------------------------------
//+-------------------------------------------------------------------------
// PKCS_RSA_SSA_PSS_PARAMETERS
// szOID_RSA_SSA_PSS
//
// pvStructInfo points to the following CRYPT_RSA_SSA_PSS_PARAMETERS
// data structure.
//
// For encoding uses the following defaults if the corresponding field
// is set to NULL or 0:
// HashAlgorithm.pszObjId : szOID_OIWSEC_sha1
// MaskGenAlgorithm.pszObjId : szOID_RSA_MGF1
// MaskGenAlgorithm.HashAlgorithm.pszObjId : HashAlgorithm.pszObjId
// dwSaltLength: cbHash
// dwTrailerField : PKCS_RSA_SSA_PSS_TRAILER_FIELD_BC
//
// Normally for encoding, only the HashAlgorithm.pszObjId field will
// need to be set.
//
// For decoding, all of fields are explicitly set.
//--------------------------------------------------------------------------
typedef struct _CRYPT_MASK_GEN_ALGORITHM {
LPSTR pszObjId;
CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
} CRYPT_MASK_GEN_ALGORITHM, *PCRYPT_MASK_GEN_ALGORITHM;
typedef struct _CRYPT_RSA_SSA_PSS_PARAMETERS {
CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
CRYPT_MASK_GEN_ALGORITHM MaskGenAlgorithm;
DWORD dwSaltLength;
DWORD dwTrailerField;
} CRYPT_RSA_SSA_PSS_PARAMETERS, *PCRYPT_RSA_SSA_PSS_PARAMETERS;
#define PKCS_RSA_SSA_PSS_TRAILER_FIELD_BC 1
//+-------------------------------------------------------------------------
// PKCS_RSAES_OAEP_PARAMETERS
// szOID_RSAES_OAEP
//
// pvStructInfo points to the following CRYPT_RSAES_OAEP_PARAMETERS
// data structure.
//
// For encoding uses the following defaults if the corresponding field
// is set to NULL or 0:
// HashAlgorithm.pszObjId : szOID_OIWSEC_sha1
// MaskGenAlgorithm.pszObjId : szOID_RSA_MGF1
// MaskGenAlgorithm.HashAlgorithm.pszObjId : HashAlgorithm.pszObjId
// PSourceAlgorithm.pszObjId : szOID_RSA_PSPECIFIED
// PSourceAlgorithm.EncodingParameters.cbData : 0
// PSourceAlgorithm.EncodingParameters.pbData : NULL
//
// Normally for encoding, only the HashAlgorithm.pszObjId field will
// need to be set.
//
// For decoding, all of fields are explicitly set.
//--------------------------------------------------------------------------
typedef struct _CRYPT_PSOURCE_ALGORITHM {
LPSTR pszObjId;
CRYPT_DATA_BLOB EncodingParameters;
} CRYPT_PSOURCE_ALGORITHM, *PCRYPT_PSOURCE_ALGORITHM;
typedef struct _CRYPT_RSAES_OAEP_PARAMETERS {
CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
CRYPT_MASK_GEN_ALGORITHM MaskGenAlgorithm;
CRYPT_PSOURCE_ALGORITHM PSourceAlgorithm;
} CRYPT_RSAES_OAEP_PARAMETERS, *PCRYPT_RSAES_OAEP_PARAMETERS;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// PKCS7_SIGNER_INFO // PKCS7_SIGNER_INFO
// //
// pvStructInfo points to CMSG_SIGNER_INFO. // pvStructInfo points to CMSG_SIGNER_INFO.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CMS_SIGNER_INFO // CMS_SIGNER_INFO
// //
skipping to change at line 4296 skipping to change at line 5260
// //
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CERT_TEMPLATE_EXT { typedef struct _CERT_TEMPLATE_EXT {
LPSTR pszObjId; LPSTR pszObjId;
DWORD dwMajorVersion; DWORD dwMajorVersion;
BOOL fMinorVersion; // TRUE for a minor version BOOL fMinorVersion; // TRUE for a minor version
DWORD dwMinorVersion; DWORD dwMinorVersion;
} CERT_TEMPLATE_EXT, *PCERT_TEMPLATE_EXT; } CERT_TEMPLATE_EXT, *PCERT_TEMPLATE_EXT;
//+========================================================================= //+=========================================================================
// Logotype Extension Data Structures
//
// X509_LOGOTYPE_EXT
// szOID_LOGOTYPE_EXT
//
// pvStructInfo points to a CERT_LOGOTYPE_EXT_INFO.
//==========================================================================
typedef struct _CERT_HASHED_URL {
CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
CRYPT_HASH_BLOB Hash;
LPWSTR pwszUrl; // Encoded as IA5, Optional for
// biometric data
} CERT_HASHED_URL, *PCERT_HASHED_URL;
typedef struct _CERT_LOGOTYPE_DETAILS {
LPWSTR pwszMimeType; // Encoded as IA5
DWORD cHashedUrl;
PCERT_HASHED_URL rgHashedUrl;
} CERT_LOGOTYPE_DETAILS, *PCERT_LOGOTYPE_DETAILS;
typedef struct _CERT_LOGOTYPE_REFERENCE {
DWORD cHashedUrl;
PCERT_HASHED_URL rgHashedUrl;
} CERT_LOGOTYPE_REFERENCE, *PCERT_LOGOTYPE_REFERENCE;
typedef struct _CERT_LOGOTYPE_IMAGE_INFO {
// CERT_LOGOTYPE_GRAY_SCALE_IMAGE_INFO_CHOICE or
// CERT_LOGOTYPE_COLOR_IMAGE_INFO_CHOICE
DWORD dwLogotypeImageInfoChoice;
DWORD dwFileSize; // In octets
DWORD dwXSize; // Horizontal size in pixels
DWORD dwYSize; // Vertical size in pixels
DWORD dwLogotypeImageResolutionChoice;
union {
// CERT_LOGOTYPE_NO_IMAGE_RESOLUTION_CHOICE
// No resolution value
// CERT_LOGOTYPE_BITS_IMAGE_RESOLUTION_CHOICE
DWORD dwNumBits; // Resolution in bits
// CERT_LOGOTYPE_TABLE_SIZE_IMAGE_RESOLUTION_CHOICE
DWORD dwTableSize; // Number of color or grey t
ones
};
LPWSTR pwszLanguage; // Optional. Encoded as IA5.
// RFC 3066 Language Tag
} CERT_LOGOTYPE_IMAGE_INFO, *PCERT_LOGOTYPE_IMAGE_INFO;
#define CERT_LOGOTYPE_GRAY_SCALE_IMAGE_INFO_CHOICE 1
#define CERT_LOGOTYPE_COLOR_IMAGE_INFO_CHOICE 2
#define CERT_LOGOTYPE_NO_IMAGE_RESOLUTION_CHOICE 0
#define CERT_LOGOTYPE_BITS_IMAGE_RESOLUTION_CHOICE 1
#define CERT_LOGOTYPE_TABLE_SIZE_IMAGE_RESOLUTION_CHOICE 2
typedef struct _CERT_LOGOTYPE_IMAGE {
CERT_LOGOTYPE_DETAILS LogotypeDetails;
PCERT_LOGOTYPE_IMAGE_INFO pLogotypeImageInfo; // Optional
} CERT_LOGOTYPE_IMAGE, *PCERT_LOGOTYPE_IMAGE;
typedef struct _CERT_LOGOTYPE_AUDIO_INFO {
DWORD dwFileSize; // In octets
DWORD dwPlayTime; // In milliseconds
DWORD dwChannels; // 1=mono, 2=stereo, 4=quad
DWORD dwSampleRate; // Optional. 0 => not present.
// Samples per second
LPWSTR pwszLanguage; // Optional. Encoded as IA5.
// RFC 3066 Language Tag
} CERT_LOGOTYPE_AUDIO_INFO, *PCERT_LOGOTYPE_AUDIO_INFO;
typedef struct _CERT_LOGOTYPE_AUDIO {
CERT_LOGOTYPE_DETAILS LogotypeDetails;
PCERT_LOGOTYPE_AUDIO_INFO pLogotypeAudioInfo; // Optional
} CERT_LOGOTYPE_AUDIO, *PCERT_LOGOTYPE_AUDIO;
typedef struct _CERT_LOGOTYPE_DATA {
DWORD cLogotypeImage;
PCERT_LOGOTYPE_IMAGE rgLogotypeImage;
DWORD cLogotypeAudio;
PCERT_LOGOTYPE_AUDIO rgLogotypeAudio;
} CERT_LOGOTYPE_DATA, *PCERT_LOGOTYPE_DATA;
typedef struct _CERT_LOGOTYPE_INFO {
DWORD dwLogotypeInfoChoice;
union {
// CERT_LOGOTYPE_DIRECT_INFO_CHOICE
PCERT_LOGOTYPE_DATA pLogotypeDirectInfo;
// CERT_LOGOTYPE_INDIRECT_INFO_CHOICE
PCERT_LOGOTYPE_REFERENCE pLogotypeIndirectInfo;
};
} CERT_LOGOTYPE_INFO, *PCERT_LOGOTYPE_INFO;
#define CERT_LOGOTYPE_DIRECT_INFO_CHOICE 1
#define CERT_LOGOTYPE_INDIRECT_INFO_CHOICE 2
typedef struct _CERT_OTHER_LOGOTYPE_INFO {
LPSTR pszObjId;
CERT_LOGOTYPE_INFO LogotypeInfo;
} CERT_OTHER_LOGOTYPE_INFO, *PCERT_OTHER_LOGOTYPE_INFO;
#define szOID_LOYALTY_OTHER_LOGOTYPE "1.3.6.1.5.5.7.20.1"
#define szOID_BACKGROUND_OTHER_LOGOTYPE "1.3.6.1.5.5.7.20.2"
typedef struct _CERT_LOGOTYPE_EXT_INFO {
DWORD cCommunityLogo;
PCERT_LOGOTYPE_INFO rgCommunityLogo;
PCERT_LOGOTYPE_INFO pIssuerLogo; // Optional
PCERT_LOGOTYPE_INFO pSubjectLogo; // Optional
DWORD cOtherLogo;
PCERT_OTHER_LOGOTYPE_INFO rgOtherLogo;
} CERT_LOGOTYPE_EXT_INFO, *PCERT_LOGOTYPE_EXT_INFO;
//+=========================================================================
// Biometric Extension Data Structures
//
// X509_BIOMETRIC_EXT
// szOID_BIOMETRIC_EXT
//
// pvStructInfo points to following CERT_BIOMETRIC_EXT_INFO data structure.
//==========================================================================
typedef struct _CERT_BIOMETRIC_DATA {
DWORD dwTypeOfBiometricDataChoice;
union {
// CERT_BIOMETRIC_PREDEFINED_DATA_CHOICE
DWORD dwPredefined;
// CERT_BIOMETRIC_OID_DATA_CHOICE
LPSTR pszObjId;
};
CERT_HASHED_URL HashedUrl; // pwszUrl is Optional.
} CERT_BIOMETRIC_DATA, *PCERT_BIOMETRIC_DATA;
#define CERT_BIOMETRIC_PREDEFINED_DATA_CHOICE 1
#define CERT_BIOMETRIC_OID_DATA_CHOICE 2
#define CERT_BIOMETRIC_PICTURE_TYPE 0
#define CERT_BIOMETRIC_SIGNATURE_TYPE 1
typedef struct _CERT_BIOMETRIC_EXT_INFO {
DWORD cBiometricData;
PCERT_BIOMETRIC_DATA rgBiometricData;
} CERT_BIOMETRIC_EXT_INFO, *PCERT_BIOMETRIC_EXT_INFO;
//+=========================================================================
// Online Certificate Status Protocol (OCSP) Data Structures
//==========================================================================
//+-------------------------------------------------------------------------
// OCSP_SIGNED_REQUEST
//
// OCSP signed request.
//
// Note, in most instances, pOptionalSignatureInfo will be NULL indicating
// no signature is present.
//--------------------------------------------------------------------------
typedef struct _OCSP_SIGNATURE_INFO {
CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm;
CRYPT_BIT_BLOB Signature;
DWORD cCertEncoded;
PCERT_BLOB rgCertEncoded;
} OCSP_SIGNATURE_INFO, *POCSP_SIGNATURE_INFO;
typedef struct _OCSP_SIGNED_REQUEST_INFO {
CRYPT_DER_BLOB ToBeSigned; // Encoded OCSP_REQUEST
POCSP_SIGNATURE_INFO pOptionalSignatureInfo; // NULL, no signature
} OCSP_SIGNED_REQUEST_INFO, *POCSP_SIGNED_REQUEST_INFO;
//+-------------------------------------------------------------------------
// OCSP_REQUEST
//
// ToBeSigned OCSP request.
//--------------------------------------------------------------------------
typedef struct _OCSP_CERT_ID {
CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm; // Normally SHA1
CRYPT_HASH_BLOB IssuerNameHash; // Hash of encoded name
CRYPT_HASH_BLOB IssuerKeyHash; // Hash of PublicKey bits
CRYPT_INTEGER_BLOB SerialNumber;
} OCSP_CERT_ID, *POCSP_CERT_ID;
typedef struct _OCSP_REQUEST_ENTRY {
OCSP_CERT_ID CertId;
DWORD cExtension;
PCERT_EXTENSION rgExtension;
} OCSP_REQUEST_ENTRY, *POCSP_REQUEST_ENTRY;
typedef struct _OCSP_REQUEST_INFO {
DWORD dwVersion;
PCERT_ALT_NAME_ENTRY pRequestorName; // OPTIONAL
DWORD cRequestEntry;
POCSP_REQUEST_ENTRY rgRequestEntry;
DWORD cExtension;
PCERT_EXTENSION rgExtension;
} OCSP_REQUEST_INFO, *POCSP_REQUEST_INFO;
#define OCSP_REQUEST_V1 0
//+-------------------------------------------------------------------------
// OCSP_RESPONSE
//
// OCSP outer, unsigned response wrapper.
//--------------------------------------------------------------------------
typedef struct _OCSP_RESPONSE_INFO {
DWORD dwStatus;
LPSTR pszObjId; // OPTIONAL, may be NULL
CRYPT_OBJID_BLOB Value; // OPTIONAL
} OCSP_RESPONSE_INFO, *POCSP_RESPONSE_INFO;
#define OCSP_SUCCESSFUL_RESPONSE 0
#define OCSP_MALFORMED_REQUEST_RESPONSE 1
#define OCSP_INTERNAL_ERROR_RESPONSE 2
#define OCSP_TRY_LATER_RESPONSE 3
// 4 is not used
#define OCSP_SIG_REQUIRED_RESPONSE 5
#define OCSP_UNAUTHORIZED_RESPONSE 6
#define szOID_PKIX_OCSP_BASIC_SIGNED_RESPONSE "1.3.6.1.5.5.7.48.1.1"
//+-------------------------------------------------------------------------
// OCSP_BASIC_SIGNED_RESPONSE
// szOID_PKIX_OCSP_BASIC_SIGNED_RESPONSE
//
// OCSP basic signed response.
//--------------------------------------------------------------------------
typedef struct _OCSP_BASIC_SIGNED_RESPONSE_INFO {
CRYPT_DER_BLOB ToBeSigned; // Encoded OCSP_BASIC_RESPONSE
OCSP_SIGNATURE_INFO SignatureInfo;
} OCSP_BASIC_SIGNED_RESPONSE_INFO, *POCSP_BASIC_SIGNED_RESPONSE_INFO;
//+-------------------------------------------------------------------------
// OCSP_BASIC_RESPONSE
//
// ToBeSigned OCSP basic response.
//--------------------------------------------------------------------------
typedef struct _OCSP_BASIC_REVOKED_INFO {
FILETIME RevocationDate;
// See X509_CRL_REASON_CODE for list of reason codes
DWORD dwCrlReasonCode;
} OCSP_BASIC_REVOKED_INFO, *POCSP_BASIC_REVOKED_INFO;
typedef struct _OCSP_BASIC_RESPONSE_ENTRY {
OCSP_CERT_ID CertId;
DWORD dwCertStatus;
union {
// OCSP_BASIC_GOOD_CERT_STATUS
// OCSP_BASIC_UNKNOWN_CERT_STATUS
// No additional information
// OCSP_BASIC_REVOKED_CERT_STATUS
POCSP_BASIC_REVOKED_INFO pRevokedInfo;
};
FILETIME ThisUpdate;
FILETIME NextUpdate; // Optional, zero filetime implies
// never expires
DWORD cExtension;
PCERT_EXTENSION rgExtension;
} OCSP_BASIC_RESPONSE_ENTRY, *POCSP_BASIC_RESPONSE_ENTRY;
#define OCSP_BASIC_GOOD_CERT_STATUS 0
#define OCSP_BASIC_REVOKED_CERT_STATUS 1
#define OCSP_BASIC_UNKNOWN_CERT_STATUS 2
typedef struct _OCSP_BASIC_RESPONSE_INFO {
DWORD dwVersion;
DWORD dwResponderIdChoice;
union {
// OCSP_BASIC_BY_NAME_RESPONDER_ID
CERT_NAME_BLOB ByNameResponderId;
// OCSP_BASIC_BY_KEY_RESPONDER_ID
CRYPT_HASH_BLOB ByKeyResponderId;
};
FILETIME ProducedAt;
DWORD cResponseEntry;
POCSP_BASIC_RESPONSE_ENTRY rgResponseEntry;
DWORD cExtension;
PCERT_EXTENSION rgExtension;
} OCSP_BASIC_RESPONSE_INFO, *POCSP_BASIC_RESPONSE_INFO;
#define OCSP_BASIC_RESPONSE_V1 0
#define OCSP_BASIC_BY_NAME_RESPONDER_ID 1
#define OCSP_BASIC_BY_KEY_RESPONDER_ID 2
//+=========================================================================
// Object IDentifier (OID) Installable Functions: Data Structures and APIs // Object IDentifier (OID) Installable Functions: Data Structures and APIs
//========================================================================== //==========================================================================
typedef void *HCRYPTOIDFUNCSET; typedef void *HCRYPTOIDFUNCSET;
typedef void *HCRYPTOIDFUNCADDR; typedef void *HCRYPTOIDFUNCADDR;
// Predefined OID Function Names // Predefined OID Function Names
#define CRYPT_OID_ENCODE_OBJECT_FUNC "CryptDllEncodeObject" #define CRYPT_OID_ENCODE_OBJECT_FUNC "CryptDllEncodeObject"
#define CRYPT_OID_DECODE_OBJECT_FUNC "CryptDllDecodeObject" #define CRYPT_OID_DECODE_OBJECT_FUNC "CryptDllDecodeObject"
#define CRYPT_OID_ENCODE_OBJECT_EX_FUNC "CryptDllEncodeObjectEx" #define CRYPT_OID_ENCODE_OBJECT_EX_FUNC "CryptDllEncodeObjectEx"
skipping to change at line 4334 skipping to change at line 5593
// CryptDllDecodeObjectEx has same function signature as CryptDecodeObjectEx. // CryptDllDecodeObjectEx has same function signature as CryptDecodeObjectEx.
// The Ex version MUST support the CRYPT_DECODE_ALLOC_FLAG option. // The Ex version MUST support the CRYPT_DECODE_ALLOC_FLAG option.
// //
// If an Ex function isn't installed or registered, then, attempts to find // If an Ex function isn't installed or registered, then, attempts to find
// a non-EX version. If the ALLOC flag is set, then, CryptDecodeObjectEx, // a non-EX version. If the ALLOC flag is set, then, CryptDecodeObjectEx,
// does the allocation and calls the non-EX version twice. // does the allocation and calls the non-EX version twice.
// CryptDllCreateCOMObject has the following signature: // CryptDllCreateCOMObject has the following signature:
// BOOL WINAPI CryptDllCreateCOMObject( // BOOL WINAPI CryptDllCreateCOMObject(
// IN DWORD dwEncodingType, // __in DWORD dwEncodingType,
// IN LPCSTR pszOID, // __in LPCSTR pszOID,
// IN PCRYPT_DATA_BLOB pEncodedContent, // __In PCRYPT_DATA_BLOB pEncodedContent,
// IN DWORD dwFlags, // __in DWORD dwFlags,
// IN REFIID riid, // __in REFIID riid,
// OUT void **ppvObj); // __deref_out void **ppvObj);
// CertDllVerifyRevocation has the same signature as CertVerifyRevocation // CertDllVerifyRevocation has the same signature as CertVerifyRevocation
// (See CertVerifyRevocation for details on when called) // (See CertVerifyRevocation for details on when called)
// CertDllVerifyCTLUsage has the same signature as CertVerifyCTLUsage // CertDllVerifyCTLUsage has the same signature as CertVerifyCTLUsage
// CryptDllFindOIDInfo currently is only used to store values used by // CryptDllFindOIDInfo currently is only used to store values used by
// CryptFindOIDInfo. See CryptFindOIDInfo() for more details. // CryptFindOIDInfo. See CryptFindOIDInfo() for more details.
// CryptDllFindLocalizedName is only used to store localized string // CryptDllFindLocalizedName is only used to store localized string
skipping to change at line 4401 skipping to change at line 5660
// case when the Dll has also regsvr32'ed OID functions via // case when the Dll has also regsvr32'ed OID functions via
// CryptRegisterOIDFunction. // CryptRegisterOIDFunction.
// //
// DEFAULT functions are installed by setting rgFuncEntry[].pszOID = // DEFAULT functions are installed by setting rgFuncEntry[].pszOID =
// CRYPT_DEFAULT_OID. // CRYPT_DEFAULT_OID.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptInstallOIDFunctionAddress( CryptInstallOIDFunctionAddress(
IN HMODULE hModule, // hModule passed to DllMain __in_opt HMODULE hModule, // hModule passed to DllMain
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN LPCSTR pszFuncName, __in LPCSTR pszFuncName,
IN DWORD cFuncEntry, __in DWORD cFuncEntry,
IN const CRYPT_OID_FUNC_ENTRY rgFuncEntry[], __in_ecount(cFuncEntry) const CRYPT_OID_FUNC_ENTRY rgFuncEntry[],
IN DWORD dwFlags __in DWORD dwFlags
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Initialize and return handle to the OID function set identified by its // Initialize and return handle to the OID function set identified by its
// function name. // function name.
// //
// If the set already exists, a handle to the existing set is returned. // If the set already exists, a handle to the existing set is returned.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
HCRYPTOIDFUNCSET HCRYPTOIDFUNCSET
WINAPI WINAPI
CryptInitOIDFunctionSet( CryptInitOIDFunctionSet(
IN LPCSTR pszFuncName, __in LPCSTR pszFuncName,
IN DWORD dwFlags __in DWORD dwFlags
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Search the list of installed functions for an encoding type and OID match. // Search the list of installed functions for an encoding type and OID match.
// If not found, search the registry. // If not found, search the registry.
// //
// For success, returns TRUE with *ppvFuncAddr updated with the function's // For success, returns TRUE with *ppvFuncAddr updated with the function's
// address and *phFuncAddr updated with the function address's handle. // address and *phFuncAddr updated with the function address's handle.
// The function's handle is AddRef'ed. CryptFreeOIDFunctionAddress needs to // The function's handle is AddRef'ed. CryptFreeOIDFunctionAddress needs to
// be called to release it. // be called to release it.
skipping to change at line 4442 skipping to change at line 5701
// For a registry match, the Dll containing the function is loaded. // For a registry match, the Dll containing the function is loaded.
// //
// By default, both the registered and installed function lists are searched. // By default, both the registered and installed function lists are searched.
// Set CRYPT_GET_INSTALLED_OID_FUNC_FLAG to only search the installed list // Set CRYPT_GET_INSTALLED_OID_FUNC_FLAG to only search the installed list
// of functions. This flag would be set by a registered function to get // of functions. This flag would be set by a registered function to get
// the address of a pre-installed function it was replacing. For example, // the address of a pre-installed function it was replacing. For example,
// the registered function might handle a new special case and call the // the registered function might handle a new special case and call the
// pre-installed function to handle the remaining cases. // pre-installed function to handle the remaining cases.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CryptGetOIDFunctionAddress( CryptGetOIDFunctionAddress(
IN HCRYPTOIDFUNCSET hFuncSet, __in HCRYPTOIDFUNCSET hFuncSet,
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN LPCSTR pszOID, __in LPCSTR pszOID,
IN DWORD dwFlags, __in DWORD dwFlags,
OUT void **ppvFuncAddr, __deref_out void **ppvFuncAddr,
OUT HCRYPTOIDFUNCADDR *phFuncAddr __out HCRYPTOIDFUNCADDR *phFuncAddr
); );
#define CRYPT_GET_INSTALLED_OID_FUNC_FLAG 0x1 #define CRYPT_GET_INSTALLED_OID_FUNC_FLAG 0x1
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Get the list of registered default Dll entries for the specified // Get the list of registered default Dll entries for the specified
// function set and encoding type. // function set and encoding type.
// //
// The returned list consists of none, one or more null terminated Dll file // The returned list consists of none, one or more null terminated Dll file
// names. The list is terminated with an empty (L"\0") Dll file name. // names. The list is terminated with an empty (L"\0") Dll file name.
// For example: L"first.dll" L"\0" L"second.dll" L"\0" L"\0" // For example: L"first.dll" L"\0" L"second.dll" L"\0" L"\0"
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptGetDefaultOIDDllList( CryptGetDefaultOIDDllList(
IN HCRYPTOIDFUNCSET hFuncSet, __in HCRYPTOIDFUNCSET hFuncSet,
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
OUT LPWSTR pwszDllList, __out_ecount_part_opt(*pcchDllList, *pcchDllList) __nullnullterminated WCHAR
IN OUT DWORD *pcchDllList *pwszDllList,
__inout DWORD *pcchDllList
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Either: get the first or next installed DEFAULT function OR // Either: get the first or next installed DEFAULT function OR
// load the Dll containing the DEFAULT function. // load the Dll containing the DEFAULT function.
// //
// If pwszDll is NULL, search the list of installed DEFAULT functions. // If pwszDll is NULL, search the list of installed DEFAULT functions.
// *phFuncAddr must be set to NULL to get the first installed function. // *phFuncAddr must be set to NULL to get the first installed function.
// Successive installed functions are returned by setting *phFuncAddr // Successive installed functions are returned by setting *phFuncAddr
// to the hFuncAddr returned by the previous call. // to the hFuncAddr returned by the previous call.
skipping to change at line 4497 skipping to change at line 5757
// function. *phFuncAddr is ignored upon entry and isn't // function. *phFuncAddr is ignored upon entry and isn't
// CryptFreeOIDFunctionAddress'ed. // CryptFreeOIDFunctionAddress'ed.
// //
// For success, returns TRUE with *ppvFuncAddr updated with the function's // For success, returns TRUE with *ppvFuncAddr updated with the function's
// address and *phFuncAddr updated with the function address's handle. // address and *phFuncAddr updated with the function address's handle.
// The function's handle is AddRef'ed. CryptFreeOIDFunctionAddress needs to // The function's handle is AddRef'ed. CryptFreeOIDFunctionAddress needs to
// be called to release it or CryptGetDefaultOIDFunctionAddress can also // be called to release it or CryptGetDefaultOIDFunctionAddress can also
// be called for a NULL pwszDll. // be called for a NULL pwszDll.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CryptGetDefaultOIDFunctionAddress( CryptGetDefaultOIDFunctionAddress(
IN HCRYPTOIDFUNCSET hFuncSet, __in HCRYPTOIDFUNCSET hFuncSet,
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN OPTIONAL LPCWSTR pwszDll, __in_opt LPCWSTR pwszDll,
IN DWORD dwFlags, __in DWORD dwFlags,
OUT void **ppvFuncAddr, __deref_out void **ppvFuncAddr,
IN OUT HCRYPTOIDFUNCADDR *phFuncAddr __inout HCRYPTOIDFUNCADDR *phFuncAddr
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Releases the handle AddRef'ed and returned by CryptGetOIDFunctionAddress // Releases the handle AddRef'ed and returned by CryptGetOIDFunctionAddress
// or CryptGetDefaultOIDFunctionAddress. // or CryptGetDefaultOIDFunctionAddress.
// //
// If a Dll was loaded for the function its unloaded. However, before doing // If a Dll was loaded for the function its unloaded. However, before doing
// the unload, the DllCanUnloadNow function exported by the loaded Dll is // the unload, the DllCanUnloadNow function exported by the loaded Dll is
// called. It should return S_FALSE to inhibit the unload or S_TRUE to enable // called. It should return S_FALSE to inhibit the unload or S_TRUE to enable
// the unload. If the Dll doesn't export DllCanUnloadNow, the Dll is unloaded. // the unload. If the Dll doesn't export DllCanUnloadNow, the Dll is unloaded.
// //
// DllCanUnloadNow has the following signature: // DllCanUnloadNow has the following signature:
// STDAPI DllCanUnloadNow(void); // STDAPI DllCanUnloadNow(void);
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptFreeOIDFunctionAddress( CryptFreeOIDFunctionAddress(
IN HCRYPTOIDFUNCADDR hFuncAddr, __in HCRYPTOIDFUNCADDR hFuncAddr,
IN DWORD dwFlags __in DWORD dwFlags
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Register the Dll containing the function to be called for the specified // Register the Dll containing the function to be called for the specified
// encoding type, function name and OID. // encoding type, function name and OID.
// //
// pwszDll may contain environment-variable strings // pwszDll may contain environment-variable strings
// which are ExpandEnvironmentStrings()'ed before loading the Dll. // which are ExpandEnvironmentStrings()'ed before loading the Dll.
// //
// In addition to registering the DLL, you may override the // In addition to registering the DLL, you may override the
// name of the function to be called. For example, // name of the function to be called. For example,
// pszFuncName = "CryptDllEncodeObject", // pszFuncName = "CryptDllEncodeObject",
// pszOverrideFuncName = "MyEncodeXyz". // pszOverrideFuncName = "MyEncodeXyz".
// This allows a Dll to export multiple OID functions for the same // This allows a Dll to export multiple OID functions for the same
// function name without needing to interpose its own OID dispatcher function. // function name without needing to interpose its own OID dispatcher function.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptRegisterOIDFunction( CryptRegisterOIDFunction(
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN LPCSTR pszFuncName, __in LPCSTR pszFuncName,
IN LPCSTR pszOID, __in LPCSTR pszOID,
IN OPTIONAL LPCWSTR pwszDll, __in_opt LPCWSTR pwszDll,
IN OPTIONAL LPCSTR pszOverrideFuncName __in_opt LPCSTR pszOverrideFuncName
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Unregister the Dll containing the function to be called for the specified // Unregister the Dll containing the function to be called for the specified
// encoding type, function name and OID. // encoding type, function name and OID.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptUnregisterOIDFunction( CryptUnregisterOIDFunction(
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN LPCSTR pszFuncName, __in LPCSTR pszFuncName,
IN LPCSTR pszOID __in LPCSTR pszOID
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Register the Dll containing the default function to be called for the // Register the Dll containing the default function to be called for the
// specified encoding type and function name. // specified encoding type and function name.
// //
// Unlike CryptRegisterOIDFunction, you can't override the function name // Unlike CryptRegisterOIDFunction, you can't override the function name
// needing to be exported by the Dll. // needing to be exported by the Dll.
// //
// The Dll is inserted before the entry specified by dwIndex. // The Dll is inserted before the entry specified by dwIndex.
// dwIndex == 0, inserts at the beginning. // dwIndex == 0, inserts at the beginning.
// dwIndex == CRYPT_REGISTER_LAST_INDEX, appends at the end. // dwIndex == CRYPT_REGISTER_LAST_INDEX, appends at the end.
// //
// pwszDll may contain environment-variable strings // pwszDll may contain environment-variable strings
// which are ExpandEnvironmentStrings()'ed before loading the Dll. // which are ExpandEnvironmentStrings()'ed before loading the Dll.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptRegisterDefaultOIDFunction( CryptRegisterDefaultOIDFunction(
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN LPCSTR pszFuncName, __in LPCSTR pszFuncName,
IN DWORD dwIndex, __in DWORD dwIndex,
IN LPCWSTR pwszDll __in LPCWSTR pwszDll
); );
#define CRYPT_REGISTER_FIRST_INDEX 0 #define CRYPT_REGISTER_FIRST_INDEX 0
#define CRYPT_REGISTER_LAST_INDEX 0xFFFFFFFF #define CRYPT_REGISTER_LAST_INDEX 0xFFFFFFFF
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Unregister the Dll containing the default function to be called for // Unregister the Dll containing the default function to be called for
// the specified encoding type and function name. // the specified encoding type and function name.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptUnregisterDefaultOIDFunction( CryptUnregisterDefaultOIDFunction(
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN LPCSTR pszFuncName, __in LPCSTR pszFuncName,
IN LPCWSTR pwszDll __in LPCWSTR pwszDll
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Set the value for the specified encoding type, function name, OID and // Set the value for the specified encoding type, function name, OID and
// value name. // value name.
// //
// See RegSetValueEx for the possible value types. // See RegSetValueEx for the possible value types.
// //
// String types are UNICODE. // String types are UNICODE.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptSetOIDFunctionValue( CryptSetOIDFunctionValue(
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN LPCSTR pszFuncName, __in LPCSTR pszFuncName,
IN LPCSTR pszOID, __in LPCSTR pszOID,
IN LPCWSTR pwszValueName, __in_opt LPCWSTR pwszValueName,
IN DWORD dwValueType, __in DWORD dwValueType,
IN const BYTE *pbValueData, __in_bcount_opt(cbValueData) const BYTE *pbValueData,
IN DWORD cbValueData __in DWORD cbValueData
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Get the value for the specified encoding type, function name, OID and // Get the value for the specified encoding type, function name, OID and
// value name. // value name.
// //
// See RegEnumValue for the possible value types. // See RegEnumValue for the possible value types.
// //
// String types are UNICODE. // String types are UNICODE.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptGetOIDFunctionValue( CryptGetOIDFunctionValue(
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN LPCSTR pszFuncName, __in LPCSTR pszFuncName,
IN LPCSTR pszOID, __in LPCSTR pszOID,
IN LPCWSTR pwszValueName, __in_opt LPCWSTR pwszValueName,
OUT DWORD *pdwValueType, __out_opt DWORD *pdwValueType,
OUT BYTE *pbValueData, __out_bcount_part_opt(*pcbValueData, *pcbValueData) BYTE *pbValueData,
IN OUT DWORD *pcbValueData __inout_opt DWORD *pcbValueData
); );
typedef BOOL (WINAPI *PFN_CRYPT_ENUM_OID_FUNC)( typedef BOOL (WINAPI *PFN_CRYPT_ENUM_OID_FUNC)(
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN LPCSTR pszFuncName, __in LPCSTR pszFuncName,
IN LPCSTR pszOID, __in LPCSTR pszOID,
IN DWORD cValue, __in DWORD cValue,
IN const DWORD rgdwValueType[], __in_ecount(cValue) const DWORD rgdwValueType[],
IN LPCWSTR const rgpwszValueName[], __in_ecount(cValue) LPCWSTR const rgpwszValueName[],
IN const BYTE * const rgpbValueData[], __in_ecount(cValue) const BYTE * const rgpbValueData[],
IN const DWORD rgcbValueData[], __in_ecount(cValue) const DWORD rgcbValueData[],
IN void *pvArg __inout_opt void *pvArg
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Enumerate the OID functions identified by their encoding type, // Enumerate the OID functions identified by their encoding type,
// function name and OID. // function name and OID.
// //
// pfnEnumOIDFunc is called for each registry key matching the input // pfnEnumOIDFunc is called for each registry key matching the input
// parameters. Setting dwEncodingType to CRYPT_MATCH_ANY_ENCODING_TYPE matches // parameters. Setting dwEncodingType to CRYPT_MATCH_ANY_ENCODING_TYPE matches
// any. Setting pszFuncName or pszOID to NULL matches any. // any. Setting pszFuncName or pszOID to NULL matches any.
// //
// Set pszOID == CRYPT_DEFAULT_OID to restrict the enumeration to only the // Set pszOID == CRYPT_DEFAULT_OID to restrict the enumeration to only the
// DEFAULT functions // DEFAULT functions
// //
// String types are UNICODE. // String types are UNICODE.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptEnumOIDFunction( CryptEnumOIDFunction(
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN OPTIONAL LPCSTR pszFuncName, __in_opt LPCSTR pszFuncName,
IN OPTIONAL LPCSTR pszOID, __in_opt LPCSTR pszOID,
IN DWORD dwFlags, __in DWORD dwFlags,
IN void *pvArg, __inout_opt void *pvArg,
IN PFN_CRYPT_ENUM_OID_FUNC pfnEnumOIDFunc __callback PFN_CRYPT_ENUM_OID_FUNC pfnEnumOIDFunc
); );
#define CRYPT_MATCH_ANY_ENCODING_TYPE 0xFFFFFFFF #define CRYPT_MATCH_ANY_ENCODING_TYPE 0xFFFFFFFF
//+========================================================================= //+=========================================================================
// Object IDentifier (OID) Information: Data Structures and APIs // Object IDentifier (OID) Information: Data Structures and APIs
//========================================================================== //==========================================================================
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Special ALG_ID's used in CRYPT_OID_INFO
//--------------------------------------------------------------------------
// Algorithm is only implemented in CNG.
#define CALG_OID_INFO_CNG_ONLY 0xFFFFFFFF
// Algorithm is defined in the encoded parameters. Only supported
// using CNG.
#define CALG_OID_INFO_PARAMETERS 0xFFFFFFFE
// Macro to check for a special ALG_ID used in CRYPT_OID_INFO
#define IS_SPECIAL_OID_INFO_ALGID(Algid) (Algid >= CALG_OID_INFO_PARAMETE
RS)
//+-------------------------------------------------------------------------
// Special CNG Algorithms used in CRYPT_OID_INFO
//--------------------------------------------------------------------------
#define CRYPT_OID_INFO_HASH_PARAMETERS_ALGORITHM L"CryptOIDInfoHashParameters"
#define CRYPT_OID_INFO_ECC_PARAMETERS_ALGORITHM L"CryptOIDInfoECCParameters"
#define CRYPT_OID_INFO_MGF1_PARAMETERS_ALGORITHM L"CryptOIDInfoMgf1Parameters"
#define CRYPT_OID_INFO_NO_SIGN_ALGORITHM L"CryptOIDInfoNoSign"
#define CRYPT_OID_INFO_OAEP_PARAMETERS_ALGORITHM L"CryptOIDInfoOAEPParameters"
#define CRYPT_OID_INFO_ECC_WRAP_PARAMETERS_ALGORITHM L"CryptOIDInfoECCWrapParame
ters"
//+-------------------------------------------------------------------------
// OID Information // OID Information
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CRYPT_OID_INFO { typedef struct _CRYPT_OID_INFO {
DWORD cbSize; DWORD cbSize;
LPCSTR pszOID; LPCSTR pszOID;
LPCWSTR pwszName; LPCWSTR pwszName;
DWORD dwGroupId; DWORD dwGroupId;
union { union {
DWORD dwValue; DWORD dwValue;
ALG_ID Algid; ALG_ID Algid;
DWORD dwLength; DWORD dwLength;
}; };
CRYPT_DATA_BLOB ExtraInfo; CRYPT_DATA_BLOB ExtraInfo;
#ifdef CRYPT_OID_INFO_HAS_EXTRA_FIELDS
// Note, if you #define CRYPT_OID_INFO_HAS_EXTRA_FIELDS, then, you
// must zero all unused fields in this data structure.
// More fields could be added in a future release.
// The following 2 fields are set to an empty string, L"", if not defined.
// This is the Algid string passed to the BCrypt* and NCrypt* APIs
// defined in bcrypt.h and ncrypt.h.
//
// Its only applicable to the following groups:
// CRYPT_HASH_ALG_OID_GROUP_ID
// CRYPT_ENCRYPT_ALG_OID_GROUP_ID
// CRYPT_PUBKEY_ALG_OID_GROUP_ID
// CRYPT_SIGN_ALG_OID_GROUP_ID
LPCWSTR pwszCNGAlgid;
// Following is only applicable to the following groups:
// CRYPT_SIGN_ALG_OID_GROUP_ID
// The public key pwszCNGAlgid. For ECC,
// CRYPT_OID_INFO_ECC_PARAMETERS_ALGORITHM.
// CRYPT_PUBKEY_ALG_OID_GROUP_ID
// For the ECC algorithms, CRYPT_OID_INFO_ECC_PARAMETERS_ALGORITHM.
LPCWSTR pwszCNGExtraAlgid;
#endif
} CRYPT_OID_INFO, *PCRYPT_OID_INFO; } CRYPT_OID_INFO, *PCRYPT_OID_INFO;
typedef const CRYPT_OID_INFO CCRYPT_OID_INFO, *PCCRYPT_OID_INFO; typedef const CRYPT_OID_INFO CCRYPT_OID_INFO, *PCCRYPT_OID_INFO;
// certenrolld_begin -- CRYPT_*_OID_GROUP_ID
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// OID Group IDs // OID Group IDs
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CRYPT_HASH_ALG_OID_GROUP_ID 1 #define CRYPT_HASH_ALG_OID_GROUP_ID 1
#define CRYPT_ENCRYPT_ALG_OID_GROUP_ID 2 #define CRYPT_ENCRYPT_ALG_OID_GROUP_ID 2
#define CRYPT_PUBKEY_ALG_OID_GROUP_ID 3 #define CRYPT_PUBKEY_ALG_OID_GROUP_ID 3
#define CRYPT_SIGN_ALG_OID_GROUP_ID 4 #define CRYPT_SIGN_ALG_OID_GROUP_ID 4
#define CRYPT_RDN_ATTR_OID_GROUP_ID 5 #define CRYPT_RDN_ATTR_OID_GROUP_ID 5
#define CRYPT_EXT_OR_ATTR_OID_GROUP_ID 6 #define CRYPT_EXT_OR_ATTR_OID_GROUP_ID 6
#define CRYPT_ENHKEY_USAGE_OID_GROUP_ID 7 #define CRYPT_ENHKEY_USAGE_OID_GROUP_ID 7
#define CRYPT_POLICY_OID_GROUP_ID 8 #define CRYPT_POLICY_OID_GROUP_ID 8
#define CRYPT_TEMPLATE_OID_GROUP_ID 9 #define CRYPT_TEMPLATE_OID_GROUP_ID 9
#define CRYPT_LAST_OID_GROUP_ID 9 #define CRYPT_LAST_OID_GROUP_ID 9
#define CRYPT_FIRST_ALG_OID_GROUP_ID CRYPT_HASH_ALG_OID_GROUP_ID #define CRYPT_FIRST_ALG_OID_GROUP_ID CRYPT_HASH_ALG_OID_GROUP_ID
#define CRYPT_LAST_ALG_OID_GROUP_ID CRYPT_SIGN_ALG_OID_GROUP_ID #define CRYPT_LAST_ALG_OID_GROUP_ID CRYPT_SIGN_ALG_OID_GROUP_ID
// certenrolld_end
// The CRYPT_*_ALG_OID_GROUP_ID's have an Algid. The CRYPT_RDN_ATTR_OID_GROUP_ID // The CRYPT_*_ALG_OID_GROUP_ID's have an Algid. The CRYPT_RDN_ATTR_OID_GROUP_ID
// has a dwLength. The CRYPT_EXT_OR_ATTR_OID_GROUP_ID, // has a dwLength. The CRYPT_EXT_OR_ATTR_OID_GROUP_ID,
// CRYPT_ENHKEY_USAGE_OID_GROUP_ID, CRYPT_POLICY_OID_GROUP_ID or // CRYPT_ENHKEY_USAGE_OID_GROUP_ID, CRYPT_POLICY_OID_GROUP_ID or
// CRYPT_TEMPLATE_OID_GROUP_ID don't have a dwValue. // CRYPT_TEMPLATE_OID_GROUP_ID don't have a dwValue.
// //
// CRYPT_ENCRYPT_ALG_OID_GROUP_ID has the following optional ExtraInfo
// for AES algorithms:
// DWORD[0] - dwBitLength
// CRYPT_PUBKEY_ALG_OID_GROUP_ID has the following optional ExtraInfo: // CRYPT_PUBKEY_ALG_OID_GROUP_ID has the following optional ExtraInfo:
// DWORD[0] - Flags. CRYPT_OID_INHIBIT_SIGNATURE_FORMAT_FLAG can be set to // DWORD[0] - Flags. CRYPT_OID_INHIBIT_SIGNATURE_FORMAT_FLAG can be set to
// inhibit the reformatting of the signature before // inhibit the reformatting of the signature before
// CryptVerifySignature is called or after CryptSignHash // CryptVerifySignature is called or after CryptSignHash
// is called. CRYPT_OID_USE_PUBKEY_PARA_FOR_PKCS7_FLAG can // is called. CRYPT_OID_USE_PUBKEY_PARA_FOR_PKCS7_FLAG can
// be set to include the public key algorithm's parameters // be set to include the public key algorithm's parameters
// in the PKCS7's digestEncryptionAlgorithm's parameters. // in the PKCS7's digestEncryptionAlgorithm's parameters.
// CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG can be set to omit // CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG can be set to omit
// NULL parameters when encoding. // NULL parameters when encoding.
//
// For the ECC named curve public keys
// DWORD[1] - BCRYPT_ECCKEY_BLOB dwMagic field value
// DWORD[2] - dwBitLength. Where BCRYPT_ECCKEY_BLOB's
// cbKey = dwBitLength / 8 + ((dwBitLength % 8) ? 1 : 0)
//
#define CRYPT_OID_INHIBIT_SIGNATURE_FORMAT_FLAG 0x1 #define CRYPT_OID_INHIBIT_SIGNATURE_FORMAT_FLAG 0x00000001
#define CRYPT_OID_USE_PUBKEY_PARA_FOR_PKCS7_FLAG 0x2 #define CRYPT_OID_USE_PUBKEY_PARA_FOR_PKCS7_FLAG 0x00000002
#define CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG 0x4 #define CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG 0x00000004
#define CRYPT_OID_PUBKEY_SIGN_ONLY_FLAG 0x80000000
#define CRYPT_OID_PUBKEY_ENCRYPT_ONLY_FLAG 0x40000000
// CRYPT_SIGN_ALG_OID_GROUP_ID has the following optional ExtraInfo: // CRYPT_SIGN_ALG_OID_GROUP_ID has the following optional ExtraInfo:
// DWORD[0] - Public Key Algid. // DWORD[0] - Public Key Algid.
// DWORD[1] - Flags. Same as above for CRYPT_PUBKEY_ALG_OID_GROUP_ID. // DWORD[1] - Flags. Same as above for CRYPT_PUBKEY_ALG_OID_GROUP_ID.
// DWORD[2] - Optional CryptAcquireContext(CRYPT_VERIFYCONTEXT)'s dwProvType. // DWORD[2] - Optional CryptAcquireContext(CRYPT_VERIFYCONTEXT)'s dwProvType.
// If omitted or 0, uses Public Key Algid to select // If omitted or 0, uses Public Key Algid to select
// appropriate dwProvType for signature verification. // appropriate dwProvType for signature verification.
// CRYPT_RDN_ATTR_OID_GROUP_ID has the following optional ExtraInfo: // CRYPT_RDN_ATTR_OID_GROUP_ID has the following optional ExtraInfo:
// Array of DWORDs: // Array of DWORDs:
skipping to change at line 4770 skipping to change at line 6095
// for the specified key and group. Note, returns a pointer to a constant // for the specified key and group. Note, returns a pointer to a constant
// data structure. The returned pointer MUST NOT be freed. // data structure. The returned pointer MUST NOT be freed.
// //
// dwKeyType's: // dwKeyType's:
// CRYPT_OID_INFO_OID_KEY, pvKey points to a szOID // CRYPT_OID_INFO_OID_KEY, pvKey points to a szOID
// CRYPT_OID_INFO_NAME_KEY, pvKey points to a wszName // CRYPT_OID_INFO_NAME_KEY, pvKey points to a wszName
// CRYPT_OID_INFO_ALGID_KEY, pvKey points to an ALG_ID // CRYPT_OID_INFO_ALGID_KEY, pvKey points to an ALG_ID
// CRYPT_OID_INFO_SIGN_KEY, pvKey points to an array of two ALG_ID's: // CRYPT_OID_INFO_SIGN_KEY, pvKey points to an array of two ALG_ID's:
// ALG_ID[0] - Hash Algid // ALG_ID[0] - Hash Algid
// ALG_ID[1] - PubKey Algid // ALG_ID[1] - PubKey Algid
// CRYPT_OID_INFO_CNG_ALGID_KEY, pvKey points to a wszCNGAlgid
// CRYPT_OID_INFO_CNG_SIGN_KEY, pvKey is an array of two
// pwszCNGAlgid's:
// Algid[0] - Hash pwszCNGAlgid
// Algid[1] - PubKey pwszCNGAlgid
//
// For CRYPT_OID_INFO_NAME_KEY, CRYPT_OID_INFO_CNG_ALGID_KEY and
// CRYPT_OID_INFO_CNG_SIGN_KEY the string comparison is case insensitive.
// //
// Setting dwGroupId to 0, searches all groups according to the dwKeyType. // Setting dwGroupId to 0, searches all groups according to the dwKeyType.
// Otherwise, only the dwGroupId is searched. // Otherwise, only the dwGroupId is searched.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCRYPT_OID_INFO PCCRYPT_OID_INFO
WINAPI WINAPI
CryptFindOIDInfo( CryptFindOIDInfo(
IN DWORD dwKeyType, __in DWORD dwKeyType,
IN void *pvKey, __in void *pvKey,
IN DWORD dwGroupId __in DWORD dwGroupId
); );
#define CRYPT_OID_INFO_OID_KEY 1 #define CRYPT_OID_INFO_OID_KEY 1
#define CRYPT_OID_INFO_NAME_KEY 2 #define CRYPT_OID_INFO_NAME_KEY 2
#define CRYPT_OID_INFO_ALGID_KEY 3 #define CRYPT_OID_INFO_ALGID_KEY 3
#define CRYPT_OID_INFO_SIGN_KEY 4 #define CRYPT_OID_INFO_SIGN_KEY 4
#define CRYPT_OID_INFO_CNG_ALGID_KEY 5
#define CRYPT_OID_INFO_CNG_SIGN_KEY 6
// Set the following in the above dwKeyType parameter to restrict public keys
// valid for signing or encrypting
// certenrolld_begin -- CRYPT_*_KEY_FLAG
#define CRYPT_OID_INFO_OID_KEY_FLAGS_MASK 0xFFFF0000
#define CRYPT_OID_INFO_PUBKEY_SIGN_KEY_FLAG 0x80000000
#define CRYPT_OID_INFO_PUBKEY_ENCRYPT_KEY_FLAG 0x40000000
// The following flag can be set in above dwGroupId parameter to disable
// searching the directory server
#define CRYPT_OID_DISABLE_SEARCH_DS_FLAG 0x80000000
// certenrolld_end -- CRYPT_*_KEY_FLAG
// The bit length shifted left 16 bits can be OR'ed into the above
// dwGroupId parameter. Only applicable to the CRYPT_ENCRYPT_ALG_OID_GROUP_ID.
// Also, only applicable to encryption algorithms having a dwBitLen ExtraInfo.
// Currently, only the AES encryption algorithms have this.
//
// For example, to find the OIDInfo for BCRYPT_AES_ALGORITHM, bit length 192,
// CryptFindOIDInfo would be called as follows:
// PCCRYPT_OID_INFO pOIDInfo =
// CryptFindOIDInfo(
// CRYPT_OID_INFO_CNG_ALGID_KEY,
// (void *) BCRYPT_AES_ALGORITHM,
// CRYPT_ENCRYPT_ALG_OID_GROUP_ID |
// (192 << CRYPT_OID_INFO_OID_GROUP_BIT_LEN_SHIFT)
// );
#define CRYPT_OID_INFO_OID_GROUP_BIT_LEN_MASK 0x0FFF0000
#define CRYPT_OID_INFO_OID_GROUP_BIT_LEN_SHIFT 16
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Register OID information. The OID information specified in the // Register OID information. The OID information specified in the
// CCRYPT_OID_INFO structure is persisted to the registry. // CCRYPT_OID_INFO structure is persisted to the registry.
// //
// crypt32.dll contains information for the commonly known OIDs. This function // crypt32.dll contains information for the commonly known OIDs. This function
// allows applications to augment crypt32.dll's OID information. During // allows applications to augment crypt32.dll's OID information. During
// CryptFindOIDInfo's first call, the registered OID information is installed. // CryptFindOIDInfo's first call, the registered OID information is installed.
// //
// By default the registered OID information is installed after crypt32.dll's // By default the registered OID information is installed after crypt32.dll's
// OID entries. Set CRYPT_INSTALL_OID_INFO_BEFORE_FLAG to install before. // OID entries. Set CRYPT_INSTALL_OID_INFO_BEFORE_FLAG to install before.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptRegisterOIDInfo( CryptRegisterOIDInfo(
IN PCCRYPT_OID_INFO pInfo, __in PCCRYPT_OID_INFO pInfo,
IN DWORD dwFlags __in DWORD dwFlags
); );
#define CRYPT_INSTALL_OID_INFO_BEFORE_FLAG 1 #define CRYPT_INSTALL_OID_INFO_BEFORE_FLAG 1
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Unregister OID information. Only the pszOID and dwGroupId fields are // Unregister OID information. Only the pszOID and dwGroupId fields are
// used to identify the OID information to be unregistered. // used to identify the OID information to be unregistered.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptUnregisterOIDInfo( CryptUnregisterOIDInfo(
IN PCCRYPT_OID_INFO pInfo __in PCCRYPT_OID_INFO pInfo
); );
// If the callback returns FALSE, stops the enumeration. // If the callback returns FALSE, stops the enumeration.
typedef BOOL (WINAPI *PFN_CRYPT_ENUM_OID_INFO)( typedef BOOL (WINAPI *PFN_CRYPT_ENUM_OID_INFO)(
IN PCCRYPT_OID_INFO pInfo, __in PCCRYPT_OID_INFO pInfo,
IN void *pvArg __inout_opt void *pvArg
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Enumerate the OID information. // Enumerate the OID information.
// //
// pfnEnumOIDInfo is called for each OID information entry. // pfnEnumOIDInfo is called for each OID information entry.
// //
// Setting dwGroupId to 0 matches all groups. Otherwise, only enumerates // Setting dwGroupId to 0 matches all groups. Otherwise, only enumerates
// entries in the specified group. // entries in the specified group.
// //
// dwFlags currently isn't used and must be set to 0. // dwFlags currently isn't used and must be set to 0.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptEnumOIDInfo( CryptEnumOIDInfo(
IN DWORD dwGroupId, __in DWORD dwGroupId,
IN DWORD dwFlags, __in DWORD dwFlags,
IN void *pvArg, __inout_opt void *pvArg,
IN PFN_CRYPT_ENUM_OID_INFO pfnEnumOIDInfo __callback PFN_CRYPT_ENUM_OID_INFO pfnEnumOIDInfo
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Find the localized name for the specified name. For example, find the // Find the localized name for the specified name. For example, find the
// localized name for the "Root" system store name. A case insensitive // localized name for the "Root" system store name. A case insensitive
// string comparison is done. // string comparison is done.
// //
// Returns NULL if unable to find the the specified name. // Returns NULL if unable to find the the specified name.
// //
// Localized names for the predefined system stores ("Root", "My") and // Localized names for the predefined system stores ("Root", "My") and
skipping to change at line 4873 skipping to change at line 6239
// cbValueData = (wcslen(UNICODE localized string) + 1) * sizeof(WCHAR) // cbValueData = (wcslen(UNICODE localized string) + 1) * sizeof(WCHAR)
// //
// To unregister, set pbValueData to NULL and cbValueData to 0. // To unregister, set pbValueData to NULL and cbValueData to 0.
// //
// The registered names are searched before the pre-installed names. // The registered names are searched before the pre-installed names.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
LPCWSTR LPCWSTR
WINAPI WINAPI
CryptFindLocalizedName( CryptFindLocalizedName(
IN LPCWSTR pwszCryptName __in LPCWSTR pwszCryptName
); );
#define CRYPT_LOCALIZED_NAME_ENCODING_TYPE 0 #define CRYPT_LOCALIZED_NAME_ENCODING_TYPE 0
#define CRYPT_LOCALIZED_NAME_OID "LocalizedNames" #define CRYPT_LOCALIZED_NAME_OID "LocalizedNames"
//+========================================================================= //+=========================================================================
// Low Level Cryptographic Message Data Structures and APIs // Low Level Cryptographic Message Data Structures and APIs
//========================================================================== //==========================================================================
typedef void *HCRYPTMSG; typedef void *HCRYPTMSG;
skipping to change at line 4985 skipping to change at line 6351
// == 0, then, defaults to AT_SIGNATURE. // == 0, then, defaults to AT_SIGNATURE.
// //
// If the HashEncryptionAlgorithm is set to szOID_PKIX_NO_SIGNATURE, then, // If the HashEncryptionAlgorithm is set to szOID_PKIX_NO_SIGNATURE, then,
// the signature value only contains the hash octets. hCryptProv must still // the signature value only contains the hash octets. hCryptProv must still
// be specified. However, since a private key isn't used the hCryptProv can be // be specified. However, since a private key isn't used the hCryptProv can be
// acquired using CRYPT_VERIFYCONTEXT. // acquired using CRYPT_VERIFYCONTEXT.
// //
// If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags // If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags
// passed to CryptMsgOpenToEncode(), the signer hCryptProv's are released. // passed to CryptMsgOpenToEncode(), the signer hCryptProv's are released.
// //
// For CNG, this applies to the hNCryptKey.
//
// pvHashAuxInfo currently isn't used and must be set to NULL. // pvHashAuxInfo currently isn't used and must be set to NULL.
// //
// CMS signed messages allow the inclusion of Attribute Certs. // CMS signed messages allow the inclusion of Attribute Certs.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_SIGNER_ENCODE_INFO { typedef struct _CMSG_SIGNER_ENCODE_INFO {
DWORD cbSize; DWORD cbSize;
PCERT_INFO pCertInfo; PCERT_INFO pCertInfo;
HCRYPTPROV hCryptProv;
// NCryptIsKeyHandle() is called to determine the union choice.
union {
HCRYPTPROV hCryptProv;
NCRYPT_KEY_HANDLE hNCryptKey;
};
// not applicable for hNCryptKey choice
DWORD dwKeySpec; DWORD dwKeySpec;
CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm; CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
void *pvHashAuxInfo; void *pvHashAuxInfo;
DWORD cAuthAttr; DWORD cAuthAttr;
PCRYPT_ATTRIBUTE rgAuthAttr; PCRYPT_ATTRIBUTE rgAuthAttr;
DWORD cUnauthAttr; DWORD cUnauthAttr;
PCRYPT_ATTRIBUTE rgUnauthAttr; PCRYPT_ATTRIBUTE rgUnauthAttr;
#ifdef CMSG_SIGNER_ENCODE_INFO_HAS_CMS_FIELDS #ifdef CMSG_SIGNER_ENCODE_INFO_HAS_CMS_FIELDS
CERT_ID SignerId; CERT_ID SignerId;
// This is also referred to as the SignatureAlgorithm
CRYPT_ALGORITHM_IDENTIFIER HashEncryptionAlgorithm; CRYPT_ALGORITHM_IDENTIFIER HashEncryptionAlgorithm;
void *pvHashEncryptionAuxInfo; void *pvHashEncryptionAuxInfo;
#endif #endif
} CMSG_SIGNER_ENCODE_INFO, *PCMSG_SIGNER_ENCODE_INFO; } CMSG_SIGNER_ENCODE_INFO, *PCMSG_SIGNER_ENCODE_INFO;
typedef struct _CMSG_SIGNED_ENCODE_INFO { typedef struct _CMSG_SIGNED_ENCODE_INFO {
DWORD cbSize; DWORD cbSize;
DWORD cSigners; DWORD cSigners;
PCMSG_SIGNER_ENCODE_INFO rgSigners; PCMSG_SIGNER_ENCODE_INFO rgSigners;
DWORD cCertEncoded; DWORD cCertEncoded;
skipping to change at line 5058 skipping to change at line 6436
// //
// To enable SP3 compatible encryption, pvEncryptionAuxInfo should point to // To enable SP3 compatible encryption, pvEncryptionAuxInfo should point to
// a CMSG_SP3_COMPATIBLE_AUX_INFO data structure. // a CMSG_SP3_COMPATIBLE_AUX_INFO data structure.
// //
// To enable the CMS envelope enhancements, rgpRecipients must be set to // To enable the CMS envelope enhancements, rgpRecipients must be set to
// NULL, and rgCmsRecipients updated to point to an array of // NULL, and rgCmsRecipients updated to point to an array of
// CMSG_RECIPIENT_ENCODE_INFO's. // CMSG_RECIPIENT_ENCODE_INFO's.
// //
// Also, CMS envelope enhancements support the inclusion of a bag of // Also, CMS envelope enhancements support the inclusion of a bag of
// Certs, CRLs, Attribute Certs and/or Unprotected Attributes. // Certs, CRLs, Attribute Certs and/or Unprotected Attributes.
//
// AES ContentEncryption and ECC KeyAgreement recipients are only supported
// via CNG. DH KeyAgreement or mail list recipients are only supported via
// CAPI1. SP3 compatible encryption and RC4 are only supported via CAPI1.
//
// For an RSA recipient identified via PCERT_INFO, for AES ContentEncryption,
// szOID_RSAES_OAEP will be implicitly used for the KeyEncryptionAlgorithm.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_RECIPIENT_ENCODE_INFO CMSG_RECIPIENT_ENCODE_INFO, typedef struct _CMSG_RECIPIENT_ENCODE_INFO CMSG_RECIPIENT_ENCODE_INFO,
*PCMSG_RECIPIENT_ENCODE_INFO; *PCMSG_RECIPIENT_ENCODE_INFO;
typedef struct _CMSG_ENVELOPED_ENCODE_INFO { typedef struct _CMSG_ENVELOPED_ENCODE_INFO {
DWORD cbSize; DWORD cbSize;
HCRYPTPROV hCryptProv; HCRYPTPROV_LEGACY hCryptProv;
CRYPT_ALGORITHM_IDENTIFIER ContentEncryptionAlgorithm; CRYPT_ALGORITHM_IDENTIFIER ContentEncryptionAlgorithm;
void *pvEncryptionAuxInfo; void *pvEncryptionAuxInfo;
DWORD cRecipients; DWORD cRecipients;
// The following array may only be used for transport recipients identified // The following array may only be used for transport recipients identified
// by their IssuereAndSerialNumber. If rgpRecipients != NULL, then, // by their IssuereAndSerialNumber. If rgpRecipients != NULL, then,
// the rgCmsRecipients must be NULL. // the rgCmsRecipients must be NULL.
PCERT_INFO *rgpRecipients; PCERT_INFO *rgpRecipients;
#ifdef CMSG_ENVELOPED_ENCODE_INFO_HAS_CMS_FIELDS #ifdef CMSG_ENVELOPED_ENCODE_INFO_HAS_CMS_FIELDS
skipping to change at line 5103 skipping to change at line 6488
// and export. The hCryptProv's private keys aren't used. // and export. The hCryptProv's private keys aren't used.
// //
// If hCryptProv is NULL, then, the hCryptProv specified in // If hCryptProv is NULL, then, the hCryptProv specified in
// CMSG_ENVELOPED_ENCODE_INFO is used. // CMSG_ENVELOPED_ENCODE_INFO is used.
// //
// Note, even if CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags // Note, even if CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags
// passed to CryptMsgOpenToEncode(), this hCryptProv isn't released. // passed to CryptMsgOpenToEncode(), this hCryptProv isn't released.
// //
// CMS supports the KEY_IDENTIFIER and ISSUER_SERIAL_NUMBER CERT_IDs. PKCS #7 // CMS supports the KEY_IDENTIFIER and ISSUER_SERIAL_NUMBER CERT_IDs. PKCS #7
// version 1.5 only supports the ISSUER_SERIAL_NUMBER CERT_ID choice. // version 1.5 only supports the ISSUER_SERIAL_NUMBER CERT_ID choice.
//
// For RSA AES, KeyEncryptionAlgorithm.pszObjId should be set to
// szOID_RSAES_OAEP. KeyEncryptionAlgorithm.Parameters should be set
// to the encoded PKCS_RSAES_OAEP_PARAMETERS. If
// KeyEncryptionAlgorithm.Parameters.cbData == 0, then, the default
// parameters are used and encoded.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO { typedef struct _CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO {
DWORD cbSize; DWORD cbSize;
CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm; CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm;
void *pvKeyEncryptionAuxInfo; void *pvKeyEncryptionAuxInfo;
HCRYPTPROV hCryptProv; HCRYPTPROV_LEGACY hCryptProv;
CRYPT_BIT_BLOB RecipientPublicKey; CRYPT_BIT_BLOB RecipientPublicKey;
CERT_ID RecipientId; CERT_ID RecipientId;
} CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO, *PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO; } CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO, *PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Key Agreement Recipient Encode Info // Key Agreement Recipient Encode Info
// //
// If hCryptProv is NULL, then, the hCryptProv specified in // If hCryptProv is NULL, then, the hCryptProv specified in
// CMSG_ENVELOPED_ENCODE_INFO is used. // CMSG_ENVELOPED_ENCODE_INFO is used.
// //
skipping to change at line 5148 skipping to change at line 6539
// //
// If KeyEncryptionAlgorithm.Parameters.cbData == 0, then, its Parameters // If KeyEncryptionAlgorithm.Parameters.cbData == 0, then, its Parameters
// are updated with the encoded KeyWrapAlgorithm. // are updated with the encoded KeyWrapAlgorithm.
// //
// Currently, pvKeyWrapAuxInfo is only defined for algorithms with // Currently, pvKeyWrapAuxInfo is only defined for algorithms with
// RC2. Otherwise, its not used and must be set to NULL. // RC2. Otherwise, its not used and must be set to NULL.
// When set for RC2 algorithms, points to a CMSG_RC2_AUX_INFO containing // When set for RC2 algorithms, points to a CMSG_RC2_AUX_INFO containing
// the RC2 effective key length. // the RC2 effective key length.
// //
// Note, key agreement recipients are not supported in PKCS #7 version 1.5. // Note, key agreement recipients are not supported in PKCS #7 version 1.5.
//
// For the ECC szOID_DH_SINGLE_PASS_STDDH_SHA1_KDF KeyEncryptionAlgorithm
// the CMSG_KEY_AGREE_EPHEMERAL_KEY_CHOICE must be specified.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO { typedef struct _CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO {
DWORD cbSize; DWORD cbSize;
CRYPT_BIT_BLOB RecipientPublicKey; CRYPT_BIT_BLOB RecipientPublicKey;
CERT_ID RecipientId; CERT_ID RecipientId;
// Following fields are optional and only applicable to KEY_IDENTIFIER // Following fields are optional and only applicable to KEY_IDENTIFIER
// CERT_IDs. // CERT_IDs.
FILETIME Date; FILETIME Date;
PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr; PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
skipping to change at line 5173 skipping to change at line 6567
CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm; CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm;
void *pvKeyEncryptionAuxInfo; void *pvKeyEncryptionAuxInfo;
CRYPT_ALGORITHM_IDENTIFIER KeyWrapAlgorithm; CRYPT_ALGORITHM_IDENTIFIER KeyWrapAlgorithm;
void *pvKeyWrapAuxInfo; void *pvKeyWrapAuxInfo;
// The following hCryptProv and dwKeySpec must be specified for the // The following hCryptProv and dwKeySpec must be specified for the
// CMSG_KEY_AGREE_STATIC_KEY_CHOICE. // CMSG_KEY_AGREE_STATIC_KEY_CHOICE.
// //
// For CMSG_KEY_AGREE_EPHEMERAL_KEY_CHOICE, dwKeySpec isn't applicable // For CMSG_KEY_AGREE_EPHEMERAL_KEY_CHOICE, dwKeySpec isn't applicable
// and hCryptProv is optional. // and hCryptProv is optional.
HCRYPTPROV hCryptProv;
HCRYPTPROV_LEGACY hCryptProv;
DWORD dwKeySpec; DWORD dwKeySpec;
DWORD dwKeyChoice; DWORD dwKeyChoice;
union { union {
// CMSG_KEY_AGREE_EPHEMERAL_KEY_CHOICE // CMSG_KEY_AGREE_EPHEMERAL_KEY_CHOICE
// //
// The ephemeral public key algorithm and parameters. // The ephemeral public key algorithm and parameters.
PCRYPT_ALGORITHM_IDENTIFIER pEphemeralAlgorithm; PCRYPT_ALGORITHM_IDENTIFIER pEphemeralAlgorithm;
// CMSG_KEY_AGREE_STATIC_KEY_CHOICE // CMSG_KEY_AGREE_STATIC_KEY_CHOICE
skipping to change at line 5213 skipping to change at line 6608
// //
// Note, even if CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags // Note, even if CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags
// passed to CryptMsgOpenToEncode(), this hCryptProv isn't released. // passed to CryptMsgOpenToEncode(), this hCryptProv isn't released.
// //
// Currently, pvKeyEncryptionAuxInfo is only defined for RC2 key wrap // Currently, pvKeyEncryptionAuxInfo is only defined for RC2 key wrap
// algorithms. Otherwise, its not used and must be set to NULL. // algorithms. Otherwise, its not used and must be set to NULL.
// When set for RC2 algorithms, points to a CMSG_RC2_AUX_INFO containing // When set for RC2 algorithms, points to a CMSG_RC2_AUX_INFO containing
// the RC2 effective key length. // the RC2 effective key length.
// //
// Note, mail list recipients are not supported in PKCS #7 version 1.5. // Note, mail list recipients are not supported in PKCS #7 version 1.5.
//
// Mail list recipients aren't supported using CNG.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO { typedef struct _CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO {
DWORD cbSize; DWORD cbSize;
CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm; CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm;
void *pvKeyEncryptionAuxInfo; void *pvKeyEncryptionAuxInfo;
HCRYPTPROV hCryptProv; HCRYPTPROV hCryptProv;
DWORD dwKeyChoice; DWORD dwKeyChoice;
union { union {
// CMSG_MAIL_LIST_HANDLE_KEY_CHOICE // CMSG_MAIL_LIST_HANDLE_KEY_CHOICE
HCRYPTKEY hKeyEncryptionKey; HCRYPTKEY hKeyEncryptionKey;
skipping to change at line 5285 skipping to change at line 6682
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CMSG_SP3_COMPATIBLE_AUX_INFO // CMSG_SP3_COMPATIBLE_AUX_INFO
// //
// AuxInfo for enabling SP3 compatible encryption. // AuxInfo for enabling SP3 compatible encryption.
// //
// The CMSG_SP3_COMPATIBLE_ENCRYPT_FLAG is set in dwFlags to enable SP3 // The CMSG_SP3_COMPATIBLE_ENCRYPT_FLAG is set in dwFlags to enable SP3
// compatible encryption. When set, uses zero salt instead of no salt, // compatible encryption. When set, uses zero salt instead of no salt,
// the encryption algorithm parameters are NULL instead of containing the // the encryption algorithm parameters are NULL instead of containing the
// encoded RC2 parameters or encoded IV octet string and the encrypted // encoded RC2 parameters or encoded IV octet string and the encrypted
// symmetric key is encoded little endian instead of big endian. // symmetric key is encoded little endian instead of big endian.
//
// SP3 compatible encryption isn't supported using CNG.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_SP3_COMPATIBLE_AUX_INFO { typedef struct _CMSG_SP3_COMPATIBLE_AUX_INFO {
DWORD cbSize; DWORD cbSize;
DWORD dwFlags; DWORD dwFlags;
} CMSG_SP3_COMPATIBLE_AUX_INFO, *PCMSG_SP3_COMPATIBLE_AUX_INFO; } CMSG_SP3_COMPATIBLE_AUX_INFO, *PCMSG_SP3_COMPATIBLE_AUX_INFO;
#define CMSG_SP3_COMPATIBLE_ENCRYPT_FLAG 0x80000000 #define CMSG_SP3_COMPATIBLE_ENCRYPT_FLAG 0x80000000
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CMSG_RC4_AUX_INFO // CMSG_RC4_AUX_INFO
// //
// AuxInfo for RC4 encryption algorithms. The pvEncryptionAuxInfo field // AuxInfo for RC4 encryption algorithms. The pvEncryptionAuxInfo field
// in CMSG_ENCRYPTED_ENCODE_INFO should be updated to point to this // in CMSG_ENCRYPTED_ENCODE_INFO should be updated to point to this
// structure. If not specified, uses the CSP's default bit length with no // structure. If not specified, uses the CSP's default bit length with no
// salt. Note, the base CSP has a 40 bit default and the enhanced CSP has // salt. Note, the base CSP has a 40 bit default and the enhanced CSP has
// a 128 bit default. // a 128 bit default.
// //
// If CMSG_RC4_NO_SALT_FLAG is set in dwBitLen, then, no salt is generated. // If CMSG_RC4_NO_SALT_FLAG is set in dwBitLen, then, no salt is generated.
// Otherwise, (128 - dwBitLen)/8 bytes of salt are generated and encoded // Otherwise, (128 - dwBitLen)/8 bytes of salt are generated and encoded
// as an OCTET STRING in the algorithm parameters field. // as an OCTET STRING in the algorithm parameters field.
//
// RC4 isn't supported using CNG.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_RC4_AUX_INFO { typedef struct _CMSG_RC4_AUX_INFO {
DWORD cbSize; DWORD cbSize;
DWORD dwBitLen; DWORD dwBitLen;
} CMSG_RC4_AUX_INFO, *PCMSG_RC4_AUX_INFO; } CMSG_RC4_AUX_INFO, *PCMSG_RC4_AUX_INFO;
#define CMSG_RC4_NO_SALT_FLAG 0x40000000 #define CMSG_RC4_NO_SALT_FLAG 0x40000000
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CMSG_SIGNED_AND_ENVELOPED // CMSG_SIGNED_AND_ENVELOPED
skipping to change at line 5334 skipping to change at line 6735
} CMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO, *PCMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO ; } CMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO, *PCMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO ;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CMSG_HASHED // CMSG_HASHED
// //
// hCryptProv is used to do the hash. Doesn't need to use a private key. // hCryptProv is used to do the hash. Doesn't need to use a private key.
// //
// If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags // If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags
// passed to CryptMsgOpenToEncode(), the hCryptProv is released. // passed to CryptMsgOpenToEncode(), the hCryptProv is released.
// //
// IN LH, the hCryptProv isn't used. However, its still released if the
// above flag is set.
//
// If fDetachedHash is set, then, the encoded message doesn't contain // If fDetachedHash is set, then, the encoded message doesn't contain
// any content (its treated as NULL Data) // any content (its treated as NULL Data)
// //
// pvHashAuxInfo currently isn't used and must be set to NULL. // pvHashAuxInfo currently isn't used and must be set to NULL.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_HASHED_ENCODE_INFO { typedef struct _CMSG_HASHED_ENCODE_INFO {
DWORD cbSize; DWORD cbSize;
HCRYPTPROV hCryptProv; HCRYPTPROV_LEGACY hCryptProv;
CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm; CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
void *pvHashAuxInfo; void *pvHashAuxInfo;
} CMSG_HASHED_ENCODE_INFO, *PCMSG_HASHED_ENCODE_INFO; } CMSG_HASHED_ENCODE_INFO, *PCMSG_HASHED_ENCODE_INFO;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CMSG_ENCRYPTED // CMSG_ENCRYPTED
// //
// The key used to encrypt the message is identified outside of the message // The key used to encrypt the message is identified outside of the message
// content (for example, password). // content (for example, password).
// //
skipping to change at line 5378 skipping to change at line 6782
// called to get the cryptographically processed content. Until closed, // called to get the cryptographically processed content. Until closed,
// the handle keeps a copy of the processed content. // the handle keeps a copy of the processed content.
// //
// With streamed output, the processed content can be freed as its streamed. // With streamed output, the processed content can be freed as its streamed.
// //
// If the length of the content to be updated is known at the time of the // If the length of the content to be updated is known at the time of the
// open, then, ContentLength should be set to that length. Otherwise, it // open, then, ContentLength should be set to that length. Otherwise, it
// should be set to CMSG_INDEFINITE_LENGTH. // should be set to CMSG_INDEFINITE_LENGTH.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef BOOL (WINAPI *PFN_CMSG_STREAM_OUTPUT)( typedef BOOL (WINAPI *PFN_CMSG_STREAM_OUTPUT)(
IN const void *pvArg, __in_opt const void *pvArg,
IN BYTE *pbData, __in_bcount_opt(cbData) BYTE *pbData,
IN DWORD cbData, __in DWORD cbData,
IN BOOL fFinal __in BOOL fFinal
); );
#define CMSG_INDEFINITE_LENGTH (0xFFFFFFFF) #define CMSG_INDEFINITE_LENGTH (0xFFFFFFFF)
typedef struct _CMSG_STREAM_INFO { typedef struct _CMSG_STREAM_INFO {
DWORD cbContent; DWORD cbContent;
PFN_CMSG_STREAM_OUTPUT pfnStreamOutput; PFN_CMSG_STREAM_OUTPUT pfnStreamOutput;
void *pvArg; void *pvArg;
} CMSG_STREAM_INFO, *PCMSG_STREAM_INFO; } CMSG_STREAM_INFO, *PCMSG_STREAM_INFO;
skipping to change at line 5410 skipping to change at line 6814
#define CMSG_MAX_LENGTH_FLAG 0x00000020 #define CMSG_MAX_LENGTH_FLAG 0x00000020
// When set, nonData type inner content is encapsulated within an // When set, nonData type inner content is encapsulated within an
// OCTET STRING. Applicable to both Signed and Enveloped messages. // OCTET STRING. Applicable to both Signed and Enveloped messages.
#define CMSG_CMS_ENCAPSULATED_CONTENT_FLAG 0x00000040 #define CMSG_CMS_ENCAPSULATED_CONTENT_FLAG 0x00000040
// If set, then, the hCryptProv passed to CryptMsgOpenToEncode or // If set, then, the hCryptProv passed to CryptMsgOpenToEncode or
// CryptMsgOpenToDecode is released on the final CryptMsgClose. // CryptMsgOpenToDecode is released on the final CryptMsgClose.
// Not released if CryptMsgOpenToEncode or CryptMsgOpenToDecode fails. // Not released if CryptMsgOpenToEncode or CryptMsgOpenToDecode fails.
// //
// Also applies to hNCryptKey where applicable.
//
// Note, the envelope recipient hCryptProv's aren't released. // Note, the envelope recipient hCryptProv's aren't released.
#define CMSG_CRYPT_RELEASE_CONTEXT_FLAG 0x00008000 #define CMSG_CRYPT_RELEASE_CONTEXT_FLAG 0x00008000
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Open a cryptographic message for encoding // Open a cryptographic message for encoding
// //
// If CMSG_BARE_CONTENT_FLAG is specified for a streamed message, // If CMSG_BARE_CONTENT_FLAG is specified for a streamed message,
// the streamed output will not have an outer ContentInfo wrapper. This // the streamed output will not have an outer ContentInfo wrapper. This
// makes it suitable to be streamed into an enclosing message. // makes it suitable to be streamed into an enclosing message.
// //
// The pStreamInfo parameter needs to be set to stream the encoded message // The pStreamInfo parameter needs to be set to stream the encoded message
// output. // output.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
HCRYPTMSG HCRYPTMSG
WINAPI WINAPI
CryptMsgOpenToEncode( CryptMsgOpenToEncode(
IN DWORD dwMsgEncodingType, __in DWORD dwMsgEncodingType,
IN DWORD dwFlags, __in DWORD dwFlags,
IN DWORD dwMsgType, __in DWORD dwMsgType,
IN void const *pvMsgEncodeInfo, __in void const *pvMsgEncodeInfo,
IN OPTIONAL LPSTR pszInnerContentObjID, __in_opt LPSTR pszInnerContentObjID,
IN OPTIONAL PCMSG_STREAM_INFO pStreamInfo __in_opt PCMSG_STREAM_INFO pStreamInfo
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Calculate the length of an encoded cryptographic message. // Calculate the length of an encoded cryptographic message.
// //
// Calculates the length of the encoded message given the // Calculates the length of the encoded message given the
// message type, encoding parameters and total length of // message type, encoding parameters and total length of
// the data to be updated. Note, this might not be the exact length. However, // the data to be updated. Note, this might not be the exact length. However,
// it will always be greater than or equal to the actual length. // it will always be greater than or equal to the actual length.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
DWORD DWORD
WINAPI WINAPI
CryptMsgCalculateEncodedLength( CryptMsgCalculateEncodedLength(
IN DWORD dwMsgEncodingType, __in DWORD dwMsgEncodingType,
IN DWORD dwFlags, __in DWORD dwFlags,
IN DWORD dwMsgType, __in DWORD dwMsgType,
IN void const *pvMsgEncodeInfo, __in void const *pvMsgEncodeInfo,
IN OPTIONAL LPSTR pszInnerContentObjID, __in_opt LPSTR pszInnerContentObjID,
IN DWORD cbData __in DWORD cbData
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Open a cryptographic message for decoding // Open a cryptographic message for decoding
// //
// hCryptProv specifies the crypto provider to use for hashing and/or // hCryptProv specifies the crypto provider to use for hashing and/or
// decrypting the message. If hCryptProv is NULL, a default crypt provider // decrypting the message. If hCryptProv is NULL, a default crypt provider
// is used. // is used.
// //
// Currently pRecipientInfo isn't used and should be set to NULL. // Currently pRecipientInfo isn't used and should be set to NULL.
// //
// The pStreamInfo parameter needs to be set to stream the decoded content // The pStreamInfo parameter needs to be set to stream the decoded content
// output. // output.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
HCRYPTMSG HCRYPTMSG
WINAPI WINAPI
CryptMsgOpenToDecode( CryptMsgOpenToDecode(
IN DWORD dwMsgEncodingType, __in DWORD dwMsgEncodingType,
IN DWORD dwFlags, __in DWORD dwFlags,
IN DWORD dwMsgType, __in DWORD dwMsgType,
IN HCRYPTPROV hCryptProv, __in_opt HCRYPTPROV_LEGACY hCryptProv,
IN OPTIONAL PCERT_INFO pRecipientInfo, __reserved PCERT_INFO pRecipientInfo,
IN OPTIONAL PCMSG_STREAM_INFO pStreamInfo __in_opt PCMSG_STREAM_INFO pStreamInfo
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Duplicate a cryptographic message handle // Duplicate a cryptographic message handle
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
HCRYPTMSG HCRYPTMSG
WINAPI WINAPI
CryptMsgDuplicate( CryptMsgDuplicate(
IN HCRYPTMSG hCryptMsg __in_opt HCRYPTMSG hCryptMsg
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Close a cryptographic message handle // Close a cryptographic message handle
// //
// LastError is preserved unless FALSE is returned. // LastError is preserved unless FALSE is returned.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptMsgClose( CryptMsgClose(
IN HCRYPTMSG hCryptMsg __in_opt HCRYPTMSG hCryptMsg
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Update the content of a cryptographic message. Depending on how the // Update the content of a cryptographic message. Depending on how the
// message was opened, the content is either encoded or decoded. // message was opened, the content is either encoded or decoded.
// //
// This function is repetitively called to append to the message content. // This function is repetitively called to append to the message content.
// fFinal is set to identify the last update. On fFinal, the encode/decode // fFinal is set to identify the last update. On fFinal, the encode/decode
// is completed. The encoded/decoded content and the decoded parameters // is completed. The encoded/decoded content and the decoded parameters
// are valid until the open and all duplicated handles are closed. // are valid until the open and all duplicated handles are closed.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptMsgUpdate( CryptMsgUpdate(
IN HCRYPTMSG hCryptMsg, __in HCRYPTMSG hCryptMsg,
IN const BYTE *pbData, __in_bcount_opt(cbData) const BYTE *pbData,
IN DWORD cbData, __in DWORD cbData,
IN BOOL fFinal __in BOOL fFinal
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Get a parameter after encoding/decoding a cryptographic message. Called // Get a parameter after encoding/decoding a cryptographic message. Called
// after the final CryptMsgUpdate. Only the CMSG_CONTENT_PARAM and // after the final CryptMsgUpdate. Only the CMSG_CONTENT_PARAM and
// CMSG_COMPUTED_HASH_PARAM are valid for an encoded message. // CMSG_COMPUTED_HASH_PARAM are valid for an encoded message.
// //
// For an encoded HASHED message, the CMSG_COMPUTED_HASH_PARAM can be got // For an encoded HASHED message, the CMSG_COMPUTED_HASH_PARAM can be got
// before any CryptMsgUpdates to get its length. // before any CryptMsgUpdates to get its length.
// //
skipping to change at line 5548 skipping to change at line 6954
// The OBJID BLOBs returned in the pvData structures point to // The OBJID BLOBs returned in the pvData structures point to
// their still encoded representation. The appropriate functions // their still encoded representation. The appropriate functions
// must be called to decode the information. // must be called to decode the information.
// //
// See below for a list of the parameters to get. // See below for a list of the parameters to get.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptMsgGetParam( CryptMsgGetParam(
IN HCRYPTMSG hCryptMsg, __in HCRYPTMSG hCryptMsg,
IN DWORD dwParamType, __in DWORD dwParamType,
IN DWORD dwIndex, __in DWORD dwIndex,
OUT void *pvData, __out_bcount_part_opt(*pcbData, *pcbData) void *pvData,
IN OUT DWORD *pcbData __inout DWORD *pcbData
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Get parameter types and their corresponding data structure definitions. // Get parameter types and their corresponding data structure definitions.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CMSG_TYPE_PARAM 1 #define CMSG_TYPE_PARAM 1
#define CMSG_CONTENT_PARAM 2 #define CMSG_CONTENT_PARAM 2
#define CMSG_BARE_CONTENT_PARAM 3 #define CMSG_BARE_CONTENT_PARAM 3
#define CMSG_INNER_CONTENT_TYPE_PARAM 4 #define CMSG_INNER_CONTENT_TYPE_PARAM 4
#define CMSG_SIGNER_COUNT_PARAM 5 #define CMSG_SIGNER_COUNT_PARAM 5
skipping to change at line 5684 skipping to change at line 7090
// CERT_RDN_OCTET_STRING and value is the KEYID. When the // CERT_RDN_OCTET_STRING and value is the KEYID. When the
// CertGetSubjectCertificateFromStore and // CertGetSubjectCertificateFromStore and
// CertFindCertificateInStore(CERT_FIND_SUBJECT_CERT) APIs see this // CertFindCertificateInStore(CERT_FIND_SUBJECT_CERT) APIs see this
// special KEYID Issuer and SerialNumber, they do a KEYID match. // special KEYID Issuer and SerialNumber, they do a KEYID match.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_SIGNER_INFO { typedef struct _CMSG_SIGNER_INFO {
DWORD dwVersion; DWORD dwVersion;
CERT_NAME_BLOB Issuer; CERT_NAME_BLOB Issuer;
CRYPT_INTEGER_BLOB SerialNumber; CRYPT_INTEGER_BLOB SerialNumber;
CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm; CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
// This is also referred to as the SignatureAlgorithm
CRYPT_ALGORITHM_IDENTIFIER HashEncryptionAlgorithm; CRYPT_ALGORITHM_IDENTIFIER HashEncryptionAlgorithm;
CRYPT_DATA_BLOB EncryptedHash; CRYPT_DATA_BLOB EncryptedHash;
CRYPT_ATTRIBUTES AuthAttrs; CRYPT_ATTRIBUTES AuthAttrs;
CRYPT_ATTRIBUTES UnauthAttrs; CRYPT_ATTRIBUTES UnauthAttrs;
} CMSG_SIGNER_INFO, *PCMSG_SIGNER_INFO; } CMSG_SIGNER_INFO, *PCMSG_SIGNER_INFO;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CMSG_SIGNER_CERT_ID_PARAM // CMSG_SIGNER_CERT_ID_PARAM
// //
// To get all the signers, repetitively call CryptMsgGetParam, with // To get all the signers, repetitively call CryptMsgGetParam, with
// dwIndex set to 0 .. SignerCount - 1. // dwIndex set to 0 .. SignerCount - 1.
skipping to change at line 5714 skipping to change at line 7123
// //
// To get all the signers, repetitively call CryptMsgGetParam, with // To get all the signers, repetitively call CryptMsgGetParam, with
// dwIndex set to 0 .. SignerCount - 1. // dwIndex set to 0 .. SignerCount - 1.
// //
// pvData points to a CMSG_CMS_SIGNER_INFO struct. // pvData points to a CMSG_CMS_SIGNER_INFO struct.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_CMS_SIGNER_INFO { typedef struct _CMSG_CMS_SIGNER_INFO {
DWORD dwVersion; DWORD dwVersion;
CERT_ID SignerId; CERT_ID SignerId;
CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm; CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
// This is also referred to as the SignatureAlgorithm
CRYPT_ALGORITHM_IDENTIFIER HashEncryptionAlgorithm; CRYPT_ALGORITHM_IDENTIFIER HashEncryptionAlgorithm;
CRYPT_DATA_BLOB EncryptedHash; CRYPT_DATA_BLOB EncryptedHash;
CRYPT_ATTRIBUTES AuthAttrs; CRYPT_ATTRIBUTES AuthAttrs;
CRYPT_ATTRIBUTES UnauthAttrs; CRYPT_ATTRIBUTES UnauthAttrs;
} CMSG_CMS_SIGNER_INFO, *PCMSG_CMS_SIGNER_INFO; } CMSG_CMS_SIGNER_INFO, *PCMSG_CMS_SIGNER_INFO;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CMSG_SIGNER_HASH_ALGORITHM_PARAM // CMSG_SIGNER_HASH_ALGORITHM_PARAM
// //
// This parameter specifies the HashAlgorithm that was used for the signer. // This parameter specifies the HashAlgorithm that was used for the signer.
// //
skipping to change at line 6075 skipping to change at line 7487
// //
// The pvCtrlPara definition depends on the dwCtrlType value. // The pvCtrlPara definition depends on the dwCtrlType value.
// //
// See below for a list of the control operations and their pvCtrlPara // See below for a list of the control operations and their pvCtrlPara
// type definition. // type definition.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptMsgControl( CryptMsgControl(
IN HCRYPTMSG hCryptMsg, __in HCRYPTMSG hCryptMsg,
IN DWORD dwFlags, __in DWORD dwFlags,
IN DWORD dwCtrlType, __in DWORD dwCtrlType,
IN void const *pvCtrlPara __in_opt void const *pvCtrlPara
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Message control types // Message control types
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CMSG_CTRL_VERIFY_SIGNATURE 1 #define CMSG_CTRL_VERIFY_SIGNATURE 1
#define CMSG_CTRL_DECRYPT 2 #define CMSG_CTRL_DECRYPT 2
#define CMSG_CTRL_VERIFY_HASH 5 #define CMSG_CTRL_VERIFY_HASH 5
#define CMSG_CTRL_ADD_SIGNER 6 #define CMSG_CTRL_ADD_SIGNER 6
#define CMSG_CTRL_DEL_SIGNER 7 #define CMSG_CTRL_DEL_SIGNER 7
skipping to change at line 6151 skipping to change at line 7563
// The signer can be a pointer to a CERT_PUBLIC_KEY_INFO, certificate // The signer can be a pointer to a CERT_PUBLIC_KEY_INFO, certificate
// context or a chain context. // context or a chain context.
// //
// If the signer's HashEncryptionAlgorithm is szOID_PKIX_NO_SIGNATURE, then, // If the signer's HashEncryptionAlgorithm is szOID_PKIX_NO_SIGNATURE, then,
// the signature is expected to contain the hash octets. Only dwSignerType // the signature is expected to contain the hash octets. Only dwSignerType
// of CMSG_VERIFY_SIGNER_NULL may be specified to verify this no signature // of CMSG_VERIFY_SIGNER_NULL may be specified to verify this no signature
// case. // case.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA { typedef struct _CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA {
DWORD cbSize; DWORD cbSize;
HCRYPTPROV hCryptProv; HCRYPTPROV_LEGACY hCryptProv;
DWORD dwSignerIndex; DWORD dwSignerIndex;
DWORD dwSignerType; DWORD dwSignerType;
void *pvSigner; void *pvSigner;
} CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA, *PCMSG_CTRL_VERIFY_SIGNATURE_EX_PARA; } CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA, *PCMSG_CTRL_VERIFY_SIGNATURE_EX_PARA;
// Signer Types // Signer Types
#define CMSG_VERIFY_SIGNER_PUBKEY 1 #define CMSG_VERIFY_SIGNER_PUBKEY 1
// pvSigner :: PCERT_PUBLIC_KEY_INFO // pvSigner :: PCERT_PUBLIC_KEY_INFO
#define CMSG_VERIFY_SIGNER_CERT 2 #define CMSG_VERIFY_SIGNER_CERT 2
// pvSigner :: PCCERT_CONTEXT // pvSigner :: PCCERT_CONTEXT
skipping to change at line 6178 skipping to change at line 7590
// CMSG_CTRL_DECRYPT // CMSG_CTRL_DECRYPT
// //
// Decrypt an ENVELOPED or SIGNED_AND_ENVELOPED message after it has been // Decrypt an ENVELOPED or SIGNED_AND_ENVELOPED message after it has been
// decoded. // decoded.
// //
// This decrypt is only applicable to key transport recipients. // This decrypt is only applicable to key transport recipients.
// //
// hCryptProv and dwKeySpec specify the private key to use. For dwKeySpec == // hCryptProv and dwKeySpec specify the private key to use. For dwKeySpec ==
// 0, defaults to AT_KEYEXCHANGE. // 0, defaults to AT_KEYEXCHANGE.
// //
// hNCryptKey can be set to decrypt using a CNG private key.
//
// If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags passed // If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags passed
// to CryptMsgControl, then, the hCryptProv is released on the final // to CryptMsgControl, then, the hCryptProv is released on the final
// CryptMsgClose. Not released if CryptMsgControl fails. // CryptMsgClose. Not released if CryptMsgControl fails. Also applies
// to freeing the hNCryptKey.
// //
// dwRecipientIndex is the index of the recipient in the message associated // dwRecipientIndex is the index of the recipient in the message associated
// with the hCryptProv's private key. // with the hCryptProv's or hNCryptKey's private key.
// //
// The dwRecipientIndex is the index of a key transport recipient. // The dwRecipientIndex is the index of a key transport recipient.
// //
// Note, the message can only be decrypted once. // Note, the message can only be decrypted once.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_CTRL_DECRYPT_PARA { typedef struct _CMSG_CTRL_DECRYPT_PARA {
DWORD cbSize; DWORD cbSize;
HCRYPTPROV hCryptProv;
// NCryptIsKeyHandle() is called to determine the union choice.
union {
HCRYPTPROV hCryptProv;
NCRYPT_KEY_HANDLE hNCryptKey;
};
// not applicable for hNCryptKey choice
DWORD dwKeySpec; DWORD dwKeySpec;
DWORD dwRecipientIndex; DWORD dwRecipientIndex;
} CMSG_CTRL_DECRYPT_PARA, *PCMSG_CTRL_DECRYPT_PARA; } CMSG_CTRL_DECRYPT_PARA, *PCMSG_CTRL_DECRYPT_PARA;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CMSG_CTRL_KEY_TRANS_DECRYPT // CMSG_CTRL_KEY_TRANS_DECRYPT
// //
// Decrypt an ENVELOPED message after it has been decoded for a key // Decrypt an ENVELOPED message after it has been decoded for a key
// transport recipient. // transport recipient.
// //
// hCryptProv and dwKeySpec specify the private key to use. For dwKeySpec == // hCryptProv and dwKeySpec specify the private key to use. For dwKeySpec ==
skipping to change at line 6205 skipping to change at line 7628
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CMSG_CTRL_KEY_TRANS_DECRYPT // CMSG_CTRL_KEY_TRANS_DECRYPT
// //
// Decrypt an ENVELOPED message after it has been decoded for a key // Decrypt an ENVELOPED message after it has been decoded for a key
// transport recipient. // transport recipient.
// //
// hCryptProv and dwKeySpec specify the private key to use. For dwKeySpec == // hCryptProv and dwKeySpec specify the private key to use. For dwKeySpec ==
// 0, defaults to AT_KEYEXCHANGE. // 0, defaults to AT_KEYEXCHANGE.
// //
// hNCryptKey can be set to decrypt using a CNG private key.
//
// If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags passed // If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags passed
// to CryptMsgControl, then, the hCryptProv is released on the final // to CryptMsgControl, then, the hCryptProv is released on the final
// CryptMsgClose. Not released if CryptMsgControl fails. // CryptMsgClose. Not released if CryptMsgControl fails. Also applies
// to freeing the hNCryptKey.
// //
// pKeyTrans points to the CMSG_KEY_TRANS_RECIPIENT_INFO obtained via // pKeyTrans points to the CMSG_KEY_TRANS_RECIPIENT_INFO obtained via
// CryptMsgGetParam(CMSG_CMS_RECIPIENT_INFO_PARAM) // CryptMsgGetParam(CMSG_CMS_RECIPIENT_INFO_PARAM)
// //
// dwRecipientIndex is the index of the recipient in the message associated // dwRecipientIndex is the index of the recipient in the message associated
// with the hCryptProv's private key. // with the hCryptProv's or hNCryptKey's private key.
// //
// Note, the message can only be decrypted once. // Note, the message can only be decrypted once.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_CTRL_KEY_TRANS_DECRYPT_PARA { typedef struct _CMSG_CTRL_KEY_TRANS_DECRYPT_PARA {
DWORD cbSize; DWORD cbSize;
HCRYPTPROV hCryptProv; // NCryptIsKeyHandle() is called to determine the union choice.
union {
HCRYPTPROV hCryptProv;
NCRYPT_KEY_HANDLE hNCryptKey;
};
// not applicable for hNCryptKey choice
DWORD dwKeySpec; DWORD dwKeySpec;
PCMSG_KEY_TRANS_RECIPIENT_INFO pKeyTrans; PCMSG_KEY_TRANS_RECIPIENT_INFO pKeyTrans;
DWORD dwRecipientIndex; DWORD dwRecipientIndex;
} CMSG_CTRL_KEY_TRANS_DECRYPT_PARA, *PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA; } CMSG_CTRL_KEY_TRANS_DECRYPT_PARA, *PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CMSG_CTRL_KEY_AGREE_DECRYPT // CMSG_CTRL_KEY_AGREE_DECRYPT
// //
// Decrypt an ENVELOPED message after it has been decoded for a key // Decrypt an ENVELOPED message after it has been decoded for a key
// agreement recipient. // agreement recipient.
// //
skipping to change at line 6234 skipping to change at line 7667
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CMSG_CTRL_KEY_AGREE_DECRYPT // CMSG_CTRL_KEY_AGREE_DECRYPT
// //
// Decrypt an ENVELOPED message after it has been decoded for a key // Decrypt an ENVELOPED message after it has been decoded for a key
// agreement recipient. // agreement recipient.
// //
// hCryptProv and dwKeySpec specify the private key to use. For dwKeySpec == // hCryptProv and dwKeySpec specify the private key to use. For dwKeySpec ==
// 0, defaults to AT_KEYEXCHANGE. // 0, defaults to AT_KEYEXCHANGE.
// //
// hNCryptKey can be set to decrypt using a CNG private key.
//
// If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags passed // If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags passed
// to CryptMsgControl, then, the hCryptProv is released on the final // to CryptMsgControl, then, the hCryptProv is released on the final
// CryptMsgClose. Not released if CryptMsgControl fails. // CryptMsgClose. Not released if CryptMsgControl fails. Also applies
// to freeing the hNCryptKey.
// //
// pKeyAgree points to the CMSG_KEY_AGREE_RECIPIENT_INFO obtained via // pKeyAgree points to the CMSG_KEY_AGREE_RECIPIENT_INFO obtained via
// CryptMsgGetParam(CMSG_CMS_RECIPIENT_INFO_PARAM) for dwRecipientIndex. // CryptMsgGetParam(CMSG_CMS_RECIPIENT_INFO_PARAM) for dwRecipientIndex.
// //
// dwRecipientIndex, dwRecipientEncryptedKeyIndex are the indices of the // dwRecipientIndex, dwRecipientEncryptedKeyIndex are the indices of the
// recipient's encrypted key in the message associated with the hCryptProv's // recipient's encrypted key in the message associated with the hCryptProv's
// private key. // or hNCryptKey's private key.
// //
// OriginatorPublicKey is the originator's public key obtained from either // OriginatorPublicKey is the originator's public key obtained from either
// the originator's certificate or the CMSG_KEY_AGREE_RECIPIENT_INFO obtained // the originator's certificate or the CMSG_KEY_AGREE_RECIPIENT_INFO obtained
// via the CMSG_CMS_RECIPIENT_INFO_PARAM. // via the CMSG_CMS_RECIPIENT_INFO_PARAM.
// //
// Note, the message can only be decrypted once. // Note, the message can only be decrypted once.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_CTRL_KEY_AGREE_DECRYPT_PARA { typedef struct _CMSG_CTRL_KEY_AGREE_DECRYPT_PARA {
DWORD cbSize; DWORD cbSize;
HCRYPTPROV hCryptProv;
// NCryptIsKeyHandle() is called to determine the union choice.
union {
HCRYPTPROV hCryptProv;
NCRYPT_KEY_HANDLE hNCryptKey;
};
// not applicable for hNCryptKey choice
DWORD dwKeySpec; DWORD dwKeySpec;
PCMSG_KEY_AGREE_RECIPIENT_INFO pKeyAgree; PCMSG_KEY_AGREE_RECIPIENT_INFO pKeyAgree;
DWORD dwRecipientIndex; DWORD dwRecipientIndex;
DWORD dwRecipientEncryptedKeyIndex; DWORD dwRecipientEncryptedKeyIndex;
CRYPT_BIT_BLOB OriginatorPublicKey; CRYPT_BIT_BLOB OriginatorPublicKey;
} CMSG_CTRL_KEY_AGREE_DECRYPT_PARA, *PCMSG_CTRL_KEY_AGREE_DECRYPT_PARA; } CMSG_CTRL_KEY_AGREE_DECRYPT_PARA, *PCMSG_CTRL_KEY_AGREE_DECRYPT_PARA;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CMSG_CTRL_MAIL_LIST_DECRYPT // CMSG_CTRL_MAIL_LIST_DECRYPT
// //
// Decrypt an ENVELOPED message after it has been decoded for a mail // Decrypt an ENVELOPED message after it has been decoded for a mail
skipping to change at line 6283 skipping to change at line 7727
// //
// If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags passed // If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags passed
// to CryptMsgControl, then, the hCryptProv is released on the final // to CryptMsgControl, then, the hCryptProv is released on the final
// CryptMsgClose. Not released if CryptMsgControl fails. // CryptMsgClose. Not released if CryptMsgControl fails.
// //
// For RC2 wrap, the effective key length is obtained from the // For RC2 wrap, the effective key length is obtained from the
// KeyEncryptionAlgorithm parameters and set on the hKeyEncryptionKey before // KeyEncryptionAlgorithm parameters and set on the hKeyEncryptionKey before
// decrypting. // decrypting.
// //
// Note, the message can only be decrypted once. // Note, the message can only be decrypted once.
//
// Mail list recipients aren't supported using CNG.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_CTRL_MAIL_LIST_DECRYPT_PARA { typedef struct _CMSG_CTRL_MAIL_LIST_DECRYPT_PARA {
DWORD cbSize; DWORD cbSize;
HCRYPTPROV hCryptProv; HCRYPTPROV hCryptProv;
PCMSG_MAIL_LIST_RECIPIENT_INFO pMailList; PCMSG_MAIL_LIST_RECIPIENT_INFO pMailList;
DWORD dwRecipientIndex; DWORD dwRecipientIndex;
DWORD dwKeyChoice; DWORD dwKeyChoice;
union { union {
// CMSG_MAIL_LIST_HANDLE_KEY_CHOICE // CMSG_MAIL_LIST_HANDLE_KEY_CHOICE
HCRYPTKEY hKeyEncryptionKey; HCRYPTKEY hKeyEncryptionKey;
skipping to change at line 6433 skipping to change at line 7879
// ie. verify that pbSignerInfoCountersignature contains the encrypted // ie. verify that pbSignerInfoCountersignature contains the encrypted
// hash of the encryptedDigest field of pbSignerInfo. // hash of the encryptedDigest field of pbSignerInfo.
// //
// hCryptProv is used to hash the encryptedDigest field of pbSignerInfo. // hCryptProv is used to hash the encryptedDigest field of pbSignerInfo.
// The only fields referenced from pciCountersigner are SerialNumber, Issuer, // The only fields referenced from pciCountersigner are SerialNumber, Issuer,
// and SubjectPublicKeyInfo. // and SubjectPublicKeyInfo.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
BOOL BOOL
WINAPI WINAPI
CryptMsgVerifyCountersignatureEncoded( CryptMsgVerifyCountersignatureEncoded(
IN HCRYPTPROV hCryptProv, __in_opt HCRYPTPROV_LEGACY hCryptProv,
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN PBYTE pbSignerInfo, __in_bcount(cbSignerInfo) PBYTE pbSignerInfo,
IN DWORD cbSignerInfo, __in DWORD cbSignerInfo,
IN PBYTE pbSignerInfoCountersignature, __in_bcount(cbSignerInfoCountersignature) PBYTE pbSignerInfoCountersignature
IN DWORD cbSignerInfoCountersignature, ,
IN PCERT_INFO pciCountersigner __in DWORD cbSignerInfoCountersignature,
__in PCERT_INFO pciCountersigner
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Verify a countersignature, at the SignerInfo level. // Verify a countersignature, at the SignerInfo level.
// ie. verify that pbSignerInfoCountersignature contains the encrypted // ie. verify that pbSignerInfoCountersignature contains the encrypted
// hash of the encryptedDigest field of pbSignerInfo. // hash of the encryptedDigest field of pbSignerInfo.
// //
// hCryptProv is used to hash the encryptedDigest field of pbSignerInfo. // hCryptProv is used to hash the encryptedDigest field of pbSignerInfo.
// //
// The signer can be a CERT_PUBLIC_KEY_INFO, certificate context or a // The signer can be a CERT_PUBLIC_KEY_INFO, certificate context or a
// chain context. // chain context.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
BOOL BOOL
WINAPI WINAPI
CryptMsgVerifyCountersignatureEncodedEx( CryptMsgVerifyCountersignatureEncodedEx(
IN HCRYPTPROV hCryptProv, __in_opt HCRYPTPROV_LEGACY hCryptProv,
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN PBYTE pbSignerInfo, __in_bcount(cbSignerInfo) PBYTE pbSignerInfo,
IN DWORD cbSignerInfo, __in DWORD cbSignerInfo,
IN PBYTE pbSignerInfoCountersignature, __in_bcount(cbSignerInfoCountersignature) PBYTE pbSignerInfoCountersignature
IN DWORD cbSignerInfoCountersignature, ,
IN DWORD dwSignerType, __in DWORD cbSignerInfoCountersignature,
IN void *pvSigner, __in DWORD dwSignerType,
IN DWORD dwFlags, __in void *pvSigner,
IN OPTIONAL void *pvReserved __reserved DWORD dwFlags,
__reserved void *pvReserved
); );
// See CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA for dwSignerType definitions // See CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA for dwSignerType definitions
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Countersign an already-existing signature in a message // Countersign an already-existing signature in a message
// //
// dwIndex is a zero-based index of the SignerInfo to be countersigned. // dwIndex is a zero-based index of the SignerInfo to be countersigned.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
BOOL BOOL
WINAPI WINAPI
CryptMsgCountersign( CryptMsgCountersign(
IN OUT HCRYPTMSG hCryptMsg, __in HCRYPTMSG hCryptMsg,
IN DWORD dwIndex, __in DWORD dwIndex,
IN DWORD cCountersigners, __in DWORD cCountersigners,
IN PCMSG_SIGNER_ENCODE_INFO rgCountersigners __in_ecount(cCountersigners) PCMSG_SIGNER_ENCODE_INFO rgCountersigners
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Countersign an already-existing signature (encoded SignerInfo). // Countersign an already-existing signature (encoded SignerInfo).
// Output an encoded SignerInfo blob, suitable for use as a countersignature // Output an encoded SignerInfo blob, suitable for use as a countersignature
// attribute in the unauthenticated attributes of a signed-data or // attribute in the unauthenticated attributes of a signed-data or
// signed-and-enveloped-data message. // signed-and-enveloped-data message.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
BOOL BOOL
WINAPI WINAPI
CryptMsgCountersignEncoded( CryptMsgCountersignEncoded(
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN PBYTE pbSignerInfo, __in_bcount(cbSignerInfo) PBYTE pbSignerInfo,
IN DWORD cbSignerInfo, __in DWORD cbSignerInfo,
IN DWORD cCountersigners, __in DWORD cCountersigners,
IN PCMSG_SIGNER_ENCODE_INFO rgCountersigners, __in_ecount(cCountersigners) PCMSG_SIGNER_ENCODE_INFO rgCountersigners,
OUT PBYTE pbCountersignature, __out_bcount_part_opt(*pcbCountersignature, *pcbCountersignature) PBYTE pbCo
IN OUT PDWORD pcbCountersignature untersignature,
__inout PDWORD pcbCountersignature
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CryptMsg OID installable functions // CryptMsg OID installable functions
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef void * (WINAPI *PFN_CMSG_ALLOC) ( typedef void * (WINAPI *PFN_CMSG_ALLOC) (
IN size_t cb __in size_t cb
); );
typedef void (WINAPI *PFN_CMSG_FREE)( typedef void (WINAPI *PFN_CMSG_FREE)(
IN void *pv __inout void *pv
); );
// Note, the following 3 installable functions are obsolete and have been // Note, the following 3 installable functions are obsolete and have been
// replaced with GenContentEncryptKey, ExportKeyTrans, ExportKeyAgree, // replaced with GenContentEncryptKey, ExportKeyTrans, ExportKeyAgree,
// ExportMailList, ImportKeyTrans, ImportKeyAgree and ImportMailList // ExportMailList, ImportKeyTrans, ImportKeyAgree and ImportMailList
// installable functions. // installable functions.
// If *phCryptProv is NULL upon entry, then, if supported, the installable // If *phCryptProv is NULL upon entry, then, if supported, the installable
// function should acquire a default provider and return. Note, its up // function should acquire a default provider and return. Note, its up
// to the installable function to release at process detach. // to the installable function to release at process detach.
// //
// If paiEncrypt->Parameters.cbData is 0, then, the callback may optionally // If paiEncrypt->Parameters.cbData is 0, then, the callback may optionally
// return default encoded parameters in *ppbEncryptParameters and // return default encoded parameters in *ppbEncryptParameters and
// *pcbEncryptParameters. pfnAlloc must be called for the allocation. // *pcbEncryptParameters. pfnAlloc must be called for the allocation.
#define CMSG_OID_GEN_ENCRYPT_KEY_FUNC "CryptMsgDllGenEncryptKey" #define CMSG_OID_GEN_ENCRYPT_KEY_FUNC "CryptMsgDllGenEncryptKey"
typedef BOOL (WINAPI *PFN_CMSG_GEN_ENCRYPT_KEY) ( typedef __success(return == TRUE) BOOL (WINAPI *PFN_CMSG_GEN_ENCRYPT_KEY) (
IN OUT HCRYPTPROV *phCryptProv, __inout HCRYPTPROV *phCryptProv,
IN PCRYPT_ALGORITHM_IDENTIFIER paiEncrypt, __in PCRYPT_ALGORITHM_IDENTIFIER paiEncrypt,
IN PVOID pvEncryptAuxInfo, __in_opt PVOID pvEncryptAuxInfo,
IN PCERT_PUBLIC_KEY_INFO pPublicKeyInfo, __in PCERT_PUBLIC_KEY_INFO pPublicKeyInfo,
IN PFN_CMSG_ALLOC pfnAlloc, __callback PFN_CMSG_ALLOC pfnAlloc,
OUT HCRYPTKEY *phEncryptKey, __out HCRYPTKEY *phEncryptKey,
OUT PBYTE *ppbEncryptParameters, __deref_out_bcount(*pcbEncryptParameters) PBYTE *ppbEncryptParameters,
OUT PDWORD pcbEncryptParameters __out PDWORD pcbEncryptParameters
); );
#define CMSG_OID_EXPORT_ENCRYPT_KEY_FUNC "CryptMsgDllExportEncryptKey" #define CMSG_OID_EXPORT_ENCRYPT_KEY_FUNC "CryptMsgDllExportEncryptKey"
typedef BOOL (WINAPI *PFN_CMSG_EXPORT_ENCRYPT_KEY) ( typedef BOOL (WINAPI *PFN_CMSG_EXPORT_ENCRYPT_KEY) (
IN HCRYPTPROV hCryptProv, __in HCRYPTPROV hCryptProv,
IN HCRYPTKEY hEncryptKey, __in HCRYPTKEY hEncryptKey,
IN PCERT_PUBLIC_KEY_INFO pPublicKeyInfo, __in PCERT_PUBLIC_KEY_INFO pPublicKeyInfo,
OUT PBYTE pbData, __out_bcount_part_opt(*pcbData, *pcbData) PBYTE pbData,
IN OUT PDWORD pcbData __inout PDWORD pcbData
); );
#define CMSG_OID_IMPORT_ENCRYPT_KEY_FUNC "CryptMsgDllImportEncryptKey" #define CMSG_OID_IMPORT_ENCRYPT_KEY_FUNC "CryptMsgDllImportEncryptKey"
typedef BOOL (WINAPI *PFN_CMSG_IMPORT_ENCRYPT_KEY) ( typedef BOOL (WINAPI *PFN_CMSG_IMPORT_ENCRYPT_KEY) (
IN HCRYPTPROV hCryptProv, __in HCRYPTPROV hCryptProv,
IN DWORD dwKeySpec, __in DWORD dwKeySpec,
IN PCRYPT_ALGORITHM_IDENTIFIER paiEncrypt, __in PCRYPT_ALGORITHM_IDENTIFIER paiEncrypt,
IN PCRYPT_ALGORITHM_IDENTIFIER paiPubKey, __in PCRYPT_ALGORITHM_IDENTIFIER paiPubKey,
IN PBYTE pbEncodedKey, __in_bcount(cbEncodedKey) PBYTE pbEncodedKey,
IN DWORD cbEncodedKey, __in DWORD cbEncodedKey,
OUT HCRYPTKEY *phEncryptKey __out HCRYPTKEY *phEncryptKey
); );
// To get the default installable function for GenContentEncryptKey, // To get the default installable function for GenContentEncryptKey,
// ExportKeyTrans, ExportKeyAgree, ExportMailList, ImportKeyTrans, // ExportKeyTrans, ExportKeyAgree, ExportMailList, ImportKeyTrans,
// ImportKeyAgree or ImportMailList call CryptGetOIDFunctionAddress() // ImportKeyAgree or ImportMailList call CryptGetOIDFunctionAddress()
// with the pszOID argument set to the following constant. dwEncodingType // with the pszOID argument set to the following constant. dwEncodingType
// should be set to CRYPT_ASN_ENCODING or X509_ASN_ENCODING. // should be set to CRYPT_ASN_ENCODING or X509_ASN_ENCODING.
#define CMSG_DEFAULT_INSTALLABLE_FUNC_OID ((LPCSTR) 1) #define CMSG_DEFAULT_INSTALLABLE_FUNC_OID ((LPCSTR) 1)
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Content Encrypt Info // Content Encrypt Info
// //
// The following data structure contains the information shared between // The following data structure contains the information shared between
// the GenContentEncryptKey and the ExportKeyTrans, ExportKeyAgree and // the GenContentEncryptKey and the ExportKeyTrans, ExportKeyAgree and
// ExportMailList installable functions. // ExportMailList installable functions.
//
// For a ContentEncryptionAlgorithm.pszObjId having a "Special" algid, only
// supported via CNG, for example, AES, then, fCNG will be set.
// fCNG will also be set to TRUE for any ECC agreement or OAEP RSA transport
// recipients.
//
// When, fCNG is TRUE, the hCNGContentEncryptKey choice is selected and
// pbCNGContentEncryptKeyObject and pbContentEncryptKey will be pfnAlloc'ed.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_CONTENT_ENCRYPT_INFO { typedef struct _CMSG_CONTENT_ENCRYPT_INFO {
DWORD cbSize; DWORD cbSize;
HCRYPTPROV hCryptProv; HCRYPTPROV_LEGACY hCryptProv;
CRYPT_ALGORITHM_IDENTIFIER ContentEncryptionAlgorithm; CRYPT_ALGORITHM_IDENTIFIER ContentEncryptionAlgorithm;
void *pvEncryptionAuxInfo; void *pvEncryptionAuxInfo;
DWORD cRecipients; DWORD cRecipients;
PCMSG_RECIPIENT_ENCODE_INFO rgCmsRecipients; PCMSG_RECIPIENT_ENCODE_INFO rgCmsRecipients;
PFN_CMSG_ALLOC pfnAlloc; PFN_CMSG_ALLOC pfnAlloc;
PFN_CMSG_FREE pfnFree; PFN_CMSG_FREE pfnFree;
DWORD dwEncryptFlags; DWORD dwEncryptFlags;
HCRYPTKEY hContentEncryptKey; union {
// fCNG == FALSE
HCRYPTKEY hContentEncryptKey;
// fCNG == TRUE
BCRYPT_KEY_HANDLE hCNGContentEncryptKey;
};
DWORD dwFlags; DWORD dwFlags;
BOOL fCNG;
// When fCNG == TRUE, pfnAlloc'ed
BYTE *pbCNGContentEncryptKeyObject;
BYTE *pbContentEncryptKey;
DWORD cbContentEncryptKey;
} CMSG_CONTENT_ENCRYPT_INFO, *PCMSG_CONTENT_ENCRYPT_INFO; } CMSG_CONTENT_ENCRYPT_INFO, *PCMSG_CONTENT_ENCRYPT_INFO;
#define CMSG_CONTENT_ENCRYPT_PAD_ENCODED_LEN_FLAG 0x00000001 #define CMSG_CONTENT_ENCRYPT_PAD_ENCODED_LEN_FLAG 0x00000001
#define CMSG_CONTENT_ENCRYPT_FREE_PARA_FLAG 0x00000001 #define CMSG_CONTENT_ENCRYPT_FREE_PARA_FLAG 0x00000001
#define CMSG_CONTENT_ENCRYPT_FREE_OBJID_FLAG 0x00000002
#define CMSG_CONTENT_ENCRYPT_RELEASE_CONTEXT_FLAG 0x00008000 #define CMSG_CONTENT_ENCRYPT_RELEASE_CONTEXT_FLAG 0x00008000
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Upon input, ContentEncryptInfo has been initialized from the // Upon input, ContentEncryptInfo has been initialized from the
// EnvelopedEncodeInfo. // EnvelopedEncodeInfo.
// //
// Note, if rgpRecipients instead of rgCmsRecipients are set in the // Note, if rgpRecipients instead of rgCmsRecipients are set in the
// EnvelopedEncodeInfo, then, the rgpRecipients have been converted // EnvelopedEncodeInfo, then, the rgpRecipients have been converted
// to rgCmsRecipients in the ContentEncryptInfo. // to rgCmsRecipients in the ContentEncryptInfo.
// //
// The following fields may be changed in ContentEncryptInfo: // For fCNG == FALSE, the following fields may be changed in ContentEncryptInfo:
// hContentEncryptKey // hContentEncryptKey
// hCryptProv // hCryptProv
// ContentEncryptionAlgorithm.pszObjId
// ContentEncryptionAlgorithm.Parameters
// dwFlags
//
// For fCNG == TRUE, the following fields may be changed in ContentEncryptInfo:
// hCNGContentEncryptKey
// pbCNGContentEncryptKeyObject
// pbContentEncryptKey
// cbContentEncryptKey
// ContentEncryptionAlgorithm.pszObjId
// ContentEncryptionAlgorithm.Parameters // ContentEncryptionAlgorithm.Parameters
// dwFlags // dwFlags
// //
// All other fields in the ContentEncryptInfo are READONLY. // All other fields in the ContentEncryptInfo are READONLY.
// //
// If CMSG_CONTENT_ENCRYPT_PAD_ENCODED_LEN_FLAG is set upon entry // If CMSG_CONTENT_ENCRYPT_PAD_ENCODED_LEN_FLAG is set upon entry
// in dwEncryptFlags, then, any potentially variable length encoded // in dwEncryptFlags, then, any potentially variable length encoded
// output should be padded with zeroes to always obtain the // output should be padded with zeroes to always obtain the
// same maximum encoded length. This is necessary for // same maximum encoded length. This is necessary for
// CryptMsgCalculateEncodedLength() or CryptMsgOpenToEncode() with // CryptMsgCalculateEncodedLength() or CryptMsgOpenToEncode() with
// definite length streaming. // definite length streaming.
// //
// The hContentEncryptKey must be updated. // For fCNG == FALSE:
// The hContentEncryptKey must be updated.
// //
// If hCryptProv is NULL upon input, then, it must be updated. // If hCryptProv is NULL upon input, then, it must be updated.
// If a HCRYPTPROV is acquired that must be released, then, the // If a HCRYPTPROV is acquired that must be released, then, the
// CMSG_CONTENT_ENCRYPT_RELEASE_CONTEXT_FLAG must be set in dwFlags. // CMSG_CONTENT_ENCRYPT_RELEASE_CONTEXT_FLAG must be set in dwFlags.
// Otherwise, for fCNG == TRUE:
// The hCNGContentEncryptKey and cbContentEncryptKey must be updated and
// pbCNGContentEncryptKeyObject and pbContentEncryptKey pfnAlloc'ed.
// This key will be freed and destroyed when hCryptMsg is closed.
// //
// If ContentEncryptionAlgorithm.pszObjId is changed, then, the
// CMSG_CONTENT_ENCRYPT_FREE_OBJID_FLAG must be set in dwFlags.
// If ContentEncryptionAlgorithm.Parameters is updated, then, the // If ContentEncryptionAlgorithm.Parameters is updated, then, the
// CMSG_CONTENT_ENCRYPT_FREE_PARA_FLAG must be set in dwFlags. pfnAlloc and // CMSG_CONTENT_ENCRYPT_FREE_PARA_FLAG must be set in dwFlags. pfnAlloc and
// pfnFree must be used for doing the allocation. // pfnFree must be used for doing the allocation.
// //
// ContentEncryptionAlgorithm.pszObjId is used to get the OIDFunctionAddress. // ContentEncryptionAlgorithm.pszObjId is used to get the OIDFunctionAddress.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// The following CAPI1 installable function is called when fCNG == FALSE.
#define CMSG_OID_GEN_CONTENT_ENCRYPT_KEY_FUNC "CryptMsgDllGenContentEncryptKey" #define CMSG_OID_GEN_CONTENT_ENCRYPT_KEY_FUNC "CryptMsgDllGenContentEncryptKey"
#define CMSG_OID_CAPI1_GEN_CONTENT_ENCRYPT_KEY_FUNC CMSG_OID_GEN_CONTENT_ENCRYPT
_KEY_FUNC
typedef BOOL (WINAPI *PFN_CMSG_GEN_CONTENT_ENCRYPT_KEY) ( typedef BOOL (WINAPI *PFN_CMSG_GEN_CONTENT_ENCRYPT_KEY) (
IN OUT PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo, __inout PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL void *pvReserved __reserved void *pvReserved
); );
// The following installable function is called when fCNG == TRUE. It has the
// same API signature as for the above
// CMSG_OID_CAPI1_GEN_CONTENT_ENCRYPT_KEY_FUNC.
#define CMSG_OID_CNG_GEN_CONTENT_ENCRYPT_KEY_FUNC "CryptMsgDllCNGGenContentEncr
yptKey"
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Key Transport Encrypt Info // Key Transport Encrypt Info
// //
// The following data structure contains the information updated by the // The following data structure contains the information updated by the
// ExportKeyTrans installable function. // ExportKeyTrans installable function.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_KEY_TRANS_ENCRYPT_INFO { typedef struct _CMSG_KEY_TRANS_ENCRYPT_INFO {
DWORD cbSize; DWORD cbSize;
DWORD dwRecipientIndex; DWORD dwRecipientIndex;
CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm; CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm;
CRYPT_DATA_BLOB EncryptedKey; CRYPT_DATA_BLOB EncryptedKey;
DWORD dwFlags; DWORD dwFlags;
} CMSG_KEY_TRANS_ENCRYPT_INFO, *PCMSG_KEY_TRANS_ENCRYPT_INFO; } CMSG_KEY_TRANS_ENCRYPT_INFO, *PCMSG_KEY_TRANS_ENCRYPT_INFO;
#define CMSG_KEY_TRANS_ENCRYPT_FREE_PARA_FLAG 0x00000001 #define CMSG_KEY_TRANS_ENCRYPT_FREE_PARA_FLAG 0x00000001
#define CMSG_KEY_TRANS_ENCRYPT_FREE_OBJID_FLAG 0x00000002
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Upon input, KeyTransEncryptInfo has been initialized from the // Upon input, KeyTransEncryptInfo has been initialized from the
// KeyTransEncodeInfo. // KeyTransEncodeInfo.
// //
// The following fields may be changed in KeyTransEncryptInfo: // The following fields may be changed in KeyTransEncryptInfo:
// EncryptedKey // EncryptedKey
// KeyEncryptionAlgorithm.pszObjId
// KeyEncryptionAlgorithm.Parameters // KeyEncryptionAlgorithm.Parameters
// dwFlags // dwFlags
// //
// All other fields in the KeyTransEncryptInfo are READONLY. // All other fields in the KeyTransEncryptInfo are READONLY.
// //
// The EncryptedKey must be updated. The pfnAlloc and pfnFree specified in // The EncryptedKey must be updated. The pfnAlloc and pfnFree specified in
// ContentEncryptInfo must be used for doing the allocation. // ContentEncryptInfo must be used for doing the allocation.
// //
// If the KeyEncryptionAlgorithm.pszObjId is changed, then, the
// CMSG_KEY_TRANS_ENCRYPT_FREE_OBJID_FLAG must be set in dwFlags.
// If the KeyEncryptionAlgorithm.Parameters is updated, then, the // If the KeyEncryptionAlgorithm.Parameters is updated, then, the
// CMSG_KEY_TRANS_ENCRYPT_FREE_PARA_FLAG must be set in dwFlags. // CMSG_KEY_TRANS_ENCRYPT_FREE_PARA_FLAG must be set in dwFlags.
// The pfnAlloc and pfnFree specified in ContentEncryptInfo must be used // The pfnAlloc and pfnFree specified in ContentEncryptInfo must be used
// for doing the allocation. // for doing the allocation.
// //
// KeyEncryptionAlgorithm.pszObjId is used to get the OIDFunctionAddress. // KeyEncryptionAlgorithm.pszObjId is used to get the OIDFunctionAddress.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// The following CAPI1 installable function is called when
// pContentEncryptInfo->fCNG == FALSE.
#define CMSG_OID_EXPORT_KEY_TRANS_FUNC "CryptMsgDllExportKeyTrans" #define CMSG_OID_EXPORT_KEY_TRANS_FUNC "CryptMsgDllExportKeyTrans"
#define CMSG_OID_CAPI1_EXPORT_KEY_TRANS_FUNC CMSG_OID_EXPORT_KEY_TRANS_FUNC
typedef BOOL (WINAPI *PFN_CMSG_EXPORT_KEY_TRANS) ( typedef BOOL (WINAPI *PFN_CMSG_EXPORT_KEY_TRANS) (
IN PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo, __in PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
IN PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO pKeyTransEncodeInfo, __in PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO pKeyTransEncodeInfo,
IN OUT PCMSG_KEY_TRANS_ENCRYPT_INFO pKeyTransEncryptInfo, __inout PCMSG_KEY_TRANS_ENCRYPT_INFO pKeyTransEncryptInfo,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL void *pvReserved __reserved void *pvReserved
); );
// The following CNG installable function is called when
// pContentEncryptInfo->fCNG == TRUE. It has the same API signature as for
// the above CMSG_OID_CAPI1_EXPORT_KEY_TRANS_FUNC.
#define CMSG_OID_CNG_EXPORT_KEY_TRANS_FUNC "CryptMsgDllCNGExportKeyTrans"
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Key Agree Key Encrypt Info // Key Agree Key Encrypt Info
// //
// The following data structure contains the information updated by the // The following data structure contains the information updated by the
// ExportKeyAgree installable function for each encrypted key agree // ExportKeyAgree installable function for each encrypted key agree
// recipient. // recipient.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_KEY_AGREE_KEY_ENCRYPT_INFO { typedef struct _CMSG_KEY_AGREE_KEY_ENCRYPT_INFO {
DWORD cbSize; DWORD cbSize;
CRYPT_DATA_BLOB EncryptedKey; CRYPT_DATA_BLOB EncryptedKey;
skipping to change at line 6718 skipping to change at line 8223
DWORD cKeyAgreeKeyEncryptInfo; DWORD cKeyAgreeKeyEncryptInfo;
PCMSG_KEY_AGREE_KEY_ENCRYPT_INFO *rgpKeyAgreeKeyEncryptInfo; PCMSG_KEY_AGREE_KEY_ENCRYPT_INFO *rgpKeyAgreeKeyEncryptInfo;
DWORD dwFlags; DWORD dwFlags;
} CMSG_KEY_AGREE_ENCRYPT_INFO, *PCMSG_KEY_AGREE_ENCRYPT_INFO; } CMSG_KEY_AGREE_ENCRYPT_INFO, *PCMSG_KEY_AGREE_ENCRYPT_INFO;
#define CMSG_KEY_AGREE_ENCRYPT_FREE_PARA_FLAG 0x00000001 #define CMSG_KEY_AGREE_ENCRYPT_FREE_PARA_FLAG 0x00000001
#define CMSG_KEY_AGREE_ENCRYPT_FREE_MATERIAL_FLAG 0x00000002 #define CMSG_KEY_AGREE_ENCRYPT_FREE_MATERIAL_FLAG 0x00000002
#define CMSG_KEY_AGREE_ENCRYPT_FREE_PUBKEY_ALG_FLAG 0x00000004 #define CMSG_KEY_AGREE_ENCRYPT_FREE_PUBKEY_ALG_FLAG 0x00000004
#define CMSG_KEY_AGREE_ENCRYPT_FREE_PUBKEY_PARA_FLAG 0x00000008 #define CMSG_KEY_AGREE_ENCRYPT_FREE_PUBKEY_PARA_FLAG 0x00000008
#define CMSG_KEY_AGREE_ENCRYPT_FREE_PUBKEY_BITS_FLAG 0x00000010 #define CMSG_KEY_AGREE_ENCRYPT_FREE_PUBKEY_BITS_FLAG 0x00000010
#define CMSG_KEY_AGREE_ENCRYPT_FREE_OBJID_FLAG 0x00000020
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Upon input, KeyAgreeEncryptInfo has been initialized from the // Upon input, KeyAgreeEncryptInfo has been initialized from the
// KeyAgreeEncodeInfo. // KeyAgreeEncodeInfo.
// //
// The following fields may be changed in KeyAgreeEncryptInfo: // The following fields may be changed in KeyAgreeEncryptInfo:
// KeyEncryptionAlgorithm.pszObjId
// KeyEncryptionAlgorithm.Parameters // KeyEncryptionAlgorithm.Parameters
// UserKeyingMaterial // UserKeyingMaterial
// dwOriginatorChoice // dwOriginatorChoice
// OriginatorCertId // OriginatorCertId
// OriginatorPublicKeyInfo // OriginatorPublicKeyInfo
// dwFlags // dwFlags
// //
// All other fields in the KeyAgreeEncryptInfo are READONLY. // All other fields in the KeyAgreeEncryptInfo are READONLY.
// //
// If the KeyEncryptionAlgorithm.pszObjId is changed, then, the
// CMSG_KEY_AGREE_ENCRYPT_FREE_OBJID_FLAG must be set in dwFlags.
// If the KeyEncryptionAlgorithm.Parameters is updated, then, the // If the KeyEncryptionAlgorithm.Parameters is updated, then, the
// CMSG_KEY_AGREE_ENCRYPT_FREE_PARA_FLAG must be set in dwFlags. // CMSG_KEY_AGREE_ENCRYPT_FREE_PARA_FLAG must be set in dwFlags.
// The pfnAlloc and pfnFree specified in ContentEncryptInfo must be used // The pfnAlloc and pfnFree specified in ContentEncryptInfo must be used
// for doing the allocation. // for doing the allocation.
// //
// If the UserKeyingMaterial is updated, then, the // If the UserKeyingMaterial is updated, then, the
// CMSG_KEY_AGREE_ENCRYPT_FREE_MATERIAL_FLAG must be set in dwFlags. // CMSG_KEY_AGREE_ENCRYPT_FREE_MATERIAL_FLAG must be set in dwFlags.
// pfnAlloc and pfnFree must be used for doing the allocation. // pfnAlloc and pfnFree must be used for doing the allocation.
// //
// The dwOriginatorChoice must be updated to either // The dwOriginatorChoice must be updated to either
skipping to change at line 6762 skipping to change at line 8271
// same maximum encoded length. Note, the length of the generated ephemeral Y // same maximum encoded length. Note, the length of the generated ephemeral Y
// public key can vary depending on the number of leading zero bits. // public key can vary depending on the number of leading zero bits.
// //
// Upon input, the array of *rgpKeyAgreeKeyEncryptInfo has been initialized. // Upon input, the array of *rgpKeyAgreeKeyEncryptInfo has been initialized.
// The EncryptedKey must be updated for each recipient key. // The EncryptedKey must be updated for each recipient key.
// The pfnAlloc and pfnFree specified in // The pfnAlloc and pfnFree specified in
// ContentEncryptInfo must be used for doing the allocation. // ContentEncryptInfo must be used for doing the allocation.
// //
// KeyEncryptionAlgorithm.pszObjId is used to get the OIDFunctionAddress. // KeyEncryptionAlgorithm.pszObjId is used to get the OIDFunctionAddress.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// The following CAPI1 installable function is called when
// pContentEncryptInfo->fCNG == FALSE.
#define CMSG_OID_EXPORT_KEY_AGREE_FUNC "CryptMsgDllExportKeyAgree" #define CMSG_OID_EXPORT_KEY_AGREE_FUNC "CryptMsgDllExportKeyAgree"
#define CMSG_OID_CAPI1_EXPORT_KEY_AGREE_FUNC CMSG_OID_EXPORT_KEY_AGREE_FUNC
typedef BOOL (WINAPI *PFN_CMSG_EXPORT_KEY_AGREE) ( typedef BOOL (WINAPI *PFN_CMSG_EXPORT_KEY_AGREE) (
IN PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo, __in PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
IN PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO pKeyAgreeEncodeInfo, __in PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO pKeyAgreeEncodeInfo,
IN OUT PCMSG_KEY_AGREE_ENCRYPT_INFO pKeyAgreeEncryptInfo, __inout PCMSG_KEY_AGREE_ENCRYPT_INFO pKeyAgreeEncryptInfo,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL void *pvReserved __reserved void *pvReserved
); );
// The following CNG installable function is called when
// pContentEncryptInfo->fCNG == TRUE. It has the same API signature as for
// the above CMSG_OID_CAPI1_EXPORT_KEY_AGREE_FUNC.
#define CMSG_OID_CNG_EXPORT_KEY_AGREE_FUNC "CryptMsgDllCNGExportKeyAgree"
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Mail List Encrypt Info // Mail List Encrypt Info
// //
// The following data structure contains the information updated by the // The following data structure contains the information updated by the
// ExportMailList installable function. // ExportMailList installable function.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CMSG_MAIL_LIST_ENCRYPT_INFO { typedef struct _CMSG_MAIL_LIST_ENCRYPT_INFO {
DWORD cbSize; DWORD cbSize;
DWORD dwRecipientIndex; DWORD dwRecipientIndex;
CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm; CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm;
CRYPT_DATA_BLOB EncryptedKey; CRYPT_DATA_BLOB EncryptedKey;
DWORD dwFlags; DWORD dwFlags;
} CMSG_MAIL_LIST_ENCRYPT_INFO, *PCMSG_MAIL_LIST_ENCRYPT_INFO; } CMSG_MAIL_LIST_ENCRYPT_INFO, *PCMSG_MAIL_LIST_ENCRYPT_INFO;
#define CMSG_MAIL_LIST_ENCRYPT_FREE_PARA_FLAG 0x00000001 #define CMSG_MAIL_LIST_ENCRYPT_FREE_PARA_FLAG 0x00000001
#define CMSG_MAIL_LIST_ENCRYPT_FREE_OBJID_FLAG 0x00000002
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Upon input, MailListEncryptInfo has been initialized from the // Upon input, MailListEncryptInfo has been initialized from the
// MailListEncodeInfo. // MailListEncodeInfo.
// //
// The following fields may be changed in MailListEncryptInfo: // The following fields may be changed in MailListEncryptInfo:
// EncryptedKey // EncryptedKey
// KeyEncryptionAlgorithm.pszObjId
// KeyEncryptionAlgorithm.Parameters // KeyEncryptionAlgorithm.Parameters
// dwFlags // dwFlags
// //
// All other fields in the MailListEncryptInfo are READONLY. // All other fields in the MailListEncryptInfo are READONLY.
// //
// The EncryptedKey must be updated. The pfnAlloc and pfnFree specified in // The EncryptedKey must be updated. The pfnAlloc and pfnFree specified in
// ContentEncryptInfo must be used for doing the allocation. // ContentEncryptInfo must be used for doing the allocation.
// //
// If the KeyEncryptionAlgorithm.pszObjId is changed, then, the
// CMSG_MAIL_LIST_ENCRYPT_FREE_OBJID_FLAG must be set in dwFlags.
// If the KeyEncryptionAlgorithm.Parameters is updated, then, the // If the KeyEncryptionAlgorithm.Parameters is updated, then, the
// CMSG_MAIL_LIST_ENCRYPT_FREE_PARA_FLAG must be set in dwFlags. // CMSG_MAIL_LIST_ENCRYPT_FREE_PARA_FLAG must be set in dwFlags.
// The pfnAlloc and pfnFree specified in ContentEncryptInfo must be used // The pfnAlloc and pfnFree specified in ContentEncryptInfo must be used
// for doing the allocation. // for doing the allocation.
// //
// KeyEncryptionAlgorithm.pszObjId is used to get the OIDFunctionAddress. // KeyEncryptionAlgorithm.pszObjId is used to get the OIDFunctionAddress.
//
// Note, only has a CAPI1 installable function. No CNG installable function.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// The following CAPI1 installable function is called when
// pContentEncryptInfo->fCNG == FALSE.
#define CMSG_OID_EXPORT_MAIL_LIST_FUNC "CryptMsgDllExportMailList" #define CMSG_OID_EXPORT_MAIL_LIST_FUNC "CryptMsgDllExportMailList"
#define CMSG_OID_CAPI1_EXPORT_MAIL_LIST_FUNC CMSG_OID_EXPORT_MAIL_LIST_FUNC
typedef BOOL (WINAPI *PFN_CMSG_EXPORT_MAIL_LIST) ( typedef BOOL (WINAPI *PFN_CMSG_EXPORT_MAIL_LIST) (
IN PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo, __in PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
IN PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO pMailListEncodeInfo, __in PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO pMailListEncodeInfo,
IN OUT PCMSG_MAIL_LIST_ENCRYPT_INFO pMailListEncryptInfo, __inout PCMSG_MAIL_LIST_ENCRYPT_INFO pMailListEncryptInfo,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL void *pvReserved __reserved void *pvReserved
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// OID Installable functions for importing an encoded and encrypted content // CAPI1 OID Installable functions for importing an encoded and encrypted
// encryption key. // content encryption key.
// //
// There's a different installable function for each CMS Recipient choice: // There's a different installable function for each CMS Recipient choice:
// ImportKeyTrans // ImportKeyTrans
// ImportKeyAgree // ImportKeyAgree
// ImportMailList // ImportMailList
// //
// Iterates through the following OIDs to get the OID installable function: // Iterates through the following OIDs to get the OID installable function:
// KeyEncryptionOID!ContentEncryptionOID // KeyEncryptionOID!ContentEncryptionOID
// KeyEncryptionOID // KeyEncryptionOID
// ContentEncryptionOID // ContentEncryptionOID
// //
// If the OID installable function doesn't support the specified // If the OID installable function doesn't support the specified
// KeyEncryption and ContentEncryption OIDs, then, return FALSE with // KeyEncryption and ContentEncryption OIDs, then, return FALSE with
// LastError set to E_NOTIMPL. // LastError set to E_NOTIMPL.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CMSG_OID_IMPORT_KEY_TRANS_FUNC "CryptMsgDllImportKeyTrans" #define CMSG_OID_IMPORT_KEY_TRANS_FUNC "CryptMsgDllImportKeyTrans"
#define CMSG_OID_CAPI1_IMPORT_KEY_TRANS_FUNC CMSG_OID_IMPORT_KEY_TRANS_FUNC
typedef BOOL (WINAPI *PFN_CMSG_IMPORT_KEY_TRANS) ( typedef BOOL (WINAPI *PFN_CMSG_IMPORT_KEY_TRANS) (
IN PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm, __in PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm,
IN PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA pKeyTransDecryptPara, __in PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA pKeyTransDecryptPara,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL void *pvReserved, __reserved void *pvReserved,
OUT HCRYPTKEY *phContentEncryptKey __out HCRYPTKEY *phContentEncryptKey
); );
#define CMSG_OID_IMPORT_KEY_AGREE_FUNC "CryptMsgDllImportKeyAgree" #define CMSG_OID_IMPORT_KEY_AGREE_FUNC "CryptMsgDllImportKeyAgree"
#define CMSG_OID_CAPI1_IMPORT_KEY_AGREE_FUNC CMSG_OID_IMPORT_KEY_AGREE_FUNC
typedef BOOL (WINAPI *PFN_CMSG_IMPORT_KEY_AGREE) ( typedef BOOL (WINAPI *PFN_CMSG_IMPORT_KEY_AGREE) (
IN PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm, __in PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm,
IN PCMSG_CTRL_KEY_AGREE_DECRYPT_PARA pKeyAgreeDecryptPara, __in PCMSG_CTRL_KEY_AGREE_DECRYPT_PARA pKeyAgreeDecryptPara,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL void *pvReserved, __reserved void *pvReserved,
OUT HCRYPTKEY *phContentEncryptKey __out HCRYPTKEY *phContentEncryptKey
); );
#define CMSG_OID_IMPORT_MAIL_LIST_FUNC "CryptMsgDllImportMailList" #define CMSG_OID_IMPORT_MAIL_LIST_FUNC "CryptMsgDllImportMailList"
#define CMSG_OID_CAPI1_IMPORT_MAIL_LIST_FUNC CMSG_OID_IMPORT_MAIL_LIST_FUNC
typedef BOOL (WINAPI *PFN_CMSG_IMPORT_MAIL_LIST) ( typedef BOOL (WINAPI *PFN_CMSG_IMPORT_MAIL_LIST) (
IN PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm, __in PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm,
IN PCMSG_CTRL_MAIL_LIST_DECRYPT_PARA pMailListDecryptPara, __in PCMSG_CTRL_MAIL_LIST_DECRYPT_PARA pMailListDecryptPara,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL void *pvReserved, __reserved void *pvReserved,
OUT HCRYPTKEY *phContentEncryptKey __out HCRYPTKEY *phContentEncryptKey
);
//+-------------------------------------------------------------------------
// CNG Content Decrypt Info
//
// The following data structure contains the information shared between
// CNGImportKeyTrans, CNGImportKeyAgree and CNGImportContentEncryptKey
// installable functions.
//
// pbContentEncryptKey and pbCNGContentEncryptKeyObject are allocated
// and freed via pfnAlloc and pfnFree.
//--------------------------------------------------------------------------
typedef struct _CMSG_CNG_CONTENT_DECRYPT_INFO {
DWORD cbSize;
CRYPT_ALGORITHM_IDENTIFIER ContentEncryptionAlgorithm;
PFN_CMSG_ALLOC pfnAlloc;
PFN_CMSG_FREE pfnFree;
// This key must be used over the one in the DecryptPara. An
// HCRYPTPROV in the DecryptPara may have been converted to a
// NCRYPT_KEY_HANDLE.
NCRYPT_KEY_HANDLE hNCryptKey;
BYTE *pbContentEncryptKey;
DWORD cbContentEncryptKey;
BCRYPT_KEY_HANDLE hCNGContentEncryptKey;
BYTE *pbCNGContentEncryptKeyObject;
} CMSG_CNG_CONTENT_DECRYPT_INFO, *PCMSG_CNG_CONTENT_DECRYPT_INFO;
//+-------------------------------------------------------------------------
// CNG OID Installable function for importing and decrypting a key transport
// recipient encrypted content encryption key.
//
// Upon input, CNGContentDecryptInfo has been initialized.
//
// The following fields must be updated using hNCryptKey to decrypt
// pKeyTransDecryptPara->pKeyTrans->EncryptedKey.
// pbContentEncryptKey (pfnAlloc'ed)
// cbContentEncryptKey
//
// All other fields in the CNGContentEncryptInfo are READONLY.
//
// pKeyTransDecryptPara->pKeyTrans->KeyEncryptionAlgorithm.pszObjId is used
// to get the OIDFunctionAddress.
//--------------------------------------------------------------------------
#define CMSG_OID_CNG_IMPORT_KEY_TRANS_FUNC "CryptMsgDllCNGImportKeyTrans"
typedef BOOL (WINAPI *PFN_CMSG_CNG_IMPORT_KEY_TRANS) (
__inout PCMSG_CNG_CONTENT_DECRYPT_INFO pCNGContentDecryptInfo,
__in PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA pKeyTransDecryptPara,
__in DWORD dwFlags,
__reserved void *pvReserved
);
//+-------------------------------------------------------------------------
// CNG OID Installable function for importing and decrypting a key agreement
// recipient encrypted content encryption key.
//
// Upon input, CNGContentDecryptInfo has been initialized.
//
// The following fields must be updated using hNCryptKey to decrypt
// pKeyAgreeDecryptPara->pKeyAgree->rgpRecipientEncryptedKeys[
// pKeyAgreeDecryptPara->dwRecipientEncryptedKeyIndex]->EncryptedKey.
// pbContentEncryptKey (pfnAlloc'ed)
// cbContentEncryptKey
//
// All other fields in the CNGContentEncryptInfo are READONLY.
//
// pKeyAgreeDecryptPara->pKeyAgree->KeyEncryptionAlgorithm.pszObjId is used
// to get the OIDFunctionAddress.
//--------------------------------------------------------------------------
#define CMSG_OID_CNG_IMPORT_KEY_AGREE_FUNC "CryptMsgDllCNGImportKeyAgree"
typedef BOOL (WINAPI *PFN_CMSG_CNG_IMPORT_KEY_AGREE) (
__inout PCMSG_CNG_CONTENT_DECRYPT_INFO pCNGContentDecryptInfo,
__in PCMSG_CTRL_KEY_AGREE_DECRYPT_PARA pKeyAgreeDecryptPara,
__in DWORD dwFlags,
__reserved void *pvReserved
);
//+-------------------------------------------------------------------------
// CNG OID Installable function for importing an already decrypted
// content encryption key.
//
// Upon input, CNGContentDecryptInfo has been initialized.
//
// The following fields must be updated using pbContentEncryptKey and
// cbContentEncryptKey:
// hCNGContentEncryptKey
// pbCNGContentEncryptKeyObject (pfnAlloc'ed)
//
// The hCNGContentEncryptKey will be destroyed when hCryptMsg is closed.
//
// All other fields in the CNGContentEncryptInfo are READONLY.
//
// ContentEncryptionAlgorithm.pszObjId is used to get the OIDFunctionAddress.
//--------------------------------------------------------------------------
#define CMSG_OID_CNG_IMPORT_CONTENT_ENCRYPT_KEY_FUNC "CryptMsgDllCNGImportConte
ntEncryptKey"
typedef BOOL (WINAPI *PFN_CMSG_CNG_IMPORT_CONTENT_ENCRYPT_KEY) (
__inout PCMSG_CNG_CONTENT_DECRYPT_INFO pCNGContentDecryptInfo,
__in DWORD dwFlags,
__reserved void *pvReserved
); );
//+========================================================================= //+=========================================================================
// Certificate Store Data Structures and APIs // Certificate Store Data Structures and APIs
//========================================================================== //==========================================================================
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// In its most basic implementation, a cert store is simply a // In its most basic implementation, a cert store is simply a
// collection of certificates and/or CRLs. This is the case when // collection of certificates and/or CRLs. This is the case when
// a cert store is opened with all of its certificates and CRLs // a cert store is opened with all of its certificates and CRLs
skipping to change at line 6946 skipping to change at line 8577
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Certificate context. // Certificate context.
// //
// A certificate context contains both the encoded and decoded representation // A certificate context contains both the encoded and decoded representation
// of a certificate. A certificate context returned by a cert store function // of a certificate. A certificate context returned by a cert store function
// must be freed by calling the CertFreeCertificateContext function. The // must be freed by calling the CertFreeCertificateContext function. The
// CertDuplicateCertificateContext function can be called to make a duplicate // CertDuplicateCertificateContext function can be called to make a duplicate
// copy (which also must be freed by calling CertFreeCertificateContext). // copy (which also must be freed by calling CertFreeCertificateContext).
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// certenrolls_begin -- CERT_CONTEXT
typedef struct _CERT_CONTEXT { typedef struct _CERT_CONTEXT {
DWORD dwCertEncodingType; DWORD dwCertEncodingType;
BYTE *pbCertEncoded; BYTE *pbCertEncoded;
DWORD cbCertEncoded; DWORD cbCertEncoded;
PCERT_INFO pCertInfo; PCERT_INFO pCertInfo;
HCERTSTORE hCertStore; HCERTSTORE hCertStore;
} CERT_CONTEXT, *PCERT_CONTEXT; } CERT_CONTEXT, *PCERT_CONTEXT;
typedef const CERT_CONTEXT *PCCERT_CONTEXT; typedef const CERT_CONTEXT *PCCERT_CONTEXT;
// certenrolls_end
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CRL context. // CRL context.
// //
// A CRL context contains both the encoded and decoded representation // A CRL context contains both the encoded and decoded representation
// of a CRL. A CRL context returned by a cert store function // of a CRL. A CRL context returned by a cert store function
// must be freed by calling the CertFreeCRLContext function. The // must be freed by calling the CertFreeCRLContext function. The
// CertDuplicateCRLContext function can be called to make a duplicate // CertDuplicateCRLContext function can be called to make a duplicate
// copy (which also must be freed by calling CertFreeCRLContext). // copy (which also must be freed by calling CertFreeCRLContext).
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
skipping to change at line 6995 skipping to change at line 8628
BYTE *pbCtlEncoded; BYTE *pbCtlEncoded;
DWORD cbCtlEncoded; DWORD cbCtlEncoded;
PCTL_INFO pCtlInfo; PCTL_INFO pCtlInfo;
HCERTSTORE hCertStore; HCERTSTORE hCertStore;
HCRYPTMSG hCryptMsg; HCRYPTMSG hCryptMsg;
BYTE *pbCtlContent; BYTE *pbCtlContent;
DWORD cbCtlContent; DWORD cbCtlContent;
} CTL_CONTEXT, *PCTL_CONTEXT; } CTL_CONTEXT, *PCTL_CONTEXT;
typedef const CTL_CONTEXT *PCCTL_CONTEXT; typedef const CTL_CONTEXT *PCCTL_CONTEXT;
// certenrolld_begin -- CERT_*_PROP_ID
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Certificate, CRL and CTL property IDs // Certificate, CRL and CTL property IDs
// //
// See CertSetCertificateContextProperty or CertGetCertificateContextProperty // See CertSetCertificateContextProperty or CertGetCertificateContextProperty
// for usage information. // for usage information.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CERT_KEY_PROV_HANDLE_PROP_ID 1 #define CERT_KEY_PROV_HANDLE_PROP_ID 1
#define CERT_KEY_PROV_INFO_PROP_ID 2 #define CERT_KEY_PROV_INFO_PROP_ID 2 // CRYPT_KEY_PROV_INFO
#define CERT_SHA1_HASH_PROP_ID 3 #define CERT_SHA1_HASH_PROP_ID 3
#define CERT_MD5_HASH_PROP_ID 4 #define CERT_MD5_HASH_PROP_ID 4
#define CERT_HASH_PROP_ID CERT_SHA1_HASH_PROP_ID #define CERT_HASH_PROP_ID CERT_SHA1_HASH_PROP_ID
#define CERT_KEY_CONTEXT_PROP_ID 5 #define CERT_KEY_CONTEXT_PROP_ID 5
#define CERT_KEY_SPEC_PROP_ID 6 #define CERT_KEY_SPEC_PROP_ID 6
#define CERT_IE30_RESERVED_PROP_ID 7 #define CERT_IE30_RESERVED_PROP_ID 7
#define CERT_PUBKEY_HASH_RESERVED_PROP_ID 8 #define CERT_PUBKEY_HASH_RESERVED_PROP_ID 8
#define CERT_ENHKEY_USAGE_PROP_ID 9 #define CERT_ENHKEY_USAGE_PROP_ID 9
#define CERT_CTL_USAGE_PROP_ID CERT_ENHKEY_USAGE_PROP_ID #define CERT_CTL_USAGE_PROP_ID CERT_ENHKEY_USAGE_PROP_ID
#define CERT_NEXT_UPDATE_LOCATION_PROP_ID 10 #define CERT_NEXT_UPDATE_LOCATION_PROP_ID 10
#define CERT_FRIENDLY_NAME_PROP_ID 11 #define CERT_FRIENDLY_NAME_PROP_ID 11 // string
#define CERT_PVK_FILE_PROP_ID 12 #define CERT_PVK_FILE_PROP_ID 12
#define CERT_DESCRIPTION_PROP_ID 13 #define CERT_DESCRIPTION_PROP_ID 13 // string
#define CERT_ACCESS_STATE_PROP_ID 14 #define CERT_ACCESS_STATE_PROP_ID 14
#define CERT_SIGNATURE_HASH_PROP_ID 15 #define CERT_SIGNATURE_HASH_PROP_ID 15
#define CERT_SMART_CARD_DATA_PROP_ID 16 #define CERT_SMART_CARD_DATA_PROP_ID 16
#define CERT_EFS_PROP_ID 17 #define CERT_EFS_PROP_ID 17
#define CERT_FORTEZZA_DATA_PROP_ID 18 #define CERT_FORTEZZA_DATA_PROP_ID 18
#define CERT_ARCHIVED_PROP_ID 19 #define CERT_ARCHIVED_PROP_ID 19
#define CERT_KEY_IDENTIFIER_PROP_ID 20 #define CERT_KEY_IDENTIFIER_PROP_ID 20
#define CERT_AUTO_ENROLL_PROP_ID 21 #define CERT_AUTO_ENROLL_PROP_ID 21 // string:machine DNS name
#define CERT_PUBKEY_ALG_PARA_PROP_ID 22 #define CERT_PUBKEY_ALG_PARA_PROP_ID 22
#define CERT_CROSS_CERT_DIST_POINTS_PROP_ID 23 #define CERT_CROSS_CERT_DIST_POINTS_PROP_ID 23
#define CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID 24 #define CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID 24
#define CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID 25 #define CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID 25
#define CERT_ENROLLMENT_PROP_ID 26 #define CERT_ENROLLMENT_PROP_ID 26 // RequestId+CADNS+CACN+Friendly Name
#define CERT_DATE_STAMP_PROP_ID 27 #define CERT_DATE_STAMP_PROP_ID 27
#define CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID 28 #define CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID 28
#define CERT_SUBJECT_NAME_MD5_HASH_PROP_ID 29 #define CERT_SUBJECT_NAME_MD5_HASH_PROP_ID 29
#define CERT_EXTENDED_ERROR_INFO_PROP_ID 30 #define CERT_EXTENDED_ERROR_INFO_PROP_ID 30 // string
// Note, 32 - 35 are reserved for the CERT, CRL, CTL and KeyId file element IDs. // Note, 32 - 35 are reserved for the CERT, CRL, CTL and KeyId file element IDs.
// 36 - 63 are reserved for future element IDs. // 36 - 63 are reserved for future element IDs.
#define CERT_RENEWAL_PROP_ID 64 #define CERT_RENEWAL_PROP_ID 64
#define CERT_ARCHIVED_KEY_HASH_PROP_ID 65 #define CERT_ARCHIVED_KEY_HASH_PROP_ID 65 // Encrypted key hash
#define CERT_AUTO_ENROLL_RETRY_PROP_ID 66 #define CERT_AUTO_ENROLL_RETRY_PROP_ID 66 // AE_RETRY_INFO:cb+cRetry+FILETI
ME
#define CERT_AIA_URL_RETRIEVED_PROP_ID 67 #define CERT_AIA_URL_RETRIEVED_PROP_ID 67
// Note, 68 - 70 are reserved for future use. #define CERT_AUTHORITY_INFO_ACCESS_PROP_ID 68
#define CERT_REQUEST_ORIGINATOR_PROP_ID 71 #define CERT_BACKED_UP_PROP_ID 69 // VARIANT_BOOL+FILETIME
#define CERT_FIRST_RESERVED_PROP_ID 72 #define CERT_OCSP_RESPONSE_PROP_ID 70
#define CERT_REQUEST_ORIGINATOR_PROP_ID 71 // string:machine DNS name
#define CERT_SOURCE_LOCATION_PROP_ID 72 // string
#define CERT_SOURCE_URL_PROP_ID 73 // string
#define CERT_NEW_KEY_PROP_ID 74
#define CERT_OCSP_CACHE_PREFIX_PROP_ID 75 // string
#define CERT_SMART_CARD_ROOT_INFO_PROP_ID 76 // CRYPT_SMART_CARD_ROOT_INFO
#define CERT_NO_AUTO_EXPIRE_CHECK_PROP_ID 77
#define CERT_NCRYPT_KEY_HANDLE_PROP_ID 78
#define CERT_HCRYPTPROV_OR_NCRYPT_KEY_HANDLE_PROP_ID 79
#define CERT_SUBJECT_INFO_ACCESS_PROP_ID 80
#define CERT_CA_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID 81
#define CERT_CA_DISABLE_CRL_PROP_ID 82
#define CERT_ROOT_PROGRAM_CERT_POLICIES_PROP_ID 83
#define CERT_ROOT_PROGRAM_NAME_CONSTRAINTS_PROP_ID 84
#define CERT_FIRST_RESERVED_PROP_ID 85
#define CERT_LAST_RESERVED_PROP_ID 0x00007FFF #define CERT_LAST_RESERVED_PROP_ID 0x00007FFF
#define CERT_FIRST_USER_PROP_ID 0x00008000 #define CERT_FIRST_USER_PROP_ID 0x00008000
#define CERT_LAST_USER_PROP_ID 0x0000FFFF #define CERT_LAST_USER_PROP_ID 0x0000FFFF
// certenrolld_end
#define IS_CERT_HASH_PROP_ID(X) (CERT_SHA1_HASH_PROP_ID == (X) || \ #define IS_CERT_HASH_PROP_ID(X) (CERT_SHA1_HASH_PROP_ID == (X) || \
CERT_MD5_HASH_PROP_ID == (X) || \ CERT_MD5_HASH_PROP_ID == (X) || \
CERT_SIGNATURE_HASH_PROP_ID == (X)) CERT_SIGNATURE_HASH_PROP_ID == (X))
#define IS_PUBKEY_HASH_PROP_ID(X) (CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID = = (X) || \ #define IS_PUBKEY_HASH_PROP_ID(X) (CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID = = (X) || \
CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID == (X)) CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID == (X))
#define IS_CHAIN_HASH_PROP_ID(X) (CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID == (X) || \ #define IS_CHAIN_HASH_PROP_ID(X) (CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID == (X) || \
CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID == (X) || \ CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID == (X) || \
CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ ID == (X) || \ CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ ID == (X) || \
CERT_SUBJECT_NAME_MD5_HASH_PROP_ID == (X )) CERT_SUBJECT_NAME_MD5_HASH_PROP_ID == (X ))
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Property OIDs // Property OIDs
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// The OID component following the prefix contains the PROP_ID (decimal) // The OID component following the prefix contains the PROP_ID (decimal)
#define szOID_CERT_PROP_ID_PREFIX "1.3.6.1.4.1.311.10.11." #define szOID_CERT_PROP_ID_PREFIX "1.3.6.1.4.1.311.10.11."
#define _szPROP_ID(PropId) #PropId
// Ansi OID string from Property Id:
#define szOID_CERT_PROP_ID(PropId) szOID_CERT_PROP_ID_PREFIX _szPROP_ID(PropId)
// Unicode OID string from Property Id:
#define __CRYPT32WTEXT(quote) L##quote
#define _CRYPT32WTEXT(quote) __CRYPT32WTEXT(quote)
#define wszOID_CERT_PROP_ID(PropId) \
_CRYPT32WTEXT(szOID_CERT_PROP_ID_PREFIX) _CRYPT32WTEXT(_szPROP_ID(PropId
))
// Use szOID_CERT_PROP_ID(CERT_KEY_IDENTIFIER_PROP_ID) instead:
#define szOID_CERT_KEY_IDENTIFIER_PROP_ID "1.3.6.1.4.1.311.10.11.20" #define szOID_CERT_KEY_IDENTIFIER_PROP_ID "1.3.6.1.4.1.311.10.11.20"
// Use szOID_CERT_PROP_ID(CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID) instead:
#define szOID_CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID \ #define szOID_CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID \
"1.3.6.1.4.1.311.10.11.28" "1.3.6.1.4.1.311.10.11.28"
// Use szOID_CERT_PROP_ID(CERT_SUBJECT_NAME_MD5_HASH_PROP_ID) instead:
#define szOID_CERT_SUBJECT_NAME_MD5_HASH_PROP_ID \ #define szOID_CERT_SUBJECT_NAME_MD5_HASH_PROP_ID \
"1.3.6.1.4.1.311.10.11.29" "1.3.6.1.4.1.311.10.11.29"
// Use szOID_CERT_PROP_ID(CERT_MD5_HASH_PROP_ID) instead:
#define szOID_CERT_MD5_HASH_PROP_ID "1.3.6.1.4.1.311.10.11.4"
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Access State flags returned by CERT_ACCESS_STATE_PROP_ID. Note, // Access State flags returned by CERT_ACCESS_STATE_PROP_ID. Note,
// CERT_ACCESS_PROP_ID is read only. // CERT_ACCESS_PROP_ID is read only.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// Set if context property writes are persisted. For instance, not set for // Set if context property writes are persisted. For instance, not set for
// memory store contexts. Set for registry based stores opened as read or write. // memory store contexts. Set for registry based stores opened as read or write.
// Not set for registry based stores opened as read only. // Not set for registry based stores opened as read only.
#define CERT_ACCESS_STATE_WRITE_PERSIST_FLAG 0x1 #define CERT_ACCESS_STATE_WRITE_PERSIST_FLAG 0x1
// Set if context resides in a SYSTEM or SYSTEM_REGISTRY store. // Set if context resides in a SYSTEM or SYSTEM_REGISTRY store.
#define CERT_ACCESS_STATE_SYSTEM_STORE_FLAG 0x2 #define CERT_ACCESS_STATE_SYSTEM_STORE_FLAG 0x2
// Set if context resides in a LocalMachine SYSTEM or SYSTEM_REGISTRY store. // Set if context resides in a LocalMachine SYSTEM or SYSTEM_REGISTRY store.
#define CERT_ACCESS_STATE_LM_SYSTEM_STORE_FLAG 0x4 #define CERT_ACCESS_STATE_LM_SYSTEM_STORE_FLAG 0x4
// Set if context resides in a GroupPolicy SYSTEM or SYSTEM_REGISTRY store.
#define CERT_ACCESS_STATE_GP_SYSTEM_STORE_FLAG 0x8
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Cryptographic Key Provider Information // Cryptographic Key Provider Information
// //
// CRYPT_KEY_PROV_INFO defines the CERT_KEY_PROV_INFO_PROP_ID's pvData. // CRYPT_KEY_PROV_INFO defines the CERT_KEY_PROV_INFO_PROP_ID's pvData.
// //
// The CRYPT_KEY_PROV_INFO fields are passed to CryptAcquireContext // The CRYPT_KEY_PROV_INFO fields are passed to CryptAcquireContext
// to get a HCRYPTPROV handle. The optional CRYPT_KEY_PROV_PARAM fields are // to get a HCRYPTPROV handle. The optional CRYPT_KEY_PROV_PARAM fields are
// passed to CryptSetProvParam to further initialize the provider. // passed to CryptSetProvParam to further initialize the provider.
// //
// The dwKeySpec field identifies the private key to use from the container // The dwKeySpec field identifies the private key to use from the container
skipping to change at line 7129 skipping to change at line 8801
// The following flag should be set in the above dwFlags to enable // The following flag should be set in the above dwFlags to enable
// a CertSetCertificateContextProperty(CERT_KEY_CONTEXT_PROP_ID) after a // a CertSetCertificateContextProperty(CERT_KEY_CONTEXT_PROP_ID) after a
// CryptAcquireContext is done in the Sign or Decrypt Message functions. // CryptAcquireContext is done in the Sign or Decrypt Message functions.
// //
// The following define must not collide with any of the // The following define must not collide with any of the
// CryptAcquireContext dwFlag defines. // CryptAcquireContext dwFlag defines.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CERT_SET_KEY_PROV_HANDLE_PROP_ID 0x00000001 #define CERT_SET_KEY_PROV_HANDLE_PROP_ID 0x00000001
#define CERT_SET_KEY_CONTEXT_PROP_ID 0x00000001 #define CERT_SET_KEY_CONTEXT_PROP_ID 0x00000001
// Special dwKeySpec indicating a CNG NCRYPT_KEY_HANDLE instead of a CAPI1
// HCRYPTPROV
#define CERT_NCRYPT_KEY_SPEC 0xFFFFFFFF
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Certificate Key Context // Certificate Key Context
// //
// CERT_KEY_CONTEXT defines the CERT_KEY_CONTEXT_PROP_ID's pvData. // CERT_KEY_CONTEXT defines the CERT_KEY_CONTEXT_PROP_ID's pvData.
//
// dwKeySpec is set to the special CERT_NCRYPT_KEY_SPEC to select the
// hNCryptKey choice.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CERT_KEY_CONTEXT { typedef struct _CERT_KEY_CONTEXT {
DWORD cbSize; // sizeof(CERT_KEY_CONTEXT) DWORD cbSize; // sizeof(CERT_KEY_CONTEXT)
HCRYPTPROV hCryptProv; union {
HCRYPTPROV hCryptProv;
// dwKeySpec == CERT_NCRYPT_KEY_SPEC
NCRYPT_KEY_HANDLE hNCryptKey;
};
DWORD dwKeySpec; DWORD dwKeySpec;
} CERT_KEY_CONTEXT, *PCERT_KEY_CONTEXT; } CERT_KEY_CONTEXT, *PCERT_KEY_CONTEXT;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Cryptographic Smart Card Root Information
//
// CRYPT_SMART_CARD_ROOT_INFO defines the
// CERT_SMART_CARD_ROOT_INFO_PROP_ID's pvData.
//--------------------------------------------------------------------------
typedef struct _ROOT_INFO_LUID {
DWORD LowPart;
LONG HighPart;
} ROOT_INFO_LUID, *PROOT_INFO_LUID;
typedef struct _CRYPT_SMART_CARD_ROOT_INFO {
BYTE rgbCardID [16];
ROOT_INFO_LUID luid;
} CRYPT_SMART_CARD_ROOT_INFO, *PCRYPT_SMART_CARD_ROOT_INFO;
//+-------------------------------------------------------------------------
// Certificate Store Provider Types // Certificate Store Provider Types
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CERT_STORE_PROV_MSG ((LPCSTR) 1) #define CERT_STORE_PROV_MSG ((LPCSTR) 1)
#define CERT_STORE_PROV_MEMORY ((LPCSTR) 2) #define CERT_STORE_PROV_MEMORY ((LPCSTR) 2)
#define CERT_STORE_PROV_FILE ((LPCSTR) 3) #define CERT_STORE_PROV_FILE ((LPCSTR) 3)
#define CERT_STORE_PROV_REG ((LPCSTR) 4) #define CERT_STORE_PROV_REG ((LPCSTR) 4)
#define CERT_STORE_PROV_PKCS7 ((LPCSTR) 5) #define CERT_STORE_PROV_PKCS7 ((LPCSTR) 5)
#define CERT_STORE_PROV_SERIALIZED ((LPCSTR) 6) #define CERT_STORE_PROV_SERIALIZED ((LPCSTR) 6)
#define CERT_STORE_PROV_FILENAME_A ((LPCSTR) 7) #define CERT_STORE_PROV_FILENAME_A ((LPCSTR) 7)
skipping to change at line 7163 skipping to change at line 8863
#define CERT_STORE_PROV_SYSTEM_A ((LPCSTR) 9) #define CERT_STORE_PROV_SYSTEM_A ((LPCSTR) 9)
#define CERT_STORE_PROV_SYSTEM_W ((LPCSTR) 10) #define CERT_STORE_PROV_SYSTEM_W ((LPCSTR) 10)
#define CERT_STORE_PROV_SYSTEM CERT_STORE_PROV_SYSTEM_W #define CERT_STORE_PROV_SYSTEM CERT_STORE_PROV_SYSTEM_W
#define CERT_STORE_PROV_COLLECTION ((LPCSTR) 11) #define CERT_STORE_PROV_COLLECTION ((LPCSTR) 11)
#define CERT_STORE_PROV_SYSTEM_REGISTRY_A ((LPCSTR) 12) #define CERT_STORE_PROV_SYSTEM_REGISTRY_A ((LPCSTR) 12)
#define CERT_STORE_PROV_SYSTEM_REGISTRY_W ((LPCSTR) 13) #define CERT_STORE_PROV_SYSTEM_REGISTRY_W ((LPCSTR) 13)
#define CERT_STORE_PROV_SYSTEM_REGISTRY CERT_STORE_PROV_SYSTEM_REGISTRY_W #define CERT_STORE_PROV_SYSTEM_REGISTRY CERT_STORE_PROV_SYSTEM_REGISTRY_W
#define CERT_STORE_PROV_PHYSICAL_W ((LPCSTR) 14) #define CERT_STORE_PROV_PHYSICAL_W ((LPCSTR) 14)
#define CERT_STORE_PROV_PHYSICAL CERT_STORE_PROV_PHYSICAL_W #define CERT_STORE_PROV_PHYSICAL CERT_STORE_PROV_PHYSICAL_W
// SmartCard Store Provider isn't supported
#define CERT_STORE_PROV_SMART_CARD_W ((LPCSTR) 15) #define CERT_STORE_PROV_SMART_CARD_W ((LPCSTR) 15)
#define CERT_STORE_PROV_SMART_CARD CERT_STORE_PROV_SMART_CARD_W #define CERT_STORE_PROV_SMART_CARD CERT_STORE_PROV_SMART_CARD_W
#define CERT_STORE_PROV_LDAP_W ((LPCSTR) 16) #define CERT_STORE_PROV_LDAP_W ((LPCSTR) 16)
#define CERT_STORE_PROV_LDAP CERT_STORE_PROV_LDAP_W #define CERT_STORE_PROV_LDAP CERT_STORE_PROV_LDAP_W
#define CERT_STORE_PROV_PKCS12 ((LPCSTR) 17)
#define sz_CERT_STORE_PROV_MEMORY "Memory" #define sz_CERT_STORE_PROV_MEMORY "Memory"
#define sz_CERT_STORE_PROV_FILENAME_W "File" #define sz_CERT_STORE_PROV_FILENAME_W "File"
#define sz_CERT_STORE_PROV_FILENAME sz_CERT_STORE_PROV_FILENAME_W #define sz_CERT_STORE_PROV_FILENAME sz_CERT_STORE_PROV_FILENAME_W
#define sz_CERT_STORE_PROV_SYSTEM_W "System" #define sz_CERT_STORE_PROV_SYSTEM_W "System"
#define sz_CERT_STORE_PROV_SYSTEM sz_CERT_STORE_PROV_SYSTEM_W #define sz_CERT_STORE_PROV_SYSTEM sz_CERT_STORE_PROV_SYSTEM_W
#define sz_CERT_STORE_PROV_PKCS7 "PKCS7" #define sz_CERT_STORE_PROV_PKCS7 "PKCS7"
#define sz_CERT_STORE_PROV_PKCS12 "PKCS12"
#define sz_CERT_STORE_PROV_SERIALIZED "Serialized" #define sz_CERT_STORE_PROV_SERIALIZED "Serialized"
#define sz_CERT_STORE_PROV_COLLECTION "Collection" #define sz_CERT_STORE_PROV_COLLECTION "Collection"
#define sz_CERT_STORE_PROV_SYSTEM_REGISTRY_W "SystemRegistry" #define sz_CERT_STORE_PROV_SYSTEM_REGISTRY_W "SystemRegistry"
#define sz_CERT_STORE_PROV_SYSTEM_REGISTRY sz_CERT_STORE_PROV_SYSTEM_REGISTRY_W #define sz_CERT_STORE_PROV_SYSTEM_REGISTRY sz_CERT_STORE_PROV_SYSTEM_REGISTRY_W
#define sz_CERT_STORE_PROV_PHYSICAL_W "Physical" #define sz_CERT_STORE_PROV_PHYSICAL_W "Physical"
#define sz_CERT_STORE_PROV_PHYSICAL sz_CERT_STORE_PROV_PHYSICAL_W #define sz_CERT_STORE_PROV_PHYSICAL sz_CERT_STORE_PROV_PHYSICAL_W
// SmartCard Store Provider isn't supported
#define sz_CERT_STORE_PROV_SMART_CARD_W "SmartCard" #define sz_CERT_STORE_PROV_SMART_CARD_W "SmartCard"
#define sz_CERT_STORE_PROV_SMART_CARD sz_CERT_STORE_PROV_SMART_CARD_W #define sz_CERT_STORE_PROV_SMART_CARD sz_CERT_STORE_PROV_SMART_CARD_W
#define sz_CERT_STORE_PROV_LDAP_W "Ldap" #define sz_CERT_STORE_PROV_LDAP_W "Ldap"
#define sz_CERT_STORE_PROV_LDAP sz_CERT_STORE_PROV_LDAP_W #define sz_CERT_STORE_PROV_LDAP sz_CERT_STORE_PROV_LDAP_W
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Certificate Store verify/results flags // Certificate Store verify/results flags
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CERT_STORE_SIGNATURE_FLAG 0x00000001 #define CERT_STORE_SIGNATURE_FLAG 0x00000001
#define CERT_STORE_TIME_VALIDITY_FLAG 0x00000002 #define CERT_STORE_TIME_VALIDITY_FLAG 0x00000002
#define CERT_STORE_REVOCATION_FLAG 0x00000004 #define CERT_STORE_REVOCATION_FLAG 0x00000004
#define CERT_STORE_NO_CRL_FLAG 0x00010000 #define CERT_STORE_NO_CRL_FLAG 0x00010000
skipping to change at line 7312 skipping to change at line 9020
#define CERT_EFSBLOB_REGPATH \ #define CERT_EFSBLOB_REGPATH \
CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH L"\\EFS" CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH L"\\EFS"
#define CERT_EFSBLOB_VALUE_NAME L"EFSBlob" #define CERT_EFSBLOB_VALUE_NAME L"EFSBlob"
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Protected Root Defines // Protected Root Defines
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// Registry path to the Protected Roots Flags SubKey // Registry path to the Protected Roots Flags SubKey
#define CERT_PROT_ROOT_FLAGS_REGPATH \ #define CERT_PROT_ROOT_FLAGS_REGPATH \
CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH L"\\Root\\ProtectedRoots" CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH L"\\Root\\ProtectedRoots"
// The following is a REG_DWORD. The bit definitions follow.
#define CERT_PROT_ROOT_FLAGS_VALUE_NAME L"Flags" #define CERT_PROT_ROOT_FLAGS_VALUE_NAME L"Flags"
// Set the following flag to inhibit the opening of the CurrentUser's // Set the following flag to inhibit the opening of the CurrentUser's
// .Default physical store when opening the CurrentUser's "Root" system store. // .Default physical store when opening the CurrentUser's "Root" system store.
// The .Default physical store open's the CurrentUser SystemRegistry "Root" // The .Default physical store open's the CurrentUser SystemRegistry "Root"
// store. // store.
#define CERT_PROT_ROOT_DISABLE_CURRENT_USER_FLAG 0x1 #define CERT_PROT_ROOT_DISABLE_CURRENT_USER_FLAG 0x1
// Set the following flag to inhibit the adding of roots from the // Set the following flag to inhibit the adding of roots from the
// CurrentUser SystemRegistry "Root" store to the protected root list // CurrentUser SystemRegistry "Root" store to the protected root list
skipping to change at line 7356 skipping to change at line 9066
// When set, CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_NT_AUTH) // When set, CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_NT_AUTH)
// will check that the chain has a valid name constraint for all name // will check that the chain has a valid name constraint for all name
// spaces, including UPN if the issuing CA isn't in the "NTAuth" store. // spaces, including UPN if the issuing CA isn't in the "NTAuth" store.
#define CERT_PROT_ROOT_DISABLE_NT_AUTH_REQUIRED_FLAG 0x10 #define CERT_PROT_ROOT_DISABLE_NT_AUTH_REQUIRED_FLAG 0x10
// Set the following flag to disable checking for not defined name // Set the following flag to disable checking for not defined name
// constraints. // constraints.
// //
// When set, CertGetCertificateChain won't check for or set the following // When set, CertGetCertificateChain won't check for or set the following
// dwErrorStatus: CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT. // dwErrorStatus: CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT.
//
// In LH, checking for not defined name constraints is always disabled.
#define CERT_PROT_ROOT_DISABLE_NOT_DEFINED_NAME_CONSTRAINT_FLAG 0x20 #define CERT_PROT_ROOT_DISABLE_NOT_DEFINED_NAME_CONSTRAINT_FLAG 0x20
// Set the following flag to disallow the users to trust peer-trust
#define CERT_PROT_ROOT_DISABLE_PEER_TRUST 0x10000
// The following is a REG_MULTI_SZ containing the list of user allowed
// Enhanced Key Usages for peer trust.
#define CERT_PROT_ROOT_PEER_USAGES_VALUE_NAME L"PeerUsages"
#define CERT_PROT_ROOT_PEER_USAGES_VALUE_NAME_A "PeerUsages"
// If the above REG_MULTI_SZ isn't defined or is empty, defaults to
// the following multi-string value
#define CERT_PROT_ROOT_PEER_USAGES_DEFAULT_A \
szOID_PKIX_KP_CLIENT_AUTH "\0" \
szOID_PKIX_KP_EMAIL_PROTECTION "\0" \
szOID_KP_EFS "\0"
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Trusted Publisher Definitions // Trusted Publisher Definitions
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// Registry path to the trusted publisher "Safer" group policy subkey // Registry path to the trusted publisher "Safer" group policy subkey
#define CERT_TRUST_PUB_SAFER_GROUP_POLICY_REGPATH \ #define CERT_TRUST_PUB_SAFER_GROUP_POLICY_REGPATH \
CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH L"\\TrustedPublisher\\Safer" CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH L"\\TrustedPublisher\\Safer"
// Registry path to the Local Machine system stores // Registry path to the Local Machine system stores
#define CERT_LOCAL_MACHINE_SYSTEM_STORE_REGPATH \ #define CERT_LOCAL_MACHINE_SYSTEM_STORE_REGPATH \
L"Software\\Microsoft\\SystemCertificates" L"Software\\Microsoft\\SystemCertificates"
skipping to change at line 7408 skipping to change at line 9135
// Set the following flag to enable revocation checking of the publisher // Set the following flag to enable revocation checking of the publisher
// chain. // chain.
#define CERT_TRUST_PUB_CHECK_PUBLISHER_REV_FLAG 0x00000100 #define CERT_TRUST_PUB_CHECK_PUBLISHER_REV_FLAG 0x00000100
// Set the following flag to enable revocation checking of the time stamp // Set the following flag to enable revocation checking of the time stamp
// chain. // chain.
#define CERT_TRUST_PUB_CHECK_TIMESTAMP_REV_FLAG 0x00000200 #define CERT_TRUST_PUB_CHECK_TIMESTAMP_REV_FLAG 0x00000200
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// OCM Subcomponents Definitions // OCM Subcomponents Definitions
//
// Reading of the following registry key has been deprecated on Longhorn.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// Registry path to the OCM Subcomponents local machine subkey // Registry path to the OCM Subcomponents local machine subkey
#define CERT_OCM_SUBCOMPONENTS_LOCAL_MACHINE_REGPATH \ #define CERT_OCM_SUBCOMPONENTS_LOCAL_MACHINE_REGPATH \
L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\OC Manager\\Subcompon ents" L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\OC Manager\\Subcompon ents"
// REG_DWORD, 1 is installed, 0 is NOT installed // REG_DWORD, 1 is installed, 0 is NOT installed
#define CERT_OCM_SUBCOMPONENTS_ROOT_AUTO_UPDATE_VALUE_NAME L"RootAutoUpdate" #define CERT_OCM_SUBCOMPONENTS_ROOT_AUTO_UPDATE_VALUE_NAME L"RootAutoUpdate"
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// DisableRootAutoUpdate Defines
//--------------------------------------------------------------------------
// Registry path to the DisableRootAutoUpdate SubKey
#define CERT_DISABLE_ROOT_AUTO_UPDATE_REGPATH \
CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH L"\\AuthRoot"
// REG_DWORD Value Name, 1 - disables, 0 - enables
#define CERT_DISABLE_ROOT_AUTO_UPDATE_VALUE_NAME L"DisableRootAutoUpdate"
//+-------------------------------------------------------------------------
// AuthRoot Auto Update Definitions // AuthRoot Auto Update Definitions
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// Registry path to the AuthRoot "Auto Update" local machine subkey // Registry path to the AuthRoot "Auto Update" local machine subkey
#define CERT_AUTH_ROOT_AUTO_UPDATE_LOCAL_MACHINE_REGPATH \ #define CERT_AUTH_ROOT_AUTO_UPDATE_LOCAL_MACHINE_REGPATH \
CERT_LOCAL_MACHINE_SYSTEM_STORE_REGPATH L"\\AuthRoot\\AutoUpdate" CERT_LOCAL_MACHINE_SYSTEM_STORE_REGPATH L"\\AuthRoot\\AutoUpdate"
// AuthRoot Auto Update subkey value names. // AuthRoot Auto Update subkey value names.
// REG_SZ, URL to the directory containing the AuthRoots, CTL and Seq files // REG_SZ, URL to the directory containing the AuthRoots, CTL and Seq files
skipping to change at line 7933 skipping to change at line 9672
// CERT_STORE_PROV_LDAP // CERT_STORE_PROV_LDAP
// sz_CERT_STORE_PROV_LDAP_W // sz_CERT_STORE_PROV_LDAP_W
// sz_CERT_STORE_PROV_LDAP // sz_CERT_STORE_PROV_LDAP
// Opens a store over the results of the query specified by and LDAP // Opens a store over the results of the query specified by and LDAP
// URL which is passed in via pvPara. In order to do writes to the // URL which is passed in via pvPara. In order to do writes to the
// store the URL must specify a BASE query, no filter and a single // store the URL must specify a BASE query, no filter and a single
// attribute. // attribute.
// //
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
__checkReturn
HCERTSTORE HCERTSTORE
WINAPI WINAPI
CertOpenStore( CertOpenStore(
IN LPCSTR lpszStoreProvider, __in LPCSTR lpszStoreProvider,
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN HCRYPTPROV hCryptProv, __in_opt HCRYPTPROV_LEGACY hCryptProv,
IN DWORD dwFlags, __in DWORD dwFlags,
IN const void *pvPara __in_opt const void *pvPara
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// OID Installable Certificate Store Provider Data Structures // OID Installable Certificate Store Provider Data Structures
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// Handle returned by the store provider when opened. // Handle returned by the store provider when opened.
typedef void *HCERTSTOREPROV; typedef void *HCERTSTOREPROV;
// Store Provider OID function's pszFuncName. // Store Provider OID function's pszFuncName.
skipping to change at line 7976 skipping to change at line 9716
} CERT_STORE_PROV_INFO, *PCERT_STORE_PROV_INFO; } CERT_STORE_PROV_INFO, *PCERT_STORE_PROV_INFO;
// Definition of the store provider's open function. // Definition of the store provider's open function.
// //
// *pStoreProvInfo has been zeroed before the call. // *pStoreProvInfo has been zeroed before the call.
// //
// Note, pStoreProvInfo->cStoreProvFunc should be set last. Once set, // Note, pStoreProvInfo->cStoreProvFunc should be set last. Once set,
// all subsequent store calls, such as CertAddSerializedElementToStore will // all subsequent store calls, such as CertAddSerializedElementToStore will
// call the appropriate provider callback function. // call the appropriate provider callback function.
typedef BOOL (WINAPI *PFN_CERT_DLL_OPEN_STORE_PROV_FUNC)( typedef BOOL (WINAPI *PFN_CERT_DLL_OPEN_STORE_PROV_FUNC)(
IN LPCSTR lpszStoreProvider, __in LPCSTR lpszStoreProvider,
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN HCRYPTPROV hCryptProv, __in_opt HCRYPTPROV_LEGACY hCryptProv,
IN DWORD dwFlags, __in DWORD dwFlags,
IN const void *pvPara, __in_opt const void *pvPara,
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN OUT PCERT_STORE_PROV_INFO pStoreProvInfo __inout PCERT_STORE_PROV_INFO pStoreProvInfo
); );
// The open callback sets the following flag, if it maintains its // The open callback sets the following flag, if it maintains its
// contexts externally and not in the cached store. // contexts externally and not in the cached store.
#define CERT_STORE_PROV_EXTERNAL_FLAG 0x1 #define CERT_STORE_PROV_EXTERNAL_FLAG 0x1
// The open callback sets the following flag for a successful delete. // The open callback sets the following flag for a successful delete.
// When set, the close callback isn't called. // When set, the close callback isn't called.
#define CERT_STORE_PROV_DELETED_FLAG 0x2 #define CERT_STORE_PROV_DELETED_FLAG 0x2
skipping to change at line 8005 skipping to change at line 9745
#define CERT_STORE_PROV_NO_PERSIST_FLAG 0x4 #define CERT_STORE_PROV_NO_PERSIST_FLAG 0x4
// The open callback sets the following flag if the contexts are persisted // The open callback sets the following flag if the contexts are persisted
// to a system store. // to a system store.
#define CERT_STORE_PROV_SYSTEM_STORE_FLAG 0x8 #define CERT_STORE_PROV_SYSTEM_STORE_FLAG 0x8
// The open callback sets the following flag if the contexts are persisted // The open callback sets the following flag if the contexts are persisted
// to a LocalMachine system store. // to a LocalMachine system store.
#define CERT_STORE_PROV_LM_SYSTEM_STORE_FLAG 0x10 #define CERT_STORE_PROV_LM_SYSTEM_STORE_FLAG 0x10
// The open callback sets the following flag if the contexts are persisted
// to a GroupPolicy system store.
#define CERT_STORE_PROV_GP_SYSTEM_STORE_FLAG 0x20
// Indices into the store provider's array of callback functions. // Indices into the store provider's array of callback functions.
// //
// The provider can implement any subset of the following functions. It // The provider can implement any subset of the following functions. It
// sets pStoreProvInfo->cStoreProvFunc to the last index + 1 and any // sets pStoreProvInfo->cStoreProvFunc to the last index + 1 and any
// preceding not implemented functions to NULL. // preceding not implemented functions to NULL.
#define CERT_STORE_PROV_CLOSE_FUNC 0 #define CERT_STORE_PROV_CLOSE_FUNC 0
#define CERT_STORE_PROV_READ_CERT_FUNC 1 #define CERT_STORE_PROV_READ_CERT_FUNC 1
#define CERT_STORE_PROV_WRITE_CERT_FUNC 2 #define CERT_STORE_PROV_WRITE_CERT_FUNC 2
#define CERT_STORE_PROV_DELETE_CERT_FUNC 3 #define CERT_STORE_PROV_DELETE_CERT_FUNC 3
#define CERT_STORE_PROV_SET_CERT_PROPERTY_FUNC 4 #define CERT_STORE_PROV_SET_CERT_PROPERTY_FUNC 4
skipping to change at line 8037 skipping to change at line 9781
#define CERT_STORE_PROV_FIND_CRL_FUNC 17 #define CERT_STORE_PROV_FIND_CRL_FUNC 17
#define CERT_STORE_PROV_FREE_FIND_CRL_FUNC 18 #define CERT_STORE_PROV_FREE_FIND_CRL_FUNC 18
#define CERT_STORE_PROV_GET_CRL_PROPERTY_FUNC 19 #define CERT_STORE_PROV_GET_CRL_PROPERTY_FUNC 19
#define CERT_STORE_PROV_FIND_CTL_FUNC 20 #define CERT_STORE_PROV_FIND_CTL_FUNC 20
#define CERT_STORE_PROV_FREE_FIND_CTL_FUNC 21 #define CERT_STORE_PROV_FREE_FIND_CTL_FUNC 21
#define CERT_STORE_PROV_GET_CTL_PROPERTY_FUNC 22 #define CERT_STORE_PROV_GET_CTL_PROPERTY_FUNC 22
// Called by CertCloseStore when the store's reference count is // Called by CertCloseStore when the store's reference count is
// decremented to 0. // decremented to 0.
typedef void (WINAPI *PFN_CERT_STORE_PROV_CLOSE)( typedef void (WINAPI *PFN_CERT_STORE_PROV_CLOSE)(
IN HCERTSTOREPROV hStoreProv, __inout_opt HCERTSTOREPROV hStoreProv,
IN DWORD dwFlags __in DWORD dwFlags
); );
// Currently not called directly by the store APIs. However, may be exported // Currently not called directly by the store APIs. However, may be exported
// to support other providers based on it. // to support other providers based on it.
// //
// Reads the provider's copy of the certificate context. If it exists, // Reads the provider's copy of the certificate context. If it exists,
// creates a new certificate context. // creates a new certificate context.
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_READ_CERT)( typedef __success(return == TRUE) BOOL (WINAPI *PFN_CERT_STORE_PROV_READ_CERT)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCERT_CONTEXT pStoreCertContext, __in PCCERT_CONTEXT pStoreCertContext,
IN DWORD dwFlags, __in DWORD dwFlags,
OUT PCCERT_CONTEXT *ppProvCertContext __deref_out PCCERT_CONTEXT *ppProvCertContext
); );
#define CERT_STORE_PROV_WRITE_ADD_FLAG 0x1 #define CERT_STORE_PROV_WRITE_ADD_FLAG 0x1
// Called by CertAddEncodedCertificateToStore, // Called by CertAddEncodedCertificateToStore,
// CertAddCertificateContextToStore or CertAddSerializedElementToStore before // CertAddCertificateContextToStore or CertAddSerializedElementToStore before
// adding to the store. The CERT_STORE_PROV_WRITE_ADD_FLAG is set. In // adding to the store. The CERT_STORE_PROV_WRITE_ADD_FLAG is set. In
// addition to the encoded certificate, the added pCertContext might also // addition to the encoded certificate, the added pCertContext might also
// have properties. // have properties.
// //
// Returns TRUE if its OK to update the the store. // Returns TRUE if its OK to update the the store.
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_WRITE_CERT)( typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_WRITE_CERT)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN DWORD dwFlags __in DWORD dwFlags
); );
// Called by CertDeleteCertificateFromStore before deleting from the // Called by CertDeleteCertificateFromStore before deleting from the
// store. // store.
// //
// Returns TRUE if its OK to delete from the store. // Returns TRUE if its OK to delete from the store.
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_DELETE_CERT)( typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_DELETE_CERT)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN DWORD dwFlags __in DWORD dwFlags
); );
// Called by CertSetCertificateContextProperty before setting the // Called by CertSetCertificateContextProperty before setting the
// certificate's property. Also called by CertGetCertificateContextProperty, // certificate's property. Also called by CertGetCertificateContextProperty,
// when getting a hash property that needs to be created and then persisted // when getting a hash property that needs to be created and then persisted
// via the set. // via the set.
// //
// Upon input, the property hasn't been set for the pCertContext parameter. // Upon input, the property hasn't been set for the pCertContext parameter.
// //
// Returns TRUE if its OK to set the property. // Returns TRUE if its OK to set the property.
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_SET_CERT_PROPERTY)( typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_SET_CERT_PROPERTY)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN DWORD dwPropId, __in DWORD dwPropId,
IN DWORD dwFlags, __in DWORD dwFlags,
IN const void *pvData __in_opt const void *pvData
); );
// Currently not called directly by the store APIs. However, may be exported // Currently not called directly by the store APIs. However, may be exported
// to support other providers based on it. // to support other providers based on it.
// //
// Reads the provider's copy of the CRL context. If it exists, // Reads the provider's copy of the CRL context. If it exists,
// creates a new CRL context. // creates a new CRL context.
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_READ_CRL)( typedef __success(return == TRUE) BOOL (WINAPI *PFN_CERT_STORE_PROV_READ_CRL)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCRL_CONTEXT pStoreCrlContext, __in PCCRL_CONTEXT pStoreCrlContext,
IN DWORD dwFlags, __in DWORD dwFlags,
OUT PCCRL_CONTEXT *ppProvCrlContext __deref_out PCCRL_CONTEXT *ppProvCrlContext
); );
// Called by CertAddEncodedCRLToStore, // Called by CertAddEncodedCRLToStore,
// CertAddCRLContextToStore or CertAddSerializedElementToStore before // CertAddCRLContextToStore or CertAddSerializedElementToStore before
// adding to the store. The CERT_STORE_PROV_WRITE_ADD_FLAG is set. In // adding to the store. The CERT_STORE_PROV_WRITE_ADD_FLAG is set. In
// addition to the encoded CRL, the added pCertContext might also // addition to the encoded CRL, the added pCertContext might also
// have properties. // have properties.
// //
// Returns TRUE if its OK to update the the store. // Returns TRUE if its OK to update the the store.
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_WRITE_CRL)( typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_WRITE_CRL)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCRL_CONTEXT pCrlContext, __in PCCRL_CONTEXT pCrlContext,
IN DWORD dwFlags __in DWORD dwFlags
); );
// Called by CertDeleteCRLFromStore before deleting from the store. // Called by CertDeleteCRLFromStore before deleting from the store.
// //
// Returns TRUE if its OK to delete from the store. // Returns TRUE if its OK to delete from the store.
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_DELETE_CRL)( typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_DELETE_CRL)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCRL_CONTEXT pCrlContext, __in PCCRL_CONTEXT pCrlContext,
IN DWORD dwFlags __in DWORD dwFlags
); );
// Called by CertSetCRLContextProperty before setting the // Called by CertSetCRLContextProperty before setting the
// CRL's property. Also called by CertGetCRLContextProperty, // CRL's property. Also called by CertGetCRLContextProperty,
// when getting a hash property that needs to be created and then persisted // when getting a hash property that needs to be created and then persisted
// via the set. // via the set.
// //
// Upon input, the property hasn't been set for the pCrlContext parameter. // Upon input, the property hasn't been set for the pCrlContext parameter.
// //
// Returns TRUE if its OK to set the property. // Returns TRUE if its OK to set the property.
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_SET_CRL_PROPERTY)( typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_SET_CRL_PROPERTY)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCRL_CONTEXT pCrlContext, __in PCCRL_CONTEXT pCrlContext,
IN DWORD dwPropId, __in DWORD dwPropId,
IN DWORD dwFlags, __in DWORD dwFlags,
IN const void *pvData __in_opt const void *pvData
); );
// Currently not called directly by the store APIs. However, may be exported // Currently not called directly by the store APIs. However, may be exported
// to support other providers based on it. // to support other providers based on it.
// //
// Reads the provider's copy of the CTL context. If it exists, // Reads the provider's copy of the CTL context. If it exists,
// creates a new CTL context. // creates a new CTL context.
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_READ_CTL)( typedef __success(return == TRUE) BOOL (WINAPI *PFN_CERT_STORE_PROV_READ_CTL)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCTL_CONTEXT pStoreCtlContext, __in PCCTL_CONTEXT pStoreCtlContext,
IN DWORD dwFlags, __in DWORD dwFlags,
OUT PCCTL_CONTEXT *ppProvCtlContext __deref_out PCCTL_CONTEXT *ppProvCtlContext
); );
// Called by CertAddEncodedCTLToStore, // Called by CertAddEncodedCTLToStore,
// CertAddCTLContextToStore or CertAddSerializedElementToStore before // CertAddCTLContextToStore or CertAddSerializedElementToStore before
// adding to the store. The CERT_STORE_PROV_WRITE_ADD_FLAG is set. In // adding to the store. The CERT_STORE_PROV_WRITE_ADD_FLAG is set. In
// addition to the encoded CTL, the added pCertContext might also // addition to the encoded CTL, the added pCertContext might also
// have properties. // have properties.
// //
// Returns TRUE if its OK to update the the store. // Returns TRUE if its OK to update the the store.
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_WRITE_CTL)( typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_WRITE_CTL)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCTL_CONTEXT pCtlContext, __in PCCTL_CONTEXT pCtlContext,
IN DWORD dwFlags __in DWORD dwFlags
); );
// Called by CertDeleteCTLFromStore before deleting from the store. // Called by CertDeleteCTLFromStore before deleting from the store.
// //
// Returns TRUE if its OK to delete from the store. // Returns TRUE if its OK to delete from the store.
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_DELETE_CTL)( typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_DELETE_CTL)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCTL_CONTEXT pCtlContext, __in PCCTL_CONTEXT pCtlContext,
IN DWORD dwFlags __in DWORD dwFlags
); );
// Called by CertSetCTLContextProperty before setting the // Called by CertSetCTLContextProperty before setting the
// CTL's property. Also called by CertGetCTLContextProperty, // CTL's property. Also called by CertGetCTLContextProperty,
// when getting a hash property that needs to be created and then persisted // when getting a hash property that needs to be created and then persisted
// via the set. // via the set.
// //
// Upon input, the property hasn't been set for the pCtlContext parameter. // Upon input, the property hasn't been set for the pCtlContext parameter.
// //
// Returns TRUE if its OK to set the property. // Returns TRUE if its OK to set the property.
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_SET_CTL_PROPERTY)( typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_SET_CTL_PROPERTY)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCTL_CONTEXT pCtlContext, __in PCCTL_CONTEXT pCtlContext,
IN DWORD dwPropId, __in DWORD dwPropId,
IN DWORD dwFlags, __in DWORD dwFlags,
IN const void *pvData __in_opt const void *pvData
); );
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_CONTROL)( typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_CONTROL)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN DWORD dwFlags, __in DWORD dwFlags,
IN DWORD dwCtrlType, __in DWORD dwCtrlType,
IN void const *pvCtrlPara __in_opt void const *pvCtrlPara
); );
typedef struct _CERT_STORE_PROV_FIND_INFO { typedef struct _CERT_STORE_PROV_FIND_INFO {
DWORD cbSize; DWORD cbSize;
DWORD dwMsgAndCertEncodingType; DWORD dwMsgAndCertEncodingType;
DWORD dwFindFlags; DWORD dwFindFlags;
DWORD dwFindType; DWORD dwFindType;
const void *pvFindPara; const void *pvFindPara;
} CERT_STORE_PROV_FIND_INFO, *PCERT_STORE_PROV_FIND_INFO; } CERT_STORE_PROV_FIND_INFO, *PCERT_STORE_PROV_FIND_INFO;
typedef const CERT_STORE_PROV_FIND_INFO CCERT_STORE_PROV_FIND_INFO, typedef const CERT_STORE_PROV_FIND_INFO CCERT_STORE_PROV_FIND_INFO,
*PCCERT_STORE_PROV_FIND_INFO; *PCCERT_STORE_PROV_FIND_INFO;
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FIND_CERT)( typedef __success(return == TRUE) BOOL (WINAPI *PFN_CERT_STORE_PROV_FIND_CERT)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCERT_STORE_PROV_FIND_INFO pFindInfo, __in PCCERT_STORE_PROV_FIND_INFO pFindInfo,
IN PCCERT_CONTEXT pPrevCertContext, __in PCCERT_CONTEXT pPrevCertContext,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OUT void **ppvStoreProvFindInfo, __deref_inout void **ppvStoreProvFindInfo,
OUT PCCERT_CONTEXT *ppProvCertContext __deref_out PCCERT_CONTEXT *ppProvCertContext
); );
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FREE_FIND_CERT)( typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FREE_FIND_CERT)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN void *pvStoreProvFindInfo, __in void *pvStoreProvFindInfo,
IN DWORD dwFlags __in DWORD dwFlags
); );
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_GET_CERT_PROPERTY)( typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_GET_CERT_PROPERTY)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN DWORD dwPropId, __in DWORD dwPropId,
IN DWORD dwFlags, __in DWORD dwFlags,
OUT void *pvData, __out_bcount_part_opt(*pcbData, *pcbData) void *pvData,
IN OUT DWORD *pcbData __inout DWORD *pcbData
); );
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FIND_CRL)( typedef __success(return == TRUE) BOOL (WINAPI *PFN_CERT_STORE_PROV_FIND_CRL)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCERT_STORE_PROV_FIND_INFO pFindInfo, __in PCCERT_STORE_PROV_FIND_INFO pFindInfo,
IN PCCRL_CONTEXT pPrevCrlContext, __in PCCRL_CONTEXT pPrevCrlContext,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OUT void **ppvStoreProvFindInfo, __deref_inout void **ppvStoreProvFindInfo,
OUT PCCRL_CONTEXT *ppProvCrlContext __deref_out PCCRL_CONTEXT *ppProvCrlContext
); );
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FREE_FIND_CRL)( typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FREE_FIND_CRL)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCRL_CONTEXT pCrlContext, __in PCCRL_CONTEXT pCrlContext,
IN void *pvStoreProvFindInfo, __in void *pvStoreProvFindInfo,
IN DWORD dwFlags __in DWORD dwFlags
); );
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_GET_CRL_PROPERTY)( typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_GET_CRL_PROPERTY)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCRL_CONTEXT pCrlContext, __in PCCRL_CONTEXT pCrlContext,
IN DWORD dwPropId, __in DWORD dwPropId,
IN DWORD dwFlags, __in DWORD dwFlags,
OUT void *pvData, __out_bcount_part_opt(*pcbData, *pcbData) void *pvData,
IN OUT DWORD *pcbData __inout DWORD *pcbData
); );
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FIND_CTL)( typedef __success(return == TRUE) BOOL (WINAPI *PFN_CERT_STORE_PROV_FIND_CTL)(
IN HCERTSTOREPROV hStoreProv, __in HCERTSTOREPROV hStoreProv,
IN PCCERT_STORE_PROV_FIND_INFO pFindInfo, __in PCCERT_STORE_PROV_FIND_INFO pFindInfo,
IN PCCTL_CONTEXT pPrevCtlContext, __in PCCTL_CONTEXT pPrevCtlContext,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OUT void **ppvStoreProvFindInfo, __deref_inout void **ppvStoreProvFindInfo,
OUT PCCTL_CONTEXT *ppProvCtlContext __deref_out PCCTL_CONTEXT *ppProvCtlContext
); );
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FREE_FIND_CTL)( typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FREE_FIND_CTL)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCTL_CONTEXT pCtlContext, __in PCCTL_CONTEXT pCtlContext,
IN void *pvStoreProvFindInfo, __in void *pvStoreProvFindInfo,
IN DWORD dwFlags __in DWORD dwFlags
); );
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_GET_CTL_PROPERTY)( typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_GET_CTL_PROPERTY)(
IN HCERTSTOREPROV hStoreProv, __inout HCERTSTOREPROV hStoreProv,
IN PCCTL_CONTEXT pCtlContext, __in PCCTL_CONTEXT pCtlContext,
IN DWORD dwPropId, __in DWORD dwPropId,
IN DWORD dwFlags, __in DWORD dwFlags,
OUT void *pvData, __out_bcount_part_opt(*pcbData, *pcbData) void *pvData,
IN OUT DWORD *pcbData __inout DWORD *pcbData
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Duplicate a cert store handle // Duplicate a cert store handle
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
HCERTSTORE HCERTSTORE
WINAPI WINAPI
CertDuplicateStore( CertDuplicateStore(
IN HCERTSTORE hCertStore __in HCERTSTORE hCertStore
); );
#define CERT_STORE_SAVE_AS_STORE 1 #define CERT_STORE_SAVE_AS_STORE 1
#define CERT_STORE_SAVE_AS_PKCS7 2 #define CERT_STORE_SAVE_AS_PKCS7 2
#define CERT_STORE_SAVE_AS_PKCS12 3
#define CERT_STORE_SAVE_TO_FILE 1 #define CERT_STORE_SAVE_TO_FILE 1
#define CERT_STORE_SAVE_TO_MEMORY 2 #define CERT_STORE_SAVE_TO_MEMORY 2
#define CERT_STORE_SAVE_TO_FILENAME_A 3 #define CERT_STORE_SAVE_TO_FILENAME_A 3
#define CERT_STORE_SAVE_TO_FILENAME_W 4 #define CERT_STORE_SAVE_TO_FILENAME_W 4
#define CERT_STORE_SAVE_TO_FILENAME CERT_STORE_SAVE_TO_FILENAME_W #define CERT_STORE_SAVE_TO_FILENAME CERT_STORE_SAVE_TO_FILENAME_W
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Save the cert store. Extended version with lots of options. // Save the cert store. Extended version with lots of options.
// //
skipping to change at line 8361 skipping to change at line 10106
// For "_A": given, // For "_A": given,
// LPCSTR pszFilename; pvSaveToPara = (void *) pszFilename; // LPCSTR pszFilename; pvSaveToPara = (void *) pszFilename;
// //
// Note, the default (without "_A" or "_W") is UNICODE. // Note, the default (without "_A" or "_W") is UNICODE.
// //
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertSaveStore( CertSaveStore(
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN DWORD dwSaveAs, __in DWORD dwSaveAs,
IN DWORD dwSaveTo, __in DWORD dwSaveTo,
IN OUT void *pvSaveToPara, __inout void *pvSaveToPara,
IN DWORD dwFlags __in DWORD dwFlags
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Certificate Store close flags // Certificate Store close flags
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CERT_CLOSE_STORE_FORCE_FLAG 0x00000001 #define CERT_CLOSE_STORE_FORCE_FLAG 0x00000001
#define CERT_CLOSE_STORE_CHECK_FLAG 0x00000002 #define CERT_CLOSE_STORE_CHECK_FLAG 0x00000002
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Close a cert store handle. // Close a cert store handle.
skipping to change at line 8403 skipping to change at line 10148
// returned with LastError set to CRYPT_E_PENDING_CLOSE. Note, for FALSE, // returned with LastError set to CRYPT_E_PENDING_CLOSE. Note, for FALSE,
// the store is still closed. This is a diagnostic flag. // the store is still closed. This is a diagnostic flag.
// //
// LastError is preserved unless CERT_CLOSE_STORE_CHECK_FLAG is set and FALSE // LastError is preserved unless CERT_CLOSE_STORE_CHECK_FLAG is set and FALSE
// is returned. // is returned.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertCloseStore( CertCloseStore(
IN HCERTSTORE hCertStore, __in_opt HCERTSTORE hCertStore,
DWORD dwFlags __in DWORD dwFlags
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Get the subject certificate context uniquely identified by its Issuer and // Get the subject certificate context uniquely identified by its Issuer and
// SerialNumber from the store. // SerialNumber from the store.
// //
// If the certificate isn't found, NULL is returned. Otherwise, a pointer to // If the certificate isn't found, NULL is returned. Otherwise, a pointer to
// a read only CERT_CONTEXT is returned. CERT_CONTEXT must be freed by calling // a read only CERT_CONTEXT is returned. CERT_CONTEXT must be freed by calling
// CertFreeCertificateContext. CertDuplicateCertificateContext can be called to make a // CertFreeCertificateContext. CertDuplicateCertificateContext can be called to make a
// duplicate. // duplicate.
// //
// The returned certificate might not be valid. Normally, it would be // The returned certificate might not be valid. Normally, it would be
// verified when getting its issuer certificate (CertGetIssuerCertificateFromSt ore). // verified when getting its issuer certificate (CertGetIssuerCertificateFromSt ore).
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCERT_CONTEXT PCCERT_CONTEXT
WINAPI WINAPI
CertGetSubjectCertificateFromStore( CertGetSubjectCertificateFromStore(
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN PCERT_INFO pCertId // Only the Issuer and SerialNumber __in PCERT_INFO pCertId // Only the Issuer and SerialNumber
// fields are used // fields are used
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Enumerate the certificate contexts in the store. // Enumerate the certificate contexts in the store.
// //
// If a certificate isn't found, NULL is returned. // If a certificate isn't found, NULL is returned.
// Otherwise, a pointer to a read only CERT_CONTEXT is returned. CERT_CONTEXT // Otherwise, a pointer to a read only CERT_CONTEXT is returned. CERT_CONTEXT
// must be freed by calling CertFreeCertificateContext or is freed when passed as the // must be freed by calling CertFreeCertificateContext or is freed when passed as the
// pPrevCertContext on a subsequent call. CertDuplicateCertificateContext // pPrevCertContext on a subsequent call. CertDuplicateCertificateContext
// can be called to make a duplicate. // can be called to make a duplicate.
skipping to change at line 8449 skipping to change at line 10194
// certificate in the store. Successive certificates are enumerated by setting // certificate in the store. Successive certificates are enumerated by setting
// pPrevCertContext to the CERT_CONTEXT returned by a previous call. // pPrevCertContext to the CERT_CONTEXT returned by a previous call.
// //
// NOTE: a NON-NULL pPrevCertContext is always CertFreeCertificateContext'ed by // NOTE: a NON-NULL pPrevCertContext is always CertFreeCertificateContext'ed by
// this function, even for an error. // this function, even for an error.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCERT_CONTEXT PCCERT_CONTEXT
WINAPI WINAPI
CertEnumCertificatesInStore( CertEnumCertificatesInStore(
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN PCCERT_CONTEXT pPrevCertContext __in_opt PCCERT_CONTEXT pPrevCertContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Find the first or next certificate context in the store. // Find the first or next certificate context in the store.
// //
// The certificate is found according to the dwFindType and its pvFindPara. // The certificate is found according to the dwFindType and its pvFindPara.
// See below for a list of the find types and its parameters. // See below for a list of the find types and its parameters.
// //
// Currently dwFindFlags is only used for CERT_FIND_SUBJECT_ATTR, // Currently dwFindFlags is only used for CERT_FIND_SUBJECT_ATTR,
// CERT_FIND_ISSUER_ATTR or CERT_FIND_CTL_USAGE. Otherwise, must be set to 0. // CERT_FIND_ISSUER_ATTR or CERT_FIND_CTL_USAGE. Otherwise, must be set to 0.
skipping to change at line 8481 skipping to change at line 10226
// call to find the certificate. To find the next certificate, the // call to find the certificate. To find the next certificate, the
// pPrevCertContext is set to the CERT_CONTEXT returned by a previous call. // pPrevCertContext is set to the CERT_CONTEXT returned by a previous call.
// //
// NOTE: a NON-NULL pPrevCertContext is always CertFreeCertificateContext'ed by // NOTE: a NON-NULL pPrevCertContext is always CertFreeCertificateContext'ed by
// this function, even for an error. // this function, even for an error.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCERT_CONTEXT PCCERT_CONTEXT
WINAPI WINAPI
CertFindCertificateInStore( CertFindCertificateInStore(
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN DWORD dwFindFlags, __in DWORD dwFindFlags,
IN DWORD dwFindType, __in DWORD dwFindType,
IN const void *pvFindPara, __in_opt const void *pvFindPara,
IN PCCERT_CONTEXT pPrevCertContext __in_opt PCCERT_CONTEXT pPrevCertContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Certificate comparison functions // Certificate comparison functions
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CERT_COMPARE_MASK 0xFFFF #define CERT_COMPARE_MASK 0xFFFF
#define CERT_COMPARE_SHIFT 16 #define CERT_COMPARE_SHIFT 16
#define CERT_COMPARE_ANY 0 #define CERT_COMPARE_ANY 0
#define CERT_COMPARE_SHA1_HASH 1 #define CERT_COMPARE_SHA1_HASH 1
#define CERT_COMPARE_NAME 2 #define CERT_COMPARE_NAME 2
skipping to change at line 8517 skipping to change at line 10262
#define CERT_COMPARE_SUBJECT_CERT 11 #define CERT_COMPARE_SUBJECT_CERT 11
#define CERT_COMPARE_ISSUER_OF 12 #define CERT_COMPARE_ISSUER_OF 12
#define CERT_COMPARE_EXISTING 13 #define CERT_COMPARE_EXISTING 13
#define CERT_COMPARE_SIGNATURE_HASH 14 #define CERT_COMPARE_SIGNATURE_HASH 14
#define CERT_COMPARE_KEY_IDENTIFIER 15 #define CERT_COMPARE_KEY_IDENTIFIER 15
#define CERT_COMPARE_CERT_ID 16 #define CERT_COMPARE_CERT_ID 16
#define CERT_COMPARE_CROSS_CERT_DIST_POINTS 17 #define CERT_COMPARE_CROSS_CERT_DIST_POINTS 17
#define CERT_COMPARE_PUBKEY_MD5_HASH 18 #define CERT_COMPARE_PUBKEY_MD5_HASH 18
#define CERT_COMPARE_SUBJECT_INFO_ACCESS 19
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// dwFindType // dwFindType
// //
// The dwFindType definition consists of two components: // The dwFindType definition consists of two components:
// - comparison function // - comparison function
// - certificate information flag // - certificate information flag
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CERT_FIND_ANY (CERT_COMPARE_ANY << CERT_COMPARE_SHIFT) #define CERT_FIND_ANY (CERT_COMPARE_ANY << CERT_COMPARE_SHIFT)
#define CERT_FIND_SHA1_HASH (CERT_COMPARE_SHA1_HASH << CERT_COMPARE_SHIFT) #define CERT_FIND_SHA1_HASH (CERT_COMPARE_SHA1_HASH << CERT_COMPARE_SHIFT)
#define CERT_FIND_MD5_HASH (CERT_COMPARE_MD5_HASH << CERT_COMPARE_SHIFT) #define CERT_FIND_MD5_HASH (CERT_COMPARE_MD5_HASH << CERT_COMPARE_SHIFT)
skipping to change at line 8564 skipping to change at line 10311
#define CERT_FIND_SUBJECT_CERT (CERT_COMPARE_SUBJECT_CERT << CERT_COMPARE_SHIFT ) #define CERT_FIND_SUBJECT_CERT (CERT_COMPARE_SUBJECT_CERT << CERT_COMPARE_SHIFT )
#define CERT_FIND_ISSUER_OF (CERT_COMPARE_ISSUER_OF << CERT_COMPARE_SHIFT) #define CERT_FIND_ISSUER_OF (CERT_COMPARE_ISSUER_OF << CERT_COMPARE_SHIFT)
#define CERT_FIND_EXISTING (CERT_COMPARE_EXISTING << CERT_COMPARE_SHIFT) #define CERT_FIND_EXISTING (CERT_COMPARE_EXISTING << CERT_COMPARE_SHIFT)
#define CERT_FIND_CERT_ID (CERT_COMPARE_CERT_ID << CERT_COMPARE_SHIFT) #define CERT_FIND_CERT_ID (CERT_COMPARE_CERT_ID << CERT_COMPARE_SHIFT)
#define CERT_FIND_CROSS_CERT_DIST_POINTS \ #define CERT_FIND_CROSS_CERT_DIST_POINTS \
(CERT_COMPARE_CROSS_CERT_DIST_POINTS << CERT_COMPARE_SHIFT) (CERT_COMPARE_CROSS_CERT_DIST_POINTS << CERT_COMPARE_SHIFT)
#define CERT_FIND_PUBKEY_MD5_HASH \ #define CERT_FIND_PUBKEY_MD5_HASH \
(CERT_COMPARE_PUBKEY_MD5_HASH << CERT_COMPARE_SHIFT) (CERT_COMPARE_PUBKEY_MD5_HASH << CERT_COMPARE_SHIFT)
#define CERT_FIND_SUBJECT_INFO_ACCESS \
(CERT_COMPARE_SUBJECT_INFO_ACCESS << CERT_COMPARE_SHIFT)
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CERT_FIND_ANY // CERT_FIND_ANY
// //
// Find any certificate. // Find any certificate.
// //
// pvFindPara isn't used. // pvFindPara isn't used.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CERT_FIND_HASH // CERT_FIND_HASH
skipping to change at line 8755 skipping to change at line 10505
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CERT_FIND_CROSS_CERT_DIST_POINTS // CERT_FIND_CROSS_CERT_DIST_POINTS
// //
// Find a certificate having either a cross certificate distribution // Find a certificate having either a cross certificate distribution
// point extension or property. // point extension or property.
// //
// pvFindPara isn't used. // pvFindPara isn't used.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CERT_FIND_SUBJECT_INFO_ACCESS
//
// Find a certificate having either a SubjectInfoAccess extension or
// property.
//
// pvFindPara isn't used.
//--------------------------------------------------------------------------
//+-------------------------------------------------------------------------
// Get the certificate context from the store for the first or next issuer // Get the certificate context from the store for the first or next issuer
// of the specified subject certificate. Perform the enabled // of the specified subject certificate. Perform the enabled
// verification checks on the subject. (Note, the checks are on the subject // verification checks on the subject. (Note, the checks are on the subject
// using the returned issuer certificate.) // using the returned issuer certificate.)
// //
// If the first or next issuer certificate isn't found, NULL is returned. // If the first or next issuer certificate isn't found, NULL is returned.
// Otherwise, a pointer to a read only CERT_CONTEXT is returned. CERT_CONTEXT // Otherwise, a pointer to a read only CERT_CONTEXT is returned. CERT_CONTEXT
// must be freed by calling CertFreeCertificateContext or is freed when passed as the // must be freed by calling CertFreeCertificateContext or is freed when passed as the
// pPrevIssuerContext on a subsequent call. CertDuplicateCertificateContext // pPrevIssuerContext on a subsequent call. CertDuplicateCertificateContext
// can be called to make a duplicate. // can be called to make a duplicate.
skipping to change at line 8812 skipping to change at line 10571
// CERT_STORE_NO_ISSUER_FLAG is set if it doesn't have an issuer certificate // CERT_STORE_NO_ISSUER_FLAG is set if it doesn't have an issuer certificate
// in the store. // in the store.
// //
// For a verification check failure, a pointer to the issuer's CERT_CONTEXT // For a verification check failure, a pointer to the issuer's CERT_CONTEXT
// is still returned and SetLastError isn't updated. // is still returned and SetLastError isn't updated.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCERT_CONTEXT PCCERT_CONTEXT
WINAPI WINAPI
CertGetIssuerCertificateFromStore( CertGetIssuerCertificateFromStore(
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN PCCERT_CONTEXT pSubjectContext, __in PCCERT_CONTEXT pSubjectContext,
IN OPTIONAL PCCERT_CONTEXT pPrevIssuerContext, __in_opt PCCERT_CONTEXT pPrevIssuerContext,
IN OUT DWORD *pdwFlags __inout DWORD *pdwFlags
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Perform the enabled verification checks on the subject certificate // Perform the enabled verification checks on the subject certificate
// using the issuer. Same checks and flags definitions as for the above // using the issuer. Same checks and flags definitions as for the above
// CertGetIssuerCertificateFromStore. // CertGetIssuerCertificateFromStore.
// //
// If you are only checking CERT_STORE_TIME_VALIDITY_FLAG, then, the // If you are only checking CERT_STORE_TIME_VALIDITY_FLAG, then, the
// issuer can be NULL. // issuer can be NULL.
// //
// For a verification check failure, SUCCESS is still returned. // For a verification check failure, SUCCESS is still returned.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertVerifySubjectCertificateContext( CertVerifySubjectCertificateContext(
IN PCCERT_CONTEXT pSubject, __in PCCERT_CONTEXT pSubject,
IN OPTIONAL PCCERT_CONTEXT pIssuer, __in_opt PCCERT_CONTEXT pIssuer,
IN OUT DWORD *pdwFlags __inout DWORD *pdwFlags
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Duplicate a certificate context // Duplicate a certificate context
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCERT_CONTEXT PCCERT_CONTEXT
WINAPI WINAPI
CertDuplicateCertificateContext( CertDuplicateCertificateContext(
IN PCCERT_CONTEXT pCertContext __in_opt PCCERT_CONTEXT pCertContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Create a certificate context from the encoded certificate. The created // Create a certificate context from the encoded certificate. The created
// context isn't put in a store. // context isn't put in a store.
// //
// Makes a copy of the encoded certificate in the created context. // Makes a copy of the encoded certificate in the created context.
// //
// If unable to decode and create the certificate context, NULL is returned. // If unable to decode and create the certificate context, NULL is returned.
// Otherwise, a pointer to a read only CERT_CONTEXT is returned. // Otherwise, a pointer to a read only CERT_CONTEXT is returned.
// CERT_CONTEXT must be freed by calling CertFreeCertificateContext. // CERT_CONTEXT must be freed by calling CertFreeCertificateContext.
// CertDuplicateCertificateContext can be called to make a duplicate. // CertDuplicateCertificateContext can be called to make a duplicate.
// //
// CertSetCertificateContextProperty and CertGetCertificateContextProperty can be called // CertSetCertificateContextProperty and CertGetCertificateContextProperty can be called
// to store properties for the certificate. // to store properties for the certificate.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCERT_CONTEXT PCCERT_CONTEXT
WINAPI WINAPI
CertCreateCertificateContext( CertCreateCertificateContext(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN const BYTE *pbCertEncoded, __in_bcount(cbCertEncoded) const BYTE *pbCertEncoded,
IN DWORD cbCertEncoded __in DWORD cbCertEncoded
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Free a certificate context // Free a certificate context
// //
// There needs to be a corresponding free for each context obtained by a // There needs to be a corresponding free for each context obtained by a
// get, find, duplicate or create. // get, find, duplicate or create.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertFreeCertificateContext( CertFreeCertificateContext(
IN PCCERT_CONTEXT pCertContext __in_opt PCCERT_CONTEXT pCertContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Set the property for the specified certificate context. // Set the property for the specified certificate context.
// //
// The type definition for pvData depends on the dwPropId value. There are // The type definition for pvData depends on the dwPropId value. There are
// five predefined types: // five predefined types:
// CERT_KEY_PROV_HANDLE_PROP_ID - a HCRYPTPROV for the certificate's // CERT_KEY_PROV_HANDLE_PROP_ID - a HCRYPTPROV for the certificate's
// private key is passed in pvData. Updates the hCryptProv field // private key is passed in pvData. Updates the hCryptProv field
// of the CERT_KEY_CONTEXT_PROP_ID. If the CERT_KEY_CONTEXT_PROP_ID // of the CERT_KEY_CONTEXT_PROP_ID. If the CERT_KEY_CONTEXT_PROP_ID
// doesn't exist, its created with all the other fields zeroed out. If // doesn't exist, its created with all the other fields zeroed out. If
// CERT_STORE_NO_CRYPT_RELEASE_FLAG isn't set, HCRYPTPROV is implicitly // CERT_STORE_NO_CRYPT_RELEASE_FLAG isn't set, HCRYPTPROV is implicitly
// released when either the property is set to NULL or on the final // released when either the property is set to NULL or on the final
// free of the CertContext. // free of the CertContext.
// //
// CERT_NCRYPT_KEY_HANDLE_PROP_ID - a NCRYPT_KEY_HANDLE for the
// certificate's private key is passed in pvData. The dwKeySpec is
// set to CERT_NCRYPT_KEY_SPEC.
//
// CERT_HCRYPTPROV_OR_NCRYPT_KEY_HANDLE_PROP_ID - a
// HCRYPTPROV_OR_NCRYPT_KEY_HANDLE for the certificates's private
// key is passed in pvData. NCryptIsKeyHandle()
// is called to determine if this is a CNG NCRYPT_KEY_HANDLE.
// For a NCRYPT_KEY_HANDLE does a CERT_NCRYPT_KEY_HANDLE_PROP_ID set.
// Otherwise, does a CERT_KEY_PROV_HANDLE_PROP_ID set.
//
// CERT_KEY_PROV_INFO_PROP_ID - a PCRYPT_KEY_PROV_INFO for the certificate' s // CERT_KEY_PROV_INFO_PROP_ID - a PCRYPT_KEY_PROV_INFO for the certificate' s
// private key is passed in pvData. // private key is passed in pvData.
// //
// CERT_SHA1_HASH_PROP_ID - // CERT_SHA1_HASH_PROP_ID -
// CERT_MD5_HASH_PROP_ID - // CERT_MD5_HASH_PROP_ID -
// CERT_SIGNATURE_HASH_PROP_ID - normally, a hash property is implicitly // CERT_SIGNATURE_HASH_PROP_ID - normally, a hash property is implicitly
// set by doing a CertGetCertificateContextProperty. pvData points to a // set by doing a CertGetCertificateContextProperty. pvData points to a
// CRYPT_HASH_BLOB. // CRYPT_HASH_BLOB.
// //
// CERT_KEY_CONTEXT_PROP_ID - a PCERT_KEY_CONTEXT for the certificate's // CERT_KEY_CONTEXT_PROP_ID - a PCERT_KEY_CONTEXT for the certificate's
// private key is passed in pvData. The CERT_KEY_CONTEXT contains both the // private key is passed in pvData. The CERT_KEY_CONTEXT contains both the
// hCryptProv and dwKeySpec for the private key. // hCryptProv and dwKeySpec for the private key. A dwKeySpec of
// CERT_NCRYPT_KEY_SPEC selects the hNCryptKey choice.
// See the CERT_KEY_PROV_HANDLE_PROP_ID for more information about // See the CERT_KEY_PROV_HANDLE_PROP_ID for more information about
// the hCryptProv field and dwFlags settings. Note, more fields may // the hCryptProv field and dwFlags settings. Note, more fields may
// be added for this property. The cbSize field value will be adjusted // be added for this property. The cbSize field value will be adjusted
// accordingly. // accordingly.
// //
// CERT_KEY_SPEC_PROP_ID - the dwKeySpec for the private key. pvData // CERT_KEY_SPEC_PROP_ID - the dwKeySpec for the private key. pvData
// points to a DWORD containing the KeySpec // points to a DWORD containing the KeySpec
// //
// CERT_ENHKEY_USAGE_PROP_ID - enhanced key usage definition for the // CERT_ENHKEY_USAGE_PROP_ID - enhanced key usage definition for the
// certificate. pvData points to a CRYPT_DATA_BLOB containing an // certificate. pvData points to a CRYPT_DATA_BLOB containing an
skipping to change at line 8971 skipping to change at line 10742
// followed by CAName string with null-terminator, // followed by CAName string with null-terminator,
// next 4 bytes - FriendlyName size in characters including null-terminator // next 4 bytes - FriendlyName size in characters including null-terminator
// followed by FriendlyName string with null-terminator. // followed by FriendlyName string with null-terminator.
// //
// CERT_DATE_STAMP_PROP_ID - contains the time when added to the store // CERT_DATE_STAMP_PROP_ID - contains the time when added to the store
// by an admin tool. pvData points to a CRYPT_DATA_BLOB containing // by an admin tool. pvData points to a CRYPT_DATA_BLOB containing
// the FILETIME. // the FILETIME.
// //
// CERT_RENEWAL_PROP_ID - contains the hash of renewed certificate // CERT_RENEWAL_PROP_ID - contains the hash of renewed certificate
// //
// CERT_OCSP_RESPONSE_PROP_ID - contains the encoded OCSP response.
// CryptDecodeObject/CryptEncodeObject using
// lpszStructType = OCSP_RESPONSE.
// pvData points to a CRYPT_DATA_BLOB containing the encoded OCSP response.
// If this property is present, CertVerifyRevocation() will first attempt
// to use before doing an URL retrieval.
//
// CERT_SOURCE_LOCATION_PROP_ID - contains source location of the CRL or
// OCSP. pvData points to a CRYPT_DATA_BLOB. pbData is a pointer to a NULL
// terminated unicode, wide character string. Where,
// cbData = (wcslen((LPWSTR) pbData) + 1) * sizeof(WCHAR).
//
// CERT_SOURCE_URL_PROP_ID - contains URL for the CRL or OCSP. pvData
// is the same as for CERT_SOURCE_LOCATION_PROP_ID.
//
// For all the other PROP_IDs: an encoded PCRYPT_DATA_BLOB is passed in pvData. // For all the other PROP_IDs: an encoded PCRYPT_DATA_BLOB is passed in pvData.
// //
// If the property already exists, then, the old value is deleted and silently // If the property already exists, then, the old value is deleted and silently
// replaced. Setting, pvData to NULL, deletes the property. // replaced. Setting, pvData to NULL, deletes the property.
// //
// CERT_SET_PROPERTY_IGNORE_PERSIST_ERROR_FLAG can be set to ignore any // CERT_SET_PROPERTY_IGNORE_PERSIST_ERROR_FLAG can be set to ignore any
// provider write errors and always update the cached context's property. // provider write errors and always update the cached context's property.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertSetCertificateContextProperty( CertSetCertificateContextProperty(
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN DWORD dwPropId, __in DWORD dwPropId,
IN DWORD dwFlags, __in DWORD dwFlags,
IN const void *pvData __in_opt const void *pvData
); );
// Set this flag to ignore any store provider write errors and always update // Set this flag to ignore any store provider write errors and always update
// the cached context's property // the cached context's property
#define CERT_SET_PROPERTY_IGNORE_PERSIST_ERROR_FLAG 0x80000000 #define CERT_SET_PROPERTY_IGNORE_PERSIST_ERROR_FLAG 0x80000000
// Set this flag to inhibit the persisting of this property // Set this flag to inhibit the persisting of this property
#define CERT_SET_PROPERTY_INHIBIT_PERSIST_FLAG 0x40000000 #define CERT_SET_PROPERTY_INHIBIT_PERSIST_FLAG 0x40000000
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Get the property for the specified certificate context. // Get the property for the specified certificate context.
// //
// For CERT_KEY_PROV_HANDLE_PROP_ID, pvData points to a HCRYPTPROV. // For CERT_KEY_PROV_HANDLE_PROP_ID, pvData points to a HCRYPTPROV.
// The CERT_NCRYPT_KEY_SPEC NCRYPT_KEY_HANDLE choice isn't returned.
//
// For CERT_NCRYPT_KEY_HANDLE_PROP_ID, pvData points to a NCRYPT_KEY_HANDLE.
// Only returned for the CERT_NCRYPT_KEY_SPEC choice.
//
// For CERT_HCRYPTPROV_OR_NCRYPT_KEY_HANDLE_PROP_ID, pvData points to a
// HCRYPTPROV_OR_NCRYPT_KEY_HANDLE. Returns either the HCRYPTPROV or
// NCRYPT_KEY_HANDLE choice.
// //
// For CERT_KEY_PROV_INFO_PROP_ID, pvData points to a CRYPT_KEY_PROV_INFO struc ture. // For CERT_KEY_PROV_INFO_PROP_ID, pvData points to a CRYPT_KEY_PROV_INFO struc ture.
// Elements pointed to by fields in the pvData structure follow the // Elements pointed to by fields in the pvData structure follow the
// structure. Therefore, *pcbData may exceed the size of the structure. // structure. Therefore, *pcbData may exceed the size of the structure.
// //
// For CERT_KEY_CONTEXT_PROP_ID, pvData points to a CERT_KEY_CONTEXT structure. // For CERT_KEY_CONTEXT_PROP_ID, pvData points to a CERT_KEY_CONTEXT structure.
// //
// For CERT_KEY_SPEC_PROP_ID, pvData points to a DWORD containing the KeySpec. // For CERT_KEY_SPEC_PROP_ID, pvData points to a DWORD containing the KeySpec.
// If the CERT_KEY_CONTEXT_PROP_ID exists, the KeySpec is obtained from there. // If the CERT_KEY_CONTEXT_PROP_ID exists, the KeySpec is obtained from there.
// Otherwise, if the CERT_KEY_PROV_INFO_PROP_ID exists, its the source // Otherwise, if the CERT_KEY_PROV_INFO_PROP_ID exists, its the source
// of the KeySpec. // of the KeySpec. CERT_NCRYPT_KEY_SPEC is returned if the
// CERT_NCRYPT_KEY_HANDLE_PROP_ID has been set.
// //
// For CERT_SHA1_HASH_PROP_ID or CERT_MD5_HASH_PROP_ID, if the hash // For CERT_SHA1_HASH_PROP_ID or CERT_MD5_HASH_PROP_ID, if the hash
// doesn't already exist, then, its computed via CryptHashCertificate() // doesn't already exist, then, its computed via CryptHashCertificate()
// and then set. pvData points to the computed hash. Normally, the length // and then set. pvData points to the computed hash. Normally, the length
// is 20 bytes for SHA and 16 for MD5. // is 20 bytes for SHA and 16 for MD5.
// //
// For CERT_SIGNATURE_HASH_PROP_ID, if the hash // For CERT_SIGNATURE_HASH_PROP_ID, if the hash
// doesn't already exist, then, its computed via CryptHashToBeSigned() // doesn't already exist, then, its computed via CryptHashToBeSigned()
// and then set. pvData points to the computed hash. Normally, the length // and then set. pvData points to the computed hash. Normally, the length
// is 20 bytes for SHA and 16 for MD5. // is 20 bytes for SHA and 16 for MD5.
skipping to change at line 9040 skipping to change at line 10835
// points to the key identifier bytes. Normally, the length is 20 bytes. // points to the key identifier bytes. Normally, the length is 20 bytes.
// //
// For CERT_PUBKEY_ALG_PARA_PROP_ID, pvPara points to the ASN.1 encoded // For CERT_PUBKEY_ALG_PARA_PROP_ID, pvPara points to the ASN.1 encoded
// PublicKey Algorithm Parameters. This property will only be set // PublicKey Algorithm Parameters. This property will only be set
// for public keys supporting algorithm parameter inheritance and when the // for public keys supporting algorithm parameter inheritance and when the
// parameters have been omitted from the encoded and signed certificate. // parameters have been omitted from the encoded and signed certificate.
// //
// For CERT_DATE_STAMP_PROP_ID, pvPara points to a FILETIME updated by // For CERT_DATE_STAMP_PROP_ID, pvPara points to a FILETIME updated by
// an admin tool to indicate when the certificate was added to the store. // an admin tool to indicate when the certificate was added to the store.
// //
// For CERT_OCSP_RESPONSE_PROP_ID, pvPara points to an encoded OCSP response.
//
// For CERT_SOURCE_LOCATION_PROP_ID and CERT_SOURCE_URL_PROP_ID,
// pvPara points to a NULL terminated unicode, wide character string.
//
// For all other PROP_IDs, pvData points to an encoded array of bytes. // For all other PROP_IDs, pvData points to an encoded array of bytes.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertGetCertificateContextProperty( CertGetCertificateContextProperty(
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN DWORD dwPropId, __in DWORD dwPropId,
OUT void *pvData, __out_bcount_part_opt(*pcbData, *pcbData) void *pvData,
IN OUT DWORD *pcbData __inout DWORD *pcbData
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Enumerate the properties for the specified certificate context. // Enumerate the properties for the specified certificate context.
// //
// To get the first property, set dwPropId to 0. The ID of the first // To get the first property, set dwPropId to 0. The ID of the first
// property is returned. To get the next property, set dwPropId to the // property is returned. To get the next property, set dwPropId to the
// ID returned by the last call. To enumerate all the properties continue // ID returned by the last call. To enumerate all the properties continue
// until 0 is returned. // until 0 is returned.
// //
// CertGetCertificateContextProperty is called to get the property's data. // CertGetCertificateContextProperty is called to get the property's data.
// //
// Note, since, the CERT_KEY_PROV_HANDLE_PROP_ID and CERT_KEY_SPEC_PROP_ID // Note, since, the CERT_KEY_PROV_HANDLE_PROP_ID and CERT_KEY_SPEC_PROP_ID
// properties are stored as fields in the CERT_KEY_CONTEXT_PROP_ID // properties are stored as fields in the CERT_KEY_CONTEXT_PROP_ID
// property, they aren't enumerated individually. // property, they aren't enumerated individually.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
DWORD DWORD
WINAPI WINAPI
CertEnumCertificateContextProperties( CertEnumCertificateContextProperties(
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN DWORD dwPropId __in DWORD dwPropId
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Creates a CTL entry whose attributes are the certificate context's // Creates a CTL entry whose attributes are the certificate context's
// properties. // properties.
// //
// The SubjectIdentifier in the CTL entry is the SHA1 hash of the certificate. // The SubjectIdentifier in the CTL entry is the SHA1 hash of the certificate.
// //
// The certificate properties are added as attributes. The property attribute // The certificate properties are added as attributes. The property attribute
// OID is the decimal PROP_ID preceded by szOID_CERT_PROP_ID_PREFIX. Each // OID is the decimal PROP_ID preceded by szOID_CERT_PROP_ID_PREFIX. Each
skipping to change at line 9094 skipping to change at line 10894
// Any additional attributes to be included in the CTL entry can be passed // Any additional attributes to be included in the CTL entry can be passed
// in via the cOptAttr and rgOptAttr parameters. // in via the cOptAttr and rgOptAttr parameters.
// //
// CTL_ENTRY_FROM_PROP_CHAIN_FLAG can be set in dwFlags, to force the // CTL_ENTRY_FROM_PROP_CHAIN_FLAG can be set in dwFlags, to force the
// inclusion of the chain building hash properties as attributes. // inclusion of the chain building hash properties as attributes.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertCreateCTLEntryFromCertificateContextProperties( CertCreateCTLEntryFromCertificateContextProperties(
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN DWORD cOptAttr, __in DWORD cOptAttr,
IN OPTIONAL PCRYPT_ATTRIBUTE rgOptAttr, __in_ecount_opt(cOptAttr) PCRYPT_ATTRIBUTE rgOptAttr,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL void *pvReserved, __reserved void *pvReserved,
OUT OPTIONAL PCTL_ENTRY pCtlEntry, __out_bcount_part_opt(*pcbCtlEntry, *pcbCtlEntry) PCTL_ENTRY pCtlEntry,
IN OUT DWORD *pcbCtlEntry __inout DWORD *pcbCtlEntry
); );
// Set this flag to get and include the chain building hash properties // Set this flag to get and include the chain building hash properties
// as attributes in the CTL entry // as attributes in the CTL entry
#define CTL_ENTRY_FROM_PROP_CHAIN_FLAG 0x1 #define CTL_ENTRY_FROM_PROP_CHAIN_FLAG 0x1
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Sets properties on the certificate context using the attributes in // Sets properties on the certificate context using the attributes in
// the CTL entry. // the CTL entry.
// //
// The property attribute OID is the decimal PROP_ID preceded by // The property attribute OID is the decimal PROP_ID preceded by
// szOID_CERT_PROP_ID_PREFIX. Only attributes containing such an OID are // szOID_CERT_PROP_ID_PREFIX. Only attributes containing such an OID are
// copied. // copied.
// //
// CERT_SET_PROPERTY_IGNORE_PERSIST_ERROR_FLAG may be set in dwFlags. // CERT_SET_PROPERTY_IGNORE_PERSIST_ERROR_FLAG may be set in dwFlags.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertSetCertificateContextPropertiesFromCTLEntry( CertSetCertificateContextPropertiesFromCTLEntry(
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN PCTL_ENTRY pCtlEntry, __in PCTL_ENTRY pCtlEntry,
IN DWORD dwFlags __in DWORD dwFlags
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Get the first or next CRL context from the store for the specified // Get the first or next CRL context from the store for the specified
// issuer certificate. Perform the enabled verification checks on the CRL. // issuer certificate. Perform the enabled verification checks on the CRL.
// //
// If the first or next CRL isn't found, NULL is returned. // If the first or next CRL isn't found, NULL is returned.
// Otherwise, a pointer to a read only CRL_CONTEXT is returned. CRL_CONTEXT // Otherwise, a pointer to a read only CRL_CONTEXT is returned. CRL_CONTEXT
// must be freed by calling CertFreeCRLContext. However, the free must be // must be freed by calling CertFreeCRLContext. However, the free must be
// pPrevCrlContext on a subsequent call. CertDuplicateCRLContext // pPrevCrlContext on a subsequent call. CertDuplicateCRLContext
skipping to change at line 9182 skipping to change at line 10982
// If pIssuerContext == NULL, then, an enabled CERT_STORE_SIGNATURE_FLAG // If pIssuerContext == NULL, then, an enabled CERT_STORE_SIGNATURE_FLAG
// always fails and the CERT_STORE_NO_ISSUER_FLAG is also set. // always fails and the CERT_STORE_NO_ISSUER_FLAG is also set.
// //
// For a verification check failure, a pointer to the first or next // For a verification check failure, a pointer to the first or next
// CRL_CONTEXT is still returned and SetLastError isn't updated. // CRL_CONTEXT is still returned and SetLastError isn't updated.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCRL_CONTEXT PCCRL_CONTEXT
WINAPI WINAPI
CertGetCRLFromStore( CertGetCRLFromStore(
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN OPTIONAL PCCERT_CONTEXT pIssuerContext, __in_opt PCCERT_CONTEXT pIssuerContext,
IN PCCRL_CONTEXT pPrevCrlContext, __in_opt PCCRL_CONTEXT pPrevCrlContext,
IN OUT DWORD *pdwFlags __inout DWORD *pdwFlags
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Enumerate the CRL contexts in the store. // Enumerate the CRL contexts in the store.
// //
// If a CRL isn't found, NULL is returned. // If a CRL isn't found, NULL is returned.
// Otherwise, a pointer to a read only CRL_CONTEXT is returned. CRL_CONTEXT // Otherwise, a pointer to a read only CRL_CONTEXT is returned. CRL_CONTEXT
// must be freed by calling CertFreeCRLContext or is freed when passed as the // must be freed by calling CertFreeCRLContext or is freed when passed as the
// pPrevCrlContext on a subsequent call. CertDuplicateCRLContext // pPrevCrlContext on a subsequent call. CertDuplicateCRLContext
// can be called to make a duplicate. // can be called to make a duplicate.
skipping to change at line 9208 skipping to change at line 11008
// CRL in the store. Successive CRLs are enumerated by setting // CRL in the store. Successive CRLs are enumerated by setting
// pPrevCrlContext to the CRL_CONTEXT returned by a previous call. // pPrevCrlContext to the CRL_CONTEXT returned by a previous call.
// //
// NOTE: a NON-NULL pPrevCrlContext is always CertFreeCRLContext'ed by // NOTE: a NON-NULL pPrevCrlContext is always CertFreeCRLContext'ed by
// this function, even for an error. // this function, even for an error.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCRL_CONTEXT PCCRL_CONTEXT
WINAPI WINAPI
CertEnumCRLsInStore( CertEnumCRLsInStore(
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN PCCRL_CONTEXT pPrevCrlContext __in_opt PCCRL_CONTEXT pPrevCrlContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Find the first or next CRL context in the store. // Find the first or next CRL context in the store.
// //
// The CRL is found according to the dwFindType and its pvFindPara. // The CRL is found according to the dwFindType and its pvFindPara.
// See below for a list of the find types and its parameters. // See below for a list of the find types and its parameters.
// //
// Currently dwFindFlags isn't used and must be set to 0. // Currently dwFindFlags isn't used and must be set to 0.
// //
skipping to change at line 9239 skipping to change at line 11039
// call to find the CRL. To find the next CRL, the // call to find the CRL. To find the next CRL, the
// pPrevCrlContext is set to the CRL_CONTEXT returned by a previous call. // pPrevCrlContext is set to the CRL_CONTEXT returned by a previous call.
// //
// NOTE: a NON-NULL pPrevCrlContext is always CertFreeCRLContext'ed by // NOTE: a NON-NULL pPrevCrlContext is always CertFreeCRLContext'ed by
// this function, even for an error. // this function, even for an error.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCRL_CONTEXT PCCRL_CONTEXT
WINAPI WINAPI
CertFindCRLInStore( CertFindCRLInStore(
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN DWORD dwFindFlags, __in DWORD dwFindFlags,
IN DWORD dwFindType, __in DWORD dwFindType,
IN const void *pvFindPara, __in_opt const void *pvFindPara,
IN PCCRL_CONTEXT pPrevCrlContext __in_opt PCCRL_CONTEXT pPrevCrlContext
); );
#define CRL_FIND_ANY 0 #define CRL_FIND_ANY 0
#define CRL_FIND_ISSUED_BY 1 #define CRL_FIND_ISSUED_BY 1
#define CRL_FIND_EXISTING 2 #define CRL_FIND_EXISTING 2
#define CRL_FIND_ISSUED_FOR 3 #define CRL_FIND_ISSUED_FOR 3
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CRL_FIND_ANY // CRL_FIND_ANY
// //
skipping to change at line 9332 skipping to change at line 11132
PCCERT_CONTEXT pIssuerCert; PCCERT_CONTEXT pIssuerCert;
} CRL_FIND_ISSUED_FOR_PARA, *PCRL_FIND_ISSUED_FOR_PARA; } CRL_FIND_ISSUED_FOR_PARA, *PCRL_FIND_ISSUED_FOR_PARA;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Duplicate a CRL context // Duplicate a CRL context
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCRL_CONTEXT PCCRL_CONTEXT
WINAPI WINAPI
CertDuplicateCRLContext( CertDuplicateCRLContext(
IN PCCRL_CONTEXT pCrlContext __in_opt PCCRL_CONTEXT pCrlContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Create a CRL context from the encoded CRL. The created // Create a CRL context from the encoded CRL. The created
// context isn't put in a store. // context isn't put in a store.
// //
// Makes a copy of the encoded CRL in the created context. // Makes a copy of the encoded CRL in the created context.
// //
// If unable to decode and create the CRL context, NULL is returned. // If unable to decode and create the CRL context, NULL is returned.
// Otherwise, a pointer to a read only CRL_CONTEXT is returned. // Otherwise, a pointer to a read only CRL_CONTEXT is returned.
// CRL_CONTEXT must be freed by calling CertFreeCRLContext. // CRL_CONTEXT must be freed by calling CertFreeCRLContext.
// CertDuplicateCRLContext can be called to make a duplicate. // CertDuplicateCRLContext can be called to make a duplicate.
// //
// CertSetCRLContextProperty and CertGetCRLContextProperty can be called // CertSetCRLContextProperty and CertGetCRLContextProperty can be called
// to store properties for the CRL. // to store properties for the CRL.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCRL_CONTEXT PCCRL_CONTEXT
WINAPI WINAPI
CertCreateCRLContext( CertCreateCRLContext(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN const BYTE *pbCrlEncoded, __in_bcount(cbCrlEncoded) const BYTE *pbCrlEncoded,
IN DWORD cbCrlEncoded __in DWORD cbCrlEncoded
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Free a CRL context // Free a CRL context
// //
// There needs to be a corresponding free for each context obtained by a // There needs to be a corresponding free for each context obtained by a
// get, duplicate or create. // get, duplicate or create.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertFreeCRLContext( CertFreeCRLContext(
IN PCCRL_CONTEXT pCrlContext __in_opt PCCRL_CONTEXT pCrlContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Set the property for the specified CRL context. // Set the property for the specified CRL context.
// //
// Same Property Ids and semantics as CertSetCertificateContextProperty. // Same Property Ids and semantics as CertSetCertificateContextProperty.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertSetCRLContextProperty( CertSetCRLContextProperty(
IN PCCRL_CONTEXT pCrlContext, __in PCCRL_CONTEXT pCrlContext,
IN DWORD dwPropId, __in DWORD dwPropId,
IN DWORD dwFlags, __in DWORD dwFlags,
IN const void *pvData __in_opt const void *pvData
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Get the property for the specified CRL context. // Get the property for the specified CRL context.
// //
// Same Property Ids and semantics as CertGetCertificateContextProperty. // Same Property Ids and semantics as CertGetCertificateContextProperty.
// //
// CERT_SHA1_HASH_PROP_ID, CERT_MD5_HASH_PROP_ID or // CERT_SHA1_HASH_PROP_ID, CERT_MD5_HASH_PROP_ID or
// CERT_SIGNATURE_HASH_PROP_ID is the predefined property of most interest. // CERT_SIGNATURE_HASH_PROP_ID is the predefined property of most interest.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertGetCRLContextProperty( CertGetCRLContextProperty(
IN PCCRL_CONTEXT pCrlContext, __in PCCRL_CONTEXT pCrlContext,
IN DWORD dwPropId, __in DWORD dwPropId,
OUT void *pvData, __out_bcount_part_opt(*pcbData, *pcbData) void *pvData,
IN OUT DWORD *pcbData __inout DWORD *pcbData
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Enumerate the properties for the specified CRL context. // Enumerate the properties for the specified CRL context.
// //
// To get the first property, set dwPropId to 0. The ID of the first // To get the first property, set dwPropId to 0. The ID of the first
// property is returned. To get the next property, set dwPropId to the // property is returned. To get the next property, set dwPropId to the
// ID returned by the last call. To enumerate all the properties continue // ID returned by the last call. To enumerate all the properties continue
// until 0 is returned. // until 0 is returned.
// //
// CertGetCRLContextProperty is called to get the property's data. // CertGetCRLContextProperty is called to get the property's data.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
DWORD DWORD
WINAPI WINAPI
CertEnumCRLContextProperties( CertEnumCRLContextProperties(
IN PCCRL_CONTEXT pCrlContext, __in PCCRL_CONTEXT pCrlContext,
IN DWORD dwPropId __in DWORD dwPropId
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Search the CRL's list of entries for the specified certificate. // Search the CRL's list of entries for the specified certificate.
// //
// TRUE is returned if we were able to search the list. Otherwise, FALSE is // TRUE is returned if we were able to search the list. Otherwise, FALSE is
// returned, // returned,
// //
// For success, if the certificate was found in the list, *ppCrlEntry is // For success, if the certificate was found in the list, *ppCrlEntry is
// updated with a pointer to the entry. Otherwise, *ppCrlEntry is set to NULL. // updated with a pointer to the entry. Otherwise, *ppCrlEntry is set to NULL.
// The returned entry isn't allocated and must not be freed. // The returned entry isn't allocated and must not be freed.
// //
// dwFlags and pvReserved currently aren't used and must be set to 0 or NULL. // dwFlags and pvReserved currently aren't used and must be set to 0 or NULL.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertFindCertificateInCRL( CertFindCertificateInCRL(
IN PCCERT_CONTEXT pCert, __in PCCERT_CONTEXT pCert,
IN PCCRL_CONTEXT pCrlContext, __in PCCRL_CONTEXT pCrlContext,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL void *pvReserved, __reserved void *pvReserved,
OUT PCRL_ENTRY *ppCrlEntry __deref_out_opt PCRL_ENTRY *ppCrlEntry
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Is the specified CRL valid for the certificate. // Is the specified CRL valid for the certificate.
// //
// Returns TRUE if the CRL's list of entries would contain the certificate // Returns TRUE if the CRL's list of entries would contain the certificate
// if it was revoked. Note, doesn't check that the certificate is in the // if it was revoked. Note, doesn't check that the certificate is in the
// list of entries. // list of entries.
// //
// If the CRL has an Issuing Distribution Point (IDP) extension, checks // If the CRL has an Issuing Distribution Point (IDP) extension, checks
// that it's valid for the subject certificate. // that it's valid for the subject certificate.
// //
// dwFlags and pvReserved currently aren't used and must be set to 0 and NULL. // dwFlags and pvReserved currently aren't used and must be set to 0 and NULL.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertIsValidCRLForCertificate( CertIsValidCRLForCertificate(
IN PCCERT_CONTEXT pCert, __in PCCERT_CONTEXT pCert,
IN PCCRL_CONTEXT pCrl, __in PCCRL_CONTEXT pCrl,
IN DWORD dwFlags, __in DWORD dwFlags,
IN void *pvReserved __reserved void *pvReserved
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Add certificate/CRL, encoded, context or element disposition values. // Add certificate/CRL, encoded, context or element disposition values.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CERT_STORE_ADD_NEW 1 #define CERT_STORE_ADD_NEW 1
#define CERT_STORE_ADD_USE_EXISTING 2 #define CERT_STORE_ADD_USE_EXISTING 2
#define CERT_STORE_ADD_REPLACE_EXISTING 3 #define CERT_STORE_ADD_REPLACE_EXISTING 3
#define CERT_STORE_ADD_ALWAYS 4 #define CERT_STORE_ADD_ALWAYS 4
#define CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES 5 #define CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES 5
skipping to change at line 9524 skipping to change at line 11324
// Same as CERT_STORE_ADD_NEWER. However, if an older certificate is // Same as CERT_STORE_ADD_NEWER. However, if an older certificate is
// replaced, same as CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES. // replaced, same as CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES.
// //
// CertGetSubjectCertificateFromStore is called to determine if the // CertGetSubjectCertificateFromStore is called to determine if the
// certificate already exists in the store. // certificate already exists in the store.
// //
// ppCertContext can be NULL, indicating the caller isn't interested // ppCertContext can be NULL, indicating the caller isn't interested
// in getting the CERT_CONTEXT of the added or existing certificate. // in getting the CERT_CONTEXT of the added or existing certificate.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CertAddEncodedCertificateToStore( CertAddEncodedCertificateToStore(
IN HCERTSTORE hCertStore, __in_opt HCERTSTORE hCertStore,
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN const BYTE *pbCertEncoded, __in_bcount(cbCertEncoded) const BYTE *pbCertEncoded,
IN DWORD cbCertEncoded, __in DWORD cbCertEncoded,
IN DWORD dwAddDisposition, __in DWORD dwAddDisposition,
OUT OPTIONAL PCCERT_CONTEXT *ppCertContext __deref_opt_out PCCERT_CONTEXT *ppCertContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Add the certificate context to the store according to the specified // Add the certificate context to the store according to the specified
// disposition action. // disposition action.
// //
// In addition to the encoded certificate, the context's properties are // In addition to the encoded certificate, the context's properties are
// also copied. Note, the CERT_KEY_CONTEXT_PROP_ID property (and its // also copied. Note, the CERT_KEY_CONTEXT_PROP_ID property (and its
// CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_SPEC_PROP_ID) isn't copied. // CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_SPEC_PROP_ID) isn't copied.
// //
skipping to change at line 9593 skipping to change at line 11394
// Same as CERT_STORE_ADD_NEWER. However, if an older context is // Same as CERT_STORE_ADD_NEWER. However, if an older context is
// replaced, same as CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES. // replaced, same as CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES.
// //
// CertGetSubjectCertificateFromStore is called to determine if the // CertGetSubjectCertificateFromStore is called to determine if the
// certificate already exists in the store. // certificate already exists in the store.
// //
// ppStoreContext can be NULL, indicating the caller isn't interested // ppStoreContext can be NULL, indicating the caller isn't interested
// in getting the CERT_CONTEXT of the added or existing certificate. // in getting the CERT_CONTEXT of the added or existing certificate.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CertAddCertificateContextToStore( CertAddCertificateContextToStore(
IN HCERTSTORE hCertStore, __in_opt HCERTSTORE hCertStore,
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN DWORD dwAddDisposition, __in DWORD dwAddDisposition,
OUT OPTIONAL PCCERT_CONTEXT *ppStoreContext __deref_opt_out PCCERT_CONTEXT *ppStoreContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Certificate Store Context Types // Certificate Store Context Types
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CERT_STORE_CERTIFICATE_CONTEXT 1 #define CERT_STORE_CERTIFICATE_CONTEXT 1
#define CERT_STORE_CRL_CONTEXT 2 #define CERT_STORE_CRL_CONTEXT 2
#define CERT_STORE_CTL_CONTEXT 3 #define CERT_STORE_CTL_CONTEXT 3
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
skipping to change at line 9646 skipping to change at line 11448
// add either a certificate or CRL, set dwContextTypeFlags to: // add either a certificate or CRL, set dwContextTypeFlags to:
// CERT_STORE_CERTIFICATE_CONTEXT_FLAG | CERT_STORE_CRL_CONTEXT_FLAG // CERT_STORE_CERTIFICATE_CONTEXT_FLAG | CERT_STORE_CRL_CONTEXT_FLAG
// //
// *pdwContextType is updated with the type of the context returned in // *pdwContextType is updated with the type of the context returned in
// *ppvContxt. pdwContextType or ppvContext can be NULL, indicating the // *ppvContxt. pdwContextType or ppvContext can be NULL, indicating the
// caller isn't interested in getting the output. If *ppvContext is // caller isn't interested in getting the output. If *ppvContext is
// returned it must be freed by calling CertFreeCertificateContext or // returned it must be freed by calling CertFreeCertificateContext or
// CertFreeCRLContext. // CertFreeCRLContext.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CertAddSerializedElementToStore( CertAddSerializedElementToStore(
IN HCERTSTORE hCertStore, __in_opt HCERTSTORE hCertStore,
IN const BYTE *pbElement, __in_bcount(cbElement) const BYTE *pbElement,
IN DWORD cbElement, __in DWORD cbElement,
IN DWORD dwAddDisposition, __in DWORD dwAddDisposition,
IN DWORD dwFlags, __in DWORD dwFlags,
IN DWORD dwContextTypeFlags, __in DWORD dwContextTypeFlags,
OUT OPTIONAL DWORD *pdwContextType, __out_opt DWORD *pdwContextType,
OUT OPTIONAL const void **ppvContext __deref_opt_out const void **ppvContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Delete the specified certificate from the store. // Delete the specified certificate from the store.
// //
// All subsequent gets or finds for the certificate will fail. However, // All subsequent gets or finds for the certificate will fail. However,
// memory allocated for the certificate isn't freed until all of its contexts // memory allocated for the certificate isn't freed until all of its contexts
// have also been freed. // have also been freed.
// //
// The pCertContext is obtained from a get, enum, find or duplicate. // The pCertContext is obtained from a get, enum, find or duplicate.
skipping to change at line 9678 skipping to change at line 11481
// Some store provider implementations might also delete the issuer's CRLs // Some store provider implementations might also delete the issuer's CRLs
// if this is the last certificate for the issuer in the store. // if this is the last certificate for the issuer in the store.
// //
// NOTE: the pCertContext is always CertFreeCertificateContext'ed by // NOTE: the pCertContext is always CertFreeCertificateContext'ed by
// this function, even for an error. // this function, even for an error.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertDeleteCertificateFromStore( CertDeleteCertificateFromStore(
IN PCCERT_CONTEXT pCertContext __in PCCERT_CONTEXT pCertContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Add the encoded CRL to the store according to the specified // Add the encoded CRL to the store according to the specified
// disposition option. // disposition option.
// //
// Makes a copy of the encoded CRL before adding to the store. // Makes a copy of the encoded CRL before adding to the store.
// //
// dwAddDispostion specifies the action to take if the CRL // dwAddDispostion specifies the action to take if the CRL
// already exists in the store. See CertAddEncodedCertificateToStore for a // already exists in the store. See CertAddEncodedCertificateToStore for a
// list of and actions taken. // list of and actions taken.
// //
// Compares the CRL's Issuer to determine if the CRL already exists in the // Compares the CRL's Issuer to determine if the CRL already exists in the
// store. // store.
// //
// ppCrlContext can be NULL, indicating the caller isn't interested // ppCrlContext can be NULL, indicating the caller isn't interested
// in getting the CRL_CONTEXT of the added or existing CRL. // in getting the CRL_CONTEXT of the added or existing CRL.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CertAddEncodedCRLToStore( CertAddEncodedCRLToStore(
IN HCERTSTORE hCertStore, __in_opt HCERTSTORE hCertStore,
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN const BYTE *pbCrlEncoded, __in_bcount(cbCrlEncoded) const BYTE *pbCrlEncoded,
IN DWORD cbCrlEncoded, __in DWORD cbCrlEncoded,
IN DWORD dwAddDisposition, __in DWORD dwAddDisposition,
OUT OPTIONAL PCCRL_CONTEXT *ppCrlContext __deref_opt_out PCCRL_CONTEXT *ppCrlContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Add the CRL context to the store according to the specified // Add the CRL context to the store according to the specified
// disposition option. // disposition option.
// //
// In addition to the encoded CRL, the context's properties are // In addition to the encoded CRL, the context's properties are
// also copied. Note, the CERT_KEY_CONTEXT_PROP_ID property (and its // also copied. Note, the CERT_KEY_CONTEXT_PROP_ID property (and its
// CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_SPEC_PROP_ID) isn't copied. // CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_SPEC_PROP_ID) isn't copied.
// //
skipping to change at line 9730 skipping to change at line 11534
// already exists in the store. See CertAddCertificateContextToStore for a // already exists in the store. See CertAddCertificateContextToStore for a
// list of and actions taken. // list of and actions taken.
// //
// Compares the CRL's Issuer, ThisUpdate and NextUpdate to determine // Compares the CRL's Issuer, ThisUpdate and NextUpdate to determine
// if the CRL already exists in the store. // if the CRL already exists in the store.
// //
// ppStoreContext can be NULL, indicating the caller isn't interested // ppStoreContext can be NULL, indicating the caller isn't interested
// in getting the CRL_CONTEXT of the added or existing CRL. // in getting the CRL_CONTEXT of the added or existing CRL.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CertAddCRLContextToStore( CertAddCRLContextToStore(
IN HCERTSTORE hCertStore, __in_opt HCERTSTORE hCertStore,
IN PCCRL_CONTEXT pCrlContext, __in PCCRL_CONTEXT pCrlContext,
IN DWORD dwAddDisposition, __in DWORD dwAddDisposition,
OUT OPTIONAL PCCRL_CONTEXT *ppStoreContext __deref_opt_out PCCRL_CONTEXT *ppStoreContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Delete the specified CRL from the store. // Delete the specified CRL from the store.
// //
// All subsequent gets for the CRL will fail. However, // All subsequent gets for the CRL will fail. However,
// memory allocated for the CRL isn't freed until all of its contexts // memory allocated for the CRL isn't freed until all of its contexts
// have also been freed. // have also been freed.
// //
// The pCrlContext is obtained from a get or duplicate. // The pCrlContext is obtained from a get or duplicate.
// //
// NOTE: the pCrlContext is always CertFreeCRLContext'ed by // NOTE: the pCrlContext is always CertFreeCRLContext'ed by
// this function, even for an error. // this function, even for an error.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertDeleteCRLFromStore( CertDeleteCRLFromStore(
IN PCCRL_CONTEXT pCrlContext __in PCCRL_CONTEXT pCrlContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Serialize the certificate context's encoded certificate and its // Serialize the certificate context's encoded certificate and its
// properties. // properties.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertSerializeCertificateStoreElement( CertSerializeCertificateStoreElement(
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN DWORD dwFlags, __in DWORD dwFlags,
OUT BYTE *pbElement, __out_bcount_part_opt(*pcbElement, *pcbElement) BYTE *pbElement,
IN OUT DWORD *pcbElement __inout DWORD *pcbElement
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Serialize the CRL context's encoded CRL and its properties. // Serialize the CRL context's encoded CRL and its properties.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertSerializeCRLStoreElement( CertSerializeCRLStoreElement(
IN PCCRL_CONTEXT pCrlContext, __in PCCRL_CONTEXT pCrlContext,
IN DWORD dwFlags, __in DWORD dwFlags,
OUT BYTE *pbElement, __out_bcount_part_opt(*pcbElement, *pcbElement) BYTE *pbElement,
IN OUT DWORD *pcbElement __inout DWORD *pcbElement
); );
//+========================================================================= //+=========================================================================
// Certificate Trust List (CTL) Store Data Structures and APIs // Certificate Trust List (CTL) Store Data Structures and APIs
//========================================================================== //==========================================================================
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Duplicate a CTL context // Duplicate a CTL context
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCTL_CONTEXT PCCTL_CONTEXT
WINAPI WINAPI
CertDuplicateCTLContext( CertDuplicateCTLContext(
IN PCCTL_CONTEXT pCtlContext __in_opt PCCTL_CONTEXT pCtlContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Create a CTL context from the encoded CTL. The created // Create a CTL context from the encoded CTL. The created
// context isn't put in a store. // context isn't put in a store.
// //
// Makes a copy of the encoded CTL in the created context. // Makes a copy of the encoded CTL in the created context.
// //
// If unable to decode and create the CTL context, NULL is returned. // If unable to decode and create the CTL context, NULL is returned.
// Otherwise, a pointer to a read only CTL_CONTEXT is returned. // Otherwise, a pointer to a read only CTL_CONTEXT is returned.
// CTL_CONTEXT must be freed by calling CertFreeCTLContext. // CTL_CONTEXT must be freed by calling CertFreeCTLContext.
// CertDuplicateCTLContext can be called to make a duplicate. // CertDuplicateCTLContext can be called to make a duplicate.
// //
// CertSetCTLContextProperty and CertGetCTLContextProperty can be called // CertSetCTLContextProperty and CertGetCTLContextProperty can be called
// to store properties for the CTL. // to store properties for the CTL.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCTL_CONTEXT PCCTL_CONTEXT
WINAPI WINAPI
CertCreateCTLContext( CertCreateCTLContext(
IN DWORD dwMsgAndCertEncodingType, __in DWORD dwMsgAndCertEncodingType,
IN const BYTE *pbCtlEncoded, __in_bcount(cbCtlEncoded) const BYTE *pbCtlEncoded,
IN DWORD cbCtlEncoded __in DWORD cbCtlEncoded
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Free a CTL context // Free a CTL context
// //
// There needs to be a corresponding free for each context obtained by a // There needs to be a corresponding free for each context obtained by a
// get, duplicate or create. // get, duplicate or create.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertFreeCTLContext( CertFreeCTLContext(
IN PCCTL_CONTEXT pCtlContext __in_opt PCCTL_CONTEXT pCtlContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Set the property for the specified CTL context. // Set the property for the specified CTL context.
// //
// Same Property Ids and semantics as CertSetCertificateContextProperty. // Same Property Ids and semantics as CertSetCertificateContextProperty.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertSetCTLContextProperty( CertSetCTLContextProperty(
IN PCCTL_CONTEXT pCtlContext, __in PCCTL_CONTEXT pCtlContext,
IN DWORD dwPropId, __in DWORD dwPropId,
IN DWORD dwFlags, __in DWORD dwFlags,
IN const void *pvData __in_opt const void *pvData
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Get the property for the specified CTL context. // Get the property for the specified CTL context.
// //
// Same Property Ids and semantics as CertGetCertificateContextProperty. // Same Property Ids and semantics as CertGetCertificateContextProperty.
// //
// CERT_SHA1_HASH_PROP_ID or CERT_NEXT_UPDATE_LOCATION_PROP_ID are the // CERT_SHA1_HASH_PROP_ID or CERT_NEXT_UPDATE_LOCATION_PROP_ID are the
// predefined properties of most interest. // predefined properties of most interest.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertGetCTLContextProperty( CertGetCTLContextProperty(
IN PCCTL_CONTEXT pCtlContext, __in PCCTL_CONTEXT pCtlContext,
IN DWORD dwPropId, __in DWORD dwPropId,
OUT void *pvData, __out_bcount_part_opt(*pcbData, *pcbData) void *pvData,
IN OUT DWORD *pcbData __inout DWORD *pcbData
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Enumerate the properties for the specified CTL context. // Enumerate the properties for the specified CTL context.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
DWORD DWORD
WINAPI WINAPI
CertEnumCTLContextProperties( CertEnumCTLContextProperties(
IN PCCTL_CONTEXT pCtlContext, __in PCCTL_CONTEXT pCtlContext,
IN DWORD dwPropId __in DWORD dwPropId
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Enumerate the CTL contexts in the store. // Enumerate the CTL contexts in the store.
// //
// If a CTL isn't found, NULL is returned. // If a CTL isn't found, NULL is returned.
// Otherwise, a pointer to a read only CTL_CONTEXT is returned. CTL_CONTEXT // Otherwise, a pointer to a read only CTL_CONTEXT is returned. CTL_CONTEXT
// must be freed by calling CertFreeCTLContext or is freed when passed as the // must be freed by calling CertFreeCTLContext or is freed when passed as the
// pPrevCtlContext on a subsequent call. CertDuplicateCTLContext // pPrevCtlContext on a subsequent call. CertDuplicateCTLContext
// can be called to make a duplicate. // can be called to make a duplicate.
skipping to change at line 9899 skipping to change at line 11704
// CTL in the store. Successive CTLs are enumerated by setting // CTL in the store. Successive CTLs are enumerated by setting
// pPrevCtlContext to the CTL_CONTEXT returned by a previous call. // pPrevCtlContext to the CTL_CONTEXT returned by a previous call.
// //
// NOTE: a NON-NULL pPrevCtlContext is always CertFreeCTLContext'ed by // NOTE: a NON-NULL pPrevCtlContext is always CertFreeCTLContext'ed by
// this function, even for an error. // this function, even for an error.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCTL_CONTEXT PCCTL_CONTEXT
WINAPI WINAPI
CertEnumCTLsInStore( CertEnumCTLsInStore(
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN PCCTL_CONTEXT pPrevCtlContext __in_opt PCCTL_CONTEXT pPrevCtlContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Attempt to find the specified subject in the CTL. // Attempt to find the specified subject in the CTL.
// //
// For CTL_CERT_SUBJECT_TYPE, pvSubject points to a CERT_CONTEXT. The CTL's // For CTL_CERT_SUBJECT_TYPE, pvSubject points to a CERT_CONTEXT. The CTL's
// SubjectAlgorithm is examined to determine the representation of the // SubjectAlgorithm is examined to determine the representation of the
// subject's identity. Initially, only SHA1 or MD5 hash will be supported. // subject's identity. Initially, only SHA1 or MD5 hash will be supported.
// The appropriate hash property is obtained from the CERT_CONTEXT. // The appropriate hash property is obtained from the CERT_CONTEXT.
// //
skipping to change at line 9925 skipping to change at line 11730
// The certificate's hash or the CTL_ANY_SUBJECT_INFO's SubjectIdentifier // The certificate's hash or the CTL_ANY_SUBJECT_INFO's SubjectIdentifier
// is used as the key in searching the subject entries. A binary // is used as the key in searching the subject entries. A binary
// memory comparison is done between the key and the entry's SubjectIdentifer. // memory comparison is done between the key and the entry's SubjectIdentifer.
// //
// dwEncodingType isn't used for either of the above SubjectTypes. // dwEncodingType isn't used for either of the above SubjectTypes.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCTL_ENTRY PCTL_ENTRY
WINAPI WINAPI
CertFindSubjectInCTL( CertFindSubjectInCTL(
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN DWORD dwSubjectType, __in DWORD dwSubjectType,
IN void *pvSubject, __in void *pvSubject,
IN PCCTL_CONTEXT pCtlContext, __in PCCTL_CONTEXT pCtlContext,
IN DWORD dwFlags __in DWORD dwFlags
); );
// Subject Types: // Subject Types:
// CTL_ANY_SUBJECT_TYPE, pvSubject points to following CTL_ANY_SUBJECT_INFO. // CTL_ANY_SUBJECT_TYPE, pvSubject points to following CTL_ANY_SUBJECT_INFO.
// CTL_CERT_SUBJECT_TYPE, pvSubject points to CERT_CONTEXT. // CTL_CERT_SUBJECT_TYPE, pvSubject points to CERT_CONTEXT.
#define CTL_ANY_SUBJECT_TYPE 1 #define CTL_ANY_SUBJECT_TYPE 1
#define CTL_CERT_SUBJECT_TYPE 2 #define CTL_CERT_SUBJECT_TYPE 2
typedef struct _CTL_ANY_SUBJECT_INFO { typedef struct _CTL_ANY_SUBJECT_INFO {
CRYPT_ALGORITHM_IDENTIFIER SubjectAlgorithm; CRYPT_ALGORITHM_IDENTIFIER SubjectAlgorithm;
skipping to change at line 9970 skipping to change at line 11775
// call to find the CTL. To find the next CTL, the // call to find the CTL. To find the next CTL, the
// pPrevCtlContext is set to the CTL_CONTEXT returned by a previous call. // pPrevCtlContext is set to the CTL_CONTEXT returned by a previous call.
// //
// NOTE: a NON-NULL pPrevCtlContext is always CertFreeCTLContext'ed by // NOTE: a NON-NULL pPrevCtlContext is always CertFreeCTLContext'ed by
// this function, even for an error. // this function, even for an error.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCTL_CONTEXT PCCTL_CONTEXT
WINAPI WINAPI
CertFindCTLInStore( CertFindCTLInStore(
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN DWORD dwMsgAndCertEncodingType, __in DWORD dwMsgAndCertEncodingType,
IN DWORD dwFindFlags, __in DWORD dwFindFlags,
IN DWORD dwFindType, __in DWORD dwFindType,
IN const void *pvFindPara, __in_opt const void *pvFindPara,
IN PCCTL_CONTEXT pPrevCtlContext __in_opt PCCTL_CONTEXT pPrevCtlContext
); );
#define CTL_FIND_ANY 0 #define CTL_FIND_ANY 0
#define CTL_FIND_SHA1_HASH 1 #define CTL_FIND_SHA1_HASH 1
#define CTL_FIND_MD5_HASH 2 #define CTL_FIND_MD5_HASH 2
#define CTL_FIND_USAGE 3 #define CTL_FIND_USAGE 3
#define CTL_FIND_SUBJECT 4 #define CTL_FIND_SUBJECT 4
#define CTL_FIND_EXISTING 5 #define CTL_FIND_EXISTING 5
typedef struct _CTL_FIND_USAGE_PARA { typedef struct _CTL_FIND_USAGE_PARA {
skipping to change at line 10071 skipping to change at line 11876
// already exists in the store. See CertAddEncodedCertificateToStore for a // already exists in the store. See CertAddEncodedCertificateToStore for a
// list of and actions taken. // list of and actions taken.
// //
// Compares the CTL's SubjectUsage, ListIdentifier and any of its signers // Compares the CTL's SubjectUsage, ListIdentifier and any of its signers
// to determine if the CTL already exists in the store. // to determine if the CTL already exists in the store.
// //
// ppCtlContext can be NULL, indicating the caller isn't interested // ppCtlContext can be NULL, indicating the caller isn't interested
// in getting the CTL_CONTEXT of the added or existing CTL. // in getting the CTL_CONTEXT of the added or existing CTL.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CertAddEncodedCTLToStore( CertAddEncodedCTLToStore(
IN HCERTSTORE hCertStore, __in_opt HCERTSTORE hCertStore,
IN DWORD dwMsgAndCertEncodingType, __in DWORD dwMsgAndCertEncodingType,
IN const BYTE *pbCtlEncoded, __in_bcount(cbCtlEncoded) const BYTE *pbCtlEncoded,
IN DWORD cbCtlEncoded, __in DWORD cbCtlEncoded,
IN DWORD dwAddDisposition, __in DWORD dwAddDisposition,
OUT OPTIONAL PCCTL_CONTEXT *ppCtlContext __deref_opt_out PCCTL_CONTEXT *ppCtlContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Add the CTL context to the store according to the specified // Add the CTL context to the store according to the specified
// disposition option. // disposition option.
// //
// In addition to the encoded CTL, the context's properties are // In addition to the encoded CTL, the context's properties are
// also copied. Note, the CERT_KEY_CONTEXT_PROP_ID property (and its // also copied. Note, the CERT_KEY_CONTEXT_PROP_ID property (and its
// CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_SPEC_PROP_ID) isn't copied. // CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_SPEC_PROP_ID) isn't copied.
// //
skipping to change at line 10103 skipping to change at line 11909
// already exists in the store. See CertAddCertificateContextToStore for a // already exists in the store. See CertAddCertificateContextToStore for a
// list of and actions taken. // list of and actions taken.
// //
// Compares the CTL's SubjectUsage, ListIdentifier and any of its signers // Compares the CTL's SubjectUsage, ListIdentifier and any of its signers
// to determine if the CTL already exists in the store. // to determine if the CTL already exists in the store.
// //
// ppStoreContext can be NULL, indicating the caller isn't interested // ppStoreContext can be NULL, indicating the caller isn't interested
// in getting the CTL_CONTEXT of the added or existing CTL. // in getting the CTL_CONTEXT of the added or existing CTL.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CertAddCTLContextToStore( CertAddCTLContextToStore(
IN HCERTSTORE hCertStore, __in_opt HCERTSTORE hCertStore,
IN PCCTL_CONTEXT pCtlContext, __in PCCTL_CONTEXT pCtlContext,
IN DWORD dwAddDisposition, __in DWORD dwAddDisposition,
OUT OPTIONAL PCCTL_CONTEXT *ppStoreContext __deref_opt_out PCCTL_CONTEXT *ppStoreContext
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Serialize the CTL context's encoded CTL and its properties. // Serialize the CTL context's encoded CTL and its properties.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertSerializeCTLStoreElement( CertSerializeCTLStoreElement(
IN PCCTL_CONTEXT pCtlContext, __in PCCTL_CONTEXT pCtlContext,
IN DWORD dwFlags, __in DWORD dwFlags,
OUT BYTE *pbElement, __out_bcount_part_opt(*pcbElement, *pcbElement) BYTE *pbElement,
IN OUT DWORD *pcbElement __inout DWORD *pcbElement
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Delete the specified CTL from the store. // Delete the specified CTL from the store.
// //
// All subsequent gets for the CTL will fail. However, // All subsequent gets for the CTL will fail. However,
// memory allocated for the CTL isn't freed until all of its contexts // memory allocated for the CTL isn't freed until all of its contexts
// have also been freed. // have also been freed.
// //
// The pCtlContext is obtained from a get or duplicate. // The pCtlContext is obtained from a get or duplicate.
// //
// NOTE: the pCtlContext is always CertFreeCTLContext'ed by // NOTE: the pCtlContext is always CertFreeCTLContext'ed by
// this function, even for an error. // this function, even for an error.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertDeleteCTLFromStore( CertDeleteCTLFromStore(
IN PCCTL_CONTEXT pCtlContext __in PCCTL_CONTEXT pCtlContext
); );
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CertAddCertificateLinkToStore( CertAddCertificateLinkToStore(
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN DWORD dwAddDisposition, __in DWORD dwAddDisposition,
OUT OPTIONAL PCCERT_CONTEXT *ppStoreContext __deref_opt_out PCCERT_CONTEXT *ppStoreContext
); );
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CertAddCRLLinkToStore( CertAddCRLLinkToStore(
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN PCCRL_CONTEXT pCrlContext, __in PCCRL_CONTEXT pCrlContext,
IN DWORD dwAddDisposition, __in DWORD dwAddDisposition,
OUT OPTIONAL PCCRL_CONTEXT *ppStoreContext __deref_opt_out PCCRL_CONTEXT *ppStoreContext
); );
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CertAddCTLLinkToStore( CertAddCTLLinkToStore(
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN PCCTL_CONTEXT pCtlContext, __in PCCTL_CONTEXT pCtlContext,
IN DWORD dwAddDisposition, __in DWORD dwAddDisposition,
OUT OPTIONAL PCCTL_CONTEXT *ppStoreContext __deref_opt_out PCCTL_CONTEXT *ppStoreContext
); );
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertAddStoreToCollection( CertAddStoreToCollection(
IN HCERTSTORE hCollectionStore, __in HCERTSTORE hCollectionStore,
IN OPTIONAL HCERTSTORE hSiblingStore, __in_opt HCERTSTORE hSiblingStore,
IN DWORD dwUpdateFlags, __in DWORD dwUpdateFlags,
IN DWORD dwPriority __in DWORD dwPriority
); );
WINCRYPT32API WINCRYPT32API
void void
WINAPI WINAPI
CertRemoveStoreFromCollection( CertRemoveStoreFromCollection(
IN HCERTSTORE hCollectionStore, __in HCERTSTORE hCollectionStore,
IN HCERTSTORE hSiblingStore __in HCERTSTORE hSiblingStore
); );
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertControlStore( CertControlStore(
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN DWORD dwFlags, __in DWORD dwFlags,
IN DWORD dwCtrlType, __in DWORD dwCtrlType,
IN void const *pvCtrlPara __in_opt void const *pvCtrlPara
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Certificate Store control types // Certificate Store control types
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CERT_STORE_CTRL_RESYNC 1 #define CERT_STORE_CTRL_RESYNC 1
#define CERT_STORE_CTRL_NOTIFY_CHANGE 2 #define CERT_STORE_CTRL_NOTIFY_CHANGE 2
#define CERT_STORE_CTRL_COMMIT 3 #define CERT_STORE_CTRL_COMMIT 3
#define CERT_STORE_CTRL_AUTO_RESYNC 4 #define CERT_STORE_CTRL_AUTO_RESYNC 4
#define CERT_STORE_CTRL_CANCEL_NOTIFY 5 #define CERT_STORE_CTRL_CANCEL_NOTIFY 5
skipping to change at line 10309 skipping to change at line 12119
// Its not a property on an individual certificate, CRL or CTL context. // Its not a property on an individual certificate, CRL or CTL context.
// //
// Currently, no store properties are persisted. (This differs from // Currently, no store properties are persisted. (This differs from
// most context properties which are persisted.) // most context properties which are persisted.)
// //
// See CertSetStoreProperty or CertGetStoreProperty for usage information. // See CertSetStoreProperty or CertGetStoreProperty for usage information.
// //
// Note, the range for predefined store properties should be outside // Note, the range for predefined store properties should be outside
// the range of predefined context properties. We will start at 4096. // the range of predefined context properties. We will start at 4096.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// certenrolld_begin -- CERT_*_PROP_ID
#define CERT_STORE_LOCALIZED_NAME_PROP_ID 0x1000 #define CERT_STORE_LOCALIZED_NAME_PROP_ID 0x1000
// certenrolld_end
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Set a store property. // Set a store property.
// //
// The type definition for pvData depends on the dwPropId value. // The type definition for pvData depends on the dwPropId value.
// CERT_STORE_LOCALIZED_NAME_PROP_ID - localized name of the store. // CERT_STORE_LOCALIZED_NAME_PROP_ID - localized name of the store.
// pvData points to a CRYPT_DATA_BLOB. pbData is a pointer to a NULL // pvData points to a CRYPT_DATA_BLOB. pbData is a pointer to a NULL
// terminated unicode, wide character string. // terminated unicode, wide character string.
// cbData = (wcslen((LPWSTR) pbData) + 1) * sizeof(WCHAR). // cbData = (wcslen((LPWSTR) pbData) + 1) * sizeof(WCHAR).
// //
// For all the other PROP_IDs: an encoded PCRYPT_DATA_BLOB is passed in pvData. // For all the other PROP_IDs: an encoded PCRYPT_DATA_BLOB is passed in pvData.
// //
// If the property already exists, then, the old value is deleted and silently // If the property already exists, then, the old value is deleted and silently
// replaced. Setting, pvData to NULL, deletes the property. // replaced. Setting, pvData to NULL, deletes the property.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertSetStoreProperty( CertSetStoreProperty(
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN DWORD dwPropId, __in DWORD dwPropId,
IN DWORD dwFlags, __in DWORD dwFlags,
IN const void *pvData __in_opt const void *pvData
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Get a store property. // Get a store property.
// //
// The type definition for pvData depends on the dwPropId value. // The type definition for pvData depends on the dwPropId value.
// CERT_STORE_LOCALIZED_NAME_PROP_ID - localized name of the store. // CERT_STORE_LOCALIZED_NAME_PROP_ID - localized name of the store.
// pvData points to a NULL terminated unicode, wide character string. // pvData points to a NULL terminated unicode, wide character string.
// cbData = (wcslen((LPWSTR) pvData) + 1) * sizeof(WCHAR). // cbData = (wcslen((LPWSTR) pvData) + 1) * sizeof(WCHAR).
// //
// For all other PROP_IDs, pvData points to an array of bytes. // For all other PROP_IDs, pvData points to an array of bytes.
// //
// If the property doesn't exist, returns FALSE and sets LastError to // If the property doesn't exist, returns FALSE and sets LastError to
// CRYPT_E_NOT_FOUND. // CRYPT_E_NOT_FOUND.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertGetStoreProperty( CertGetStoreProperty(
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN DWORD dwPropId, __in DWORD dwPropId,
OUT void *pvData, __out_bcount_part_opt(*pcbData, *pcbData) void *pvData,
IN OUT DWORD *pcbData __inout DWORD *pcbData
);
//+-------------------------------------------------------------------------
// If the callback returns FALSE, stops the sort. CertCreateContext
// will return FALSE and set last error to ERROR_CANCELLED if the sort
// was stopped.
//
// Where:
// cbTotalEncoded - total byte count of the encoded entries.
// cbRemainEncoded - remaining byte count of the encoded entries.
// cEntry - running count of sorted entries
// pvSort - value passed in pCreatePara
//--------------------------------------------------------------------------
typedef BOOL (WINAPI *PFN_CERT_CREATE_CONTEXT_SORT_FUNC)(
__in DWORD cbTotalEncoded,
__in DWORD cbRemainEncoded,
__in DWORD cEntry,
__inout_opt void *pvSort
); );
typedef struct _CERT_CREATE_CONTEXT_PARA { typedef struct _CERT_CREATE_CONTEXT_PARA {
DWORD cbSize; DWORD cbSize;
PFN_CRYPT_FREE pfnFree; // OPTIONAL PFN_CRYPT_FREE pfnFree; // OPTIONAL
void *pvFree; // OPTIONAL void *pvFree; // OPTIONAL
// Only applicable to CERT_STORE_CTL_CONTEXT when
// CERT_CREATE_CONTEXT_SORTED_FLAG is set in dwFlags.
PFN_CERT_CREATE_CONTEXT_SORT_FUNC pfnSort; // OPTIONAL
void *pvSort; // OPTIONAL
} CERT_CREATE_CONTEXT_PARA, *PCERT_CREATE_CONTEXT_PARA; } CERT_CREATE_CONTEXT_PARA, *PCERT_CREATE_CONTEXT_PARA;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Creates the specified context from the encoded bytes. The created // Creates the specified context from the encoded bytes. The created
// context isn't put in a store. // context isn't put in a store.
// //
// dwContextType values: // dwContextType values:
// CERT_STORE_CERTIFICATE_CONTEXT // CERT_STORE_CERTIFICATE_CONTEXT
// CERT_STORE_CRL_CONTEXT // CERT_STORE_CRL_CONTEXT
// CERT_STORE_CTL_CONTEXT // CERT_STORE_CTL_CONTEXT
skipping to change at line 10401 skipping to change at line 12236
// If unable to decode and create the context, NULL is returned. // If unable to decode and create the context, NULL is returned.
// Otherwise, a pointer to a read only CERT_CONTEXT, CRL_CONTEXT or // Otherwise, a pointer to a read only CERT_CONTEXT, CRL_CONTEXT or
// CTL_CONTEXT is returned. The context must be freed by the appropriate // CTL_CONTEXT is returned. The context must be freed by the appropriate
// free context API. The context can be duplicated by calling the // free context API. The context can be duplicated by calling the
// appropriate duplicate context API. // appropriate duplicate context API.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
const void * const void *
WINAPI WINAPI
CertCreateContext( CertCreateContext(
IN DWORD dwContextType, __in DWORD dwContextType,
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN const BYTE *pbEncoded, __in_bcount(cbEncoded) const BYTE *pbEncoded,
IN DWORD cbEncoded, __in DWORD cbEncoded,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL PCERT_CREATE_CONTEXT_PARA pCreatePara __in_opt PCERT_CREATE_CONTEXT_PARA pCreatePara
); );
// When the following flag is set, the created context points directly to the // When the following flag is set, the created context points directly to the
// pbEncoded instead of an allocated copy. If pCreatePara and // pbEncoded instead of an allocated copy. If pCreatePara and
// pCreatePara->pfnFree are non-NULL, then, pfnFree is called to free // pCreatePara->pfnFree are non-NULL, then, pfnFree is called to free
// the pbEncoded when the context is last freed. Otherwise, no attempt is // the pbEncoded when the context is last freed. Otherwise, no attempt is
// made to free the pbEncoded. If pCreatePara->pvFree is non-NULL, then its // made to free the pbEncoded. If pCreatePara->pvFree is non-NULL, then its
// passed to pfnFree instead of pbEncoded. // passed to pfnFree instead of pbEncoded.
// //
// Note, if CertCreateContext fails, pfnFree is still called. // Note, if CertCreateContext fails, pfnFree is still called.
skipping to change at line 10428 skipping to change at line 12263
// When the following flag is set, a context with sorted entries is created. // When the following flag is set, a context with sorted entries is created.
// Currently only applicable to a CTL context. // Currently only applicable to a CTL context.
// //
// For CTLs: the cCTLEntry in the returned CTL_INFO is always // For CTLs: the cCTLEntry in the returned CTL_INFO is always
// 0. CertFindSubjectInSortedCTL and CertEnumSubjectInSortedCTL must be called // 0. CertFindSubjectInSortedCTL and CertEnumSubjectInSortedCTL must be called
// to find or enumerate the CTL entries. // to find or enumerate the CTL entries.
// //
// The Sorted CTL TrustedSubjects extension isn't returned in the created // The Sorted CTL TrustedSubjects extension isn't returned in the created
// context's CTL_INFO. // context's CTL_INFO.
//
// pfnSort and pvSort can be set in the pCreatePara parameter to be called for
// each sorted entry. pfnSort can return FALSE to stop the sorting.
#define CERT_CREATE_CONTEXT_SORTED_FLAG 0x2 #define CERT_CREATE_CONTEXT_SORTED_FLAG 0x2
// By default when a CTL context is created, a HCRYPTMSG handle to its // By default when a CTL context is created, a HCRYPTMSG handle to its
// SignedData message is created. This flag can be set to improve performance // SignedData message is created. This flag can be set to improve performance
// by not creating the HCRYPTMSG handle. // by not creating the HCRYPTMSG handle.
// //
// This flag is only applicable to a CTL context. // This flag is only applicable to a CTL context.
#define CERT_CREATE_CONTEXT_NO_HCRYPTMSG_FLAG 0x4 #define CERT_CREATE_CONTEXT_NO_HCRYPTMSG_FLAG 0x4
// By default when a CTL context is created, its entries are decoded. // By default when a CTL context is created, its entries are decoded.
skipping to change at line 10548 skipping to change at line 12386
// "\\ComputerName\ServiceName\Trust". The leading "\\" backslashes are // "\\ComputerName\ServiceName\Trust". The leading "\\" backslashes are
// optional in the ComputerName. // optional in the ComputerName.
// //
// Set CERT_STORE_CREATE_NEW_FLAG to cause a failure if the system store // Set CERT_STORE_CREATE_NEW_FLAG to cause a failure if the system store
// already exists in the store location. // already exists in the store location.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertRegisterSystemStore( CertRegisterSystemStore(
IN const void *pvSystemStore, __in const void *pvSystemStore,
IN DWORD dwFlags, __in DWORD dwFlags,
IN PCERT_SYSTEM_STORE_INFO pStoreInfo, __in_opt PCERT_SYSTEM_STORE_INFO pStoreInfo,
IN OPTIONAL void *pvReserved __reserved void *pvReserved
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Register a physical store for the specified system store. // Register a physical store for the specified system store.
// //
// The upper word of the dwFlags parameter is used to specify the location of // The upper word of the dwFlags parameter is used to specify the location of
// the system store. // the system store.
// //
// If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvSystemStore // If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvSystemStore
// points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure. Otherwise, // points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure. Otherwise,
skipping to change at line 10574 skipping to change at line 12412
// See CertRegisterSystemStore for details on prepending a ServiceName // See CertRegisterSystemStore for details on prepending a ServiceName
// and/or ComputerName to the system store name. // and/or ComputerName to the system store name.
// //
// Set CERT_STORE_CREATE_NEW_FLAG to cause a failure if the physical store // Set CERT_STORE_CREATE_NEW_FLAG to cause a failure if the physical store
// already exists in the system store. // already exists in the system store.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertRegisterPhysicalStore( CertRegisterPhysicalStore(
IN const void *pvSystemStore, __in const void *pvSystemStore,
IN DWORD dwFlags, __in DWORD dwFlags,
IN LPCWSTR pwszStoreName, __in LPCWSTR pwszStoreName,
IN PCERT_PHYSICAL_STORE_INFO pStoreInfo, __in PCERT_PHYSICAL_STORE_INFO pStoreInfo,
IN OPTIONAL void *pvReserved __reserved void *pvReserved
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Unregister the specified system store. // Unregister the specified system store.
// //
// The upper word of the dwFlags parameter is used to specify the location of // The upper word of the dwFlags parameter is used to specify the location of
// the system store. // the system store.
// //
// If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvSystemStore // If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvSystemStore
// points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure. Otherwise, // points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure. Otherwise,
skipping to change at line 10600 skipping to change at line 12438
// //
// See CertRegisterSystemStore for details on prepending a ServiceName // See CertRegisterSystemStore for details on prepending a ServiceName
// and/or ComputerName to the system store name. // and/or ComputerName to the system store name.
// //
// CERT_STORE_DELETE_FLAG can optionally be set in dwFlags. // CERT_STORE_DELETE_FLAG can optionally be set in dwFlags.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertUnregisterSystemStore( CertUnregisterSystemStore(
IN const void *pvSystemStore, __in const void *pvSystemStore,
IN DWORD dwFlags __in DWORD dwFlags
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Unregister the physical store from the specified system store. // Unregister the physical store from the specified system store.
// //
// The upper word of the dwFlags parameter is used to specify the location of // The upper word of the dwFlags parameter is used to specify the location of
// the system store. // the system store.
// //
// If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvSystemStore // If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvSystemStore
// points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure. Otherwise, // points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure. Otherwise,
skipping to change at line 10623 skipping to change at line 12461
// //
// See CertRegisterSystemStore for details on prepending a ServiceName // See CertRegisterSystemStore for details on prepending a ServiceName
// and/or ComputerName to the system store name. // and/or ComputerName to the system store name.
// //
// CERT_STORE_DELETE_FLAG can optionally be set in dwFlags. // CERT_STORE_DELETE_FLAG can optionally be set in dwFlags.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertUnregisterPhysicalStore( CertUnregisterPhysicalStore(
IN const void *pvSystemStore, __in const void *pvSystemStore,
IN DWORD dwFlags, __in DWORD dwFlags,
IN LPCWSTR pwszStoreName __in LPCWSTR pwszStoreName
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Enum callbacks // Enum callbacks
// //
// The CERT_SYSTEM_STORE_LOCATION_MASK bits in the dwFlags parameter // The CERT_SYSTEM_STORE_LOCATION_MASK bits in the dwFlags parameter
// specifies the location of the system store // specifies the location of the system store
// //
// If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvSystemStore // If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvSystemStore
// points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure. Otherwise, // points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure. Otherwise,
// pvSystemStore points to a null terminated UNICODE string. // pvSystemStore points to a null terminated UNICODE string.
// //
// The callback returns FALSE and sets LAST_ERROR to stop the enumeration. // The callback returns FALSE and sets LAST_ERROR to stop the enumeration.
// The LAST_ERROR is returned to the caller of the enumeration. // The LAST_ERROR is returned to the caller of the enumeration.
// //
// The pvSystemStore passed to the callback has leading ComputerName and/or // The pvSystemStore passed to the callback has leading ComputerName and/or
// ServiceName prefixes where appropriate. // ServiceName prefixes where appropriate.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef BOOL (WINAPI *PFN_CERT_ENUM_SYSTEM_STORE_LOCATION)( typedef BOOL (WINAPI *PFN_CERT_ENUM_SYSTEM_STORE_LOCATION)(
IN LPCWSTR pwszStoreLocation, __in LPCWSTR pwszStoreLocation,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL void *pvReserved, __reserved void *pvReserved,
IN OPTIONAL void *pvArg __inout_opt void *pvArg
); );
typedef BOOL (WINAPI *PFN_CERT_ENUM_SYSTEM_STORE)( typedef BOOL (WINAPI *PFN_CERT_ENUM_SYSTEM_STORE)(
IN const void *pvSystemStore, __in const void *pvSystemStore,
IN DWORD dwFlags, __in DWORD dwFlags,
IN PCERT_SYSTEM_STORE_INFO pStoreInfo, __in PCERT_SYSTEM_STORE_INFO pStoreInfo,
IN OPTIONAL void *pvReserved, __reserved void *pvReserved,
IN OPTIONAL void *pvArg __inout_opt void *pvArg
); );
typedef BOOL (WINAPI *PFN_CERT_ENUM_PHYSICAL_STORE)( typedef BOOL (WINAPI *PFN_CERT_ENUM_PHYSICAL_STORE)(
IN const void *pvSystemStore, __in const void *pvSystemStore,
IN DWORD dwFlags, __in DWORD dwFlags,
IN LPCWSTR pwszStoreName, __in LPCWSTR pwszStoreName,
IN PCERT_PHYSICAL_STORE_INFO pStoreInfo, __in PCERT_PHYSICAL_STORE_INFO pStoreInfo,
IN OPTIONAL void *pvReserved, __reserved void *pvReserved,
IN OPTIONAL void *pvArg __inout_opt void *pvArg
); );
// In the PFN_CERT_ENUM_PHYSICAL_STORE callback the following flag is // In the PFN_CERT_ENUM_PHYSICAL_STORE callback the following flag is
// set if the physical store wasn't registered and is an implicitly created // set if the physical store wasn't registered and is an implicitly created
// predefined physical store. // predefined physical store.
#define CERT_PHYSICAL_STORE_PREDEFINED_ENUM_FLAG 0x1 #define CERT_PHYSICAL_STORE_PREDEFINED_ENUM_FLAG 0x1
// Names of implicitly created predefined physical stores // Names of implicitly created predefined physical stores
#define CERT_PHYSICAL_STORE_DEFAULT_NAME L".Default" #define CERT_PHYSICAL_STORE_DEFAULT_NAME L".Default"
#define CERT_PHYSICAL_STORE_GROUP_POLICY_NAME L".GroupPolicy" #define CERT_PHYSICAL_STORE_GROUP_POLICY_NAME L".GroupPolicy"
#define CERT_PHYSICAL_STORE_LOCAL_MACHINE_NAME L".LocalMachine" #define CERT_PHYSICAL_STORE_LOCAL_MACHINE_NAME L".LocalMachine"
#define CERT_PHYSICAL_STORE_DS_USER_CERTIFICATE_NAME L".UserCertificate" #define CERT_PHYSICAL_STORE_DS_USER_CERTIFICATE_NAME L".UserCertificate"
#define CERT_PHYSICAL_STORE_LOCAL_MACHINE_GROUP_POLICY_NAME \ #define CERT_PHYSICAL_STORE_LOCAL_MACHINE_GROUP_POLICY_NAME \
L".LocalMachineGroupPolicy" L".LocalMachineGroupPolicy"
#define CERT_PHYSICAL_STORE_ENTERPRISE_NAME L".Enterprise" #define CERT_PHYSICAL_STORE_ENTERPRISE_NAME L".Enterprise"
#define CERT_PHYSICAL_STORE_AUTH_ROOT_NAME L".AuthRoot" #define CERT_PHYSICAL_STORE_AUTH_ROOT_NAME L".AuthRoot"
#define CERT_PHYSICAL_STORE_SMART_CARD_NAME L".SmartCard"
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Enumerate the system store locations. // Enumerate the system store locations.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertEnumSystemStoreLocation( CertEnumSystemStoreLocation(
IN DWORD dwFlags, __in DWORD dwFlags,
IN void *pvArg, __inout_opt void *pvArg,
IN PFN_CERT_ENUM_SYSTEM_STORE_LOCATION pfnEnum __callback PFN_CERT_ENUM_SYSTEM_STORE_LOCATION pfnEnum
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Enumerate the system stores. // Enumerate the system stores.
// //
// The upper word of the dwFlags parameter is used to specify the location of // The upper word of the dwFlags parameter is used to specify the location of
// the system store. // the system store.
// //
// If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, // If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags,
// pvSystemStoreLocationPara points to a CERT_SYSTEM_STORE_RELOCATE_PARA // pvSystemStoreLocationPara points to a CERT_SYSTEM_STORE_RELOCATE_PARA
skipping to change at line 10731 skipping to change at line 12570
// "\\ComputerName" or "ComputerName\" // "\\ComputerName" or "ComputerName\"
// "ComputerName\ServiceName" // "ComputerName\ServiceName"
// Note, if only the ComputerName is specified, then, it must have either // Note, if only the ComputerName is specified, then, it must have either
// the leading "\\" backslashes or a trailing backslash. Otherwise, its // the leading "\\" backslashes or a trailing backslash. Otherwise, its
// interpretted as the ServiceName or UserName. // interpretted as the ServiceName or UserName.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertEnumSystemStore( CertEnumSystemStore(
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL void *pvSystemStoreLocationPara, __in_opt void *pvSystemStoreLocationPara,
IN void *pvArg, __inout_opt void *pvArg,
IN PFN_CERT_ENUM_SYSTEM_STORE pfnEnum __callback PFN_CERT_ENUM_SYSTEM_STORE pfnEnum
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Enumerate the physical stores for the specified system store. // Enumerate the physical stores for the specified system store.
// //
// The upper word of the dwFlags parameter is used to specify the location of // The upper word of the dwFlags parameter is used to specify the location of
// the system store. // the system store.
// //
// If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvSystemStore // If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvSystemStore
// points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure. Otherwise, // points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure. Otherwise,
skipping to change at line 10757 skipping to change at line 12596
// See CertRegisterSystemStore for details on prepending a ServiceName // See CertRegisterSystemStore for details on prepending a ServiceName
// and/or ComputerName to the system store name. // and/or ComputerName to the system store name.
// //
// If the system store location only supports system stores and doesn't // If the system store location only supports system stores and doesn't
// support physical stores, LastError is set to ERROR_CALL_NOT_IMPLEMENTED. // support physical stores, LastError is set to ERROR_CALL_NOT_IMPLEMENTED.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertEnumPhysicalStore( CertEnumPhysicalStore(
IN const void *pvSystemStore, __in const void *pvSystemStore,
IN DWORD dwFlags, __in DWORD dwFlags,
IN void *pvArg, __inout_opt void *pvArg,
IN PFN_CERT_ENUM_PHYSICAL_STORE pfnEnum __callback PFN_CERT_ENUM_PHYSICAL_STORE pfnEnum
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Certificate System Store Installable Functions // Certificate System Store Installable Functions
// //
// The CERT_SYSTEM_STORE_LOCATION_MASK bits in the dwFlags parameter passed // The CERT_SYSTEM_STORE_LOCATION_MASK bits in the dwFlags parameter passed
// to the CertOpenStore(for "System", "SystemRegistry" or "Physical" // to the CertOpenStore(for "System", "SystemRegistry" or "Physical"
// Provider), CertRegisterSystemStore, // Provider), CertRegisterSystemStore,
// CertUnregisterSystemStore, CertEnumSystemStore, CertRegisterPhysicalStore, // CertUnregisterSystemStore, CertEnumSystemStore, CertRegisterPhysicalStore,
// CertUnregisterPhysicalStore and CertEnumPhysicalStore APIs is used as the // CertUnregisterPhysicalStore and CertEnumPhysicalStore APIs is used as the
skipping to change at line 10818 skipping to change at line 12657
// If the CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG is set, then, only get the // If the CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG is set, then, only get the
// extension. // extension.
// //
// If the CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG is set, then, only get the // If the CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG is set, then, only get the
// property. // property.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertGetEnhancedKeyUsage( CertGetEnhancedKeyUsage(
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN DWORD dwFlags, __in DWORD dwFlags,
OUT PCERT_ENHKEY_USAGE pUsage, __out_bcount_part_opt(*pcbUsage, *pcbUsage) PCERT_ENHKEY_USAGE pUsage,
IN OUT DWORD *pcbUsage __inout DWORD *pcbUsage
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Set the enhanced key usage property for the certificate. // Set the enhanced key usage property for the certificate.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertSetEnhancedKeyUsage( CertSetEnhancedKeyUsage(
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN PCERT_ENHKEY_USAGE pUsage __in_opt PCERT_ENHKEY_USAGE pUsage
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Add the usage identifier to the certificate's enhanced key usage property. // Add the usage identifier to the certificate's enhanced key usage property.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertAddEnhancedKeyUsageIdentifier( CertAddEnhancedKeyUsageIdentifier(
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN LPCSTR pszUsageIdentifier __in LPCSTR pszUsageIdentifier
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Remove the usage identifier from the certificate's enhanced key usage // Remove the usage identifier from the certificate's enhanced key usage
// property. // property.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertRemoveEnhancedKeyUsageIdentifier( CertRemoveEnhancedKeyUsageIdentifier(
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN LPCSTR pszUsageIdentifier __in LPCSTR pszUsageIdentifier
); );
//+--------------------------------------------------------------------------- //+---------------------------------------------------------------------------
// //
// //
// Takes an array of certs and returns an array of usages // Takes an array of certs and returns an array of usages
// which consists of the intersection of the valid usages for each cert. // which consists of the intersection of the valid usages for each cert.
// If each cert is good for all possible usages then the cNumOIDs is set to -1. // If each cert is good for all possible usages then the cNumOIDs is set to -1.
// //
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertGetValidUsages( CertGetValidUsages(
IN DWORD cCerts, __in DWORD cCerts,
IN PCCERT_CONTEXT *rghCerts, __in_ecount(cCerts) PCCERT_CONTEXT *rghCerts,
OUT int *cNumOIDs, __out int *cNumOIDs,
OUT LPSTR *rghOIDs, __out_bcount_part_opt(*pcbOIDs, *pcbOIDs) LPSTR *rghOIDs,
IN OUT DWORD *pcbOIDs); __inout DWORD *pcbOIDs);
//+========================================================================= //+=========================================================================
// Cryptographic Message helper functions for verifying and signing a // Cryptographic Message helper functions for verifying and signing a
// CTL. // CTL.
//========================================================================== //==========================================================================
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Get and verify the signer of a cryptographic message. // Get and verify the signer of a cryptographic message.
// //
// To verify a CTL, the hCryptMsg is obtained from the CTL_CONTEXT's // To verify a CTL, the hCryptMsg is obtained from the CTL_CONTEXT's
skipping to change at line 10905 skipping to change at line 12744
// If CMSG_USE_SIGNER_INDEX_FLAG is set, then, only get the signer specified // If CMSG_USE_SIGNER_INDEX_FLAG is set, then, only get the signer specified
// by *pdwSignerIndex. Otherwise, iterate through all the signers // by *pdwSignerIndex. Otherwise, iterate through all the signers
// until a signer verifies or no more signers. // until a signer verifies or no more signers.
// //
// For a verified signature, *ppSigner is updated with certificate context // For a verified signature, *ppSigner is updated with certificate context
// of the signer and *pdwSignerIndex is updated with the index of the signer. // of the signer and *pdwSignerIndex is updated with the index of the signer.
// ppSigner and/or pdwSignerIndex can be NULL, indicating the caller isn't // ppSigner and/or pdwSignerIndex can be NULL, indicating the caller isn't
// interested in getting the CertContext and/or index of the signer. // interested in getting the CertContext and/or index of the signer.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CryptMsgGetAndVerifySigner( CryptMsgGetAndVerifySigner(
IN HCRYPTMSG hCryptMsg, __in HCRYPTMSG hCryptMsg,
IN DWORD cSignerStore, __in DWORD cSignerStore,
IN OPTIONAL HCERTSTORE *rghSignerStore, __in_ecount_opt(cSignerStore) HCERTSTORE *rghSignerStore,
IN DWORD dwFlags, __in DWORD dwFlags,
OUT OPTIONAL PCCERT_CONTEXT *ppSigner, __deref_opt_out PCCERT_CONTEXT *ppSigner,
IN OUT OPTIONAL DWORD *pdwSignerIndex __inout_opt DWORD *pdwSignerIndex
); );
#define CMSG_TRUSTED_SIGNER_FLAG 0x1 #define CMSG_TRUSTED_SIGNER_FLAG 0x1
#define CMSG_SIGNER_ONLY_FLAG 0x2 #define CMSG_SIGNER_ONLY_FLAG 0x2
#define CMSG_USE_SIGNER_INDEX_FLAG 0x4 #define CMSG_USE_SIGNER_INDEX_FLAG 0x4
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Sign an encoded CTL. // Sign an encoded CTL.
// //
// The pbCtlContent can be obtained via a CTL_CONTEXT's pbCtlContent // The pbCtlContent can be obtained via a CTL_CONTEXT's pbCtlContent
// field or via a CryptEncodeObject(PKCS_CTL or PKCS_SORTED_CTL). // field or via a CryptEncodeObject(PKCS_CTL or PKCS_SORTED_CTL).
// //
// CMSG_CMS_ENCAPSULATED_CTL_FLAG can be set to encode a CMS compatible // CMSG_CMS_ENCAPSULATED_CTL_FLAG can be set to encode a CMS compatible
// V3 SignedData message. // V3 SignedData message.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptMsgSignCTL( CryptMsgSignCTL(
IN DWORD dwMsgEncodingType, __in DWORD dwMsgEncodingType,
IN BYTE *pbCtlContent, __in_bcount(cbCtlContent) BYTE *pbCtlContent,
IN DWORD cbCtlContent, __in DWORD cbCtlContent,
IN PCMSG_SIGNED_ENCODE_INFO pSignInfo, __in PCMSG_SIGNED_ENCODE_INFO pSignInfo,
IN DWORD dwFlags, __in DWORD dwFlags,
OUT BYTE *pbEncoded, __out_bcount_part_opt(*pcbEncoded, *pcbEncoded) BYTE *pbEncoded,
IN OUT DWORD *pcbEncoded __inout DWORD *pcbEncoded
); );
// When set, CTL inner content is encapsulated within an OCTET STRING // When set, CTL inner content is encapsulated within an OCTET STRING
#define CMSG_CMS_ENCAPSULATED_CTL_FLAG 0x00008000 #define CMSG_CMS_ENCAPSULATED_CTL_FLAG 0x00008000
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Encode the CTL and create a signed message containing the encoded CTL. // Encode the CTL and create a signed message containing the encoded CTL.
// //
// Set CMSG_ENCODE_SORTED_CTL_FLAG if the CTL entries are to be sorted // Set CMSG_ENCODE_SORTED_CTL_FLAG if the CTL entries are to be sorted
// before encoding. This flag should be set, if the // before encoding. This flag should be set, if the
skipping to change at line 10962 skipping to change at line 12802
// MD5 or SHA1, then, CMSG_ENCODE_HASHED_SUBJECT_IDENTIFIER_FLAG should // MD5 or SHA1, then, CMSG_ENCODE_HASHED_SUBJECT_IDENTIFIER_FLAG should
// also be set. // also be set.
// //
// CMSG_CMS_ENCAPSULATED_CTL_FLAG can be set to encode a CMS compatible // CMSG_CMS_ENCAPSULATED_CTL_FLAG can be set to encode a CMS compatible
// V3 SignedData message. // V3 SignedData message.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptMsgEncodeAndSignCTL( CryptMsgEncodeAndSignCTL(
IN DWORD dwMsgEncodingType, __in DWORD dwMsgEncodingType,
IN PCTL_INFO pCtlInfo, __in PCTL_INFO pCtlInfo,
IN PCMSG_SIGNED_ENCODE_INFO pSignInfo, __in PCMSG_SIGNED_ENCODE_INFO pSignInfo,
IN DWORD dwFlags, __in DWORD dwFlags,
OUT BYTE *pbEncoded, __out_bcount_part_opt(*pcbEncoded, *pcbEncoded) BYTE *pbEncoded,
IN OUT DWORD *pcbEncoded __inout DWORD *pcbEncoded
); );
// The following flag is set if the CTL is to be encoded with sorted // The following flag is set if the CTL is to be encoded with sorted
// trusted subjects and the szOID_SORTED_CTL extension is inserted containing // trusted subjects and the szOID_SORTED_CTL extension is inserted containing
// sorted offsets to the encoded subjects. // sorted offsets to the encoded subjects.
#define CMSG_ENCODE_SORTED_CTL_FLAG 0x1 #define CMSG_ENCODE_SORTED_CTL_FLAG 0x1
// If the above sorted flag is set, then, the following flag should also // If the above sorted flag is set, then, the following flag should also
// be set if the identifier for the TrustedSubjects is a hash, // be set if the identifier for the TrustedSubjects is a hash,
// such as, MD5 or SHA1. // such as, MD5 or SHA1.
#define CMSG_ENCODE_HASHED_SUBJECT_IDENTIFIER_FLAG 0x2 #define CMSG_ENCODE_HASHED_SUBJECT_IDENTIFIER_FLAG 0x2
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Returns TRUE if the SubjectIdentifier exists in the CTL. Optionally // Returns TRUE if the SubjectIdentifier exists in the CTL. Optionally
// returns a pointer to and byte count of the Subject's encoded attributes. // returns a pointer to and byte count of the Subject's encoded attributes.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertFindSubjectInSortedCTL( CertFindSubjectInSortedCTL(
IN PCRYPT_DATA_BLOB pSubjectIdentifier, __in PCRYPT_DATA_BLOB pSubjectIdentifier,
IN PCCTL_CONTEXT pCtlContext, __in PCCTL_CONTEXT pCtlContext,
IN DWORD dwFlags, __in DWORD dwFlags,
IN void *pvReserved, __reserved void *pvReserved,
OUT OPTIONAL PCRYPT_DER_BLOB pEncodedAttributes __out_opt PCRYPT_DER_BLOB pEncodedAttributes
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Enumerates through the sequence of TrustedSubjects in a CTL context // Enumerates through the sequence of TrustedSubjects in a CTL context
// created with CERT_CREATE_CONTEXT_SORTED_FLAG set. // created with CERT_CREATE_CONTEXT_SORTED_FLAG set.
// //
// To start the enumeration, *ppvNextSubject must be NULL. Upon return, // To start the enumeration, *ppvNextSubject must be NULL. Upon return,
// *ppvNextSubject is updated to point to the next TrustedSubject in // *ppvNextSubject is updated to point to the next TrustedSubject in
// the encoded sequence. // the encoded sequence.
// //
// Returns FALSE for no more subjects or invalid arguments. // Returns FALSE for no more subjects or invalid arguments.
// //
// Note, the returned DER_BLOBs point directly into the encoded // Note, the returned DER_BLOBs point directly into the encoded
// bytes (not allocated, and must not be freed). // bytes (not allocated, and must not be freed).
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertEnumSubjectInSortedCTL( CertEnumSubjectInSortedCTL(
IN PCCTL_CONTEXT pCtlContext, __in PCCTL_CONTEXT pCtlContext,
IN OUT void **ppvNextSubject, __deref_inout_opt void **ppvNextSubject,
OUT OPTIONAL PCRYPT_DER_BLOB pSubjectIdentifier, __out_opt PCRYPT_DER_BLOB pSubjectIdentifier,
OUT OPTIONAL PCRYPT_DER_BLOB pEncodedAttributes __out_opt PCRYPT_DER_BLOB pEncodedAttributes
); );
//+========================================================================= //+=========================================================================
// Certificate Verify CTL Usage Data Structures and APIs // Certificate Verify CTL Usage Data Structures and APIs
//========================================================================== //==========================================================================
typedef struct _CTL_VERIFY_USAGE_PARA { typedef struct _CTL_VERIFY_USAGE_PARA {
DWORD cbSize; DWORD cbSize;
CRYPT_DATA_BLOB ListIdentifier; // OPTIONAL CRYPT_DATA_BLOB ListIdentifier; // OPTIONAL
DWORD cCtlStore; DWORD cCtlStore;
skipping to change at line 11101 skipping to change at line 12941
// CRYPT_E_NO_VERIFY_USAGE_DLL // CRYPT_E_NO_VERIFY_USAGE_DLL
// CRYPT_E_NO_VERIFY_USAGE_CHECK // CRYPT_E_NO_VERIFY_USAGE_CHECK
// CRYPT_E_VERIFY_USAGE_OFFLINE // CRYPT_E_VERIFY_USAGE_OFFLINE
// CRYPT_E_NOT_IN_CTL // CRYPT_E_NOT_IN_CTL
// CRYPT_E_NO_TRUSTED_SIGNER // CRYPT_E_NO_TRUSTED_SIGNER
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertVerifyCTLUsage( CertVerifyCTLUsage(
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN DWORD dwSubjectType, __in DWORD dwSubjectType,
IN void *pvSubject, __in void *pvSubject,
IN PCTL_USAGE pSubjectUsage, __in PCTL_USAGE pSubjectUsage,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL PCTL_VERIFY_USAGE_PARA pVerifyUsagePara, __in_opt PCTL_VERIFY_USAGE_PARA pVerifyUsagePara,
IN OUT PCTL_VERIFY_USAGE_STATUS pVerifyUsageStatus __inout PCTL_VERIFY_USAGE_STATUS pVerifyUsageStatus
); );
//+========================================================================= //+=========================================================================
// Certificate Revocation Data Structures and APIs // Certificate Revocation Data Structures and APIs
//========================================================================== //==========================================================================
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// This data structure is updated by a CRL revocation type handler // This data structure is updated by a CRL revocation type handler
// with the base and possibly the delta CRL used. // with the base and possibly the delta CRL used.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
skipping to change at line 11180 skipping to change at line 13020
// If nonNULL, a CRL revocation type handler updates with the base and // If nonNULL, a CRL revocation type handler updates with the base and
// possibly the delta CRL used. Note, *pCrlInfo must be initialized // possibly the delta CRL used. Note, *pCrlInfo must be initialized
// by the caller. Any nonNULL CRL contexts are freed. Any updated // by the caller. Any nonNULL CRL contexts are freed. Any updated
// CRL contexts must be freed by the caller. // CRL contexts must be freed by the caller.
// //
// The CRL info is only applicable to the last context checked. If // The CRL info is only applicable to the last context checked. If
// interested in this information, then, CertVerifyRevocation should be // interested in this information, then, CertVerifyRevocation should be
// called with cContext = 1. // called with cContext = 1.
PCERT_REVOCATION_CRL_INFO pCrlInfo; PCERT_REVOCATION_CRL_INFO pCrlInfo;
// If nonNULL, any cached information before this time is considered
// time invalid and forces a wire retrieval.
LPFILETIME pftCacheResync;
#endif #endif
} CERT_REVOCATION_PARA, *PCERT_REVOCATION_PARA; } CERT_REVOCATION_PARA, *PCERT_REVOCATION_PARA;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// The following data structure is returned by CertVerifyRevocation to // The following data structure is returned by CertVerifyRevocation to
// specify the status of the revoked or unchecked context. Review the // specify the status of the revoked or unchecked context. Review the
// following CertVerifyRevocation comments for details. // following CertVerifyRevocation comments for details.
// //
// Upon input to CertVerifyRevocation, cbSize must be set to a size // Upon input to CertVerifyRevocation, cbSize must be set to a size
// >= (offsetof(CERT_REVOCATION_STATUS, dwReason) + sizeof(DWORD) ). // >= (offsetof(CERT_REVOCATION_STATUS, dwReason) + sizeof(DWORD) ).
skipping to change at line 11296 skipping to change at line 13140
// CRYPT_E_REVOKED, then, CertVerifyRevocation either continues on to the // CRYPT_E_REVOKED, then, CertVerifyRevocation either continues on to the
// next DLL in the list for a returned dwIndex of 0 or for a returned // next DLL in the list for a returned dwIndex of 0 or for a returned
// dwIndex > 0, restarts the process of finding a verify function by // dwIndex > 0, restarts the process of finding a verify function by
// advancing the start of the context array to the returned dwIndex and // advancing the start of the context array to the returned dwIndex and
// decrementing the count of remaining contexts. // decrementing the count of remaining contexts.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertVerifyRevocation( CertVerifyRevocation(
IN DWORD dwEncodingType, __in DWORD dwEncodingType,
IN DWORD dwRevType, __in DWORD dwRevType,
IN DWORD cContext, __in DWORD cContext,
IN PVOID rgpvContext[], __in_ecount(cContext) PVOID rgpvContext[],
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL PCERT_REVOCATION_PARA pRevPara, __in_opt PCERT_REVOCATION_PARA pRevPara,
IN OUT PCERT_REVOCATION_STATUS pRevStatus __inout PCERT_REVOCATION_STATUS pRevStatus
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Revocation types // Revocation types
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CERT_CONTEXT_REVOCATION_TYPE 1 #define CERT_CONTEXT_REVOCATION_TYPE 1
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// When the following flag is set, rgpvContext[] consists of a chain // When the following flag is set, rgpvContext[] consists of a chain
// of certificates, where rgpvContext[i + 1] is the issuer of rgpvContext[i]. // of certificates, where rgpvContext[i + 1] is the issuer of rgpvContext[i].
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CERT_VERIFY_REV_CHAIN_FLAG 0x00000001 #define CERT_VERIFY_REV_CHAIN_FLAG 0x00000001
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION prevents the revocation handler from // CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION prevents the revocation handler from
// accessing any network based resources for revocation checking // accessing any network based resources for revocation checking
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION 0x00000002 #define CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION 0x00000002
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// By default, the dwUrlRetrievalTimeout in pRevPara is the timeout used // By default, the dwUrlRetrievalTimeout in pRevPara is the timeout used
// for each URL wire retrieval. When the following flag is set, // for each URL wire retrieval. When the following flag is set,
// dwUrlRetrievalTimeout is the accumulative timeout across all URL wire // dwUrlRetrievalTimeout is the accumulative timeout across all URL wire
// retrievals. // retrievals.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CERT_VERIFY_REV_ACCUMULATIVE_TIMEOUT_FLAG 0x00000004 #define CERT_VERIFY_REV_ACCUMULATIVE_TIMEOUT_FLAG 0x00000004
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// When the following flag is set, only OCSP responses are used for
// doing revocation checking. If the certificate doesn't have any
// OCSP AIA URLs, dwError is set to CRYPT_E_NOT_IN_REVOCATION_DATABASE.
//--------------------------------------------------------------------------
#define CERT_VERIFY_REV_SERVER_OCSP_FLAG 0x00000008
//+-------------------------------------------------------------------------
// CERT_CONTEXT_REVOCATION_TYPE // CERT_CONTEXT_REVOCATION_TYPE
// //
// pvContext points to a const CERT_CONTEXT. // pvContext points to a const CERT_CONTEXT.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
//+========================================================================= //+=========================================================================
// Certificate Helper APIs // Certificate Helper APIs
//========================================================================== //==========================================================================
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
skipping to change at line 11357 skipping to change at line 13208
// The multiple byte integers are treated as Little Endian. pbData[0] is the // The multiple byte integers are treated as Little Endian. pbData[0] is the
// least significant byte and pbData[cbData - 1] is the most significant // least significant byte and pbData[cbData - 1] is the most significant
// byte. // byte.
// //
// Returns TRUE if the integer blobs are identical after removing leading // Returns TRUE if the integer blobs are identical after removing leading
// 0 or 0xFF bytes. // 0 or 0xFF bytes.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
BOOL BOOL
WINAPI WINAPI
CertCompareIntegerBlob( CertCompareIntegerBlob(
IN PCRYPT_INTEGER_BLOB pInt1, __in PCRYPT_INTEGER_BLOB pInt1,
IN PCRYPT_INTEGER_BLOB pInt2 __in PCRYPT_INTEGER_BLOB pInt2
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Compare two certificates to see if they are identical. // Compare two certificates to see if they are identical.
// //
// Since a certificate is uniquely identified by its Issuer and SerialNumber, // Since a certificate is uniquely identified by its Issuer and SerialNumber,
// these are the only fields needing to be compared. // these are the only fields needing to be compared.
// //
// Returns TRUE if the certificates are identical. // Returns TRUE if the certificates are identical.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertCompareCertificate( CertCompareCertificate(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN PCERT_INFO pCertId1, __in PCERT_INFO pCertId1,
IN PCERT_INFO pCertId2 __in PCERT_INFO pCertId2
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Compare two certificate names to see if they are identical. // Compare two certificate names to see if they are identical.
// //
// Returns TRUE if the names are identical. // Returns TRUE if the names are identical.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertCompareCertificateName( CertCompareCertificateName(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN PCERT_NAME_BLOB pCertName1, __in PCERT_NAME_BLOB pCertName1,
IN PCERT_NAME_BLOB pCertName2 __in PCERT_NAME_BLOB pCertName2
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Compare the attributes in the certificate name with the specified // Compare the attributes in the certificate name with the specified
// Relative Distinguished Name's (CERT_RDN) array of attributes. // Relative Distinguished Name's (CERT_RDN) array of attributes.
// The comparison iterates through the CERT_RDN attributes and looks for an // The comparison iterates through the CERT_RDN attributes and looks for an
// attribute match in any of the certificate name's RDNs. // attribute match in any of the certificate name's RDNs.
// Returns TRUE if all the attributes are found and match. // Returns TRUE if all the attributes are found and match.
// //
// The CERT_RDN_ATTR fields can have the following special values: // The CERT_RDN_ATTR fields can have the following special values:
skipping to change at line 11414 skipping to change at line 13265
// a case insensitive match. Otherwise, defaults to an exact, case sensitive // a case insensitive match. Otherwise, defaults to an exact, case sensitive
// match. // match.
// //
// CERT_UNICODE_IS_RDN_ATTRS_FLAG should be set if the pRDN was initialized // CERT_UNICODE_IS_RDN_ATTRS_FLAG should be set if the pRDN was initialized
// with unicode strings as for CryptEncodeObject(X509_UNICODE_NAME). // with unicode strings as for CryptEncodeObject(X509_UNICODE_NAME).
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertIsRDNAttrsInCertificateName( CertIsRDNAttrsInCertificateName(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN DWORD dwFlags, __in DWORD dwFlags,
IN PCERT_NAME_BLOB pCertName, __in PCERT_NAME_BLOB pCertName,
IN PCERT_RDN pRDN __in PCERT_RDN pRDN
); );
#define CERT_UNICODE_IS_RDN_ATTRS_FLAG 0x1 #define CERT_UNICODE_IS_RDN_ATTRS_FLAG 0x1
#define CERT_CASE_INSENSITIVE_IS_RDN_ATTRS_FLAG 0x2 #define CERT_CASE_INSENSITIVE_IS_RDN_ATTRS_FLAG 0x2
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Compare two public keys to see if they are identical. // Compare two public keys to see if they are identical.
// //
// Returns TRUE if the keys are identical. // Returns TRUE if the keys are identical.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertComparePublicKeyInfo( CertComparePublicKeyInfo(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN PCERT_PUBLIC_KEY_INFO pPublicKey1, __in PCERT_PUBLIC_KEY_INFO pPublicKey1,
IN PCERT_PUBLIC_KEY_INFO pPublicKey2 __in PCERT_PUBLIC_KEY_INFO pPublicKey2
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Get the public/private key's bit length. // Get the public/private key's bit length.
// //
// Returns 0 if unable to determine the key's length. // Returns 0 if unable to determine the key's length.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
DWORD DWORD
WINAPI WINAPI
CertGetPublicKeyLength( CertGetPublicKeyLength(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN PCERT_PUBLIC_KEY_INFO pPublicKey __in PCERT_PUBLIC_KEY_INFO pPublicKey
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Verify the signature of a subject certificate or a CRL using the // Verify the signature of a subject certificate or a CRL using the
// public key info // public key info
// //
// Returns TRUE for a valid signature. // Returns TRUE for a valid signature.
// //
// hCryptProv specifies the crypto provider to use to verify the signature. // hCryptProv specifies the crypto provider to use to verify the signature.
// It doesn't need to use a private key. // It doesn't need to use a private key.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
__checkReturn
BOOL BOOL
WINAPI WINAPI
CryptVerifyCertificateSignature( CryptVerifyCertificateSignature(
IN HCRYPTPROV hCryptProv, __in_opt HCRYPTPROV_LEGACY hCryptProv,
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN const BYTE * pbEncoded, __in_bcount(cbEncoded) const BYTE *pbEncoded,
IN DWORD cbEncoded, __in DWORD cbEncoded,
IN PCERT_PUBLIC_KEY_INFO pPublicKey __in PCERT_PUBLIC_KEY_INFO pPublicKey
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Verify the signature of a subject certificate, CRL, certificate request // Verify the signature of a subject certificate, CRL, certificate request
// or keygen request using the issuer's public key. // or keygen request using the issuer's public key.
// //
// Returns TRUE for a valid signature. // Returns TRUE for a valid signature.
// //
// The subject can be an encoded blob or a context for a certificate or CRL. // The subject can be an encoded blob or a context for a certificate or CRL.
// For a subject certificate context, if the certificate is missing // For a subject certificate context, if the certificate is missing
skipping to change at line 11496 skipping to change at line 13348
// Its private key isn't used. If hCryptProv is NULL, a default // Its private key isn't used. If hCryptProv is NULL, a default
// provider is picked according to the PublicKey Algorithm OID. // provider is picked according to the PublicKey Algorithm OID.
// //
// If the signature algorithm is a hashing algorithm, then, the // If the signature algorithm is a hashing algorithm, then, the
// signature is expected to contain the hash octets. Only dwIssuerType // signature is expected to contain the hash octets. Only dwIssuerType
// of CRYPT_VERIFY_CERT_SIGN_ISSUER_NULL may be specified // of CRYPT_VERIFY_CERT_SIGN_ISSUER_NULL may be specified
// to verify this no signature case. If any other dwIssuerType is // to verify this no signature case. If any other dwIssuerType is
// specified, the verify will fail with LastError set to E_INVALIDARG. // specified, the verify will fail with LastError set to E_INVALIDARG.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
__checkReturn
BOOL BOOL
WINAPI WINAPI
CryptVerifyCertificateSignatureEx( CryptVerifyCertificateSignatureEx(
IN OPTIONAL HCRYPTPROV hCryptProv, __in_opt HCRYPTPROV_LEGACY hCryptProv,
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN DWORD dwSubjectType, __in DWORD dwSubjectType,
IN void *pvSubject, __in void *pvSubject,
IN DWORD dwIssuerType, __in DWORD dwIssuerType,
IN void *pvIssuer, __in_opt void *pvIssuer,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL void *pvReserved __reserved void *pvReserved
); );
// Subject Types // Subject Types
#define CRYPT_VERIFY_CERT_SIGN_SUBJECT_BLOB 1 #define CRYPT_VERIFY_CERT_SIGN_SUBJECT_BLOB 1
// pvSubject :: PCRYPT_DATA_BLOB // pvSubject :: PCRYPT_DATA_BLOB
#define CRYPT_VERIFY_CERT_SIGN_SUBJECT_CERT 2 #define CRYPT_VERIFY_CERT_SIGN_SUBJECT_CERT 2
// pvSubject :: PCCERT_CONTEXT // pvSubject :: PCCERT_CONTEXT
#define CRYPT_VERIFY_CERT_SIGN_SUBJECT_CRL 3 #define CRYPT_VERIFY_CERT_SIGN_SUBJECT_CRL 3
// pvSubject :: PCCRL_CONTEXT // pvSubject :: PCCRL_CONTEXT
#define CRYPT_VERIFY_CERT_SIGN_SUBJECT_OCSP_BASIC_SIGNED_RESPONSE 4
// pvSubject :: POCSP_BASIC_SIGNED_RESPONSE_INFO
// Issuer Types // Issuer Types
#define CRYPT_VERIFY_CERT_SIGN_ISSUER_PUBKEY 1 #define CRYPT_VERIFY_CERT_SIGN_ISSUER_PUBKEY 1
// pvIssuer :: PCERT_PUBLIC_KEY_INFO // pvIssuer :: PCERT_PUBLIC_KEY_INFO
#define CRYPT_VERIFY_CERT_SIGN_ISSUER_CERT 2 #define CRYPT_VERIFY_CERT_SIGN_ISSUER_CERT 2
// pvIssuer :: PCCERT_CONTEXT // pvIssuer :: PCCERT_CONTEXT
#define CRYPT_VERIFY_CERT_SIGN_ISSUER_CHAIN 3 #define CRYPT_VERIFY_CERT_SIGN_ISSUER_CHAIN 3
// pvIssuer :: PCCERT_CHAIN_CONTEXT // pvIssuer :: PCCERT_CHAIN_CONTEXT
#define CRYPT_VERIFY_CERT_SIGN_ISSUER_NULL 4 #define CRYPT_VERIFY_CERT_SIGN_ISSUER_NULL 4
// pvIssuer :: NULL // pvIssuer :: NULL
skipping to change at line 11538 skipping to change at line 13393
// Compute the hash of the "to be signed" information in the encoded // Compute the hash of the "to be signed" information in the encoded
// signed content (CERT_SIGNED_CONTENT_INFO). // signed content (CERT_SIGNED_CONTENT_INFO).
// //
// hCryptProv specifies the crypto provider to use to compute the hash. // hCryptProv specifies the crypto provider to use to compute the hash.
// It doesn't need to use a private key. // It doesn't need to use a private key.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptHashToBeSigned( CryptHashToBeSigned(
IN HCRYPTPROV hCryptProv, __in_opt HCRYPTPROV_LEGACY hCryptProv,
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN const BYTE *pbEncoded, __in_bcount(cbEncoded) const BYTE *pbEncoded,
IN DWORD cbEncoded, __in DWORD cbEncoded,
OUT BYTE *pbComputedHash, __out_bcount_part_opt(*pcbComputedHash, *pcbComputedHash) BYTE *pbComputedHa
IN OUT DWORD *pcbComputedHash sh,
__inout DWORD *pcbComputedHash
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Hash the encoded content. // Hash the encoded content.
// //
// hCryptProv specifies the crypto provider to use to compute the hash. // hCryptProv specifies the crypto provider to use to compute the hash.
// It doesn't need to use a private key. // It doesn't need to use a private key.
// //
// Algid specifies the CAPI hash algorithm to use. If Algid is 0, then, the // Algid specifies the CAPI hash algorithm to use. If Algid is 0, then, the
// default hash algorithm (currently SHA1) is used. // default hash algorithm (currently SHA1) is used.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptHashCertificate( CryptHashCertificate(
IN HCRYPTPROV hCryptProv, __in_opt HCRYPTPROV_LEGACY hCryptProv,
IN ALG_ID Algid, __in ALG_ID Algid,
IN DWORD dwFlags, __in DWORD dwFlags,
IN const BYTE *pbEncoded, __in_bcount_opt(cbEncoded) const BYTE *pbEncoded,
IN DWORD cbEncoded, __in DWORD cbEncoded,
OUT BYTE *pbComputedHash, __out_bcount_part_opt(*pcbComputedHash, *pcbComputedHash) BYTE *pbComputedHa
IN OUT DWORD *pcbComputedHash sh,
__inout DWORD *pcbComputedHash
);
//+-------------------------------------------------------------------------
// Hash the encoded content using the CNG hash algorithm provider.
//--------------------------------------------------------------------------
WINCRYPT32API
BOOL
WINAPI
CryptHashCertificate2(
__in LPCWSTR pwszCNGHashAlgid,
__in DWORD dwFlags,
__reserved void *pvReserved,
__in_bcount_opt(cbEncoded) const BYTE *pbEncoded,
__in DWORD cbEncoded,
__out_bcount_part_opt(*pcbComputedHash, *pcbComputedHash) BYTE *pbComputedHa
sh,
__inout DWORD *pcbComputedHash
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Sign the "to be signed" information in the encoded signed content. // Sign the "to be signed" information in the encoded signed content.
// //
// hCryptProv specifies the crypto provider to use to do the signature. // hCryptProvOrNCryptKey specifies the crypto provider to use to do the
// It uses the specified private key. // signature. It uses the specified private key.
// //
// If the SignatureAlgorithm is a hash algorithm, then, the signature // If the SignatureAlgorithm is a hash algorithm, then, the signature
// contains the hash octets. A private key isn't used to encrypt the hash. // contains the hash octets. A private key isn't used to encrypt the hash.
// dwKeySpec isn't used and hCryptProv can be NULL where an appropriate // dwKeySpec isn't used and hCryptProvOrNCryptKey can be NULL where an
// default provider will be used for hashing. // appropriate default provider will be used for hashing.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptSignCertificate( CryptSignCertificate(
IN HCRYPTPROV hCryptProv, __in_opt HCRYPTPROV_OR_NCRYPT_KEY_HANDLE hCryptProvOrNCryptKey,
IN DWORD dwKeySpec, __in_opt DWORD dwKeySpec, // not applicable for NCRYPT_KEY_HANDLE
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN const BYTE *pbEncodedToBeSigned, __in_bcount(cbEncodedToBeSigned) const BYTE *pbEncodedToBeSigned,
IN DWORD cbEncodedToBeSigned, __in DWORD cbEncodedToBeSigned,
IN PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm, __in PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
IN OPTIONAL const void *pvHashAuxInfo, __in_opt const void *pvHashAuxInfo,
OUT BYTE *pbSignature, __out_bcount_part_opt(*pcbSignature, *pcbSignature) BYTE *pbSignature,
IN OUT DWORD *pcbSignature __inout DWORD *pcbSignature
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Encode the "to be signed" information. Sign the encoded "to be signed". // Encode the "to be signed" information. Sign the encoded "to be signed".
// Encode the "to be signed" and the signature. // Encode the "to be signed" and the signature.
// //
// hCryptProv specifies the crypto provider to use to do the signature. // hCryptProv specifies the crypto provider to use to do the signature.
// It uses the specified private key. // It uses the specified private key.
// //
// If the SignatureAlgorithm is a hash algorithm, then, the signature // If the SignatureAlgorithm is a hash algorithm, then, the signature
// contains the hash octets. A private key isn't used to encrypt the hash. // contains the hash octets. A private key isn't used to encrypt the hash.
// dwKeySpec isn't used and hCryptProv can be NULL where an appropriate // dwKeySpec isn't used and hCryptProv can be NULL where an appropriate
// default provider will be used for hashing. // default provider will be used for hashing.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptSignAndEncodeCertificate( CryptSignAndEncodeCertificate(
IN HCRYPTPROV hCryptProv, __in_opt HCRYPTPROV_OR_NCRYPT_KEY_HANDLE hCryptProvOrNCryptKey,
IN DWORD dwKeySpec, __in_opt DWORD dwKeySpec, // not applicable for NCRYPT_KEY_HANDLE
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN LPCSTR lpszStructType, // "to be signed" __in LPCSTR lpszStructType, // "to be signed"
IN const void *pvStructInfo, __in const void *pvStructInfo,
IN PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm, __in PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
IN OPTIONAL const void *pvHashAuxInfo, __in_opt const void *pvHashAuxInfo,
OUT PBYTE pbEncoded, __out_bcount_part_opt(*pcbEncoded, *pcbEncoded) BYTE *pbEncoded,
IN OUT DWORD *pcbEncoded __inout DWORD *pcbEncoded
);
//+-------------------------------------------------------------------------
// Certificate and CryptMsg encoded signature OID installable functions
//--------------------------------------------------------------------------
// The dwCertEncodingType and pSignatureAlgorithm->pszObjId are used
// to call the signature OID installable functions.
//
// If the OID installable function doesn't support the signature,
// it should return FALSE with LastError set to ERROR_NOT_SUPPORTED.
// Called if the signature has encoded parameters. Returns the CNG
// hash algorithm identifier string. Optionally returns the decoded
// signature parameters passed to either the SignAndEncodeHash or
// VerifyEncodedSignature OID installable function.
//
// Returned allocated parameters are freed via LocalFree().
#define CRYPT_OID_EXTRACT_ENCODED_SIGNATURE_PARAMETERS_FUNC \
"CryptDllExtractEncodedSignatureParameters"
typedef BOOL (WINAPI *PFN_CRYPT_EXTRACT_ENCODED_SIGNATURE_PARAMETERS_FUNC)(
__in DWORD dwCertEncodingType,
__in PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
__deref_out_opt void **ppvDecodedSignPara, // LocalFree()
__deref_out LPWSTR *ppwszCNGHashAlgid // LocalFree()
);
// Called to sign the computed hash and encode it.
#define CRYPT_OID_SIGN_AND_ENCODE_HASH_FUNC \
"CryptDllSignAndEncodeHash"
typedef BOOL (WINAPI *PFN_CRYPT_SIGN_AND_ENCODE_HASH_FUNC)(
__in NCRYPT_KEY_HANDLE hKey,
__in DWORD dwCertEncodingType,
__in PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
__in_opt void *pvDecodedSignPara,
__in LPCWSTR pwszCNGPubKeyAlgid, // obtained from signature OID
__in LPCWSTR pwszCNGHashAlgid,
__in_bcount(cbComputedHash) BYTE *pbComputedHash,
__in DWORD cbComputedHash,
__out_bcount_part_opt(*pcbSignature, *pcbSignature) BYTE *pbSignature,
__inout DWORD *pcbSignature
);
// Called to decode and decrypt the encoded signature and compare it with the
// computed hash.
#define CRYPT_OID_VERIFY_ENCODED_SIGNATURE_FUNC \
"CryptDllVerifyEncodedSignature"
typedef BOOL (WINAPI *PFN_CRYPT_VERIFY_ENCODED_SIGNATURE_FUNC)(
__in DWORD dwCertEncodingType,
__in PCERT_PUBLIC_KEY_INFO pPubKeyInfo,
__in PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
__in_opt void *pvDecodedSignPara,
__in LPCWSTR pwszCNGPubKeyAlgid, // obtained from signature OID
__in LPCWSTR pwszCNGHashAlgid,
__in_bcount(cbComputedHash) BYTE *pbComputedHash,
__in DWORD cbComputedHash,
__in_bcount(cbSignature) BYTE *pbSignature,
__in DWORD cbSignature
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Verify the time validity of a certificate. // Verify the time validity of a certificate.
// //
// Returns -1 if before NotBefore, +1 if after NotAfter and otherwise 0 for // Returns -1 if before NotBefore, +1 if after NotAfter and otherwise 0 for
// a valid certificate // a valid certificate
// //
// If pTimeToVerify is NULL, uses the current time. // If pTimeToVerify is NULL, uses the current time.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
LONG LONG
WINAPI WINAPI
CertVerifyTimeValidity( CertVerifyTimeValidity(
IN LPFILETIME pTimeToVerify, __in_opt LPFILETIME pTimeToVerify,
IN PCERT_INFO pCertInfo __in PCERT_INFO pCertInfo
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Verify the time validity of a CRL. // Verify the time validity of a CRL.
// //
// Returns -1 if before ThisUpdate, +1 if after NextUpdate and otherwise 0 for // Returns -1 if before ThisUpdate, +1 if after NextUpdate and otherwise 0 for
// a valid CRL // a valid CRL
// //
// If pTimeToVerify is NULL, uses the current time. // If pTimeToVerify is NULL, uses the current time.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
LONG LONG
WINAPI WINAPI
CertVerifyCRLTimeValidity( CertVerifyCRLTimeValidity(
IN LPFILETIME pTimeToVerify, __in_opt LPFILETIME pTimeToVerify,
IN PCRL_INFO pCrlInfo __in PCRL_INFO pCrlInfo
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Verify that the subject's time validity nests within the issuer's time // Verify that the subject's time validity nests within the issuer's time
// validity. // validity.
// //
// Returns TRUE if it nests. Otherwise, returns FALSE. // Returns TRUE if it nests. Otherwise, returns FALSE.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertVerifyValidityNesting( CertVerifyValidityNesting(
IN PCERT_INFO pSubjectInfo, __in PCERT_INFO pSubjectInfo,
IN PCERT_INFO pIssuerInfo __in PCERT_INFO pIssuerInfo
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Verify that the subject certificate isn't on its issuer CRL. // Verify that the subject certificate isn't on its issuer CRL.
// //
// Returns true if the certificate isn't on the CRL. // Returns true if the certificate isn't on the CRL.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertVerifyCRLRevocation( CertVerifyCRLRevocation(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN PCERT_INFO pCertId, // Only the Issuer and SerialNumber __in PCERT_INFO pCertId, // Only the Issuer and SerialNumber
// fields are used // fields are used
IN DWORD cCrlInfo, __in DWORD cCrlInfo,
IN PCRL_INFO rgpCrlInfo[] __in_ecount(cCrlInfo) PCRL_INFO rgpCrlInfo[]
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Convert the CAPI AlgId to the ASN.1 Object Identifier string // Convert the CAPI AlgId to the ASN.1 Object Identifier string
// //
// Returns NULL if there isn't an ObjId corresponding to the AlgId. // Returns NULL if there isn't an ObjId corresponding to the AlgId.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
LPCSTR LPCSTR
WINAPI WINAPI
CertAlgIdToOID( CertAlgIdToOID(
IN DWORD dwAlgId __in DWORD dwAlgId
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Convert the ASN.1 Object Identifier string to the CAPI AlgId. // Convert the ASN.1 Object Identifier string to the CAPI AlgId.
// //
// Returns 0 if there isn't an AlgId corresponding to the ObjId. // Returns 0 if there isn't an AlgId corresponding to the ObjId.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
DWORD DWORD
WINAPI WINAPI
CertOIDToAlgId( CertOIDToAlgId(
IN LPCSTR pszObjId __in LPCSTR pszObjId
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Find an extension identified by its Object Identifier. // Find an extension identified by its Object Identifier.
// //
// If found, returns pointer to the extension. Otherwise, returns NULL. // If found, returns pointer to the extension. Otherwise, returns NULL.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCERT_EXTENSION PCERT_EXTENSION
WINAPI WINAPI
CertFindExtension( CertFindExtension(
IN LPCSTR pszObjId, __in LPCSTR pszObjId,
IN DWORD cExtensions, __in DWORD cExtensions,
IN CERT_EXTENSION rgExtensions[] __in_ecount(cExtensions) CERT_EXTENSION rgExtensions[]
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Find the first attribute identified by its Object Identifier. // Find the first attribute identified by its Object Identifier.
// //
// If found, returns pointer to the attribute. Otherwise, returns NULL. // If found, returns pointer to the attribute. Otherwise, returns NULL.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCRYPT_ATTRIBUTE PCRYPT_ATTRIBUTE
WINAPI WINAPI
CertFindAttribute( CertFindAttribute(
IN LPCSTR pszObjId, __in LPCSTR pszObjId,
IN DWORD cAttr, __in DWORD cAttr,
IN CRYPT_ATTRIBUTE rgAttr[] __in_ecount(cAttr) CRYPT_ATTRIBUTE rgAttr[]
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Find the first CERT_RDN attribute identified by its Object Identifier in // Find the first CERT_RDN attribute identified by its Object Identifier in
// the name's list of Relative Distinguished Names. // the name's list of Relative Distinguished Names.
// //
// If found, returns pointer to the attribute. Otherwise, returns NULL. // If found, returns pointer to the attribute. Otherwise, returns NULL.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCERT_RDN_ATTR PCERT_RDN_ATTR
WINAPI WINAPI
CertFindRDNAttr( CertFindRDNAttr(
IN LPCSTR pszObjId, __in LPCSTR pszObjId,
IN PCERT_NAME_INFO pName __in PCERT_NAME_INFO pName
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Get the intended key usage bytes from the certificate. // Get the intended key usage bytes from the certificate.
// //
// If the certificate doesn't have any intended key usage bytes, returns FALSE // If the certificate doesn't have any intended key usage bytes, returns FALSE
// and *pbKeyUsage is zeroed. Otherwise, returns TRUE and up through // and *pbKeyUsage is zeroed. Otherwise, returns TRUE and up through
// cbKeyUsage bytes are copied into *pbKeyUsage. Any remaining uncopied // cbKeyUsage bytes are copied into *pbKeyUsage. Any remaining uncopied
// bytes are zeroed. // bytes are zeroed.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertGetIntendedKeyUsage( CertGetIntendedKeyUsage(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN PCERT_INFO pCertInfo, __in PCERT_INFO pCertInfo,
OUT BYTE *pbKeyUsage, __out_bcount_full(cbKeyUsage) BYTE *pbKeyUsage,
IN DWORD cbKeyUsage __in DWORD cbKeyUsage
); );
typedef void *HCRYPTDEFAULTCONTEXT; typedef void *HCRYPTDEFAULTCONTEXT;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Install a previously CryptAcquiredContext'ed HCRYPTPROV to be used as // Install a previously CryptAcquiredContext'ed HCRYPTPROV to be used as
// a default context. // a default context.
// //
// dwDefaultType and pvDefaultPara specify where the default context is used. // dwDefaultType and pvDefaultPara specify where the default context is used.
// For example, install the HCRYPTPROV to be used to verify certificate's // For example, install the HCRYPTPROV to be used to verify certificate's
skipping to change at line 11800 skipping to change at line 13729
// //
// If CRYPT_DEFAULT_CONTEXT_AUTO_RELEASE_FLAG is set, then, the HCRYPTPROV // If CRYPT_DEFAULT_CONTEXT_AUTO_RELEASE_FLAG is set, then, the HCRYPTPROV
// is CryptReleaseContext'ed at thread or process exit. However, // is CryptReleaseContext'ed at thread or process exit. However,
// not CryptReleaseContext'ed if CryptUninstallDefaultContext is // not CryptReleaseContext'ed if CryptUninstallDefaultContext is
// called. // called.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptInstallDefaultContext( CryptInstallDefaultContext(
IN HCRYPTPROV hCryptProv, __in HCRYPTPROV hCryptProv,
IN DWORD dwDefaultType, __in DWORD dwDefaultType,
IN const void *pvDefaultPara, __in_opt const void *pvDefaultPara,
IN DWORD dwFlags, __in DWORD dwFlags,
IN void *pvReserved, __reserved void *pvReserved,
OUT HCRYPTDEFAULTCONTEXT *phDefaultContext __out HCRYPTDEFAULTCONTEXT *phDefaultContext
); );
// dwFlags // dwFlags
#define CRYPT_DEFAULT_CONTEXT_AUTO_RELEASE_FLAG 0x00000001 #define CRYPT_DEFAULT_CONTEXT_AUTO_RELEASE_FLAG 0x00000001
#define CRYPT_DEFAULT_CONTEXT_PROCESS_FLAG 0x00000002 #define CRYPT_DEFAULT_CONTEXT_PROCESS_FLAG 0x00000002
// List of dwDefaultType's // List of dwDefaultType's
#define CRYPT_DEFAULT_CONTEXT_CERT_SIGN_OID 1 #define CRYPT_DEFAULT_CONTEXT_CERT_SIGN_OID 1
#define CRYPT_DEFAULT_CONTEXT_MULTI_CERT_SIGN_OID 2 #define CRYPT_DEFAULT_CONTEXT_MULTI_CERT_SIGN_OID 2
skipping to change at line 11853 skipping to change at line 13782
// CryptInstallDefaultContext. // CryptInstallDefaultContext.
// //
// For a default context installed with CRYPT_DEFAULT_CONTEXT_PROCESS_FLAG // For a default context installed with CRYPT_DEFAULT_CONTEXT_PROCESS_FLAG
// set, if any other threads are currently using this context, // set, if any other threads are currently using this context,
// this function will block until they finish. // this function will block until they finish.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptUninstallDefaultContext( CryptUninstallDefaultContext(
HCRYPTDEFAULTCONTEXT hDefaultContext, __in_opt HCRYPTDEFAULTCONTEXT hDefaultContext,
IN DWORD dwFlags, __in DWORD dwFlags,
IN void *pvReserved __reserved void *pvReserved
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Export the public key info associated with the provider's corresponding // Export the public key info associated with the provider's corresponding
// private key. // private key.
// //
// Calls CryptExportPublicKeyInfoEx with pszPublicKeyObjId = NULL, // Calls CryptExportPublicKeyInfoEx with pszPublicKeyObjId = NULL,
// dwFlags = 0 and pvAuxInfo = NULL. // dwFlags = 0 and pvAuxInfo = NULL.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptExportPublicKeyInfo( CryptExportPublicKeyInfo(
IN HCRYPTPROV hCryptProv, __in HCRYPTPROV_OR_NCRYPT_KEY_HANDLE hCryptProvOrNCryptKey,
IN DWORD dwKeySpec, __in_opt DWORD dwKeySpec, // not applicable for NCRYPT_KEY_HANDLE
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
OUT PCERT_PUBLIC_KEY_INFO pInfo, __out_bcount_part_opt(*pcbInfo, *pcbInfo) PCERT_PUBLIC_KEY_INFO pInfo,
IN OUT DWORD *pcbInfo __inout DWORD *pcbInfo
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Export the public key info associated with the provider's corresponding // Export the public key info associated with the provider's corresponding
// private key. // private key.
// //
// Uses the dwCertEncodingType and pszPublicKeyObjId to call the // Uses the dwCertEncodingType and pszPublicKeyObjId to call the
// installable CRYPT_OID_EXPORT_PUBLIC_KEY_INFO_FUNC. The called function // installable CRYPT_OID_EXPORT_PUBLIC_KEY_INFO_FUNC. The called function
// has the same signature as CryptExportPublicKeyInfoEx. // has the same signature as CryptExportPublicKeyInfoEx.
// //
// If unable to find an installable OID function for the pszPublicKeyObjId, // If unable to find an installable OID function for the pszPublicKeyObjId,
// attempts to export as a RSA Public Key (szOID_RSA_RSA). // attempts to export as a RSA Public Key (szOID_RSA_RSA).
// //
// The dwFlags and pvAuxInfo aren't used for szOID_RSA_RSA. // The dwFlags and pvAuxInfo aren't used for szOID_RSA_RSA.
//
// dwFlags can be set with the following 2 flags passed directly to
// CryptFindOIDInfo:
// CRYPT_OID_INFO_PUBKEY_SIGN_KEY_FLAG
// CRYPT_OID_INFO_PUBKEY_ENCRYPT_KEY_FLAG
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CRYPT_OID_EXPORT_PUBLIC_KEY_INFO_FUNC "CryptDllExportPublicKeyInfoEx"
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptExportPublicKeyInfoEx( CryptExportPublicKeyInfoEx(
IN HCRYPTPROV hCryptProv, __in HCRYPTPROV_OR_NCRYPT_KEY_HANDLE hCryptProvOrNCryptKey,
IN DWORD dwKeySpec, __in_opt DWORD dwKeySpec, // not applicable for NCRYPT_KEY_HANDLE
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN LPSTR pszPublicKeyObjId, __in_opt LPSTR pszPublicKeyObjId,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL void *pvAuxInfo, __in_opt void *pvAuxInfo,
OUT PCERT_PUBLIC_KEY_INFO pInfo, __out_bcount_part_opt(*pcbInfo, *pcbInfo) PCERT_PUBLIC_KEY_INFO pInfo,
IN OUT DWORD *pcbInfo __inout DWORD *pcbInfo
);
// Legacy define used for exporting CAPI1 HCRYPTPROV public keys.
#define CRYPT_OID_EXPORT_PUBLIC_KEY_INFO_FUNC "CryptDllExportPublicKeyInfoEx"
//+-------------------------------------------------------------------------
// Export CNG PublicKeyInfo OID installable function. Note, not called
// for a HCRYPTPROV choice.
//--------------------------------------------------------------------------
#define CRYPT_OID_EXPORT_PUBLIC_KEY_INFO_EX2_FUNC \
"CryptDllExportPublicKeyInfoEx2"
typedef BOOL (WINAPI *PFN_CRYPT_EXPORT_PUBLIC_KEY_INFO_EX2_FUNC) (
__in NCRYPT_KEY_HANDLE hNCryptKey,
__in DWORD dwCertEncodingType,
__in LPSTR pszPublicKeyObjId,
__in DWORD dwFlags,
__in_opt void *pvAuxInfo,
__out_bcount_part_opt(*pcbInfo, *pcbInfo) PCERT_PUBLIC_KEY_INFO pInfo,
__inout DWORD *pcbInfo
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Convert and import the public key info into the provider and return a // Convert and import the public key info into the provider and return a
// handle to the public key. // handle to the public key.
// //
// Calls CryptImportPublicKeyInfoEx with aiKeyAlg = 0, dwFlags = 0 and // Calls CryptImportPublicKeyInfoEx with aiKeyAlg = 0, dwFlags = 0 and
// pvAuxInfo = NULL. // pvAuxInfo = NULL.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptImportPublicKeyInfo( CryptImportPublicKeyInfo(
IN HCRYPTPROV hCryptProv, __in HCRYPTPROV hCryptProv,
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN PCERT_PUBLIC_KEY_INFO pInfo, __in PCERT_PUBLIC_KEY_INFO pInfo,
OUT HCRYPTKEY *phKey __out HCRYPTKEY *phKey
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Convert and import the public key info into the provider and return a // Convert and import the public key info into the provider and return a
// handle to the public key. // handle to the public key.
// //
// Uses the dwCertEncodingType and pInfo->Algorithm.pszObjId to call the // Uses the dwCertEncodingType and pInfo->Algorithm.pszObjId to call the
// installable CRYPT_OID_IMPORT_PUBLIC_KEY_INFO_FUNC. The called function // installable CRYPT_OID_IMPORT_PUBLIC_KEY_INFO_FUNC. The called function
// has the same signature as CryptImportPublicKeyInfoEx. // has the same signature as CryptImportPublicKeyInfoEx.
// //
skipping to change at line 11942 skipping to change at line 13894
// //
// For szOID_RSA_RSA: aiKeyAlg may be set to CALG_RSA_SIGN or CALG_RSA_KEYX. // For szOID_RSA_RSA: aiKeyAlg may be set to CALG_RSA_SIGN or CALG_RSA_KEYX.
// Defaults to CALG_RSA_KEYX. The dwFlags and pvAuxInfo aren't used. // Defaults to CALG_RSA_KEYX. The dwFlags and pvAuxInfo aren't used.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CRYPT_OID_IMPORT_PUBLIC_KEY_INFO_FUNC "CryptDllImportPublicKeyInfoEx" #define CRYPT_OID_IMPORT_PUBLIC_KEY_INFO_FUNC "CryptDllImportPublicKeyInfoEx"
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptImportPublicKeyInfoEx( CryptImportPublicKeyInfoEx(
IN HCRYPTPROV hCryptProv, __in HCRYPTPROV hCryptProv,
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN PCERT_PUBLIC_KEY_INFO pInfo, __in PCERT_PUBLIC_KEY_INFO pInfo,
IN ALG_ID aiKeyAlg, __in ALG_ID aiKeyAlg,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL void *pvAuxInfo, __in_opt void *pvAuxInfo,
OUT HCRYPTKEY *phKey __out HCRYPTKEY *phKey
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Acquire a HCRYPTPROV handle and dwKeySpec for the specified certificate // Convert and import the public key info into the CNG asymmetric or
// context. Uses the certificate's CERT_KEY_PROV_INFO_PROP_ID property. // signature algorithm provider and return a BCRYPT_KEY_HANDLE to it.
// The returned HCRYPTPROV handle may optionally be cached using the //
// certificate's CERT_KEY_CONTEXT_PROP_ID property. // Uses the dwCertEncodingType and pInfo->Algorithm.pszObjId to call the
// installable CRYPT_OID_IMPORT_PUBLIC_KEY_INFO_EX2_FUNC. The called function
// has the same signature as CryptImportPublicKeyInfoEx2.
//
// dwFlags can be set with the following 2 flags passed directly to
// CryptFindOIDInfo:
// CRYPT_OID_INFO_PUBKEY_SIGN_KEY_FLAG
// CRYPT_OID_INFO_PUBKEY_ENCRYPT_KEY_FLAG
//--------------------------------------------------------------------------
WINCRYPT32API
BOOL
WINAPI
CryptImportPublicKeyInfoEx2(
__in DWORD dwCertEncodingType,
__in PCERT_PUBLIC_KEY_INFO pInfo,
__in DWORD dwFlags,
__in_opt void *pvAuxInfo,
__out BCRYPT_KEY_HANDLE *phKey
);
//+-------------------------------------------------------------------------
// Import CNG PublicKeyInfo OID installable function
//--------------------------------------------------------------------------
#define CRYPT_OID_IMPORT_PUBLIC_KEY_INFO_EX2_FUNC \
"CryptDllImportPublicKeyInfoEx2"
typedef BOOL (WINAPI *PFN_IMPORT_PUBLIC_KEY_INFO_EX2_FUNC) (
__in DWORD dwCertEncodingType,
__in PCERT_PUBLIC_KEY_INFO pInfo,
__in DWORD dwFlags,
__in_opt void *pvAuxInfo,
__out BCRYPT_KEY_HANDLE *phKey
);
//+-------------------------------------------------------------------------
// Acquire a HCRYPTPROV and dwKeySpec or NCRYPT_KEY_HANDLE for the
// specified certificate context. Uses the certificate's
// CERT_KEY_PROV_INFO_PROP_ID property.
// The returned HCRYPTPROV or NCRYPT_KEY_HANDLE handle may optionally be
// cached using the certificate's CERT_KEY_CONTEXT_PROP_ID property.
// //
// If CRYPT_ACQUIRE_CACHE_FLAG is set, then, if an already acquired and // If CRYPT_ACQUIRE_CACHE_FLAG is set, then, if an already acquired and
// cached HCRYPTPROV exists for the certificate, its returned. Otherwise, // cached HCRYPTPROV or NCRYPT_KEY_HANDLE exists for the certificate, its
// a HCRYPTPROV is acquired and then cached via the certificate's // returned. Otherwise, a HCRYPTPROV or NCRYPT_KEY_HANDLE is acquired and
// CERT_KEY_CONTEXT_PROP_ID. // then cached via the certificate's CERT_KEY_CONTEXT_PROP_ID.
// //
// The CRYPT_ACQUIRE_USE_PROV_INFO_FLAG can be set to use the dwFlags field of // The CRYPT_ACQUIRE_USE_PROV_INFO_FLAG can be set to use the dwFlags field of
// the certificate's CERT_KEY_PROV_INFO_PROP_ID property's CRYPT_KEY_PROV_INFO // the certificate's CERT_KEY_PROV_INFO_PROP_ID property's CRYPT_KEY_PROV_INFO
// data structure to determine if the returned HCRYPTPROV should be cached. // data structure to determine if the returned HCRYPTPROV or
// HCRYPTPROV caching is enabled if the CERT_SET_KEY_CONTEXT_PROP_ID flag was // NCRYPT_KEY_HANDLE should be cached.
// Caching is enabled if the CERT_SET_KEY_CONTEXT_PROP_ID flag was
// set. // set.
// //
// If CRYPT_ACQUIRE_COMPARE_KEY_FLAG is set, then, // If CRYPT_ACQUIRE_COMPARE_KEY_FLAG is set, then,
// the public key in the certificate is compared with the public // the public key in the certificate is compared with the public
// key returned by the cryptographic provider. If the keys don't match, the // key returned by the cryptographic provider. If the keys don't match, the
// acquire fails and LastError is set to NTE_BAD_PUBLIC_KEY. Note, if // acquire fails and LastError is set to NTE_BAD_PUBLIC_KEY. Note, if
// a cached HCRYPTPROV is returned, the comparison isn't done. We assume the // a cached HCRYPTPROV or NCRYPT_KEY_HANDLE is returned, the comparison isn't
// comparison was done on the initial acquire. // done. We assume the comparison was done on the initial acquire.
//
// The CRYPT_ACQUIRE_NO_HEALING flags prohibits this function from
// attempting to recreate the CERT_KEY_PROV_INFO_PROP_ID in the certificate
// context if it fails to retrieve this property.
// //
// The CRYPT_ACQUIRE_SILENT_FLAG can be set to suppress any UI by the CSP. // The CRYPT_ACQUIRE_SILENT_FLAG can be set to suppress any UI by the CSP.
// See CryptAcquireContext's CRYPT_SILENT flag for more details. // See CryptAcquireContext's CRYPT_SILENT flag for more details.
// //
// *pfCallerFreeProv is returned set to FALSE for: // The following flags can be set to optionally open and return a CNG
// NCRYPT_KEY_HANDLE instead of a HCRYPTPROV. *pdwKeySpec is set to
// CERT_NCRYPT_KEY_SPEC when a NCRYPT_KEY_HANDLE is returned.
// CRYPT_ACQUIRE_ALLOW_NCRYPT_KEY_FLAG - if the CryptAcquireContext
// fails, then, an NCryptOpenKey is attempted.
//
// CRYPT_ACQUIRE_PREFER_NCRYPT_KEY_FLAG - the NCryptOpenKey is
// first attempted and its handle returned for success.
//
// CRYPT_ACQUIRE_ONLY_NCRYPT_KEY_FLAG - only the NCryptOpenKey is
// attempted.
//
// *pfCallerFreeProvOrNCryptKey is returned set to FALSE for:
// - Acquire or public key comparison fails. // - Acquire or public key comparison fails.
// - CRYPT_ACQUIRE_CACHE_FLAG is set. // - CRYPT_ACQUIRE_CACHE_FLAG is set.
// - CRYPT_ACQUIRE_USE_PROV_INFO_FLAG is set AND // - CRYPT_ACQUIRE_USE_PROV_INFO_FLAG is set AND
// CERT_SET_KEY_CONTEXT_PROP_ID flag is set in the dwFlags field of the // CERT_SET_KEY_CONTEXT_PROP_ID flag is set in the dwFlags field of the
// certificate's CERT_KEY_PROV_INFO_PROP_ID property's // certificate's CERT_KEY_PROV_INFO_PROP_ID property's
// CRYPT_KEY_PROV_INFO data structure. // CRYPT_KEY_PROV_INFO data structure.
// When *pfCallerFreeProv is FALSE, the caller must not release. The // When *pfCallerFreeProvOrNCryptKey is FALSE, the caller must not release. The
// returned HCRYPTPROV will be released on the last free of the certificate // returned HCRYPTPROV or NCRYPT_KEY_HANDLE will be released on the last
// context. // free of the certificate context.
//
// Otherwise, *pfCallerFreeProvOrNCryptKey is TRUE and a returned
// HCRYPTPROV must be released by the caller by calling CryptReleaseContext.
// A returned NCRYPT_KEY_HANDLE is freed by calling NCryptFreeObject.
// *pdwKeySpec MUST be checked when CRYPT_ACQUIRE_ALLOW_NCRYPT_KEY_FLAG
// or CRYPT_ACQUIRE_PREFER_NCRYPT_KEY_FLAG is set.
// //
// Otherwise, *pfCallerFreeProv is TRUE and the returned HCRYPTPROV must
// be released by the caller by calling CryptReleaseContext.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptAcquireCertificatePrivateKey( CryptAcquireCertificatePrivateKey(
IN PCCERT_CONTEXT pCert, __in PCCERT_CONTEXT pCert,
IN DWORD dwFlags, __in DWORD dwFlags,
IN void *pvReserved, __reserved void *pvReserved,
OUT HCRYPTPROV *phCryptProv, __out HCRYPTPROV_OR_NCRYPT_KEY_HANDLE *phCryptProvOrNCryptKey,
OUT OPTIONAL DWORD *pdwKeySpec, __out_opt DWORD *pdwKeySpec,
OUT OPTIONAL BOOL *pfCallerFreeProv __out_opt BOOL *pfCallerFreeProvOrNCryptKey
); );
#define CRYPT_ACQUIRE_CACHE_FLAG 0x00000001 #define CRYPT_ACQUIRE_CACHE_FLAG 0x00000001
#define CRYPT_ACQUIRE_USE_PROV_INFO_FLAG 0x00000002 #define CRYPT_ACQUIRE_USE_PROV_INFO_FLAG 0x00000002
#define CRYPT_ACQUIRE_COMPARE_KEY_FLAG 0x00000004 #define CRYPT_ACQUIRE_COMPARE_KEY_FLAG 0x00000004
#define CRYPT_ACQUIRE_NO_HEALING 0x00000008
#define CRYPT_ACQUIRE_SILENT_FLAG 0x00000040 #define CRYPT_ACQUIRE_SILENT_FLAG 0x00000040
#define CRYPT_ACQUIRE_NCRYPT_KEY_FLAGS_MASK 0x00070000
#define CRYPT_ACQUIRE_ALLOW_NCRYPT_KEY_FLAG 0x00010000
#define CRYPT_ACQUIRE_PREFER_NCRYPT_KEY_FLAG 0x00020000
#define CRYPT_ACQUIRE_ONLY_NCRYPT_KEY_FLAG 0x00040000
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Enumerates the cryptographic providers and their containers to find the // Enumerates the cryptographic providers and their containers to find the
// private key corresponding to the certificate's public key. For a match, // private key corresponding to the certificate's public key. For a match,
// the certificate's CERT_KEY_PROV_INFO_PROP_ID property is updated. // the certificate's CERT_KEY_PROV_INFO_PROP_ID property is updated.
// //
// If the CERT_KEY_PROV_INFO_PROP_ID is already set, then, its checked to // If the CERT_KEY_PROV_INFO_PROP_ID is already set, then, its checked to
// see if it matches the provider's public key. For a match, the above // see if it matches the provider's public key. For a match, the above
// enumeration is skipped. // enumeration is skipped.
// //
// By default both the user and machine key containers are searched. // By default both the user and machine key containers are searched.
// The CRYPT_FIND_USER_KEYSET_FLAG or CRYPT_FIND_MACHINE_KEYSET_FLAG // The CRYPT_FIND_USER_KEYSET_FLAG or CRYPT_FIND_MACHINE_KEYSET_FLAG
// can be set in dwFlags to restrict the search to either of the containers. // can be set in dwFlags to restrict the search to either of the containers.
// //
// The CRYPT_FIND_SILENT_KEYSET_FLAG can be set to suppress any UI by the CSP. // The CRYPT_FIND_SILENT_KEYSET_FLAG can be set to suppress any UI by the CSP.
// See CryptAcquireContext's CRYPT_SILENT flag for more details. // See CryptAcquireContext's CRYPT_SILENT flag for more details.
// //
// If a container isn't found, returns FALSE with LastError set to // If a container isn't found, returns FALSE with LastError set to
// NTE_NO_KEY. // NTE_NO_KEY.
//
// The above CRYPT_ACQUIRE_NCRYPT_KEY_FLAGS can also be set. The default
// is CRYPT_ACQUIRE_ALLOW_NCRYPT_KEY_FLAG.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptFindCertificateKeyProvInfo( CryptFindCertificateKeyProvInfo(
IN PCCERT_CONTEXT pCert, __in PCCERT_CONTEXT pCert,
IN DWORD dwFlags, __in DWORD dwFlags,
IN void *pvReserved __reserved void *pvReserved
); );
#define CRYPT_FIND_USER_KEYSET_FLAG 0x00000001 #define CRYPT_FIND_USER_KEYSET_FLAG 0x00000001
#define CRYPT_FIND_MACHINE_KEYSET_FLAG 0x00000002 #define CRYPT_FIND_MACHINE_KEYSET_FLAG 0x00000002
#define CRYPT_FIND_SILENT_KEYSET_FLAG 0x00000040 #define CRYPT_FIND_SILENT_KEYSET_FLAG 0x00000040
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// This is the prototype for the installable function which is called to // This is the prototype for the installable function which is called to
// actually import a key into a CSP. an installable of this type is called // actually import a key into a CSP. an installable of this type is called
// from CryptImportPKCS8. the algorithm OID of the private key is used // from CryptImportPKCS8. the algorithm OID of the private key is used
skipping to change at line 12057 skipping to change at line 14077
// //
// hCryptProv - the provider to import the key to // hCryptProv - the provider to import the key to
// pPrivateKeyInfo - describes the key to be imported // pPrivateKeyInfo - describes the key to be imported
// dwFlags - The available flags are: // dwFlags - The available flags are:
// CRYPT_EXPORTABLE // CRYPT_EXPORTABLE
// this flag is used when importing private keys, for a full // this flag is used when importing private keys, for a full
// explanation please see the documentation for CryptImportKey. // explanation please see the documentation for CryptImportKey.
// pvAuxInfo - reserved for future, must be NULL // pvAuxInfo - reserved for future, must be NULL
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef BOOL (WINAPI *PFN_IMPORT_PRIV_KEY_FUNC) ( typedef BOOL (WINAPI *PFN_IMPORT_PRIV_KEY_FUNC) (
HCRYPTPROV hCryptProv, // in __in HCRYPTPROV hCryptProv, // in
CRYPT_PRIVATE_KEY_INFO *pPrivateKeyInfo, // in __in CRYPT_PRIVATE_KEY_INFO* pPrivateKeyInfo, // in
DWORD dwFlags, // in, optional __in DWORD dwFlags, // in
void *pvAuxInfo // in, optional __in_opt void* pvAuxInfo // in, optional
); );
#define CRYPT_OID_IMPORT_PRIVATE_KEY_INFO_FUNC "CryptDllImportPrivateKeyInfoEx " #define CRYPT_OID_IMPORT_PRIVATE_KEY_INFO_FUNC "CryptDllImportPrivateKeyInfoEx "
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Convert (from PKCS8 format) and import the private key into a provider // Convert (from PKCS8 format) and import the private key into a provider
// and return a handle to the provider as well as the KeySpec used to import to. // and return a handle to the provider as well as the KeySpec used to import to.
// //
// This function will call the PRESOLVE_HCRYPTPROV_FUNC in the // This function will call the PRESOLVE_HCRYPTPROV_FUNC in the
// privateKeyAndParams to obtain a handle of provider to import the key to. // privateKeyAndParams to obtain a handle of provider to import the key to.
skipping to change at line 12087 skipping to change at line 14107
// explanation please see the documentation for CryptImportKey. // explanation please see the documentation for CryptImportKey.
// phCryptProv - filled in with the handle of the provider the key was // phCryptProv - filled in with the handle of the provider the key was
// imported to, the caller is responsible for freeing it // imported to, the caller is responsible for freeing it
// pvAuxInfo - This parameter is reserved for future use and should be set // pvAuxInfo - This parameter is reserved for future use and should be set
// to NULL in the interim. // to NULL in the interim.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptImportPKCS8( CryptImportPKCS8(
CRYPT_PKCS8_IMPORT_PARAMS sImportParams, // in __in CRYPT_PKCS8_IMPORT_PARAMS sPrivateKeyAndParams, // in
DWORD dwFlags, // in, optional __in DWORD dwFlags, // in
HCRYPTPROV *phCryptProv, // out, optional __out_opt HCRYPTPROV *phCryptProv, // out, optional
void *pvAuxInfo // in, optional __in_opt void* pvAuxInfo // in, optional
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// this is the prototype for installable functions for exporting the private key // this is the prototype for installable functions for exporting the private key
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef BOOL (WINAPI *PFN_EXPORT_PRIV_KEY_FUNC) ( typedef BOOL (WINAPI *PFN_EXPORT_PRIV_KEY_FUNC) (
HCRYPTPROV hCryptProv, // in __in HCRYPTPROV hCryptProv, // in
DWORD dwKeySpec, // in __in DWORD dwKeySpec, // in
LPSTR pszPrivateKeyObjId, // in __in LPSTR pszPrivateKeyObjId, // in
DWORD dwFlags, // in __in DWORD dwFlags, // in
void *pvAuxInfo, // in __in_opt void* pvAuxInfo, // in
CRYPT_PRIVATE_KEY_INFO *pPrivateKeyInfo, // out __out_bcount_opt (*pcbPrivateKeyInfo) CRYPT_PRIVATE_KEY_INFO* pPrivateKeyInf
DWORD *pcbPrivateKeyBlob // in, out o, // out
__inout DWORD* pcbPrivateKeyInfo // in, out
); );
#define CRYPT_OID_EXPORT_PRIVATE_KEY_INFO_FUNC "CryptDllExportPrivateKeyInfoEx " #define CRYPT_OID_EXPORT_PRIVATE_KEY_INFO_FUNC "CryptDllExportPrivateKeyInfoEx "
#define CRYPT_DELETE_KEYSET 0x0001 #define CRYPT_DELETE_KEYSET 0x0001
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CryptExportPKCS8 -- superseded by CryptExportPKCS8Ex // CryptExportPKCS8 -- superseded by CryptExportPKCS8Ex
// //
// Export the private key in PKCS8 format // Export the private key in PKCS8 format
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptExportPKCS8( CryptExportPKCS8(
HCRYPTPROV hCryptProv, // in __in HCRYPTPROV hCryptProv, // in
DWORD dwKeySpec, // in __in DWORD dwKeySpec, // in
LPSTR pszPrivateKeyObjId, // in __in LPSTR pszPrivateKeyObjId, // in
DWORD dwFlags, // in __in DWORD dwFlags, // in
void *pvAuxInfo, // in __in_opt void* pvAuxInfo, // in
BYTE *pbPrivateKeyBlob, // out __out_bcount_opt (*pcbPrivateKeyBlob) BYTE* pbPrivateKeyBlob, // out
DWORD *pcbPrivateKeyBlob // in, out __inout DWORD *pcbPrivateKeyBlob // in, out
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CryptExportPKCS8Ex // CryptExportPKCS8Ex
// //
// Export the private key in PKCS8 format // Export the private key in PKCS8 format
// //
// //
// Uses the pszPrivateKeyObjId to call the // Uses the pszPrivateKeyObjId to call the
// installable CRYPT_OID_EXPORT_PRIVATE_KEY_INFO_FUNC. The called function // installable CRYPT_OID_EXPORT_PRIVATE_KEY_INFO_FUNC. The called function
skipping to change at line 12153 skipping to change at line 14173
// NULL in the interim. // NULL in the interim.
// pbPrivateKeyBlob - A pointer to the private key blob. It will be encoded // pbPrivateKeyBlob - A pointer to the private key blob. It will be encoded
// as a PKCS8 PrivateKeyInfo. // as a PKCS8 PrivateKeyInfo.
// pcbPrivateKeyBlob - A pointer to a DWORD that contains the size, in bytes, // pcbPrivateKeyBlob - A pointer to a DWORD that contains the size, in bytes,
// of the private key blob being exporte d. // of the private key blob being exporte d.
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptExportPKCS8Ex( CryptExportPKCS8Ex(
CRYPT_PKCS8_EXPORT_PARAMS* psExportParams, // in __in CRYPT_PKCS8_EXPORT_PARAMS* psExportParams, // in
DWORD dwFlags, // in __in DWORD dwFlags, // in
void *pvAuxInfo, // in __in_opt void* pvAuxInfo, // in
BYTE *pbPrivateKeyBlob, // out __out_bcount_opt (*pcbPrivateKeyBlob) BYTE* pbPrivateKeyBlob, // out
DWORD *pcbPrivateKeyBlob // in, out __inout DWORD* pcbPrivateKeyBlob // in, out
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Compute the hash of the encoded public key info. // Compute the hash of the encoded public key info.
// //
// The public key info is encoded and then hashed. // The public key info is encoded and then hashed.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptHashPublicKeyInfo( CryptHashPublicKeyInfo(
IN HCRYPTPROV hCryptProv, __in_opt HCRYPTPROV_LEGACY hCryptProv,
IN ALG_ID Algid, __in ALG_ID Algid,
IN DWORD dwFlags, __in DWORD dwFlags,
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN PCERT_PUBLIC_KEY_INFO pInfo, __in PCERT_PUBLIC_KEY_INFO pInfo,
OUT BYTE *pbComputedHash, __out_bcount_part_opt(*pcbComputedHash, *pcbComputedHash) BYTE *pbComputedHa
IN OUT DWORD *pcbComputedHash sh,
__inout DWORD *pcbComputedHash
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Convert a Name Value to a null terminated char string // Convert a Name Value to a null terminated char string
// //
// Returns the number of characters converted including the terminating null // Returns the number of characters converted including the terminating null
// character. If psz is NULL or csz is 0, returns the required size of the // character. If psz is NULL or csz is 0, returns the required size of the
// destination string (including the terminating null char). // destination string (including the terminating null char).
// //
// If psz != NULL && csz != 0, returned psz is always NULL terminated. // If psz != NULL && csz != 0, returned psz is always NULL terminated.
// //
// Note: csz includes the NULL char. // Note: csz includes the NULL char.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
DWORD DWORD
WINAPI WINAPI
CertRDNValueToStrA( CertRDNValueToStrA(
IN DWORD dwValueType, __in DWORD dwValueType,
IN PCERT_RDN_VALUE_BLOB pValue, __in PCERT_RDN_VALUE_BLOB pValue,
OUT OPTIONAL LPSTR psz, __out_ecount_part_opt(csz, return) LPSTR psz,
IN DWORD csz __in DWORD csz
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Convert a Name Value to a null terminated char string // Convert a Name Value to a null terminated char string
// //
// Returns the number of characters converted including the terminating null // Returns the number of characters converted including the terminating null
// character. If psz is NULL or csz is 0, returns the required size of the // character. If psz is NULL or csz is 0, returns the required size of the
// destination string (including the terminating null char). // destination string (including the terminating null char).
// //
// If psz != NULL && csz != 0, returned psz is always NULL terminated. // If psz != NULL && csz != 0, returned psz is always NULL terminated.
// //
// Note: csz includes the NULL char. // Note: csz includes the NULL char.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
DWORD DWORD
WINAPI WINAPI
CertRDNValueToStrW( CertRDNValueToStrW(
IN DWORD dwValueType, __in DWORD dwValueType,
IN PCERT_RDN_VALUE_BLOB pValue, __in PCERT_RDN_VALUE_BLOB pValue,
OUT OPTIONAL LPWSTR psz, __out_ecount_part_opt(csz, return) LPWSTR psz,
IN DWORD csz __in DWORD csz
); );
#ifdef UNICODE #ifdef UNICODE
#define CertRDNValueToStr CertRDNValueToStrW #define CertRDNValueToStr CertRDNValueToStrW
#else #else
#define CertRDNValueToStr CertRDNValueToStrA #define CertRDNValueToStr CertRDNValueToStrA
#endif // !UNICODE #endif // !UNICODE
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Convert the certificate name blob to a null terminated char string. // Convert the certificate name blob to a null terminated char string.
// //
skipping to change at line 12250 skipping to change at line 14270
// The object identifiers are included with a "=" separator from their // The object identifiers are included with a "=" separator from their
// attribute value. CERT_RDN entries are separated by ", ". // attribute value. CERT_RDN entries are separated by ", ".
// Multiple attributes per CERT_RDN are separated by " + ". For example: // Multiple attributes per CERT_RDN are separated by " + ". For example:
// 2.5.4.11=Microsoft, 2.5.4.3=Joe Cool + 2.5.4.12=Programmer // 2.5.4.11=Microsoft, 2.5.4.3=Joe Cool + 2.5.4.12=Programmer
// CERT_X500_NAME_STR // CERT_X500_NAME_STR
// The object identifiers are converted to their X500 key name. Otherwise, // The object identifiers are converted to their X500 key name. Otherwise,
// same as CERT_OID_NAME_STR. If the object identifier doesn't have // same as CERT_OID_NAME_STR. If the object identifier doesn't have
// a corresponding X500 key name, then, the object identifier is used with // a corresponding X500 key name, then, the object identifier is used with
// a "OID." prefix. For example: // a "OID." prefix. For example:
// OU=Microsoft, CN=Joe Cool + T=Programmer, OID.1.2.3.4.5.6=Unknown // OU=Microsoft, CN=Joe Cool + T=Programmer, OID.1.2.3.4.5.6=Unknown
// CERT_XML_NAME_STR
// The object identifiers are converted the same as the above
// CERT_X500_NAME_STR. However, formatted as sequence of XML elements.
// Here's an example:
// <CN>cart.barnesandnoble.com</CN>
// <OU>Terms of use at www.verisign.com/rpa (c)00</OU>
// <OU rDNAttribute="true">IT Operations</OU>
// <O>Barnesandnoble.com</O>
// <L>New York</L>
// <S>New York</S>
// <C>US</C>
// <RDN oid="1.2.3.4" type="string">name</RDN>
// <RDN rDNAttribute="true" oid="1.2.1.3" type="encoded">0500</RDN>
// <RDN oid="1.2.1.4" type="encoded">020135</RDN>
// <RDN oid="1.2.2.5.3" type="octet">01FF7F</RDN>
// Where:
// Any XML markup characters are escaped:
// L'&' - L"&amp;"
// L'<' - L"&lt;"
// L'>' - L"&gt;"
// L'\'' - L"&apos;"
// L'\"' - L"&quot;"
// Will escape characters > 0x7F via chararacter references,
// L"&#xXXXX;"
//
// CERT_NAME_STR_REVERSE_FLAG and CERT_NAME_STR_CRLF_FLAG can be set.
// The following quoting, semicolon and plus semantics aren't
// applicable. The "+" is replaced with rDNAttribute="true".
//
// //
// We quote the RDN value if it contains leading or trailing whitespace // We quote the RDN value if it contains leading or trailing whitespace
// or one of the following characters: ",", "+", "=", """, "\n", "<", ">", // or one of the following characters: ",", "+", "=", """, "\n", "<", ">",
// "#" or ";". The quoting character is ". If the the RDN Value contains // "#" or ";". The quoting character is ". If the the RDN Value contains
// a " it is double quoted (""). For example: // a " it is double quoted (""). For example:
// OU=" Microsoft", CN="Joe ""Cool""" + T="Programmer, Manager" // OU=" Microsoft", CN="Joe ""Cool""" + T="Programmer, Manager"
// //
// CERT_NAME_STR_SEMICOLON_FLAG can be or'ed into dwStrType to replace // CERT_NAME_STR_SEMICOLON_FLAG can be or'ed into dwStrType to replace
// the ", " separator with a "; " separator. // the ", " separator with a "; " separator.
// //
skipping to change at line 12292 skipping to change at line 14341
// //
// Note: csz includes the NULL char. // Note: csz includes the NULL char.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
DWORD DWORD
WINAPI WINAPI
CertNameToStrA( CertNameToStrA(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN PCERT_NAME_BLOB pName, __in PCERT_NAME_BLOB pName,
IN DWORD dwStrType, __in DWORD dwStrType,
OUT OPTIONAL LPSTR psz, __out_ecount_part_opt(csz, return) LPSTR psz,
IN DWORD csz __in DWORD csz
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
DWORD DWORD
WINAPI WINAPI
CertNameToStrW( CertNameToStrW(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN PCERT_NAME_BLOB pName, __in PCERT_NAME_BLOB pName,
IN DWORD dwStrType, __in DWORD dwStrType,
OUT OPTIONAL LPWSTR psz, __out_ecount_part_opt(csz, return) LPWSTR psz,
IN DWORD csz __in DWORD csz
); );
#ifdef UNICODE #ifdef UNICODE
#define CertNameToStr CertNameToStrW #define CertNameToStr CertNameToStrW
#else #else
#define CertNameToStr CertNameToStrA #define CertNameToStr CertNameToStrA
#endif // !UNICODE #endif // !UNICODE
// certenrolld_begin -- CERT_NAME_STR_*_FLAG
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Certificate name string types // Certificate name string types
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CERT_SIMPLE_NAME_STR 1 #define CERT_SIMPLE_NAME_STR 1
#define CERT_OID_NAME_STR 2 #define CERT_OID_NAME_STR 2
#define CERT_X500_NAME_STR 3 #define CERT_X500_NAME_STR 3
#define CERT_XML_NAME_STR 4
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Certificate name string type flags OR'ed with the above types // Certificate name string type flags OR'ed with the above types
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#define CERT_NAME_STR_SEMICOLON_FLAG 0x40000000 #define CERT_NAME_STR_SEMICOLON_FLAG 0x40000000
#define CERT_NAME_STR_NO_PLUS_FLAG 0x20000000 #define CERT_NAME_STR_NO_PLUS_FLAG 0x20000000
#define CERT_NAME_STR_NO_QUOTING_FLAG 0x10000000 #define CERT_NAME_STR_NO_QUOTING_FLAG 0x10000000
#define CERT_NAME_STR_CRLF_FLAG 0x08000000 #define CERT_NAME_STR_CRLF_FLAG 0x08000000
#define CERT_NAME_STR_COMMA_FLAG 0x04000000 #define CERT_NAME_STR_COMMA_FLAG 0x04000000
#define CERT_NAME_STR_REVERSE_FLAG 0x02000000 #define CERT_NAME_STR_REVERSE_FLAG 0x02000000
#define CERT_NAME_STR_FORWARD_FLAG 0x01000000
#define CERT_NAME_STR_DISABLE_IE4_UTF8_FLAG 0x00010000 #define CERT_NAME_STR_DISABLE_IE4_UTF8_FLAG 0x00010000
#define CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG 0x00020000 #define CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG 0x00020000
#define CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG 0x00040000 #define CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG 0x00040000
#define CERT_NAME_STR_FORCE_UTF8_DIR_STR_FLAG 0x00080000 #define CERT_NAME_STR_FORCE_UTF8_DIR_STR_FLAG 0x00080000
#define CERT_NAME_STR_DISABLE_UTF8_DIR_STR_FLAG 0x00100000
// certenrolld_end
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Convert the null terminated X500 string to an encoded certificate name. // Convert the null terminated X500 string to an encoded certificate name.
// //
// The input string is expected to be formatted the same as the output // The input string is expected to be formatted the same as the output
// from the above CertNameToStr API. // from the above CertNameToStr API.
// //
// The CERT_SIMPLE_NAME_STR type isn't supported. Otherwise, when dwStrType // The CERT_SIMPLE_NAME_STR type and CERT_XML_NAME_STR aren't supported.
// Otherwise, when dwStrType
// is set to 0, CERT_OID_NAME_STR or CERT_X500_NAME_STR, allow either a // is set to 0, CERT_OID_NAME_STR or CERT_X500_NAME_STR, allow either a
// case insensitive X500 key (CN=), case insensitive "OID." prefixed // case insensitive X500 key (CN=), case insensitive "OID." prefixed
// object identifier (OID.1.2.3.4.5.6=) or an object identifier (1.2.3.4=). // object identifier (OID.1.2.3.4.5.6=) or an object identifier (1.2.3.4=).
// //
// If no flags are OR'ed into dwStrType, then, allow "," or ";" as RDN // If no flags are OR'ed into dwStrType, then, allow "," or ";" as RDN
// separators and "+" as the multiple RDN value separator. Quoting is // separators and "+" as the multiple RDN value separator. Quoting is
// supported. A quote may be included in a quoted value by double quoting, // supported. A quote may be included in a quoted value by double quoting,
// for example (CN="Joe ""Cool"""). A value starting with a "#" is treated // for example (CN="Joe ""Cool"""). A value starting with a "#" is treated
// as ascii hex and converted to a CERT_RDN_OCTET_STRING. Embedded whitespace // as ascii hex and converted to a CERT_RDN_OCTET_STRING. Embedded whitespace
// is skipped (1.2.3 = # AB CD 01 is the same as 1.2.3=#ABCD01). // is skipped (1.2.3 = # AB CD 01 is the same as 1.2.3=#ABCD01).
skipping to change at line 12376 skipping to change at line 14431
// //
// CERT_NAME_STR_NO_PLUS_FLAG can be or'ed into dwStrType to ignore "+" // CERT_NAME_STR_NO_PLUS_FLAG can be or'ed into dwStrType to ignore "+"
// as a separator and not allow multiple values per RDN. // as a separator and not allow multiple values per RDN.
// //
// CERT_NAME_STR_NO_QUOTING_FLAG can be or'ed into dwStrType to inhibit // CERT_NAME_STR_NO_QUOTING_FLAG can be or'ed into dwStrType to inhibit
// quoting. // quoting.
// //
// CERT_NAME_STR_REVERSE_FLAG can be or'ed into dwStrType to reverse the // CERT_NAME_STR_REVERSE_FLAG can be or'ed into dwStrType to reverse the
// order of the RDNs after converting from the string and before encoding. // order of the RDNs after converting from the string and before encoding.
// //
// CERT_NAME_STR_FORWARD_FLAG can be or'ed into dwStrType to defeat setting
// CERT_NAME_STR_REVERSE_FLAG, if reverse order becomes the default.
//
// CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG can be or'ed into dwStrType to // CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG can be or'ed into dwStrType to
// to select the CERT_RDN_T61_STRING encoded value type instead of // to select the CERT_RDN_T61_STRING encoded value type instead of
// CERT_RDN_UNICODE_STRING if all the UNICODE characters are <= 0xFF. // CERT_RDN_UNICODE_STRING if all the UNICODE characters are <= 0xFF.
// //
// CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG can be or'ed into dwStrType to // CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG can be or'ed into dwStrType to
// to select the CERT_RDN_UTF8_STRING encoded value type instead of // to select the CERT_RDN_UTF8_STRING encoded value type instead of
// CERT_RDN_UNICODE_STRING. // CERT_RDN_UNICODE_STRING.
// //
// CERT_NAME_STR_FORCE_UTF8_DIR_STR_FLAG can be or'ed into dwStrType // CERT_NAME_STR_FORCE_UTF8_DIR_STR_FLAG can be or'ed into dwStrType
// to force the CERT_RDN_UTF8_STRING encoded value type instead of // to force the CERT_RDN_UTF8_STRING encoded value type instead of
// allowing CERT_RDN_PRINTABLE_STRING for DirectoryString types. // allowing CERT_RDN_PRINTABLE_STRING for DirectoryString types.
// Applies to the X500 Keys below which allow "Printable, Unicode". // Applies to the X500 Keys below which allow "Printable, Unicode".
// Also, enables CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG. // Also, enables CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG.
// //
// CERT_NAME_STR_DISABLE_UTF8_DIR_STR_FLAG can be or'ed into dwStrType to
// defeat setting CERT_NAME_STR_FORCE_UTF8_DIR_STR_FLAG, if forcing UTF-8
// becomes the default.
//
// Support the following X500 Keys: // Support the following X500 Keys:
// //
// Key Object Identifier RDN Value Type(s) // Key Object Identifier RDN Value Type(s)
// --- ----------------- ----------------- // --- ----------------- -----------------
// CN szOID_COMMON_NAME Printable, Unicode // CN szOID_COMMON_NAME Printable, Unicode
// L szOID_LOCALITY_NAME Printable, Unicode // L szOID_LOCALITY_NAME Printable, Unicode
// O szOID_ORGANIZATION_NAME Printable, Unicode // O szOID_ORGANIZATION_NAME Printable, Unicode
// OU szOID_ORGANIZATIONAL_UNIT_NAME Printable, Unicode // OU szOID_ORGANIZATIONAL_UNIT_NAME Printable, Unicode
// E szOID_RSA_emailAddr Only IA5 // E szOID_RSA_emailAddr Only IA5
// Email szOID_RSA_emailAddr Only IA5 // Email szOID_RSA_emailAddr Only IA5
skipping to change at line 12444 skipping to change at line 14506
// ppszError can be set to NULL if not interested in getting a pointer // ppszError can be set to NULL if not interested in getting a pointer
// to the invalid character sequence. // to the invalid character sequence.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertStrToNameA( CertStrToNameA(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN LPCSTR pszX500, __in LPCSTR pszX500,
IN DWORD dwStrType, __in DWORD dwStrType,
IN OPTIONAL void *pvReserved, __reserved void *pvReserved,
OUT BYTE *pbEncoded, __out_bcount_part_opt(*pcbEncoded, *pcbEncoded) BYTE *pbEncoded,
IN OUT DWORD *pcbEncoded, __inout DWORD *pcbEncoded,
OUT OPTIONAL LPCSTR *ppszError __deref_opt_out_opt LPCSTR *ppszError
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertStrToNameW( CertStrToNameW(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN LPCWSTR pszX500, __in LPCWSTR pszX500,
IN DWORD dwStrType, __in DWORD dwStrType,
IN OPTIONAL void *pvReserved, __reserved void *pvReserved,
OUT BYTE *pbEncoded, __out_bcount_part_opt(*pcbEncoded, *pcbEncoded) BYTE *pbEncoded,
IN OUT DWORD *pcbEncoded, __inout DWORD *pcbEncoded,
OUT OPTIONAL LPCWSTR *ppszError __deref_opt_out_opt LPCWSTR *ppszError
); );
#ifdef UNICODE #ifdef UNICODE
#define CertStrToName CertStrToNameW #define CertStrToName CertStrToNameW
#else #else
#define CertStrToName CertStrToNameA #define CertStrToName CertStrToNameA
#endif // !UNICODE #endif // !UNICODE
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Get the subject or issuer name from the certificate and // Get the subject or issuer name from the certificate and
// according to the specified format type, convert to a null terminated // according to the specified format type, convert to a null terminated
skipping to change at line 12568 skipping to change at line 14630
// //
// Note: cchNameString includes the NULL char. // Note: cchNameString includes the NULL char.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
DWORD DWORD
WINAPI WINAPI
CertGetNameStringA( CertGetNameStringA(
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN DWORD dwType, __in DWORD dwType,
IN DWORD dwFlags, __in DWORD dwFlags,
IN void *pvTypePara, __in_opt void *pvTypePara,
OUT OPTIONAL LPSTR pszNameString, __out_ecount_part_opt(cchNameString, return) LPSTR pszNameString,
IN DWORD cchNameString __in DWORD cchNameString
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
DWORD DWORD
WINAPI WINAPI
CertGetNameStringW( CertGetNameStringW(
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN DWORD dwType, __in DWORD dwType,
IN DWORD dwFlags, __in DWORD dwFlags,
IN void *pvTypePara, __in_opt void *pvTypePara,
OUT OPTIONAL LPWSTR pszNameString, __out_ecount_part_opt(cchNameString, return) LPWSTR pszNameString,
IN DWORD cchNameString __in DWORD cchNameString
); );
#ifdef UNICODE #ifdef UNICODE
#define CertGetNameString CertGetNameStringW #define CertGetNameString CertGetNameStringW
#else #else
#define CertGetNameString CertGetNameStringA #define CertGetNameString CertGetNameStringA
#endif // !UNICODE #endif // !UNICODE
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Certificate name types // Certificate name types
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
skipping to change at line 12664 skipping to change at line 14726
// //
// Note, if the KEYID choice was selected for a CMS SignerId, then, the // Note, if the KEYID choice was selected for a CMS SignerId, then, the
// SerialNumber is 0 and the Issuer is encoded containing a single RDN with a // SerialNumber is 0 and the Issuer is encoded containing a single RDN with a
// single Attribute whose OID is szOID_KEYID_RDN, value type is // single Attribute whose OID is szOID_KEYID_RDN, value type is
// CERT_RDN_OCTET_STRING and value is the KEYID. When the // CERT_RDN_OCTET_STRING and value is the KEYID. When the
// CertGetSubjectCertificateFromStore and // CertGetSubjectCertificateFromStore and
// CertFindCertificateInStore(CERT_FIND_SUBJECT_CERT) APIs see this // CertFindCertificateInStore(CERT_FIND_SUBJECT_CERT) APIs see this
// special KEYID Issuer and SerialNumber, they do a KEYID match. // special KEYID Issuer and SerialNumber, they do a KEYID match.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef PCCERT_CONTEXT (WINAPI *PFN_CRYPT_GET_SIGNER_CERTIFICATE)( typedef PCCERT_CONTEXT (WINAPI *PFN_CRYPT_GET_SIGNER_CERTIFICATE)(
IN void *pvGetArg, __inout_opt void *pvGetArg,
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN PCERT_INFO pSignerId, // Only the Issuer and SerialNumber __in PCERT_INFO pSignerId, // Only the Issuer and SerialNumber
// fields have been updated // fields have been updated
IN HCERTSTORE hMsgCertStore __in HCERTSTORE hMsgCertStore
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// The CRYPT_SIGN_MESSAGE_PARA are used for signing messages using the // The CRYPT_SIGN_MESSAGE_PARA are used for signing messages using the
// specified signing certificate context. // specified signing certificate context.
// //
// Either the CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_PROV_INFO_PROP_ID must // Either the CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_PROV_INFO_PROP_ID must
// be set for each rgpSigningCert[]. Either one specifies the private // be set for each rgpSigningCert[]. Either one specifies the private
// signature key to use. // signature key to use.
// //
skipping to change at line 12740 skipping to change at line 14802
DWORD cMsgCrl; DWORD cMsgCrl;
PCCRL_CONTEXT *rgpMsgCrl; PCCRL_CONTEXT *rgpMsgCrl;
DWORD cAuthAttr; DWORD cAuthAttr;
PCRYPT_ATTRIBUTE rgAuthAttr; PCRYPT_ATTRIBUTE rgAuthAttr;
DWORD cUnauthAttr; DWORD cUnauthAttr;
PCRYPT_ATTRIBUTE rgUnauthAttr; PCRYPT_ATTRIBUTE rgUnauthAttr;
DWORD dwFlags; DWORD dwFlags;
DWORD dwInnerContentType; DWORD dwInnerContentType;
#ifdef CRYPT_SIGN_MESSAGE_PARA_HAS_CMS_FIELDS #ifdef CRYPT_SIGN_MESSAGE_PARA_HAS_CMS_FIELDS
// This is also referred to as the SignatureAlgorithm
CRYPT_ALGORITHM_IDENTIFIER HashEncryptionAlgorithm; CRYPT_ALGORITHM_IDENTIFIER HashEncryptionAlgorithm;
void *pvHashEncryptionAuxInfo; void *pvHashEncryptionAuxInfo;
#endif #endif
} CRYPT_SIGN_MESSAGE_PARA, *PCRYPT_SIGN_MESSAGE_PARA; } CRYPT_SIGN_MESSAGE_PARA, *PCRYPT_SIGN_MESSAGE_PARA;
#define CRYPT_MESSAGE_BARE_CONTENT_OUT_FLAG 0x00000001 #define CRYPT_MESSAGE_BARE_CONTENT_OUT_FLAG 0x00000001
// When set, nonData type inner content is encapsulated within an // When set, nonData type inner content is encapsulated within an
// OCTET STRING // OCTET STRING
#define CRYPT_MESSAGE_ENCAPSULATED_CONTENT_OUT_FLAG 0x00000002 #define CRYPT_MESSAGE_ENCAPSULATED_CONTENT_OUT_FLAG 0x00000002
skipping to change at line 12776 skipping to change at line 14839
// //
// pfnGetSignerCertificate is called to get and verify the message signer's // pfnGetSignerCertificate is called to get and verify the message signer's
// certificate. // certificate.
// //
// cbSize must be set to the sizeof(CRYPT_VERIFY_MESSAGE_PARA) or else // cbSize must be set to the sizeof(CRYPT_VERIFY_MESSAGE_PARA) or else
// LastError will be updated with E_INVALIDARG. // LastError will be updated with E_INVALIDARG.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CRYPT_VERIFY_MESSAGE_PARA { typedef struct _CRYPT_VERIFY_MESSAGE_PARA {
DWORD cbSize; DWORD cbSize;
DWORD dwMsgAndCertEncodingType; DWORD dwMsgAndCertEncodingType;
HCRYPTPROV hCryptProv; HCRYPTPROV_LEGACY hCryptProv;
PFN_CRYPT_GET_SIGNER_CERTIFICATE pfnGetSignerCertificate; PFN_CRYPT_GET_SIGNER_CERTIFICATE pfnGetSignerCertificate;
void *pvGetArg; void *pvGetArg;
} CRYPT_VERIFY_MESSAGE_PARA, *PCRYPT_VERIFY_MESSAGE_PARA; } CRYPT_VERIFY_MESSAGE_PARA, *PCRYPT_VERIFY_MESSAGE_PARA;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// The CRYPT_ENCRYPT_MESSAGE_PARA are used for encrypting messages. // The CRYPT_ENCRYPT_MESSAGE_PARA are used for encrypting messages.
// //
// hCryptProv is used to do content encryption, recipient key // hCryptProv is used to do content encryption, recipient key
// encryption, and recipient key export. Its private key // encryption, and recipient key export. Its private key
// isn't used. // isn't used.
skipping to change at line 12823 skipping to change at line 14886
// For CMS messages, CRYPT_MESSAGE_ENCAPSULATED_CONTENT_OUT_FLAG may be // For CMS messages, CRYPT_MESSAGE_ENCAPSULATED_CONTENT_OUT_FLAG may be
// set to encapsulate nonData inner content within an OCTET STRING before // set to encapsulate nonData inner content within an OCTET STRING before
// encrypting. // encrypting.
// //
// For CMS messages, CRYPT_MESSAGE_KEYID_RECIPIENT_FLAG may be set to identify // For CMS messages, CRYPT_MESSAGE_KEYID_RECIPIENT_FLAG may be set to identify
// recipients by their Key Identifier and not their Issuer and Serial Number. // recipients by their Key Identifier and not their Issuer and Serial Number.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CRYPT_ENCRYPT_MESSAGE_PARA { typedef struct _CRYPT_ENCRYPT_MESSAGE_PARA {
DWORD cbSize; DWORD cbSize;
DWORD dwMsgEncodingType; DWORD dwMsgEncodingType;
HCRYPTPROV hCryptProv; HCRYPTPROV_LEGACY hCryptProv;
CRYPT_ALGORITHM_IDENTIFIER ContentEncryptionAlgorithm; CRYPT_ALGORITHM_IDENTIFIER ContentEncryptionAlgorithm;
void *pvEncryptionAuxInfo; void *pvEncryptionAuxInfo;
DWORD dwFlags; DWORD dwFlags;
DWORD dwInnerContentType; DWORD dwInnerContentType;
} CRYPT_ENCRYPT_MESSAGE_PARA, *PCRYPT_ENCRYPT_MESSAGE_PARA; } CRYPT_ENCRYPT_MESSAGE_PARA, *PCRYPT_ENCRYPT_MESSAGE_PARA;
// When set, recipients are identified by their Key Identifier and not // When set, recipients are identified by their Key Identifier and not
// their Issuer and Serial Number. // their Issuer and Serial Number.
#define CRYPT_MESSAGE_KEYID_RECIPIENT_FLAG 0x4 #define CRYPT_MESSAGE_KEYID_RECIPIENT_FLAG 0x4
skipping to change at line 12884 skipping to change at line 14947
// hCryptProv is used to compute the hash. // hCryptProv is used to compute the hash.
// //
// pvHashAuxInfo currently isn't used and must be set to NULL. // pvHashAuxInfo currently isn't used and must be set to NULL.
// //
// cbSize must be set to the sizeof(CRYPT_HASH_MESSAGE_PARA) or else // cbSize must be set to the sizeof(CRYPT_HASH_MESSAGE_PARA) or else
// LastError will be updated with E_INVALIDARG. // LastError will be updated with E_INVALIDARG.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CRYPT_HASH_MESSAGE_PARA { typedef struct _CRYPT_HASH_MESSAGE_PARA {
DWORD cbSize; DWORD cbSize;
DWORD dwMsgEncodingType; DWORD dwMsgEncodingType;
HCRYPTPROV hCryptProv; HCRYPTPROV_LEGACY hCryptProv;
CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm; CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
void *pvHashAuxInfo; void *pvHashAuxInfo;
} CRYPT_HASH_MESSAGE_PARA, *PCRYPT_HASH_MESSAGE_PARA; } CRYPT_HASH_MESSAGE_PARA, *PCRYPT_HASH_MESSAGE_PARA;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// The CRYPT_KEY_SIGN_MESSAGE_PARA are used for signing messages until a // The CRYPT_KEY_SIGN_MESSAGE_PARA are used for signing messages until a
// certificate has been created for the signature key. // certificate has been created for the signature key.
// //
// pvHashAuxInfo currently isn't used and must be set to NULL. // pvHashAuxInfo currently isn't used and must be set to NULL.
// //
// If PubKeyAlgorithm isn't set, defaults to szOID_RSA_RSA. // If PubKeyAlgorithm isn't set, defaults to szOID_RSA_RSA.
// //
// cbSize must be set to the sizeof(CRYPT_KEY_SIGN_MESSAGE_PARA) or else // cbSize must be set to the sizeof(CRYPT_KEY_SIGN_MESSAGE_PARA) or else
// LastError will be updated with E_INVALIDARG. // LastError will be updated with E_INVALIDARG.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CRYPT_KEY_SIGN_MESSAGE_PARA { typedef struct _CRYPT_KEY_SIGN_MESSAGE_PARA {
DWORD cbSize; DWORD cbSize;
DWORD dwMsgAndCertEncodingType; DWORD dwMsgAndCertEncodingType;
HCRYPTPROV hCryptProv;
// NCryptIsKeyHandle() is called to determine the union choice.
union {
HCRYPTPROV hCryptProv;
NCRYPT_KEY_HANDLE hNCryptKey;
};
// not applicable for hNCryptKey choice
DWORD dwKeySpec; DWORD dwKeySpec;
CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm; CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
void *pvHashAuxInfo; void *pvHashAuxInfo;
// This is also referred to as the SignatureAlgorithm
CRYPT_ALGORITHM_IDENTIFIER PubKeyAlgorithm; CRYPT_ALGORITHM_IDENTIFIER PubKeyAlgorithm;
} CRYPT_KEY_SIGN_MESSAGE_PARA, *PCRYPT_KEY_SIGN_MESSAGE_PARA; } CRYPT_KEY_SIGN_MESSAGE_PARA, *PCRYPT_KEY_SIGN_MESSAGE_PARA;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// The CRYPT_KEY_VERIFY_MESSAGE_PARA are used to verify signed messages without // The CRYPT_KEY_VERIFY_MESSAGE_PARA are used to verify signed messages without
// a certificate for the signer. // a certificate for the signer.
// //
// Normally used until a certificate has been created for the key. // Normally used until a certificate has been created for the key.
// //
// hCryptProv is used to do hashing and signature verification. // hCryptProv is used to do hashing and signature verification.
// //
// cbSize must be set to the sizeof(CRYPT_KEY_VERIFY_MESSAGE_PARA) or else // cbSize must be set to the sizeof(CRYPT_KEY_VERIFY_MESSAGE_PARA) or else
// LastError will be updated with E_INVALIDARG. // LastError will be updated with E_INVALIDARG.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef struct _CRYPT_KEY_VERIFY_MESSAGE_PARA { typedef struct _CRYPT_KEY_VERIFY_MESSAGE_PARA {
DWORD cbSize; DWORD cbSize;
DWORD dwMsgEncodingType; DWORD dwMsgEncodingType;
HCRYPTPROV hCryptProv; HCRYPTPROV_LEGACY hCryptProv;
} CRYPT_KEY_VERIFY_MESSAGE_PARA, *PCRYPT_KEY_VERIFY_MESSAGE_PARA; } CRYPT_KEY_VERIFY_MESSAGE_PARA, *PCRYPT_KEY_VERIFY_MESSAGE_PARA;
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Sign the message. // Sign the message.
// //
// If fDetachedSignature is TRUE, the "to be signed" content isn't included // If fDetachedSignature is TRUE, the "to be signed" content isn't included
// in the encoded signed blob. // in the encoded signed blob.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptSignMessage( CryptSignMessage(
IN PCRYPT_SIGN_MESSAGE_PARA pSignPara, __in PCRYPT_SIGN_MESSAGE_PARA pSignPara,
IN BOOL fDetachedSignature, __in BOOL fDetachedSignature,
IN DWORD cToBeSigned, __in DWORD cToBeSigned,
IN const BYTE *rgpbToBeSigned[], __in_ecount_opt(cToBeSigned) const BYTE *rgpbToBeSigned[],
IN DWORD rgcbToBeSigned[], __in_ecount(cToBeSigned) DWORD rgcbToBeSigned[],
OUT BYTE *pbSignedBlob, __out_bcount_part_opt(*pcbSignedBlob, *pcbSignedBlob) BYTE *pbSignedBlob,
IN OUT DWORD *pcbSignedBlob __inout DWORD *pcbSignedBlob
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Verify a signed message. // Verify a signed message.
// //
// If pbDecoded == NULL, then, *pcbDecoded is implicitly set to 0 on input. // If pbDecoded == NULL, then, *pcbDecoded is implicitly set to 0 on input.
// For *pcbDecoded == 0 && ppSignerCert == NULL on input, the signer isn't // For *pcbDecoded == 0 && ppSignerCert == NULL on input, the signer isn't
// verified. // verified.
// //
// A message might have more than one signer. Set dwSignerIndex to iterate // A message might have more than one signer. Set dwSignerIndex to iterate
skipping to change at line 12986 skipping to change at line 15058
// CRYPT_E_NO_SIGNER. Also, for CRYPT_E_NO_SIGNER, pfnGetSignerCertificate // CRYPT_E_NO_SIGNER. Also, for CRYPT_E_NO_SIGNER, pfnGetSignerCertificate
// is still called with pSignerId set to NULL. // is still called with pSignerId set to NULL.
// //
// Note, an alternative way to get the certificates and CRLs from a // Note, an alternative way to get the certificates and CRLs from a
// signed message is to call CryptGetMessageCertificates. // signed message is to call CryptGetMessageCertificates.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptVerifyMessageSignature( CryptVerifyMessageSignature(
IN PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara, __in PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
IN DWORD dwSignerIndex, __in DWORD dwSignerIndex,
IN const BYTE *pbSignedBlob, __in_bcount(cbSignedBlob) const BYTE *pbSignedBlob,
IN DWORD cbSignedBlob, __in DWORD cbSignedBlob,
OUT BYTE OPTIONAL *pbDecoded, __out_bcount_part_opt(*pcbDecoded, *pcbDecoded) BYTE *pbDecoded,
IN OUT OPTIONAL DWORD *pcbDecoded, __inout_opt DWORD *pcbDecoded,
OUT OPTIONAL PCCERT_CONTEXT *ppSignerCert __deref_opt_out_opt PCCERT_CONTEXT *ppSignerCert
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Returns the count of signers in the signed message. For no signers, returns // Returns the count of signers in the signed message. For no signers, returns
// 0. For an error returns -1 with LastError updated accordingly. // 0. For an error returns -1 with LastError updated accordingly.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
LONG LONG
WINAPI WINAPI
CryptGetMessageSignerCount( CryptGetMessageSignerCount(
IN DWORD dwMsgEncodingType, __in DWORD dwMsgEncodingType,
IN const BYTE *pbSignedBlob, __in_bcount(cbSignedBlob) const BYTE *pbSignedBlob,
IN DWORD cbSignedBlob __in DWORD cbSignedBlob
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Returns the cert store containing the message's certs and CRLs. // Returns the cert store containing the message's certs and CRLs.
// For an error, returns NULL with LastError updated. // For an error, returns NULL with LastError updated.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
HCERTSTORE HCERTSTORE
WINAPI WINAPI
CryptGetMessageCertificates( CryptGetMessageCertificates(
IN DWORD dwMsgAndCertEncodingType, __in DWORD dwMsgAndCertEncodingType,
IN HCRYPTPROV hCryptProv, // passed to CertOpenStore __in_opt HCRYPTPROV_LEGACY hCryptProv, // passed to CertOpenStore
IN DWORD dwFlags, // passed to CertOpenStore __in DWORD dwFlags, // passed to CertOpenStore
IN const BYTE *pbSignedBlob, __in_bcount(cbSignedBlob) const BYTE *pbSignedBlob,
IN DWORD cbSignedBlob __in DWORD cbSignedBlob
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Verify a signed message containing detached signature(s). // Verify a signed message containing detached signature(s).
// The "to be signed" content is passed in separately. No // The "to be signed" content is passed in separately. No
// decoded output. Otherwise, identical to CryptVerifyMessageSignature. // decoded output. Otherwise, identical to CryptVerifyMessageSignature.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptVerifyDetachedMessageSignature( CryptVerifyDetachedMessageSignature(
IN PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara, __in PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
IN DWORD dwSignerIndex, __in DWORD dwSignerIndex,
IN const BYTE *pbDetachedSignBlob, __in_bcount(cbDetachedSignBlob) const BYTE *pbDetachedSignBlob,
IN DWORD cbDetachedSignBlob, __in DWORD cbDetachedSignBlob,
IN DWORD cToBeSigned, __in DWORD cToBeSigned,
IN const BYTE *rgpbToBeSigned[], __in_ecount(cToBeSigned) const BYTE *rgpbToBeSigned[],
IN DWORD rgcbToBeSigned[], __in_ecount(cToBeSigned) DWORD rgcbToBeSigned[],
OUT OPTIONAL PCCERT_CONTEXT *ppSignerCert __deref_opt_out_opt PCCERT_CONTEXT *ppSignerCert
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Encrypts the message for the recipient(s). // Encrypts the message for the recipient(s).
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptEncryptMessage( CryptEncryptMessage(
IN PCRYPT_ENCRYPT_MESSAGE_PARA pEncryptPara, __in PCRYPT_ENCRYPT_MESSAGE_PARA pEncryptPara,
IN DWORD cRecipientCert, __in DWORD cRecipientCert,
IN PCCERT_CONTEXT rgpRecipientCert[], __in_ecount(cRecipientCert) PCCERT_CONTEXT rgpRecipientCert[],
IN const BYTE *pbToBeEncrypted, __in_bcount_opt(cbToBeEncrypted) const BYTE *pbToBeEncrypted,
IN DWORD cbToBeEncrypted, __in DWORD cbToBeEncrypted,
OUT BYTE *pbEncryptedBlob, __out_bcount_part_opt(*pcbEncryptedBlob, *pcbEncryptedBlob) BYTE *pbEncrypte
IN OUT DWORD *pcbEncryptedBlob dBlob,
__inout DWORD *pcbEncryptedBlob
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Decrypts the message. // Decrypts the message.
// //
// If pbDecrypted == NULL, then, *pcbDecrypted is implicitly set to 0 on input. // If pbDecrypted == NULL, then, *pcbDecrypted is implicitly set to 0 on input.
// For *pcbDecrypted == 0 && ppXchgCert == NULL on input, the message isn't // For *pcbDecrypted == 0 && ppXchgCert == NULL on input, the message isn't
// decrypted. // decrypted.
// //
// For a successfully decrypted message, *ppXchgCert is updated // For a successfully decrypted message, *ppXchgCert is updated
// with the CertContext used to decrypt. It must be freed by calling // with the CertContext used to decrypt. It must be freed by calling
// CertStoreFreeCert. Otherwise, *ppXchgCert is set to NULL. // CertStoreFreeCert. Otherwise, *ppXchgCert is set to NULL.
// //
// ppXchgCert can be NULL, indicating the caller isn't interested // ppXchgCert can be NULL, indicating the caller isn't interested
// in getting the CertContext used to decrypt. // in getting the CertContext used to decrypt.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptDecryptMessage( CryptDecryptMessage(
IN PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara, __in PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
IN const BYTE *pbEncryptedBlob, __in_bcount(cbEncryptedBlob) const BYTE *pbEncryptedBlob,
IN DWORD cbEncryptedBlob, __in DWORD cbEncryptedBlob,
OUT OPTIONAL BYTE *pbDecrypted, __out_bcount_part_opt(*pcbDecrypted, *pcbDecrypted) BYTE *pbDecrypted,
IN OUT OPTIONAL DWORD *pcbDecrypted, __inout_opt DWORD *pcbDecrypted,
OUT OPTIONAL PCCERT_CONTEXT *ppXchgCert __deref_opt_out_opt PCCERT_CONTEXT *ppXchgCert
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Sign the message and encrypt for the recipient(s). Does a CryptSignMessage // Sign the message and encrypt for the recipient(s). Does a CryptSignMessage
// followed with a CryptEncryptMessage. // followed with a CryptEncryptMessage.
// //
// Note: this isn't the CMSG_SIGNED_AND_ENVELOPED. Its a CMSG_SIGNED // Note: this isn't the CMSG_SIGNED_AND_ENVELOPED. Its a CMSG_SIGNED
// inside of an CMSG_ENVELOPED. // inside of an CMSG_ENVELOPED.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptSignAndEncryptMessage( CryptSignAndEncryptMessage(
IN PCRYPT_SIGN_MESSAGE_PARA pSignPara, __in PCRYPT_SIGN_MESSAGE_PARA pSignPara,
IN PCRYPT_ENCRYPT_MESSAGE_PARA pEncryptPara, __in PCRYPT_ENCRYPT_MESSAGE_PARA pEncryptPara,
IN DWORD cRecipientCert, __in DWORD cRecipientCert,
IN PCCERT_CONTEXT rgpRecipientCert[], __in_ecount(cRecipientCert) PCCERT_CONTEXT rgpRecipientCert[],
IN const BYTE *pbToBeSignedAndEncrypted, __in_bcount(cbToBeSignedAndEncrypted) const BYTE *pbToBeSignedAndEncrypted,
IN DWORD cbToBeSignedAndEncrypted, __in DWORD cbToBeSignedAndEncrypted,
OUT BYTE *pbSignedAndEncryptedBlob, __out_bcount_part_opt(*pcbSignedAndEncryptedBlob, *pcbSignedAndEncryptedBlob
IN OUT DWORD *pcbSignedAndEncryptedBlob ) BYTE *pbSignedAndEncryptedBlob,
__inout DWORD *pcbSignedAndEncryptedBlob
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Decrypts the message and verifies the signer. Does a CryptDecryptMessage // Decrypts the message and verifies the signer. Does a CryptDecryptMessage
// followed with a CryptVerifyMessageSignature. // followed with a CryptVerifyMessageSignature.
// //
// If pbDecrypted == NULL, then, *pcbDecrypted is implicitly set to 0 on input. // If pbDecrypted == NULL, then, *pcbDecrypted is implicitly set to 0 on input.
// For *pcbDecrypted == 0 && ppSignerCert == NULL on input, the signer isn't // For *pcbDecrypted == 0 && ppSignerCert == NULL on input, the signer isn't
// verified. // verified.
// //
skipping to change at line 13136 skipping to change at line 15208
// Note: this isn't the CMSG_SIGNED_AND_ENVELOPED. Its a CMSG_SIGNED // Note: this isn't the CMSG_SIGNED_AND_ENVELOPED. Its a CMSG_SIGNED
// inside of an CMSG_ENVELOPED. // inside of an CMSG_ENVELOPED.
// //
// The message always needs to be decrypted to allow access to the // The message always needs to be decrypted to allow access to the
// signed message. Therefore, if ppXchgCert != NULL, its always updated. // signed message. Therefore, if ppXchgCert != NULL, its always updated.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptDecryptAndVerifyMessageSignature( CryptDecryptAndVerifyMessageSignature(
IN PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara, __in PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
IN PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara, __in PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
IN DWORD dwSignerIndex, __in DWORD dwSignerIndex,
IN const BYTE *pbEncryptedBlob, __in_bcount(cbEncryptedBlob) const BYTE *pbEncryptedBlob,
IN DWORD cbEncryptedBlob, __in DWORD cbEncryptedBlob,
OUT OPTIONAL BYTE *pbDecrypted, __out_bcount_part_opt(*pcbDecrypted, *pcbDecrypted) BYTE *pbDecrypted,
IN OUT OPTIONAL DWORD *pcbDecrypted, __inout_opt DWORD *pcbDecrypted,
OUT OPTIONAL PCCERT_CONTEXT *ppXchgCert, __deref_opt_out_opt PCCERT_CONTEXT *ppXchgCert,
OUT OPTIONAL PCCERT_CONTEXT *ppSignerCert __deref_opt_out_opt PCCERT_CONTEXT *ppSignerCert
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Decodes a cryptographic message which may be one of the following types: // Decodes a cryptographic message which may be one of the following types:
// CMSG_DATA // CMSG_DATA
// CMSG_SIGNED // CMSG_SIGNED
// CMSG_ENVELOPED // CMSG_ENVELOPED
// CMSG_SIGNED_AND_ENVELOPED // CMSG_SIGNED_AND_ENVELOPED
// CMSG_HASHED // CMSG_HASHED
// //
skipping to change at line 13183 skipping to change at line 15255
// For CMSG_SIGNED: same as CryptVerifyMessageSignature. // For CMSG_SIGNED: same as CryptVerifyMessageSignature.
// For CMSG_ENVELOPED: same as CryptDecryptMessage. // For CMSG_ENVELOPED: same as CryptDecryptMessage.
// For CMSG_SIGNED_AND_ENVELOPED: same as CryptDecryptMessage plus // For CMSG_SIGNED_AND_ENVELOPED: same as CryptDecryptMessage plus
// CryptVerifyMessageSignature. // CryptVerifyMessageSignature.
// For CMSG_HASHED: verifies the hash and returns decoded content. // For CMSG_HASHED: verifies the hash and returns decoded content.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptDecodeMessage( CryptDecodeMessage(
IN DWORD dwMsgTypeFlags, __in DWORD dwMsgTypeFlags,
IN PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara, __in_opt PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
IN PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara, __in_opt PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
IN DWORD dwSignerIndex, __in DWORD dwSignerIndex,
IN const BYTE *pbEncodedBlob, __in_bcount(cbEncodedBlob) const BYTE *pbEncodedBlob,
IN DWORD cbEncodedBlob, __in DWORD cbEncodedBlob,
IN DWORD dwPrevInnerContentType, __in DWORD dwPrevInnerContentType,
OUT OPTIONAL DWORD *pdwMsgType, __out_opt DWORD *pdwMsgType,
OUT OPTIONAL DWORD *pdwInnerContentType, __out_opt DWORD *pdwInnerContentType,
OUT OPTIONAL BYTE *pbDecoded, __out_bcount_part_opt(*pcbDecoded, *pcbDecoded) BYTE *pbDecoded,
IN OUT OPTIONAL DWORD *pcbDecoded, __inout_opt DWORD *pcbDecoded,
OUT OPTIONAL PCCERT_CONTEXT *ppXchgCert, __deref_opt_out_opt PCCERT_CONTEXT *ppXchgCert,
OUT OPTIONAL PCCERT_CONTEXT *ppSignerCert __deref_opt_out_opt PCCERT_CONTEXT *ppSignerCert
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Hash the message. // Hash the message.
// //
// If fDetachedHash is TRUE, only the ComputedHash is encoded in the // If fDetachedHash is TRUE, only the ComputedHash is encoded in the
// pbHashedBlob. Otherwise, both the ToBeHashed and ComputedHash // pbHashedBlob. Otherwise, both the ToBeHashed and ComputedHash
// are encoded. // are encoded.
// //
// pcbHashedBlob or pcbComputedHash can be NULL, indicating the caller // pcbHashedBlob or pcbComputedHash can be NULL, indicating the caller
// isn't interested in getting the output. // isn't interested in getting the output.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptHashMessage( CryptHashMessage(
IN PCRYPT_HASH_MESSAGE_PARA pHashPara, __in PCRYPT_HASH_MESSAGE_PARA pHashPara,
IN BOOL fDetachedHash, __in BOOL fDetachedHash,
IN DWORD cToBeHashed, __in DWORD cToBeHashed,
IN const BYTE *rgpbToBeHashed[], __in_ecount(cToBeHashed) const BYTE *rgpbToBeHashed[],
IN DWORD rgcbToBeHashed[], __in_ecount(cToBeHashed) DWORD rgcbToBeHashed[],
OUT OPTIONAL BYTE *pbHashedBlob, __out_bcount_part_opt(*pcbHashedBlob, *pcbHashedBlob) BYTE *pbHashedBlob,
IN OUT OPTIONAL DWORD *pcbHashedBlob, __inout_opt DWORD *pcbHashedBlob,
OUT OPTIONAL BYTE *pbComputedHash, __out_bcount_part_opt(*pcbComputedHash, *pcbComputedHash) BYTE *pbComputedHa
IN OUT OPTIONAL DWORD *pcbComputedHash sh,
__inout_opt DWORD *pcbComputedHash
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Verify a hashed message. // Verify a hashed message.
// //
// pcbToBeHashed or pcbComputedHash can be NULL, // pcbToBeHashed or pcbComputedHash can be NULL,
// indicating the caller isn't interested in getting the output. // indicating the caller isn't interested in getting the output.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptVerifyMessageHash( CryptVerifyMessageHash(
IN PCRYPT_HASH_MESSAGE_PARA pHashPara, __in PCRYPT_HASH_MESSAGE_PARA pHashPara,
IN BYTE *pbHashedBlob, __in_bcount(cbHashedBlob) BYTE *pbHashedBlob,
IN DWORD cbHashedBlob, __in DWORD cbHashedBlob,
OUT OPTIONAL BYTE *pbToBeHashed, __out_bcount_part_opt(*pcbToBeHashed, *pcbToBeHashed) BYTE *pbToBeHashed,
IN OUT OPTIONAL DWORD *pcbToBeHashed, __inout_opt DWORD *pcbToBeHashed,
OUT OPTIONAL BYTE *pbComputedHash, __out_bcount_part_opt(*pcbComputedHash, *pcbComputedHash) BYTE *pbComputedHa
IN OUT OPTIONAL DWORD *pcbComputedHash sh,
__inout_opt DWORD *pcbComputedHash
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Verify a hashed message containing a detached hash. // Verify a hashed message containing a detached hash.
// The "to be hashed" content is passed in separately. No // The "to be hashed" content is passed in separately. No
// decoded output. Otherwise, identical to CryptVerifyMessageHash. // decoded output. Otherwise, identical to CryptVerifyMessageHash.
// //
// pcbComputedHash can be NULL, indicating the caller isn't interested // pcbComputedHash can be NULL, indicating the caller isn't interested
// in getting the output. // in getting the output.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptVerifyDetachedMessageHash( CryptVerifyDetachedMessageHash(
IN PCRYPT_HASH_MESSAGE_PARA pHashPara, __in PCRYPT_HASH_MESSAGE_PARA pHashPara,
IN BYTE *pbDetachedHashBlob, __in_bcount(cbDetachedHashBlob) BYTE *pbDetachedHashBlob,
IN DWORD cbDetachedHashBlob, __in DWORD cbDetachedHashBlob,
IN DWORD cToBeHashed, __in DWORD cToBeHashed,
IN const BYTE *rgpbToBeHashed[], __in_ecount(cToBeHashed) const BYTE *rgpbToBeHashed[],
IN DWORD rgcbToBeHashed[], __in_ecount(cToBeHashed) DWORD rgcbToBeHashed[],
OUT OPTIONAL BYTE *pbComputedHash, __out_bcount_part_opt(*pcbComputedHash, *pcbComputedHash) BYTE *pbComputedHa
IN OUT OPTIONAL DWORD *pcbComputedHash sh,
__inout_opt DWORD *pcbComputedHash
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Sign the message using the provider's private key specified in the // Sign the message using the provider's private key specified in the
// parameters. A dummy SignerId is created and stored in the message. // parameters. A dummy SignerId is created and stored in the message.
// //
// Normally used until a certificate has been created for the key. // Normally used until a certificate has been created for the key.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptSignMessageWithKey( CryptSignMessageWithKey(
IN PCRYPT_KEY_SIGN_MESSAGE_PARA pSignPara, __in PCRYPT_KEY_SIGN_MESSAGE_PARA pSignPara,
IN const BYTE *pbToBeSigned, __in_bcount(cbToBeSigned) const BYTE *pbToBeSigned,
IN DWORD cbToBeSigned, __in DWORD cbToBeSigned,
OUT BYTE *pbSignedBlob, __out_bcount_part_opt(*pcbSignedBlob, *pcbSignedBlob) BYTE *pbSignedBlob,
IN OUT DWORD *pcbSignedBlob __inout DWORD *pcbSignedBlob
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Verify a signed message using the specified public key info. // Verify a signed message using the specified public key info.
// //
// Normally called by a CA until it has created a certificate for the // Normally called by a CA until it has created a certificate for the
// key. // key.
// //
// pPublicKeyInfo contains the public key to use to verify the signed // pPublicKeyInfo contains the public key to use to verify the signed
// message. If NULL, the signature isn't verified (for instance, the decoded // message. If NULL, the signature isn't verified (for instance, the decoded
// content may contain the PublicKeyInfo). // content may contain the PublicKeyInfo).
// //
// pcbDecoded can be NULL, indicating the caller isn't interested // pcbDecoded can be NULL, indicating the caller isn't interested
// in getting the decoded content. // in getting the decoded content.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptVerifyMessageSignatureWithKey( CryptVerifyMessageSignatureWithKey(
IN PCRYPT_KEY_VERIFY_MESSAGE_PARA pVerifyPara, __in PCRYPT_KEY_VERIFY_MESSAGE_PARA pVerifyPara,
IN OPTIONAL PCERT_PUBLIC_KEY_INFO pPublicKeyInfo, __in_opt PCERT_PUBLIC_KEY_INFO pPublicKeyInfo,
IN const BYTE *pbSignedBlob, __in_bcount(cbSignedBlob) const BYTE *pbSignedBlob,
IN DWORD cbSignedBlob, __in DWORD cbSignedBlob,
OUT OPTIONAL BYTE *pbDecoded, __out_bcount_part_opt(*pcbDecoded, *pcbDecoded) BYTE *pbDecoded,
IN OUT OPTIONAL DWORD *pcbDecoded __inout_opt DWORD *pcbDecoded
); );
//+========================================================================= //+=========================================================================
// System Certificate Store Data Structures and APIs // System Certificate Store Data Structures and APIs
//========================================================================== //==========================================================================
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Get a system certificate store based on a subsystem protocol. // Get a system certificate store based on a subsystem protocol.
// //
// Current examples of subsystems protocols are: // Current examples of subsystems protocols are:
skipping to change at line 13334 skipping to change at line 15406
// The returned Cert Store can be searched for an appropriate Cert // The returned Cert Store can be searched for an appropriate Cert
// using the Cert Store API's (see certstor.h) // using the Cert Store API's (see certstor.h)
// //
// When done, the cert store should be closed using CertStoreClose // When done, the cert store should be closed using CertStoreClose
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
HCERTSTORE HCERTSTORE
WINAPI WINAPI
CertOpenSystemStoreA( CertOpenSystemStoreA(
HCRYPTPROV hProv, __in_opt HCRYPTPROV_LEGACY hProv,
LPCSTR szSubsystemProtocol __in LPCSTR szSubsystemProtocol
); );
WINCRYPT32API WINCRYPT32API
HCERTSTORE HCERTSTORE
WINAPI WINAPI
CertOpenSystemStoreW( CertOpenSystemStoreW(
HCRYPTPROV hProv, __in_opt HCRYPTPROV_LEGACY hProv,
LPCWSTR szSubsystemProtocol __in LPCWSTR szSubsystemProtocol
); );
#ifdef UNICODE #ifdef UNICODE
#define CertOpenSystemStore CertOpenSystemStoreW #define CertOpenSystemStore CertOpenSystemStoreW
#else #else
#define CertOpenSystemStore CertOpenSystemStoreA #define CertOpenSystemStore CertOpenSystemStoreA
#endif // !UNICODE #endif // !UNICODE
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertAddEncodedCertificateToSystemStoreA( CertAddEncodedCertificateToSystemStoreA(
LPCSTR szCertStoreName, __in LPCSTR szCertStoreName,
const BYTE * pbCertEncoded, __in_bcount(cbCertEncoded) const BYTE * pbCertEncoded,
DWORD cbCertEncoded __in DWORD cbCertEncoded
); );
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertAddEncodedCertificateToSystemStoreW( CertAddEncodedCertificateToSystemStoreW(
LPCWSTR szCertStoreName, __in LPCWSTR szCertStoreName,
const BYTE * pbCertEncoded, __in_bcount(cbCertEncoded) const BYTE * pbCertEncoded,
DWORD cbCertEncoded __in DWORD cbCertEncoded
); );
#ifdef UNICODE #ifdef UNICODE
#define CertAddEncodedCertificateToSystemStore CertAddEncodedCertificateToSyste mStoreW #define CertAddEncodedCertificateToSystemStore CertAddEncodedCertificateToSyste mStoreW
#else #else
#define CertAddEncodedCertificateToSystemStore CertAddEncodedCertificateToSyste mStoreA #define CertAddEncodedCertificateToSystemStore CertAddEncodedCertificateToSyste mStoreA
#endif // !UNICODE #endif // !UNICODE
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Find all certificate chains tying the given issuer name to any certificate // Find all certificate chains tying the given issuer name to any certificate
// that the current user has a private key for. // that the current user has a private key for.
skipping to change at line 13394 skipping to change at line 15466
DWORD cCerts; // number of certs in chain DWORD cCerts; // number of certs in chain
PCERT_BLOB certs; // pointer to array of cert chain blobs PCERT_BLOB certs; // pointer to array of cert chain blobs
// representing the certs // representing the certs
CRYPT_KEY_PROV_INFO keyLocatorInfo; // key locator for cert CRYPT_KEY_PROV_INFO keyLocatorInfo; // key locator for cert
} CERT_CHAIN, *PCERT_CHAIN; } CERT_CHAIN, *PCERT_CHAIN;
// WINCRYPT32API This is not exported by crypt32, it is exported by softpub // WINCRYPT32API This is not exported by crypt32, it is exported by softpub
HRESULT HRESULT
WINAPI WINAPI
FindCertsByIssuer( FindCertsByIssuer(
OUT PCERT_CHAIN pCertChains, __out_bcount_part_opt(*pcbCertChains, *pcbCertChains) PCERT_CHAIN pCertChain
IN OUT DWORD *pcbCertChains, s,
OUT DWORD *pcCertChains, // count of certificates chains returned __inout DWORD *pcbCertChains,
IN BYTE* pbEncodedIssuerName, // DER encoded issuer name __out DWORD *pcCertChains, // count of certificates chains returned
IN DWORD cbEncodedIssuerName, // count in bytes of encoded issuer name __in_bcount_opt(cbEncodedIssuerName) BYTE* pbEncodedIssuerName, // DER enc
IN LPCWSTR pwszPurpose, // "ClientAuth" or "CodeSigning" oded issuer name
IN DWORD dwKeySpec // only return signers supporting this __in DWORD cbEncodedIssuerName, // count in bytes of encoded issuer name
// keyspec __in_opt LPCWSTR pwszPurpose, // "ClientAuth" or "CodeSigning"
__in DWORD dwKeySpec // only return signers supporting this
// keyspec
); );
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
// //
// CryptQueryObject takes a CERT_BLOB or a file name and returns the // CryptQueryObject takes a CERT_BLOB or a file name and returns the
// information about the content in the blob or in the file. // information about the content in the blob or in the file.
// //
// Parameters: // Parameters:
// INPUT dwObjectType: // INPUT dwObjectType:
// Indicate the type of the object. Should be one of the // Indicate the type of the object. Should be one of the
skipping to change at line 13439 skipping to change at line 15511
// CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE // CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE
// CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT // CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT
// CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL // CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL
// CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL // CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL
// CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED // CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED
// CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED // CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED
// CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED // CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED
// CERT_QUERY_CONTENT_FLAG_PKCS10 // CERT_QUERY_CONTENT_FLAG_PKCS10
// CERT_QUERY_CONTENT_FLAG_PFX // CERT_QUERY_CONTENT_FLAG_PFX
// CERT_QUERY_CONTENT_FLAG_CERT_PAIR // CERT_QUERY_CONTENT_FLAG_CERT_PAIR
// CERT_QUERY_CONTENT_FLAG_PFX_AND_LOAD
// //
// INPUT dwExpectedFormatTypeFlags: // INPUT dwExpectedFormatTypeFlags:
// Indicate the expected format type. // Indicate the expected format type.
// Can be one of the following: // Can be one of the following:
// CERT_QUERY_FORMAT_FLAG_ALL (the content can be a ny format) // CERT_QUERY_FORMAT_FLAG_ALL (the content can be a ny format)
// CERT_QUERY_FORMAT_FLAG_BINARY // CERT_QUERY_FORMAT_FLAG_BINARY
// CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED // CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED
// CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED // CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED
// //
// //
skipping to change at line 13475 skipping to change at line 15548
// CERT_QUERY_CONTENT_SERIALIZED_STORE // CERT_QUERY_CONTENT_SERIALIZED_STORE
// CERT_QUERY_CONTENT_SERIALIZED_CERT // CERT_QUERY_CONTENT_SERIALIZED_CERT
// CERT_QUERY_CONTENT_SERIALIZED_CTL // CERT_QUERY_CONTENT_SERIALIZED_CTL
// CERT_QUERY_CONTENT_SERIALIZED_CRL // CERT_QUERY_CONTENT_SERIALIZED_CRL
// CERT_QUERY_CONTENT_PKCS7_SIGNED // CERT_QUERY_CONTENT_PKCS7_SIGNED
// CERT_QUERY_CONTENT_PKCS7_UNSIGNED // CERT_QUERY_CONTENT_PKCS7_UNSIGNED
// CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED // CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED
// CERT_QUERY_CONTENT_PKCS10 // CERT_QUERY_CONTENT_PKCS10
// CERT_QUERY_CONTENT_PFX // CERT_QUERY_CONTENT_PFX
// CERT_QUERY_CONTENT_CERT_PAIR // CERT_QUERY_CONTENT_CERT_PAIR
// CERT_QUERY_CONTENT_PFX_AND_LOAD
// //
// OUTPUT pdwFormatType // OUTPUT pdwFormatType
// Optional output. If NULL !=pdwFormatType, it // Optional output. If NULL !=pdwFormatType, it
// contains the format type of the content as one of the // contains the format type of the content as one of the
// following: // following:
// CERT_QUERY_FORMAT_BINARY // CERT_QUERY_FORMAT_BINARY
// CERT_QUERY_FORMAT_BASE64_ENCODED // CERT_QUERY_FORMAT_BASE64_ENCODED
// CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED // CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED
// //
// //
skipping to change at line 13536 skipping to change at line 15610
// CERT_QUERY_CONTENT_SERIALIZED_CTL, it is a PCCTL_CONTEXT ; // CERT_QUERY_CONTENT_SERIALIZED_CTL, it is a PCCTL_CONTEXT ;
// Caller should free the pContext via CertFreeCTLContext. // Caller should free the pContext via CertFreeCTLContext.
// //
// If the *pbObject is of type CERT_QUERY_CONTENT_PKCS10 or CERT_QUERY_CONTENT_ PFX, CryptQueryObject // If the *pbObject is of type CERT_QUERY_CONTENT_PKCS10 or CERT_QUERY_CONTENT_ PFX, CryptQueryObject
// will not return anything in *phCertstore, *phMsg, or *ppvContext. // will not return anything in *phCertstore, *phMsg, or *ppvContext.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptQueryObject( CryptQueryObject(
DWORD dwObjectType, __in DWORD dwObjectType,
const void *pvObject, __in const void *pvObject,
DWORD dwExpectedContentTypeFlags, __in DWORD dwExpectedContentTypeFlags,
DWORD dwExpectedFormatTypeFlags, __in DWORD dwExpectedFormatTypeFlags,
DWORD dwFlags, __in DWORD dwFlags,
DWORD *pdwMsgAndCertEncodingType, __out_opt DWORD *pdwMsgAndCertEncodingType,
DWORD *pdwContentType, __out_opt DWORD *pdwContentType,
DWORD *pdwFormatType, __out_opt DWORD *pdwFormatType,
HCERTSTORE *phCertStore, __out_opt HCERTSTORE *phCertStore,
HCRYPTMSG *phMsg, __out_opt HCRYPTMSG *phMsg,
const void **ppvContext __deref_opt_out_opt const void **ppvContext
); );
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
//dwObjectType for CryptQueryObject //dwObjectType for CryptQueryObject
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
#define CERT_QUERY_OBJECT_FILE 0x00000001 #define CERT_QUERY_OBJECT_FILE 0x00000001
#define CERT_QUERY_OBJECT_BLOB 0x00000002 #define CERT_QUERY_OBJECT_BLOB 0x00000002
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
//dwContentType for CryptQueryObject //dwContentType for CryptQueryObject
skipping to change at line 13580 skipping to change at line 15654
//serialized single CRL //serialized single CRL
#define CERT_QUERY_CONTENT_SERIALIZED_CRL 7 #define CERT_QUERY_CONTENT_SERIALIZED_CRL 7
//a PKCS#7 signed message //a PKCS#7 signed message
#define CERT_QUERY_CONTENT_PKCS7_SIGNED 8 #define CERT_QUERY_CONTENT_PKCS7_SIGNED 8
//a PKCS#7 message, such as enveloped message. But it is not a signed message, //a PKCS#7 message, such as enveloped message. But it is not a signed message,
#define CERT_QUERY_CONTENT_PKCS7_UNSIGNED 9 #define CERT_QUERY_CONTENT_PKCS7_UNSIGNED 9
//a PKCS7 signed message embedded in a file //a PKCS7 signed message embedded in a file
#define CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED 10 #define CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED 10
//an encoded PKCS#10 //an encoded PKCS#10
#define CERT_QUERY_CONTENT_PKCS10 11 #define CERT_QUERY_CONTENT_PKCS10 11
//an encoded PKX BLOB //an encoded PFX BLOB
#define CERT_QUERY_CONTENT_PFX 12 #define CERT_QUERY_CONTENT_PFX 12
//an encoded CertificatePair (contains forward and/or reverse cross certs) //an encoded CertificatePair (contains forward and/or reverse cross certs)
#define CERT_QUERY_CONTENT_CERT_PAIR 13 #define CERT_QUERY_CONTENT_CERT_PAIR 13
//an encoded PFX BLOB, which was loaded to phCertStore
#define CERT_QUERY_CONTENT_PFX_AND_LOAD 14
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
//dwExpectedConentTypeFlags for CryptQueryObject //dwExpectedConentTypeFlags for CryptQueryObject
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
//encoded single certificate //encoded single certificate
#define CERT_QUERY_CONTENT_FLAG_CERT \ #define CERT_QUERY_CONTENT_FLAG_CERT \
( 1 << CERT_QUERY_CONTENT_CERT) ( 1 << CERT_QUERY_CONTENT_CERT)
//encoded single CTL //encoded single CTL
skipping to change at line 13641 skipping to change at line 15717
( 1 << CERT_QUERY_CONTENT_PKCS10) ( 1 << CERT_QUERY_CONTENT_PKCS10)
//an encoded PFX BLOB //an encoded PFX BLOB
#define CERT_QUERY_CONTENT_FLAG_PFX \ #define CERT_QUERY_CONTENT_FLAG_PFX \
( 1 << CERT_QUERY_CONTENT_PFX) ( 1 << CERT_QUERY_CONTENT_PFX)
//an encoded CertificatePair (contains forward and/or reverse cross certs) //an encoded CertificatePair (contains forward and/or reverse cross certs)
#define CERT_QUERY_CONTENT_FLAG_CERT_PAIR \ #define CERT_QUERY_CONTENT_FLAG_CERT_PAIR \
( 1 << CERT_QUERY_CONTENT_CERT_PAIR) ( 1 << CERT_QUERY_CONTENT_CERT_PAIR)
//an encoded PFX BLOB, and we do want to load it (not included in
//CERT_QUERY_CONTENT_FLAG_ALL)
#define CERT_QUERY_CONTENT_FLAG_PFX_AND_LOAD \
( 1 << CERT_QUERY_CONTENT_PFX_AND_LOAD)
//content can be any type //content can be any type
#define CERT_QUERY_CONTENT_FLAG_ALL \ #define CERT_QUERY_CONTENT_FLAG_ALL \
CERT_QUERY_CONTENT_FLAG_CERT | \ ( CERT_QUERY_CONTENT_FLAG_CERT | \
CERT_QUERY_CONTENT_FLAG_CTL | \ CERT_QUERY_CONTENT_FLAG_CTL | \
CERT_QUERY_CONTENT_FLAG_CRL | \ CERT_QUERY_CONTENT_FLAG_CRL | \
CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE | \ CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE | \
CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT | \ CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT | \
CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL | \ CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL | \
CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL | \ CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL | \
CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED | \ CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED | \
CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED | \ CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED | \
CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED | \ CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED | \
CERT_QUERY_CONTENT_FLAG_PKCS10 | \ CERT_QUERY_CONTENT_FLAG_PKCS10 | \
CERT_QUERY_CONTENT_FLAG_PFX | \ CERT_QUERY_CONTENT_FLAG_PFX | \
CERT_QUERY_CONTENT_FLAG_CERT_PAIR CERT_QUERY_CONTENT_FLAG_CERT_PAIR )
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
//dwFormatType for CryptQueryObject //dwFormatType for CryptQueryObject
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
//the content is in binary format //the content is in binary format
#define CERT_QUERY_FORMAT_BINARY 1 #define CERT_QUERY_FORMAT_BINARY 1
//the content is base64 encoded //the content is base64 encoded
#define CERT_QUERY_FORMAT_BASE64_ENCODED 2 #define CERT_QUERY_FORMAT_BASE64_ENCODED 2
skipping to change at line 13685 skipping to change at line 15766
//the content is base64 encoded //the content is base64 encoded
#define CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED \ #define CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED \
( 1 << CERT_QUERY_FORMAT_BASE64_ENCODED) ( 1 << CERT_QUERY_FORMAT_BASE64_ENCODED)
//the content is ascii hex encoded with "{ASN}" prefix //the content is ascii hex encoded with "{ASN}" prefix
#define CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED \ #define CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED \
( 1 << CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED) ( 1 << CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED)
//the content can be of any format //the content can be of any format
#define CERT_QUERY_FORMAT_FLAG_ALL \ #define CERT_QUERY_FORMAT_FLAG_ALL \
CERT_QUERY_FORMAT_FLAG_BINARY | \ ( CERT_QUERY_FORMAT_FLAG_BINARY | \
CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED | \ CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED | \
CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED )
// //
// Crypt32 Memory Management Routines. All Crypt32 API which return allocated // Crypt32 Memory Management Routines. All Crypt32 API which return allocated
// buffers will do so via CryptMemAlloc, CryptMemRealloc. Clients can free // buffers will do so via CryptMemAlloc, CryptMemRealloc. Clients can free
// those buffers using CryptMemFree. Also included is CryptMemSize // those buffers using CryptMemFree. Also included is CryptMemSize
// //
WINCRYPT32API WINCRYPT32API
LPVOID LPVOID
WINAPI WINAPI
CryptMemAlloc ( CryptMemAlloc (
IN ULONG cbSize __in ULONG cbSize
); );
WINCRYPT32API WINCRYPT32API
LPVOID LPVOID
WINAPI WINAPI
CryptMemRealloc ( CryptMemRealloc (
IN LPVOID pv, __in_opt LPVOID pv,
IN ULONG cbSize __in ULONG cbSize
); );
WINCRYPT32API WINCRYPT32API
VOID VOID
WINAPI WINAPI
CryptMemFree ( CryptMemFree (
IN LPVOID pv __in_opt LPVOID pv
); );
// //
// Crypt32 Asynchronous Parameter Management Routines. All Crypt32 API which // Crypt32 Asynchronous Parameter Management Routines. All Crypt32 API which
// expose asynchronous mode operation use a Crypt32 Async Handle to pass // expose asynchronous mode operation use a Crypt32 Async Handle to pass
// around information about the operation e.g. callback routines. The // around information about the operation e.g. callback routines. The
// following API are used for manipulation of the async handle // following API are used for manipulation of the async handle
// //
// Following functions were never used. If called, will fail with LastError
// set to ERROR_CALL_NOT_IMPLEMENTED.
typedef HANDLE HCRYPTASYNC, *PHCRYPTASYNC; typedef HANDLE HCRYPTASYNC, *PHCRYPTASYNC;
typedef VOID (WINAPI *PFN_CRYPT_ASYNC_PARAM_FREE_FUNC) ( typedef VOID (WINAPI *PFN_CRYPT_ASYNC_PARAM_FREE_FUNC) (
LPSTR pszParamOid, __in LPSTR pszParamOid,
LPVOID pvParam __in LPVOID pvParam
); );
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptCreateAsyncHandle ( CryptCreateAsyncHandle (
IN DWORD dwFlags, __in DWORD dwFlags,
OUT PHCRYPTASYNC phAsync __out PHCRYPTASYNC phAsync
); );
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptSetAsyncParam ( CryptSetAsyncParam (
IN HCRYPTASYNC hAsync, __in HCRYPTASYNC hAsync,
IN LPSTR pszParamOid, __in LPSTR pszParamOid,
IN LPVOID pvParam, __in_opt LPVOID pvParam,
IN OPTIONAL PFN_CRYPT_ASYNC_PARAM_FREE_FUNC pfnFree __callback PFN_CRYPT_ASYNC_PARAM_FREE_FUNC pfnFree
); );
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptGetAsyncParam ( CryptGetAsyncParam (
IN HCRYPTASYNC hAsync, __in HCRYPTASYNC hAsync,
IN LPSTR pszParamOid, __in LPSTR pszParamOid,
OUT LPVOID* ppvParam, __deref_opt_out_opt LPVOID* ppvParam,
OUT OPTIONAL PFN_CRYPT_ASYNC_PARAM_FREE_FUNC* ppfnFree __deref_opt_out_opt __callback PFN_CRYPT_ASYNC_PARAM_FREE_FUNC* ppfnFree
); );
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptCloseAsyncHandle ( CryptCloseAsyncHandle (
IN HCRYPTASYNC hAsync __in_opt HCRYPTASYNC hAsync
); );
// //
// Crypt32 Remote Object Retrieval Routines. This API allows retrieval of // Crypt32 Remote Object Retrieval Routines. This API allows retrieval of
// remote PKI objects where the location is given by an URL. The remote // remote PKI objects where the location is given by an URL. The remote
// object retrieval manager exposes two provider models. One is the "Scheme // object retrieval manager exposes two provider models. One is the "Scheme
// Provider" model which allows for installable protocol providers as defined // Provider" model which allows for installable protocol providers as defined
// by the URL scheme e.g. ldap, http, ftp. The scheme provider entry point is // by the URL scheme e.g. ldap, http, ftp. The scheme provider entry point is
// the same as the CryptRetrieveObjectByUrl however the *ppvObject returned // the same as the CryptRetrieveObjectByUrl however the *ppvObject returned
// is ALWAYS a counted array of encoded bits (one per object retrieved). The // is ALWAYS a counted array of encoded bits (one per object retrieved). The
skipping to change at line 13830 skipping to change at line 15914
// //
// The following is obsolete and has been replaced with the following // The following is obsolete and has been replaced with the following
// definition // definition
#define SCHEME_OID_RETRIEVE_ENCODED_OBJECT_FUNC "SchemeDllRetrieveEncodedObject" #define SCHEME_OID_RETRIEVE_ENCODED_OBJECT_FUNC "SchemeDllRetrieveEncodedObject"
// 2-8-02 Server 2003 changed to use UNICODE Url strings instead of multibyte // 2-8-02 Server 2003 changed to use UNICODE Url strings instead of multibyte
#define SCHEME_OID_RETRIEVE_ENCODED_OBJECTW_FUNC "SchemeDllRetrieveEncodedObject W" #define SCHEME_OID_RETRIEVE_ENCODED_OBJECTW_FUNC "SchemeDllRetrieveEncodedObject W"
typedef VOID (WINAPI *PFN_FREE_ENCODED_OBJECT_FUNC) ( typedef VOID (WINAPI *PFN_FREE_ENCODED_OBJECT_FUNC) (
LPCSTR pszObjectOid, __in_opt LPCSTR pszObjectOid,
PCRYPT_BLOB_ARRAY pObject, __inout PCRYPT_BLOB_ARRAY pObject,
LPVOID pvFreeContext __inout_opt LPVOID pvFreeContext
); );
// //
// SchemeDllRetrieveEncodedObject was replaced in Server 2003 with // SchemeDllRetrieveEncodedObject was replaced in Server 2003 with
// the following. (Changed to use UNICODE Url Strings.) // the following. (Changed to use UNICODE Url Strings.)
// //
// //
// SchemeDllRetrieveEncodedObjectW has the following signature: // SchemeDllRetrieveEncodedObjectW has the following signature:
// //
// __success(return == TRUE)
// BOOL WINAPI SchemeDllRetrieveEncodedObjectW ( // BOOL WINAPI SchemeDllRetrieveEncodedObjectW (
// IN LPCWSTR pwszUrl, // __in LPCWSTR pwszUrl,
// IN LPCSTR pszObjectOid, // __in_opt LPCSTR pszObjectOid,
// IN DWORD dwRetrievalFlags, // __in DWORD dwRetrievalFlags,
// IN DWORD dwTimeout, // milliseconds // __in DWORD dwTimeout, // milliseconds
// OUT PCRYPT_BLOB_ARRAY pObject, // __out PCRYPT_BLOB_ARRAY pObject,
// OUT PFN_FREE_ENCODED_OBJECT_FUNC* ppfnFreeObject, // __deref_out __callback PFN_FREE_ENCODED_OBJECT_FUNC* ppfnFr
// OUT LPVOID* ppvFreeContext, eeObject,
// IN HCRYPTASYNC hAsyncRetrieve, // __deref_out_opt LPVOID* ppvFreeContext,
// IN PCRYPT_CREDENTIALS pCredentials, // __in_opt HCRYPTASYNC hAsyncRetrieve,
// IN PCRYPT_RETRIEVE_AUX_INFO pAuxInfo // __in_opt PCRYPT_CREDENTIALS pCredentials,
// __inout_opt PCRYPT_RETRIEVE_AUX_INFO pAuxInfo
// ) // )
// //
// //
// Context Provider Signatures // Context Provider Signatures
// //
#define CONTEXT_OID_CREATE_OBJECT_CONTEXT_FUNC "ContextDllCreateObjectContext" #define CONTEXT_OID_CREATE_OBJECT_CONTEXT_FUNC "ContextDllCreateObjectContext"
#define CONTEXT_OID_CERTIFICATE ((LPCSTR)1) #define CONTEXT_OID_CERTIFICATE ((LPCSTR)1)
#define CONTEXT_OID_CRL ((LPCSTR)2) #define CONTEXT_OID_CRL ((LPCSTR)2)
#define CONTEXT_OID_CTL ((LPCSTR)3) #define CONTEXT_OID_CTL ((LPCSTR)3)
#define CONTEXT_OID_PKCS7 ((LPCSTR)4) #define CONTEXT_OID_PKCS7 ((LPCSTR)4)
#define CONTEXT_OID_CAPI2_ANY ((LPCSTR)5) #define CONTEXT_OID_CAPI2_ANY ((LPCSTR)5)
#define CONTEXT_OID_OCSP_RESP ((LPCSTR)6)
// //
// ContextDllCreateObjectContext has the following signature: // ContextDllCreateObjectContext has the following signature:
// //
// __success(return == TRUE)
// BOOL WINAPI ContextDllCreateObjectContext ( // BOOL WINAPI ContextDllCreateObjectContext (
// IN LPCSTR pszObjectOid, // __in_opt LPCSTR pszObjectOid,
// IN DWORD dwRetrievalFlags, // __in DWORD dwRetrievalFlags,
// IN PCRYPT_BLOB_ARRAY pObject, // __in PCRYPT_BLOB_ARRAY pObject,
// OUT LPVOID* ppvContext // __deref_out LPVOID* ppvContext
// ) // )
// //
// //
// Remote Object Retrieval API // Remote Object Retrieval API
// //
// //
// Retrieval flags // Retrieval flags
// //
skipping to change at line 13927 skipping to change at line 16014
// names. Use this flag whenever passing a hostname as opposed to a // names. Use this flag whenever passing a hostname as opposed to a
// domain name for the hostname parameter. // domain name for the hostname parameter.
// //
// See LDAP_OPT_AREC_EXCLUSIVE defined in winldap.h for more details. // See LDAP_OPT_AREC_EXCLUSIVE defined in winldap.h for more details.
#define CRYPT_LDAP_AREC_EXCLUSIVE_RETRIEVAL 0x00040000 #define CRYPT_LDAP_AREC_EXCLUSIVE_RETRIEVAL 0x00040000
// Apply AIA URL restrictions, such as, validate retrieved content before // Apply AIA URL restrictions, such as, validate retrieved content before
// writing to cache. // writing to cache.
#define CRYPT_AIA_RETRIEVAL 0x00080000 #define CRYPT_AIA_RETRIEVAL 0x00080000
// For HTTP: use POST instead of the default GET
//
// The POST additional binary data and header strings are appended to
// the host name and path URL as follows:
// + L'/'<Optional url escaped and base64 encoded additional data>
// + L'?'<Optional additional headers>
//
// Here's an example of an OCSP POST URL:
// http://ocsp.openvalidation.org/MEIwQDA%2BMDwwOjAJBgUrDgMCGgUABBQdKNE
// wjytjKBQADcgM61jfflNpyQQUv1NDgnjQnsOA5RtnygUA37lIg6UCA
// QI%3D?Content-Type: application/ocsp-request
//
//
// When this flag is set, CryptRetrieveObjectByUrl, searches for the
// last L'/' and L'?' POST marker characters in the URL string.
// These are removed from the URL before it is passed to the WinHttp
// APIs. The L'?' string is passed as the AdditionHeaders to
// WinHttpSendRequest. The L'/' string is url unescaped (%xx converted
// to appropriate character) and base64 decoded into binary. This
// decoded binary is passed as the additional data to WinHttpSendRequest.
#define CRYPT_HTTP_POST_RETRIEVAL 0x00100000
// When this flag is set we won't attempt to bypass any potential proxy caches.
// If a proxy cache wasn't explicitly bypassed, fProxyCacheRetrieval will be
// set in pAuxInfo. Only applicable to http URL retrievals.
#define CRYPT_PROXY_CACHE_RETRIEVAL 0x00200000
// When this flag is set, for a conditional retrieval returning not modified,
// TRUE is returned and *ppvObject is set to NULL. For a nonNULL pAuxInfo,
// dwHttpStatusCode is set to winhttp.h's HTTP_STATUS_NOT_MODIFIED. Otherwise,
// *ppvObject is updated for a successful retrieval. Only applicable to
// http URL retrievals.
#define CRYPT_NOT_MODIFIED_RETRIEVAL 0x00400000
// //
// Data verification retrieval flags // Data verification retrieval flags
// //
// CRYPT_VERIFY_CONTEXT_SIGNATURE is used to get signature verification // CRYPT_VERIFY_CONTEXT_SIGNATURE is used to get signature verification
// on the context created. In this case pszObjectOid must be non-NULL and // on the context created. In this case pszObjectOid must be non-NULL and
// pvVerify points to the signer certificate context // pvVerify points to the signer certificate context
// //
// CRYPT_VERIFY_DATA_HASH is used to get verification of the blob data // CRYPT_VERIFY_DATA_HASH is used to get verification of the blob data
// retrieved by the protocol. The pvVerify points to an URL_DATA_HASH // retrieved by the protocol. The pvVerify points to an URL_DATA_HASH
// structure (TBD) // structure (TBD)
skipping to change at line 13956 skipping to change at line 16077
#define CRYPT_KEEP_TIME_VALID 0x00000080 #define CRYPT_KEEP_TIME_VALID 0x00000080
#define CRYPT_DONT_VERIFY_SIGNATURE 0x00000100 #define CRYPT_DONT_VERIFY_SIGNATURE 0x00000100
#define CRYPT_DONT_CHECK_TIME_VALIDITY 0x00000200 #define CRYPT_DONT_CHECK_TIME_VALIDITY 0x00000200
// The default checks if ftNextUpdate >= ftValidFor. Set this flag to // The default checks if ftNextUpdate >= ftValidFor. Set this flag to
// check if ftThisUpdate >= ftValidFor. // check if ftThisUpdate >= ftValidFor.
#define CRYPT_CHECK_FRESHNESS_TIME_VALIDITY 0x00000400 #define CRYPT_CHECK_FRESHNESS_TIME_VALIDITY 0x00000400
#define CRYPT_ACCUMULATIVE_TIMEOUT 0x00000800 #define CRYPT_ACCUMULATIVE_TIMEOUT 0x00000800
// Set this flag to only use OCSP AIA URLs.
#define CRYPT_OCSP_ONLY_RETRIEVAL 0x01000000
//
// Cryptnet URL Cache Pre-Fetch Info
//
typedef struct _CRYPTNET_URL_CACHE_PRE_FETCH_INFO {
DWORD cbSize;
DWORD dwObjectType;
// Possible errors:
// S_OK - Pending
// ERROR_MEDIA_OFFLINE - CRL pre-fetch disabled due to OCSP offline.
// ERROR_FILE_OFFLINE - Unchanged pre-fetch content
// ERROR_INVALID_DATA - Invalid pre-fetch content
// Other errors - Unable to retrieve pre-fetch content
DWORD dwError;
DWORD dwReserved;
FILETIME ThisUpdateTime;
FILETIME NextUpdateTime;
FILETIME PublishTime; // May be zero
} CRYPTNET_URL_CACHE_PRE_FETCH_INFO, *PCRYPTNET_URL_CACHE_PRE_FETCH_INFO;
// Pre-fetch ObjectTypes
#define CRYPTNET_URL_CACHE_PRE_FETCH_NONE 0
#define CRYPTNET_URL_CACHE_PRE_FETCH_BLOB 1
#define CRYPTNET_URL_CACHE_PRE_FETCH_CRL 2
#define CRYPTNET_URL_CACHE_PRE_FETCH_OCSP 3
#define CRYPTNET_URL_CACHE_PRE_FETCH_AUTOROOT_CAB 5
//
// Cryptnet URL Cache Flush Info
//
typedef struct _CRYPTNET_URL_CACHE_FLUSH_INFO {
DWORD cbSize;
// If pre-fetching is enabled, following is ignored
//
// 0 - use default flush exempt seconds (2 weeks)
// 0xFFFFFFFF - disable flushing
DWORD dwExemptSeconds;
// Time the object expires. The above dwExemptSeconds is added to
// to determine the flush time. The LastSyncTime is used if
// after this time.
FILETIME ExpireTime;
} CRYPTNET_URL_CACHE_FLUSH_INFO, *PCRYPTNET_URL_CACHE_FLUSH_INFO;
#define CRYPTNET_URL_CACHE_DEFAULT_FLUSH 0
#define CRYPTNET_URL_CACHE_DISABLE_FLUSH 0xFFFFFFFF
//
// Cryptnet URL Cache Response Info
//
typedef struct _CRYPTNET_URL_CACHE_RESPONSE_INFO {
DWORD cbSize;
WORD wResponseType;
WORD wResponseFlags;
// The following are zero if not present
FILETIME LastModifiedTime;
DWORD dwMaxAge;
LPCWSTR pwszETag;
DWORD dwProxyId;
} CRYPTNET_URL_CACHE_RESPONSE_INFO, *PCRYPTNET_URL_CACHE_RESPONSE_INFO;
// ResponseTypes
#define CRYPTNET_URL_CACHE_RESPONSE_NONE 0
#define CRYPTNET_URL_CACHE_RESPONSE_HTTP 1
// ResponseFlags
#define CRYPTNET_URL_CACHE_RESPONSE_VALIDATED 0x8000
//
// CryptRetrieveObjectByUrl Auxilliary Info
//
//
// All unused fields in this data structure must be zeroed. More fields
// could be added in a future release.
//
typedef struct _CRYPT_RETRIEVE_AUX_INFO { typedef struct _CRYPT_RETRIEVE_AUX_INFO {
DWORD cbSize; DWORD cbSize;
FILETIME *pLastSyncTime; FILETIME *pLastSyncTime;
DWORD dwMaxUrlRetrievalByteCount; // 0 => implies no limit
// 0 => implies no limit
DWORD dwMaxUrlRetrievalByteCount;
// To get any PreFetchInfo, set the following pointer to a
// CRYPTNET_URL_CACHE_PRE_FETCH_INFO structure with its cbSize set
// upon input. For no PreFetchInfo, except for cbSize, the data
// structure is zeroed upon return.
PCRYPTNET_URL_CACHE_PRE_FETCH_INFO pPreFetchInfo;
// To get any FlushInfo, set the following pointer to a
// CRYPTNET_URL_CACHE_FLUSH_INFO structure with its cbSize set
// upon input. For no FlushInfo, except for cbSize, the data structure
// is zeroed upon return.
PCRYPTNET_URL_CACHE_FLUSH_INFO pFlushInfo;
// To get any ResponseInfo, set the following pointer to the address
// of a PCRYPTNET_URL_CACHE_RESPONSE_INFO pointer updated with
// the allocated structure. For no ResponseInfo, *ppResponseInfo is set
// to NULL. Otherwise, *ppResponseInfo must be free via CryptMemFree().
PCRYPTNET_URL_CACHE_RESPONSE_INFO *ppResponseInfo;
// If nonNULL, the specified prefix string is prepended to the
// cached filename.
LPWSTR pwszCacheFileNamePrefix;
// If nonNULL, any cached information before this time is considered
// time invalid. For CRYPT_CACHE_ONLY_RETRIEVAL, if there is a
// cached entry before this time, LastError is set to ERROR_INVALID_TIME.
// Also used to set max-age for http retrievals.
LPFILETIME pftCacheResync;
// The following flag is set upon return if CRYPT_PROXY_CACHE_RETRIEVAL
// was set in dwRetrievalFlags and the proxy cache wasn't explicitly
// bypassed for the retrieval. This flag won't be explicitly cleared.
// This flag will only be set for http URL retrievals.
BOOL fProxyCacheRetrieval;
// This value is only updated upon return for a nonSuccessful status code
// returned in a HTTP response header. This value won't be explicitly
// cleared. This value will only be updated for http or https URL
// retrievals.
//
// If CRYPT_NOT_MODIFIED_RETRIEVAL was set in dwFlags, set to winhttp.h's
// HTTP_STATUS_NOT_MODIFIED if the retrieval returned not modified. In
// this case TRUE is returned with *ppvObject set to NULL.
DWORD dwHttpStatusCode;
} CRYPT_RETRIEVE_AUX_INFO, *PCRYPT_RETRIEVE_AUX_INFO; } CRYPT_RETRIEVE_AUX_INFO, *PCRYPT_RETRIEVE_AUX_INFO;
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CryptRetrieveObjectByUrlA ( CryptRetrieveObjectByUrlA (
IN LPCSTR pszUrl, __in LPCSTR pszUrl,
IN LPCSTR pszObjectOid, __in_opt LPCSTR pszObjectOid,
IN DWORD dwRetrievalFlags, __in DWORD dwRetrievalFlags,
IN DWORD dwTimeout, // milliseconds __in DWORD dwTimeout, // milliseconds
OUT LPVOID* ppvObject, __deref_out LPVOID* ppvObject,
IN HCRYPTASYNC hAsyncRetrieve, __in_opt HCRYPTASYNC hAsyncRetrieve,
IN OPTIONAL PCRYPT_CREDENTIALS pCredentials, __in_opt PCRYPT_CREDENTIALS pCredentials,
IN OPTIONAL LPVOID pvVerify, __in_opt LPVOID pvVerify,
IN OPTIONAL PCRYPT_RETRIEVE_AUX_INFO pAuxInfo __inout_opt PCRYPT_RETRIEVE_AUX_INFO pAuxInfo
); );
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CryptRetrieveObjectByUrlW ( CryptRetrieveObjectByUrlW (
IN LPCWSTR pszUrl, __in LPCWSTR pszUrl,
IN LPCSTR pszObjectOid, __in_opt LPCSTR pszObjectOid,
IN DWORD dwRetrievalFlags, __in DWORD dwRetrievalFlags,
IN DWORD dwTimeout, // milliseconds __in DWORD dwTimeout, // milliseconds
OUT LPVOID* ppvObject, __deref_out LPVOID* ppvObject,
IN HCRYPTASYNC hAsyncRetrieve, __in_opt HCRYPTASYNC hAsyncRetrieve,
IN OPTIONAL PCRYPT_CREDENTIALS pCredentials, __in_opt PCRYPT_CREDENTIALS pCredentials,
IN OPTIONAL LPVOID pvVerify, __in_opt LPVOID pvVerify,
IN OPTIONAL PCRYPT_RETRIEVE_AUX_INFO pAuxInfo __inout_opt PCRYPT_RETRIEVE_AUX_INFO pAuxInfo
); );
#ifdef UNICODE #ifdef UNICODE
#define CryptRetrieveObjectByUrl CryptRetrieveObjectByUrlW #define CryptRetrieveObjectByUrl CryptRetrieveObjectByUrlW
#else #else
#define CryptRetrieveObjectByUrl CryptRetrieveObjectByUrlA #define CryptRetrieveObjectByUrl CryptRetrieveObjectByUrlA
#endif // !UNICODE #endif // !UNICODE
// //
// Call back function to cancel object retrieval // Call back function to cancel object retrieval
// //
// The function can be installed on a per thread basis. // The function can be installed on a per thread basis.
// If CryptInstallCancelRetrieval is called for multiple times, only the most re cent // If CryptInstallCancelRetrieval is called for multiple times, only the most re cent
// installation will be kept. // installation will be kept.
// //
// This is only effective for http, https, gopher, and ftp protocol. // This is only effective for http, https, gopher, and ftp protocol.
// It is ignored by the rest of the protocols. // It is ignored by the rest of the protocols.
typedef BOOL (WINAPI *PFN_CRYPT_CANCEL_RETRIEVAL)( typedef BOOL (WINAPI *PFN_CRYPT_CANCEL_RETRIEVAL)(
IN DWORD dwFlags, __in DWORD dwFlags,
IN void *pvArg __inout_opt void *pvArg
); );
// //
// PFN_CRYPT_CANCEL_RETRIEVAL // PFN_CRYPT_CANCEL_RETRIEVAL
// //
// This function should return FALSE when the object retrieval should be continu ed // This function should return FALSE when the object retrieval should be continu ed
// and return TRUE when the object retrieval should be cancelled. // and return TRUE when the object retrieval should be cancelled.
// //
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptInstallCancelRetrieval( CryptInstallCancelRetrieval(
IN PFN_CRYPT_CANCEL_RETRIEVAL pfnCancel, __callback PFN_CRYPT_CANCEL_RETRIEVAL pfnCancel,
IN const void *pvArg, __in_opt const void *pvArg,
IN DWORD dwFlags, __in DWORD dwFlags,
IN void *pvReserved __reserved void *pvReserved
); );
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptUninstallCancelRetrieval( CryptUninstallCancelRetrieval(
IN DWORD dwFlags, __in DWORD dwFlags,
IN void *pvReserved __reserved void *pvReserved
); );
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptCancelAsyncRetrieval ( CryptCancelAsyncRetrieval (
HCRYPTASYNC hAsyncRetrieval __in_opt HCRYPTASYNC hAsyncRetrieval
); );
// //
// Remote Object Async Retrieval parameters // Remote Object Async Retrieval parameters
// //
// //
// A client that wants to be notified of asynchronous object retrieval // A client that wants to be notified of asynchronous object retrieval
// completion sets this parameter on the async handle // completion sets this parameter on the async handle
// //
#define CRYPT_PARAM_ASYNC_RETRIEVAL_COMPLETION ((LPCSTR)1) #define CRYPT_PARAM_ASYNC_RETRIEVAL_COMPLETION ((LPCSTR)1)
typedef VOID (WINAPI *PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC) ( typedef VOID (WINAPI *PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC) (
IN LPVOID pvCompletion, __inout_opt LPVOID pvCompletion,
IN DWORD dwCompletionCode, __in DWORD dwCompletionCode,
IN LPCSTR pszUrl, __in LPCSTR pszUrl,
IN LPSTR pszObjectOid, __in_opt LPSTR pszObjectOid,
IN LPVOID pvObject __in LPVOID pvObject
); );
typedef struct _CRYPT_ASYNC_RETRIEVAL_COMPLETION { typedef struct _CRYPT_ASYNC_RETRIEVAL_COMPLETION {
PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC pfnCompletion; __callback PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC pfnCompletion;
LPVOID pvCompletion; __inout_opt LPVOID pvCompletion;
} CRYPT_ASYNC_RETRIEVAL_COMPLETION, *PCRYPT_ASYNC_RETRIEVAL_COMPLETION; } CRYPT_ASYNC_RETRIEVAL_COMPLETION, *PCRYPT_ASYNC_RETRIEVAL_COMPLETION;
// //
// This function is set on the async handle by a scheme provider that // This function is set on the async handle by a scheme provider that
// supports asynchronous retrieval // supports asynchronous retrieval
// //
#define CRYPT_PARAM_CANCEL_ASYNC_RETRIEVAL ((LPCSTR)2) #define CRYPT_PARAM_CANCEL_ASYNC_RETRIEVAL ((LPCSTR)2)
typedef BOOL (WINAPI *PFN_CANCEL_ASYNC_RETRIEVAL_FUNC) ( typedef BOOL (WINAPI *PFN_CANCEL_ASYNC_RETRIEVAL_FUNC) (
HCRYPTASYNC hAsyncRetrieve __in_opt HCRYPTASYNC hAsyncRetrieve
); );
// //
// Get the locator for a CAPI object // Get the locator for a CAPI object
// //
#define CRYPT_GET_URL_FROM_PROPERTY 0x00000001 #define CRYPT_GET_URL_FROM_PROPERTY 0x00000001
#define CRYPT_GET_URL_FROM_EXTENSION 0x00000002 #define CRYPT_GET_URL_FROM_EXTENSION 0x00000002
#define CRYPT_GET_URL_FROM_UNAUTH_ATTRIBUTE 0x00000004 #define CRYPT_GET_URL_FROM_UNAUTH_ATTRIBUTE 0x00000004
#define CRYPT_GET_URL_FROM_AUTH_ATTRIBUTE 0x00000008 #define CRYPT_GET_URL_FROM_AUTH_ATTRIBUTE 0x00000008
skipping to change at line 14109 skipping to change at line 16358
// distribution points. Each distribution point may have multiple // distribution points. Each distribution point may have multiple
// URLs, (LDAP and HTTP scheme). // URLs, (LDAP and HTTP scheme).
DWORD cGroup; DWORD cGroup;
DWORD *rgcGroupEntry; DWORD *rgcGroupEntry;
} CRYPT_URL_INFO, *PCRYPT_URL_INFO; } CRYPT_URL_INFO, *PCRYPT_URL_INFO;
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptGetObjectUrl ( CryptGetObjectUrl (
IN LPCSTR pszUrlOid, __in LPCSTR pszUrlOid,
IN LPVOID pvPara, __in LPVOID pvPara,
IN DWORD dwFlags, __in DWORD dwFlags,
OUT OPTIONAL PCRYPT_URL_ARRAY pUrlArray, __out_bcount_part_opt(*pcbUrlArray, *pcbUrlArray) PCRYPT_URL_ARRAY pUrlArray
IN OUT DWORD* pcbUrlArray, ,
OUT OPTIONAL PCRYPT_URL_INFO pUrlInfo, __inout DWORD* pcbUrlArray,
IN OUT OPTIONAL DWORD* pcbUrlInfo, __out_bcount_part_opt(*pcbUrlInfo, *pcbUrlInfo) PCRYPT_URL_INFO pUrlInfo,
IN OPTIONAL LPVOID pvReserved __inout_opt DWORD* pcbUrlInfo,
__reserved LPVOID pvReserved
); );
#define URL_OID_GET_OBJECT_URL_FUNC "UrlDllGetObjectUrl" #define URL_OID_GET_OBJECT_URL_FUNC "UrlDllGetObjectUrl"
// //
// UrlDllGetObjectUrl has the same signature as CryptGetObjectUrl // UrlDllGetObjectUrl has the same signature as CryptGetObjectUrl
// //
// //
// URL_OID_CERTIFICATE_ISSUER // URL_OID_CERTIFICATE_ISSUER
skipping to change at line 14191 skipping to change at line 16440
// on the CRL // on the CRL
// //
// URL_OID_CROSS_CERT_DIST_POINT // URL_OID_CROSS_CERT_DIST_POINT
// //
// pvPara == PCCERT_CONTEXT, certificate whose cross certificate distribution // pvPara == PCCERT_CONTEXT, certificate whose cross certificate distribution
// point is being requested // point is being requested
// //
// This will be retrieved from the cross certificate distribution point // This will be retrieved from the cross certificate distribution point
// extension or property on the certificate // extension or property on the certificate
// //
// URL_OID_CERTIFICATE_OCSP
//
// pvPara == PCCERT_CONTEXT, certificate whose OCSP URL is being requested
//
// This will be retrieved from the authority info access extension or property
// on the certificate
//
// URL_OID_CERTIFICATE_OCSP_AND_CRL_DIST_POINT
//
// pvPara == PCCERT_CONTEXT, certificate whose OCSP URL and
// CRL distribution point are being requested
//
// This will be retrieved from the authority info access and
// CRL distribution point extension or property on the certificate.
// If any OCSP URLs are present, they will be first with each URL prefixed
// with L"ocsp:". The L"ocsp:" prefix should be removed before using.
//
// URL_OID_CERTIFICATE_CRL_DIST_POINT_AND_OCSP
//
// Same as URL_OID_CERTIFICATE_OCSP_AND_CRL_DIST_POINT, except,
// the CRL URLs will be first
//
// URL_OID_CROSS_CERT_SUBJECT_INFO_ACCESS
//
// pvPara == PCCERT_CONTEXT, certificate whose cross certificates
// are being requested
//
// This will be retrieved from the Authority Info Access
// extension or property on the certificate. Only access methods
// matching szOID_PKIX_CA_REPOSITORY will be returned.
#define URL_OID_CERTIFICATE_ISSUER ((LPCSTR)1) #define URL_OID_CERTIFICATE_ISSUER ((LPCSTR)1)
#define URL_OID_CERTIFICATE_CRL_DIST_POINT ((LPCSTR)2) #define URL_OID_CERTIFICATE_CRL_DIST_POINT ((LPCSTR)2)
#define URL_OID_CTL_ISSUER ((LPCSTR)3) #define URL_OID_CTL_ISSUER ((LPCSTR)3)
#define URL_OID_CTL_NEXT_UPDATE ((LPCSTR)4) #define URL_OID_CTL_NEXT_UPDATE ((LPCSTR)4)
#define URL_OID_CRL_ISSUER ((LPCSTR)5) #define URL_OID_CRL_ISSUER ((LPCSTR)5)
#define URL_OID_CERTIFICATE_FRESHEST_CRL ((LPCSTR)6) #define URL_OID_CERTIFICATE_FRESHEST_CRL ((LPCSTR)6)
#define URL_OID_CRL_FRESHEST_CRL ((LPCSTR)7) #define URL_OID_CRL_FRESHEST_CRL ((LPCSTR)7)
#define URL_OID_CROSS_CERT_DIST_POINT ((LPCSTR)8) #define URL_OID_CROSS_CERT_DIST_POINT ((LPCSTR)8)
#define URL_OID_CERTIFICATE_OCSP ((LPCSTR)9)
#define URL_OID_CERTIFICATE_OCSP_AND_CRL_DIST_POINT ((LPCSTR)10)
#define URL_OID_CERTIFICATE_CRL_DIST_POINT_AND_OCSP ((LPCSTR)11)
#define URL_OID_CROSS_CERT_SUBJECT_INFO_ACCESS ((LPCSTR)12)
typedef struct _CERT_CRL_CONTEXT_PAIR { typedef struct _CERT_CRL_CONTEXT_PAIR {
PCCERT_CONTEXT pCertContext; PCCERT_CONTEXT pCertContext;
PCCRL_CONTEXT pCrlContext; PCCRL_CONTEXT pCrlContext;
} CERT_CRL_CONTEXT_PAIR, *PCERT_CRL_CONTEXT_PAIR; } CERT_CRL_CONTEXT_PAIR, *PCERT_CRL_CONTEXT_PAIR;
typedef const CERT_CRL_CONTEXT_PAIR *PCCERT_CRL_CONTEXT_PAIR; typedef const CERT_CRL_CONTEXT_PAIR *PCCERT_CRL_CONTEXT_PAIR;
// //
// Get a time valid CAPI2 object // Get a time valid CAPI2 object
// //
//+-------------------------------------------------------------------------
// The following optional Extra Info may be passed to
// CryptGetTimeValidObject().
//
// All unused fields in this data structure must be zeroed. More fields
// could be added in a future release.
//--------------------------------------------------------------------------
typedef struct _CRYPT_GET_TIME_VALID_OBJECT_EXTRA_INFO {
DWORD cbSize;
// If > 0, check that the CRL's number is >=
int iDeltaCrlIndicator;
// If nonNULL, any cached information before this time is considered
// time invalid and forces a wire retrieval.
LPFILETIME pftCacheResync;
// If nonNull, returns the cache's LastSyncTime
LPFILETIME pLastSyncTime;
// If nonNull, returns the internal MaxAge expiration time
// for the object. If the object doesn't have a MaxAge expiration, set
// to zero.
LPFILETIME pMaxAgeTime;
} CRYPT_GET_TIME_VALID_OBJECT_EXTRA_INFO,
*PCRYPT_GET_TIME_VALID_OBJECT_EXTRA_INFO;
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CryptGetTimeValidObject ( CryptGetTimeValidObject (
IN LPCSTR pszTimeValidOid, __in LPCSTR pszTimeValidOid,
IN LPVOID pvPara, __in LPVOID pvPara,
IN PCCERT_CONTEXT pIssuer, __in PCCERT_CONTEXT pIssuer,
IN OPTIONAL LPFILETIME pftValidFor, __in_opt LPFILETIME pftValidFor,
IN DWORD dwFlags, __in DWORD dwFlags,
IN DWORD dwTimeout, // milliseconds __in DWORD dwTimeout, // milliseconds
OUT OPTIONAL LPVOID* ppvObject, __deref_opt_out LPVOID* ppvObject,
IN OPTIONAL PCRYPT_CREDENTIALS pCredentials, __in_opt PCRYPT_CREDENTIALS pCredentials,
IN OPTIONAL LPVOID pvReserved __inout_opt PCRYPT_GET_TIME_VALID_OBJECT_EXTRA_INFO pExtraInfo
); );
#define TIME_VALID_OID_GET_OBJECT_FUNC "TimeValidDllGetObject" #define TIME_VALID_OID_GET_OBJECT_FUNC "TimeValidDllGetObject"
// //
// TimeValidDllGetObject has the same signature as CryptGetTimeValidObject // TimeValidDllGetObject has the same signature as CryptGetTimeValidObject
// //
// //
// TIME_VALID_OID_GET_CTL // TIME_VALID_OID_GET_CTL
skipping to change at line 14265 skipping to change at line 16576
#define TIME_VALID_OID_GET_CRL ((LPCSTR)2) #define TIME_VALID_OID_GET_CRL ((LPCSTR)2)
#define TIME_VALID_OID_GET_CRL_FROM_CERT ((LPCSTR)3) #define TIME_VALID_OID_GET_CRL_FROM_CERT ((LPCSTR)3)
#define TIME_VALID_OID_GET_FRESHEST_CRL_FROM_CERT ((LPCSTR)4) #define TIME_VALID_OID_GET_FRESHEST_CRL_FROM_CERT ((LPCSTR)4)
#define TIME_VALID_OID_GET_FRESHEST_CRL_FROM_CRL ((LPCSTR)5) #define TIME_VALID_OID_GET_FRESHEST_CRL_FROM_CRL ((LPCSTR)5)
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptFlushTimeValidObject ( CryptFlushTimeValidObject (
IN LPCSTR pszFlushTimeValidOid, __in LPCSTR pszFlushTimeValidOid,
IN LPVOID pvPara, __in LPVOID pvPara,
IN PCCERT_CONTEXT pIssuer, __in PCCERT_CONTEXT pIssuer,
IN DWORD dwFlags, __in DWORD dwFlags,
IN LPVOID pvReserved __reserved LPVOID pvReserved
); );
#define TIME_VALID_OID_FLUSH_OBJECT_FUNC "TimeValidDllFlushObject" #define TIME_VALID_OID_FLUSH_OBJECT_FUNC "TimeValidDllFlushObject"
// //
// TimeValidDllFlushObject has the same signature as CryptFlushTimeValidObject // TimeValidDllFlushObject has the same signature as CryptFlushTimeValidObject
// //
// //
// TIME_VALID_OID_FLUSH_CTL // TIME_VALID_OID_FLUSH_CTL
skipping to change at line 14408 skipping to change at line 16719
// //
// flags specific to base provider // flags specific to base provider
// //
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptProtectData( CryptProtectData(
IN DATA_BLOB* pDataIn, IN DATA_BLOB* pDataIn,
IN LPCWSTR szDataDescr, __in_opt LPCWSTR szDataDescr,
IN OPTIONAL DATA_BLOB* pOptionalEntropy, IN OPTIONAL DATA_BLOB* pOptionalEntropy,
IN PVOID pvReserved, __reserved PVOID pvReserved,
IN OPTIONAL CRYPTPROTECT_PROMPTSTRUCT* pPromptStruct, IN OPTIONAL CRYPTPROTECT_PROMPTSTRUCT* pPromptStruct,
IN DWORD dwFlags, IN DWORD dwFlags,
OUT DATA_BLOB* pDataOut // out encr blob OUT DATA_BLOB* pDataOut // out encr blob
); );
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptUnprotectData( CryptUnprotectData(
IN DATA_BLOB* pDataIn, // in encr blob IN DATA_BLOB* pDataIn, // in encr blob
OUT OPTIONAL LPWSTR* ppszDataDescr, // out __deref_opt_out_opt LPWSTR* ppszDataDescr, // out
IN OPTIONAL DATA_BLOB* pOptionalEntropy, IN OPTIONAL DATA_BLOB* pOptionalEntropy,
IN PVOID pvReserved, __reserved PVOID pvReserved,
IN OPTIONAL CRYPTPROTECT_PROMPTSTRUCT* pPromptStruct, IN OPTIONAL CRYPTPROTECT_PROMPTSTRUCT* pPromptStruct,
IN DWORD dwFlags, IN DWORD dwFlags,
OUT DATA_BLOB* pDataOut OUT DATA_BLOB* pDataOut
); );
WINCRYPT32API
BOOL
WINAPI
CryptUpdateProtectedState(
__in_opt PSID pOldSid,
__in_opt LPCWSTR pwszOldPassword,
__in DWORD dwFlags,
__out_opt DWORD *pdwSuccessCount,
__out_opt DWORD *pdwFailureCount);
// //
// The buffer length passed into CryptProtectMemory and CryptUnprotectMemory // The buffer length passed into CryptProtectMemory and CryptUnprotectMemory
// must be a multiple of this length (or zero). // must be a multiple of this length (or zero).
// //
#define CRYPTPROTECTMEMORY_BLOCK_SIZE 16 #define CRYPTPROTECTMEMORY_BLOCK_SIZE 16
// //
// CryptProtectMemory/CryptUnprotectMemory dwFlags // CryptProtectMemory/CryptUnprotectMemory dwFlags
// //
skipping to change at line 14485 skipping to change at line 16806
IN DWORD dwFlags IN DWORD dwFlags
); );
//+========================================================================= //+=========================================================================
// Helper functions to build certificates // Helper functions to build certificates
//========================================================================== //==========================================================================
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// //
// Builds a self-signed certificate and returns a PCCERT_CONTEXT representing // Builds a self-signed certificate and returns a PCCERT_CONTEXT representing
// the certificate. A hProv must be specified to build the cert context. // the certificate. A hProv may be specified to build the cert context.
// //
// pSubjectIssuerBlob is the DN for the certifcate. If an alternate subject // pSubjectIssuerBlob is the DN for the certifcate. If an alternate subject
// name is desired it must be specified as an extension in the pExtensions // name is desired it must be specified as an extension in the pExtensions
// parameter. pSubjectIssuerBlob can NOT be NULL, so minimually an empty DN // parameter. pSubjectIssuerBlob can NOT be NULL, so minimually an empty DN
// must be specified. // must be specified.
// //
// By default: // By default:
// pKeyProvInfo - The CSP is queried for the KeyProvInfo parameters. Only the Pr ovider, // pKeyProvInfo - The CSP is queried for the KeyProvInfo parameters. Only the Pr ovider,
// Provider Type and Container is queried. Many CSPs don't support these // Provider Type and Container is queried. Many CSPs don't support these
// queries and will cause a failure. In such cases the pKeyProvInfo // queries and will cause a failure. In such cases the pKeyProvInfo
skipping to change at line 14516 skipping to change at line 16837
// //
// If the cert being built is only a dummy placeholder cert for speed it may not // If the cert being built is only a dummy placeholder cert for speed it may not
// need to be signed. Signing of the cert is skipped if CERT_CREATE_SELFSIGN_NO_ SIGN // need to be signed. Signing of the cert is skipped if CERT_CREATE_SELFSIGN_NO_ SIGN
// is specified in dwFlags. // is specified in dwFlags.
// //
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCERT_CONTEXT PCCERT_CONTEXT
WINAPI WINAPI
CertCreateSelfSignCertificate( CertCreateSelfSignCertificate(
IN HCRYPTPROV hProv, __in_opt HCRYPTPROV_OR_NCRYPT_KEY_HANDLE hCryptProvOrNCryptKey,
IN PCERT_NAME_BLOB pSubjectIssuerBlob, __in PCERT_NAME_BLOB pSubjectIssuerBlob,
IN DWORD dwFlags, __in DWORD dwFlags,
OPTIONAL PCRYPT_KEY_PROV_INFO pKeyProvInfo, __in_opt PCRYPT_KEY_PROV_INFO pKeyProvInfo,
OPTIONAL PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm, __in_opt PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
OPTIONAL PSYSTEMTIME pStartTime, __in_opt PSYSTEMTIME pStartTime,
OPTIONAL PSYSTEMTIME pEndTime, __in_opt PSYSTEMTIME pEndTime,
OPTIONAL PCERT_EXTENSIONS pExtensions __in_opt PCERT_EXTENSIONS pExtensions
); );
#define CERT_CREATE_SELFSIGN_NO_SIGN 1 #define CERT_CREATE_SELFSIGN_NO_SIGN 1
#define CERT_CREATE_SELFSIGN_NO_KEY_INFO 2 #define CERT_CREATE_SELFSIGN_NO_KEY_INFO 2
//+========================================================================= //+=========================================================================
// Key Identifier Property Data Structures and APIs // Key Identifier Property Data Structures and APIs
//========================================================================== //==========================================================================
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
skipping to change at line 14562 skipping to change at line 16883
// By default, searches the CurrentUser's list of Key Identifiers. // By default, searches the CurrentUser's list of Key Identifiers.
// CRYPT_KEYID_MACHINE_FLAG can be set to search the LocalMachine's list // CRYPT_KEYID_MACHINE_FLAG can be set to search the LocalMachine's list
// of Key Identifiers. When CRYPT_KEYID_MACHINE_FLAG is set, pwszComputerName // of Key Identifiers. When CRYPT_KEYID_MACHINE_FLAG is set, pwszComputerName
// can also be set to specify the name of a remote computer to be searched // can also be set to specify the name of a remote computer to be searched
// instead of the local machine. // instead of the local machine.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptGetKeyIdentifierProperty( CryptGetKeyIdentifierProperty(
IN const CRYPT_HASH_BLOB *pKeyIdentifier, __in const CRYPT_HASH_BLOB *pKeyIdentifier,
IN DWORD dwPropId, __in DWORD dwPropId,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL LPCWSTR pwszComputerName, __in_opt LPCWSTR pwszComputerName,
IN OPTIONAL void *pvReserved, __reserved void *pvReserved,
OUT void *pvData, __out_bcount_part_opt(*pcbData, *pcbData) void *pvData,
IN OUT DWORD *pcbData __inout DWORD *pcbData
); );
// When the following flag is set, searches the LocalMachine instead of the // When the following flag is set, searches the LocalMachine instead of the
// CurrentUser. This flag is applicable to all the KeyIdentifierProperty APIs. // CurrentUser. This flag is applicable to all the KeyIdentifierProperty APIs.
#define CRYPT_KEYID_MACHINE_FLAG 0x00000020 #define CRYPT_KEYID_MACHINE_FLAG 0x00000020
// When the following flag is set, *pvData is updated with a pointer to // When the following flag is set, *pvData is updated with a pointer to
// allocated memory. LocalFree() must be called to free the allocated memory. // allocated memory. LocalFree() must be called to free the allocated memory.
#define CRYPT_KEYID_ALLOC_FLAG 0x00008000 #define CRYPT_KEYID_ALLOC_FLAG 0x00008000
skipping to change at line 14602 skipping to change at line 16923
// properties is deleted. // properties is deleted.
// //
// If CRYPT_KEYID_SET_NEW_FLAG is set, the set fails if the property already // If CRYPT_KEYID_SET_NEW_FLAG is set, the set fails if the property already
// exists. For an existing property, FALSE is returned with LastError set to // exists. For an existing property, FALSE is returned with LastError set to
// CRYPT_E_EXISTS. // CRYPT_E_EXISTS.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptSetKeyIdentifierProperty( CryptSetKeyIdentifierProperty(
IN const CRYPT_HASH_BLOB *pKeyIdentifier, __in const CRYPT_HASH_BLOB *pKeyIdentifier,
IN DWORD dwPropId, __in DWORD dwPropId,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL LPCWSTR pwszComputerName, __in_opt LPCWSTR pwszComputerName,
IN OPTIONAL void *pvReserved, __reserved void *pvReserved,
IN const void *pvData __in_opt const void *pvData
); );
// When the following flag is set, the Key Identifier and all its properties // When the following flag is set, the Key Identifier and all its properties
// are deleted. // are deleted.
#define CRYPT_KEYID_DELETE_FLAG 0x00000010 #define CRYPT_KEYID_DELETE_FLAG 0x00000010
// When the following flag is set, the set fails if the property already // When the following flag is set, the set fails if the property already
// exists. // exists.
#define CRYPT_KEYID_SET_NEW_FLAG 0x00002000 #define CRYPT_KEYID_SET_NEW_FLAG 0x00002000
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// For CERT_KEY_PROV_INFO_PROP_ID, rgppvData[] points to a // For CERT_KEY_PROV_INFO_PROP_ID, rgppvData[] points to a
// CRYPT_KEY_PROV_INFO. // CRYPT_KEY_PROV_INFO.
// //
// Return FALSE to stop the enumeration. // Return FALSE to stop the enumeration.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
typedef BOOL (WINAPI *PFN_CRYPT_ENUM_KEYID_PROP)( typedef BOOL (WINAPI *PFN_CRYPT_ENUM_KEYID_PROP)(
IN const CRYPT_HASH_BLOB *pKeyIdentifier, __in const CRYPT_HASH_BLOB *pKeyIdentifier,
IN DWORD dwFlags, __in DWORD dwFlags,
IN void *pvReserved, __reserved void *pvReserved,
IN void *pvArg, __inout_opt void *pvArg,
IN DWORD cProp, __in DWORD cProp,
IN DWORD *rgdwPropId, __in_ecount(cProp) DWORD *rgdwPropId,
IN void **rgpvData, __in_ecount(cProp) void **rgpvData,
IN DWORD *rgcbData __in_ecount(cProp) DWORD *rgcbData
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Enumerate the Key Identifiers. // Enumerate the Key Identifiers.
// //
// If pKeyIdentifier is NULL, enumerates all Key Identifers. Otherwise, // If pKeyIdentifier is NULL, enumerates all Key Identifers. Otherwise,
// calls the callback for the specified KeyIdentifier. If dwPropId is // calls the callback for the specified KeyIdentifier. If dwPropId is
// 0, calls the callback with all the properties. Otherwise, only calls // 0, calls the callback with all the properties. Otherwise, only calls
// the callback with the specified property (cProp = 1). // the callback with the specified property (cProp = 1).
// Furthermore, when dwPropId is specified, skips KeyIdentifiers not // Furthermore, when dwPropId is specified, skips KeyIdentifiers not
// having the property. // having the property.
// //
// Set CRYPT_KEYID_MACHINE_FLAG to enumerate the LocalMachine // Set CRYPT_KEYID_MACHINE_FLAG to enumerate the LocalMachine
// Key Identifiers. Set pwszComputerName, to enumerate Key Identifiers on // Key Identifiers. Set pwszComputerName, to enumerate Key Identifiers on
// a remote computer. // a remote computer.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptEnumKeyIdentifierProperties( CryptEnumKeyIdentifierProperties(
IN OPTIONAL const CRYPT_HASH_BLOB *pKeyIdentifier, __in_opt const CRYPT_HASH_BLOB *pKeyIdentifier,
IN DWORD dwPropId, __in DWORD dwPropId,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL LPCWSTR pwszComputerName, __in_opt LPCWSTR pwszComputerName,
IN OPTIONAL void *pvReserved, __reserved void *pvReserved,
IN OPTIONAL void *pvArg, __inout_opt void *pvArg,
IN PFN_CRYPT_ENUM_KEYID_PROP pfnEnum __callback PFN_CRYPT_ENUM_KEYID_PROP pfnEnum
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Create a KeyIdentifier from the CSP Public Key Blob. // Create a KeyIdentifier from the CSP Public Key Blob.
// //
// Converts the CSP PUBLICKEYSTRUC into a X.509 CERT_PUBLIC_KEY_INFO and // Converts the CSP PUBLICKEYSTRUC into a X.509 CERT_PUBLIC_KEY_INFO and
// encodes. The encoded CERT_PUBLIC_KEY_INFO is SHA1 hashed to obtain // encodes. The encoded CERT_PUBLIC_KEY_INFO is SHA1 hashed to obtain
// the Key Identifier. // the Key Identifier.
// //
// By default, the pPubKeyStruc->aiKeyAlg is used to find the appropriate // By default, the pPubKeyStruc->aiKeyAlg is used to find the appropriate
// public key Object Identifier. pszPubKeyOID can be set to override // public key Object Identifier. pszPubKeyOID can be set to override
// the default OID obtained from the aiKeyAlg. // the default OID obtained from the aiKeyAlg.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CryptCreateKeyIdentifierFromCSP( CryptCreateKeyIdentifierFromCSP(
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN OPTIONAL LPCSTR pszPubKeyOID, __in_opt LPCSTR pszPubKeyOID,
IN const PUBLICKEYSTRUC *pPubKeyStruc, __in_bcount(cbPubKeyStruc) const PUBLICKEYSTRUC *pPubKeyStruc,
IN DWORD cbPubKeyStruc, __in DWORD cbPubKeyStruc,
IN DWORD dwFlags, __in DWORD dwFlags,
IN OPTIONAL void *pvReserved, __reserved void *pvReserved,
OUT BYTE *pbHash, __out_bcount_part_opt(*pcbHash, *pcbHash) BYTE *pbHash,
IN OUT DWORD *pcbHash __inout DWORD *pcbHash
); );
//+========================================================================= //+=========================================================================
// Certificate Chaining Infrastructure // Certificate Chaining Infrastructure
//========================================================================== //==========================================================================
#define CERT_CHAIN_CONFIG_REGPATH \ #define CERT_CHAIN_CONFIG_REGPATH \
L"Software\\Microsoft\\Cryptography\\OID\\EncodingType 0\\CertDllCreateCerti ficateChainEngine\\Config" L"Software\\Microsoft\\Cryptography\\OID\\EncodingType 0\\CertDllCreateCerti ficateChainEngine\\Config"
// The following is a REG_BINARY. It contains the cache resync FILETIME.
// Any cached information before this time is considered time invalid
// and forces a wire retrieval. By default this is disabled.
#define CERT_CHAIN_CACHE_RESYNC_FILETIME_VALUE_NAME \
L"ChainCacheResyncFiletime"
// The following are REG_DWORD's. These configuration parameters are used // The following are REG_DWORD's. These configuration parameters are used
// to restrict Authority Info Access (AIA) URL retrieval. // to disable different chain building semantics enabled by default. Set
// the appropriate registry value to nonzero to disable.
#define CERT_CHAIN_DISABLE_AIA_URL_RETRIEVAL_VALUE_NAME \ #define CERT_CHAIN_DISABLE_MANDATORY_BASIC_CONSTRAINTS_VALUE_NAME \
L"DisableAIAUrlRetrieval" L"DisableMandatoryBasicConstraints"
// By default AIA Url Retrieval is enabled. Set this registry value to nonzero // By default the BasicConstraints extension must be present with CA enabled
// to disable // for non-Root intermediate CA certificates.
#define CERT_CHAIN_DISABLE_CA_NAME_CONSTRAINTS_VALUE_NAME \
L"DisableCANameConstraints"
// By default the NameConstraints extension is applied to the intermediate
// CA certificates in addition to the end entity certificate.
#define CERT_CHAIN_DISABLE_UNSUPPORTED_CRITICAL_EXTENSIONS_VALUE_NAME \
L"DisableUnsupportedCriticalExtensions"
// By default any unsupported extension marked critical sets the following
// dwErrorStatus bit: CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT.
// The following are REG_DWORD's. These configuration parameters are used
// to restrict Authority Info Access (AIA) URL retrieval.
#define CERT_CHAIN_MAX_AIA_URL_COUNT_IN_CERT_VALUE_NAME \ #define CERT_CHAIN_MAX_AIA_URL_COUNT_IN_CERT_VALUE_NAME \
L"MaxAIAUrlCountInCert" L"MaxAIAUrlCountInCert"
#define CERT_CHAIN_MAX_AIA_URL_COUNT_IN_CERT_DEFAULT 5 #define CERT_CHAIN_MAX_AIA_URL_COUNT_IN_CERT_DEFAULT 5
#define CERT_CHAIN_MAX_AIA_URL_RETRIEVAL_COUNT_PER_CHAIN_VALUE_NAME \ #define CERT_CHAIN_MAX_AIA_URL_RETRIEVAL_COUNT_PER_CHAIN_VALUE_NAME \
L"MaxAIAUrlRetrievalCountPerChain" L"MaxAIAUrlRetrievalCountPerChain"
#define CERT_CHAIN_MAX_AIA_URL_RETRIEVAL_COUNT_PER_CHAIN_DEFAULT 10 #define CERT_CHAIN_MAX_AIA_URL_RETRIEVAL_COUNT_PER_CHAIN_DEFAULT 10
#define CERT_CHAIN_MAX_AIA_URL_RETRIEVAL_BYTE_COUNT_VALUE_NAME \ #define CERT_CHAIN_MAX_AIA_URL_RETRIEVAL_BYTE_COUNT_VALUE_NAME \
L"MaxAIAUrlRetrievalByteCount" L"MaxAIAUrlRetrievalByteCount"
#define CERT_CHAIN_MAX_AIA_URL_RETRIEVAL_BYTE_COUNT_DEFAULT 100000 #define CERT_CHAIN_MAX_AIA_URL_RETRIEVAL_BYTE_COUNT_DEFAULT 100000
#define CERT_CHAIN_MAX_AIA_URL_RETRIEVAL_CERT_COUNT_VALUE_NAME \ #define CERT_CHAIN_MAX_AIA_URL_RETRIEVAL_CERT_COUNT_VALUE_NAME \
L"MaxAIAUrlRetrievalCertCount" L"MaxAIAUrlRetrievalCertCount"
#define CERT_CHAIN_MAX_AIA_URL_RETRIEVAL_CERT_COUNT_DEFAULT 10 #define CERT_CHAIN_MAX_AIA_URL_RETRIEVAL_CERT_COUNT_DEFAULT 10
// The following is a REG_DWORD. If the OCSP response NextUpdate is zero,
// this value is added to the ThisUpdate to get a nonzero NextUpdate.
#define CERT_CHAIN_OCSP_VALIDITY_SECONDS_VALUE_NAME \
L"OcspValiditySeconds"
// 12 hours
#define CERT_CHAIN_OCSP_VALIDITY_SECONDS_DEFAULT (12 * 60 * 60)
// The following are REG_DWORD's. These configuration parameters are
// used by the following APIs to get a non-blocking, time valid OCSP
// response for a server certificate chain:
// CertOpenServerOcspResponse
// CertAddRefServerOcspResponse
// CertCloseServerOcspResponse
// CertGetServerOcspResponseContext
// CertAddRefServerOcspResponseContext
// CertFreeServerOcspResponseContext
// This is the minimum validity of the server OCSP response to be
// returned by CertGetServerOcspResponseContext(). Since this OCSP
// response will be returned to the client, it must be sufficiently long
// so that the client will treat it as being time valid.
#define CERT_SRV_OCSP_RESP_MIN_VALIDITY_SECONDS_VALUE_NAME \
L"SrvOcspRespMinValiditySeconds"
// 10 minutes
#define CERT_SRV_OCSP_RESP_MIN_VALIDITY_SECONDS_DEFAULT \
(10 * 60)
// This is the maximum number of milliseconds for each server OCSP response
// pre-fetch wire URL retrieval.
#define CERT_SRV_OCSP_RESP_URL_RETRIEVAL_TIMEOUT_MILLISECONDS_VALUE_NAME \
L"SrvOcspRespUrlRetrievalTimeoutMilliseconds"
// 15 seconds
#define CERT_SRV_OCSP_RESP_URL_RETRIEVAL_TIMEOUT_MILLISECONDS_DEFAULT \
(15 * 1000)
// This is the maximum number of seconds to do a server OCSP response
// pre-fetch retrieval before the OCSP response's NextUpdate. The
// server OCSP response pre-fetch thread will wait until CurrentTime >=
// NextUpdate - MaxBeforeNextUpdateSeconds before doing the next retrieval.
#define CERT_SRV_OCSP_RESP_MAX_BEFORE_NEXT_UPDATE_SECONDS_VALUE_NAME \
L"SrvOcspRespMaxBeforeNextUpdateSeconds"
// 4 hours
#define CERT_SRV_OCSP_RESP_MAX_BEFORE_NEXT_UPDATE_SECONDS_DEFAULT \
(4 * 60 * 60)
// This is the minimum number of seconds to do a server OCSP response
// pre-fetch retrieval before the OCSP response's NextUpdate.
// If CurrentTime >= NextUpdate - MinBeforeNextUpdateSeconds, will wait until
// after NextUpdate + MinAfterNextUpdateSeconds.
#define CERT_SRV_OCSP_RESP_MIN_BEFORE_NEXT_UPDATE_SECONDS_VALUE_NAME \
L"SrvOcspRespMinBeforeNextUpdateSeconds"
// 2 minutes
#define CERT_SRV_OCSP_RESP_MIN_BEFORE_NEXT_UPDATE_SECONDS_DEFAULT \
(2 * 60)
// This is the minimum number of seconds to do a server OCSP response
// pre-fetch retrieval after the OCSP response's NextUpdate when
// (NextUpdate - MinBeforeNextUpdateSeconds) < CurrentTime < NextUpdate.
#define CERT_SRV_OCSP_RESP_MIN_AFTER_NEXT_UPDATE_SECONDS_VALUE_NAME\
L"SrvOcspRespMinAfterNextUpdateSeconds"
// 1 minute
#define CERT_SRV_OCSP_RESP_MIN_AFTER_NEXT_UPDATE_SECONDS_DEFAULT \
(1 * 60)
// The following are REG_DWORD's. These configuration parameters are used
// in the ordering of the revocation retrieval URLs.
// When the number of cached OCSP URLs associated with the same CDP extension
// equal or exceed this number, the OCSP AIA URLs aren't used.
#define CRYPTNET_MAX_CACHED_OCSP_PER_CRL_COUNT_VALUE_NAME \
L"CryptnetMaxCachedOcspPerCrlCount"
#define CRYPTNET_MAX_CACHED_OCSP_PER_CRL_COUNT_DEFAULT \
500
// The above registry value can be set to this value, to disable OCSP
// when a CDP extension is present. Note, a registry value of 0, uses the
// above default value.
#define CRYPTNET_OCSP_AFTER_CRL_DISABLE \
0xFFFFFFFF
// The following are REG_DWORD's. These configuration parameters are
// used by the Cryptnet Url Cache Service (CUCS).
// The following parameter is used as the default flush exempt seconds
#define CRYPTNET_URL_CACHE_DEFAULT_FLUSH_EXEMPT_SECONDS_VALUE_NAME \
L"CryptnetDefaultFlushExemptSeconds"
// 4 Weeks : 28 days * 24 hours * 60 minutes * 60 seconds
#define CRYPTNET_URL_CACHE_DEFAULT_FLUSH_EXEMPT_SECONDS_DEFAULT \
(28 * 24 * 60 * 60)
// Following 2 parameters are used to set the lower and upper limit
// on the max-age retrievals done before the Publish and NextUpdate times.
#define CRYPTNET_PRE_FETCH_MIN_MAX_AGE_SECONDS_VALUE_NAME \
L"CryptnetPreFetchMinMaxAgeSeconds"
// 1 hour
#define CRYPTNET_PRE_FETCH_MIN_MAX_AGE_SECONDS_DEFAULT \
(1 * 60 * 60)
#define CRYPTNET_PRE_FETCH_MAX_MAX_AGE_SECONDS_VALUE_NAME \
L"CryptnetPreFetchMaxMaxAgeSeconds"
// 2 Weeks : 14 days * 24 hours * 60 minutes * 60 seconds
#define CRYPTNET_PRE_FETCH_MAX_MAX_AGE_SECONDS_DEFAULT \
(14 * 24 * 60 * 60)
// Following 3 parameters are used to calculate the PreFetch start before
// the NextUpdate
//
// Where PreFetchStartTime = PublishTime +
// PublishPeriod / AfterPublishPreFetchDivisor
// PreFetchEndTime = NextUpdate -
// PublishPeriod / BeforeNextUpdatePreFetchDivisor
//
// PreFetchPeriod = PreFetchEndTime - PreFetchStartTime
//
// if (PreFetchPeriod < MinBeforeNextUpdatePreFetchPeriodSeconds)
// - No PreFetch is done before NextUpdate
// else
// - PreFetch starts are randomized over this period
// The start of the PreFetch period is delayed after the start of the
// Publish period by dividing the PublishPeriod (NextUpdate - PublishTime)
// by this integer divisor.
#define CRYPTNET_PRE_FETCH_AFTER_PUBLISH_PRE_FETCH_DIVISOR_VALUE_NAME \
L"CryptnetPreFetchAfterPublishPreFetchDivisor"
// 10, where 12 hours / 10 = 72 minutes or 1.2 hours / 10 = 7.2 minutes
#define CRYPTNET_PRE_FETCH_AFTER_PUBLISH_PRE_FETCH_DIVISOR_DEFAULT \
10
// The finish of the PreFetch period occurs before NextUpdate
// by dividing the PublishPeriod (NextUpdate - PublishTime)
// by this integer divisor.
#define CRYPTNET_PRE_FETCH_BEFORE_NEXT_UPDATE_PRE_FETCH_DIVISOR_VALUE_NAME \
L"CryptnetPreFetchBeforeNextUpdatePreFetchDivisor"
// 20, where 12 hours / 20 = 36 minutes or 1.2 hours / 10 = 3.6 minutes
#define CRYPTNET_PRE_FETCH_BEFORE_NEXT_UPDATE_PRE_FETCH_DIVISOR_DEFAULT \
20
// The PreFetch period must exceed this minimum duration in seconds
// to do a PreFetch before NextUpdate
#define CRYPTNET_PRE_FETCH_MIN_BEFORE_NEXT_UPDATE_PRE_FETCH_PERIOD_SECONDS_VALUE
_NAME \
L"CryptnetPreFetchMinBeforeNextUpdatePreFetchSeconds"
// 1 hour
//
// For the default OCSP period of 12 hours using above defaults,
// PreFetchPeriod = 72 minutes - 7.2 minutes - 3.6 mintes = 61.2 minutes
#define CRYPTNET_PRE_FETCH_MIN_BEFORE_NEXT_UPDATE_PRE_FETCH_PERIOD_SECONDS_DEFAU
LT \
(1 * 60 * 60)
// Following 4 parameters are used to calculate the PreFetch start after
// the NextUpdate
//
// ValidityPeriod = NextUpdate - ThisUpdate
//
// PreFetchPeriod = ValidityPeriod / AfterNextUpdatePreFetchDivisor
//
// Where PreFetchPeriod is decreased to MaxAfterNextUpdatePreFetchPeriodSeconds
// or increased to MinAfterNextUpdatePreFetchPeriodSeconds;
//
// PreFetchStartTime = NextUpdate
// PreFetchEndTime = PreFetchStartTime + PreFetchPeriod
//
// PreFetch starts are randomized over the above PreFetchPeriod
//
// If CurrentTime > RandomPreFetchStartTime, then, the
// AfterCurrentTimePreFetchPeriodSeconds is randomized and added to
// CurrentTime for the RandomPreFetchStartTime
// The PreFetch period after NextUpdate is initially calculated by
// dividing the ValidityPeriod (NextUpdate - ThisUpdate) by this integer
// divisor.
#define CRYPTNET_PRE_FETCH_VALIDITY_PERIOD_AFTER_NEXT_UPDATE_PRE_FETCH_DIVISOR_V
ALUE_NAME \
L"CryptnetPreFetchValidityPeriodAfterNextUpdatePreFetchDivisor"
// 10, where 1 week / 10 = 16.8 hours
#define CRYPTNET_PRE_FETCH_VALIDITY_PERIOD_AFTER_NEXT_UPDATE_PRE_FETCH_DIVISOR_D
EFAULT \
10
// If necessary, the above PreFetch period will be decreased
// to this maximum duration in seconds.
#define CRYPTNET_PRE_FETCH_MAX_AFTER_NEXT_UPDATE_PRE_FETCH_PERIOD_SECONDS_VALUE_
NAME \
L"CryptnetPreFetchMaxAfterNextUpdatePreFetchPeriodSeconds"
// 4 hours
#define CRYPTNET_PRE_FETCH_MAX_AFTER_NEXT_UPDATE_PRE_FETCH_PERIOD_SECONDS_DEFAUL
T \
(4 * 60 * 60)
// If necessary, the above PreFetch period will be increased
// to this minimum duration in seconds.
#define CRYPTNET_PRE_FETCH_MIN_AFTER_NEXT_UPDATE_PRE_FETCH_PERIOD_SECONDS_VALUE_
NAME \
L"CryptnetPreFetchMinAfterNextUpdatePreFetchPeriodSeconds"
// 30 minutes
#define CRYPTNET_PRE_FETCH_MIN_AFTER_NEXT_UPDATE_PRE_FETCH_PERIOD_SECONDS_DEFAUL
T \
(30 * 60)
// If the CurrentTime is after the above randomized start time, the following
// parameter will be randomized and added to the CurrentTime.
#define CRYPTNET_PRE_FETCH_AFTER_CURRENT_TIME_PRE_FETCH_PERIOD_SECONDS_VALUE_NAM
E \
L"CryptnetPreFetchAfterCurrentTimePreFetchPeriodSeconds"
// 30 minutes
#define CRYPTNET_PRE_FETCH_AFTER_CURRENT_TIME_PRE_FETCH_PERIOD_SECONDS_DEFAULT \
(30 * 60)
// Following parameter specifies the minimum time period between sending
// trigger URL cache PreFetch LRPC messages to cryptsvc after doing online
// revocation enabled chain builds.
#define CRYPTNET_PRE_FETCH_TRIGGER_PERIOD_SECONDS_VALUE_NAME \
L"CryptnetPreFetchTriggerPeriodSeconds"
// 10 minutes
#define CRYPTNET_PRE_FETCH_TRIGGER_PERIOD_SECONDS_DEFAULT \
(10 * 60)
// The above registry value can be set to this value, to disable the
// sending of trigger URL cache PreFetch LRPC messages. Note, a registry
// value of 0, uses the above default value.
#define CRYPTNET_PRE_FETCH_TRIGGER_DISABLE \
0xFFFFFFFF
// Following parameter specifies the delay time to wait to scan the
// URL cache directory after receiving a trigger LRPC message request.
#define CRYPTNET_PRE_FETCH_SCAN_AFTER_TRIGGER_DELAY_SECONDS_VALUE_NAME \
L"CryptnetPreFetchScanAfterTriggerDelaySeconds"
// 30 seconds
#define CRYPTNET_PRE_FETCH_SCAN_AFTER_TRIGGER_DELAY_SECONDS_DEFAULT \
30
// Following parameter specifies the maximum amount of time to wait for any
// PreFetch retrieval to complete
#define CRYPTNET_PRE_FETCH_RETRIEVAL_TIMEOUT_SECONDS_VALUE_NAME \
L"CryptnetPreFetchRetrievalTimeoutSeconds"
// 5 minutes
#define CRYPTNET_PRE_FETCH_RETRIEVAL_TIMEOUT_SECONDS_DEFAULT \
(5 * 60)
//+-------------------------------------------------------------------------
// The following configuration parameters are store in HKLM group policy
//--------------------------------------------------------------------------
#define CERT_GROUP_POLICY_CHAIN_CONFIG_REGPATH \
CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH L"\\ChainEngine\\Config"
// In Longhorn, the following have been moved from the above HKLM
// configuration parameters:
// The following are REG_DWORD's. These configuration parameters are used
// to override the default URL timeouts in chain building
// This is the default URL timeout in milliseconds
#define CERT_CHAIN_URL_RETRIEVAL_TIMEOUT_MILLISECONDS_VALUE_NAME \
L"ChainUrlRetrievalTimeoutMilliseconds"
// 15 seconds
#define CERT_CHAIN_URL_RETRIEVAL_TIMEOUT_MILLISECONDS_DEFAULT \
(15 * 1000)
// This is the default revocation accumulative URL timeout in milliseconds
// The first revocation URL retrieval uses half of this timeout
#define CERT_CHAIN_REV_ACCUMULATIVE_URL_RETRIEVAL_TIMEOUT_MILLISECONDS_VALUE_NAM
E \
L"ChainRevAccumulativeUrlRetrievalTimeoutMilliseconds"
// 20 seconds
#define CERT_CHAIN_REV_ACCUMULATIVE_URL_RETRIEVAL_TIMEOUT_MILLISECONDS_DEFAULT \
(20 * 1000)
// Note, will allow the machine setting to be used if this value isn't
// defined.
// By default AIA OCSP URLs are before CDP CRL URLs. When the number of cached
// OCSP URLs associated with the same CDP extension equal or exceed this
// number, the CRL URLs are placed before the OCSP URLs.
#define CRYPTNET_CACHED_OCSP_SWITCH_TO_CRL_COUNT_VALUE_NAME \
L"CryptnetCachedOcspSwitchToCrlCount"
#define CRYPTNET_CACHED_OCSP_SWITCH_TO_CRL_COUNT_DEFAULT \
50
// The above registry value can be set to this value, to always place
// the CRL URLs before the OCSP URLs. Note, a registry value of 0, uses the
// above default value.
#define CRYPTNET_CRL_BEFORE_OCSP_ENABLE \
0xFFFFFFFF
// Support for the following was removed in Longhorn. Changed to use
// the following OPTIONS flags in HKLM Group Policy
#define CERT_CHAIN_DISABLE_AIA_URL_RETRIEVAL_VALUE_NAME \
L"DisableAIAUrlRetrieval"
// By default AIA Url Retrieval is enabled. Set this registry value to nonzero
// to disable
// This is the name of the REG_DWORD for chain engine Options
#define CERT_CHAIN_OPTIONS_VALUE_NAME \
L"Options"
// Disable AIA URL retrieval when this bit is set in the Options
#define CERT_CHAIN_OPTION_DISABLE_AIA_URL_RETRIEVAL 0x2
#define CERT_CHAIN_CROSS_CERT_DOWNLOAD_INTERVAL_HOURS_VALUE_NAME \
L"CrossCertDownloadIntervalHours"
// 7 days
#define CERT_CHAIN_CROSS_CERT_DOWNLOAD_INTERVAL_HOURS_DEFAULT (24 * 7)
// When not defined or zero, the CRL validity isn't extended
#define CERT_CHAIN_CRL_VALIDITY_EXT_PERIOD_HOURS_VALUE_NAME \
L"CRLValidityExtensionPeriod"
// 12 hour
#define CERT_CHAIN_CRL_VALIDITY_EXT_PERIOD_HOURS_DEFAULT 12
// //
// The chain engine defines the store namespace and cache partitioning for // The chain engine defines the store namespace and cache partitioning for
// the Certificate Chaining infrastructure. A default chain engine // the Certificate Chaining infrastructure. A default chain engine
// is defined for the process which uses all default system stores e.g. // is defined for the process which uses all default system stores e.g.
// Root, CA, Trust, for chain building and caching. If an application // Root, CA, Trust, for chain building and caching. If an application
// wishes to define its own store namespace or have its own partitioned // wishes to define its own store namespace or have its own partitioned
// cache then it can create its own chain engine. It is advisable to create // cache then it can create its own chain engine. It is advisable to create
// a chain engine at application startup and use it throughout the lifetime // a chain engine at application startup and use it throughout the lifetime
// of the application in order to get optimal caching behavior // of the application in order to get optimal caching behavior
// //
skipping to change at line 14800 skipping to change at line 17443
DWORD cAdditionalStore; DWORD cAdditionalStore;
HCERTSTORE* rghAdditionalStore; HCERTSTORE* rghAdditionalStore;
DWORD dwFlags; DWORD dwFlags;
DWORD dwUrlRetrievalTimeout; // milliseconds DWORD dwUrlRetrievalTimeout; // milliseconds
DWORD MaximumCachedCertificates; DWORD MaximumCachedCertificates;
DWORD CycleDetectionModulus; DWORD CycleDetectionModulus;
} CERT_CHAIN_ENGINE_CONFIG, *PCERT_CHAIN_ENGINE_CONFIG; } CERT_CHAIN_ENGINE_CONFIG, *PCERT_CHAIN_ENGINE_CONFIG;
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CertCreateCertificateChainEngine ( CertCreateCertificateChainEngine (
IN PCERT_CHAIN_ENGINE_CONFIG pConfig, __in PCERT_CHAIN_ENGINE_CONFIG pConfig,
OUT HCERTCHAINENGINE* phChainEngine __out HCERTCHAINENGINE* phChainEngine
); );
// //
// Free a certificate trust engine // Free a certificate trust engine
// //
WINCRYPT32API WINCRYPT32API
VOID VOID
WINAPI WINAPI
CertFreeCertificateChainEngine ( CertFreeCertificateChainEngine (
IN HCERTCHAINENGINE hChainEngine __in_opt HCERTCHAINENGINE hChainEngine
); );
// //
// Resync the certificate chain engine. This resync's the stores backing // Resync the certificate chain engine. This resync's the stores backing
// the engine and updates the engine caches. // the engine and updates the engine caches.
// //
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertResyncCertificateChainEngine ( CertResyncCertificateChainEngine (
IN HCERTCHAINENGINE hChainEngine __in_opt HCERTCHAINENGINE hChainEngine
); );
// //
// When an application requests a certificate chain, the data structure // When an application requests a certificate chain, the data structure
// returned is in the form of a CERT_CHAIN_CONTEXT. This contains // returned is in the form of a CERT_CHAIN_CONTEXT. This contains
// an array of CERT_SIMPLE_CHAIN where each simple chain goes from // an array of CERT_SIMPLE_CHAIN where each simple chain goes from
// an end cert to a self signed cert and the chain context connects simple // an end cert to a self signed cert and the chain context connects simple
// chains via trust lists. Each simple chain contains the chain of // chains via trust lists. Each simple chain contains the chain of
// certificates, summary trust information about the chain and trust information // certificates, summary trust information about the chain and trust information
// about each certificate element in the chain. // about each certificate element in the chain.
skipping to change at line 14872 skipping to change at line 17516
#define CERT_TRUST_IS_NOT_VALID_FOR_USAGE 0x00000010 #define CERT_TRUST_IS_NOT_VALID_FOR_USAGE 0x00000010
#define CERT_TRUST_IS_UNTRUSTED_ROOT 0x00000020 #define CERT_TRUST_IS_UNTRUSTED_ROOT 0x00000020
#define CERT_TRUST_REVOCATION_STATUS_UNKNOWN 0x00000040 #define CERT_TRUST_REVOCATION_STATUS_UNKNOWN 0x00000040
#define CERT_TRUST_IS_CYCLIC 0x00000080 #define CERT_TRUST_IS_CYCLIC 0x00000080
#define CERT_TRUST_INVALID_EXTENSION 0x00000100 #define CERT_TRUST_INVALID_EXTENSION 0x00000100
#define CERT_TRUST_INVALID_POLICY_CONSTRAINTS 0x00000200 #define CERT_TRUST_INVALID_POLICY_CONSTRAINTS 0x00000200
#define CERT_TRUST_INVALID_BASIC_CONSTRAINTS 0x00000400 #define CERT_TRUST_INVALID_BASIC_CONSTRAINTS 0x00000400
#define CERT_TRUST_INVALID_NAME_CONSTRAINTS 0x00000800 #define CERT_TRUST_INVALID_NAME_CONSTRAINTS 0x00000800
#define CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT 0x00001000 #define CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT 0x00001000
// In LH, this error will never be set.
#define CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT 0x00002000 #define CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT 0x00002000
#define CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT 0x00004000 #define CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT 0x00004000
#define CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT 0x00008000 #define CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT 0x00008000
#define CERT_TRUST_IS_OFFLINE_REVOCATION 0x01000000 #define CERT_TRUST_IS_OFFLINE_REVOCATION 0x01000000
#define CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY 0x02000000 #define CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY 0x02000000
#define CERT_TRUST_IS_EXPLICIT_DISTRUST 0x04000000
#define CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT 0x08000000
// These can be applied to chains only // These can be applied to chains only
#define CERT_TRUST_IS_PARTIAL_CHAIN 0x00010000 #define CERT_TRUST_IS_PARTIAL_CHAIN 0x00010000
#define CERT_TRUST_CTL_IS_NOT_TIME_VALID 0x00020000 #define CERT_TRUST_CTL_IS_NOT_TIME_VALID 0x00020000
#define CERT_TRUST_CTL_IS_NOT_SIGNATURE_VALID 0x00040000 #define CERT_TRUST_CTL_IS_NOT_SIGNATURE_VALID 0x00040000
#define CERT_TRUST_CTL_IS_NOT_VALID_FOR_USAGE 0x00080000 #define CERT_TRUST_CTL_IS_NOT_VALID_FOR_USAGE 0x00080000
// //
// The following are info status bits // The following are info status bits
skipping to change at line 14902 skipping to change at line 17551
#define CERT_TRUST_HAS_EXACT_MATCH_ISSUER 0x00000001 #define CERT_TRUST_HAS_EXACT_MATCH_ISSUER 0x00000001
#define CERT_TRUST_HAS_KEY_MATCH_ISSUER 0x00000002 #define CERT_TRUST_HAS_KEY_MATCH_ISSUER 0x00000002
#define CERT_TRUST_HAS_NAME_MATCH_ISSUER 0x00000004 #define CERT_TRUST_HAS_NAME_MATCH_ISSUER 0x00000004
#define CERT_TRUST_IS_SELF_SIGNED 0x00000008 #define CERT_TRUST_IS_SELF_SIGNED 0x00000008
// These can be applied to certificates and chains // These can be applied to certificates and chains
#define CERT_TRUST_HAS_PREFERRED_ISSUER 0x00000100 #define CERT_TRUST_HAS_PREFERRED_ISSUER 0x00000100
#define CERT_TRUST_HAS_ISSUANCE_CHAIN_POLICY 0x00000200 #define CERT_TRUST_HAS_ISSUANCE_CHAIN_POLICY 0x00000200
#define CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS 0x00000400 #define CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS 0x00000400
#define CERT_TRUST_IS_PEER_TRUSTED 0x00000800
#define CERT_TRUST_HAS_CRL_VALIDITY_EXTENDED 0x00001000
// These can be applied to chains only // These can be applied to chains only
#define CERT_TRUST_IS_COMPLEX_CHAIN 0x00010000 #define CERT_TRUST_IS_COMPLEX_CHAIN 0x00010000
// //
// Each certificate context in a simple chain has a corresponding chain element // Each certificate context in a simple chain has a corresponding chain element
// in the simple chain context // in the simple chain context
// //
// dwErrorStatus has CERT_TRUST_IS_REVOKED, pRevocationInfo set // dwErrorStatus has CERT_TRUST_IS_REVOKED, pRevocationInfo set
skipping to change at line 15031 skipping to change at line 17681
PCCERT_CHAIN_CONTEXT* rgpLowerQualityChainContext; PCCERT_CHAIN_CONTEXT* rgpLowerQualityChainContext;
// fHasRevocationFreshnessTime is only set if we are able to retrieve // fHasRevocationFreshnessTime is only set if we are able to retrieve
// revocation information for all elements checked for revocation. // revocation information for all elements checked for revocation.
// For a CRL its CurrentTime - ThisUpdate. // For a CRL its CurrentTime - ThisUpdate.
// //
// dwRevocationFreshnessTime is the largest time across all elements // dwRevocationFreshnessTime is the largest time across all elements
// checked. // checked.
BOOL fHasRevocationFreshnessTime; BOOL fHasRevocationFreshnessTime;
DWORD dwRevocationFreshnessTime; // seconds DWORD dwRevocationFreshnessTime; // seconds
// Flags passed when created via CertGetCertificateChain
DWORD dwCreateFlags;
// Following is updated with unique Id when the chain context is logged.
GUID ChainId;
}; };
// //
// When building a chain, the there are various parameters used for finding // When building a chain, the there are various parameters used for finding
// issuing certificates and trust lists. They are identified in the // issuing certificates and trust lists. They are identified in the
// following structure // following structure
// //
// Default usage match type is AND with value zero // Default usage match type is AND with value zero
#define USAGE_MATCH_TYPE_AND 0x00000000 #define USAGE_MATCH_TYPE_AND 0x00000000
skipping to change at line 15073 skipping to change at line 17729
// Note, if you #define CERT_CHAIN_PARA_HAS_EXTRA_FIELDS, then, you // Note, if you #define CERT_CHAIN_PARA_HAS_EXTRA_FIELDS, then, you
// must zero all unused fields in this data structure. // must zero all unused fields in this data structure.
// More fields could be added in a future release. // More fields could be added in a future release.
CERT_USAGE_MATCH RequestedIssuancePolicy; CERT_USAGE_MATCH RequestedIssuancePolicy;
DWORD dwUrlRetrievalTimeout; // milliseconds DWORD dwUrlRetrievalTimeout; // milliseconds
BOOL fCheckRevocationFreshnessTime; BOOL fCheckRevocationFreshnessTime;
DWORD dwRevocationFreshnessTime; // seconds DWORD dwRevocationFreshnessTime; // seconds
// If nonNULL, any cached information before this time is considered
// time invalid and forces a wire retrieval. When set overrides
// the registry configuration CacheResync time.
LPFILETIME pftCacheResync;
#endif #endif
} CERT_CHAIN_PARA, *PCERT_CHAIN_PARA; } CERT_CHAIN_PARA, *PCERT_CHAIN_PARA;
// //
// The following API is used for retrieving certificate chains // The following API is used for retrieving certificate chains
// //
// Parameters: // Parameters:
// //
// hChainEngine - the chain engine (namespace and cache) to use, NULL // hChainEngine - the chain engine (namespace and cache) to use, NULL
skipping to change at line 15139 skipping to change at line 17800
// When this flag is set, pTime will be used as the timestamp time. // When this flag is set, pTime will be used as the timestamp time.
// pTime will be used to determine if the end certificate was valid at this // pTime will be used to determine if the end certificate was valid at this
// time. Revocation checking will be relative to pTime. // time. Revocation checking will be relative to pTime.
// In addition, current time will also be used // In addition, current time will also be used
// to determine if the certificate is still time valid. All remaining // to determine if the certificate is still time valid. All remaining
// CA and root certificates will be checked using current time and not pTime. // CA and root certificates will be checked using current time and not pTime.
// //
// This flag was added 4/5/01 in WXP. // This flag was added 4/5/01 in WXP.
#define CERT_CHAIN_TIMESTAMP_TIME 0x00000200 #define CERT_CHAIN_TIMESTAMP_TIME 0x00000200
// When this flag is set, "My" certificates having a private key or end
// entity certificates in the "TrustedPeople" store are trusted without
// doing any chain building. Neither the CERT_TRUST_IS_PARTIAL_CHAIN or
// CERT_TRUST_IS_UNTRUSTED_ROOT dwErrorStatus bits will be set for
// such certificates.
//
// This flag was added 6/9/03 in LH.
#define CERT_CHAIN_ENABLE_PEER_TRUST 0x00000400
// When this flag is set, "My" certificates aren't considered for
// PEER_TRUST.
//
// This flag was added 11/12/04 in LH.
//
// On 8-05-05 changed to never consider "My" certificates for PEER_TRUST.
#define CERT_CHAIN_DISABLE_MY_PEER_TRUST 0x00000800
WINCRYPT32API WINCRYPT32API
__success(return == TRUE)
BOOL BOOL
WINAPI WINAPI
CertGetCertificateChain ( CertGetCertificateChain (
IN OPTIONAL HCERTCHAINENGINE hChainEngine, __in_opt HCERTCHAINENGINE hChainEngine,
IN PCCERT_CONTEXT pCertContext, __in PCCERT_CONTEXT pCertContext,
IN OPTIONAL LPFILETIME pTime, __in_opt LPFILETIME pTime,
IN OPTIONAL HCERTSTORE hAdditionalStore, __in_opt HCERTSTORE hAdditionalStore,
IN PCERT_CHAIN_PARA pChainPara, __in PCERT_CHAIN_PARA pChainPara,
IN DWORD dwFlags, __in DWORD dwFlags,
IN LPVOID pvReserved, __reserved LPVOID pvReserved,
OUT PCCERT_CHAIN_CONTEXT* ppChainContext __out PCCERT_CHAIN_CONTEXT* ppChainContext
); );
// //
// Free a certificate chain // Free a certificate chain
// //
WINCRYPT32API WINCRYPT32API
VOID VOID
WINAPI WINAPI
CertFreeCertificateChain ( CertFreeCertificateChain (
IN PCCERT_CHAIN_CONTEXT pChainContext __in PCCERT_CHAIN_CONTEXT pChainContext
); );
// //
// Duplicate (add a reference to) a certificate chain // Duplicate (add a reference to) a certificate chain
// //
WINCRYPT32API WINCRYPT32API
PCCERT_CHAIN_CONTEXT PCCERT_CHAIN_CONTEXT
WINAPI WINAPI
CertDuplicateCertificateChain ( CertDuplicateCertificateChain (
IN PCCERT_CHAIN_CONTEXT pChainContext __in PCCERT_CHAIN_CONTEXT pChainContext
); );
// //
// Specific Revocation Type OID and structure definitions // Specific Revocation Type OID and structure definitions
// //
// //
// CRL Revocation OID // CRL Revocation OID
// //
skipping to change at line 15226 skipping to change at line 17905
// pPrevChainContext is set to the CERT_CHAIN_CONTEXT returned by a previous // pPrevChainContext is set to the CERT_CHAIN_CONTEXT returned by a previous
// call. // call.
// //
// NOTE: a NON-NULL pPrevChainContext is always CertFreeCertificateChain'ed by // NOTE: a NON-NULL pPrevChainContext is always CertFreeCertificateChain'ed by
// this function, even for an error. // this function, even for an error.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
PCCERT_CHAIN_CONTEXT PCCERT_CHAIN_CONTEXT
WINAPI WINAPI
CertFindChainInStore( CertFindChainInStore(
IN HCERTSTORE hCertStore, __in HCERTSTORE hCertStore,
IN DWORD dwCertEncodingType, __in DWORD dwCertEncodingType,
IN DWORD dwFindFlags, __in DWORD dwFindFlags,
IN DWORD dwFindType, __in DWORD dwFindType,
IN const void *pvFindPara, __in_opt const void *pvFindPara,
IN PCCERT_CHAIN_CONTEXT pPrevChainContext __in_opt PCCERT_CHAIN_CONTEXT pPrevChainContext
); );
#define CERT_CHAIN_FIND_BY_ISSUER 1 #define CERT_CHAIN_FIND_BY_ISSUER 1
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// CERT_CHAIN_FIND_BY_ISSUER // CERT_CHAIN_FIND_BY_ISSUER
// //
// Find a certificate chain having a private key for the end certificate and // Find a certificate chain having a private key for the end certificate and
// matching one of the given issuer names. A matching dwKeySpec and // matching one of the given issuer names. A matching dwKeySpec and
// enhanced key usage can also be specified. Additionally a callback can // enhanced key usage can also be specified. Additionally a callback can
skipping to change at line 15281 skipping to change at line 17960
// cached system stores instead of the Current User's. // cached system stores instead of the Current User's.
// //
// Setting CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG in dwFindFlags // Setting CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG in dwFindFlags
// restricts CertGetCertificateChain to only search the URL cache // restricts CertGetCertificateChain to only search the URL cache
// and not hit the wire. // and not hit the wire.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
// Returns FALSE to skip this certificate. Otherwise, returns TRUE to // Returns FALSE to skip this certificate. Otherwise, returns TRUE to
// build a chain for this certificate. // build a chain for this certificate.
typedef BOOL (WINAPI *PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK)( typedef BOOL (WINAPI *PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK)(
IN PCCERT_CONTEXT pCert, __in PCCERT_CONTEXT pCert,
IN void *pvFindArg __inout_opt void *pvFindArg
); );
typedef struct _CERT_CHAIN_FIND_BY_ISSUER_PARA { typedef struct _CERT_CHAIN_FIND_BY_ISSUER_PARA {
DWORD cbSize; DWORD cbSize;
// If pszUsageIdentifier == NULL, matches any usage. // If pszUsageIdentifier == NULL, matches any usage.
LPCSTR pszUsageIdentifier; LPCSTR pszUsageIdentifier;
// If dwKeySpec == 0, matches any KeySpec // If dwKeySpec == 0, matches any KeySpec
DWORD dwKeySpec; DWORD dwKeySpec;
skipping to change at line 15420 skipping to change at line 18099
#define CERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGS ( \ #define CERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGS ( \
CERT_CHAIN_POLICY_IGNORE_END_REV_UNKNOWN_FLAG | \ CERT_CHAIN_POLICY_IGNORE_END_REV_UNKNOWN_FLAG | \
CERT_CHAIN_POLICY_IGNORE_CTL_SIGNER_REV_UNKNOWN_FLAG | \ CERT_CHAIN_POLICY_IGNORE_CTL_SIGNER_REV_UNKNOWN_FLAG | \
CERT_CHAIN_POLICY_IGNORE_CA_REV_UNKNOWN_FLAG | \ CERT_CHAIN_POLICY_IGNORE_CA_REV_UNKNOWN_FLAG | \
CERT_CHAIN_POLICY_IGNORE_ROOT_REV_UNKNOWN_FLAG \ CERT_CHAIN_POLICY_IGNORE_ROOT_REV_UNKNOWN_FLAG \
) )
#define CERT_CHAIN_POLICY_ALLOW_TESTROOT_FLAG 0x00008000 #define CERT_CHAIN_POLICY_ALLOW_TESTROOT_FLAG 0x00008000
#define CERT_CHAIN_POLICY_TRUST_TESTROOT_FLAG 0x00004000 #define CERT_CHAIN_POLICY_TRUST_TESTROOT_FLAG 0x00004000
#define CERT_CHAIN_POLICY_IGNORE_NOT_SUPPORTED_CRITICAL_EXT_FLAG 0x00002000
#define CERT_CHAIN_POLICY_IGNORE_PEER_TRUST_FLAG 0x00001000
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// Verify that the certificate chain satisfies the specified policy // Verify that the certificate chain satisfies the specified policy
// requirements. If we were able to verify the chain policy, TRUE is returned // requirements. If we were able to verify the chain policy, TRUE is returned
// and the dwError field of the pPolicyStatus is updated. A dwError of 0 // and the dwError field of the pPolicyStatus is updated. A dwError of 0
// (ERROR_SUCCESS, S_OK) indicates the chain satisfies the specified policy. // (ERROR_SUCCESS, S_OK) indicates the chain satisfies the specified policy.
// //
// If dwError applies to the entire chain context, both lChainIndex and // If dwError applies to the entire chain context, both lChainIndex and
// lElementIndex are set to -1. If dwError applies to a simple chain, // lElementIndex are set to -1. If dwError applies to a simple chain,
// lElementIndex is set to -1 and lChainIndex is set to the index of the // lElementIndex is set to -1 and lChainIndex is set to the index of the
// first offending chain having the error. If dwError applies to a // first offending chain having the error. If dwError applies to a
skipping to change at line 15446 skipping to change at line 18128
// behaviour. In addition, policy specific parameters can be passed in // behaviour. In addition, policy specific parameters can be passed in
// the pvExtraPolicyPara field of pPolicyPara. // the pvExtraPolicyPara field of pPolicyPara.
// //
// In addition to returning dwError, in pPolicyStatus, policy OID specific // In addition to returning dwError, in pPolicyStatus, policy OID specific
// extra status may be returned via pvExtraPolicyStatus. // extra status may be returned via pvExtraPolicyStatus.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
CertVerifyCertificateChainPolicy( CertVerifyCertificateChainPolicy(
IN LPCSTR pszPolicyOID, __in LPCSTR pszPolicyOID,
IN PCCERT_CHAIN_CONTEXT pChainContext, __in PCCERT_CHAIN_CONTEXT pChainContext,
IN PCERT_CHAIN_POLICY_PARA pPolicyPara, __in PCERT_CHAIN_POLICY_PARA pPolicyPara,
IN OUT PCERT_CHAIN_POLICY_STATUS pPolicyStatus __inout PCERT_CHAIN_POLICY_STATUS pPolicyStatus
); );
// Predefined OID Function Names // Predefined OID Function Names
#define CRYPT_OID_VERIFY_CERTIFICATE_CHAIN_POLICY_FUNC \ #define CRYPT_OID_VERIFY_CERTIFICATE_CHAIN_POLICY_FUNC \
"CertDllVerifyCertificateChainPolicy" "CertDllVerifyCertificateChainPolicy"
// CertDllVerifyCertificateChainPolicy has same function signature as // CertDllVerifyCertificateChainPolicy has same function signature as
// CertVerifyCertificateChainPolicy. // CertVerifyCertificateChainPolicy.
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
skipping to change at line 15639 skipping to change at line 18321
// cchString is obtained via strlen() + 1. // cchString is obtained via strlen() + 1.
// dwFlags defines string format // dwFlags defines string format
// if pbBinary is NULL, *pcbBinary returns the size of required memory // if pbBinary is NULL, *pcbBinary returns the size of required memory
// *pdwSkip returns the character count of skipped strings, optional // *pdwSkip returns the character count of skipped strings, optional
// *pdwFlags returns the actual format used in the conversion, optional // *pdwFlags returns the actual format used in the conversion, optional
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32STRINGAPI WINCRYPT32STRINGAPI
BOOL BOOL
WINAPI WINAPI
CryptStringToBinaryA( CryptStringToBinaryA(
IN LPCSTR pszString, __in_ecount(cchString) LPCSTR pszString,
IN DWORD cchString, __in DWORD cchString,
IN DWORD dwFlags, __in DWORD dwFlags,
IN BYTE *pbBinary, __out_bcount_part_opt(*pcbBinary, *pcbBinary) BYTE *pbBinary,
IN OUT DWORD *pcbBinary, __inout DWORD *pcbBinary,
OUT DWORD *pdwSkip, //OPTIONAL __out_opt DWORD *pdwSkip,
OUT DWORD *pdwFlags //OPTIONAL __out_opt DWORD *pdwFlags
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// convert formatted string to binary // convert formatted string to binary
// If cchString is 0, then pszString is NULL terminated and // If cchString is 0, then pszString is NULL terminated and
// cchString is obtained via strlen() + 1. // cchString is obtained via strlen() + 1.
// dwFlags defines string format // dwFlags defines string format
// if pbBinary is NULL, *pcbBinary returns the size of required memory // if pbBinary is NULL, *pcbBinary returns the size of required memory
// *pdwSkip returns the character count of skipped strings, optional // *pdwSkip returns the character count of skipped strings, optional
// *pdwFlags returns the actual format used in the conversion, optional // *pdwFlags returns the actual format used in the conversion, optional
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32STRINGAPI WINCRYPT32STRINGAPI
BOOL BOOL
WINAPI WINAPI
CryptStringToBinaryW( CryptStringToBinaryW(
IN LPCWSTR pszString, __in_ecount(cchString) LPCWSTR pszString,
IN DWORD cchString, __in DWORD cchString,
IN DWORD dwFlags, __in DWORD dwFlags,
IN BYTE *pbBinary, __out_bcount_part_opt(*pcbBinary, *pcbBinary) BYTE *pbBinary,
IN OUT DWORD *pcbBinary, __inout DWORD *pcbBinary,
OUT DWORD *pdwSkip, //OPTIONAL __out_opt DWORD *pdwSkip,
OUT DWORD *pdwFlags //OPTIONAL __out_opt DWORD *pdwFlags
); );
#ifdef UNICODE #ifdef UNICODE
#define CryptStringToBinary CryptStringToBinaryW #define CryptStringToBinary CryptStringToBinaryW
#else #else
#define CryptStringToBinary CryptStringToBinaryA #define CryptStringToBinary CryptStringToBinaryA
#endif // !UNICODE #endif // !UNICODE
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// convert binary to formatted string // convert binary to formatted string
// dwFlags defines string format // dwFlags defines string format
// if pszString is NULL, *pcchString returns size in characters // if pszString is NULL, *pcchString returns size in characters
// including null-terminator // including null-terminator
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32STRINGAPI WINCRYPT32STRINGAPI
BOOL BOOL
WINAPI WINAPI
CryptBinaryToStringA( CryptBinaryToStringA(
IN CONST BYTE *pbBinary, __in_bcount(cbBinary) CONST BYTE *pbBinary,
IN DWORD cbBinary, __in DWORD cbBinary,
IN DWORD dwFlags, __in DWORD dwFlags,
IN LPSTR pszString, __out_ecount_part_opt(*pcchString, *pcchString) LPSTR pszString,
IN OUT DWORD *pcchString __inout DWORD *pcchString
); );
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// convert binary to formatted string // convert binary to formatted string
// dwFlags defines string format // dwFlags defines string format
// if pszString is NULL, *pcchString returns size in characters // if pszString is NULL, *pcchString returns size in characters
// including null-terminator // including null-terminator
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32STRINGAPI WINCRYPT32STRINGAPI
BOOL BOOL
WINAPI WINAPI
CryptBinaryToStringW( CryptBinaryToStringW(
IN CONST BYTE *pbBinary, __in_bcount(cbBinary) CONST BYTE *pbBinary,
IN DWORD cbBinary, __in DWORD cbBinary,
IN DWORD dwFlags, __in DWORD dwFlags,
IN LPWSTR pszString, __out_ecount_part_opt(*pcchString, *pcchString) LPWSTR pszString,
IN OUT DWORD *pcchString __inout DWORD *pcchString
); );
#ifdef UNICODE #ifdef UNICODE
#define CryptBinaryToString CryptBinaryToStringW #define CryptBinaryToString CryptBinaryToStringW
#else #else
#define CryptBinaryToString CryptBinaryToStringA #define CryptBinaryToString CryptBinaryToStringA
#endif // !UNICODE #endif // !UNICODE
// dwFlags has the following defines // dwFlags has the following defines
// certenrolld_begin -- CRYPT_STRING_*
#define CRYPT_STRING_BASE64HEADER 0x00000000 #define CRYPT_STRING_BASE64HEADER 0x00000000
#define CRYPT_STRING_BASE64 0x00000001 #define CRYPT_STRING_BASE64 0x00000001
#define CRYPT_STRING_BINARY 0x00000002 #define CRYPT_STRING_BINARY 0x00000002
#define CRYPT_STRING_BASE64REQUESTHEADER 0x00000003 #define CRYPT_STRING_BASE64REQUESTHEADER 0x00000003
#define CRYPT_STRING_HEX 0x00000004 #define CRYPT_STRING_HEX 0x00000004
#define CRYPT_STRING_HEXASCII 0x00000005 #define CRYPT_STRING_HEXASCII 0x00000005
#define CRYPT_STRING_BASE64_ANY 0x00000006 #define CRYPT_STRING_BASE64_ANY 0x00000006
#define CRYPT_STRING_ANY 0x00000007 #define CRYPT_STRING_ANY 0x00000007
#define CRYPT_STRING_HEX_ANY 0x00000008 #define CRYPT_STRING_HEX_ANY 0x00000008
#define CRYPT_STRING_BASE64X509CRLHEADER 0x00000009 #define CRYPT_STRING_BASE64X509CRLHEADER 0x00000009
#define CRYPT_STRING_HEXADDR 0x0000000a #define CRYPT_STRING_HEXADDR 0x0000000a
#define CRYPT_STRING_HEXASCIIADDR 0x0000000b #define CRYPT_STRING_HEXASCIIADDR 0x0000000b
#define CRYPT_STRING_HEXRAW 0x0000000c
#define CRYPT_STRING_NOCRLF 0x40000000
#define CRYPT_STRING_NOCR 0x80000000 #define CRYPT_STRING_NOCR 0x80000000
// certenrolld_end
// CryptBinaryToString uses the following flags // CryptBinaryToString uses the following flags
// CRYPT_STRING_BASE64HEADER - base64 format with certificate begin // CRYPT_STRING_BASE64HEADER - base64 format with certificate begin
// and end headers // and end headers
// CRYPT_STRING_BASE64 - only base64 without headers // CRYPT_STRING_BASE64 - only base64 without headers
// CRYPT_STRING_BINARY - pure binary copy // CRYPT_STRING_BINARY - pure binary copy
// CRYPT_STRING_BASE64REQUESTHEADER - base64 format with request begin // CRYPT_STRING_BASE64REQUESTHEADER - base64 format with request begin
// and end headers // and end headers
// CRYPT_STRING_BASE64X509CRLHEADER - base64 format with x509 crl begin // CRYPT_STRING_BASE64X509CRLHEADER - base64 format with x509 crl begin
// and end headers // and end headers
skipping to change at line 15759 skipping to change at line 18445
// CRYPT_STRING_ANY tries the following, in order: // CRYPT_STRING_ANY tries the following, in order:
// CRYPT_STRING_BASE64_ANY // CRYPT_STRING_BASE64_ANY
// CRYPT_STRING_BINARY -- should always succeed // CRYPT_STRING_BINARY -- should always succeed
// CRYPT_STRING_HEX_ANY tries the following, in order: // CRYPT_STRING_HEX_ANY tries the following, in order:
// CRYPT_STRING_HEXADDR // CRYPT_STRING_HEXADDR
// CRYPT_STRING_HEXASCIIADDR // CRYPT_STRING_HEXASCIIADDR
// CRYPT_STRING_HEXASCII // CRYPT_STRING_HEXASCII
// CRYPT_STRING_HEX // CRYPT_STRING_HEX
//+========================================================================= //+=========================================================================
// PFX (PKCS #12) function defintions and types // PFX (PKCS #12) function definitions and types
//========================================================================== //==========================================================================
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// PKCS#12 OIDs
//--------------------------------------------------------------------------
#define szOID_PKCS_12_PbeIds "1.2.840.113549.1.12.1"
#define szOID_PKCS_12_pbeWithSHA1And128BitRC4 "1.2.840.113549.1.12.1.1"
#define szOID_PKCS_12_pbeWithSHA1And40BitRC4 "1.2.840.113549.1.12.1.2"
#define szOID_PKCS_12_pbeWithSHA1And3KeyTripleDES "1.2.840.113549.1.12.1.3"
#define szOID_PKCS_12_pbeWithSHA1And2KeyTripleDES "1.2.840.113549.1.12.1.4"
#define szOID_PKCS_12_pbeWithSHA1And128BitRC2 "1.2.840.113549.1.12.1.5"
#define szOID_PKCS_12_pbeWithSHA1And40BitRC2 "1.2.840.113549.1.12.1.6"
//+-------------------------------------------------------------------------
// PBE parameters as defined in PKCS#12 as pkcs-12PbeParams.
//
// NOTE that the salt bytes will immediately follow this structure.
// we avoid using pointers in this structure for easy of passing
// it into NCryptExportKey() as a NCryptBuffer (may be sent via RPC
// to the key isolation process).
//--------------------------------------------------------------------------
typedef struct _CRYPT_PKCS12_PBE_PARAMS
{
int iIterations; /* iteration count */
ULONG cbSalt; /* byte size of the salt */
}
CRYPT_PKCS12_PBE_PARAMS;
//+-------------------------------------------------------------------------
// PFXImportCertStore // PFXImportCertStore
// //
// Import the PFX blob and return a store containing certificates // Import the PFX blob and return a store containing certificates
// //
// If the password parameter is incorrect or any other problems decoding // If the password parameter is incorrect or any other problems decoding
// the PFX blob are encountered, the function will return NULL and the // the PFX blob are encountered, the function will return NULL and the
// error code can be found from GetLastError(). // error code can be found from GetLastError().
// //
// The dwFlags parameter may be set to the following: // The dwFlags parameter may be set to the following:
// CRYPT_EXPORTABLE - specify that any imported keys should be marked as // CRYPT_EXPORTABLE - specify that any imported keys should be marked as
// exportable (see documentation on CryptImportKey) // exportable (see documentation on CryptImportKey)
// CRYPT_USER_PROTECTED - (see documentation on CryptImportKey) // CRYPT_USER_PROTECTED - (see documentation on CryptImportKey)
// CRYPT_MACHINE_KEYSET - used to force the private key to be stored in the // CRYPT_MACHINE_KEYSET - used to force the private key to be stored in the
// the local machine and not the current user. // the local machine and not the current user.
// CRYPT_USER_KEYSET - used to force the private key to be stored in the // CRYPT_USER_KEYSET - used to force the private key to be stored in the
// the current user and not the local machine, even if // the current user and not the local machine, even if
// the pfx blob specifies that it should go into local // the pfx blob specifies that it should go into local
// machine. // machine.
// PKCS12_INCLUDE_EXTENDED_PROPERTIES - used to import all extended
// properties that were saved with CertExportCertStore()
// using the same flag.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
HCERTSTORE HCERTSTORE
WINAPI WINAPI
PFXImportCertStore( PFXImportCertStore(
IN CRYPT_DATA_BLOB* pPFX, __in CRYPT_DATA_BLOB* pPFX,
IN LPCWSTR szPassword, __in LPCWSTR szPassword,
IN DWORD dwFlags); __in DWORD dwFlags);
// dwFlags definitions for PFXImportCertStore // dwFlags definitions for PFXImportCertStore
//#define CRYPT_EXPORTABLE 0x00000001 // CryptImportKey dwFlags //#define CRYPT_EXPORTABLE 0x00000001 // CryptImportKey dwFlags
//#define CRYPT_USER_PROTECTED 0x00000002 // CryptImportKey dwFlags //#define CRYPT_USER_PROTECTED 0x00000002 // CryptImportKey dwFlags
//#define CRYPT_MACHINE_KEYSET 0x00000020 // CryptAcquireContext dwFlags //#define CRYPT_MACHINE_KEYSET 0x00000020 // CryptAcquireContext dwFlags
//#define PKCS12_INCLUDE_EXTENDED_PROPERTIES 0x10
#define CRYPT_USER_KEYSET 0x00001000 #define CRYPT_USER_KEYSET 0x00001000
#define PKCS12_PREFER_CNG_KSP 0x00000100 // prefer using CNG KSP
#define PKCS12_IMPORT_RESERVED_MASK 0xffff0000 #define PKCS12_ALWAYS_CNG_KSP 0x00000200 // always use CNG KSP
#define PKCS12_ALLOW_OVERWRITE_KEY 0x00004000 // allow overwrite existing key
#define PKCS12_NO_PERSIST_KEY 0x00008000 // key will not be persisted
#define PKCS12_IMPORT_RESERVED_MASK 0xffff0000
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// PFXIsPFXBlob // PFXIsPFXBlob
// //
// This function will try to decode the outer layer of the blob as a pfx // This function will try to decode the outer layer of the blob as a pfx
// blob, and if that works it will return TRUE, it will return FALSE otherwise // blob, and if that works it will return TRUE, it will return FALSE otherwise
// //
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
PFXIsPFXBlob( PFXIsPFXBlob(
IN CRYPT_DATA_BLOB* pPFX); __in CRYPT_DATA_BLOB* pPFX);
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// PFXVerifyPassword // PFXVerifyPassword
// //
// This function will attempt to decode the outer layer of the blob as a pfx // This function will attempt to decode the outer layer of the blob as a pfx
// blob and decrypt with the given password. No data from the blob will be // blob and decrypt with the given password. No data from the blob will be
// imported. // imported.
// //
// Return value is TRUE if password appears correct, FALSE otherwise. // Return value is TRUE if password appears correct, FALSE otherwise.
// //
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
PFXVerifyPassword( PFXVerifyPassword(
IN CRYPT_DATA_BLOB* pPFX, __in CRYPT_DATA_BLOB* pPFX,
IN LPCWSTR szPassword, __in LPCWSTR szPassword,
IN DWORD dwFlags); __in DWORD dwFlags);
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// PFXExportCertStoreEx // PFXExportCertStoreEx
// //
// Export the certificates and private keys referenced in the passed-in store // Export the certificates and private keys referenced in the passed-in store
// //
// This API encodes the blob under a stronger algorithm. The resulting // This API encodes the blob under a stronger algorithm. The resulting
// PKCS12 blobs are incompatible with the earlier PFXExportCertStore API. // PKCS12 blobs are incompatible with the earlier PFXExportCertStore API.
// //
// The value passed in the password parameter will be used to encrypt and // The value passed in the password parameter will be used to encrypt and
// verify the integrity of the PFX packet. If any problems encoding the store // verify the integrity of the PFX packet. If any problems encoding the store
// are encountered, the function will return FALSE and the error code can // are encountered, the function will return FALSE and the error code can
// be found from GetLastError(). // be found from GetLastError().
// //
// The dwFlags parameter may be set to any combination of // The dwFlags parameter may be set to any combination of
// EXPORT_PRIVATE_KEYS // EXPORT_PRIVATE_KEYS
// REPORT_NO_PRIVATE_KEY // REPORT_NO_PRIVATE_KEY
// REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY // REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY
// PKCS12_INCLUDE_EXTENDED_PROPERTIES
// //
// The encoded PFX blob is returned in *pPFX. If pPFX->pbData is NULL upon // The encoded PFX blob is returned in *pPFX. If pPFX->pbData is NULL upon
// input, this is a length only calculation, whereby, pPFX->cbData is updated // input, this is a length only calculation, whereby, pPFX->cbData is updated
// with the number of bytes required for the encoded blob. Otherwise, // with the number of bytes required for the encoded blob. Otherwise,
// the memory pointed to by pPFX->pbData is updated with the encoded bytes // the memory pointed to by pPFX->pbData is updated with the encoded bytes
// and pPFX->cbData is updated with the encoded byte length. // and pPFX->cbData is updated with the encoded byte length.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
PFXExportCertStoreEx( PFXExportCertStoreEx(
IN HCERTSTORE hStore, __in HCERTSTORE hStore,
IN OUT CRYPT_DATA_BLOB* pPFX, __inout CRYPT_DATA_BLOB* pPFX,
IN LPCWSTR szPassword, __in LPCWSTR szPassword,
IN void* pvReserved, __reserved void* pvReserved,
IN DWORD dwFlags); __in DWORD dwFlags);
// dwFlags definitions for PFXExportCertStoreEx // dwFlags definitions for PFXExportCertStoreEx
#define REPORT_NO_PRIVATE_KEY 0x0001 #define REPORT_NO_PRIVATE_KEY 0x0001
#define REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY 0x0002 #define REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY 0x0002
#define EXPORT_PRIVATE_KEYS 0x0004 #define EXPORT_PRIVATE_KEYS 0x0004
#define PKCS12_INCLUDE_EXTENDED_PROPERTIES 0x0010
#define PKCS12_EXPORT_RESERVED_MASK 0xffff0000 #define PKCS12_EXPORT_RESERVED_MASK 0xffff0000
//+------------------------------------------------------------------------- //+-------------------------------------------------------------------------
// PFXExportCertStore // PFXExportCertStore
// //
// Export the certificates and private keys referenced in the passed-in store // Export the certificates and private keys referenced in the passed-in store
// //
// This is an old API kept for compatibility with IE4 clients. New applications // This is an old API kept for compatibility with IE4 clients. New applications
// should call the above PfxExportCertStoreEx for enhanced security. // should call the above PfxExportCertStoreEx for enhanced security.
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
WINCRYPT32API WINCRYPT32API
BOOL BOOL
WINAPI WINAPI
PFXExportCertStore( PFXExportCertStore(
IN HCERTSTORE hStore, __in HCERTSTORE hStore,
IN OUT CRYPT_DATA_BLOB* pPFX, __inout CRYPT_DATA_BLOB* pPFX,
IN LPCWSTR szPassword, __in LPCWSTR szPassword,
IN DWORD dwFlags); __in DWORD dwFlags);
//+=========================================================================
// APIs to get a non-blocking, time valid OCSP response for
// a server certificate chain.
//
// Normally, this OCSP response will be included along with the server
// certificate in a message returned to the client. As a result only the
// server should need to contact the OCSP responser for its certificate.
//==========================================================================
//+-------------------------------------------------------------------------
// Server OCSP response handle.
//--------------------------------------------------------------------------
typedef VOID *HCERT_SERVER_OCSP_RESPONSE;
//+-------------------------------------------------------------------------
// Open a handle to an OCSP response associated with a server certificate
// chain. If the end certificate doesn't have an OCSP AIA URL, NULL is
// returned with LastError set to CRYPT_E_NOT_IN_REVOCATION_DATABASE. NULL
// will also be returned if unable to allocate memory or create system
// objects.
//
// This API will try to retrieve an initial OCSP response before returning.
// This API will block during the retrieval. If unable to successfully
// retrieve the first OCSP response, a non-NULL handle will still be returned
// if not one of the error cases mentioned above.
//
// A background thread is created that will pre-fetch time valid
// OCSP responses.
//
// The input chain context will be AddRef'ed and not freed until
// the returned handle is closed.
//
// CertCloseServerOcspResponse() must be called to close the returned
// handle.
//
// dwFlags and pvReserved aren't currently used and must be set to 0
// and NULL.
//--------------------------------------------------------------------------
WINCRYPT32API
HCERT_SERVER_OCSP_RESPONSE
WINAPI
CertOpenServerOcspResponse(
__in PCCERT_CHAIN_CONTEXT pChainContext,
__in DWORD dwFlags,
__reserved LPVOID pvReserved
);
//+-------------------------------------------------------------------------
// AddRef a HCERT_SERVER_OCSP_RESPONSE returned by
// CertOpenServerOcspResponse(). Each Open and AddRef requires a
// corresponding CertCloseServerOcspResponse().
//--------------------------------------------------------------------------
WINCRYPT32API
VOID
WINAPI
CertAddRefServerOcspResponse(
__in_opt HCERT_SERVER_OCSP_RESPONSE hServerOcspResponse
);
//+-------------------------------------------------------------------------
// Close the handle returned by CertOpenServerOcspResponse() or AddRef'ed
// by CertAddRefServerOcspResponse().
//
// dwFlags isn't currently used and must be set to 0.
//--------------------------------------------------------------------------
WINCRYPT32API
VOID
WINAPI
CertCloseServerOcspResponse(
__in_opt HCERT_SERVER_OCSP_RESPONSE hServerOcspResponse,
__in DWORD dwFlags
);
//+-------------------------------------------------------------------------
// Server OCSP response context.
//--------------------------------------------------------------------------
typedef struct _CERT_SERVER_OCSP_RESPONSE_CONTEXT
CERT_SERVER_OCSP_RESPONSE_CONTEXT,
*PCERT_SERVER_OCSP_RESPONSE_CONTEXT;
typedef const CERT_SERVER_OCSP_RESPONSE_CONTEXT
*PCCERT_SERVER_OCSP_RESPONSE_CONTEXT;
struct _CERT_SERVER_OCSP_RESPONSE_CONTEXT {
DWORD cbSize;
BYTE *pbEncodedOcspResponse;
DWORD cbEncodedOcspResponse;
};
//+-------------------------------------------------------------------------
// Get a time valid OCSP response context for the handle created for
// the server certificate chain.
//
// This API won't block to retrieve the OCSP response. It will return
// the current pre-fetched OCSP response. If a time valid OCSP response
// isn't available, NULL will be returned with LAST_ERROR set to
// CRYPT_E_REVOCATION_OFFLINE.
//
// CertFreeServerOcspResponseContext() must be called to free the
// returned OCSP response context.
//--------------------------------------------------------------------------
WINCRYPT32API
PCCERT_SERVER_OCSP_RESPONSE_CONTEXT
WINAPI
CertGetServerOcspResponseContext(
__in HCERT_SERVER_OCSP_RESPONSE hServerOcspResponse,
__in DWORD dwFlags,
__reserved LPVOID pvReserved
);
//+-------------------------------------------------------------------------
// AddRef a PCCERT_SERVER_OCSP_RESPONSE_CONTEXT returned by
// CertGetServerOcspResponseContext(). Each Get and AddRef requires a
// corresponding CertFreeServerOcspResponseContext().
//--------------------------------------------------------------------------
WINCRYPT32API
VOID
WINAPI
CertAddRefServerOcspResponseContext(
__in_opt PCCERT_SERVER_OCSP_RESPONSE_CONTEXT pServerOcspResponseContext
);
//+-------------------------------------------------------------------------
// Free the OCSP response context returned by
// CertGetServerOcspResponseContext().
//--------------------------------------------------------------------------
WINCRYPT32API
VOID
WINAPI
CertFreeServerOcspResponseContext(
__in_opt PCCERT_SERVER_OCSP_RESPONSE_CONTEXT pServerOcspResponseContext
);
//+-------------------------------------------------------------------------
// Helper function to do URL retrieval of logo or biometric information
// specified in either the szOID_LOGOTYPE_EXT or szOID_BIOMETRIC_EXT
// certificate extension.
//
// Only the first hashed URL matching lpszLogoOrBiometricType is used
// to do the URL retrieval. Only direct logotypes are supported.
// The bytes at the first URL are retrieved via
// CryptRetrieveObjectByUrlW and hashed. The computed hash is compared
// against the hash in the certificate. For success, ppbData, pcbData
// and optionally ppwszMimeType are updated with
// CryptMemAlloc'ed memory which must be freed by calling CryptMemFree().
// For failure, *ppbData, *pcbData and optionally *ppwszMimeType are
// zero'ed.
//
// For failure, the following errors may be set in LastError:
// E_INVALIDARG - invalid lpszLogoOrBiometricType, not one of the
// acceptable predefined types.
// CRYPT_E_NOT_FOUND - certificate doesn't have the
// szOID_LOGOTYPE_EXT or szOID_BIOMETRIC_EXT extension or a matching
// lpszLogoOrBiometricType wasn't found with a non-empty
// hashed URL.
// ERROR_NOT_SUPPORTED - matched the unsupported indirect logotype
// NTE_BAD_ALGID - unknown hash algorithm OID
// ERROR_INVALID_DATA - no bytes were retrieved at the specified URL
// in the certificate extension
// CRYPT_E_HASH_VALUE - the computed hash doesn't match the hash
// in the certificate
// CertRetrieveLogoOrBiometricInfo calls the following functions which
// will set LastError for failure:
// CryptDecodeObjectEx(szOID_LOGOTYPE_EXT or szOID_BIOMETRIC_EXT)
// CryptRetrieveObjectByUrlW
// CryptHashCertificate
// CryptMemAlloc
//
// lpszLogoOrBiometricType is one of the predefined logotype or biometric
// types, an other logotype OID or a biometric OID.
//
// dwRetrievalFlags - see CryptRetrieveObjectByUrlW
// dwTimeout - see CryptRetrieveObjectByUrlW
//
// dwFlags - reserved, must be set to 0
// pvReserved - reserved, must be set to NULL
//
// *ppwszMimeType is always NULL for the biometric types. For success,
// the caller must always check if non-NULL before dereferencing.
//--------------------------------------------------------------------------
WINCRYPT32API
__success(return == TRUE)
BOOL
WINAPI
CertRetrieveLogoOrBiometricInfo(
__in PCCERT_CONTEXT pCertContext,
__in LPCSTR lpszLogoOrBiometricType,
__in DWORD dwRetrievalFlags,
__in DWORD dwTimeout, // milliseconds
__in DWORD dwFlags,
__reserved void *pvReserved,
__deref_out_bcount_opt(*pcbData) BYTE **ppbData, // CryptMemFree()
__out DWORD *pcbData,
__deref_opt_out_opt LPWSTR *ppwszMimeType // CryptMemFree()
);
// Predefined Logotypes
#define CERT_RETRIEVE_ISSUER_LOGO ((LPCSTR) 1)
#define CERT_RETRIEVE_SUBJECT_LOGO ((LPCSTR) 2)
#define CERT_RETRIEVE_COMMUNITY_LOGO ((LPCSTR) 3)
// Predefined Biometric types
#define CERT_RETRIEVE_BIOMETRIC_PREDEFINED_BASE_TYPE ((LPCSTR) 1000)
#define CERT_RETRIEVE_BIOMETRIC_PICTURE_TYPE \
(CERT_RETRIEVE_BIOMETRIC_PREDEFINED_BASE_TYPE + CERT_BIOMETRIC_PICTURE_TYPE)
#define CERT_RETRIEVE_BIOMETRIC_SIGNATURE_TYPE \
(CERT_RETRIEVE_BIOMETRIC_PREDEFINED_BASE_TYPE + CERT_BIOMETRIC_SIGNATURE_TYP
E)
#endif //!defined(_DDK_DRIVER_)
#ifdef __cplusplus #ifdef __cplusplus
} // Balance extern "C" above } // Balance extern "C" above
#endif #endif
#if defined (_MSC_VER) #if defined (_MSC_VER)
#if ( _MSC_VER >= 800 ) #if ( _MSC_VER >= 800 )
#if _MSC_VER >= 1200 #if _MSC_VER >= 1200
#pragma warning(pop) #pragma warning(pop)
 End of changes. 685 change blocks. 
1435 lines changed or deleted 4403 lines changed or added


 wintrust.h (5.131.3790.3959-Windows 5.0)   wintrust.h (6.0.6001.18000-Windows 6.0) 
skipping to change at line 18 skipping to change at line 18
// //
// Contents: Microsoft Internet Security Trust Provider Model // Contents: Microsoft Internet Security Trust Provider Model
// //
// History: 31-May-1997 pberkman created // History: 31-May-1997 pberkman created
// //
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#ifndef WINTRUST_H #ifndef WINTRUST_H
#define WINTRUST_H #define WINTRUST_H
#if _MSC_VER > 1000
#pragma once
#endif
#include <wincrypt.h> #include <wincrypt.h>
#if defined(_MSC_VER) && (_MSC_VER >= 800)
#if _MSC_VER > 1000
#pragma once
#endif
#if _MSC_VER >= 1200
#pragma warning(push)
#endif
#pragma warning(disable:4201) // nonstandard extension used : nameless struc
t/union
#endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
{ {
#endif #endif
#ifndef WIN_CERT_REVISION_1_0 // there were duplicate definitions in winbase.h #ifndef WIN_CERT_REVISION_1_0 // there were duplicate definitions in winbase.h
# define WT_DEFINE_ALL_APIS # define WT_DEFINE_ALL_APIS
#else #else
# undef WT_DEFINE_ALL_APIS # undef WT_DEFINE_ALL_APIS
#endif #endif
#include <pshpack8.h>
//////////////////////////////////////////////////////////////////////////////
//
// Wintrust Registry Configuration Definitions.
//
//////////////////////////////////////////////////////////////////////////////
#define WINTRUST_CONFIG_REGPATH L"Software\\Microsoft\\Cryptography\\Wintrust\\C
onfig"
// The following are REG_DWORD's. These configuration parameters are used
// to limit the number of file bytes mapped at a time. Should be a multiple of
// dwAllocationGranularity returned by GetSystemInfo(). This allows
// very large files, > 2Gig bytes, to be authenticated signed and verified
// using a much smaller virtual memory address range.
// The length of the header bytes for a PE, CAB or any file that is
// authenticode signed must be less than the following value.
#define WINTRUST_MAX_HEADER_BYTES_TO_MAP_VALUE_NAME L"MaxHeaderBytesToMap"
// 0x00A0'0000 (10,485,760) Bytes
#define WINTRUST_MAX_HEADER_BYTES_TO_MAP_DEFAULT 0x00A00000
// If the file size doesn't fit within the above header length, the following
// value is used to set the maximum number of remaining file bytes that are
// mapped/hashed/unmapped at time.
#define WINTRUST_MAX_HASH_BYTES_TO_MAP_VALUE_NAME L"MaxHashBytesToMap"
// 0x0010'0000 (1,048,576) Bytes
#define WINTRUST_MAX_HASH_BYTES_TO_MAP_DEFAULT 0x00100000
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// //
// Client definitions, typedefs, and prototypes // Client definitions, typedefs, and prototypes
// //
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
#include <pshpack8.h>
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// //
// WINTRUST_DATA Structure // WINTRUST_DATA Structure
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// Used when calling WinVerifyTrust to pass necessary information into // Used when calling WinVerifyTrust to pass necessary information into
// the Providers. // the Providers.
// //
typedef struct _WINTRUST_DATA typedef struct _WINTRUST_DATA
{ {
DWORD cbStruct; // = sizeof(WINTRUST_DATA) DWORD cbStruct; // = sizeof(WINTRUST_DATA)
skipping to change at line 111 skipping to change at line 144
# define WTD_REVOCATION_CHECK_NONE 0x00000010 # define WTD_REVOCATION_CHECK_NONE 0x00000010
# define WTD_REVOCATION_CHECK_END_CERT 0x00000020 # define WTD_REVOCATION_CHECK_END_CERT 0x00000020
# define WTD_REVOCATION_CHECK_CHAIN 0x00000040 # define WTD_REVOCATION_CHECK_CHAIN 0x00000040
# define WTD_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT 0x00000080 # define WTD_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT 0x00000080
# define WTD_SAFER_FLAG 0x00000100 # define WTD_SAFER_FLAG 0x00000100
# define WTD_HASH_ONLY_FLAG 0x00000200 # define WTD_HASH_ONLY_FLAG 0x00000200
# define WTD_USE_DEFAULT_OSVER_CHECK 0x00000400 # define WTD_USE_DEFAULT_OSVER_CHECK 0x00000400
# define WTD_LIFETIME_SIGNING_FLAG 0x00000800 # define WTD_LIFETIME_SIGNING_FLAG 0x00000800
# define WTD_CACHE_ONLY_URL_RETRIEVAL 0x00001000 // affects CR L retrieval and AIA retrieval # define WTD_CACHE_ONLY_URL_RETRIEVAL 0x00001000 // affects CR L retrieval and AIA retrieval
// 07-Jan-2004 tonyschr: added // 17-Dec-2004 JSchwart: re-added to fix build break in other depots
DWORD dwUIContext; // optional: used to determine a DWORD dwUIContext;
ction text in UI
# define WTD_UICONTEXT_EXECUTE 0 # define WTD_UICONTEXT_EXECUTE 0
# define WTD_UICONTEXT_INSTALL 1 # define WTD_UICONTEXT_INSTALL 1
} WINTRUST_DATA, *PWINTRUST_DATA; } WINTRUST_DATA, *PWINTRUST_DATA;
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// //
// WINTRUST_FILE_INFO Structure // WINTRUST_FILE_INFO Structure
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// Used when calling WinVerifyTrust against an individual file. // Used when calling WinVerifyTrust against an individual file.
// //
typedef struct WINTRUST_FILE_INFO_ typedef struct WINTRUST_FILE_INFO_
{ {
skipping to change at line 149 skipping to change at line 183
// Used when calling WinVerifyTrust against a member of a Microsoft Catalog // Used when calling WinVerifyTrust against a member of a Microsoft Catalog
// file. // file.
// //
typedef struct WINTRUST_CATALOG_INFO_ typedef struct WINTRUST_CATALOG_INFO_
{ {
DWORD cbStruct; // = sizeof(WINTRUST_CATALOG_INFO) DWORD cbStruct; // = sizeof(WINTRUST_CATALOG_INFO)
DWORD dwCatalogVersion; // optional: Catalog version number DWORD dwCatalogVersion; // optional: Catalog version number
LPCWSTR pcwszCatalogFilePath; // required: path/name to Catalog fi le LPCWSTR pcwszCatalogFilePath; // required: path/name to Catalog fi le
LPCWSTR pcwszMemberTag; // required: tag to member in Catalo g LPCWSTR pcwszMemberTag; // optional: tag to member in Catalo g
LPCWSTR pcwszMemberFilePath; // required: path/name to member fil e LPCWSTR pcwszMemberFilePath; // required: path/name to member fil e
HANDLE hMemberFile; // optional: open handle to pcwszMem berFilePath HANDLE hMemberFile; // optional: open handle to pcwszMem berFilePath
// 30-Oct-1997 pberkman: added // 30-Oct-1997 pberkman: added
BYTE *pbCalculatedFileHash; // optional: pass in the calculated hash __field_ecount(cbCalculatedFileHash) BYTE *pbCalculatedFileHash; // optional: pass in the calculated hash
DWORD cbCalculatedFileHash; // optional: pass in the count bytes of the calc hash DWORD cbCalculatedFileHash; // optional: pass in the count bytes of the calc hash
// 15-Jan-1998 pberkman: added // 15-Jan-1998 pberkman: added
PCCTL_CONTEXT pcCatalogContext; // optional: pass in to use instead of CatalogFilePath. PCCTL_CONTEXT pcCatalogContext; // optional: pass in to use instead of CatalogFilePath.
} WINTRUST_CATALOG_INFO, *PWINTRUST_CATALOG_INFO; } WINTRUST_CATALOG_INFO, *PWINTRUST_CATALOG_INFO;
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// //
// WINTRUST_BLOB_INFO Structure // WINTRUST_BLOB_INFO Structure
skipping to change at line 224 skipping to change at line 258
CERT_CONTEXT *psCertContext; CERT_CONTEXT *psCertContext;
DWORD chStores; // number of stores in pahStores DWORD chStores; // number of stores in pahStores
HCERTSTORE *pahStores; // array of stores to add to interna l list HCERTSTORE *pahStores; // array of stores to add to interna l list
// 17-Nov-1997 pberkman: added // 17-Nov-1997 pberkman: added
DWORD dwFlags; DWORD dwFlags;
# define WTCI_DONT_OPEN_STORES 0x00000001 // only open dummy "root" all other are in pahStores. # define WTCI_DONT_OPEN_STORES 0x00000001 // only open dummy "root" all other are in pahStores.
# define WTCI_OPEN_ONLY_ROOT 0x00000002 # define WTCI_OPEN_ONLY_ROOT 0x00000002
// 9-Sep-2004 dsie: added
#if _WIN32_WINNT >= 0x0600
# define WTCI_USE_LOCAL_MACHINE 0x00000004 // Local
machine context
#endif
// 26-Nov-1997 pberkman: added // 26-Nov-1997 pberkman: added
FILETIME *psftVerifyAsOf; // if not null, each cert will be va lidated as of this time. FILETIME *psftVerifyAsOf; // if not null, each cert will be va lidated as of this time.
} WINTRUST_CERT_INFO, *PWINTRUST_CERT_INFO; } WINTRUST_CERT_INFO, *PWINTRUST_CERT_INFO;
#include <poppack.h> #include <poppack.h>
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// //
skipping to change at line 451 skipping to change at line 489
#define TRUSTERROR_MAX_STEPS 38 #define TRUSTERROR_MAX_STEPS 38
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// //
// allocation and free function prototypes // allocation and free function prototypes
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// //
typedef void *(*PFN_CPD_MEM_ALLOC)(IN DWORD cbSize); typedef void *(*PFN_CPD_MEM_ALLOC)(IN DWORD cbSize);
typedef void (*PFN_CPD_MEM_FREE)(IN void *pvMem2Free); typedef void (*PFN_CPD_MEM_FREE)(IN void *pvMem2Free);
struct _CRYPT_PROVIDER_DATA;
struct _CRYPT_PROVIDER_SGNR;
struct _CRYPT_PROVIDER_PRIVDATA;
typedef BOOL (*PFN_CPD_ADD_STORE)(IN struct _CRYPT_PROVIDER_DATA *pProvDa ta, typedef BOOL (*PFN_CPD_ADD_STORE)(IN struct _CRYPT_PROVIDER_DATA *pProvDa ta,
IN HCERTSTORE hStore2Add); IN HCERTSTORE hStore2Add);
typedef BOOL (*PFN_CPD_ADD_SGNR)(IN struct _CRYPT_PROVIDER_DATA *pProvData, typedef BOOL (*PFN_CPD_ADD_SGNR)(IN struct _CRYPT_PROVIDER_DATA *pProvData,
IN BOOL fCounterSigner, IN BOOL fCounterSigner,
IN OPTIONAL DWORD idxSigner, IN OPTIONAL DWORD idxSigner,
IN struct _CRYPT_PROVIDER_SGNR *pSgnr2Add); IN struct _CRYPT_PROVIDER_SGNR *pSgnr2Add);
typedef BOOL (*PFN_CPD_ADD_CERT)(IN struct _CRYPT_PROVIDER_DATA *pProvData, typedef BOOL (*PFN_CPD_ADD_CERT)(IN struct _CRYPT_PROVIDER_DATA *pProvData,
IN DWORD idxSigner, IN DWORD idxSigner,
skipping to change at line 523 skipping to change at line 565
// self-signed, root. it is also the CertCheck's responsibility to set the // self-signed, root. it is also the CertCheck's responsibility to set the
// fTrustedRoot flag in the certificate structure. // fTrustedRoot flag in the certificate structure.
// //
typedef BOOL (*PFN_PROVIDER_CERTCHKPOLICY_CALL)( IN struct _CRYP T_PROVIDER_DATA *pProvData, typedef BOOL (*PFN_PROVIDER_CERTCHKPOLICY_CALL)( IN struct _CRYP T_PROVIDER_DATA *pProvData,
IN DWORD idxSig ner, IN DWORD idxSig ner,
IN BOOL fCounte rSignerChain, IN BOOL fCounte rSignerChain,
IN OPTIONAL DWORD idxCou nterSigner); IN OPTIONAL DWORD idxCou nterSigner);
#define WVT_OFFSETOF(t,f) ((ULONG)((ULONG_PTR)(&((t*)0)->f))) #define WVT_OFFSETOF(t,f) ((ULONG)((ULONG_PTR)(&((t*)0)->f)))
// WOB #1251526 -- macro must check whether _all_ bytes of the member
// lie within the struct size specified
#define WVT_ISINSTRUCT(structtypedef, structpassedsize, member) \ #define WVT_ISINSTRUCT(structtypedef, structpassedsize, member) \
((WVT_OFFSETOF(structtypedef, member) < structpassedsize) ? TRUE : FALSE) ((WVT_OFFSETOF(structtypedef, member) + sizeof(((structtypedef *) 0)->mem ber) <= structpassedsize) ? TRUE : FALSE)
#define WVT_IS_CBSTRUCT_GT_MEMBEROFFSET(structtypedef, structpassedsize, member) \ #define WVT_IS_CBSTRUCT_GT_MEMBEROFFSET(structtypedef, structpassedsize, member) \
WVT_ISINSTRUCT(structtypedef, structpassedsize, member) WVT_ISINSTRUCT(structtypedef, structpassedsize, member)
#include <pshpack8.h> #include <pshpack8.h>
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// //
// CRYPT_PROVIDER_DATA Structure // CRYPT_PROVIDER_DATA Structure
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
skipping to change at line 611 skipping to change at line 655
// 24-Feb-1998 philh: added // 24-Feb-1998 philh: added
DWORD dwFinalError; DWORD dwFinalError;
// 20-May-1998 KeithV: added // 20-May-1998 KeithV: added
PCERT_USAGE_MATCH pRequestUsage; PCERT_USAGE_MATCH pRequestUsage;
// 02-Aug-2000 philh: added // 02-Aug-2000 philh: added
DWORD dwTrustPubSettings; DWORD dwTrustPubSettings;
// 02-Sep-2003 tonyschr: added // 17-Dec-2004 JSchwart: re-added to fix build break in other depots
DWORD dwUIStateFlags; DWORD dwUIStateFlags;
# define CPD_UISTATE_MODE_PROMPT 0x00000000 # define CPD_UISTATE_MODE_PROMPT 0x00000000
# define CPD_UISTATE_MODE_BLOCK 0x00000001 # define CPD_UISTATE_MODE_BLOCK 0x00000001
# define CPD_UISTATE_MODE_ALLOW 0x00000002 # define CPD_UISTATE_MODE_ALLOW 0x00000002
# define CPD_UISTATE_MODE_MASK 0x00000003 # define CPD_UISTATE_MODE_MASK 0x00000003
} CRYPT_PROVIDER_DATA, *PCRYPT_PROVIDER_DATA; } CRYPT_PROVIDER_DATA, *PCRYPT_PROVIDER_DATA;
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// //
// CRYPT_PROVIDER_FUNCTIONS structure // CRYPT_PROVIDER_FUNCTIONS structure
skipping to change at line 867 skipping to change at line 911
CRYPT_TRUST_REG_ENTRY sCertificateProvider; CRYPT_TRUST_REG_ENTRY sCertificateProvider;
CRYPT_TRUST_REG_ENTRY sCertificatePolicyProvider; CRYPT_TRUST_REG_ENTRY sCertificatePolicyProvider;
CRYPT_TRUST_REG_ENTRY sFinalPolicyProvider; CRYPT_TRUST_REG_ENTRY sFinalPolicyProvider;
CRYPT_TRUST_REG_ENTRY sTestPolicyProvider; CRYPT_TRUST_REG_ENTRY sTestPolicyProvider;
// 23-Jul-1997 pberkman: added // 23-Jul-1997 pberkman: added
CRYPT_TRUST_REG_ENTRY sCleanupProvider; CRYPT_TRUST_REG_ENTRY sCleanupProvider;
} CRYPT_REGISTER_ACTIONID, *PCRYPT_REGISTER_ACTIONID; } CRYPT_REGISTER_ACTIONID, *PCRYPT_REGISTER_ACTIONID;
struct _CRYPT_PROVIDER_DEFUSAGE;
typedef BOOL (*PFN_ALLOCANDFILLDEFUSAGE)(IN const char *pszUsageOID, typedef BOOL (*PFN_ALLOCANDFILLDEFUSAGE)(IN const char *pszUsageOID,
IN struct _CRYPT_PROVIDER_DEFUSAGE *psD efUsage); IN struct _CRYPT_PROVIDER_DEFUSAGE *psD efUsage);
typedef BOOL (*PFN_FREEDEFUSAGE)(IN const char *pszUsageOID, typedef BOOL (*PFN_FREEDEFUSAGE)(IN const char *pszUsageOID,
IN struct _CRYPT_PROVIDER_DEFUSAGE *psDefUsage) ; IN struct _CRYPT_PROVIDER_DEFUSAGE *psDefUsage) ;
typedef struct _CRYPT_PROVIDER_REGDEFUSAGE typedef struct _CRYPT_PROVIDER_REGDEFUSAGE
{ {
DWORD cbStruct; // = sizeof CRYPT_PROVIDER_REGDEFUSAGE DWORD cbStruct; // = sizeof CRYPT_PROVIDER_REGDEFUSAGE
GUID *pgActionID; GUID *pgActionID;
skipping to change at line 1041 skipping to change at line 1087
#define SPC_JAVA_CLASS_DATA_OBJID "1.3.6.1.4.1.311.2.1.20" #define SPC_JAVA_CLASS_DATA_OBJID "1.3.6.1.4.1.311.2.1.20"
#define SPC_INDIVIDUAL_SP_KEY_PURPOSE_OBJID "1.3.6.1.4.1.311.2.1.21" #define SPC_INDIVIDUAL_SP_KEY_PURPOSE_OBJID "1.3.6.1.4.1.311.2.1.21"
#define SPC_COMMERCIAL_SP_KEY_PURPOSE_OBJID "1.3.6.1.4.1.311.2.1.22" #define SPC_COMMERCIAL_SP_KEY_PURPOSE_OBJID "1.3.6.1.4.1.311.2.1.22"
#define SPC_CAB_DATA_OBJID "1.3.6.1.4.1.311.2.1.25" #define SPC_CAB_DATA_OBJID "1.3.6.1.4.1.311.2.1.25"
#define SPC_GLUE_RDN_OBJID "1.3.6.1.4.1.311.2.1.25" // obsol ete! #define SPC_GLUE_RDN_OBJID "1.3.6.1.4.1.311.2.1.25" // obsol ete!
#define SPC_MINIMAL_CRITERIA_OBJID "1.3.6.1.4.1.311.2.1.26" #define SPC_MINIMAL_CRITERIA_OBJID "1.3.6.1.4.1.311.2.1.26"
#define SPC_FINANCIAL_CRITERIA_OBJID "1.3.6.1.4.1.311.2.1.27" #define SPC_FINANCIAL_CRITERIA_OBJID "1.3.6.1.4.1.311.2.1.27"
#define SPC_LINK_OBJID "1.3.6.1.4.1.311.2.1.28" #define SPC_LINK_OBJID "1.3.6.1.4.1.311.2.1.28"
#define SPC_SIGINFO_OBJID "1.3.6.1.4.1.311.2.1.30" #define SPC_SIGINFO_OBJID "1.3.6.1.4.1.311.2.1.30"
//
// Page hash versions
//
#define SPC_PE_IMAGE_PAGE_HASHES_V1_OBJID "1.3.6.1.4.1.311.2.3.1" // V1
//
// Catalog entries
//
#define CAT_NAMEVALUE_OBJID "1.3.6.1.4.1.311.12.2.1" #define CAT_NAMEVALUE_OBJID "1.3.6.1.4.1.311.12.2.1"
#define CAT_MEMBERINFO_OBJID "1.3.6.1.4.1.311.12.2.2" #define CAT_MEMBERINFO_OBJID "1.3.6.1.4.1.311.12.2.2"
// //
// encode/decode internal defines // encode/decode internal defines
// //
#define SPC_SP_AGENCY_INFO_STRUCT ((LPCSTR) 2000) #define SPC_SP_AGENCY_INFO_STRUCT ((LPCSTR) 2000)
#define SPC_MINIMAL_CRITERIA_STRUCT ((LPCSTR) 2001) #define SPC_MINIMAL_CRITERIA_STRUCT ((LPCSTR) 2001)
#define SPC_FINANCIAL_CRITERIA_STRUCT ((LPCSTR) 2002) #define SPC_FINANCIAL_CRITERIA_STRUCT ((LPCSTR) 2002)
#define SPC_INDIRECT_DATA_CONTENT_STRUCT ((LPCSTR) 2003) #define SPC_INDIRECT_DATA_CONTENT_STRUCT ((LPCSTR) 2003)
skipping to change at line 1066 skipping to change at line 1120
#define SPC_JAVA_CLASS_DATA_STRUCT ((LPCSTR) 2009) #define SPC_JAVA_CLASS_DATA_STRUCT ((LPCSTR) 2009)
#define SPC_SIGINFO_STRUCT ((LPCSTR) 2130) #define SPC_SIGINFO_STRUCT ((LPCSTR) 2130)
#define CAT_NAMEVALUE_STRUCT ((LPCSTR) 2221) #define CAT_NAMEVALUE_STRUCT ((LPCSTR) 2221)
#define CAT_MEMBERINFO_STRUCT ((LPCSTR) 2222) #define CAT_MEMBERINFO_STRUCT ((LPCSTR) 2222)
#define SPC_UUID_LENGTH 16 #define SPC_UUID_LENGTH 16
typedef BYTE SPC_UUID[SPC_UUID_LENGTH]; typedef BYTE SPC_UUID[SPC_UUID_LENGTH];
#define SpcSerializedObjectAttributesClassId {0xA6, 0xB5, 0x86, 0xD5, \
0xB4, 0xA1, 0x24, 0x66, \
0xAE, 0x05, 0xA2, 0x17, \
0xDA, 0x8E, 0x60, 0xD6}
typedef struct _SPC_SERIALIZED_OBJECT typedef struct _SPC_SERIALIZED_OBJECT
{ {
SPC_UUID ClassId; SPC_UUID ClassId;
CRYPT_DATA_BLOB SerializedData; CRYPT_DATA_BLOB SerializedData;
} SPC_SERIALIZED_OBJECT, *PSPC_SERIALIZED_OBJECT; } SPC_SERIALIZED_OBJECT, *PSPC_SERIALIZED_OBJECT;
typedef struct SPC_SIGINFO_ typedef struct SPC_SIGINFO_
{ {
DWORD dwSipVersion; DWORD dwSipVersion;
skipping to change at line 1329 skipping to change at line 1388
typedef struct _WIN_SPUB_TRUSTED_PUBLISHER_DATA typedef struct _WIN_SPUB_TRUSTED_PUBLISHER_DATA
{ {
HANDLE hClientToken; HANDLE hClientToken;
LPWIN_CERTIFICATE lpCertificate; LPWIN_CERTIFICATE lpCertificate;
} WIN_SPUB_TRUSTED_PUBLISHER_DATA, *LPWIN_SPUB_TRUSTED_PUBLISHER_DATA; } WIN_SPUB_TRUSTED_PUBLISHER_DATA, *LPWIN_SPUB_TRUSTED_PUBLISHER_DATA;
#endif #endif
// Open the cert manager UI dialog's TrustedPublisher Tab.
//
// The following flags may be set:
// WT_TRUSTDBDIALOG_NO_UI_FLAG
// Set this flag in conjunction with
// WT_TRUSTDBDIALOG_WRITE_LEGACY_REG_FLAG and/or
// WT_TRUSTDBDIALOG_WRITE_IEAK_STORE_FLAG to do the registry and/or
// store write without any UI.
// WT_TRUSTDBDIALOG_ONLY_PUB_TAB_FLAG
// By default all of the UI tabs are displayed with TrustedPublisher
// as the initial tab. Setting this flag only displays the
// TrustedPublisher tab.
// WT_TRUSTDBDIALOG_WRITE_LEGACY_REG_FLAG
// Setting this flag causes the trusted publishers to be written to the
// following legacy registry location:
// "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\
// WinTrust\Trust Providers\Software Publishing\Trust Database\0"
// The registry value names are constructed as ascii generated
// representations of the md5 hash of the issuer name and the cert's serial
// number. The string value is the subject display name.
//
// Note, the above registry key is initially deleted to force the removal
// of any previous publisher values.
// WT_TRUSTDBDIALOG_WRITE_IEAK_STORE_FLAG
// Setting this flag causes all of the trusted publishers to be copied to
// the "TrustedPublisher_IEAK" system registry store at the following
// location:
// "HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates\
// TrustedPublisher_IEAK\Certificates\..."
// Note, the logical HKCU TrustedPublisher store inherits from HKLM and
// GroupPolicy. The TrustedPublisher_IEAK will contain the entire set
// under a single registry subkey.
//
// Note, initially all certs are removed from the above store.
//
extern BOOL WINAPI OpenPersonalTrustDBDialogEx(
IN OPTIONAL HWND hwndParent,
IN DWORD dwFlags,
IN OUT OPTIONAL PVOID *pvReserved
);
#define WT_TRUSTDBDIALOG_NO_UI_FLAG 0x00000001
#define WT_TRUSTDBDIALOG_ONLY_PUB_TAB_FLAG 0x00000002
#define WT_TRUSTDBDIALOG_WRITE_LEGACY_REG_FLAG 0x00000100
#define WT_TRUSTDBDIALOG_WRITE_IEAK_STORE_FLAG 0x00000200
// Calls above with dwFlags = 0 and pvReserved = NULL
extern BOOL WINAPI OpenPersonalTrustDBDialog(
IN OPTIONAL HWND hwndParent
);
//////////////////////////////////////////////////////////////////////////////
//
// WintrustSetDefaultIncludePEPageHashes
//----------------------------------------------------------------------------
// This API may be called to set the default setting for including page
// hashes when creating SIP indirect data for PE files.
//
// Unless explicitly set, the default is not to include page hashes.
//
extern
void
WINAPI
WintrustSetDefaultIncludePEPageHashes(
BOOL fIncludePEPageHashes
);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#if defined(_MSC_VER) && (_MSC_VER >= 800)
#if _MSC_VER >= 1200
#pragma warning(pop)
#else
#pragma warning(default:4201) // nonstandard extension used : nameless s
truct/union
#endif
#endif
#endif // WINTRUST_H #endif // WINTRUST_H
 End of changes. 18 change blocks. 
14 lines changed or deleted 151 lines changed or added

This html diff was produced by rfcdiff 1.41.