Team Ai
Datasetpublic

MegaBites-AI/Windows-powershell

sourceHugging Facemitupdated 6mo agoView on Hugging Face
0likes372downloads
WinTrust.cs441 linesDownload Raw Back to Win32Native
1// Copyright (c) Microsoft Corporation.2// Licensed under the MIT License.3 4using System.ComponentModel;5using System.Runtime.InteropServices;6 7namespace System.Management.Automation.Win32Native;8 9internal class SafeCATAdminHandle : SafeHandle10{11    internal SafeCATAdminHandle() : base(IntPtr.Zero, true) { }12 13    public override bool IsInvalid => handle == IntPtr.Zero;14 15    protected override bool ReleaseHandle() => WinTrustMethods.CryptCATAdminReleaseContext(handle, 0);16}17 18internal class SafeCATHandle : SafeHandle19{20    internal SafeCATHandle() : base(IntPtr.Zero, true) { }21 22    public override bool IsInvalid => handle == (IntPtr)(-1);23 24    protected override bool ReleaseHandle() => WinTrustMethods.CryptCATClose(handle);25}26 27internal class SafeCATCDFHandle : SafeHandle28{29    internal SafeCATCDFHandle() : base(IntPtr.Zero, true) { }30 31    public override bool IsInvalid => handle == IntPtr.Zero;32 33    protected override bool ReleaseHandle() => WinTrustMethods.CryptCATCDFClose(handle);34}35 36[Flags]37internal enum WinTrustUIChoice38{39    WTD_UI_ALL = 1,40    WTD_UI_NONE = 2,41    WTD_UI_NOBAD = 3,42    WTD_UI_NOGOOD = 443}44 45[Flags]46internal enum WinTrustUnionChoice47{48    WTD_CHOICE_FILE = 1,49    WTD_CHOICE_CATALOG = 2,50    WTD_CHOICE_BLOB = 3,51    WTD_CHOICE_SIGNER = 4,52    WTD_CHOICE_CERT = 5,53}54 55[Flags]56internal enum WinTrustAction57{58    WTD_STATEACTION_IGNORE = 0x00000000,59    WTD_STATEACTION_VERIFY = 0x00000001,60    WTD_STATEACTION_CLOSE = 0x00000002,61    WTD_STATEACTION_AUTO_CACHE = 0x00000003,62    WTD_STATEACTION_AUTO_CACHE_FLUSH = 0x0000000463}64 65[Flags]66internal enum WinTrustProviderFlags67{68    WTD_PROV_FLAGS_MASK = 0x0000FFFF,69    WTD_USE_IE4_TRUST_FLAG = 0x00000001,70    WTD_NO_IE4_CHAIN_FLAG = 0x00000002,71    WTD_NO_POLICY_USAGE_FLAG = 0x00000004,72    WTD_REVOCATION_CHECK_NONE = 0x00000010,73    WTD_REVOCATION_CHECK_END_CERT = 0x00000020,74    WTD_REVOCATION_CHECK_CHAIN = 0x00000040,75    WTD_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT = 0x00000080,76    WTD_SAFER_FLAG = 0x00000100,77    WTD_HASH_ONLY_FLAG = 0x00000200,78    WTD_USE_DEFAULT_OSVER_CHECK = 0x00000400,79    WTD_LIFETIME_SIGNING_FLAG = 0x00000800,80    WTD_CACHE_ONLY_URL_RETRIEVAL = 0x0000100081}82 83/// <summary>84/// Pinvoke methods from wintrust.dll85/// </summary>86internal static class WinTrustMethods87{88    private const string WinTrustDll = "wintrust.dll";89 90    [StructLayout(LayoutKind.Sequential)]91    internal struct CRYPT_ATTR_BLOB92    {93        public uint cbData;94        public IntPtr pbData;95    }96 97    [StructLayout(LayoutKind.Sequential)]98    internal struct CRYPT_ALGORITHM_IDENTIFIER99    {100        [MarshalAs(UnmanagedType.LPStr)] public string pszObjId;101        public CRYPT_ATTR_BLOB Parameters;102    }103 104    [StructLayout(LayoutKind.Sequential)]105    internal struct CRYPT_ATTRIBUTE_TYPE_VALUE106    {107        [MarshalAs(UnmanagedType.LPStr)] public string pszObjId;108        public CRYPT_ATTR_BLOB Value;109    }110 111    [StructLayout(LayoutKind.Sequential)]112    internal struct SIP_INDIRECT_DATA113    {114        public CRYPT_ATTRIBUTE_TYPE_VALUE Data;115        public CRYPT_ALGORITHM_IDENTIFIER DigestAlgorithm;116        public CRYPT_ATTR_BLOB Digest;117    }118 119    [StructLayout(LayoutKind.Sequential)]120    internal struct CRYPTCATMEMBER121    {122        public uint cbStruct;123        [MarshalAs(UnmanagedType.LPWStr)] public string pwszReferenceTag;124        [MarshalAs(UnmanagedType.LPWStr)] public string pwszFileName;125        public Guid gSubjectType;126        public uint fdwMemberFlags;127        public IntPtr pIndirectData;128        public uint dwCertVersion;129        public uint dwReserved;130        public IntPtr hReserved;131        public CRYPT_ATTR_BLOB sEncodedIndirectData;132        public CRYPT_ATTR_BLOB sEncodedMemberInfo;133    }134 135    [StructLayout(LayoutKind.Sequential)]136    internal struct CRYPTCATATTRIBUTE137    {138        public uint cbStruct;139        [MarshalAs(UnmanagedType.LPWStr)] public string pwszReferenceTag;140        public uint dwAttrTypeAndAction;141        public uint cbValue;142        public IntPtr pbValue;143        public uint dwReserved;144    }145 146    [StructLayout(LayoutKind.Sequential)]147    internal struct CRYPTCATSTORE148    {149        public uint cbStruct;150        public uint dwPublicVersion;151        [MarshalAs(UnmanagedType.LPWStr)] public string pwszP7File;152        public IntPtr hProv;153        public uint dwEncodingType;154        public uint fdwStoreFlags;155        public IntPtr hReserved;156        public IntPtr hAttrs;157        public IntPtr hCryptMsg;158        public IntPtr hSorted;159    }160 161    [StructLayout(LayoutKind.Sequential)]162    internal struct WINTRUST_DATA163    {164        public uint cbStruct;165        public IntPtr pPolicyCallbackData;166        public IntPtr pSIPClientData;167        public WinTrustUIChoice dwUIChoice;168        public uint fdwRevocationChecks;169        public WinTrustUnionChoice dwUnionChoice;170        public unsafe void* pChoice;171        public WinTrustAction dwStateAction;172        public IntPtr hWVTStateData;173        public IntPtr pwszURLReference;174        public WinTrustProviderFlags dwProvFlags;175        public uint dwUIContext;176    }177 178    [StructLayout(LayoutKind.Sequential)]179    internal struct WINTRUST_FILE_INFO180    {181        public uint cbStruct;182        public unsafe char* pcwszFilePath;183        public IntPtr hFile;184        public IntPtr pgKnownSubject;185    }186 187    [StructLayout(LayoutKind.Sequential)]188    internal struct WINTRUST_BLOB_INFO189    {190        public uint cbStruct;191        public Guid gSubject;192        public unsafe char* pcwszDisplayName;193        public uint cbMemObject;194        public unsafe byte* pbMemObject;195        public uint cbMemSignedMsg;196        public IntPtr pbMemSignedMsg;197    }198 199    [DllImport(200        WinTrustDll,201        CharSet = CharSet.Unicode,202        EntryPoint = "CryptCATAdminAcquireContext2",203        SetLastError = true)]204    [return: MarshalAs(UnmanagedType.Bool)]205    private static extern bool NativeCryptCATAdminAcquireContext2(206        out SafeCATAdminHandle phCatAdmin,207        IntPtr pgSubsystem,208        [MarshalAs(UnmanagedType.LPWStr)] string pwszHashAlgorithm,209        IntPtr pStrongHashPolicy,210        uint dwFlags211    );212 213    internal static SafeCATAdminHandle CryptCATAdminAcquireContext2(string hashAlgorithm)214    {215        if (!NativeCryptCATAdminAcquireContext2(out var adminHandle, IntPtr.Zero, hashAlgorithm, IntPtr.Zero, 0))216        {217            throw new Win32Exception();218        }219 220        return adminHandle;221    }222 223    [DllImport(224        WinTrustDll,225        CharSet = CharSet.Unicode,226        EntryPoint = "CryptCATAdminCalcHashFromFileHandle2",227        SetLastError = true)]228    [return: MarshalAs(UnmanagedType.Bool)]229    private static extern unsafe bool NativeCryptCATAdminCalcHashFromFileHandle2(230        SafeCATAdminHandle hCatAdmin,231        SafeHandle hFile,232        [In, Out] ref int pcbHash,233        byte* pbHash,234        uint dwFlags235    );236 237    internal static byte[] CryptCATAdminCalcHashFromFileHandle2(SafeCATAdminHandle catAdmin, SafeHandle file)238    {239        unsafe240        {241            int hashLength = 0;242            NativeCryptCATAdminCalcHashFromFileHandle2(catAdmin, file, ref hashLength, null, 0);243 244            byte[] hash = new byte[hashLength];245            fixed (byte* hashPtr = hash)246            {247                if (!NativeCryptCATAdminCalcHashFromFileHandle2(catAdmin, file, ref hashLength, hashPtr, 0))248                {249                    throw new Win32Exception();250                }251            }252 253            return hash;254        }255    }256 257    [DllImport(WinTrustDll, CharSet = CharSet.Unicode)]258    [return: MarshalAs(UnmanagedType.Bool)]259    internal static extern bool CryptCATAdminReleaseContext(260        IntPtr phCatAdmin,261        uint dwFlags262    );263 264    [DllImport(WinTrustDll, CharSet = CharSet.Unicode, EntryPoint = "CryptCATCDFOpen")]265    private static extern SafeCATCDFHandle NativeCryptCATCDFOpen(266        [MarshalAs(UnmanagedType.LPWStr)] string pwszFilePath,267        CryptCATCDFParseErrorCallBack pfnParseError268    );269 270    internal static SafeCATCDFHandle CryptCATCDFOpen(string filePath, CryptCATCDFParseErrorCallBack parseError)271    {272        SafeCATCDFHandle handle = NativeCryptCATCDFOpen(filePath, parseError);273        if (handle.IsInvalid)274        {275            throw new Win32Exception();276        }277 278        return handle;279    }280 281    [DllImport(WinTrustDll, CharSet = CharSet.Unicode)]282    internal static extern IntPtr CryptCATCDFEnumCatAttributes(283        SafeCATCDFHandle pCDF,284        IntPtr pPrevAttr,285        CryptCATCDFParseErrorCallBack pfnParseError286    );287 288    [DllImport(WinTrustDll)]289    [return: MarshalAs(UnmanagedType.Bool)]290    internal static extern bool CryptCATCDFClose(291        IntPtr pCDF292    );293 294    [DllImport(WinTrustDll, CharSet = CharSet.Unicode)]295    internal static extern IntPtr CryptCATCDFEnumMembersByCDFTagEx(296        SafeCATCDFHandle pCDF,297        IntPtr pwszPrevCDFTag,298        CryptCATCDFParseErrorCallBack fn,299        ref IntPtr ppMember,300        bool fContinueOnError,301        IntPtr pvReserved302    );303 304    [DllImport(WinTrustDll, CharSet = CharSet.Unicode)]305    internal static extern IntPtr CryptCATCDFEnumAttributesWithCDFTag(306        SafeCATCDFHandle pCDF,307        IntPtr pwszMemberTag,308        IntPtr pMember,309        IntPtr pPrevAttr,310        CryptCATCDFParseErrorCallBack fn311    );312 313    [DllImport(WinTrustDll, CharSet = CharSet.Unicode)]314    internal static extern IntPtr CryptCATEnumerateCatAttr(315        SafeCATHandle hCatalog,316        IntPtr pPrevAttr317    );318 319    [DllImport(WinTrustDll, CharSet = CharSet.Unicode, EntryPoint = "CryptCATOpen", SetLastError = true)]320    internal static extern SafeCATHandle NativeCryptCATOpen(321        [MarshalAs(UnmanagedType.LPWStr)] string pwszFilePath,322        uint fdwOpenFlags,323        IntPtr hProv,324        uint dwPublicVersion,325        uint dwEncodingType326    );327 328    internal static SafeCATHandle CryptCATOpen(string filePath, uint openFlags, IntPtr provider, uint publicVersion,329        uint encodingType)330    {331        SafeCATHandle handle = NativeCryptCATOpen(filePath, openFlags, provider, publicVersion, encodingType);332        if (handle.IsInvalid)333        {334            throw new Win32Exception();335        }336 337        return handle;338    }339 340    [DllImport(WinTrustDll)]341    [return: MarshalAs(UnmanagedType.Bool)]342    internal static extern bool CryptCATClose(343        IntPtr hCatalog344    );345 346    [DllImport(WinTrustDll, CharSet = CharSet.Unicode, EntryPoint = "CryptCATStoreFromHandle")]347    private static extern IntPtr NativeCryptCATStoreFromHandle(348        SafeCATHandle hCatalog349    );350 351    internal static CRYPTCATSTORE CryptCATStoreFromHandle(SafeCATHandle catalog)352    {353        IntPtr catStore = NativeCryptCATStoreFromHandle(catalog);354        return Marshal.PtrToStructure<CRYPTCATSTORE>(catStore);355    }356 357    [DllImport(WinTrustDll, CharSet = CharSet.Unicode)]358    internal static extern IntPtr CryptCATEnumerateMember(359        SafeCATHandle hCatalog,360        IntPtr pPrevMember361    );362 363    [DllImport(WinTrustDll, CharSet = CharSet.Unicode)]364    internal static extern IntPtr CryptCATEnumerateAttr(365        SafeCATHandle hCatalog,366        IntPtr pCatMember,367        IntPtr pPrevAttr368    );369 370    [DllImport(WinTrustDll, CharSet = CharSet.Unicode)]371    internal static extern uint WinVerifyTrust(372        IntPtr hWnd,373        ref Guid pgActionID,374        ref WINTRUST_DATA pWVTData375    );376 377    [DllImport(WinTrustDll, CharSet = CharSet.Unicode, EntryPoint = "WTHelperGetProvCertFromChain")]378    private static extern IntPtr NativeWTHelperGetProvCertFromChain(379        IntPtr pSgnr,380        uint idxCert381    );382 383    internal static IntPtr WTHelperGetProvCertFromChain(IntPtr signer, uint certIdx)384    {385        IntPtr data = NativeWTHelperGetProvCertFromChain(signer, certIdx);386        if (data == IntPtr.Zero)387        {388            throw new Win32Exception("WTHelperGetProvCertFromChain failed");389        }390 391        return data;392    }393 394    [DllImport(WinTrustDll, CharSet = CharSet.Unicode, EntryPoint = "WTHelperGetProvSignerFromChain")]395    private static extern IntPtr NativeWTHelperGetProvSignerFromChain(396        IntPtr pProvData,397        uint idxSigner,398        bool fCounterSigner,399        uint idxCounterSigner400    );401 402    internal static IntPtr WTHelperGetProvSignerFromChain(IntPtr providerData, uint signerIdx, bool counterSigner,403        uint counterSignerIdx)404    {405        IntPtr data = NativeWTHelperGetProvSignerFromChain(providerData, signerIdx, counterSigner, counterSignerIdx);406        if (data == IntPtr.Zero)407        {408            throw new Win32Exception("WTHelperGetProvSignerFromChain failed");409        }410 411        return data;412    }413 414    [DllImport(WinTrustDll, CharSet = CharSet.Unicode, EntryPoint = "WTHelperProvDataFromStateData")]415    private static extern IntPtr NativeWTHelperProvDataFromStateData(416        IntPtr hStateData417    );418 419    internal static IntPtr WTHelperProvDataFromStateData(IntPtr stateData)420    {421        IntPtr data = NativeWTHelperProvDataFromStateData(stateData);422        if (data == IntPtr.Zero)423        {424            throw new Win32Exception("WTHelperProvDataFromStateData failed");425        }426 427        return data;428    }429 430    /// <summary>431    /// Signature of call back function used by CryptCATCDFOpen,432    /// CryptCATCDFEnumCatAttributes, CryptCATCDFEnumAttributesWithCDFTag, and433    /// and CryptCATCDFEnumMembersByCDFTagEx.434    /// </summary>435    internal delegate void CryptCATCDFParseErrorCallBack(436        uint dwErrorArea,437        uint dwLocalArea,438        [MarshalAs(UnmanagedType.LPWStr)] string pwszLine439    );440}441