Beispiel #1
0
        private static bool TryGetProviderSigner(IntPtr wvtStateData, out IntPtr pProvSigner, out X509Certificate2 timestamperCert)
        {
            pProvSigner     = IntPtr.Zero;
            timestamperCert = null;

            // The GetLastWin32Error of this is checked, but PreSharp doesn't seem to be
            // able to see that.
#pragma warning disable 56523
            IntPtr pProvData =
                NativeMethods.WTHelperProvDataFromStateData(wvtStateData);
#pragma warning restore 56523

            if (pProvData != IntPtr.Zero)
            {
                pProvSigner =
                    NativeMethods.WTHelperGetProvSignerFromChain(pProvData, 0, 0, 0);

                if (pProvSigner != IntPtr.Zero)
                {
                    NativeMethods.CRYPT_PROVIDER_SGNR provSigner =
                        Marshal.PtrToStructure <NativeMethods.CRYPT_PROVIDER_SGNR>(pProvSigner);
                    if (provSigner.csCounterSigners == 1)
                    {
                        //
                        // time stamper cert available
                        //
                        timestamperCert = GetCertFromChain(provSigner.pasCounterSigners);
                    }

                    return(true);
                }
            }

            return(false);
        }
        private static Signature GetSignatureFromWintrustData(
            string filePath,
            DWORD error,
            NativeMethods.WINTRUST_DATA wtd)
        {
            Signature        signature       = null;
            X509Certificate2 signerCert      = null;
            X509Certificate2 timestamperCert = null;

            s_tracer.WriteLine("GetSignatureFromWintrustData: error: {0}", error);

            // The GetLastWin32Error of this is checked, but PreSharp doesn't seem to be
            // able to see that.
#pragma warning disable 56523
            IntPtr pProvData =
                NativeMethods.WTHelperProvDataFromStateData(wtd.hWVTStateData);
#pragma warning enable 56523

            if (pProvData != IntPtr.Zero)
            {
                IntPtr pProvSigner =
                    NativeMethods.WTHelperGetProvSignerFromChain(pProvData, 0, 0, 0);
                if (pProvSigner != IntPtr.Zero)
                {
                    //
                    // get cert of the signer
                    //
                    signerCert = GetCertFromChain(pProvSigner);

                    if (signerCert != null)
                    {
                        NativeMethods.CRYPT_PROVIDER_SGNR provSigner =
                            (NativeMethods.CRYPT_PROVIDER_SGNR)
                            ClrFacade.PtrToStructure <NativeMethods.CRYPT_PROVIDER_SGNR>(pProvSigner);
                        if (provSigner.csCounterSigners == 1)
                        {
                            //
                            // time stamper cert available
                            //
                            timestamperCert = GetCertFromChain(provSigner.pasCounterSigners);
                        }

                        if (timestamperCert != null)
                        {
                            signature = new Signature(filePath,
                                                      error,
                                                      signerCert,
                                                      timestamperCert);
                        }
                        else
                        {
                            signature = new Signature(filePath,
                                                      error,
                                                      signerCert);
                        }

                        signature.SignatureType = SignatureType.Authenticode;
                    }
                }
            }

            Diagnostics.Assert(((error == 0) && (signature != null)) || (error != 0), "GetSignatureFromWintrustData: general crypto failure");

            if ((signature == null) && (error != 0))
            {
                signature = new Signature(filePath, error);
            }

            return(signature);
        }