/// <summary> /// Helper method to verify that published mp, mpb, or cabinet files have a valid authenticode signature /// </summary> /// <param name="filePath">Path to the file to check the signature on.</param> /// <returns>WinTrustData object</returns> private static WinTrustData VerifyFileAuthenticodeSignatureHelper(string filePath, Tracing trace) { WinTrustData trustData = null; WinTrustFileInfo fileInfo = new WinTrustFileInfo(filePath); WINTRUST_SIGNATURE_SETTINGS signatureSettings = null; WinVerifyTrustResult result; if (Utility.IsWin8OrAbove()) { // On Windows 8 and above we have the APIs to enforce stronger checks const string szOID_CERT_STRONG_SIGN_OS_1 = "1.3.6.1.4.1.311.72.1.1"; //this specifies to enforce SHA-2 based hashes and other strong key requirements signatureSettings = new WINTRUST_SIGNATURE_SETTINGS(new CERT_STRONG_SIGN_PARA(szOID_CERT_STRONG_SIGN_OS_1)); trustData = new Win8TrustData(fileInfo, signatureSettings); } else { // no signature settings trustData = new WinTrustData(filePath); } try { result = UnsafeNativeMethods.WinVerifyTrust( IntPtr.Zero, UnsafeNativeMethods.WINTRUST_ACTION_GENERIC_VERIFY_V2, trustData); if (result == WinVerifyTrustResult.FileNotSigned) { throw new VerificationException(string.Format(CultureInfo.CurrentCulture, "File {0} does not have a valid authenticode signature.", filePath)); } else if (result != WinVerifyTrustResult.Success) { var winTrustResultErrorString = String.Format("{0} ({1})", GetVerboseWinVerifyTrustResultErrorString(result), ConvertWinVerifyTrustResultToHex(result)); throw new VerificationException(string.Format(CultureInfo.CurrentCulture, "WinVerifyTrustWrapper on file {0} failed with unexpected error: {1}", filePath, winTrustResultErrorString)); } } catch (Exception ex) { trace.Error(String.Format("Error occurred while calling WinVerifyTrust: {0}", ex)); // free all objects (trustData and signatureSettings) if (signatureSettings != null) { signatureSettings.Dispose(); } trustData.Dispose(); throw; } trace.Info(String.Format("File {0} has a valid authenticode signature.", filePath)); // only free signatureSettings if (signatureSettings != null) { signatureSettings.Dispose(); // zero out the psignature pointer in trustData to be safe Marshal.FreeHGlobal(((Win8TrustData)trustData).pSignatureSettings); ((Win8TrustData)trustData).pSignatureSettings = IntPtr.Zero; } return(trustData); }
internal static extern WinVerifyTrustResult Win8VerifyTrust( IntPtr hwnd, [MarshalAs(UnmanagedType.LPStruct)] Guid pgActionID, [In, Out] Win8TrustData pWVTData);