MegaBites-AI/Windows-powershell
0308
1// Copyright (c) Microsoft Corporation.2// Licensed under the MIT License.3 4#pragma warning disable 1634, 16915#pragma warning disable 565236 7using System.Runtime.InteropServices;8using System.Security.Cryptography.X509Certificates;9using System.Management.Automation.Internal;10using DWORD = System.UInt32;11using BOOL = System.UInt32;12 13namespace System.Management.Automation.Security14{15 // Crypto API native constants16 internal static partial class NativeConstants17 {18 internal const int CRYPT_OID_INFO_OID_KEY = 1;19 internal const int CRYPT_OID_INFO_NAME_KEY = 2;20 internal const int CRYPT_OID_INFO_CNG_ALGID_KEY = 5;21 }22 23 // Safer native constants24 internal partial class NativeConstants25 {26 /// <Summary>27 /// SAFER_TOKEN_NULL_IF_EQUAL -> 0x00000001.28 /// </Summary>29 public const int SAFER_TOKEN_NULL_IF_EQUAL = 1;30 31 /// <Summary>32 /// SAFER_TOKEN_COMPARE_ONLY -> 0x00000002.33 /// </Summary>34 public const int SAFER_TOKEN_COMPARE_ONLY = 2;35 36 /// <Summary>37 /// SAFER_TOKEN_MAKE_INERT -> 0x00000004.38 /// </Summary>39 public const int SAFER_TOKEN_MAKE_INERT = 4;40 41 /// <Summary>42 /// SAFER_CRITERIA_IMAGEPATH -> 0x00001.43 /// </Summary>44 public const int SAFER_CRITERIA_IMAGEPATH = 1;45 46 /// <Summary>47 /// SAFER_CRITERIA_NOSIGNEDHASH -> 0x00002.48 /// </Summary>49 public const int SAFER_CRITERIA_NOSIGNEDHASH = 2;50 51 /// <Summary>52 /// SAFER_CRITERIA_IMAGEHASH -> 0x00004.53 /// </Summary>54 public const int SAFER_CRITERIA_IMAGEHASH = 4;55 56 /// <Summary>57 /// SAFER_CRITERIA_AUTHENTICODE -> 0x00008.58 /// </Summary>59 public const int SAFER_CRITERIA_AUTHENTICODE = 8;60 61 /// <Summary>62 /// SAFER_CRITERIA_URLZONE -> 0x00010.63 /// </Summary>64 public const int SAFER_CRITERIA_URLZONE = 16;65 66 /// <Summary>67 /// SAFER_CRITERIA_IMAGEPATH_NT -> 0x01000.68 /// </Summary>69 public const int SAFER_CRITERIA_IMAGEPATH_NT = 4096;70 71 /// <Summary>72 /// WTD_UI_NONE -> 0x00002.73 /// </Summary>74 public const int WTD_UI_NONE = 2;75 76 /// <Summary>77 /// S_OK -> ((HRESULT)0L)78 /// </Summary>79 public const int S_OK = 0;80 81 /// <Summary>82 /// S_FALSE -> ((HRESULT)1L)83 /// </Summary>84 public const int S_FALSE = 1;85 86 /// <Summary>87 /// ERROR_MORE_DATA -> 234L.88 /// </Summary>89 public const int ERROR_MORE_DATA = 234;90 91 /// <Summary>92 /// ERROR_ACCESS_DISABLED_BY_POLICY -> 1260L.93 /// </Summary>94 public const int ERROR_ACCESS_DISABLED_BY_POLICY = 1260;95 96 /// <Summary>97 /// ERROR_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY -> 786L.98 /// </Summary>99 public const int ERROR_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY = 786;100 101 /// <Summary>102 /// SAFER_MAX_HASH_SIZE -> 64.103 /// </Summary>104 public const int SAFER_MAX_HASH_SIZE = 64;105 106 /// <Summary>107 /// SRP_POLICY_SCRIPT -> L"SCRIPT"108 /// </Summary>109 public const string SRP_POLICY_SCRIPT = "SCRIPT";110 111 /// <Summary>112 /// SIGNATURE_DISPLAYNAME_LENGTH -> MAX_PATH.113 /// </Summary>114 internal const int SIGNATURE_DISPLAYNAME_LENGTH = NativeConstants.MAX_PATH;115 116 /// <Summary>117 /// SIGNATURE_PUBLISHER_LENGTH -> 128.118 /// </Summary>119 internal const int SIGNATURE_PUBLISHER_LENGTH = 128;120 121 /// <Summary>122 /// SIGNATURE_HASH_LENGTH -> 64.123 /// </Summary>124 internal const int SIGNATURE_HASH_LENGTH = 64;125 126 /// <Summary>127 /// MAX_PATH -> 260.128 /// </Summary>129 internal const int MAX_PATH = 260;130 131 /// <Summary>132 /// This function is not supported on this system.133 /// </Summary>134 internal const int FUNCTION_NOT_SUPPORTED = 120;135 }136 137 /// <summary>138 /// Pinvoke methods from crypt32.dll.139 /// </summary>140 internal static partial class NativeMethods141 {142 // -------------------------------------------------------------------143 // crypt32.dll stuff144 //145 146 [DllImport("crypt32.dll", SetLastError = true, CharSet = CharSet.Unicode)]147 internal static extern148 bool CertEnumSystemStore(CertStoreFlags Flags,149 IntPtr notUsed1,150 IntPtr notUsed2,151 CertEnumSystemStoreCallBackProto fn);152 153 /// <summary>154 /// Signature of call back function used by CertEnumSystemStore.155 /// </summary>156 internal delegate157 bool CertEnumSystemStoreCallBackProto([MarshalAs(UnmanagedType.LPWStr)]158 string storeName,159 DWORD dwFlagsNotUsed,160 IntPtr notUsed1,161 IntPtr notUsed2,162 IntPtr notUsed3);163 164 /// <summary>165 /// Signature of cert enumeration function.166 /// </summary>167 [DllImport("crypt32.dll", SetLastError = true, CharSet = CharSet.Unicode)]168 internal static extern169 IntPtr CertEnumCertificatesInStore(IntPtr storeHandle,170 IntPtr certContext);171 172 /// <summary>173 /// Signature of cert find function.174 /// </summary>175 [DllImport("crypt32.dll", SetLastError = true, CharSet = CharSet.Unicode)]176 internal static extern177 IntPtr CertFindCertificateInStore(178 IntPtr hCertStore,179 Security.NativeMethods.CertOpenStoreEncodingType dwEncodingType,180 DWORD dwFindFlags, // 0181 Security.NativeMethods.CertFindType dwFindType,182 [MarshalAs(UnmanagedType.LPWStr)] string pvFindPara,183 IntPtr notUsed1); // pPrevCertContext184 185 [Flags]186 internal enum CertFindType187 { // pvFindPara:188 CERT_COMPARE_ANY = 0 << 16, // null189 CERT_FIND_ISSUER_STR = (8 << 16) | 4, // substring190 CERT_FIND_SUBJECT_STR = (8 << 16) | 7, // substring191 CERT_FIND_CROSS_CERT_DIST_POINTS = 17 << 16, // null192 CERT_FIND_SUBJECT_INFO_ACCESS = 19 << 16, // null193 CERT_FIND_HASH_STR = 20 << 16, // thumbprint194 }195 196 [DllImport("crypt32.dll", SetLastError = true, CharSet = CharSet.Unicode)]197 internal static extern198 bool CertCloseStore(IntPtr hCertStore, int dwFlags);199 200 [Flags]201 internal enum CertStoreFlags202 {203 CERT_SYSTEM_STORE_CURRENT_USER = 1 << 16,204 CERT_SYSTEM_STORE_LOCAL_MACHINE = 2 << 16,205 CERT_SYSTEM_STORE_CURRENT_SERVICE = 4 << 16,206 CERT_SYSTEM_STORE_SERVICES = 5 << 16,207 CERT_SYSTEM_STORE_USERS = 6 << 16,208 CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY = 7 << 16,209 CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY = 8 << 16,210 CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE = 9 << 16,211 }212 213 [DllImport("crypt32.dll", SetLastError = true, CharSet = CharSet.Unicode)]214 internal static extern215 bool CertGetEnhancedKeyUsage(IntPtr pCertContext, // PCCERT_CONTEXT216 DWORD dwFlags,217 IntPtr pUsage, // PCERT_ENHKEY_USAGE218 out int pcbUsage); // DWORD*219 220 [DllImport("Crypt32.dll", SetLastError = true, CharSet = CharSet.Unicode)]221 internal static extern222 IntPtr CertOpenStore(CertOpenStoreProvider storeProvider,223 CertOpenStoreEncodingType dwEncodingType,224 IntPtr notUsed1, // hCryptProv225 CertOpenStoreFlags dwFlags,226 [MarshalAs(UnmanagedType.LPWStr)]227 string storeName);228 229 [Flags]230 internal enum CertOpenStoreFlags231 {232 CERT_STORE_NO_CRYPT_RELEASE_FLAG = 0x00000001,233 CERT_STORE_SET_LOCALIZED_NAME_FLAG = 0x00000002,234 CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG = 0x00000004,235 CERT_STORE_DELETE_FLAG = 0x00000010,236 CERT_STORE_UNSAFE_PHYSICAL_FLAG = 0x00000020,237 CERT_STORE_SHARE_STORE_FLAG = 0x00000040,238 CERT_STORE_SHARE_CONTEXT_FLAG = 0x00000080,239 CERT_STORE_MANIFOLD_FLAG = 0x00000100,240 CERT_STORE_ENUM_ARCHIVED_FLAG = 0x00000200,241 CERT_STORE_UPDATE_KEYID_FLAG = 0x00000400,242 CERT_STORE_BACKUP_RESTORE_FLAG = 0x00000800,243 CERT_STORE_READONLY_FLAG = 0x00008000,244 CERT_STORE_OPEN_EXISTING_FLAG = 0x00004000,245 CERT_STORE_CREATE_NEW_FLAG = 0x00002000,246 CERT_STORE_MAXIMUM_ALLOWED_FLAG = 0x00001000,247 248 CERT_SYSTEM_STORE_CURRENT_USER = 1 << 16,249 CERT_SYSTEM_STORE_LOCAL_MACHINE = 2 << 16,250 CERT_SYSTEM_STORE_CURRENT_SERVICE = 4 << 16,251 CERT_SYSTEM_STORE_SERVICES = 5 << 16,252 CERT_SYSTEM_STORE_USERS = 6 << 16,253 CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY = 7 << 16,254 CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY = 8 << 16,255 CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE = 9 << 16,256 }257 258 [Flags]259 internal enum CertOpenStoreProvider260 {261 CERT_STORE_PROV_MEMORY = 2,262 CERT_STORE_PROV_SYSTEM = 10,263 CERT_STORE_PROV_SYSTEM_REGISTRY = 13,264 }265 266 [Flags]267 internal enum CertOpenStoreEncodingType268 {269 X509_ASN_ENCODING = 0x00000001,270 }271 272 [DllImport("Crypt32.dll", SetLastError = true, CharSet = CharSet.Unicode)]273 internal static extern274 bool CertControlStore(275 IntPtr hCertStore,276 DWORD dwFlags,277 CertControlStoreType dwCtrlType,278 IntPtr pvCtrlPara);279 280 [Flags]281 internal enum CertControlStoreType : uint282 {283 CERT_STORE_CTRL_RESYNC = 1,284 CERT_STORE_CTRL_COMMIT = 3,285 CERT_STORE_CTRL_AUTO_RESYNC = 4,286 }287 288 [Flags]289 internal enum AddCertificateContext : uint290 {291 CERT_STORE_ADD_NEW = 1,292 CERT_STORE_ADD_USE_EXISTING = 2,293 CERT_STORE_ADD_REPLACE_EXISTING = 3,294 CERT_STORE_ADD_ALWAYS = 4,295 CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES = 5,296 CERT_STORE_ADD_NEWER = 6,297 CERT_STORE_ADD_NEWER_INHERIT_PROPERTIES = 7298 }299 300 [Flags]301 internal enum CertPropertyId302 {303 CERT_KEY_PROV_HANDLE_PROP_ID = 1,304 CERT_KEY_PROV_INFO_PROP_ID = 2, // CRYPT_KEY_PROV_INFO305 CERT_SHA1_HASH_PROP_ID = 3,306 CERT_MD5_HASH_PROP_ID = 4,307 CERT_SEND_AS_TRUSTED_ISSUER_PROP_ID = 102,308 }309 310 [Flags]311 internal enum NCryptDeletKeyFlag312 {313 NCRYPT_MACHINE_KEY_FLAG = 0x00000020, // same as CAPI CRYPT_MACHINE_KEYSET314 NCRYPT_SILENT_FLAG = 0x00000040, // same as CAPI CRYPT_SILENT315 }316 317 [Flags]318 internal enum ProviderFlagsEnum : uint319 {320 CRYPT_VERIFYCONTEXT = 0xF0000000,321 CRYPT_NEWKEYSET = 0x00000008,322 CRYPT_DELETEKEYSET = 0x00000010,323 CRYPT_MACHINE_KEYSET = 0x00000020,324 CRYPT_SILENT = 0x00000040,325 }326 327 internal enum ProviderParam : int328 {329 PP_CLIENT_HWND = 1,330 }331 332 internal enum PROV : uint333 {334 /// <summary>335 /// The PROV_RSA_FULL type.336 /// </summary>337 RSA_FULL = 1,338 339 /// <summary>340 /// The PROV_RSA_SIG type.341 /// </summary>342 RSA_SIG = 2,343 344 /// <summary>345 /// The PROV_RSA_DSS type.346 /// </summary>347 DSS = 3,348 349 /// <summary>350 /// The PROV_FORTEZZA type.351 /// </summary>352 FORTEZZA = 4,353 354 /// <summary>355 /// The PROV_MS_EXCHANGE type.356 /// </summary>357 MS_EXCHANGE = 5,358 359 /// <summary>360 /// The PROV_SSL type.361 /// </summary>362 SSL = 6,363 364 /// <summary>365 /// The PROV_RSA_SCHANNEL type. SSL certificates are generated with these providers.366 /// </summary>367 RSA_SCHANNEL = 12,368 369 /// <summary>370 /// The PROV_DSS_DH type.371 /// </summary>372 DSS_DH = 13,373 374 /// <summary>375 /// The PROV_EC_ECDSA type.376 /// </summary>377 EC_ECDSA_SIG = 14,378 379 /// <summary>380 /// The PROV_EC_ECNRA_SIG type.381 /// </summary>382 EC_ECNRA_SIG = 15,383 384 /// <summary>385 /// The PROV_EC_ECDSA_FULL type.386 /// </summary>387 EC_ECDSA_FULL = 16,388 389 /// <summary>390 /// The PROV_EC_ECNRA_FULL type.391 /// </summary>392 EC_ECNRA_FULL = 17,393 394 /// <summary>395 /// The PROV_DH_SCHANNEL type.396 /// </summary>397 DH_SCHANNEL = 18,398 399 /// <summary>400 /// The PROV_SPYRUS_LYNKS type.401 /// </summary>402 SPYRUS_LYNKS = 20,403 404 /// <summary>405 /// The PROV_RNG type.406 /// </summary>407 RNG = 21,408 409 /// <summary>410 /// The PROV_INTEL_SEC type.411 /// </summary>412 INTEL_SEC = 22413 }414 415 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]416 internal struct CRYPT_KEY_PROV_INFO417 {418 /// <summary>419 /// String naming a key container within a particular CSP.420 /// </summary>421 public string pwszContainerName;422 423 /// <summary>424 /// String that names a CSP.425 /// </summary>426 public string pwszProvName;427 428 /// <summary>429 /// CSP type.430 /// </summary>431 public PROV dwProvType;432 433 /// <summary>434 /// Flags value indicating whether a key container is to be created or destroyed, and435 /// whether an application is allowed access to a key container.436 /// </summary>437 public uint dwFlags;438 439 /// <summary>440 /// Number of elements in the rgProvParam array.441 /// </summary>442 public uint cProvParam;443 444 /// <summary>445 /// Array of pointers to CRYPT_KEY_PROV_PARAM structures.446 /// </summary>447 public IntPtr rgProvParam;448 449 /// <summary>450 /// The specification of the private key to retrieve. AT_KEYEXCHANGE and AT_SIGNATURE451 /// are defined for the default provider.452 /// </summary>453 public uint dwKeySpec;454 }455 456 internal const string NCRYPT_WINDOW_HANDLE_PROPERTY = "HWND Handle";457 458 [DllImport("crypt32.dll", SetLastError = true, CharSet = CharSet.Unicode)]459 internal static extern460 bool CertDeleteCertificateFromStore(IntPtr pCertContext);461 462 [DllImport("crypt32.dll", SetLastError = true, CharSet = CharSet.Unicode)]463 internal static extern464 IntPtr CertDuplicateCertificateContext(IntPtr pCertContext);465 466 [DllImport("crypt32.dll", SetLastError = true, CharSet = CharSet.Unicode)]467 internal static extern468 bool CertAddCertificateContextToStore(IntPtr hCertStore,469 IntPtr pCertContext,470 DWORD dwAddDisposition,471 ref IntPtr ppStoreContext);472 473 [DllImport("crypt32.dll", SetLastError = true, CharSet = CharSet.Unicode)]474 internal static extern475 bool CertFreeCertificateContext(IntPtr certContext);476 477 [DllImport("crypt32.dll", SetLastError = true, CharSet = CharSet.Unicode)]478 internal static extern479 bool CertGetCertificateContextProperty(IntPtr pCertContext,480 CertPropertyId dwPropId,481 IntPtr pvData,482 ref int pcbData);483 484 [DllImport("crypt32.dll", SetLastError = true, CharSet = CharSet.Unicode)]485 internal static extern486 bool CertSetCertificateContextProperty(IntPtr pCertContext,487 CertPropertyId dwPropId,488 DWORD dwFlags,489 IntPtr pvData);490 491 [DllImport("crypt32.dll", SetLastError = true, CharSet = CharSet.Unicode)]492 internal static extern493 IntPtr CryptFindLocalizedName(string pwszCryptName);494 495 [DllImport(PinvokeDllNames.CryptAcquireContextDllName, SetLastError = true, CharSet = CharSet.Unicode)]496 internal static extern497 bool CryptAcquireContext(ref IntPtr hProv,498 string strContainerName,499 string strProviderName,500 int nProviderType,501 uint uiProviderFlags);502 503 [DllImport(PinvokeDllNames.CryptReleaseContextDllName, SetLastError = true, CharSet = CharSet.Unicode)]504 internal static extern505 bool CryptReleaseContext(IntPtr hProv, int dwFlags);506 507 [DllImport(PinvokeDllNames.CryptSetProvParamDllName, SetLastError = true)]508 internal static extern unsafe509 bool CryptSetProvParam(IntPtr hProv, ProviderParam dwParam, void* pbData, int dwFlags);510 511 [DllImport("ncrypt.dll", CharSet = CharSet.Unicode)]512 internal static extern513 int NCryptOpenStorageProvider(ref IntPtr hProv,514 string strProviderName,515 uint dwFlags);516 517 [DllImport("ncrypt.dll", CharSet = CharSet.Unicode)]518 internal static extern519 int NCryptOpenKey(IntPtr hProv,520 ref IntPtr hKey,521 string strKeyName,522 uint dwLegacySpec,523 uint dwFlags);524 525 [DllImport("ncrypt.dll", CharSet = CharSet.Unicode)]526 internal static extern unsafe527 int NCryptSetProperty(IntPtr hProv, string pszProperty, void* pbInput, int cbInput, int dwFlags);528 529 [DllImport("ncrypt.dll", CharSet = CharSet.Unicode)]530 internal static extern531 int NCryptDeleteKey(IntPtr hKey,532 uint dwFlags);533 534 [DllImport("ncrypt.dll", CharSet = CharSet.Unicode)]535 internal static extern536 int NCryptFreeObject(IntPtr hObject);537 538 // -----------------------------------------------------------------539 // cryptUI.dll stuff540 //541 542 //543 // CryptUIWizDigitalSign() function and associated structures/enums544 //545 546 [DllImport("cryptUI.dll", SetLastError = true, CharSet = CharSet.Unicode)]547 internal static extern548 bool CryptUIWizDigitalSign(DWORD dwFlags,549 IntPtr hwndParentNotUsed,550 IntPtr pwszWizardTitleNotUsed,551 IntPtr pDigitalSignInfo,552 IntPtr ppSignContextNotUsed);553 554 [Flags]555 internal enum CryptUIFlags556 {557 CRYPTUI_WIZ_NO_UI = 0x0001558 // other flags not used559 }560 561 [StructLayout(LayoutKind.Sequential)]562 internal struct CRYPTUI_WIZ_DIGITAL_SIGN_INFO563 {564 internal DWORD dwSize;565 internal DWORD dwSubjectChoice;566 567 [MarshalAs(UnmanagedType.LPWStr)]568 internal string pwszFileName;569 570 internal DWORD dwSigningCertChoice;571 internal IntPtr pSigningCertContext; // PCCERT_CONTEXT572 573 [MarshalAs(UnmanagedType.LPWStr)]574 internal string pwszTimestampURL;575 576 internal DWORD dwAdditionalCertChoice;577 internal IntPtr pSignExtInfo; // PCCRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO578 }579 580 [Flags]581 internal enum SignInfoSubjectChoice582 {583 CRYPTUI_WIZ_DIGITAL_SIGN_SUBJECT_FILE = 0x01584 // CRYPTUI_WIZ_DIGITAL_SIGN_SUBJECT_BLOB = 0x02 NotUsed585 }586 587 [Flags]588 internal enum SignInfoCertChoice589 {590 CRYPTUI_WIZ_DIGITAL_SIGN_CERT = 0x01591 // CRYPTUI_WIZ_DIGITAL_SIGN_STORE = 0x02, NotUsed592 // CRYPTUI_WIZ_DIGITAL_SIGN_PVK = 0x03, NotUsed593 }594 595 [Flags]596 internal enum SignInfoAdditionalCertChoice597 {598 CRYPTUI_WIZ_DIGITAL_SIGN_ADD_CHAIN = 1,599 CRYPTUI_WIZ_DIGITAL_SIGN_ADD_CHAIN_NO_ROOT = 2600 }601 602 [StructLayout(LayoutKind.Sequential)]603 internal struct CRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO604 {605 internal DWORD dwSize;606 internal DWORD dwAttrFlagsNotUsed;607 608 [MarshalAs(UnmanagedType.LPWStr)]609 internal string pwszDescription;610 611 [MarshalAs(UnmanagedType.LPWStr)]612 internal string pwszMoreInfoLocation;613 614 [MarshalAs(UnmanagedType.LPStr)]615 internal string pszHashAlg;616 617 internal IntPtr pwszSigningCertDisplayStringNotUsed; // LPCWSTR618 internal IntPtr hAdditionalCertStoreNotUsed; // HCERTSTORE619 internal IntPtr psAuthenticatedNotUsed; // PCRYPT_ATTRIBUTES620 internal IntPtr psUnauthenticatedNotUsed; // PCRYPT_ATTRIBUTES621 }622 623 internal static CRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO624 InitSignInfoExtendedStruct(string description,625 string moreInfoUrl,626 string hashAlgorithm)627 {628 CRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO siex =629 new CRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO();630 631 siex.dwSize = (DWORD)Marshal.SizeOf(siex);632 siex.dwAttrFlagsNotUsed = 0;633 siex.pwszDescription = description;634 siex.pwszMoreInfoLocation = moreInfoUrl;635 siex.pszHashAlg = null;636 siex.pwszSigningCertDisplayStringNotUsed = IntPtr.Zero;637 siex.hAdditionalCertStoreNotUsed = IntPtr.Zero;638 siex.psAuthenticatedNotUsed = IntPtr.Zero;639 siex.psUnauthenticatedNotUsed = IntPtr.Zero;640 641 if (hashAlgorithm != null)642 {643 siex.pszHashAlg = hashAlgorithm;644 }645 646 return siex;647 }648 649 [StructLayout(LayoutKind.Sequential)]650 internal struct CRYPT_OID_INFO651 {652 /// DWORD->unsigned int653 public uint cbSize;654 655 /// LPCSTR->CHAR*656 [MarshalAs(UnmanagedType.LPStr)]657 public string pszOID;658 659 /// LPCWSTR->WCHAR*660 [MarshalAs(UnmanagedType.LPWStr)]661 public string pwszName;662 663 /// DWORD->unsigned int664 public uint dwGroupId;665 666 /// Anonymous_a3ae7823_8a1d_432c_bc07_a72b6fc6c7d8667 public Anonymous_a3ae7823_8a1d_432c_bc07_a72b6fc6c7d8 Union1;668 669 /// CRYPT_DATA_BLOB->_CRYPTOAPI_BLOB670 public CRYPT_ATTR_BLOB ExtraInfo;671 }672 673 [StructLayout(LayoutKind.Explicit)]674 internal struct Anonymous_a3ae7823_8a1d_432c_bc07_a72b6fc6c7d8675 {676 /// DWORD->unsigned int677 [FieldOffset(0)]678 public uint dwValue;679 680 /// ALG_ID->unsigned int681 [FieldOffset(0)]682 public uint Algid;683 684 /// DWORD->unsigned int685 [FieldOffset(0)]686 public uint dwLength;687 }688 689 [StructLayout(LayoutKind.Sequential)]690 internal struct CRYPT_ATTR_BLOB691 {692 /// DWORD->unsigned int693 public uint cbData;694 695 /// BYTE*696 public System.IntPtr pbData;697 }698 699 [StructLayout(LayoutKind.Sequential)]700 internal struct CRYPT_DATA_BLOB701 {702 /// DWORD->unsigned int703 public uint cbData;704 705 /// BYTE*706 public System.IntPtr pbData;707 }708 709 [StructLayout(LayoutKind.Sequential)]710 internal struct CERT_CONTEXT711 {712 public int dwCertEncodingType;713 public IntPtr pbCertEncoded;714 public int cbCertEncoded;715 public IntPtr pCertInfo;716 public IntPtr hCertStore;717 }718 719 // Return the OID info for a given algorithm720 [DllImport("crypt32.dll", EntryPoint = "CryptFindOIDInfo")]721 internal static extern IntPtr CryptFindOIDInfo(722 uint dwKeyType,723 System.IntPtr pvKey,724 uint dwGroupId);725 726 internal static DWORD GetCertChoiceFromSigningOption(727 SigningOption option)728 {729 DWORD cc = 0;730 731 switch (option)732 {733 case SigningOption.AddOnlyCertificate:734 cc = 0;735 break;736 737 case SigningOption.AddFullCertificateChain:738 cc = (DWORD)SignInfoAdditionalCertChoice.CRYPTUI_WIZ_DIGITAL_SIGN_ADD_CHAIN;739 break;740 741 case SigningOption.AddFullCertificateChainExceptRoot:742 cc = (DWORD)SignInfoAdditionalCertChoice.CRYPTUI_WIZ_DIGITAL_SIGN_ADD_CHAIN_NO_ROOT;743 break;744 745 default:746 cc = (DWORD)SignInfoAdditionalCertChoice.CRYPTUI_WIZ_DIGITAL_SIGN_ADD_CHAIN_NO_ROOT;747 break;748 }749 750 return cc;751 }752 753 internal static CRYPTUI_WIZ_DIGITAL_SIGN_INFO754 InitSignInfoStruct(string fileName,755 X509Certificate2 signingCert,756 string timeStampServerUrl,757 string hashAlgorithm,758 SigningOption option)759 {760 CRYPTUI_WIZ_DIGITAL_SIGN_INFO si = new CRYPTUI_WIZ_DIGITAL_SIGN_INFO();761 762 si.dwSize = (DWORD)Marshal.SizeOf(si);763 si.dwSubjectChoice = (DWORD)SignInfoSubjectChoice.CRYPTUI_WIZ_DIGITAL_SIGN_SUBJECT_FILE;764 si.pwszFileName = fileName;765 si.dwSigningCertChoice = (DWORD)SignInfoCertChoice.CRYPTUI_WIZ_DIGITAL_SIGN_CERT;766 si.pSigningCertContext = signingCert.Handle;767 si.pwszTimestampURL = timeStampServerUrl;768 si.dwAdditionalCertChoice = GetCertChoiceFromSigningOption(option);769 770 CRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO siex =771 InitSignInfoExtendedStruct(string.Empty, string.Empty, hashAlgorithm);772 IntPtr pSiexBuffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(siex));773 Marshal.StructureToPtr(siex, pSiexBuffer, false);774 si.pSignExtInfo = pSiexBuffer;775 776 return si;777 }778 779 [StructLayout(LayoutKind.Sequential)]780 internal struct CRYPT_PROVIDER_CERT781 {782#pragma warning disable IDE0044783 private DWORD _cbStruct;784#pragma warning restore IDE0044785 internal IntPtr pCert; // PCCERT_CONTEXT786 private readonly BOOL _fCommercial;787 private readonly BOOL _fTrustedRoot;788 private readonly BOOL _fSelfSigned;789 private readonly BOOL _fTestCert;790 private readonly DWORD _dwRevokedReason;791 private readonly DWORD _dwConfidence;792 private readonly DWORD _dwError;793 private readonly IntPtr _pTrustListContext; // CTL_CONTEXT*794 private readonly BOOL _fTrustListSignerCert;795 private readonly IntPtr _pCtlContext; // PCCTL_CONTEXT796 private readonly DWORD _dwCtlError;797 private readonly BOOL _fIsCyclic;798 private readonly IntPtr _pChainElement; // PCERT_CHAIN_ELEMENT799 }800 801 [StructLayout(LayoutKind.Sequential)]802 internal struct CRYPT_PROVIDER_SGNR803 {804 private readonly DWORD _cbStruct;805 private FILETIME _sftVerifyAsOf;806 private readonly DWORD _csCertChain;807 private readonly IntPtr _pasCertChain; // CRYPT_PROVIDER_CERT*808 private readonly DWORD _dwSignerType;809 private readonly IntPtr _psSigner; // CMSG_SIGNER_INFO*810 private readonly DWORD _dwError;811 internal DWORD csCounterSigners;812 internal IntPtr pasCounterSigners; // CRYPT_PROVIDER_SGNR*813 private readonly IntPtr _pChainContext; // PCCERT_CHAIN_CONTEXT814 }815 816 //817 // stuff required for getting cert extensions818 //819 820 [StructLayout(LayoutKind.Sequential)]821 internal struct CERT_ENHKEY_USAGE822 {823 internal DWORD cUsageIdentifier;824 // [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr, SizeParamIndex=0)]825 // internal string[] rgpszUsageIdentifier; // LPSTR*826 internal IntPtr rgpszUsageIdentifier;827 }828 829 internal enum SIGNATURE_STATE830 {831 /// SIGNATURE_STATE_UNSIGNED_MISSING -> 0832 SIGNATURE_STATE_UNSIGNED_MISSING = 0,833 834 SIGNATURE_STATE_UNSIGNED_UNSUPPORTED,835 836 SIGNATURE_STATE_UNSIGNED_POLICY,837 838 SIGNATURE_STATE_INVALID_CORRUPT,839 840 SIGNATURE_STATE_INVALID_POLICY,841 842 SIGNATURE_STATE_VALID,843 844 SIGNATURE_STATE_TRUSTED,845 846 SIGNATURE_STATE_UNTRUSTED,847 }848 849 internal enum SIGNATURE_INFO_FLAGS850 {851 /// SIF_NONE -> 0x0000852 SIF_NONE = 0,853 854 /// SIF_AUTHENTICODE_SIGNED -> 0x0001855 SIF_AUTHENTICODE_SIGNED = 1,856 857 /// SIF_CATALOG_SIGNED -> 0x0002858 SIF_CATALOG_SIGNED = 2,859 860 /// SIF_VERSION_INFO -> 0x0004861 SIF_VERSION_INFO = 4,862 863 /// SIF_CHECK_OS_BINARY -> 0x0800864 SIF_CHECK_OS_BINARY = 2048,865 866 /// SIF_BASE_VERIFICATION -> 0x1000867 SIF_BASE_VERIFICATION = 4096,868 869 /// SIF_CATALOG_FIRST -> 0x2000870 SIF_CATALOG_FIRST = 8192,871 872 /// SIF_MOTW -> 0x4000873 SIF_MOTW = 16384,874 }875 876 internal enum SIGNATURE_INFO_AVAILABILITY877 {878 /// SIA_DISPLAYNAME -> 0x0001879 SIA_DISPLAYNAME = 1,880 881 /// SIA_PUBLISHERNAME -> 0x0002882 SIA_PUBLISHERNAME = 2,883 884 /// SIA_MOREINFOURL -> 0x0004885 SIA_MOREINFOURL = 4,886 887 /// SIA_HASH -> 0x0008888 SIA_HASH = 8,889 }890 891 internal enum SIGNATURE_INFO_TYPE892 {893 /// SIT_UNKNOWN -> 0894 SIT_UNKNOWN = 0,895 896 SIT_AUTHENTICODE,897 898 SIT_CATALOG,899 }900 901 [StructLayout(LayoutKind.Sequential)]902 internal struct SIGNATURE_INFO903 {904 /// DWORD->unsigned int905 internal uint cbSize;906 907 /// SIGNATURE_STATE->Anonymous_7e0526d8_af30_47f9_9233_a77658d0f1e5908 internal SIGNATURE_STATE nSignatureState;909 910 /// SIGNATURE_INFO_TYPE->Anonymous_27075e4b_faa5_4e57_ada0_6d49fae74187911 internal SIGNATURE_INFO_TYPE nSignatureType;912 913 /// DWORD->unsigned int914 internal uint dwSignatureInfoAvailability;915 916 /// DWORD->unsigned int917 internal uint dwInfoAvailability;918 919 /// PWSTR->WCHAR*920 [MarshalAs(UnmanagedType.LPWStr)]921 internal string pszDisplayName;922 923 /// DWORD->unsigned int924 internal uint cchDisplayName;925 926 /// PWSTR->WCHAR*927 [MarshalAs(UnmanagedType.LPWStr)]928 internal string pszPublisherName;929 930 /// DWORD->unsigned int931 internal uint cchPublisherName;932 933 /// PWSTR->WCHAR*934 [MarshalAs(UnmanagedType.LPWStr)]935 internal string pszMoreInfoURL;936 937 /// DWORD->unsigned int938 internal uint cchMoreInfoURL;939 940 /// LPBYTE->BYTE*941 internal System.IntPtr prgbHash;942 943 /// DWORD->unsigned int944 internal uint cbHash;945 946 /// BOOL->int947 internal int fOSBinary;948 }949 950 [StructLayout(LayoutKind.Sequential)]951 internal struct CERT_INFO952 {953 /// DWORD->unsigned int954 internal uint dwVersion;955 956 /// CRYPT_INTEGER_BLOB->_CRYPTOAPI_BLOB957 internal CRYPT_ATTR_BLOB SerialNumber;958 959 /// CRYPT_ALGORITHM_IDENTIFIER->_CRYPT_ALGORITHM_IDENTIFIER960 internal CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm;961 962 /// CERT_NAME_BLOB->_CRYPTOAPI_BLOB963 internal CRYPT_ATTR_BLOB Issuer;964 965 /// FILETIME->_FILETIME966 internal FILETIME NotBefore;967 968 /// FILETIME->_FILETIME969 internal FILETIME NotAfter;970 971 /// CERT_NAME_BLOB->_CRYPTOAPI_BLOB972 internal CRYPT_ATTR_BLOB Subject;973 974 /// CERT_PUBLIC_KEY_INFO->_CERT_PUBLIC_KEY_INFO975 internal CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo;976 977 /// CRYPT_BIT_BLOB->_CRYPT_BIT_BLOB978 internal CRYPT_BIT_BLOB IssuerUniqueId;979 980 /// CRYPT_BIT_BLOB->_CRYPT_BIT_BLOB981 internal CRYPT_BIT_BLOB SubjectUniqueId;982 983 /// DWORD->unsigned int984 internal uint cExtension;985 986 /// PCERT_EXTENSION->_CERT_EXTENSION*987 internal System.IntPtr rgExtension;988 }989 990 [StructLayout(LayoutKind.Sequential)]991 internal struct CRYPT_ALGORITHM_IDENTIFIER992 {993 /// LPSTR->CHAR*994 [MarshalAs(UnmanagedType.LPStr)]995 internal string pszObjId;996 997 /// CRYPT_OBJID_BLOB->_CRYPTOAPI_BLOB998 internal CRYPT_ATTR_BLOB Parameters;999 }1000 1001 [StructLayout(LayoutKind.Sequential)]1002 internal struct FILETIME1003 {1004 /// DWORD->unsigned int1005 internal uint dwLowDateTime;1006 1007 /// DWORD->unsigned int1008 internal uint dwHighDateTime;1009 }1010 1011 [StructLayout(LayoutKind.Sequential)]1012 internal struct CERT_PUBLIC_KEY_INFO1013 {1014 /// CRYPT_ALGORITHM_IDENTIFIER->_CRYPT_ALGORITHM_IDENTIFIER1015 internal CRYPT_ALGORITHM_IDENTIFIER Algorithm;1016 1017 /// CRYPT_BIT_BLOB->_CRYPT_BIT_BLOB1018 internal CRYPT_BIT_BLOB PublicKey;1019 }1020 1021 [StructLayout(LayoutKind.Sequential)]1022 internal struct CRYPT_BIT_BLOB1023 {1024 /// DWORD->unsigned int1025 internal uint cbData;1026 1027 /// BYTE*1028 internal System.IntPtr pbData;1029 1030 /// DWORD->unsigned int1031 internal uint cUnusedBits;1032 }1033 1034 [StructLayout(LayoutKind.Sequential)]1035 internal struct CERT_EXTENSION1036 {1037 /// LPSTR->CHAR*1038 [MarshalAs(UnmanagedType.LPStr)]1039 internal string pszObjId;1040 1041 /// BOOL->int1042 internal int fCritical;1043 1044 /// CRYPT_OBJID_BLOB->_CRYPTOAPI_BLOB1045 internal CRYPT_ATTR_BLOB Value;1046 }1047 }1048 1049 /// <summary>1050 /// Pinvoke methods from certca.dll.1051 /// </summary>1052 internal static partial class NativeMethods1053 {1054 internal const int CRYPT_E_NOT_FOUND = unchecked((int)0x80092004);1055 internal const int E_INVALID_DATA = unchecked((int)0x8007000d);1056 internal const int NTE_NOT_SUPPORTED = unchecked((int)0x80090029);1057 1058 internal enum AltNameType : uint1059 {1060 CERT_ALT_NAME_OTHER_NAME = 1,1061 CERT_ALT_NAME_RFC822_NAME = 2,1062 CERT_ALT_NAME_DNS_NAME = 3,1063 CERT_ALT_NAME_X400_ADDRESS = 4,1064 CERT_ALT_NAME_DIRECTORY_NAME = 5,1065 CERT_ALT_NAME_EDI_PARTY_NAME = 6,1066 CERT_ALT_NAME_URL = 7,1067 CERT_ALT_NAME_IP_ADDRESS = 8,1068 CERT_ALT_NAME_REGISTERED_ID = 9,1069 }1070 1071 internal enum CryptDecodeFlags : uint1072 {1073 CRYPT_DECODE_ENABLE_PUNYCODE_FLAG = 0x02000000,1074 CRYPT_DECODE_ENABLE_UTF8PERCENT_FLAG = 0x04000000,1075 CRYPT_DECODE_ENABLE_IA5CONVERSION_FLAG = (CRYPT_DECODE_ENABLE_PUNYCODE_FLAG | CRYPT_DECODE_ENABLE_UTF8PERCENT_FLAG),1076 }1077 }1078 1079 #region SAFER_APIs1080 1081 // SAFER native methods1082 internal static partial class NativeMethods1083 {1084 /// Return Type: BOOL->int1085 ///dwNumProperties: DWORD->unsigned int1086 ///pCodeProperties: PSAFER_CODE_PROPERTIES->_SAFER_CODE_PROPERTIES*1087 ///pLevelHandle: SAFER_LEVEL_HANDLE*1088 ///lpReserved: LPVOID->void*1089 [DllImport("advapi32.dll", EntryPoint = "SaferIdentifyLevel", SetLastError = true)]1090 [return: MarshalAs(UnmanagedType.Bool)]1091 internal static extern bool SaferIdentifyLevel(1092 uint dwNumProperties,1093 [In]1094 ref SAFER_CODE_PROPERTIES pCodeProperties,1095 out IntPtr pLevelHandle,1096 [In]1097 [MarshalAs(UnmanagedType.LPWStr)]1098 string bucket);1099 1100 /// Return Type: BOOL->int1101 ///LevelHandle: SAFER_LEVEL_HANDLE->SAFER_LEVEL_HANDLE__*1102 ///InAccessToken: HANDLE->void*1103 ///OutAccessToken: PHANDLE->HANDLE*1104 ///dwFlags: DWORD->unsigned int1105 ///lpReserved: LPVOID->void*1106 [DllImport("advapi32.dll", EntryPoint = "SaferComputeTokenFromLevel", SetLastError = true)]1107 [return: MarshalAs(UnmanagedType.Bool)]1108 internal static extern bool SaferComputeTokenFromLevel(1109 [In]1110 IntPtr LevelHandle,1111 [In]1112 System.IntPtr InAccessToken,1113 ref System.IntPtr OutAccessToken,1114 uint dwFlags,1115 System.IntPtr lpReserved);1116 1117 /// Return Type: BOOL->int1118 ///hLevelHandle: SAFER_LEVEL_HANDLE->SAFER_LEVEL_HANDLE__*1119 [DllImport("advapi32.dll", EntryPoint = "SaferCloseLevel")]1120 [return: MarshalAs(UnmanagedType.Bool)]1121 internal static extern bool SaferCloseLevel([In] IntPtr hLevelHandle);1122 1123 /// Return Type: BOOL->int1124 ///hObject: HANDLE->void*1125 [DllImport(PinvokeDllNames.CloseHandleDllName, EntryPoint = "CloseHandle")]1126 [return: MarshalAs(UnmanagedType.Bool)]1127 internal static extern bool CloseHandle([In] System.IntPtr hObject);1128 }1129 1130 [StructLayout(LayoutKind.Sequential)]1131 internal struct SAFER_CODE_PROPERTIES1132 {1133 /// DWORD->unsigned int1134 public uint cbSize;1135 1136 /// DWORD->unsigned int1137 public uint dwCheckFlags;1138 1139 /// LPCWSTR->WCHAR*1140 [MarshalAs(UnmanagedType.LPWStr)]1141 public string ImagePath;1142 1143 /// HANDLE->void*1144 public System.IntPtr hImageFileHandle;1145 1146 /// DWORD->unsigned int1147 public uint UrlZoneId;1148 1149 /// BYTE[SAFER_MAX_HASH_SIZE]1150 [MarshalAs(1151 UnmanagedType.ByValArray,1152 SizeConst = NativeConstants.SAFER_MAX_HASH_SIZE,1153 ArraySubType = UnmanagedType.I1)]1154 public byte[] ImageHash;1155 1156 /// DWORD->unsigned int1157 public uint dwImageHashSize;1158 1159 /// LARGE_INTEGER->_LARGE_INTEGER1160 public LARGE_INTEGER ImageSize;1161 1162 /// ALG_ID->unsigned int1163 public uint HashAlgorithm;1164 1165 /// LPBYTE->BYTE*1166 public System.IntPtr pByteBlock;1167 1168 /// HWND->HWND__*1169 public System.IntPtr hWndParent;1170 1171 /// DWORD->unsigned int1172 public uint dwWVTUIChoice;1173 }1174 1175 [StructLayout(LayoutKind.Explicit)]1176 internal struct LARGE_INTEGER1177 {1178 /// Anonymous_9320654f_2227_43bf_a385_74cc8c5626861179 [FieldOffset(0)]1180 public Anonymous_9320654f_2227_43bf_a385_74cc8c562686 Struct1;1181 1182 /// Anonymous_947eb392_1446_4e25_bbd4_10e98165f3a91183 [FieldOffset(0)]1184 public Anonymous_947eb392_1446_4e25_bbd4_10e98165f3a9 u;1185 1186 /// LONGLONG->__int641187 [FieldOffset(0)]1188 public long QuadPart;1189 }1190 1191 [StructLayout(LayoutKind.Sequential)]1192 internal struct HWND__1193 {1194 /// int1195 public int unused;1196 }1197 1198 [StructLayout(LayoutKind.Sequential)]1199 internal struct Anonymous_9320654f_2227_43bf_a385_74cc8c5626861200 {