Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
X509Pal.cs
Go to the documentation of this file.
1using System;
2using System.IO;
9
11
12internal sealed class X509Pal : IX509Pal
13{
14 public static IX509Pal Instance = new X509Pal();
15
17
18 private X509Pal()
19 {
20 }
21
22 public unsafe byte[] EncodeX509KeyUsageExtension(X509KeyUsageFlags keyUsages)
23 {
24 ushort num = (ushort)keyUsages;
25 CRYPT_BIT_BLOB cRYPT_BIT_BLOB = default(CRYPT_BIT_BLOB);
26 cRYPT_BIT_BLOB.cbData = 2;
27 cRYPT_BIT_BLOB.pbData = (byte*)(&num);
28 cRYPT_BIT_BLOB.cUnusedBits = 0;
29 CRYPT_BIT_BLOB cRYPT_BIT_BLOB2 = cRYPT_BIT_BLOB;
30 return global::Interop.crypt32.EncodeObject(CryptDecodeObjectStructType.X509_KEY_USAGE, &cRYPT_BIT_BLOB2);
31 }
32
33 public unsafe void DecodeX509KeyUsageExtension(byte[] encoded, out X509KeyUsageFlags keyUsages)
34 {
35 uint num = encoded.DecodeObject(CryptDecodeObjectStructType.X509_KEY_USAGE, delegate(void* pvDecoded, int cbDecoded)
36 {
37 byte* pbData = ((CRYPT_BIT_BLOB*)pvDecoded)->pbData;
38 if (pbData != null)
39 {
40 switch (((CRYPT_BIT_BLOB*)pvDecoded)->cbData)
41 {
42 case 1:
43 return *pbData;
44 case 2:
45 return *(ushort*)pbData;
46 }
47 }
48 return 0u;
49 });
50 keyUsages = (X509KeyUsageFlags)num;
51 }
52
53 public unsafe byte[] EncodeX509BasicConstraints2Extension(bool certificateAuthority, bool hasPathLengthConstraint, int pathLengthConstraint)
54 {
55 CERT_BASIC_CONSTRAINTS2_INFO cERT_BASIC_CONSTRAINTS2_INFO = default(CERT_BASIC_CONSTRAINTS2_INFO);
56 cERT_BASIC_CONSTRAINTS2_INFO.fCA = (certificateAuthority ? 1 : 0);
57 cERT_BASIC_CONSTRAINTS2_INFO.fPathLenConstraint = (hasPathLengthConstraint ? 1 : 0);
58 cERT_BASIC_CONSTRAINTS2_INFO.dwPathLenConstraint = pathLengthConstraint;
59 CERT_BASIC_CONSTRAINTS2_INFO cERT_BASIC_CONSTRAINTS2_INFO2 = cERT_BASIC_CONSTRAINTS2_INFO;
60 return global::Interop.crypt32.EncodeObject("2.5.29.19", &cERT_BASIC_CONSTRAINTS2_INFO2);
61 }
62
63 public unsafe void DecodeX509BasicConstraintsExtension(byte[] encoded, out bool certificateAuthority, out bool hasPathLengthConstraint, out int pathLengthConstraint)
64 {
65 (certificateAuthority, hasPathLengthConstraint, pathLengthConstraint) = encoded.DecodeObject(CryptDecodeObjectStructType.X509_BASIC_CONSTRAINTS, (void* pvDecoded, int cbDecoded) => ((*((CERT_BASIC_CONSTRAINTS_INFO*)pvDecoded)->SubjectType.pbData & 0x80) != 0, ((CERT_BASIC_CONSTRAINTS_INFO*)pvDecoded)->fPathLenConstraint != 0, ((CERT_BASIC_CONSTRAINTS_INFO*)pvDecoded)->dwPathLenConstraint));
66 }
67
68 public unsafe void DecodeX509BasicConstraints2Extension(byte[] encoded, out bool certificateAuthority, out bool hasPathLengthConstraint, out int pathLengthConstraint)
69 {
70 (certificateAuthority, hasPathLengthConstraint, pathLengthConstraint) = encoded.DecodeObject(CryptDecodeObjectStructType.X509_BASIC_CONSTRAINTS2, (void* pvDecoded, int cbDecoded) => (((CERT_BASIC_CONSTRAINTS2_INFO*)pvDecoded)->fCA != 0, ((CERT_BASIC_CONSTRAINTS2_INFO*)pvDecoded)->fPathLenConstraint != 0, ((CERT_BASIC_CONSTRAINTS2_INFO*)pvDecoded)->dwPathLenConstraint));
71 }
72
74 {
75 int numOids;
76 using SafeHandle safeHandle = usages.ToLpstrArray(out numOids);
77 CERT_ENHKEY_USAGE cERT_ENHKEY_USAGE = default(CERT_ENHKEY_USAGE);
78 cERT_ENHKEY_USAGE.cUsageIdentifier = numOids;
79 cERT_ENHKEY_USAGE.rgpszUsageIdentifier = (IntPtr*)(void*)safeHandle.DangerousGetHandle();
80 CERT_ENHKEY_USAGE cERT_ENHKEY_USAGE2 = cERT_ENHKEY_USAGE;
81 return global::Interop.crypt32.EncodeObject("2.5.29.37", &cERT_ENHKEY_USAGE2);
82 }
83
84 public unsafe void DecodeX509EnhancedKeyUsageExtension(byte[] encoded, out OidCollection usages)
85 {
86 usages = encoded.DecodeObject(CryptDecodeObjectStructType.X509_ENHANCED_KEY_USAGE, delegate(void* pvDecoded, int cbDecoded)
87 {
88 OidCollection oidCollection = new OidCollection();
89 int cUsageIdentifier = ((CERT_ENHKEY_USAGE*)pvDecoded)->cUsageIdentifier;
90 for (int i = 0; i < cUsageIdentifier; i++)
91 {
92 IntPtr ptr = ((CERT_ENHKEY_USAGE*)pvDecoded)->rgpszUsageIdentifier[i];
93 string oid = Marshal.PtrToStringAnsi(ptr);
94 Oid oid2 = new Oid(oid);
95 oidCollection.Add(oid2);
96 }
97 return oidCollection;
98 });
99 }
100
101 public unsafe byte[] EncodeX509SubjectKeyIdentifierExtension(ReadOnlySpan<byte> subjectKeyIdentifier)
102 {
103 fixed (byte* pbData = subjectKeyIdentifier)
104 {
105 CRYPTOAPI_BLOB cRYPTOAPI_BLOB = new CRYPTOAPI_BLOB(subjectKeyIdentifier.Length, pbData);
106 return global::Interop.crypt32.EncodeObject("2.5.29.14", &cRYPTOAPI_BLOB);
107 }
108 }
109
110 public unsafe void DecodeX509SubjectKeyIdentifierExtension(byte[] encoded, out byte[] subjectKeyIdentifier)
111 {
112 subjectKeyIdentifier = encoded.DecodeObject("2.5.29.14", (void* pvDecoded, int cbDecoded) => ((CRYPTOAPI_BLOB*)pvDecoded)->ToByteArray());
113 }
114
116 {
117 fixed (byte* value = key.Oid.ValueAsAscii())
118 {
119 byte[] rawData = key.EncodedParameters.RawData;
120 fixed (byte* pbData = rawData)
121 {
122 byte[] rawData2 = key.EncodedKeyValue.RawData;
123 fixed (byte* pbData2 = rawData2)
124 {
125 CERT_PUBLIC_KEY_INFO cERT_PUBLIC_KEY_INFO = default(CERT_PUBLIC_KEY_INFO);
126 cERT_PUBLIC_KEY_INFO.Algorithm = new CRYPT_ALGORITHM_IDENTIFIER
127 {
128 pszObjId = new IntPtr(value),
129 Parameters = new CRYPTOAPI_BLOB(rawData.Length, pbData)
130 };
131 cERT_PUBLIC_KEY_INFO.PublicKey = new CRYPT_BIT_BLOB
132 {
133 cbData = rawData2.Length,
134 pbData = pbData2,
135 cUnusedBits = 0
136 };
137 CERT_PUBLIC_KEY_INFO pInfo = cERT_PUBLIC_KEY_INFO;
138 int pcbComputedHash = 20;
139 byte[] array = new byte[pcbComputedHash];
140 if (!global::Interop.crypt32.CryptHashPublicKeyInfo(IntPtr.Zero, 32772, 0, CertEncodingType.All, ref pInfo, array, ref pcbComputedHash))
141 {
142 throw Marshal.GetHRForLastWin32Error().ToCryptographicException();
143 }
144 if (pcbComputedHash < array.Length)
145 {
146 byte[] array2 = new byte[pcbComputedHash];
147 Buffer.BlockCopy(array, 0, array2, 0, pcbComputedHash);
148 array = array2;
149 }
150 return array;
151 }
152 }
153 }
154 }
155
157 {
158 ContentType pdwContentType;
159 fixed (byte* pbData = rawData)
160 {
161 CRYPTOAPI_BLOB cRYPTOAPI_BLOB = new CRYPTOAPI_BLOB(rawData.Length, pbData);
162 if (!global::Interop.crypt32.CryptQueryObject(CertQueryObjectType.CERT_QUERY_OBJECT_BLOB, &cRYPTOAPI_BLOB, ExpectedContentTypeFlags.CERT_QUERY_CONTENT_FLAG_ALL, ExpectedFormatTypeFlags.CERT_QUERY_FORMAT_FLAG_ALL, 0, IntPtr.Zero, out pdwContentType, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero))
163 {
164 throw Marshal.GetLastWin32Error().ToCryptographicException();
165 }
166 }
167 return MapContentType(pdwContentType);
168 }
169
170 public unsafe X509ContentType GetCertContentType(string fileName)
171 {
172 ContentType pdwContentType;
173 fixed (char* pvObject = fileName)
174 {
175 if (!global::Interop.crypt32.CryptQueryObject(CertQueryObjectType.CERT_QUERY_OBJECT_FILE, pvObject, ExpectedContentTypeFlags.CERT_QUERY_CONTENT_FLAG_ALL, ExpectedFormatTypeFlags.CERT_QUERY_FORMAT_FLAG_ALL, 0, IntPtr.Zero, out pdwContentType, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero))
176 {
177 throw Marshal.GetLastWin32Error().ToCryptographicException();
178 }
179 }
180 return MapContentType(pdwContentType);
181 }
182
183 private static X509ContentType MapContentType(ContentType contentType)
184 {
185 switch (contentType)
186 {
187 case ContentType.CERT_QUERY_CONTENT_CERT:
188 return X509ContentType.Cert;
189 case ContentType.CERT_QUERY_CONTENT_SERIALIZED_STORE:
190 return X509ContentType.SerializedStore;
191 case ContentType.CERT_QUERY_CONTENT_SERIALIZED_CERT:
192 return X509ContentType.SerializedCert;
193 case ContentType.CERT_QUERY_CONTENT_PKCS7_SIGNED:
194 case ContentType.CERT_QUERY_CONTENT_PKCS7_UNSIGNED:
195 return X509ContentType.Pkcs7;
196 case ContentType.CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED:
197 return X509ContentType.Authenticode;
198 case ContentType.CERT_QUERY_CONTENT_PFX:
199 return X509ContentType.Pfx;
200 default:
201 return X509ContentType.Unknown;
202 }
203 }
204
206 {
207 if (certificatePal is CertificatePal certificatePal2)
208 {
209 return DecodeECPublicKey(certificatePal2, (CngKey cngKey) => new ECDsaCng(cngKey), delegate(ECDsaCng algorithm, ECParameters ecParams)
210 {
211 algorithm.ImportParameters(ecParams);
212 });
213 }
215 }
216
218 {
219 if (certificatePal is CertificatePal certificatePal2)
220 {
221 return DecodeECPublicKey(certificatePal2, (CngKey cngKey) => new ECDiffieHellmanCng(cngKey), delegate(ECDiffieHellmanCng algorithm, ECParameters ecParams)
222 {
223 algorithm.ImportParameters(ecParams);
224 }, CryptImportPublicKeyInfoFlags.CRYPT_OID_INFO_PUBKEY_ENCRYPT_KEY_FLAG);
225 }
227 }
228
229 public AsymmetricAlgorithm DecodePublicKey(Oid oid, byte[] encodedKeyValue, byte[] encodedParameters, ICertificatePal certificatePal)
230 {
231 switch (global::Interop.Crypt32.FindOidInfo(global::Interop.Crypt32.CryptOidInfoKeyType.CRYPT_OID_INFO_OID_KEY, oid.Value, OidGroup.PublicKeyAlgorithm, fallBackToAllGroups: true).AlgId)
232 {
233 case 9216:
234 case 41984:
235 {
236 byte[] keyBlob2 = DecodeKeyBlob(CryptDecodeObjectStructType.CNG_RSA_PUBLIC_KEY_BLOB, encodedKeyValue);
238 return new RSACng(key);
239 }
240 case 8704:
241 {
242 byte[] keyBlob = ConstructDSSPublicKeyCspBlob(encodedKeyValue, encodedParameters);
243 DSACryptoServiceProvider dSACryptoServiceProvider = new DSACryptoServiceProvider();
244 dSACryptoServiceProvider.ImportCspBlob(keyBlob);
245 return dSACryptoServiceProvider;
246 }
247 default:
249 }
250 }
251
252 private static TAlgorithm DecodeECPublicKey<TAlgorithm>(CertificatePal certificatePal, Func<CngKey, TAlgorithm> factory, Action<TAlgorithm, ECParameters> import, CryptImportPublicKeyInfoFlags importFlags = CryptImportPublicKeyInfoFlags.NONE) where TAlgorithm : AsymmetricAlgorithm, new()
253 {
254 TAlgorithm val;
255 using (Microsoft.Win32.SafeHandles.SafeBCryptKeyHandle safeBCryptKeyHandle = ImportPublicKeyInfo(certificatePal.CertContext, importFlags))
256 {
257 string curveName = GetCurveName(safeBCryptKeyHandle);
258 if (curveName == null)
259 {
261 byte[] keyBlob = ExportKeyBlob(safeBCryptKeyHandle, cngKeyBlobFormat);
262 using CngKey arg = CngKey.Import(keyBlob, cngKeyBlobFormat);
263 val = factory(arg);
264 }
265 else
266 {
268 byte[] keyBlob = ExportKeyBlob(safeBCryptKeyHandle, cngKeyBlobFormat);
269 ECParameters ecParams = default(ECParameters);
270 ExportNamedCurveParameters(ref ecParams, keyBlob, includePrivateParameters: false);
271 ecParams.Curve = ECCurve.CreateFromFriendlyName(curveName);
272 val = new TAlgorithm();
273 import(val, ecParams);
274 }
275 }
276 return val;
277 }
278
280 {
281 bool success = false;
282 certContext.DangerousAddRef(ref success);
283 try
284 {
285 if (!global::Interop.crypt32.CryptImportPublicKeyInfoEx2(CertEncodingType.X509_ASN_ENCODING, &certContext.CertContext->pCertInfo->SubjectPublicKeyInfo, importFlags, null, out var phKey))
286 {
287 throw Marshal.GetHRForLastWin32Error().ToCryptographicException();
288 }
289 return phKey;
290 }
291 finally
292 {
293 if (success)
294 {
295 certContext.DangerousRelease();
296 }
297 }
298 }
299
300 private static byte[] ExportKeyBlob(Microsoft.Win32.SafeHandles.SafeBCryptKeyHandle bCryptKeyHandle, CngKeyBlobFormat blobFormat)
301 {
302 string format = blobFormat.Format;
303 int pcbResult = 0;
304 global::Interop.BCrypt.NTSTATUS nTSTATUS = global::Interop.BCrypt.BCryptExportKey(bCryptKeyHandle, IntPtr.Zero, format, null, 0, out pcbResult, 0);
305 if (nTSTATUS != 0)
306 {
307 throw new CryptographicException(global::Interop.Kernel32.GetMessage((int)nTSTATUS));
308 }
309 byte[] array = new byte[pcbResult];
310 nTSTATUS = global::Interop.BCrypt.BCryptExportKey(bCryptKeyHandle, IntPtr.Zero, format, array, array.Length, out pcbResult, 0);
311 if (nTSTATUS != 0)
312 {
313 throw new CryptographicException(global::Interop.Kernel32.GetMessage((int)nTSTATUS));
314 }
315 Array.Resize(ref array, pcbResult);
316 return array;
317 }
318
319 private unsafe static void ExportNamedCurveParameters(ref ECParameters ecParams, byte[] ecBlob, bool includePrivateParameters)
320 {
321 fixed (byte* ptr = &ecBlob[0])
322 {
323 global::Interop.BCrypt.BCRYPT_ECCKEY_BLOB* ptr2 = (global::Interop.BCrypt.BCRYPT_ECCKEY_BLOB*)ptr;
324 int offset = sizeof(global::Interop.BCrypt.BCRYPT_ECCKEY_BLOB);
325 ecParams.Q = new ECPoint
326 {
327 X = global::Interop.BCrypt.Consume(ecBlob, ref offset, ptr2->cbKey),
328 Y = global::Interop.BCrypt.Consume(ecBlob, ref offset, ptr2->cbKey)
329 };
330 if (includePrivateParameters)
331 {
332 ecParams.D = global::Interop.BCrypt.Consume(ecBlob, ref offset, ptr2->cbKey);
333 }
334 }
335 }
336
337 private static byte[] DecodeKeyBlob(CryptDecodeObjectStructType lpszStructType, byte[] encodedKeyValue)
338 {
339 int pcbStructInfo = 0;
340 if (!global::Interop.crypt32.CryptDecodeObject(CertEncodingType.All, lpszStructType, encodedKeyValue, encodedKeyValue.Length, CryptDecodeObjectFlags.None, null, ref pcbStructInfo))
341 {
342 throw Marshal.GetLastWin32Error().ToCryptographicException();
343 }
344 byte[] array = new byte[pcbStructInfo];
345 if (!global::Interop.crypt32.CryptDecodeObject(CertEncodingType.All, lpszStructType, encodedKeyValue, encodedKeyValue.Length, CryptDecodeObjectFlags.None, array, ref pcbStructInfo))
346 {
347 throw Marshal.GetLastWin32Error().ToCryptographicException();
348 }
349 return array;
350 }
351
352 private static byte[] ConstructDSSPublicKeyCspBlob(byte[] encodedKeyValue, byte[] encodedParameters)
353 {
354 byte[] array = DecodeDssKeyValue(encodedKeyValue);
355 DecodeDssParameters(encodedParameters, out var p, out var q, out var g);
356 int num = p.Length;
357 if (num == 0)
358 {
359 throw (-2146893803).ToCryptographicException();
360 }
361 int capacity = 16 + num + 20 + num + num + 24;
362 MemoryStream memoryStream = new MemoryStream(capacity);
363 BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
364 binaryWriter.Write((byte)6);
365 binaryWriter.Write((byte)2);
366 binaryWriter.Write((short)0);
367 binaryWriter.Write(8704u);
368 binaryWriter.Write(827544388);
369 binaryWriter.Write(num * 8);
370 binaryWriter.Write(p);
371 int num2 = q.Length;
372 if (num2 == 0 || num2 > 20)
373 {
374 throw (-2146893803).ToCryptographicException();
375 }
376 binaryWriter.Write(q);
377 if (20 > num2)
378 {
379 binaryWriter.Write(new byte[20 - num2]);
380 }
381 num2 = g.Length;
382 if (num2 == 0 || num2 > num)
383 {
384 throw (-2146893803).ToCryptographicException();
385 }
386 binaryWriter.Write(g);
387 if (num > num2)
388 {
389 binaryWriter.Write(new byte[num - num2]);
390 }
391 num2 = array.Length;
392 if (num2 == 0 || num2 > num)
393 {
394 throw (-2146893803).ToCryptographicException();
395 }
396 binaryWriter.Write(array);
397 if (num > num2)
398 {
399 binaryWriter.Write(new byte[num - num2]);
400 }
401 binaryWriter.Write(uint.MaxValue);
402 binaryWriter.Write(new byte[20]);
403 return memoryStream.ToArray();
404 }
405
406 private unsafe static byte[] DecodeDssKeyValue(byte[] encodedKeyValue)
407 {
408 return encodedKeyValue.DecodeObject(CryptDecodeObjectStructType.X509_DSS_PUBLICKEY, (void* pvDecoded, int cbDecoded) => ((CRYPTOAPI_BLOB*)pvDecoded)->ToByteArray());
409 }
410
411 private unsafe static void DecodeDssParameters(byte[] encodedParameters, out byte[] p, out byte[] q, out byte[] g)
412 {
413 (p, q, g) = encodedParameters.DecodeObject(CryptDecodeObjectStructType.X509_DSS_PARAMETERS, (void* pvDecoded, int cbDecoded) => (((CERT_DSS_PARAMETERS*)pvDecoded)->p.ToByteArray(), ((CERT_DSS_PARAMETERS*)pvDecoded)->q.ToByteArray(), ((CERT_DSS_PARAMETERS*)pvDecoded)->g.ToByteArray()));
414 }
415
417 {
418 byte[] property = GetProperty(bcryptHandle, "ECCParameters");
419 if (property != null)
420 {
421 return property.Length != 0;
422 }
423 return false;
424 }
425
426 private static string GetCurveName(Microsoft.Win32.SafeHandles.SafeBCryptKeyHandle bcryptHandle)
427 {
428 return GetPropertyAsString(bcryptHandle, "ECCCurveName");
429 }
430
431 private unsafe static string GetPropertyAsString(Microsoft.Win32.SafeHandles.SafeBCryptKeyHandle cryptHandle, string propertyName)
432 {
433 byte[] property = GetProperty(cryptHandle, propertyName);
434 if (property == null || property.Length == 0)
435 {
436 return null;
437 }
438 fixed (byte* ptr = &property[0])
439 {
440 return Marshal.PtrToStringUni((IntPtr)ptr);
441 }
442 }
443
444 private unsafe static byte[] GetProperty(Microsoft.Win32.SafeHandles.SafeBCryptKeyHandle cryptHandle, string propertyName)
445 {
446 if (global::Interop.BCrypt.BCryptGetProperty(cryptHandle, propertyName, null, 0, out var pcbResult, 0) != 0)
447 {
448 return null;
449 }
450 byte[] array = new byte[pcbResult];
451 global::Interop.BCrypt.NTSTATUS nTSTATUS;
452 fixed (byte* pbOutput = array)
453 {
454 nTSTATUS = global::Interop.BCrypt.BCryptGetProperty(cryptHandle, propertyName, pbOutput, array.Length, out pcbResult, 0);
455 }
456 if (nTSTATUS != 0)
457 {
458 return null;
459 }
460 Array.Resize(ref array, pcbResult);
461 return array;
462 }
463
464 public unsafe string X500DistinguishedNameDecode(byte[] encodedDistinguishedName, X500DistinguishedNameFlags flag)
465 {
466 int dwStrType = (int)(CertNameStrTypeAndFlags.CERT_X500_NAME_STR | MapNameToStrFlag(flag));
467 fixed (byte* pbData = encodedDistinguishedName)
468 {
469 Unsafe.SkipInit(out CRYPTOAPI_BLOB cRYPTOAPI_BLOB);
470 cRYPTOAPI_BLOB.cbData = encodedDistinguishedName.Length;
471 cRYPTOAPI_BLOB.pbData = pbData;
472 int num = global::Interop.Crypt32.CertNameToStr(65537, &cRYPTOAPI_BLOB, dwStrType, null, 0);
473 if (num == 0)
474 {
475 throw (-2146762476).ToCryptographicException();
476 }
477 Span<char> span = ((num > 256) ? ((Span<char>)new char[num]) : stackalloc char[num]);
478 Span<char> span2 = span;
479 fixed (char* psz = span2)
480 {
481 if (global::Interop.Crypt32.CertNameToStr(65537, &cRYPTOAPI_BLOB, dwStrType, psz, num) == 0)
482 {
483 throw (-2146762476).ToCryptographicException();
484 }
485 }
486 return new string(span2.Slice(0, num - 1));
487 }
488 }
489
490 public byte[] X500DistinguishedNameEncode(string distinguishedName, X500DistinguishedNameFlags flag)
491 {
492 CertNameStrTypeAndFlags dwStrType = CertNameStrTypeAndFlags.CERT_X500_NAME_STR | MapNameToStrFlag(flag);
493 int pcbEncoded = 0;
494 if (!global::Interop.crypt32.CertStrToName(CertEncodingType.All, distinguishedName, dwStrType, IntPtr.Zero, null, ref pcbEncoded, IntPtr.Zero))
495 {
496 throw Marshal.GetLastWin32Error().ToCryptographicException();
497 }
498 byte[] array = new byte[pcbEncoded];
499 if (!global::Interop.crypt32.CertStrToName(CertEncodingType.All, distinguishedName, dwStrType, IntPtr.Zero, array, ref pcbEncoded, IntPtr.Zero))
500 {
501 throw Marshal.GetLastWin32Error().ToCryptographicException();
502 }
503 return array;
504 }
505
506 public unsafe string X500DistinguishedNameFormat(byte[] encodedDistinguishedName, bool multiLine)
507 {
508 if (encodedDistinguishedName == null || encodedDistinguishedName.Length == 0)
509 {
510 return string.Empty;
511 }
512 int dwFormatStrType = (multiLine ? 1 : 0);
513 int pcbFormat = 0;
514 if (!global::Interop.Crypt32.CryptFormatObject(1, 0, dwFormatStrType, IntPtr.Zero, (byte*)7, encodedDistinguishedName, encodedDistinguishedName.Length, null, ref pcbFormat))
515 {
516 return encodedDistinguishedName.ToHexStringUpper();
517 }
518 int num = (pcbFormat + 1) / 2;
519 Span<char> span = ((num > 256) ? ((Span<char>)new char[num]) : stackalloc char[num]);
520 Span<char> span2 = span;
521 fixed (char* pbFormat = span2)
522 {
523 if (!global::Interop.Crypt32.CryptFormatObject(1, 0, dwFormatStrType, IntPtr.Zero, (byte*)7, encodedDistinguishedName, encodedDistinguishedName.Length, pbFormat, ref pcbFormat))
524 {
525 return encodedDistinguishedName.ToHexStringUpper();
526 }
527 }
528 return new string(span2.Slice(0, pcbFormat / 2 - 1));
529 }
530
532 {
533 uint num = 29169u;
534 CertNameStrTypeAndFlags certNameStrTypeAndFlags = (CertNameStrTypeAndFlags)0;
535 if (flag != 0)
536 {
537 if ((flag & X500DistinguishedNameFlags.Reversed) == X500DistinguishedNameFlags.Reversed)
538 {
539 certNameStrTypeAndFlags |= CertNameStrTypeAndFlags.CERT_NAME_STR_REVERSE_FLAG;
540 }
541 if ((flag & X500DistinguishedNameFlags.UseSemicolons) == X500DistinguishedNameFlags.UseSemicolons)
542 {
543 certNameStrTypeAndFlags |= CertNameStrTypeAndFlags.CERT_NAME_STR_SEMICOLON_FLAG;
544 }
545 else if ((flag & X500DistinguishedNameFlags.UseCommas) == X500DistinguishedNameFlags.UseCommas)
546 {
547 certNameStrTypeAndFlags |= CertNameStrTypeAndFlags.CERT_NAME_STR_COMMA_FLAG;
548 }
549 else if ((flag & X500DistinguishedNameFlags.UseNewLines) == X500DistinguishedNameFlags.UseNewLines)
550 {
551 certNameStrTypeAndFlags |= CertNameStrTypeAndFlags.CERT_NAME_STR_CRLF_FLAG;
552 }
553 if ((flag & X500DistinguishedNameFlags.DoNotUsePlusSign) == X500DistinguishedNameFlags.DoNotUsePlusSign)
554 {
555 certNameStrTypeAndFlags |= CertNameStrTypeAndFlags.CERT_NAME_STR_NO_PLUS_FLAG;
556 }
557 if ((flag & X500DistinguishedNameFlags.DoNotUseQuotes) == X500DistinguishedNameFlags.DoNotUseQuotes)
558 {
559 certNameStrTypeAndFlags |= CertNameStrTypeAndFlags.CERT_NAME_STR_NO_QUOTING_FLAG;
560 }
561 if ((flag & X500DistinguishedNameFlags.ForceUTF8Encoding) == X500DistinguishedNameFlags.ForceUTF8Encoding)
562 {
563 certNameStrTypeAndFlags |= CertNameStrTypeAndFlags.CERT_NAME_STR_FORCE_UTF8_DIR_STR_FLAG;
564 }
565 if ((flag & X500DistinguishedNameFlags.UseUTF8Encoding) == X500DistinguishedNameFlags.UseUTF8Encoding)
566 {
567 certNameStrTypeAndFlags |= CertNameStrTypeAndFlags.CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG;
568 }
569 else if ((flag & X500DistinguishedNameFlags.UseT61Encoding) == X500DistinguishedNameFlags.UseT61Encoding)
570 {
571 certNameStrTypeAndFlags |= CertNameStrTypeAndFlags.CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG;
572 }
573 }
574 return certNameStrTypeAndFlags;
575 }
576}
static byte[] ConstructDSSPublicKeyCspBlob(byte[] encodedKeyValue, byte[] encodedParameters)
Definition X509Pal.cs:352
static unsafe void ExportNamedCurveParameters(ref ECParameters ecParams, byte[] ecBlob, bool includePrivateParameters)
Definition X509Pal.cs:319
ECDiffieHellman DecodeECDiffieHellmanPublicKey(ICertificatePal certificatePal)
Definition X509Pal.cs:217
unsafe byte[] EncodeX509SubjectKeyIdentifierExtension(ReadOnlySpan< byte > subjectKeyIdentifier)
Definition X509Pal.cs:101
unsafe byte[] ComputeCapiSha1OfPublicKey(PublicKey key)
Definition X509Pal.cs:115
static unsafe void DecodeDssParameters(byte[] encodedParameters, out byte[] p, out byte[] q, out byte[] g)
Definition X509Pal.cs:411
ECDsa DecodeECDsaPublicKey(ICertificatePal certificatePal)
Definition X509Pal.cs:205
unsafe string X500DistinguishedNameDecode(byte[] encodedDistinguishedName, X500DistinguishedNameFlags flag)
Definition X509Pal.cs:464
unsafe void DecodeX509KeyUsageExtension(byte[] encoded, out X509KeyUsageFlags keyUsages)
Definition X509Pal.cs:33
unsafe void DecodeX509EnhancedKeyUsageExtension(byte[] encoded, out OidCollection usages)
Definition X509Pal.cs:84
static CertNameStrTypeAndFlags MapNameToStrFlag(X500DistinguishedNameFlags flag)
Definition X509Pal.cs:531
unsafe byte[] EncodeX509BasicConstraints2Extension(bool certificateAuthority, bool hasPathLengthConstraint, int pathLengthConstraint)
Definition X509Pal.cs:53
byte[] X500DistinguishedNameEncode(string distinguishedName, X500DistinguishedNameFlags flag)
Definition X509Pal.cs:490
unsafe void DecodeX509BasicConstraintsExtension(byte[] encoded, out bool certificateAuthority, out bool hasPathLengthConstraint, out int pathLengthConstraint)
Definition X509Pal.cs:63
static byte[] ExportKeyBlob(Microsoft.Win32.SafeHandles.SafeBCryptKeyHandle bCryptKeyHandle, CngKeyBlobFormat blobFormat)
Definition X509Pal.cs:300
unsafe byte[] EncodeX509KeyUsageExtension(X509KeyUsageFlags keyUsages)
Definition X509Pal.cs:22
static unsafe string GetPropertyAsString(Microsoft.Win32.SafeHandles.SafeBCryptKeyHandle cryptHandle, string propertyName)
Definition X509Pal.cs:431
static string GetCurveName(Microsoft.Win32.SafeHandles.SafeBCryptKeyHandle bcryptHandle)
Definition X509Pal.cs:426
static bool HasExplicitParameters(Microsoft.Win32.SafeHandles.SafeBCryptKeyHandle bcryptHandle)
Definition X509Pal.cs:416
unsafe byte[] EncodeX509EnhancedKeyUsageExtension(OidCollection usages)
Definition X509Pal.cs:73
AsymmetricAlgorithm DecodePublicKey(Oid oid, byte[] encodedKeyValue, byte[] encodedParameters, ICertificatePal certificatePal)
Definition X509Pal.cs:229
static TAlgorithm DecodeECPublicKey< TAlgorithm >(CertificatePal certificatePal, Func< CngKey, TAlgorithm > factory, Action< TAlgorithm, ECParameters > import, CryptImportPublicKeyInfoFlags importFlags=CryptImportPublicKeyInfoFlags.NONE)
Definition X509Pal.cs:252
unsafe void DecodeX509BasicConstraints2Extension(byte[] encoded, out bool certificateAuthority, out bool hasPathLengthConstraint, out int pathLengthConstraint)
Definition X509Pal.cs:68
unsafe void DecodeX509SubjectKeyIdentifierExtension(byte[] encoded, out byte[] subjectKeyIdentifier)
Definition X509Pal.cs:110
unsafe X509ContentType GetCertContentType(string fileName)
Definition X509Pal.cs:170
static unsafe byte[] DecodeDssKeyValue(byte[] encodedKeyValue)
Definition X509Pal.cs:406
static unsafe Microsoft.Win32.SafeHandles.SafeBCryptKeyHandle ImportPublicKeyInfo(SafeCertContextHandle certContext, CryptImportPublicKeyInfoFlags importFlags)
Definition X509Pal.cs:279
unsafe X509ContentType GetCertContentType(ReadOnlySpan< byte > rawData)
Definition X509Pal.cs:156
static byte[] DecodeKeyBlob(CryptDecodeObjectStructType lpszStructType, byte[] encodedKeyValue)
Definition X509Pal.cs:337
static X509ContentType MapContentType(ContentType contentType)
Definition X509Pal.cs:183
static unsafe byte[] GetProperty(Microsoft.Win32.SafeHandles.SafeBCryptKeyHandle cryptHandle, string propertyName)
Definition X509Pal.cs:444
unsafe string X500DistinguishedNameFormat(byte[] encodedDistinguishedName, bool multiLine)
Definition X509Pal.cs:506
static void BlockCopy(Array src, int srcOffset, Array dst, int dstOffset, int count)
Definition Buffer.cs:102
virtual void Write(bool value)
virtual byte[] ToArray()
static unsafe? string PtrToStringUni(IntPtr ptr)
Definition Marshal.cs:652
static unsafe? string PtrToStringAnsi(IntPtr ptr)
Definition Marshal.cs:630
static string NotSupported_KeyAlgorithm
Definition SR.cs:114
Definition SR.cs:7
static CngKey Import(ReadOnlySpan< byte > keyBlob, CngKeyBlobFormat format)
Definition CngKey.cs:525
override void ImportParameters(ECParameters parameters)
override void ImportParameters(ECParameters parameters)
Definition ECDsaCng.cs:263
CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo
Definition CERT_INFO.cs:19
static readonly IntPtr Zero
Definition IntPtr.cs:18
static ECCurve CreateFromFriendlyName(string oidFriendlyName)
Definition ECCurve.cs:135
Span< T > Slice(int start)
Definition Span.cs:271