Vanara/PInvoke/Cryptography/Crypt32/Wincrypt.Prop.cs

2221 lines
116 KiB
C#
Raw Normal View History

2020-03-09 11:54:19 -04:00
using System;
using System.Runtime.InteropServices;
using Vanara.InteropServices;
using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME;
namespace Vanara.PInvoke
{
/// <summary>Methods and data types found in Crypt32.dll.</summary>
public static partial class Crypt32
{
/// <summary>Set this flag to ignore any store provider write errors and always update the cached context's property.</summary>
[PInvokeData("wincrypt.h")]
public const uint CERT_SET_PROPERTY_IGNORE_PERSIST_ERROR_FLAG = 0x80000000;
/// <summary>Set this flag to inhibit the persisting of this property.</summary>
[PInvokeData("wincrypt.h")]
public const uint CERT_SET_PROPERTY_INHIBIT_PERSIST_FLAG = 0x40000000;
/// <summary>Property identifiers.</summary>
[PInvokeData("wincrypt.h")]
public enum CertPropId : uint
{
/// <summary>
/// Gets or sets a DWORD value indicating whether write operations to the certificate are persisted. The DWORD value is not set
/// if the certificate is in a memory store or in a registry-based store that is opened as read-only.
/// </summary>
[CorrespondingType(typeof(uint), CorrespondingAction.GetSet)]
CERT_ACCESS_STATE_PROP_ID = 14,
/// <summary>Reserved.</summary>
CERT_AIA_URL_RETRIEVED_PROP_ID = 67,
/// <summary>This property saves an encrypted key hash for the certificate context.</summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_ARCHIVED_KEY_HASH_PROP_ID = 65,
/// <summary>
/// Indicates the certificate is skipped during enumerations. A certificate with this property set is found with explicit search
/// operations, such as those used to find a certificate with a specific hash or a serial number. No data in pvData is
/// associated with this property. This property can be set to the empty BLOB, {0,NULL}.
/// </summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_ARCHIVED_PROP_ID = 19,
/// <summary></summary>
CERT_AUTH_ROOT_SHA256_HASH_PROP_ID = 98,
/// <summary>Reserved.</summary>
CERT_AUTHORITY_INFO_ACCESS_PROP_ID = 68,
/// <summary>
/// Gets or sets a null-terminated Unicode string naming the certificate type for which the certificate has been auto enrolled.
/// </summary>
[CorrespondingType(typeof(string), CorrespondingAction.GetSet)]
CERT_AUTO_ENROLL_PROP_ID = 21,
/// <summary>Reserved.</summary>
CERT_AUTO_ENROLL_RETRY_PROP_ID = 66,
/// <summary>Reserved.</summary>
CERT_BACKED_UP_PROP_ID = 69,
/// <summary>
/// Disables certificate revocation list (CRL) retrieval for certificates used by the certification authority (CA). If the CA
/// certificate contains this property, it must also include the CERT_CA_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID property.
/// </summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_CA_DISABLE_CRL_PROP_ID = 82,
/// <summary>
/// Contains the list of online certificate status protocol (OCSP) URLs to use for certificates issued by the CA certificate.
/// The array contents are the Abstract Syntax Notation One (ASN.1)-encoded bytes of an X509_AUTHORITY_INFO_ACCESS structure
/// where pszAccessMethod is set to szOID_PKIX_OCSP.
/// </summary>
[CorrespondingType(typeof(byte[]), CorrespondingAction.GetSet)]
CERT_CA_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID = 81,
/// <summary></summary>
CERT_CEP_PROP_ID = 87,
/// <summary></summary>
CERT_CLR_DELETE_KEY_PROP_ID = 125,
/// <summary>
/// Location of the cross certificates. Currently, this identifier is only applicable to certificates and not to CRLs or
/// certificate trust lists (CTLs). The BYTE array contains an ASN.1-encoded CROSS_CERT_DIST_POINTS_INFO structure decoded by
/// using the CryptDecodeObject function with a X509_CROSS_CERT_DIST_POINTS value for the lpszStuctType parameter.
/// </summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_CROSS_CERT_DIST_POINTS_PROP_ID = 23,
/// <summary>An array of bytes containing an Abstract Syntax Notation One (ASN.1) encoded CTL_USAGE structure.</summary>
[CorrespondingType(typeof(byte[]), CorrespondingAction.GetSet)]
CERT_CTL_USAGE_PROP_ID = CERT_ENHKEY_USAGE_PROP_ID,
/// <summary>Time when the certificate was added to the store.</summary>
[CorrespondingType(typeof(FILETIME), CorrespondingAction.GetSet)]
CERT_DATE_STAMP_PROP_ID = 27,
/// <summary>
/// Gets or sets the property displayed by the certificate UI. This property allows the user to describe the certificate's use.
/// </summary>
[CorrespondingType(typeof(byte[]), CorrespondingAction.GetSet)]
CERT_DESCRIPTION_PROP_ID = 13,
/// <summary></summary>
CERT_DISALLOWED_ENHKEY_USAGE_PROP_ID = 122,
/// <summary></summary>
CERT_DISALLOWED_FILETIME_PROP_ID = 104,
/// <summary>Reserved</summary>
CERT_EFS_PROP_ID = 17,
/// <summary>An array of bytes containing an ASN.1 encoded CERT_ENHKEY_USAGE structure.</summary>
[CorrespondingType(typeof(byte[]), CorrespondingAction.GetSet)]
CERT_ENHKEY_USAGE_PROP_ID = 9,
/// <summary>
/// <para>
/// Enrollment information of the pending request that contains RequestID, CADNSName, CAName, and DisplayName. The data format
/// is defined as follows.
/// </para>
/// <list type="table">
/// <listheader>
/// <description>Bytes</description>
/// <description>Contents</description>
/// </listheader>
/// <item>
/// <description>First 4 bytes</description>
/// <description>Pending request ID</description>
/// </item>
/// <item>
/// <description>Next 4 bytes</description>
/// <description>
/// CADNSName size, in characters, including the terminating null character, followed by CADNSName string with terminating null character
/// </description>
/// </item>
/// <item>
/// <description>Next 4 bytes</description>
/// <description>
/// CAName size, in characters, including the terminating null character, followed by CAName string with terminating null character
/// </description>
/// </item>
/// <item>
/// <description>Next 4 bytes</description>
/// <description>
/// DisplayName size, in characters, including the terminating null character, followed by DisplayName string with terminating
/// null character
/// </description>
/// </item>
/// </list>
/// </summary>
[CorrespondingType(typeof(byte[]), CorrespondingAction.GetSet)]
CERT_ENROLLMENT_PROP_ID = 26,
/// <summary>
/// Returns a null-terminated Unicode character string that contains extended error information for the certificate context.
/// </summary>
[CorrespondingType(typeof(byte[]), CorrespondingAction.GetSet)]
CERT_EXTENDED_ERROR_INFO_PROP_ID = 30,
/// <summary>Reserved</summary>
CERT_FORTEZZA_DATA_PROP_ID = 18,
/// <summary>A null-terminated Unicode character string that contains the display name for the CRL.</summary>
[CorrespondingType(typeof(string), CorrespondingAction.GetSet)]
CERT_FRIENDLY_NAME_PROP_ID = 11,
/// <summary>Returns the SHA1 hash. If the hash does not exist, it is computed by using the CryptHashCertificate function.</summary>
[CorrespondingType(typeof(byte[]), CorrespondingAction.GetSet)]
CERT_HASH_PROP_ID = CERT_SHA1_HASH_PROP_ID,
/// <summary>Returns either the HCRYPTPROV or NCRYPT_KEY_HANDLE choice.</summary>
[CorrespondingType(typeof(HCRYPTPROV), CorrespondingAction.GetSet)]
[CorrespondingType(typeof(NCrypt.NCRYPT_KEY_HANDLE), CorrespondingAction.GetSet)]
CERT_HCRYPTPROV_OR_NCRYPT_KEY_HANDLE_PROP_ID = 79,
/// <summary>
/// The Cryptography API (CAPI) key handle associated with the certificate. The caller is responsible for freeing the handle. It
/// will not be freed when the context is freed. The property value is removed after after it is returned. If you call this
/// property on a context that has a CNG key, CRYPT_E_NOT_FOUND is returned.
/// </summary>
[CorrespondingType(typeof(HANDLE), CorrespondingAction.GetSet)]
CERT_HCRYPTPROV_TRANSFER_PROP_ID = 100,
/// <summary>Rerserved.</summary>
CERT_IE30_RESERVED_PROP_ID = 7,
/// <summary></summary>
CERT_ISOLATED_KEY_PROP_ID = 118,
/// <summary>
/// <para>
/// A string containing a set of L"&lt;PUBKEY&gt;/&lt;BITLENGTH&gt;" public key algorithm and bit length pairs. The semicolon,
/// L";", is used as the delimiter.
/// </para>
/// <para>The &lt;PUBKEY&gt; value identifies the CNG public key algorithm. The following algorithms are supported:</para>
/// <list type="bullet">
/// <item>L"RSA" (BCRYPT_RSA_ALGORITHM)</item>
/// <item>L"DSA" (BCRYPT_DSA_ALGORITHM)</item>
/// <item>L"ECDSA" (SSL_ECDSA_ALGORITHM)</item>
/// </list>
/// <para>
/// A &lt;PUBKEY&gt;/&lt;BITLENGTH&gt; pair is set for each certificate in the CRL issuer chain excluding the leaf. This
/// property can be set when an OCSP response with an independent signer chain is converted to a CRL.
/// </para>
/// <note type="note">This property should not be set for a delegated OCSP signer certificate. A delegated signer certificate is
/// signed with the same key used to sign the subject certificate and is checked there.</note>
/// <para>The following is an example:</para>
/// <para>: L"RSA/2048;RSA/4096"</para>
/// </summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_ISSUER_CHAIN_PUB_KEY_CNG_ALG_BIT_LENGTH_PROP_ID = 96,
/// <summary>
/// <para>
/// A string that contains a set of L"&lt;SIGNATURE&gt;/&lt;HASH&gt;" algorithm pairs. The semicolon, L";", is used as the
/// delimiter between pairs.
/// </para>
/// <para>
/// This property is set only when an OCSP response is converted to a CRL. For a delegated OCSP signer certificate, only the
/// algorithm pair for the signer certificate is returned. For an independent OCSP signer certificate chain, an algorithm pair
/// is returned for each certificate in the chain excluding the root.
/// </para>
/// <para>The &lt;SIGNATURE&gt; value identifies the CNG public key algorithm. The following algorithms are supported:</para>
/// <list type="bullet">
/// <item>L"RSA" (BCRYPT_RSA_ALGORITHM)</item>
/// <item>L"DSA" (BCRYPT_DSA_ALGORITHM)</item>
/// <item>L"ECDSA" (SSL_ECDSA_ALGORITHM)</item>
/// </list>
/// <para>The &lt;HASH&gt; value identifies the CNG hash algorithm. The following algorithms are supported:</para>
/// <list type="bullet">
/// <item>L"MD5" (BCRYPT_MD5_ALGORITHM)</item>
/// <item>L"SHA1" (BCRYPT_SHA1_ALGORITHM)</item>
/// <item>L"SHA256" (BCRYPT_SHA256_ALGORITHM)</item>
/// <item>L"SHA384" (BCRYPT_SHA384_ALGORITHM)</item>
/// <item>L"SHA512" (BCRYPT_SHA512_ALGORITHM)</item>
/// </list>
/// <para>The following is an example:</para>
/// <para>L"RSA/SHA256;RSA/SHA256"</para>
/// <para>This property is explicitly set by the verify revocation functions.</para>
/// </summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_ISSUER_CHAIN_SIGN_HASH_CNG_ALG_PROP_ID = 95,
/// <summary>
/// <para>
/// The length, in bits, of the public key in the CRL issuer certificate. This property is also applicable to an OCSP that has
/// been converted to a CRL.
/// </para>
/// <para>This property is explicitly set by the verify revocation functions.</para>
/// <para><strong>Windows 8 and Windows Server 2012:</strong> Support for this property begins.</para>
/// </summary>
[CorrespondingType(typeof(uint), CorrespondingAction.GetSet)]
CERT_ISSUER_PUB_KEY_BIT_LENGTH_PROP_ID = 94,
/// <summary>This property sets the MD5 hash of the public key associated with the private key used to sign this certificate.</summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID = 24,
/// <summary>The CRYPT_DATA_BLOB structure contains the MD5 hash of the issuer name and serial number from this certificate.</summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID = 28,
/// <summary></summary>
CERT_KEY_CLASSIFICATION_PROP_ID = 120,
/// <summary>
/// The structure specifies the certificate's private key. It contains both the HCRYPTPROV and key specification for the private
/// key. For more information about the hCryptProv member and dwFlags settings, see CERT_KEY_PROV_HANDLE_PROP_ID, later in this topic.
/// </summary>
[CorrespondingType(typeof(CERT_KEY_CONTEXT), CorrespondingAction.GetSet)]
CERT_KEY_CONTEXT_PROP_ID = 5,
/// <summary>
/// If nonexistent, searches for the szOID_SUBJECT_KEY_IDENTIFIER extension. If that fails, a SHA1 hash is done on the
/// certificate's SubjectPublicKeyInfo member to produce the identifier values.
/// </summary>
[CorrespondingType(typeof(byte[]), CorrespondingAction.GetSet)]
CERT_KEY_IDENTIFIER_PROP_ID = 20,
/// <summary>
/// The HCRYPTPROV handle for the certificate's private key is set. The hCryptProv member of the CERT_KEY_CONTEXT structure is
/// updated if it exists. If it does not exist, it is created with dwKeySpec and initialized by CERT_KEY_PROV_INFO_PROP_ID. If
/// CERT_STORE_NO_CRYPT_RELEASE_FLAG is not set, the hCryptProv value is implicitly released either when the property is set to
/// NULL or on the final freeing of the CERT_CONTEXT structure.
/// </summary>
[CorrespondingType(typeof(HCRYPTPROV), CorrespondingAction.GetSet)]
CERT_KEY_PROV_HANDLE_PROP_ID = 1,
/// <summary>The structure specifies the certificate's private key.</summary>
[CorrespondingType(typeof(CRYPT_KEY_PROV_INFO), CorrespondingAction.GetSet)]
CERT_KEY_PROV_INFO_PROP_ID = 2,
/// <summary></summary>
CERT_KEY_REPAIR_ATTEMPTED_PROP_ID = 103,
/// <summary>
/// A DWORD value specifying the private key obtained from CERT_KEY_CONTEXT_PROP_ID property if it exists. Otherwise, if
/// CERT_KEY_PROV_INFO_PROP_ID exists, it is the source of the dwKeySpec.
/// </summary>
[CorrespondingType(typeof(uint), CorrespondingAction.GetSet)]
CERT_KEY_SPEC_PROP_ID = 6,
/// <summary>The MD5 hash. You can compute the hash by using the CryptHashCertificate function.</summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_MD5_HASH_PROP_ID = 4,
/// <summary>This property sets the NCRYPT_KEY_HANDLE for the certificate private key and sets the dwKeySpec to CERT_NCRYPT_KEY_SPEC.</summary>
[CorrespondingType(typeof(NCrypt.NCRYPT_KEY_HANDLE), CorrespondingAction.GetSet)]
CERT_NCRYPT_KEY_HANDLE_PROP_ID = 78,
/// <summary>Sets the handle of the CNG key associated with the certificate.</summary>
[CorrespondingType(typeof(HANDLE), CorrespondingAction.GetSet)]
CERT_NCRYPT_KEY_HANDLE_TRANSFER_PROP_ID = 99,
/// <summary>Reserved</summary>
CERT_NEW_KEY_PROP_ID = 74,
/// <summary>The ASN.1 encoded CERT_ALT_NAME_INFO structure on a CTL.</summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_NEXT_UPDATE_LOCATION_PROP_ID = 10,
/// <summary>Reserved</summary>
CERT_NO_AUTO_EXPIRE_CHECK_PROP_ID = 77,
/// <summary></summary>
CERT_NO_EXPIRE_NOTIFICATION_PROP_ID = 97,
/// <summary></summary>
CERT_NONCOMPLIANT_ROOT_URL_PROP_ID = 123,
/// <summary></summary>
CERT_NOT_BEFORE_ENHKEY_USAGE_PROP_ID = 127,
/// <summary></summary>
CERT_NOT_BEFORE_FILETIME_PROP_ID = 126,
/// <summary>Reserved</summary>
CERT_OCSP_CACHE_PREFIX_PROP_ID = 75,
/// <summary></summary>
CERT_OCSP_MUST_STAPLE_PROP_ID = 121,
/// <summary>
/// This property sets the encoded online certificate status protocol (OCSP) response from a CERT_SERVER_OCSP_RESPONSE_CONTEXT
/// for this certificate.
/// </summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_OCSP_RESPONSE_PROP_ID = 70,
/// <summary></summary>
CERT_PIN_SHA256_HASH_PROP_ID = 124,
/// <summary>
/// This property is implicitly set by calling the CertGetCertificateContextProperty function.
/// <para>
/// Windows Server 2008 R2, Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 and Windows XP: This identifier
/// is not supported.
/// </para>
/// </summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_PUB_KEY_CNG_ALG_BIT_LENGTH_PROP_ID = 93,
/// <summary>
/// This property is used with public keys that support algorithm parameter inheritance. The data BLOB contains the
/// ASN.1-encoded PublicKey Algorithm parameters. For DSS, these are parameters encoded by using the CryptEncodeObject function.
/// This is used only if CMS_PKCS7 is defined.
/// </summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_PUBKEY_ALG_PARA_PROP_ID = 22,
/// <summary>Reserved</summary>
CERT_PUBKEY_HASH_RESERVED_PROP_ID = 8,
/// <summary>
/// The CRYPT_DATA_BLOB structure specifies the name of a file that contains the private key associated with the certificate's
/// public key. Inside the CRYPT_DATA_BLOB structure, the pbData member is a pointer to a null-terminated Unicode wide-character
/// string, and the cbData member indicates the length of the string.
/// </summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_PVK_FILE_PROP_ID = 12,
/// <summary>This property specifies the hash of the renewed certificate.</summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_RENEWAL_PROP_ID = 64,
/// <summary>
/// The CRYPT_DATA_BLOB structure contains a null-terminated Unicode string that contains the DNS computer name for the
/// origination of the certificate context request.
/// </summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_REQUEST_ORIGINATOR_PROP_ID = 71,
/// <summary>
/// Returns a pointer to an encoded CERT_POLICIES_INFO structure that contains the application policies of the root certificate
/// for the context. This property can be decoded by using the CryptDecodeObject function with the lpszStructType parameter set
/// to X509_CERT_POLICIES and the dwCertEncodingType parameter set to a combination of X509_ASN_ENCODING bitwise OR PKCS_7_ASN_ENCODING.
/// </summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_ROOT_PROGRAM_CERT_POLICIES_PROP_ID = 83,
/// <summary></summary>
CERT_ROOT_PROGRAM_CHAIN_POLICIES_PROP_ID = 105,
/// <summary>Reserved</summary>
CERT_ROOT_PROGRAM_NAME_CONSTRAINTS_PROP_ID = 84,
/// <summary></summary>
CERT_SCARD_PIN_ID_PROP_ID = 90,
/// <summary></summary>
CERT_SCARD_PIN_INFO_PROP_ID = 91,
/// <summary></summary>
CERT_SCEP_CA_CERT_PROP_ID = 111,
/// <summary></summary>
CERT_SCEP_ENCRYPT_HASH_CNG_ALG_PROP_ID = 114,
/// <summary></summary>
CERT_SCEP_FLAGS_PROP_ID = 115,
/// <summary></summary>
CERT_SCEP_GUID_PROP_ID = 116,
/// <summary></summary>
CERT_SCEP_NONCE_PROP_ID = 113,
/// <summary></summary>
CERT_SCEP_RA_ENCRYPTION_CERT_PROP_ID = 110,
/// <summary></summary>
CERT_SCEP_RA_SIGNATURE_CERT_PROP_ID = 109,
/// <summary></summary>
CERT_SCEP_SERVER_CERTS_PROP_ID = 108,
/// <summary></summary>
CERT_SCEP_SIGNER_CERT_PROP_ID = 112,
/// <summary></summary>
CERT_SEND_AS_TRUSTED_ISSUER_PROP_ID = 102,
/// <summary></summary>
CERT_SERIAL_CHAIN_PROP_ID = 119,
/// <summary></summary>
CERT_SERIALIZABLE_KEY_CONTEXT_PROP_ID = 117,
/// <summary>The SHA1 hash. You can compute the hash by using CryptHashCertificate.</summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_SHA1_HASH_PROP_ID = 3,
/// <summary></summary>
CERT_SHA256_HASH_PROP_ID = 107,
/// <summary>
/// <para>
/// The L”&lt;SIGNATURE&gt;/&lt;HASH&gt;” string representing the certificate signature. The &lt;SIGNATURE&gt; value identifies
/// the CNG public key algorithm. The following algorithms are supported:
/// </para>
/// <list type="bullet">
/// <item>L"RSA" (BCRYPT_RSA_ALGORITHM)</item>
/// <item>L"DSA" (BCRYPT_DSA_ALGORITHM)</item>
/// <item>L"ECDSA" (SSL_ECDSA_ALGORITHM)</item>
/// </list>
/// <para>The &lt;HASH&gt; value identifies the CNG hash algorithm. The following algorithms are supported:</para>
/// <list type="bullet">
/// <item>L"MD5" (BCRYPT_MD5_ALGORITHM)</item>
/// <item>L"SHA1" (BCRYPT_SHA1_ALGORITHM)</item>
/// <item>L"SHA256" (BCRYPT_SHA256_ALGORITHM)</item>
/// <item>L"SHA384" (BCRYPT_SHA384_ALGORITHM)</item>
/// <item>L"SHA512" (BCRYPT_SHA512_ALGORITHM)</item>
/// </list>
/// <para>The following are common examples:</para>
/// <list type="bullet">
/// <item>L”RSA/SHA1”</item>
/// <item>L”RSA/SHA256”</item>
/// <item>L”ECDSA/SHA256”</item>
/// </list>
/// <para>This property is also applicable to an OCSP response that has been converted to a CRL.</para>
/// <para>This property is explicitly set by the verify revocation functions.</para>
/// <para><strong>Windows 8 and Windows Server 2012</strong>: Support for this property begins.</para>
/// </summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_SIGN_HASH_CNG_ALG_PROP_ID = 89,
/// <summary>
/// The signature hash. If the hash does not exist, it is computed with CryptHashToBeSigned. The length of the hash is 20 bytes
/// for SHA and 16 for MD5.
/// </summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_SIGNATURE_HASH_PROP_ID = 15,
/// <summary>This property sets the smart card data property of a smart card certificate context.</summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_SMART_CARD_DATA_PROP_ID = 16,
/// <summary></summary>
CERT_SMART_CARD_READER_NON_REMOVABLE_PROP_ID = 106,
/// <summary></summary>
CERT_SMART_CARD_READER_PROP_ID = 101,
/// <summary>This property sets the information property of a smart card root certificate context.</summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_SMART_CARD_ROOT_INFO_PROP_ID = 76,
/// <summary>Reserved</summary>
CERT_SOURCE_LOCATION_PROP_ID = 72,
/// <summary>Reserved</summary>
CERT_SOURCE_URL_PROP_ID = 73,
/// <summary>Reserved</summary>
CERT_SUBJECT_DISABLE_CRL_PROP_ID = 86,
/// <summary>
/// This property sets the subject information access extension of the certificate context as an encoded
/// CERT_SUBJECT_INFO_ACCESS structure.
/// </summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_SUBJECT_INFO_ACCESS_PROP_ID = 80,
/// <summary>Returns an MD5 hash of the encoded subject name of the certificate context.</summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_SUBJECT_NAME_MD5_HASH_PROP_ID = 29,
/// <summary>Reserved</summary>
CERT_SUBJECT_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID = 85,
/// <summary>
/// This property is implicitly set by calling the CertGetCertificateContextProperty function.
/// <para>
/// Windows Server 2008 R2, Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 and Windows XP: This identifier
/// is not supported.
/// </para>
/// </summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_SUBJECT_PUB_KEY_BIT_LENGTH_PROP_ID = 92,
/// <summary>This property sets the MD5 hash of this certificate's public key.</summary>
[CorrespondingType(typeof(CRYPTOAPI_BLOB), CorrespondingAction.GetSet)]
CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID = 25,
}
/// <summary>
/// The <c>CertEnumCertificateContextProperties</c> function retrieves the first or next extended property associated with a
/// certificate context. Used in a loop, this function can retrieve in sequence all of the extended properties associated with a
/// certificate context.
/// </summary>
/// <param name="pCertContext">A pointer to the CERT_CONTEXT structure of the certificate containing the properties to be enumerated.</param>
/// <param name="dwPropId">
/// <para>
/// Property number of the last property enumerated. To get the first property, dwPropId is zero. To retrieve subsequent properties,
/// dwPropId is set to the property number returned by the last call to the function. To enumerate all the properties, function
/// calls continue until the function returns zero.
/// </para>
/// <para>
/// Applications can call CertGetCertificateContextProperty with the dwPropId returned by this function to retrieve that property's data.
/// </para>
/// </param>
/// <returns>
/// The return value is a <c>DWORD</c> value that identifies a certificate context's property. The <c>DWORD</c> value returned by
/// one call of the function can be supplied as the dwPropId in a subsequent call to the function. If there are no more properties
/// to be enumerated or if the function fails, zero is returned.
/// </returns>
/// <remarks>
/// <para>
/// CERT_KEY_PROV_HANDLE_PROP_ID and CERT_KEY_SPEC_PROP_ID properties are stored as members of the CERT_KEY_CONTEXT_PROP_ID
/// property. They are not enumerated individually.
/// </para>
/// <para>Examples</para>
/// <para>See Example C Program: Listing the Certificates in a Store.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certenumcertificatecontextproperties DWORD
// CertEnumCertificateContextProperties( PCCERT_CONTEXT pCertContext, DWORD dwPropId );
[DllImport(Lib.Crypt32, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wincrypt.h", MSDNShortId = "b7304ab2-432b-40c0-8014-7f8874fa36fa")]
public static extern uint CertEnumCertificateContextProperties([In] PCCERT_CONTEXT pCertContext, CertPropId dwPropId);
/// <summary>
/// The <c>CertEnumCRLContextProperties</c> function retrieves the first or next extended property associated with a certificate
/// revocation list (CRL) context. Used in a loop, this function can retrieve in sequence all extended properties associated with a
/// CRL context.
/// </summary>
/// <param name="pCrlContext">A pointer to a CRL_CONTEXT structure.</param>
/// <param name="dwPropId">
/// <para>
/// Property number of the last property enumerated. To get the first property, dwPropId is zero. To retrieve subsequent properties,
/// dwPropId is set to the property number returned by the last call to the function. To enumerate all the properties, function
/// calls continue until the function returns zero.
/// </para>
/// <para>
/// Applications can call CertGetCRLContextProperty with the dwPropId returned by this function to retrieve that property's data.
/// </para>
/// </param>
/// <returns>
/// The return value is a <c>DWORD</c> value that identifies a CRL context's property. The <c>DWORD</c> value returned by one call
/// of the function can be supplied as the dwPropId in a subsequent call to the function. If there are no more properties to be
/// enumerated or if the function fails, zero is returned.
/// </returns>
// https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certenumcrlcontextproperties DWORD
// CertEnumCRLContextProperties( PCCRL_CONTEXT pCrlContext, DWORD dwPropId );
[DllImport(Lib.Crypt32, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wincrypt.h", MSDNShortId = "330808ef-9b39-4bd4-ba0b-9e70ec516f33")]
public static extern uint CertEnumCRLContextProperties([In] PCCRL_CONTEXT pCrlContext, CertPropId dwPropId);
/// <summary>
/// The <c>CertEnumCTLContextProperties</c> function retrieves the first or next extended property associated with a certificate
/// trust list (CTL) context. Used in a loop, this function can retrieve in sequence all extended properties associated with a CTL context.
/// </summary>
/// <param name="pCtlContext">A pointer to a CTL_CONTEXT structure.</param>
/// <param name="dwPropId">
/// <para>
/// Property number of the last property enumerated. To get the first property, dwPropId is zero. To retrieve subsequent properties,
/// dwPropId is set to the property number returned by the last call to the function. To enumerate all the properties, function
/// calls continue until the function returns zero.
/// </para>
/// <para>
/// Applications can call CertGetCTLContextProperty with the dwPropId returned by this function to retrieved that property's data.
/// </para>
/// </param>
/// <returns>
/// The return value is a <c>DWORD</c> value that identifies a CTL context's property. The <c>DWORD</c> value returned by one call
/// of the function can be supplied as the dwPropId in a subsequent call to the function. If there are no more properties to be
/// enumerated or if the function fails, zero is returned.
/// </returns>
// https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certenumctlcontextproperties DWORD
// CertEnumCTLContextProperties( PCCTL_CONTEXT pCtlContext, DWORD dwPropId );
[DllImport(Lib.Crypt32, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wincrypt.h", MSDNShortId = "f5c9c4cd-bf99-41bf-b13e-f1921b011039")]
public static extern uint CertEnumCTLContextProperties([In] PCCTL_CONTEXT pCtlContext, CertPropId dwPropId);
/// <summary>
/// The <c>CertGetCertificateContextProperty</c> function retrieves the information contained in an extended property of a
/// certificate context.
/// </summary>
/// <param name="pCertContext">A pointer to the CERT_CONTEXT structure of the certificate that contains the property to be retrieved.</param>
/// <param name="dwPropId">
/// <para>
/// The property to be retrieved. Currently defined identifiers and the data type to be returned in pvData are listed in the
/// following table.
/// </para>
/// <para>CERT_ACCESS_STATE_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a <c>DWORD</c> value.</para>
/// <para>
/// Returns a <c>DWORD</c> value that indicates whether write operations to the certificate are persisted. The <c>DWORD</c> value is
/// not set if the certificate is in a memory store or in a registry-based store that is opened as read-only.
/// </para>
/// <para>CERT_AIA_URL_RETRIEVED_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_ARCHIVED_KEY_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>Returns a previously saved encrypted key hash for the certificate context.</para>
/// <para>CERT_ARCHIVED_PROP_ID</para>
/// <para>
/// Data type of pvData: <c>NULL</c>. If the <c>CertGetCertificateContextProperty</c> function returns true, then the specified
/// property ID exists for the CERT_CONTEXT.
/// </para>
/// <para>
/// Indicates the certificate is skipped during enumerations. A certificate with this property set is found with explicit search
/// operations, such as those used to find a certificate with a specific hash or a serial number. No data in pvData is associated
/// with this property.
/// </para>
/// <para>CERT_AUTHORITY_INFO_ACCESS_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_AUTO_ENROLL_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>Returns a null-terminated Unicode string that names the certificate type for which the certificate has been auto enrolled.</para>
/// <para>CERT_AUTO_ENROLL_RETRY_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_BACKED_UP_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_CA_DISABLE_CRL_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>
/// Disables certificate revocation list (CRL) retrieval for certificates used by the certification authority (CA). If the CA
/// certificate contains this property, it must also include the <c>CERT_CA_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID</c> property.
/// </para>
/// <para>CERT_CA_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>
/// Contains the list of online certificate status protocol (OCSP) URLs to use for certificates issued by the CA certificate. The
/// array contents are the Abstract Syntax Notation One (ASN.1)-encoded bytes of an <c>X509_AUTHORITY_INFO_ACCESS</c> structure
/// where <c>pszAccessMethod</c> is set to <c>szOID_PKIX_OCSP</c>.
/// </para>
/// <para>CERT_CROSS_CERT_DIST_POINTS_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>
/// Location of the cross certificates. Currently, this identifier is only applicable to certificates and not to CRLs or certificate
/// trust lists (CTLs). The <c>BYTE</c> array contains an ASN.1-encoded CROSS_CERT_DIST_POINTS_INFO structure decoded by using the
/// CryptDecodeObject function with a X509_CROSS_CERT_DIST_POINTS value for the lpszStuctType parameter.
/// </para>
/// <para>CERT_CTL_USAGE_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
2020-03-09 12:53:39 -04:00
/// <para>Returns an array of bytes that contain an ASN.1-encoded <see cref="CTL_USAGE"/> structure.</para>
2020-03-09 11:54:19 -04:00
/// <para>CERT_DATE_STAMP_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a <c>FILETIME</c> structure.</para>
/// <para>Time when the certificate was added to the store.</para>
/// <para>CERT_DESCRIPTION_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>Returns the property displayed by the certificate UI. This property allows the user to describe the certificate's use.</para>
/// <para>CERT_EFS_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_ENHKEY_USAGE_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>
/// Returns an array of bytes that contain an ASN.1-encoded CERT_ENHKEY_USAGE structure. This structure contains an array of
/// Enhanced Key Usage object identifiers (OIDs), each of which specifies a valid use of the certificate.
/// </para>
/// <para>CERT_ENROLLMENT_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>
/// Enrollment information of the pending request that contains RequestID, CADNSName, CAName, and DisplayName. The data format is
/// defined as follows.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Bytes</term>
/// <term>Contents</term>
/// </listheader>
/// <item>
/// <term>First 4 bytes</term>
/// <term>Pending request ID</term>
/// </item>
/// <item>
/// <term>Next 4 bytes</term>
/// <term>
/// CADNSName size, in characters, including the terminating null character, followed by CADNSName string with terminating null character
/// </term>
/// </item>
/// <item>
/// <term>Next 4 bytes</term>
/// <term>
/// CAName size, in characters, including the terminating null character, followed by CAName string with terminating null character
/// </term>
/// </item>
/// <item>
/// <term>Next 4 bytes</term>
/// <term>
/// DisplayName size, in characters, including the terminating null character, followed by DisplayName string with terminating null character
/// </term>
/// </item>
/// </list>
/// <para>CERT_EXTENDED_ERROR_INFO_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>Returns a null-terminated Unicode character string that contains extended error information for the certificate context.</para>
/// <para>CERT_FORTEZZA_DATA_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_FRIENDLY_NAME_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>Returns a null-terminated Unicode character string that contains the display name for the certificate.</para>
/// <para>CERT_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>Returns the SHA1 hash. If the hash does not exist, it is computed by using the CryptHashCertificate function.</para>
/// <para>CERT_HCRYPTPROV_OR_NCRYPT_KEY_HANDLE_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an HCRYPTPROV_OR_NCRYPT_KEY_HANDLE data type.</para>
/// <para>Returns either the <c>HCRYPTPROV</c> or <c>NCRYPT_KEY_HANDLE</c> choice.</para>
/// <para>CERT_HCRYPTPROV_TRANSFER_PROP_ID</para>
/// <para>
/// Returns the Cryptography API (CAPI) key handle associated with the certificate. The caller is responsible for freeing the
/// handle. It will not be freed when the context is freed. The property value is removed after after it is returned. If you call
/// this property on a context that has a CNG key, <c>CRYPT_E_NOT_FOUND</c> is returned.
/// </para>
/// <para>CERT_IE30_RESERVED_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>MD5 hash of the public key associated with the private key used to sign this certificate.</para>
/// <para>CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>MD5 hash of the issuer name and serial number from this certificate.</para>
/// <para>CERT_KEY_CONTEXT_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CERT_KEY_CONTEXT structure.</para>
/// <para>Returns a CERT_KEY_CONTEXT structure.</para>
/// <para>CERT_KEY_IDENTIFIER_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>
/// If nonexistent, searches for the szOID_SUBJECT_KEY_IDENTIFIER extension. If that fails, a SHA1 hash is done on the certificate's
/// <c>SubjectPublicKeyInfo</c> member to produce the identifier values.
/// </para>
/// <para>CERT_KEY_PROV_HANDLE_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an HCRYPTPROV value.</para>
/// <para>Returns the provider handle obtained from CERT_KEY_CONTEXT_PROP_ID.</para>
/// <para>CERT_KEY_PROV_INFO_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_KEY_PROV_INFO structure.</para>
/// <para>Returns a pointer to a CRYPT_KEY_PROV_INFO structure.</para>
/// <para>CERT_KEY_SPEC_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a <c>DWORD</c> value.</para>
/// <para>
/// Returns a <c>DWORD</c> value that specifies the private key obtained from CERT_KEY_CONTEXT_PROP_ID if it exists. Otherwise, if
/// CERT_KEY_PROV_INFO_PROP_ID exists, it is the source of the dwKeySpec.
/// </para>
/// <para>CERT_MD5_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>Returns the MD5 hash. If the hash does not exist, it is computed by using the CryptHashCertificate function.</para>
/// <para>CERT_NCRYPT_KEY_HANDLE_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an <c>NCRYPT_KEY_HANDLE</c> data type.</para>
/// <para>Returns a <c>CERT_NCRYPT_KEY_SPEC</c> choice where applicable.</para>
/// <para>CERT_NCRYPT_KEY_HANDLE_TRANSFER_PROP_ID</para>
/// <para>
/// Returns the CNG key handle associated with the certificate. The caller is responsible for freeing the handle. It will not be
/// freed when the context is freed. The property value is removed after after it is returned. If you call this property on a
/// context that has a legacy (CAPI) key, <c>CRYPT_E_NOT_FOUND</c> is returned.
/// </para>
/// <para>CERT_NEW_KEY_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_NEXT_UPDATE_LOCATION_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>Returns the ASN.1-encoded CERT_ALT_NAME_INFO structure.</para>
/// <para>CERT_NEXT_UPDATE_LOCATION_PROP_ID is currently used only with CTLs.</para>
/// <para>CERT_NO_AUTO_EXPIRE_CHECK_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_OCSP_CACHE_PREFIX_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_OCSP_RESPONSE_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>Returns an encoded OCSP response for this certificate.</para>
/// <para>CERT_PUB_KEY_CNG_ALG_BIT_LENGTH_PROP_ID</para>
/// <para>Data type of pvData: Pointer to a null-terminated Unicode string.</para>
/// <para>
/// Returns an L”&lt;PUBKEY&gt;/&lt;BITLENGTH&gt;” string representing the certificates public key algorithm and bit length. The
/// following &lt;PUBKEY&gt; algorithms are supported:
/// </para>
/// <list type="bullet">
/// <item>
/// <term>L"RSA" (BCRYPT_RSA_ALGORITHM)</term>
/// </item>
/// <item>
/// <term>L"DSA" (BCRYPT_DSA_ALGORITHM)</term>
/// </item>
/// <item>
/// <term>L"ECDSA" (SSL_ECDSA_ALGORITHM)</term>
/// </item>
/// </list>
/// <para>Windows 8 and Windows Server 2012:</para>
/// <para>Support for this property begins.</para>
/// <para>CERT_PUBKEY_ALG_PARA_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>
/// For public keys that support algorithm parameter inheritance, returns the ASN.1-encoded PublicKey Algorithm parameters. For
/// Digital Signature Standard (DSS), returns the parameters encoded by using the CryptEncodeObject function. This property is used
/// only if CMS_PKCS7 is defined.
/// </para>
/// <para>CERT_PUBKEY_HASH_RESERVED_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_PVK_FILE_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>
/// Returns a null-terminated Unicode wide character string that contains the file name that contains the private key associated
/// with the certificate's public key.
/// </para>
/// <para>CERT_RENEWAL_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>Returns the hash of the renewed certificate.</para>
/// <para>CERT_REQUEST_ORIGINATOR_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>
/// Returns a null-terminated Unicode string that contains the DNS computer name for the origination of the certificate context request.
/// </para>
/// <para>CERT_ROOT_PROGRAM_CERT_POLICIES_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>
/// Returns a pointer to an encoded CERT_POLICIES_INFO structure that contains the application policies of the root certificate for
/// the context. This property can be decoded by using the CryptDecodeObject function with the lpszStructType parameter set to
/// <c>X509_CERT_POLICIES</c> and the dwCertEncodingType parameter set to a combination of <c>X509_ASN_ENCODING</c> bitwise <c>OR</c><c>PKCS_7_ASN_ENCODING</c>.
/// </para>
/// <para>CERT_ROOT_PROGRAM_NAME_CONSTRAINTS_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_SHA1_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>Returns the SHA1 hash. If the hash does not exist, it is computed by using the CryptHashCertificate function.</para>
/// <para>CERT_SIGN_HASH_CNG_ALG_PROP_ID</para>
/// <para>Data type of pvData: Pointer to a null-terminated Unicode string.</para>
/// <para>
/// Returns the L”&lt;SIGNATURE&gt;/&lt;HASH&gt;” string representing the certificate signature. The &lt;SIGNATURE&gt; value
/// identifies the CNG public key algorithm. The following algorithms are supported:
/// </para>
/// <list type="bullet">
/// <item>
/// <term>L"RSA" (BCRYPT_RSA_ALGORITHM)</term>
/// </item>
/// <item>
/// <term>L"DSA" (BCRYPT_DSA_ALGORITHM)</term>
/// </item>
/// <item>
/// <term>L"ECDSA" (SSL_ECDSA_ALGORITHM)</term>
/// </item>
/// </list>
/// <para>The</para>
/// <para>&lt;HASH&gt;</para>
/// <para>value identifies the CNG hash algorithm. The following algorithms are supported:</para>
/// <list type="bullet">
/// <item>
/// <term>L"MD5" (BCRYPT_MD5_ALGORITHM)</term>
/// </item>
/// <item>
/// <term>L"SHA1" (BCRYPT_SHA1_ALGORITHM)</term>
/// </item>
/// <item>
/// <term>L"SHA256" (BCRYPT_SHA256_ALGORITHM)</term>
/// </item>
/// <item>
/// <term>L"SHA384" (BCRYPT_SHA384_ALGORITHM)</term>
/// </item>
/// <item>
/// <term>L"SHA512" (BCRYPT_SHA512_ALGORITHM)</term>
/// </item>
/// </list>
/// <para>The following are common examples:</para>
/// <list type="bullet">
/// <item>
/// <term>L"RSA/SHA1"</term>
/// </item>
/// <item>
/// <term>L"RSA/SHA256"</term>
/// </item>
/// <item>
/// <term>L"ECDSA/SHA256"</term>
/// </item>
/// </list>
/// <para>Windows 7 and Windows Server 2008 R2:</para>
/// <para>Support for this property begins.</para>
/// <para>CERT_SIGNATURE_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>
/// Returns the signature hash. If the hash does not exist, it is computed by using the CryptHashToBeSigned function. The length of
/// the hash is 20 bytes for SHA and 16 for MD5.
/// </para>
/// <para>CERT_SMART_CARD_DATA_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>
/// Returns a pointer to encoded smart card data. Prior to calling <c>CertGetCertificateContextProperty</c>, you can use this
/// constant to retrieve a smart card certificate by using the CertFindCertificateInStore function with the pvFindPara parameter set
/// to <c>CERT_SMART_CARD_DATA_PROP_ID</c> and the dwFindType parameter set to <c>CERT_FIND_PROPERTY</c>.
/// </para>
/// <para>CERT_SMART_CARD_ROOT_INFO_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>Returns a pointer to an encoded CRYPT_SMART_CARD_ROOT_INFO structure.</para>
/// <para>CERT_SOURCE_LOCATION_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_SOURCE_URL_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_SUBJECT_DISABLE_CRL_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_SUBJECT_INFO_ACCESS_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>Returns the subject information access extension of the certificate context as an encoded CERT_SUBJECT_INFO_ACCESS structure.</para>
/// <para>CERT_SUBJECT_NAME_MD5_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>Returns an MD5 hash of the encoded subject name of the certificate context.</para>
/// <para>CERT_SUBJECT_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_SUBJECT_PUB_KEY_BIT_LENGTH_PROP_ID</para>
/// <para>Data type of pvData: Pointer to a <c>DWORD</c> value.</para>
/// <para>Returns the length, in bits, of the public key in the certificate.</para>
/// <para><c>Windows 8 and Windows Server 2012:</c> Support for this property begins.</para>
/// <para>CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an array of <c>BYTE</c> values. The size of this array is specified in the pcbData parameter.</para>
/// <para>Returns the MD5 hash of this certificate's public key.</para>
/// <para>For all user-defined property identifiers, pvData points to an array of <c>BYTE</c> values.</para>
/// <para>For more information about each property identifier, see the documentation on the dwPropId parameter in CertSetCertificateContextProperty.</para>
/// </param>
/// <param name="pvData">
/// <para>
/// A pointer to a buffer to receive the data as determined by dwPropId. Structures pointed to by members of a structure returned
/// are also returned following the base structure. Therefore, the size contained in pcbData often exceeds the size of the base structure.
/// </para>
/// <para>
/// This parameter can be <c>NULL</c> to set the size of the information for memory allocation purposes. For more information, see
/// Retrieving Data of Unknown Length.
/// </para>
/// </param>
/// <param name="pcbData">
/// <para>
/// A pointer to a <c>DWORD</c> value that specifies the size, in bytes, of the buffer pointed to by the pvData parameter. When the
/// function returns, the <c>DWORD</c> value contains the number of bytes to be stored in the buffer.
/// </para>
/// <para>
/// To obtain the required size of a buffer at run time, pass <c>NULL</c> for the pvData parameter, and set the value pointed to by
/// this parameter to zero. If the pvData parameter is not <c>NULL</c> and the size specified in pcbData is less than the number of
/// bytes required to contain the data, the function fails, GetLastError returns <c>ERROR_MORE_DATA</c>, and the required size is
/// placed in the variable pointed to by the pcbData parameter.
/// </para>
/// <para>
/// <c>Note</c> When processing the data returned in the buffer, applications must use the actual size of the data returned. The
/// actual size can be slightly smaller than the size of the buffer specified on input. (On input, buffer sizes are usually
/// specified large enough to ensure that the largest possible output data fits in the buffer.) On output, the variable pointed to
/// by this parameter is updated to reflect the actual size of the data copied to the buffer.
/// </para>
/// </param>
/// <returns>
/// <para>If the function succeeds, the function returns <c>TRUE</c>.</para>
/// <para>If the function fails, it returns <c>FALSE</c>. For extended error information, call GetLastError.</para>
/// <para>Some possible error codes follow.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>CRYPT_E_NOT_FOUND</term>
/// <term>The certificate does not have the specified property.</term>
/// </item>
/// <item>
/// <term>ERROR_MORE_DATA</term>
/// <term>
/// If the buffer specified by the pvData parameter is not large enough to hold the returned data, the function sets the
/// ERROR_MORE_DATA code and stores the required buffer size, in bytes, in the variable pointed to by pcbData.
/// </term>
/// </item>
/// </list>
/// <para>Errors from the called function CryptHashCertificate can be propagated to this function.</para>
/// </returns>
/// <remarks>
/// <para>
/// Properties are not stored inside a certificate. Typically, they are associated with a certificate after the certificate response
/// is received and then saved with the certificate in the store. For security reasons, we recommend that you validate property
/// values before saving them and that you save only informational properties such as the <c>CERT_FRIENDLY_NAME_PROP_ID</c> value in
/// user stores. All other property types should be saved in local computer stores.
/// </para>
/// <para>Your code can use a macro to evaluate the class of hash for a certificate context. For more information, see CertSetCertificateContextProperty.</para>
/// <para>Examples</para>
/// <para>
/// For examples that use this function, see Example C Program: Getting and Setting Certificate Properties and Example C Program:
/// Listing the Certificates in a Store.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certgetcertificatecontextproperty BOOL
// CertGetCertificateContextProperty( PCCERT_CONTEXT pCertContext, DWORD dwPropId, void *pvData, DWORD *pcbData );
[DllImport(Lib.Crypt32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("wincrypt.h", MSDNShortId = "f766db64-3121-4f70-ac83-ce25ee634efa")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CertGetCertificateContextProperty([In] PCCERT_CONTEXT pCertContext, CertPropId dwPropId, [In, Out] IntPtr pvData, ref uint pcbData);
/// <summary>
/// The <c>CertGetCRLContextProperty</c> function gets an extended property for the specified certificate revocation list (CRL) context.
/// </summary>
/// <param name="pCrlContext">A pointer to the CRL_CONTEXT structure.</param>
/// <param name="dwPropId">
/// <para>
/// Identifies the property to be retrieved. Currently defined identifiers and the data type to be returned in pvData are listed in
/// the following table.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>CERT_ACCESS_STATE_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a DWORD Returns a DWORD value indicating whether write operations to the certificate are
/// persisted. The DWORD value is not set if the certificate is in a memory store or in a registry-based store that is opened as read-only.
/// </term>
/// </item>
/// <item>
/// <term>CERT_ARCHIVED_PROP_ID</term>
/// <term>
/// Data type for pvData: NULL Indicates the certificate is skipped during enumerations. A certificate with this property set is
/// found with explicit search operations, such as those used to find a certificate with a specific hash or a serial number. No data
/// in pvData is associated with this property.
/// </term>
/// </item>
/// <item>
/// <term>CERT_AUTO_ENROLL_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns a null-terminated Unicode string naming the certificate type for which the
/// certificate has been auto enrolled.
/// </term>
/// </item>
/// <item>
/// <term>CERT_CTL_USAGE_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns an array of bytes containing an Abstract Syntax Notation One (ASN.1)
/// encoded CTL_USAGE structure.
/// </term>
/// </item>
/// <item>
/// <term>CERT_DESCRIPTION_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns the property displayed by the certificate UI. This property allows the
/// user to describe the certificate's use.
/// </term>
/// </item>
/// <item>
/// <term>CERT_ENHKEY_USAGE_PROP_ID</term>
/// <term>Data type for pvData: Returns an array of bytes containing an ASN.1 encoded CERT_ENHKEY_USAGE structure.</term>
/// </item>
/// <item>
/// <term>CERT_FRIENDLY_NAME_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns a null-terminated Unicode character string that contains the display name
/// for the CRL.
/// </term>
/// </item>
/// <item>
/// <term>CERT_ISSUER_CHAIN_PUB_KEY_CNG_ALG_BIT_LENGTH_PROP_ID</term>
/// <term>
/// Data type for pvData: Pointer to a null-terminated Unicode string. Returns a string containing a set of
/// L"&lt;PUBKEY&gt;/&lt;BITLENGTH&gt;" public key algorithm and bit length pairs. The semicolon, L";", is used as the delimiter.
/// The &lt;PUBKEY&gt; value identifies the CNG public key algorithm. The following algorithms are supported: An
/// &lt;PUBKEY&gt;/&lt;BITLENGTH&gt; pair is returned for each certificate in the CRL issuer chain excluding the leaf. This property
/// is only set when an OCSP response with an independent signer chain is converted to a CRL. The following is an example: : L"RSA/2048;RSA/4096"
/// </term>
/// </item>
/// <item>
/// <term>CERT_ISSUER_CHAIN_SIGN_HASH_CNG_ALG_PROP_ID</term>
/// <term>
/// Data type for pvData: Pointer to a null-terminated Unicode string. Returns a string that contains a set of
/// L"&lt;SIGNATURE&gt;/&lt;HASH&gt;" algorithm pairs. The semicolon, L";", is used as the delimiter between pairs. This property is
/// set only when an OCSP response is converted to a CRL. For a delegated OCSP signer certificate, only the algorithm pair for the
/// signer certificate is returned. For an independent OCSP signer certificate chain, an algorithm pair is returned for each
/// certificate in the chain excluding the root. The &lt;SIGNATURE&gt; value identifies the CNG public key algorithm. The following
/// algorithms are supported: The &lt;HASH&gt; value identifies the CNG hash algorithm. The following algorithms are supported: The
/// following shows an example:
/// </term>
/// </item>
/// <item>
/// <term>CERT_ISSUER_PUB_KEY_BIT_LENGTH_PROP_ID</term>
/// <term>
/// Data type for pvData: Pointer to a DWORD value. Returns the length, in bits, of the public key in the CRL issuer certificate.
/// This property is also applicable to an OCSP response that has been converted to a CRL. Windows 8 and Windows Server 2012:
/// Support for this property begins.
/// </term>
/// </item>
/// <item>
/// <term>CERT_KEY_CONTEXT_PROP_ID</term>
/// <term>Data type for pvData: pointer to a CERT_KEY_CONTEXT Returns a CERT_KEY_CONTEXT structure.</term>
/// </item>
/// <item>
/// <term>CERT_KEY_IDENTIFIER_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array If nonexistent, searches for the szOID_SUBJECT_KEY_IDENTIFIER extension. If that
/// fails, a SHA1 hash is done on the certificate's SubjectPublicKeyInfo member to produce the identifier values.
/// </term>
/// </item>
/// <item>
/// <term>CERT_KEY_PROV_HANDLE_PROP_ID</term>
/// <term>Data type for pvData: pointer to an HCRYPTPROV Returns the provider handle obtained from the CERT_KEY_CONTEXT_PROP_ID.</term>
/// </item>
/// <item>
/// <term>CERT_KEY_PROV_INFO_PROP_ID</term>
/// <term>Data type for pvData: pointer to a CRYPT_KEY_PROV_INFO Returns a pointer to a CRYPT_KEY_PROV_INFO.</term>
/// </item>
/// <item>
/// <term>CERT_KEY_SPEC_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a DWORD Returns a DWORD value specifying the private key obtained from CERT_KEY_CONTEXT_PROP_ID
/// property if it exists. Otherwise, if CERT_KEY_PROV_INFO_PROP_ID exists, it is the source of the dwKeySpec.
/// </term>
/// </item>
/// <item>
/// <term>CERT_MD5_HASH_PROP_ID</term>
/// <term>Data type for pvData: pointer to a BYTE array Returns the MD5 hash. If the hash does not exist, it is computed using CryptHashCertificate.</term>
/// </item>
/// <item>
/// <term>CERT_NEXT_UPDATE_LOCATION_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns the ASN.1 encoded CERT_ALT_NAME_INFO structure.
/// CERT_NEXT_UPDATE_LOCATION_PROP_ID is currently used only with CTLs.
/// </term>
/// </item>
/// <item>
/// <term>CERT_PVK_FILE_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns a null-terminated Unicode, wide character string specifying the file name
/// containing the private key associated with the certificate's public key.
/// </term>
/// </item>
/// <item>
/// <term>CERT_SHA1_HASH_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns the SHA1 hash. If the hash does not exist, it is computed using CryptHashCertificate.
/// </term>
/// </item>
/// <item>
/// <term>CERT_SIGN_HASH_CNG_ALG_PROP_ID</term>
/// <term>
/// Data type of pvData: Pointer to a null-terminated Unicode string. Returns the L”&lt;SIGNATURE&gt;/&lt;HASH&gt;” string
/// representing the certificate signature. The &lt;SIGNATURE&gt; value identifies the CNG public key algorithm. The following
/// algorithms are supported: The &lt;HASH&gt; value identifies the CNG hash algorithm. The following algorithms are supported: The
/// following are common examples: This property is also applicable to an OCSP response that has been converted to a CRL. Windows 8
/// and Windows Server 2012: Support for this property begins.
/// </term>
/// </item>
/// <item>
/// <term>CERT_SIGNATURE_HASH_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns the signature hash. If the hash does not exist, it is computed with
/// CryptHashToBeSigned. The length of the hash is 20 bytes for SHA and 16 for MD5.
/// </term>
/// </item>
/// </list>
/// <para>
/// For many property identifiers, pvData points to an array of bytes and not a CRYPT_DATA_BLOB as pointed to by the pvData
/// parameter in CertSetCRLContextProperty.
/// </para>
/// <para>For more information about each property identifier, see the documentation on the dwPropId parameter in CertSetCertificateContextProperty.</para>
/// </param>
/// <param name="pvData">
/// <para>
/// A pointer to a buffer to receive the data as determined by dwPropId. Structures pointed to by members of a structure returned
/// are also returned following the base structure. Therefore, the size contained in pcbData often exceed the size of the base structure.
/// </para>
/// <para>
/// This parameter can be <c>NULL</c> to set the size of the information for memory allocation purposes. For more information, see
/// Retrieving Data of Unknown Length.
/// </para>
/// </param>
/// <param name="pcbData">
/// <para>
/// A pointer to a <c>DWORD</c> value specifying the size, in bytes, of the buffer pointed to by the pvData parameter. When the
/// function returns, the <c>DWORD</c> value contains the number of bytes to be stored in the buffer.
/// </para>
/// <para>
/// <c>Note</c> When processing the data returned in the buffer, applications must use the actual size of the data returned. The
/// actual size can be slightly smaller than the size of the buffer specified on input. (On input, buffer sizes are usually
/// specified large enough to ensure that the largest possible output data fits in the buffer.) On output, the variable pointed to
/// by this parameter is updated to reflect the actual size of the data copied to the buffer.
/// </para>
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is <c>TRUE</c>.</para>
/// <para>If the function fails, the return value is <c>FALSE</c>.</para>
/// <para>
/// Note that errors from the called function CryptHashCertificate can be propagated to this function. For extended error
/// information, call GetLastError. Some possible error codes follow.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>CRYPT_E_NOT_FOUND</term>
/// <term>The CRL does not have the specified property.</term>
/// </item>
/// <item>
/// <term>ERROR_MORE_DATA</term>
/// <term>
/// If the buffer specified by the pvData parameter is not large enough to hold the returned data, the function sets the
/// ERROR_MORE_DATA code and stores the required buffer size, in bytes, in the variable pointed to by pcbData.
/// </term>
/// </item>
/// </list>
/// </returns>
// https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certgetcrlcontextproperty BOOL CertGetCRLContextProperty(
// PCCRL_CONTEXT pCrlContext, DWORD dwPropId, void *pvData, DWORD *pcbData );
[DllImport(Lib.Crypt32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("wincrypt.h", MSDNShortId = "16c2cc06-28fd-42d9-a377-0df2eaeeae56")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CertGetCRLContextProperty([In] PCCRL_CONTEXT pCrlContext, CertPropId dwPropId, [In, Out] IntPtr pvData, ref uint pcbData);
/// <summary>The <c>CertGetCTLContextProperty</c> function retrieves an extended property of a certificate trust list (CTL) context.</summary>
/// <param name="pCtlContext">A pointer to the CTL_CONTEXT structure.</param>
/// <param name="dwPropId">
/// <para>
/// Identifies the property to be retrieved. Currently defined identifiers and the data type to be returned in pvData are listed in
/// the following table.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>CERT_ACCESS_STATE_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a DWORD Returns a DWORD value indicating whether write operations to the certificate are
/// persisted. The DWORD value is not set if the certificate is in a memory store or in a registry-based store that is opened as read-only.
/// </term>
/// </item>
/// <item>
/// <term>CERT_ARCHIVED_PROP_ID</term>
/// <term>
/// Data type for pvData: NULL Indicates the certificate is skipped during enumerations. A certificate with this property set is
/// found with explicit search operations, such as those used to find a certificate with a specific hash or a serial number. No data
/// in pvData is associated with this property.
/// </term>
/// </item>
/// <item>
/// <term>CERT_AUTO_ENROLL_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns a null-terminated Unicode string naming the certificate type for which the
/// certificate has been auto enrolled.
/// </term>
/// </item>
/// <item>
/// <term>CERT_CTL_USAGE_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns an array of bytes containing an Abstract Syntax Notation One (ASN.1)
/// encoded CTL_USAGE structure.
/// </term>
/// </item>
/// <item>
/// <term>CERT_DESCRIPTION_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns the property displayed by the certificate UI. This property allows the
/// user to describe the certificate's use.
/// </term>
/// </item>
/// <item>
/// <term>CERT_ENHKEY_USAGE_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns an array of bytes containing an ASN.1 encoded CERT_ENHKEY_USAGE structure.
/// </term>
/// </item>
/// <item>
/// <term>CERT_FRIENDLY_NAME_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns a null-terminated Unicode character string that contains the display name
/// for the CTL.
/// </term>
/// </item>
/// <item>
/// <term>CERT_HASH_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns the SHA1 hash. If the hash does not exist, it is computed using CryptHashCertificate.
/// </term>
/// </item>
/// <item>
/// <term>CERT_KEY_CONTEXT_PROP_ID</term>
/// <term>Data type for pvData: pointer to a CERT_KEY_CONTEXT Returns a CERT_KEY_CONTEXT structure.</term>
/// </item>
/// <item>
/// <term>CERT_KEY_IDENTIFIER_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array If nonexistent, searches for the szOID_SUBJECT_KEY_IDENTIFIER extension. If that
/// fails, a SHA1 hash is done on the certificate's SubjectPublicKeyInfo member to produce the identifier values.
/// </term>
/// </item>
/// <item>
/// <term>CERT_KEY_PROV_HANDLE_PROP_ID</term>
/// <term>Data type for pvData: pointer to an HCRYPTPROV Returns the provider handle obtained from the CERT_KEY_CONTEXT_PROP_ID.</term>
/// </item>
/// <item>
/// <term>CERT_KEY_PROV_INFO_PROP_ID</term>
/// <term>Data type for pvData: pointer to a CRYPT_KEY_PROV_INFO structure Returns a pointer to a CRYPT_KEY_PROV_INFO.</term>
/// </item>
/// <item>
/// <term>CERT_KEY_SPEC_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a DWORD Returns a DWORD value specifying the private key obtained from CERT_KEY_CONTEXT_PROP_ID
/// property if it exists. Otherwise, if CERT_KEY_PROV_INFO_PROP_ID exists, it is the source of the dwKeySpec.
/// </term>
/// </item>
/// <item>
/// <term>CERT_MD5_HASH_PROP_ID</term>
/// <term>Data type for pvData: pointer to a BYTE array Returns the MD5 hash. If the hash does not exist, it is computed using CryptHashCertificate.</term>
/// </item>
/// <item>
/// <term>CERT_NEXT_UPDATE_LOCATION_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns the ASN.1 encoded CERT_ALT_NAME_INFO structure.
/// CERT_NEXT_UPDATE_LOCATION_PROP_ID is currently used only with CTLs.
/// </term>
/// </item>
/// <item>
/// <term>CERT_PVK_FILE_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns a null-terminated Unicode, wide character string specifying the file name
/// containing the private key associated with the certificate's public key.
/// </term>
/// </item>
/// <item>
/// <term>CERT_SHA1_HASH_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns the SHA1 hash. If the hash does not exist, it is computed using CryptHashCertificate.
/// </term>
/// </item>
/// <item>
/// <term>CERT_SIGNATURE_HASH_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Returns the signature hash. If the hash does not exist, it is computed with
/// CryptHashToBeSigned. The length of the hash is 20 bytes for SHA and 16 for MD5.
/// </term>
/// </item>
/// </list>
/// <para>
/// For all other property identifiers, pvData points to an array of bytes and not a CRYPT_DATA_BLOB as pointed to by the pvData
/// parameter in CertSetCertificateContextProperty.
/// </para>
/// <para>
/// For more information about each property identifier, see the documentation on the dwPropId parameter in
/// CertSetCertificateContextProperty. CERT_SHA1_HASH_PROP_ID and CERT_NEXT_UPDATE_LOCATION_PROP_ID are the predefined properties of
/// most interest.
/// </para>
/// </param>
/// <param name="pvData">
/// <para>
/// A pointer to a buffer to receive the data as determined by dwPropId. Structures pointed to by members of a structure returned
/// are also returned following the base structure. Therefore, the size contained in pcbData often exceed the size of the base structure.
/// </para>
/// <para>
/// This parameter can be <c>NULL</c> to set the size of the information for memory allocation purposes. For more information, see
/// Retrieving Data of Unknown Length.
/// </para>
/// </param>
/// <param name="pcbData">
/// <para>
/// A pointer to a <c>DWORD</c> value specifying the size, in bytes, of the buffer pointed to by the pvData parameter. When the
/// function returns, the <c>DWORD</c> value contains the number of bytes to be stored in the buffer.
/// </para>
/// <para>
/// <c>Note</c> When processing the data returned in the buffer, applications must use the actual size of the data returned. The
/// actual size can be slightly smaller than the size of the buffer specified on input. (On input, buffer sizes are usually
/// specified large enough to ensure that the largest possible output data fits in the buffer.) On output, the variable pointed to
/// by this parameter is updated to reflect the actual size of the data copied to the buffer.
/// </para>
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is <c>TRUE</c>.</para>
/// <para>If the function fails, the return value is <c>FALSE</c>.</para>
/// <para>
/// Errors from the called function, CryptHashCertificate, can be propagated to this function. For extended error information, call GetLastError.
/// </para>
/// <para>Some possible error codes follow.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>CRYPT_E_NOT_FOUND</term>
/// <term>The CTL does not have the specified property.</term>
/// </item>
/// <item>
/// <term>ERROR_MORE_DATA</term>
/// <term>
/// If the buffer specified by the pvData parameter is not large enough to hold the returned data, the function sets the
/// ERROR_MORE_DATA code and stores the required buffer size, in bytes, in the variable pointed to by pcbData.
/// </term>
/// </item>
/// </list>
/// </returns>
// https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certgetctlcontextproperty BOOL CertGetCTLContextProperty(
// PCCTL_CONTEXT pCtlContext, DWORD dwPropId, void *pvData, DWORD *pcbData );
[DllImport(Lib.Crypt32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("wincrypt.h", MSDNShortId = "16e45fe1-2710-4fa1-82da-c298645d7379")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CertGetCTLContextProperty([In] PCCTL_CONTEXT pCtlContext, CertPropId dwPropId, [In, Out] IntPtr pvData, ref uint pcbData);
/// <summary>The <c>CertSetCertificateContextProperty</c> function sets an extended property for a specified certificate context.</summary>
/// <param name="pCertContext">A pointer to a CERT_CONTEXT structure.</param>
/// <param name="dwPropId">
/// <para>
/// The property to be set. The value of dwPropId determines the type and content of the pvData parameter. Currently defined
/// identifiers and their related pvData types are as follows.
/// </para>
/// <para><c>Note</c> CRYPT_HASH_BLOB and CRYPT_DATA_BLOB are described in the CRYPT_INTEGER_BLOB topic.</para>
/// <para>CERT_ACCESS_STATE_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a <c>DWORD</c> value.</para>
/// <para>
/// Returns a <c>DWORD</c> value that indicates whether write operations to the certificate are persisted. The <c>DWORD</c> value is
/// not set if the certificate is in a memory store or in a registry-based store that is opened as read-only.
/// </para>
/// <para>CERT_AIA_URL_RETRIEVED_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_ARCHIVED_KEY_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_HASH_BLOB structure.</para>
/// <para>This property saves an encrypted key hash for the certificate context.</para>
/// <para>CERT_ARCHIVED_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>
/// Indicates that the certificate is skipped during enumerations. A certificate with this property set is still found with explicit
/// search operations, such as finding a certificate with a specific hash or a specific serial number. This property can be set to
/// the empty BLOB, .
/// </para>
/// <para>CERT_AUTHORITY_INFO_ACCESS_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_AUTO_ENROLL_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>
/// A property that is set after a certificate has been enrolled by using Auto Enroll. The CRYPT_DATA_BLOB structure pointed to by
/// pvData includes a null-terminated Unicode name of the certificate type for which the certificate has been auto enrolled. Any
/// subsequent calls to Auto Enroll for the certificate checks for this property to determine whether the certificate has been enrolled.
/// </para>
/// <para>CERT_AUTO_ENROLL_RETRY_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_BACKED_UP_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_CA_DISABLE_CRL_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>
/// Disables certificate revocation list (CRL) retrieval for certificates used by the certification authority (CA). If the CA
/// certificate contains this property, it must also include the <c>CERT_CA_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID</c> property.
/// </para>
/// <para>CERT_CA_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>
/// Contains the list of online certificate status protocol (OCSP) URLs to use for certificates issued by the CA certificate. The
/// array contents are the Abstract Syntax Notation One (ASN.1)-encoded bytes of an <c>X509_AUTHORITY_INFO_ACCESS</c> structure
/// where <c>pszAccessMethod</c> is set to <c>szOID_PKIX_OCSP</c>.
/// </para>
/// <para>CERT_CROSS_CERT_DIST_POINTS_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>
/// Sets the location of the cross certificates. This value is only applicable to certificates and not to certificate revocation
/// lists (CRLs) or certificate trust lists (CTLs). The CRYPT_DATA_BLOB structure contains an Abstract Syntax Notation One
/// (ASN.1)-encoded CROSS_CERT_DIST_POINTS_INFO structure that is encoded by using the CryptEncodeObject function with a
/// X509_CROSS_CERT_DIST_POINTS value for the lpszStuctType parameter.
/// </para>
/// <para>CERT_CTL_USAGE_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>
/// The CRYPT_DATA_BLOB structure contains an ASN.1-encoded CTL_USAGE structure. This structure is encoded by using the
/// CryptEncodeObject function with the X509_ENHANCED_KEY_USAGE value set.
/// </para>
/// <para>CERT_DATE_STAMP_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a <c>FILETIME</c> structure.</para>
/// <para>This property sets the time that the certificate was added to the store.</para>
/// <para>CERT_DESCRIPTION_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>
/// A property that is set and displayed by the certificate UI. This property allows the user to describe the certificate's use.
/// </para>
/// <para>CERT_EFS_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_ENHKEY_USAGE_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>
/// A property that indicates that the pvData parameter points to a CRYPT_DATA_BLOB structure that contains an ASN.1-encoded
/// CERT_ENHKEY_USAGE structure. This structure is encoded by using the CryptEncodeObject function with the X509_ENHANCED_KEY_USAGE
/// value set.
/// </para>
/// <para>CERT_ENROLLMENT_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>
/// Enrollment information of the pending request that contains RequestID, CADNSName, CAName, and DisplayName. The data format is
/// defined as follows.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Bytes</term>
/// <term>Contents</term>
/// </listheader>
/// <item>
/// <term>First 4 bytes</term>
/// <term>Pending request ID</term>
/// </item>
/// <item>
/// <term>Next 4 bytes</term>
/// <term>
/// CADNSName size, in characters, including the terminating null character, followed by CADNSName string with terminating null character
/// </term>
/// </item>
/// <item>
/// <term>Next 4 bytes</term>
/// <term>
/// CAName size, in characters, including the terminating null character, followed by CAName string with terminating null character
/// </term>
/// </item>
/// <item>
/// <term>Next 4 bytes</term>
/// <term>
/// DisplayName size, in characters, including the terminating null character, followed by DisplayName string with terminating null character
/// </term>
/// </item>
/// </list>
/// <para>CERT_EXTENDED_ERROR_INFO_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>This property sets a string that contains extended error information for the certificate context.</para>
/// <para>CERT_FORTEZZA_DATA_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_FRIENDLY_NAME_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>The CRYPT_DATA_BLOB structure contains the display name of the certificate.</para>
/// <para>CERT_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>This property is implicitly set by a call to the CertGetCertificateContextProperty function.</para>
/// <para>CERT_HCRYPTPROV_OR_NCRYPT_KEY_HANDLE_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an HCRYPTPROV_OR_NCRYPT_KEY_HANDLE data type.</para>
/// <para>
/// This property calls NCryptIsKeyHandle to determine whether this is an <c>NCRYPT_KEY_HANDLE</c>. For an <c>NCRYPT_KEY_HANDLE</c>,
/// sets <c>CERT_NCRYPT_KEY_HANDLE_PROP_ID</c>; otherwise, it sets <c>CERT_KEY_PROV_HANDLE_PROP_ID</c>.
/// </para>
/// <para>CERT_HCRYPTPROV_TRANSFER_PROP_ID</para>
/// <para>Sets the handle of the CAPI key associated with the certificate.</para>
/// <para>CERT_IE30_RESERVED_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>This property sets the MD5 hash of the public key associated with the private key used to sign this certificate.</para>
/// <para>CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>The CRYPT_DATA_BLOB structure contains the MD5 hash of the issuer name and serial number from this certificate.</para>
/// <para>CERT_KEY_CONTEXT_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CERT_KEY_CONTEXT structure.</para>
/// <para>
/// The structure specifies the certificate's private key. It contains both the HCRYPTPROV and key specification for the private
/// key. For more information about the <c>hCryptProv</c> member and dwFlags settings, see CERT_KEY_PROV_HANDLE_PROP_ID, later in
/// this topic.
/// </para>
/// <para>
/// <c>Note</c> More CERT_KEY_CONTEXT structure members can be added for this property. If so, the <c>cbSize</c> member value will
/// be adjusted accordingly. The <c>cbSize</c> member must be set to the size of the <c>CERT_KEY_CONTEXT</c> structure.
/// </para>
/// <para>CERT_KEY_IDENTIFIER_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>This property is typically implicitly set by a call to the CertGetCertificateContextProperty function.</para>
/// <para>CERT_KEY_PROV_HANDLE_PROP_ID</para>
/// <para>Data type of pvData: A HCRYPTPROV value.</para>
/// <para>
/// The HCRYPTPROV handle for the certificate's private key is set. The <c>hCryptProv</c> member of the CERT_KEY_CONTEXT structure
/// is updated if it exists. If it does not exist, it is created with <c>dwKeySpec</c> and initialized by
/// CERT_KEY_PROV_INFO_PROP_ID. If CERT_STORE_NO_CRYPT_RELEASE_FLAG is not set, the <c>hCryptProv</c> value is implicitly released
/// either when the property is set to <c>NULL</c> or on the final freeing of the CERT_CONTEXT structure.
/// </para>
/// <para>CERT_KEY_PROV_INFO_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_KEY_PROV_INFO structure.</para>
/// <para>The structure specifies the certificate's private key.</para>
/// <para>CERT_KEY_SPEC_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a <c>DWORD</c> value.</para>
/// <para>
/// The <c>DWORD</c> value that specifies the private key. The <c>dwKeySpec</c> member of the CERT_KEY_CONTEXT structure is updated
/// if it exists. If it does not, it is created with <c>hCryptProv</c> set to zero.
/// </para>
/// <para>CERT_MD5_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_HASH_BLOB structure.</para>
/// <para>This property is implicitly set by a call to the CertGetCertificateContextProperty function.</para>
/// <para>CERT_NCRYPT_KEY_HANDLE_PROP_ID</para>
/// <para>Data type of pvData: A pointer to an <c>NCRYPT_KEY_HANDLE</c> data type.</para>
/// <para>This property sets the <c>NCRYPT_KEY_HANDLE</c> for the certificate private key and sets the dwKeySpec to <c>CERT_NCRYPT_KEY_SPEC</c>.</para>
/// <para>CERT_NCRYPT_KEY_HANDLE_TRANSFER_PROP_ID</para>
/// <para>Sets the handle of the CNG key associated with the certificate.</para>
/// <para>CERT_NEW_KEY_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_NEXT_UPDATE_LOCATION_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>
/// The CRYPT_DATA_BLOB structure contains an ASN.1-encoded CERT_ALT_NAME_INFO structure that is encoded by using the
/// CryptEncodeObject function with the X509_ALTERNATE_NAME value set.
/// </para>
/// <para>CERT_NEXT_UPDATE_LOCATION_PROP_ID is currently used only with CTLs.</para>
/// <para>CERT_NO_AUTO_EXPIRE_CHECK_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_OCSP_CACHE_PREFIX_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_OCSP_RESPONSE_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>
/// This property sets the encoded online certificate status protocol (OCSP) response from a CERT_SERVER_OCSP_RESPONSE_CONTEXT for
/// this certificate.
/// </para>
/// <para>CERT_PUB_KEY_CNG_ALG_BIT_LENGTH_PROP_ID</para>
/// <para>Data type of pvData: Pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>This property is implicitly set by calling the CertGetCertificateContextProperty function.</para>
/// <para>
/// <c>Windows Server 2008 R2, Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 and Windows XP:</c> This
/// identifier is not supported.
/// </para>
/// <para>CERT_PUBKEY_ALG_PARA_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>
/// This property is used with public keys that support algorithm parameter inheritance. The data BLOB contains the ASN.1-encoded
/// PublicKey Algorithm parameters. For DSS, these are parameters encoded by using the CryptEncodeObject function. This is used only
/// if CMS_PKCS7 is defined.
/// </para>
/// <para>CERT_PUBKEY_HASH_RESERVED_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_PVK_FILE_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>
/// The CRYPT_DATA_BLOB structure specifies the name of a file that contains the private key associated with the certificate's
/// public key. Inside the <c>CRYPT_DATA_BLOB</c> structure, the <c>pbData</c> member is a pointer to a null-terminated Unicode
/// wide-character string, and the <c>cbData</c> member indicates the length of the string.
/// </para>
/// <para>CERT_RENEWAL_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>This property specifies the hash of the renewed certificate.</para>
/// <para>CERT_REQUEST_ORIGINATOR_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>
/// The CRYPT_DATA_BLOB structure contains a null-terminated Unicode string that contains the DNS computer name for the origination
/// of the certificate context request.
/// </para>
/// <para>CERT_ROOT_PROGRAM_CERT_POLICIES_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>
/// Returns a pointer to an encoded CERT_POLICIES_INFO structure that contains the application policies of the root certificate for
/// the context. This property can be decoded by using the CryptDecodeObject function with the lpszStructType parameter set to
/// <c>X509_CERT_POLICIES</c> and the dwCertEncodingType parameter set to a combination of <c>X509_ASN_ENCODING</c> bitwise <c>OR</c><c>PKCS_7_ASN_ENCODING</c>.
/// </para>
/// <para>CERT_ROOT_PROGRAM_NAME_CONSTRAINTS_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_SIGN_HASH_CNG_ALG_PROP_ID</para>
/// <para>Data type of pvData: Pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>This property is implicitly set by calling the CertGetCertificateContextProperty function.</para>
/// <para>
/// <c>Windows Server 2008 R2, Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 and Windows XP:</c> This
/// identifier is not supported.
/// </para>
/// <para>CERT_SHA1_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_HASH_BLOB structure.</para>
/// <para>This property is implicitly set by a call to the CertGetCertificateContextProperty function.</para>
/// <para>CERT_SIGNATURE_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_HASH_BLOB structure.</para>
/// <para>
/// If a signature hash does not exist, it is computed by using the CryptHashToBeSigned function. pvData points to an existing or
/// computed hash. Usually, the length of the hash is 20 bytes for SHA and 16 for MD5.
/// </para>
/// <para>CERT_SMART_CARD_DATA_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>This property sets the smart card data property of a smart card certificate context.</para>
/// <para>CERT_SMART_CARD_ROOT_INFO_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>This property sets the information property of a smart card root certificate context.</para>
/// <para>CERT_SOURCE_LOCATION_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_SOURCE_URL_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_SUBJECT_DISABLE_CRL_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_SUBJECT_INFO_ACCESS_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>
/// This property sets the subject information access extension of the certificate context as an encoded CERT_SUBJECT_INFO_ACCESS structure.
/// </para>
/// <para>CERT_SUBJECT_NAME_MD5_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>Returns an MD5 hash of the encoded subject name of the certificate context.</para>
/// <para>CERT_SUBJECT_OCSP_AUTHORITY_INFO_ACCESS_PROP_ID</para>
/// <para>This identifier is reserved.</para>
/// <para>CERT_SUBJECT_PUB_KEY_BIT_LENGTH_PROP_ID</para>
/// <para>Data type of pvData: Pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>This property is implicitly set by calling the CertGetCertificateContextProperty function.</para>
/// <para>
/// <c>Windows Server 2008 R2, Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 and Windows XP:</c> This
/// identifier is not supported.
/// </para>
/// <para>CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID</para>
/// <para>Data type of pvData: A pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>This property sets the MD5 hash of this certificate's public key.</para>
/// <para>pvData is a pointer to a CRYPT_DATA_BLOB structure.</para>
/// <para>
/// The user can define additional dwPropId types by using <c>DWORD</c> values from <c>CERT_FIRST_USER_PROP_ID</c> to
/// <c>CERT_LAST_USER_PROP_ID</c>. For all user-defined dwPropId types, pvData points to an encoded CRYPT_DATA_BLOB structure.
/// </para>
/// </param>
/// <param name="dwFlags">
/// <para>
/// CERT_STORE_NO_CRYPT_RELEASE_FLAG can be set for the CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_CONTEXT_PROP_ID dwPropId properties.
/// </para>
/// <para>
/// If the CERT_SET_PROPERTY_IGNORE_PERSIST_ERROR_FLAG value is set, any provider-write errors are ignored and the cached context's
/// properties are always set.
/// </para>
/// <para>If CERT_SET_PROPERTY_INHIBIT_PERSIST_FLAG is set, any context property set is not persisted.</para>
/// </param>
/// <param name="pvData">
/// <para>A pointer to a data type determined by the value of dwPropId.</para>
/// <para><c>Note</c> For any dwPropId, setting pvData to <c>NULL</c> deletes the property.</para>
/// </param>
/// <returns>
/// <para>If the function succeeds, the function returns <c>TRUE</c>.</para>
/// <para>
/// If the function fails, the function returns <c>FALSE</c>. For extended error information, call GetLastError. One possible error
/// code is the following.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>E_INVALIDARG</term>
/// <term>
/// The property is not valid. The identifier specified was greater than 0x0000FFFF, or, for the CERT_KEY_CONTEXT_PROP_ID property,
/// a cbSize member that is not valid was specified in the CERT_KEY_CONTEXT structure.
/// </term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>If a property already exists, its old value is replaced.</para>
/// <para>
/// Your code can use a macro to evaluate the class of hash for a certificate context. The Wincrypt.h header defines the following
/// macros for this purpose. These macros are used internally by the <c>CertSetCertificateContextProperty</c> function.
/// </para>
/// <para>
/// <c>IS_CERT_HASH_PROP_ID(X)</c><c>IS_PUBKEY_HASH_PROP_ID(X)</c><c>IS_CHAIN_HASH_PROP_ID(X)</c> Each macro takes the dwPropId (X)
/// value as input and evaluates to a Boolean value. The following table shows the dwPropId values that evaluate to <c>TRUE</c> for
/// each macro.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Macro</term>
/// <term>Evaluates to TRUE if dwPropId is</term>
/// </listheader>
/// <item>
/// <term>IS_CERT_HASH_PROP_ID(dwPropId)</term>
/// <term>CERT_SHA1_HASH_PROP_ID, CERT_MD5_HASH_PROP_ID, or CERT_SIGNATURE_HASH_PROP_ID</term>
/// </item>
/// <item>
/// <term>IS_PUBKEY_HASH_PROP_ID(dwPropId)</term>
/// <term>CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID or CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID</term>
/// </item>
/// <item>
/// <term>IS_CHAIN_HASH_PROP_ID(dwPropId)</term>
/// <term>
/// CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID, CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID, CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID,
/// or CERT_SUBJECT_NAME_MD5_HASH_PROP_ID
/// </term>
/// </item>
/// </list>
/// <para>
/// The <c>IS_STRONG_SIGN_PROP_ID(x)</c> macro evaluates to <c>TRUE</c> if the <c>CERT_SIGN_HASH_CNG_ALG_PROP_ID</c>,
/// <c>CERT_SUBJECT_PUB_KEY_BIT_LENGTH_PROP_ID</c>, or <c>CERT_PUB_KEY_CNG_ALG_BIT_LENGTH_PROP_ID</c> properties are set in the
/// dwPropId parameter.
/// </para>
/// <para>Examples</para>
/// <para>For an example that uses this function, see Example C Program: Getting and Setting Certificate Properties.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certsetcertificatecontextproperty BOOL
// CertSetCertificateContextProperty( PCCERT_CONTEXT pCertContext, DWORD dwPropId, DWORD dwFlags, const void *pvData );
[DllImport(Lib.Crypt32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("wincrypt.h", MSDNShortId = "b4a0c66d-997f-49cb-935a-9187320037f1")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CertSetCertificateContextProperty([In] PCCERT_CONTEXT pCertContext, CertPropId dwPropId, uint dwFlags, [In, Optional] IntPtr pvData);
/// <summary>
/// The <c>CertSetCRLContextProperty</c> function sets an extended property for the specified certificate revocation list (CRL) context.
/// </summary>
/// <param name="pCrlContext">A pointer to the CRL_CONTEXT structure.</param>
/// <param name="dwPropId">
/// <para>
/// Identifies the property to be set. The value of dwPropId determines the type and content of the pvData parameter. Currently
/// defined identifiers and the data type to be returned in pvData are listed in the following table.
/// </para>
/// <para>Usually, only the following properties are set:</para>
/// <list type="bullet">
/// <item>
/// <term>CERT_HASH_PROP_ID</term>
/// </item>
/// <item>
/// <term>CERT_SHA1_HASH_PROP_ID</term>
/// </item>
/// <item>
/// <term>CERT_MD5_HASH_PROP_ID</term>
/// </item>
/// <item>
/// <term>CERT_SIGNATURE_HASH_PROP_ID</term>
/// </item>
/// </list>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>CERT_ACCESS_STATE_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a DWORD Sets a DWORD value indicating whether write operations to the certificate are
/// persisted. The DWORD value is not set if the certificate is in a memory store or in a registry-based store that is opened as read-only.
/// </term>
/// </item>
/// <item>
/// <term>CERT_ARCHIVED_PROP_ID</term>
/// <term>
/// Data type for pvData: NULL Indicates the certificate is skipped during enumerations. A certificate with this property set is
/// found with explicit search operations, such as those used to find a certificate with a specific hash or a serial number. No data
/// in pvData is associated with this property.
/// </term>
/// </item>
/// <item>
/// <term>CERT_AUTO_ENROLL_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Sets a null-terminated Unicode string naming the certificate type for which the
/// certificate has been auto enrolled.
/// </term>
/// </item>
/// <item>
/// <term>CERT_CTL_USAGE_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Sets an array of bytes containing an Abstract Syntax Notation One (ASN.1) encoded
/// CTL_USAGE structure.
/// </term>
/// </item>
/// <item>
/// <term>CERT_DESCRIPTION_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Sets the property displayed by the certificate UI. This property allows the user
/// to describe the certificate's use.
/// </term>
/// </item>
/// <item>
/// <term>CERT_ENHKEY_USAGE_PROP_ID</term>
/// <term>Data type for pvData: Sets an array of bytes containing an ASN.1 encoded CERT_ENHKEY_USAGE structure.</term>
/// </item>
/// <item>
/// <term>CERT_FRIENDLY_NAME_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Sets a null-terminated Unicode character string that contains the display name for
/// the CRL.
/// </term>
/// </item>
/// <item>
/// <term>CERT_ISSUER_CHAIN_PUB_KEY_CNG_ALG_BIT_LENGTH_PROP_ID</term>
/// <term>
/// Data type for pvData: Pointer to a CRYPT_DATA_BLOB structure. Sets a string containing a set of
/// L"&lt;PUBKEY&gt;/&lt;BITLENGTH&gt;" public key algorithm and bit length pairs. The semicolon, L";", is used as the delimiter.
/// The &lt;PUBKEY&gt; value identifies the CNG public key algorithm. The following algorithms are supported: A
/// &lt;PUBKEY&gt;/&lt;BITLENGTH&gt; pair is set for each certificate in the CRL issuer chain excluding the leaf. This property can
/// be set when an OCSP response with an independent signer chain is converted to a CRL. The following is an example: : L"RSA/2048;RSA/4096"
/// </term>
/// </item>
/// <item>
/// <term>CERT_ISSUER_CHAIN_SIGN_HASH_CNG_ALG_PROP_ID</term>
/// <term>
/// Data type for pvData: Pointer to a CRYPT_DATA_BLOB structure. Sets a string that contains a set of
/// L"&lt;SIGNATURE&gt;/&lt;HASH&gt;" algorithm pairs. The semicolon, L";", is used as the delimiter between pairs. This property is
/// set only when an OCSP response is converted to a CRL. For a delegated OCSP signer certificate, only the algorithm pair for the
/// signer certificate is returned. For an independent OCSP signer certificate chain, an algorithm pair is returned for each
/// certificate in the chain excluding the root. The &lt;SIGNATURE&gt; value identifies the CNG public key algorithm. The following
/// algorithms are supported: The &lt;HASH&gt; value identifies the CNG hash algorithm. The following algorithms are supported: The
/// following is an example: This property is explicitly set by the verify revocation functions.
/// </term>
/// </item>
/// <item>
/// <term>CERT_ISSUER_PUB_KEY_BIT_LENGTH_PROP_ID</term>
/// <term>
/// Data type for pvData: Pointer to a CRYPT_DATA_BLOB structure. Sets the length, in bits, of the public key in the CRL issuer
/// certificate. This property is also applicable to an OCSP that has been converted to a CRL. This property is explicitly set by
/// the verify revocation functions. Windows 8 and Windows Server 2012: Support for this property begins.
/// </term>
/// </item>
/// <item>
/// <term>CERT_KEY_CONTEXT_PROP_ID</term>
/// <term>Data type for pvData: pointer to a CERT_KEY_CONTEXT Sets a CERT_KEY_CONTEXT structure.</term>
/// </item>
/// <item>
/// <term>CERT_KEY_IDENTIFIER_PROP_ID</term>
/// <term>Data type for pvData: pointer to a BYTE array</term>
/// </item>
/// <item>
/// <term>CERT_KEY_PROV_HANDLE_PROP_ID</term>
/// <term>Data type for pvData: pointer to an HCRYPTPROV Sets the provider handle obtained from the CERT_KEY_CONTEXT_PROP_ID.</term>
/// </item>
/// <item>
/// <term>CERT_KEY_PROV_INFO_PROP_ID</term>
/// <term>Data type for pvData: pointer to a CRYPT_KEY_PROV_INFO Sets a pointer to a CRYPT_KEY_PROV_INFO structure.</term>
/// </item>
/// <item>
/// <term>CERT_KEY_SPEC_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a DWORD Sets a DWORD value specifying the private key obtained from CERT_KEY_CONTEXT_PROP_ID
/// property if it exists. Otherwise, if CERT_KEY_PROV_INFO_PROP_ID exists, it is the source of the dwKeySpec.
/// </term>
/// </item>
/// <item>
/// <term>CERT_MD5_HASH_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Sets the MD5 hash. You can compute the hash by using the CryptHashCertificate function.
/// </term>
/// </item>
/// <item>
/// <term>CERT_NEXT_UPDATE_LOCATION_PROP_ID</term>
/// <term>Data type for pvData: pointer to a BYTE array Sets the ASN.1 encoded CERT_ALT_NAME_INFO structure on a CTL.</term>
/// </item>
/// <item>
/// <term>CERT_PVK_FILE_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Sets a null-terminated Unicode, wide character string specifying the name of the
/// file that contains the private key associated with the certificate's public key.
/// </term>
/// </item>
/// <item>
/// <term>CERT_SHA1_HASH_PROP_ID</term>
/// <term>Data type for pvData: pointer to a BYTE array Sets the SHA1 hash. You can compute the hash by using CryptHashCertificate.</term>
/// </item>
/// <item>
/// <term>CERT_SIGN_HASH_CNG_ALG_PROP_ID</term>
/// <term>
/// Data type of pvData: Pointer to a CRYPT_DATA_BLOB structure. Sets the L”&lt;SIGNATURE&gt;/&lt;HASH&gt;” string representing the
/// certificate signature. The &lt;SIGNATURE&gt; value identifies the CNG public key algorithm. The following algorithms are
/// supported: The &lt;HASH&gt; value identifies the CNG hash algorithm. The following algorithms are supported: The following are
/// common examples: This property is also applicable to an OCSP response that has been converted to a CRL. This property is
/// explicitly set by the verify revocation functions. Windows 8 and Windows Server 2012: Support for this property begins.
/// </term>
/// </item>
/// <item>
/// <term>CERT_SIGNATURE_HASH_PROP_ID</term>
/// <term>
/// Data type for pvData: pointer to a BYTE array Sets the signature hash. If the hash does not exist, it is computed with
/// CryptHashToBeSigned. The length of the hash is 20 bytes for SHA and 16 for MD5.
/// </term>
/// </item>
/// </list>
/// <para>
/// The user can define additional dwPropId types by using <c>DWORD</c> values from CERT_FIRST_USER_PROP_ID to
/// CERT_LAST_USER_PROP_ID. For all user-defined dwPropId types, pvData points to an encoded CRYPT_DATA_BLOB.
/// </para>
/// <para>For all the other property identifiers, pvData points to an encoded CRYPT_DATA_BLOB structure.</para>
/// </param>
/// <param name="dwFlags">
/// <para>
/// CERT_STORE_NO_CRYPT_RELEASE_FLAG can be set for the CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_CONTEXT_PROP_ID dwPropId properties.
/// </para>
/// <para>
/// If the CERT_SET_PROPERTY_IGNORE_PERSIST_ERROR_FLAG value is set, any provider-write errors are ignored and the cached context's
/// properties are always set.
/// </para>
/// <para>If the CERT_SET_PROPERTY_INHIBIT_PERSIST_FLAG is set, any property set is not persisted.</para>
/// </param>
/// <param name="pvData">
/// <para>A pointer to a data type that is determined by the value passed in dwPropId.</para>
/// <para><c>Note</c> For any dwPropId, setting pvData to <c>NULL</c> deletes the property.</para>
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is <c>TRUE</c>.</para>
/// <para>
/// If the function fails, the return value is <c>FALSE</c>. For extended error information, call GetLastError. One possible error
/// code is the following.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>E_INVALIDARG</term>
/// <term>
/// The property is not valid. The identifier specified was greater than 0x0000FFFF, or, for the CERT_KEY_CONTEXT_PROP_ID property,
/// a cbSize member that is not valid was specified in the CERT_KEY_CONTEXT structure.
/// </term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>If a property already exists, its old value is replaced.</para>
/// <para>Examples</para>
/// <para>For an example that uses this function, see Example C Program: Getting and Setting Certificate Properties.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certsetcrlcontextproperty BOOL CertSetCRLContextProperty(
// PCCRL_CONTEXT pCrlContext, DWORD dwPropId, DWORD dwFlags, const void *pvData );
[DllImport(Lib.Crypt32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("wincrypt.h", MSDNShortId = "7e4a0a39-ce55-4171-9b66-31c1c28d895f")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CertSetCRLContextProperty([In] PCCRL_CONTEXT pCrlContext, CertPropId dwPropId, uint dwFlags, [In, Optional] IntPtr pvData);
/// <summary>
/// The <c>CertSetCTLContextProperty</c> function sets an extended property for the specified certificate trust list (CTL) context.
/// </summary>
/// <param name="pCtlContext">A pointer to the CTL_CONTEXT structure.</param>
/// <param name="dwPropId">
/// <para>
/// Identifies the property to be set. The value of dwPropId determines the type and content of the pvData parameter. Currently
/// defined identifiers and their related pvData types are as follows.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>CERT_ARCHIVED_PROP_ID</term>
/// <term>
/// Data type of pvData: NULL Indicates the certificate is skipped during enumerations. A certificate with this property set is
/// still found with explicit search operations—such as finding a certificate with a specific hash or a specific serial number.
/// </term>
/// </item>
/// <item>
/// <term>CERT_AUTO_ENROLL_PROP_ID</term>
/// <term>
/// Data type of pvData: pointer to a CRYPT_DATA_BLOB Property set after a certificate has been enrolled using Auto Enroll. The
/// CRYPT_DATA_BLOB structure pointed to by pvData includes a null-terminated, Unicode name of the certificate type for which the
/// certificates has been auto enrolled. Any subsequent calls to Auto Enroll for the certificate checks for this property to
/// determine whether the certificate has been enrolled.
/// </term>
/// </item>
/// <item>
/// <term>CERT_CTL_USAGE_PROP_ID</term>
/// <term>
/// Data type of pvData: pointer to a CRYPT_DATA_BLOB pvData points to a CRYPT_DATA_BLOB structure containing an Abstract Syntax
/// Notation One (ASN.1) encoded CTL_USAGE structure. This structure was encoded using CryptEncodeObject with
/// X509_ENHANCED_KEY_USAGE value set.
/// </term>
/// </item>
/// <item>
/// <term>CERT_DESCRIPTION_PROP_ID</term>
/// <term>
/// Data type of pvData: pointer to a CRYPT_DATA_BLOB Property set and displayed by the certificate UI. This property allows the
/// user to describe the certificate's use.
/// </term>
/// </item>
/// <item>
/// <term>CERT_ENHKEY_USAGE_PROP_ID</term>
/// <term>
/// Data type of pvData: pointer to a CRYPT_DATA_BLOB The CRYPT_DATA_BLOB structure containing an ASN.1 encoded CERT_ENHKEY_USAGE
/// structure. This structure was encoded using CryptEncodeObject with X509_ENHANCED_KEY_USAGE value set.
/// </term>
/// </item>
/// <item>
/// <term>CERT_FRIENDLY_NAME_PROP_ID</term>
/// <term>Data type of pvData: pointer to a CRYPT_DATA_BLOB The CRYPT_DATA_BLOB structure specifies the display name of the certificate.</term>
/// </item>
/// <item>
/// <term>CERT_HASH_PROP_ID</term>
/// <term>Data type of pvData: pointer to a CRYPT_HASH_BLOB This property is implicitly set by a call to CertGetCertificateContextProperty.</term>
/// </item>
/// <item>
/// <term>CERT_KEY_CONTEXT_PROP_ID</term>
/// <term>
/// Data type of pvData: pointer to a CERT_KEY_CONTEXT The CERT_KEY_CONTEXT structure contains both the HCRYPTPROV value and the key
/// specification for the private key. For more information about the hCryptProv member and dwFlags settings, see
/// CERT_KEY_PROV_HANDLE_PROP_ID, following. Note that more CERT_KEY_CONTEXT structure members can be added for this property. If
/// so, the cbSize member value will be adjusted accordingly. The cbSize member must be set to the size of the CERT_KEY_CONTEXT structure
/// </term>
/// </item>
/// <item>
/// <term>CERT_KEY_IDENTIFIER_PROP_ID</term>
/// <term>Data type of pvData: pointer to a CRYPT_DATA_BLOB This property is typically implicitly set by a call to CertGetCertificateContextProperty.</term>
/// </item>
/// <item>
/// <term>CERT_KEY_PROV_HANDLE_PROP_ID</term>
/// <term>
/// Data type of pvData: pointer to a HCRYPTPROV An HCRYPTPROV handle for the certificate's private key is passed. The hCryptProv
/// member of the CERT_KEY_CONTEXT structure is updated if it exists. If it does not exist, it is created with dwKeySpec initialized
/// by CERT_KEY_PROV_INFO_PROP_ID. If CERT_STORE_NO_CRYPT_RELEASE_FLAG is not set, the hCryptProv value is implicitly released
/// either when the property is set to NULL or on the final freeing of the CERT_CONTEXT structure.
/// </term>
/// </item>
/// <item>
/// <term>CERT_KEY_PROV_INFO_PROP_ID</term>
/// <term>
/// Data type of pvData: pointer to a CRYPT_KEY_PROV_INFO The CRYPT_KEY_PROV_INFO structure specifies the certificate's private key.
/// </term>
/// </item>
/// <item>
/// <term>CERT_KEY_SPEC_PROP_ID</term>
/// <term>
/// Data type of pvData: pointer to a DWORD The DWORD value specifies the private key. The dwKeySpec member of the CERT_KEY_CONTEXT
/// structure is updated if it exists. If it does not, it is created with hCryptProv set to zero.
/// </term>
/// </item>
/// <item>
/// <term>CERT_MD5_HASH_PROP_ID</term>
/// <term>Data type of pvData: pointer to a CRYPT_HASH_BLOB This property is implicitly set by a call to CertGetCertificateContextProperty.</term>
/// </item>
/// <item>
/// <term>CERT_NEXT_UPDATE_LOCATION_PROP_ID</term>
/// <term>
/// Data type of pvData: pointer to a CRYPT_DATA_BLOB The CRYPT_DATA_BLOB structure contains an ASN.1 encoded CERT_ALT_NAME_INFO
/// structure encoded using CryptEncodeObject with the X509_ALTERNATE_NAME value set. CERT_NEXT_UPDATE_LOCATION_PROP_ID is currently
/// used only with CTLs.
/// </term>
/// </item>
/// <item>
/// <term>CERT_PVK_FILE_PROP_ID</term>
/// <term>
/// Data type of pvData: pointer to a CRYPT_DATA_BLOB The CRYPT_DATA_BLOB structure specifies the name of a file containing the
/// private key associated with the certificate's public key. Inside the CRYPT_DATA_BLOB structure, the pbData member is a pointer
/// to a null-terminated Unicode, wide-character string, and the cbData member indicates the length of the string.
/// </term>
/// </item>
/// <item>
/// <term>CERT_SHA1_HASH_PROP_ID</term>
/// <term>Data type of pvData: pointer to a CRYPT_HASH_BLOB This property is implicitly set by a call to CertGetCertificateContextProperty.</term>
/// </item>
/// <item>
/// <term>CERT_SIGNATURE_HASH_PROP_ID CRYPT_HASH_BLOB</term>
/// <term>
/// Data type of pvData: pointer to a CRYPT_HASH_BLOB If a signature hash does not exist, it is computed with CryptHashToBeSigned.
/// pvData points to an existing or computed hash. Usually, the length of the hash is 20 bytes for SHA and 16 for MD5.
/// </term>
/// </item>
/// </list>
/// <para>Typically, only the CERT_NEXT_UPDATE_LOCATION_PROP_ID property is set.</para>
/// <para>
/// Additional dwPropId types can be defined by the user using <c>DWORD</c> values from CERT_FIRST_USER_PROP_ID to
/// CERT_LAST_USER_PROP_ID. For all user-defined dwPropId types, pvData points to an encoded CRYPT_DATA_BLOB structure.
/// </para>
/// </param>
/// <param name="dwFlags">
/// <para>
/// CERT_STORE_NO_CRYPT_RELEASE_FLAG can be set for the CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_CONTEXT_PROP_ID dwPropId properties.
/// </para>
/// <para>
/// If the CERT_SET_PROPERTY_IGNORE_PERSIST_ERROR_FLAG value is set, any provider-write errors are ignored and the cached context's
/// properties are always set.
/// </para>
/// <para>If CERT_SET_PROPERTY_INHIBIT_PERSIST_FLAG is set, any property set is not persisted.</para>
/// </param>
/// <param name="pvData">
/// <para>A pointer to a data type that is determined by the value passed in dwPropId.</para>
/// <para><c>Note</c> For any dwPropId, setting pvData to <c>NULL</c> deletes the property.</para>
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is <c>TRUE</c>.</para>
/// <para>
/// If the function fails, the return value is <c>FALSE</c>. For extended error information, call GetLastError. One possible error
/// code is the following.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>E_INVALIDARG</term>
/// <term>Invalid property identifier. For details, see CertSetCertificateContextProperty.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>If a property already exists, its old value is replaced.</para>
/// <para>Examples</para>
/// <para>See Example C Program: Getting and Setting Certificate Properties.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certsetctlcontextproperty BOOL CertSetCTLContextProperty(
// PCCTL_CONTEXT pCtlContext, DWORD dwPropId, DWORD dwFlags, const void *pvData );
[DllImport(Lib.Crypt32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("wincrypt.h", MSDNShortId = "3af01ca6-6fa1-4510-872a-b5e13e07f49f")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CertSetCTLContextProperty([In] PCCTL_CONTEXT pCtlContext, CertPropId dwPropId, uint dwFlags, [In, Optional] IntPtr pvData);
}
}