Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Interop.cs
Go to the documentation of this file.
1using System;
4using System.Text;
5
6internal static class Interop
7{
8 internal static class Advapi32
9 {
10 [Flags]
12 {
13 None = 0
14 }
15
21
22 internal enum CryptHashProperty
23 {
24 HP_ALGID = 1,
25 HP_HASHVAL = 2,
26 HP_HASHSIZE = 4,
27 HP_HMAC_INFO = 5,
30 }
31
33 {
34 CRYPT_EXPORT = 4,
35 KP_IV = 1,
37 KP_ALGID = 7,
38 KP_KEYLEN = 9
39 }
40
41 internal enum CryptProvParam
42 {
44 PP_IMPTYPE = 3,
45 PP_NAME = 4,
46 PP_CONTAINER = 6,
47 PP_PROVTYPE = 16,
48 PP_KEYSET_TYPE = 27,
52 }
53
54 internal enum KeySpec
55 {
58 }
59
60 [Flags]
62 {
63 None = 0,
67 }
68
69 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, EntryPoint = "CryptAcquireContextW", SetLastError = true)]
70 public static extern bool CryptAcquireContext(out SafeProvHandle phProv, string szContainer, string szProvider, int dwProvType, uint dwFlags);
71
72 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
73 internal static extern bool CryptCreateHash(SafeProvHandle hProv, int Algid, SafeKeyHandle hKey, CryptCreateHashFlags dwFlags, out SafeHashHandle phHash);
74
75 [DllImport("advapi32.dll", SetLastError = true)]
76 public static extern bool CryptDecrypt(SafeKeyHandle hKey, SafeHashHandle hHash, bool Final, int dwFlags, byte[] pbData, ref int pdwDataLen);
77
78 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
79 internal static extern bool CryptDeriveKey(SafeProvHandle hProv, int Algid, SafeHashHandle hBaseData, int dwFlags, out SafeKeyHandle phKey);
80
81 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
82 public static extern bool CryptDestroyHash(IntPtr hHash);
83
84 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
85 public static extern bool CryptDestroyKey(IntPtr hKey);
86
87 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
88 public static extern bool CryptEncrypt(SafeKeyHandle hKey, SafeHashHandle hHash, bool Final, int dwFlags, byte[] pbData, ref int pdwDataLen, int dwBufLen);
89
90 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
91 public static extern bool CryptExportKey(SafeKeyHandle hKey, SafeKeyHandle hExpKey, int dwBlobType, int dwFlags, [In][Out] byte[] pbData, ref int dwDataLen);
92
93 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
94 internal static extern bool CryptGenKey(SafeProvHandle hProv, int Algid, int dwFlags, out SafeKeyHandle phKey);
95
96 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, EntryPoint = "CryptGetDefaultProviderW", SetLastError = true)]
97 public static extern bool CryptGetDefaultProvider(int dwProvType, IntPtr pdwReserved, GetDefaultProviderFlags dwFlags, [Out] StringBuilder pszProvName, ref int pcbProvName);
98
99 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
100 public static extern bool CryptGetHashParam(SafeHashHandle hHash, CryptHashProperty dwParam, out int pbData, [In][Out] ref int pdwDataLen, int dwFlags);
101
102 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
103 public static extern bool CryptSetHashParam(SafeHashHandle hHash, CryptHashProperty dwParam, byte[] buffer, int dwFlags);
104
105 [DllImport("advapi32.dll", SetLastError = true)]
106 public static extern bool CryptGetKeyParam(SafeKeyHandle hKey, CryptGetKeyParamFlags dwParam, byte[] pbData, ref int pdwDataLen, int dwFlags);
107
108 [DllImport("advapi32.dll", SetLastError = true)]
109 public static extern bool CryptSetProvParam(SafeHandle safeProvHandle, CryptProvParam dwParam, IntPtr pbData, int dwFlags);
110
111 [DllImport("advapi32.dll", SetLastError = true)]
112 public static extern bool CryptSetProvParam(SafeProvHandle hProv, CryptProvParam dwParam, ref IntPtr pbData, int dwFlags);
113
114 [DllImport("advapi32.dll", SetLastError = true)]
115 public static extern bool CryptGetProvParam(SafeHandle safeProvHandle, CryptProvParam dwParam, IntPtr pbData, ref int dwDataLen, int dwFlags);
116
117 public unsafe static bool CryptGetProvParam(SafeHandle safeProvHandle, CryptProvParam dwParam, Span<byte> pbData, ref int dwDataLen)
118 {
119 if (pbData.IsEmpty)
120 {
121 return CryptGetProvParam(safeProvHandle, dwParam, IntPtr.Zero, ref dwDataLen, 0);
122 }
123 if (dwDataLen > pbData.Length)
124 {
125 throw new IndexOutOfRangeException();
126 }
127 fixed (byte* ptr = &MemoryMarshal.GetReference(pbData))
128 {
129 return CryptGetProvParam(safeProvHandle, dwParam, (IntPtr)ptr, ref dwDataLen, 0);
130 }
131 }
132
133 [DllImport("advapi32.dll", SetLastError = true)]
134 internal static extern bool CryptGetUserKey(SafeProvHandle hProv, int dwKeySpec, out SafeKeyHandle phUserKey);
135
136 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
137 public static extern bool CryptHashData(SafeHashHandle hHash, byte[] pbData, int dwDataLen, int dwFlags);
138
139 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
140 internal unsafe static extern bool CryptImportKey(SafeProvHandle hProv, byte* pbData, int dwDataLen, SafeKeyHandle hPubKey, int dwFlags, out SafeKeyHandle phKey);
141
142 [DllImport("advapi32.dll", SetLastError = true)]
143 public static extern bool CryptReleaseContext(IntPtr hProv, int dwFlags);
144
145 [DllImport("advapi32.dll", SetLastError = true)]
146 public static extern bool CryptSetKeyParam(SafeKeyHandle hKey, int dwParam, byte[] pbData, int dwFlags);
147
148 [DllImport("advapi32.dll", SetLastError = true)]
149 public static extern bool CryptSetKeyParam(SafeKeyHandle safeKeyHandle, int dwParam, ref int pdw, int dwFlags);
150
151 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, EntryPoint = "CryptSignHashW", SetLastError = true)]
152 public static extern bool CryptSignHash(SafeHashHandle hHash, KeySpec dwKeySpec, string szDescription, CryptSignAndVerifyHashFlags dwFlags, [Out] byte[] pbSignature, [In][Out] ref int pdwSigLen);
153
154 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, EntryPoint = "CryptVerifySignatureW", SetLastError = true)]
155 public static extern bool CryptVerifySignature(SafeHashHandle hHash, byte[] pbSignature, int dwSigLen, SafeKeyHandle hPubKey, string szDescription, CryptSignAndVerifyHashFlags dwFlags);
156 }
157
158 internal static class Crypt32
159 {
160 internal struct CRYPT_OID_INFO
161 {
162 public int cbSize;
163
164 public IntPtr pszOID;
165
166 public IntPtr pwszName;
167
168 public OidGroup dwGroupId;
169
170 public int AlgId;
171
172 public int cbData;
173
174 public IntPtr pbData;
175 }
176
186
187 internal static CRYPT_OID_INFO FindOidInfo(CryptOidInfoKeyType keyType, string key, OidGroup group, bool fallBackToAllGroups)
188 {
189 IntPtr intPtr = IntPtr.Zero;
190 try
191 {
192 intPtr = keyType switch
193 {
194 CryptOidInfoKeyType.CRYPT_OID_INFO_OID_KEY => Marshal.StringToCoTaskMemAnsi(key),
195 CryptOidInfoKeyType.CRYPT_OID_INFO_NAME_KEY => Marshal.StringToCoTaskMemUni(key),
196 _ => throw new NotSupportedException(),
197 };
199 {
200 OidGroup group2 = group | (OidGroup)(-2147483648);
201 IntPtr intPtr2 = CryptFindOIDInfo(keyType, intPtr, group2);
202 if (intPtr2 != IntPtr.Zero)
203 {
204 return Marshal.PtrToStructure<CRYPT_OID_INFO>(intPtr2);
205 }
206 }
207 IntPtr intPtr3 = CryptFindOIDInfo(keyType, intPtr, group);
208 if (intPtr3 != IntPtr.Zero)
209 {
210 return Marshal.PtrToStructure<CRYPT_OID_INFO>(intPtr3);
211 }
212 if (fallBackToAllGroups && group != 0)
213 {
214 IntPtr intPtr4 = CryptFindOIDInfo(keyType, intPtr, OidGroup.All);
215 if (intPtr4 != IntPtr.Zero)
216 {
217 return Marshal.PtrToStructure<CRYPT_OID_INFO>(intPtr4);
218 }
219 }
220 CRYPT_OID_INFO result = default(CRYPT_OID_INFO);
221 result.AlgId = -1;
222 return result;
223 }
224 finally
225 {
226 if (intPtr != IntPtr.Zero)
227 {
228 Marshal.FreeCoTaskMem(intPtr);
229 }
230 }
231 }
232
234 {
235 if (group != OidGroup.HashAlgorithm && group != OidGroup.EncryptionAlgorithm && group != OidGroup.PublicKeyAlgorithm && group != OidGroup.SignatureAlgorithm && group != OidGroup.Attribute && group != OidGroup.ExtensionOrAttribute)
236 {
237 return group == OidGroup.KeyDerivationFunction;
238 }
239 return true;
240 }
241
242 [DllImport("crypt32.dll", CharSet = CharSet.Unicode)]
243 private static extern IntPtr CryptFindOIDInfo(CryptOidInfoKeyType dwKeyType, IntPtr pvKey, OidGroup group);
244 }
245
246 internal static class Kernel32
247 {
248 [DllImport("kernel32.dll", BestFitMapping = true, CharSet = CharSet.Unicode, EntryPoint = "FormatMessageW", ExactSpelling = true, SetLastError = true)]
249 private unsafe static extern int FormatMessage(int dwFlags, IntPtr lpSource, uint dwMessageId, int dwLanguageId, void* lpBuffer, int nSize, IntPtr arguments);
250
251 internal static string GetMessage(int errorCode)
252 {
253 return GetMessage(errorCode, IntPtr.Zero);
254 }
255
256 internal unsafe static string GetMessage(int errorCode, IntPtr moduleHandle)
257 {
258 int num = 12800;
259 if (moduleHandle != IntPtr.Zero)
260 {
261 num |= 0x800;
262 }
263 Span<char> span = stackalloc char[256];
264 fixed (char* lpBuffer = span)
265 {
266 int num2 = FormatMessage(num, moduleHandle, (uint)errorCode, 0, lpBuffer, span.Length, IntPtr.Zero);
267 if (num2 > 0)
268 {
269 return GetAndTrimString(span.Slice(0, num2));
270 }
271 }
272 if (Marshal.GetLastWin32Error() == 122)
273 {
274 IntPtr intPtr = default(IntPtr);
275 try
276 {
277 int num3 = FormatMessage(num | 0x100, moduleHandle, (uint)errorCode, 0, &intPtr, 0, IntPtr.Zero);
278 if (num3 > 0)
279 {
280 return GetAndTrimString(new Span<char>((void*)intPtr, num3));
281 }
282 }
283 finally
284 {
285 Marshal.FreeHGlobal(intPtr);
286 }
287 }
288 return $"Unknown error (0x{errorCode:x})";
289 }
290
291 private static string GetAndTrimString(Span<char> buffer)
292 {
293 int num = buffer.Length;
294 while (num > 0 && buffer[num - 1] <= ' ')
295 {
296 num--;
297 }
298 return buffer.Slice(0, num).ToString();
299 }
300 }
301}
static bool CryptReleaseContext(IntPtr hProv, int dwFlags)
static bool CryptSetProvParam(SafeHandle safeProvHandle, CryptProvParam dwParam, IntPtr pbData, int dwFlags)
static bool CryptGetKeyParam(SafeKeyHandle hKey, CryptGetKeyParamFlags dwParam, byte[] pbData, ref int pdwDataLen, int dwFlags)
CryptSignAndVerifyHashFlags
Definition Interop.cs:62
static unsafe bool CryptGetProvParam(SafeHandle safeProvHandle, CryptProvParam dwParam, Span< byte > pbData, ref int dwDataLen)
Definition Interop.cs:117
static bool CryptGenKey(SafeProvHandle hProv, int Algid, int dwFlags, out SafeKeyHandle phKey)
static bool CryptVerifySignature(SafeHashHandle hHash, byte[] pbSignature, int dwSigLen, SafeKeyHandle hPubKey, string szDescription, CryptSignAndVerifyHashFlags dwFlags)
static bool CryptCreateHash(SafeProvHandle hProv, int Algid, SafeKeyHandle hKey, CryptCreateHashFlags dwFlags, out SafeHashHandle phHash)
static bool CryptSetHashParam(SafeHashHandle hHash, CryptHashProperty dwParam, byte[] buffer, int dwFlags)
static bool CryptEncrypt(SafeKeyHandle hKey, SafeHashHandle hHash, bool Final, int dwFlags, byte[] pbData, ref int pdwDataLen, int dwBufLen)
static bool CryptHashData(SafeHashHandle hHash, byte[] pbData, int dwDataLen, int dwFlags)
static bool CryptAcquireContext(out SafeProvHandle phProv, string szContainer, string szProvider, int dwProvType, uint dwFlags)
static bool CryptGetProvParam(SafeHandle safeProvHandle, CryptProvParam dwParam, IntPtr pbData, ref int dwDataLen, int dwFlags)
static bool CryptExportKey(SafeKeyHandle hKey, SafeKeyHandle hExpKey, int dwBlobType, int dwFlags, [In][Out] byte[] pbData, ref int dwDataLen)
static bool CryptDeriveKey(SafeProvHandle hProv, int Algid, SafeHashHandle hBaseData, int dwFlags, out SafeKeyHandle phKey)
static bool CryptDestroyKey(IntPtr hKey)
static bool CryptGetHashParam(SafeHashHandle hHash, CryptHashProperty dwParam, out int pbData, [In][Out] ref int pdwDataLen, int dwFlags)
static bool CryptSetKeyParam(SafeKeyHandle safeKeyHandle, int dwParam, ref int pdw, int dwFlags)
static bool CryptSetProvParam(SafeProvHandle hProv, CryptProvParam dwParam, ref IntPtr pbData, int dwFlags)
static bool CryptSetKeyParam(SafeKeyHandle hKey, int dwParam, byte[] pbData, int dwFlags)
static bool CryptDestroyHash(IntPtr hHash)
static bool CryptGetDefaultProvider(int dwProvType, IntPtr pdwReserved, GetDefaultProviderFlags dwFlags, [Out] StringBuilder pszProvName, ref int pcbProvName)
static bool CryptGetUserKey(SafeProvHandle hProv, int dwKeySpec, out SafeKeyHandle phUserKey)
static bool CryptDecrypt(SafeKeyHandle hKey, SafeHashHandle hHash, bool Final, int dwFlags, byte[] pbData, ref int pdwDataLen)
static bool CryptSignHash(SafeHashHandle hHash, KeySpec dwKeySpec, string szDescription, CryptSignAndVerifyHashFlags dwFlags, [Out] byte[] pbSignature, [In][Out] ref int pdwSigLen)
static unsafe bool CryptImportKey(SafeProvHandle hProv, byte *pbData, int dwDataLen, SafeKeyHandle hPubKey, int dwFlags, out SafeKeyHandle phKey)
static CRYPT_OID_INFO FindOidInfo(CryptOidInfoKeyType keyType, string key, OidGroup group, bool fallBackToAllGroups)
Definition Interop.cs:187
static IntPtr CryptFindOIDInfo(CryptOidInfoKeyType dwKeyType, IntPtr pvKey, OidGroup group)
static bool OidGroupWillNotUseActiveDirectory(OidGroup group)
Definition Interop.cs:900
static unsafe string GetMessage(int errorCode, IntPtr moduleHandle)
Definition Interop.cs:256
static void SetLastError(int errorCode)
static string GetMessage(int errorCode)
Definition Interop.cs:251
static unsafe int FormatMessage(int dwFlags, IntPtr lpSource, uint dwMessageId, int dwLanguageId, void *lpBuffer, int nSize, IntPtr arguments)
static string GetAndTrimString(Span< char > buffer)
Definition Interop.cs:153
static unsafe IntPtr StringToCoTaskMemUni(string? s)
Definition Marshal.cs:1327
static void FreeHGlobal(IntPtr hglobal)
Definition Marshal.cs:1680
static void FreeCoTaskMem(IntPtr ptr)
Definition Marshal.cs:1712
static ? object PtrToStructure(IntPtr ptr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors|DynamicallyAccessedMemberTypes.NonPublicConstructors)] Type structureType)
Definition Marshal.cs:1164
static unsafe IntPtr StringToCoTaskMemAnsi(string? s)
Definition Marshal.cs:1362
static readonly IntPtr Zero
Definition IntPtr.cs:18
bool IsEmpty
Definition Span.cs:79
Span< T > Slice(int start)
Definition Span.cs:271
int Length
Definition Span.cs:70