/// <summary> /// Initializes a new <see cref="CertificateChain"/> instance from a <see cref="Certificate"/>. /// </summary> /// <param name="cert">The certificate for which a chain is being built.</param> /// <param name="additional">Any additional store to be searched for supporting certificates and CTLs.</param> /// <param name="options">Additional certificate chain options.</param> /// <remarks><paramref name="cert"/> will always be the end certificate.</remarks> /// <exception cref="ArgumentNullException"><paramref name="cert"/> is a null reference (<b>Nothing</b> in Visual Basic).</exception> /// <exception cref="CertificateException">An error occurs while building the certificate chain.</exception> public CertificateChain(Certificate cert, CertificateStore additional, CertificateChainOptions options) { if (cert == null) { throw new ArgumentNullException(); } IntPtr addstore = additional == null ? IntPtr.Zero : additional.Handle; ChainParameters para = new ChainParameters(); para.cbSize = Marshal.SizeOf(typeof(ChainParameters)); para.RequestedUsagecUsageIdentifier = 0; para.RequestedUsagedwType = 0; para.RequestedUsagergpszUsageIdentifier = IntPtr.Zero; if (SspiProvider.CertGetCertificateChain(IntPtr.Zero, cert.Handle, IntPtr.Zero, addstore, ref para, (int)options, IntPtr.Zero, ref m_Handle) == 0) { throw new CertificateException("Unable to find the certificate chain."); } m_Certificate = cert; }