diff --git a/src/System.Management.Automation/security/Authenticode.cs b/src/System.Management.Automation/security/Authenticode.cs index 2f3682d86f..47e0364bce 100644 --- a/src/System.Management.Automation/security/Authenticode.cs +++ b/src/System.Management.Automation/security/Authenticode.cs @@ -363,10 +363,21 @@ namespace System.Management.Automation 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,59 +589,33 @@ namespace System.Management.Automation 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) + Signature signature = null; + if (TryGetProviderSigner(wtd.hWVTStateData, out IntPtr pProvSigner, out X509Certificate2 timestamperCert)) { - IntPtr pProvSigner = - NativeMethods.WTHelperGetProvSignerFromChain(pProvData, 0, 0, 0); - if (pProvSigner != IntPtr.Zero) + // + // get cert of the signer + // + X509Certificate2 signerCert = GetCertFromChain(pProvSigner); + + if (signerCert != null) { - // - // get cert of the signer - // - signerCert = GetCertFromChain(pProvSigner); - - if (signerCert != null) + if (timestamperCert != null) { - 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; + signature = new Signature(filePath, + error, + signerCert, + timestamperCert); } + else + { + signature = new Signature(filePath, + error, + signerCert); + } + + signature.SignatureType = SignatureType.Authenticode; } } @@ -644,6 +629,44 @@ namespace System.Management.Automation 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(wvtStateData); +#pragma warning enable 56523 + + if (pProvData != IntPtr.Zero) + { + pProvSigner = + NativeMethods.WTHelperGetProvSignerFromChain(pProvData, 0, 0, 0); + + if (pProvSigner != IntPtr.Zero) + { + NativeMethods.CRYPT_PROVIDER_SGNR provSigner = + (NativeMethods.CRYPT_PROVIDER_SGNR) + ClrFacade.PtrToStructure(pProvSigner); + if (provSigner.csCounterSigners == 1) + { + // + // time stamper cert available + // + timestamperCert = GetCertFromChain(provSigner.pasCounterSigners); + } + + return true; + } + } + + return false; + } + [ArchitectureSensitive] private static DWORD GetLastWin32Error() {