94 public unsafe
static ChainPal BuildChain(
bool useMachineContext,
ICertificatePal cert,
X509Certificate2Collection extraStore,
OidCollection applicationPolicy,
OidCollection certificatePolicy,
X509RevocationMode revocationMode,
X509RevocationFlag revocationFlag,
X509Certificate2Collection customTrustStore,
X509ChainTrustMode trustMode,
DateTime verificationTime,
TimeSpan timeout,
bool disableAia)
102 using SafeHandle safeHandle = applicationPolicy.ToLpstrArray(out numOids);
103 if (!safeHandle.IsInvalid)
106 pChainPara.RequestedUsage.Usage.cUsageIdentifier = numOids;
107 pChainPara.RequestedUsage.Usage.rgpszUsageIdentifier = safeHandle.DangerousGetHandle();
110 using SafeHandle safeHandle2 = certificatePolicy.ToLpstrArray(out numOids2);
111 if (!safeHandle2.IsInvalid)
114 pChainPara.RequestedIssuancePolicy.Usage.cUsageIdentifier = numOids2;
115 pChainPara.RequestedIssuancePolicy.Usage.rgpszUsageIdentifier = safeHandle2.DangerousGetHandle();
117 pChainPara.dwUrlRetrievalTimeout = (int)
Math.
Floor(
timeout.TotalMilliseconds);
120 if (!global::Interop.crypt32.CertGetCertificateChain(safeChainEngineHandle.DangerousGetHandle(), certificatePal.
CertContext, &fILETIME, hStore, ref pChainPara, dwFlags,
IntPtr.
Zero, out var ppChainContext))
124 return new ChainPal(ppChainContext);
154 switch (revocationMode)
157 return certChainFlags;
159 certChainFlags |=
CertChainFlags.CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY;
162 return revocationFlag
switch
164 X509RevocationFlag.EndCertificateOnly => certChainFlags |
CertChainFlags.CERT_CHAIN_REVOCATION_CHECK_END_CERT,
165 X509RevocationFlag.EntireChain => certChainFlags |
CertChainFlags.CERT_CHAIN_REVOCATION_CHECK_CHAIN,
166 _ => certChainFlags |
CertChainFlags.CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT,
226 for (uint num2 = (uint)dwStatus; num2 != 0; num2 >>= 1)
228 if ((num2 & (
true ? 1u : 0u)) != 0)
236 for (
int i = 0; i < array2.Length; i++)
239 if ((dwStatus & x509ChainErrorMapping.
Win32Flag) != 0)
241 array[num3].StatusInformation = x509ChainErrorMapping.
Message;
244 dwStatus &= ~x509ChainErrorMapping.Win32Flag;
248 for (uint num5 = (uint)dwStatus; num5 != 0; num5 >>= 1)
250 if ((num5 & (
true ? 1u : 0u)) != 0)