Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
                }
            }
        }
Esempio n. 3
0
		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);
				}
			}
		}