private static DWORD GetWinTrustData(string fileName, string fileContent, out NativeMethods.WINTRUST_DATA wtData) { DWORD dwResult = Win32Errors.E_FAIL; IntPtr WINTRUST_ACTION_GENERIC_VERIFY_V2 = IntPtr.Zero; IntPtr wtdBuffer = IntPtr.Zero; Guid actionVerify = new Guid("00AAC56B-CD44-11d0-8CC2-00C04FC295EE"); try { WINTRUST_ACTION_GENERIC_VERIFY_V2 = Marshal.AllocCoTaskMem(Marshal.SizeOf(actionVerify)); Marshal.StructureToPtr(actionVerify, WINTRUST_ACTION_GENERIC_VERIFY_V2, false); NativeMethods.WINTRUST_DATA wtd; if (fileContent == null) { NativeMethods.WINTRUST_FILE_INFO wfi = NativeMethods.InitWintrustFileInfoStruct(fileName); wtd = NativeMethods.InitWintrustDataStructFromFile(wfi); } else { NativeMethods.WINTRUST_BLOB_INFO wbi = NativeMethods.InitWintrustBlobInfoStruct(fileName, fileContent); wtd = NativeMethods.InitWintrustDataStructFromBlob(wbi); } wtdBuffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(wtd)); Marshal.StructureToPtr(wtd, wtdBuffer, false); // The result is returned to the caller, and handled generically. // Disable the PreFast check for Win32 error codes, as we don't care. #pragma warning disable 56523 dwResult = NativeMethods.WinVerifyTrust( IntPtr.Zero, WINTRUST_ACTION_GENERIC_VERIFY_V2, wtdBuffer); #pragma warning enable 56523 wtData = Marshal.PtrToStructure <NativeMethods.WINTRUST_DATA>(wtdBuffer); } finally { Marshal.DestroyStructure <Guid>(WINTRUST_ACTION_GENERIC_VERIFY_V2); Marshal.FreeCoTaskMem(WINTRUST_ACTION_GENERIC_VERIFY_V2); Marshal.DestroyStructure <NativeMethods.WINTRUST_DATA>(wtdBuffer); Marshal.FreeCoTaskMem(wtdBuffer); } return(dwResult); }
public StatusValue Verify() { var trustFileInfoPointer = default(IntPtr); var trustDataPointer = default(IntPtr); try { var fileInfo = new FileInfo(FilePath); if (!fileInfo.Exists) { Status = StatusValue.FileNotExist; return(Status); } if (fileInfo.Length == 0) { Status = StatusValue.FileEmpty; return(Status); } if (RequireThumbprintMatch) { if (string.IsNullOrEmpty(ThumbprintToMatch)) { Status = StatusValue.NoThumbprintToMatch; return(Status); } var certificate2 = new X509Certificate2(X509Certificate.CreateFromSignedFile(FilePath)); _thumbprint = certificate2.Thumbprint; if (_thumbprint != ThumbprintToMatch) { Status = StatusValue.ThumbprintNotMatch; return(Status); } } var trustFileInfo = new NativeMethods.WINTRUST_FILE_INFO { pcwszFilePath = FilePath }; trustFileInfoPointer = Marshal.AllocCoTaskMem(Marshal.SizeOf(trustFileInfo)); Marshal.StructureToPtr(trustFileInfo, trustFileInfoPointer, false); var trustData = new NativeMethods.WINTRUST_DATA { dwUIChoice = (uint)Display, fdwRevocationChecks = NativeMethods.WTD_REVOKE_WHOLECHAIN, dwUnionChoice = NativeMethods.WTD_CHOICE_FILE, pFile = trustFileInfoPointer, dwStateAction = NativeMethods.WTD_STATEACTION_IGNORE, dwProvFlags = NativeMethods.WTD_DISABLE_MD2_MD4, dwUIContext = (uint)DisplayContext }; trustDataPointer = Marshal.AllocCoTaskMem(Marshal.SizeOf(trustData)); Marshal.StructureToPtr(trustData, trustDataPointer, false); var windowHandle = DisplayParentForm?.Handle ?? IntPtr.Zero; _trustProviderErrorCode = NativeMethods.WinVerifyTrust(windowHandle, NativeMethods.WINTRUST_ACTION_GENERIC_VERIFY_V2, trustDataPointer); // ReSharper disable once SwitchStatementMissingSomeCases switch (_trustProviderErrorCode) { case NativeMethods.TRUST_E_NOSIGNATURE: Status = StatusValue.NoSignature; break; case NativeMethods.TRUST_E_SUBJECT_NOT_TRUSTED: break; } if (_trustProviderErrorCode != 0) { Status = StatusValue.TrustProviderError; return(Status); } Status = StatusValue.Verified; return(Status); } catch (Exception ex) { if (ex is CryptographicException) { var hResultProperty = ex.GetType().GetProperty("HResult", BindingFlags.NonPublic | BindingFlags.Instance); if (hResultProperty != null) { var hResult = Convert.ToInt32(hResultProperty.GetValue(ex, null)); if (hResult == NativeMethods.CRYPT_E_NO_MATCH) { Status = StatusValue.NoSignature; return(Status); } } } // other exception, or hResultProperty is null or is not CRYPT_E_NO_MATCH Status = StatusValue.UnhandledException; Exception = ex; return(Status); } finally { if (trustDataPointer != IntPtr.Zero) { Marshal.FreeCoTaskMem(trustDataPointer); } if (trustFileInfoPointer != IntPtr.Zero) { Marshal.FreeCoTaskMem(trustFileInfoPointer); } } }
public StatusValue Verify() { var trustFileInfoPointer = default(IntPtr); var trustDataPointer = default(IntPtr); try { var fileInfo = new FileInfo(FilePath); if (!fileInfo.Exists) { Status = StatusValue.FileNotExist; return Status; } if (fileInfo.Length == 0) { Status = StatusValue.FileEmpty; return Status; } if (RequireThumbprintMatch) { if (string.IsNullOrEmpty(ThumbprintToMatch)) { Status = StatusValue.NoThumbprintToMatch; return Status; } var certificate = X509Certificate.CreateFromSignedFile(FilePath); var certificate2 = new X509Certificate2(certificate); _thumbprint = certificate2.Thumbprint; if (_thumbprint != ThumbprintToMatch) { Status = StatusValue.ThumbprintNotMatch; return Status; } } var trustFileInfo = new NativeMethods.WINTRUST_FILE_INFO {pcwszFilePath = FilePath}; trustFileInfoPointer = Marshal.AllocCoTaskMem(Marshal.SizeOf(trustFileInfo)); Marshal.StructureToPtr(trustFileInfo, trustFileInfoPointer, false); var trustData = new NativeMethods.WINTRUST_DATA { dwUIChoice = (uint) Display, fdwRevocationChecks = NativeMethods.WTD_REVOKE_WHOLECHAIN, dwUnionChoice = NativeMethods.WTD_CHOICE_FILE, pFile = trustFileInfoPointer, dwStateAction = NativeMethods.WTD_STATEACTION_IGNORE, dwProvFlags = NativeMethods.WTD_DISABLE_MD2_MD4, dwUIContext = (uint) DisplayContext }; trustDataPointer = Marshal.AllocCoTaskMem(Marshal.SizeOf(trustData)); Marshal.StructureToPtr(trustData, trustDataPointer, false); var windowHandle = DisplayParentForm?.Handle ?? IntPtr.Zero; _trustProviderErrorCode = NativeMethods.WinVerifyTrust(windowHandle, NativeMethods.WINTRUST_ACTION_GENERIC_VERIFY_V2, trustDataPointer); switch (_trustProviderErrorCode) { case NativeMethods.TRUST_E_NOSIGNATURE: Status = StatusValue.NoSignature; break; case NativeMethods.TRUST_E_SUBJECT_NOT_TRUSTED: break; } if (_trustProviderErrorCode != 0) { Status = StatusValue.TrustProviderError; return Status; } Status = StatusValue.Verified; return Status; } catch (CryptographicException ex) { var hResultProperty = ex.GetType().GetProperty("HResult", BindingFlags.NonPublic | BindingFlags.Instance); var hResult = Convert.ToInt32(hResultProperty.GetValue(ex, null)); if (hResult == NativeMethods.CRYPT_E_NO_MATCH) { Status = StatusValue.NoSignature; return Status; } else { Status = StatusValue.UnhandledException; Exception = ex; return Status; } } catch (Exception ex) { Status = StatusValue.UnhandledException; Exception = ex; return Status; } finally { if (trustDataPointer != IntPtr.Zero) { Marshal.FreeCoTaskMem(trustDataPointer); } if (trustFileInfoPointer != IntPtr.Zero) { Marshal.FreeCoTaskMem(trustFileInfoPointer); } } }