diff --git a/src/System.Management.Automation/security/Authenticode.cs b/src/System.Management.Automation/security/Authenticode.cs index e8ed6e1dc75..e6a5168b73d 100644 --- a/src/System.Management.Automation/security/Authenticode.cs +++ b/src/System.Management.Automation/security/Authenticode.cs @@ -363,10 +363,21 @@ private static Signature GetSignatureFromCatalog(string filename) DWORD error = GetErrorFromSignatureState(sigInfo.nSignatureState); X509Certificate2 cert = null; + if (ppCertContext != IntPtr.Zero) { cert = new X509Certificate2(ppCertContext); - signature = new Signature(filename, error, cert); + + // Get the time stamper certificate if available + TryGetProviderSigner(phStateData, out IntPtr pProvSigner, out X509Certificate2 timestamperCert); + if (timestamperCert != null) + { + signature = new Signature(filename, error, cert, timestamperCert); + } + else + { + signature = new Signature(filename, error, cert); + } switch (sigInfo.nSignatureType) { @@ -578,70 +589,82 @@ private static Signature GetSignatureFromWintrustData( DWORD error, NativeMethods.WINTRUST_DATA wtd) { + s_tracer.WriteLine("GetSignatureFromWintrustData: error: {0}", error); + Signature signature = null; - X509Certificate2 signerCert = null; - X509Certificate2 timestamperCert = null; + if (TryGetProviderSigner(wtd.hWVTStateData, out IntPtr pProvSigner, out X509Certificate2 timestamperCert)) + { + // + // get cert of the signer + // + X509Certificate2 signerCert = GetCertFromChain(pProvSigner); - s_tracer.WriteLine("GetSignatureFromWintrustData: error: {0}", error); + if (signerCert != null) + { + 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; + } + + [ArchitectureSensitive] + 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(wtd.hWVTStateData); + NativeMethods.WTHelperProvDataFromStateData(wvtStateData); #pragma warning enable 56523 if (pProvData != IntPtr.Zero) { - IntPtr pProvSigner = + 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(pProvSigner); + if (provSigner.csCounterSigners == 1) { - NativeMethods.CRYPT_PROVIDER_SGNR provSigner = - (NativeMethods.CRYPT_PROVIDER_SGNR) - ClrFacade.PtrToStructure(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; + // + // time stamper cert available + // + timestamperCert = GetCertFromChain(provSigner.pasCounterSigners); } - } - } - Diagnostics.Assert(((error == 0) && (signature != null)) || (error != 0), "GetSignatureFromWintrustData: general crypto failure"); - - if ((signature == null) && (error != 0)) - { - signature = new Signature(filePath, error); + return true; + } } - return signature; + return false; } [ArchitectureSensitive]