mirror of
https://github.com/PowerShell/PowerShell
synced 2026-06-08 12:12:50 +00:00
Add missing timestamper cert to the newer catalog signing APIs for Get-AuthenticodeSignature (#4061)
* Fixed missing functionality to add timestamper cert for the newer catalog signing APIs for Get-AuthenticodeSignature
This commit is contained in:
committed by
Mike Richmond
parent
e2e07b1830
commit
2ee9705751
@@ -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<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;
|
||||
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<NativeMethods.CRYPT_PROVIDER_SGNR>(pProvSigner);
|
||||
if (provSigner.csCounterSigners == 1)
|
||||
{
|
||||
//
|
||||
// time stamper cert available
|
||||
//
|
||||
timestamperCert = GetCertFromChain(provSigner.pasCounterSigners);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
[ArchitectureSensitive]
|
||||
private static DWORD GetLastWin32Error()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user