MegaBites-AI/Windows-powershell
0372
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 