Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
CertificatePal.cs
Go to the documentation of this file.
1using System;
3using System.IO;
7using System.Text;
10
12
14{
16
17 public IntPtr Handle => _certContext.DangerousGetHandle();
18
20
22
24
26
27 public byte[] Thumbprint
28 {
29 get
30 {
31 int pcbData = 0;
32 if (!global::Interop.crypt32.CertGetCertificateContextProperty(_certContext, CertContextPropId.CERT_SHA1_HASH_PROP_ID, null, ref pcbData))
33 {
34 throw Marshal.GetHRForLastWin32Error().ToCryptographicException();
35 }
36 byte[] array = new byte[pcbData];
37 if (!global::Interop.crypt32.CertGetCertificateContextProperty(_certContext, CertContextPropId.CERT_SHA1_HASH_PROP_ID, array, ref pcbData))
38 {
39 throw Marshal.GetHRForLastWin32Error().ToCryptographicException();
40 }
41 return array;
42 }
43 }
44
45 public unsafe string KeyAlgorithm
46 {
47 get
48 {
50 string result = Marshal.PtrToStringAnsi(certContext->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId);
51 GC.KeepAlive(this);
52 return result;
53 }
54 }
55
56 public unsafe byte[] KeyAlgorithmParameters
57 {
58 get
59 {
61 string text = Marshal.PtrToStringAnsi(certContext->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId);
62 int num = ((!(text == "1.2.840.113549.1.1.1")) ? global::Interop.Crypt32.FindOidInfo(global::Interop.Crypt32.CryptOidInfoKeyType.CRYPT_OID_INFO_OID_KEY, text, OidGroup.PublicKeyAlgorithm, fallBackToAllGroups: true).AlgId : 41984);
63 byte* ptr = (byte*)5;
64 byte[] result = ((num != 8704 || certContext->pCertInfo->SubjectPublicKeyInfo.Algorithm.Parameters.cbData != 0 || certContext->pCertInfo->SubjectPublicKeyInfo.Algorithm.Parameters.pbData != ptr) ? certContext->pCertInfo->SubjectPublicKeyInfo.Algorithm.Parameters.ToByteArray() : PropagateKeyAlgorithmParametersFromChain());
65 GC.KeepAlive(this);
66 return result;
67 }
68 }
69
70 public unsafe byte[] PublicKeyValue
71 {
72 get
73 {
75 byte[] result = certContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.ToByteArray();
76 GC.KeepAlive(this);
77 return result;
78 }
79 }
80
81 public unsafe byte[] SerialNumber
82 {
83 get
84 {
86 byte[] array = certContext->pCertInfo->SerialNumber.ToByteArray();
88 GC.KeepAlive(this);
89 return array;
90 }
91 }
92
93 public unsafe string SignatureAlgorithm
94 {
95 get
96 {
98 string result = Marshal.PtrToStringAnsi(certContext->pCertInfo->SignatureAlgorithm.pszObjId);
99 GC.KeepAlive(this);
100 return result;
101 }
102 }
103
104 public unsafe DateTime NotAfter
105 {
106 get
107 {
109 DateTime result = certContext->pCertInfo->NotAfter.ToDateTime();
110 GC.KeepAlive(this);
111 return result;
112 }
113 }
114
115 public unsafe DateTime NotBefore
116 {
117 get
118 {
120 DateTime result = certContext->pCertInfo->NotBefore.ToDateTime();
121 GC.KeepAlive(this);
122 return result;
123 }
124 }
125
126 public unsafe byte[] RawData
127 {
128 get
129 {
131 byte[] result = new Span<byte>(certContext->pbCertEncoded, certContext->cbCertEncoded).ToArray();
132 GC.KeepAlive(this);
133 return result;
134 }
135 }
136
137 public unsafe int Version
138 {
139 get
140 {
142 int result = certContext->pCertInfo->dwVersion + 1;
143 GC.KeepAlive(this);
144 return result;
145 }
146 }
147
148 public unsafe bool Archived
149 {
150 get
151 {
152 int pcbData = 0;
153 return global::Interop.crypt32.CertGetCertificateContextProperty(_certContext, CertContextPropId.CERT_ARCHIVED_PROP_ID, null, ref pcbData);
154 }
155 set
156 {
158 CRYPTOAPI_BLOB* pvData = (value ? (&cRYPTOAPI_BLOB) : null);
159 if (!global::Interop.crypt32.CertSetCertificateContextProperty(_certContext, CertContextPropId.CERT_ARCHIVED_PROP_ID, CertSetPropertyFlags.None, pvData))
160 {
161 throw Marshal.GetLastWin32Error().ToCryptographicException();
162 }
163 }
164 }
165
166 public unsafe string FriendlyName
167 {
168 get
169 {
170 int pcbData = 0;
171 if (!global::Interop.crypt32.CertGetCertificateContextPropertyString(_certContext, CertContextPropId.CERT_FRIENDLY_NAME_PROP_ID, null, ref pcbData))
172 {
173 return string.Empty;
174 }
175 int num = (pcbData + 1) / 2;
176 Span<char> span = ((num > 256) ? ((Span<char>)new char[num]) : stackalloc char[num]);
178 fixed (char* pvData = &MemoryMarshal.GetReference(span2))
179 {
180 if (!global::Interop.crypt32.CertGetCertificateContextPropertyString(_certContext, CertContextPropId.CERT_FRIENDLY_NAME_PROP_ID, (byte*)pvData, ref pcbData))
181 {
182 return string.Empty;
183 }
184 }
185 return new string(span2.Slice(0, pcbData / 2 - 1));
186 }
187 set
188 {
189 string text = ((value == null) ? string.Empty : value);
191 try
192 {
193 CRYPTOAPI_BLOB cRYPTOAPI_BLOB = new CRYPTOAPI_BLOB(checked(2 * (text.Length + 1)), (byte*)(void*)intPtr);
194 if (!global::Interop.crypt32.CertSetCertificateContextProperty(_certContext, CertContextPropId.CERT_FRIENDLY_NAME_PROP_ID, CertSetPropertyFlags.None, &cRYPTOAPI_BLOB))
195 {
196 throw Marshal.GetLastWin32Error().ToCryptographicException();
197 }
198 }
199 finally
200 {
202 }
203 }
204 }
205
207 {
208 get
209 {
212 GC.KeepAlive(this);
213 return result;
214 }
215 }
216
218 {
219 get
220 {
223 GC.KeepAlive(this);
224 return result;
225 }
226 }
227
229 {
230 get
231 {
233 int cExtension = pCertInfo->cExtension;
234 X509Extension[] array = new X509Extension[cExtension];
235 for (int i = 0; i < cExtension; i++)
236 {
237 CERT_EXTENSION* ptr = pCertInfo->rgExtension + i;
238 string value = Marshal.PtrToStringAnsi(ptr->pszObjId);
239 Oid oid = new Oid(value, null);
240 bool critical = ptr->fCritical != 0;
241 byte[] rawData = ptr->Value.ToByteArray();
243 }
244 GC.KeepAlive(this);
245 return array;
246 }
247 }
248
250 {
251 get
252 {
253 SafeCertContextHandle result = global::Interop.crypt32.CertDuplicateCertificateContext(_certContext.DangerousGetHandle());
255 return result;
256 }
257 }
258
260
262 {
263 if (handle == IntPtr.Zero)
264 {
265 throw new ArgumentException(System.SR.Arg_InvalidHandle, "handle");
266 }
267 SafeCertContextHandle safeCertContextHandle = global::Interop.crypt32.CertDuplicateCertificateContext(handle);
268 if (safeCertContextHandle.IsInvalid)
269 {
270 throw (-2147024890).ToCryptographicException();
271 }
272 int pcbData = 0;
274 bool deleteKeyContainer = global::Interop.crypt32.CertGetCertificateContextProperty(safeCertContextHandle, CertContextPropId.CERT_CLR_DELETE_KEY_PROP_ID, out pvData, ref pcbData);
276 }
277
282
284 {
286 try
287 {
288 int pcbData = 0;
289 if (!global::Interop.crypt32.CertGetCertificateContextProperty(_certContext, CertContextPropId.CERT_PUBKEY_ALG_PARA_PROP_ID, null, ref pcbData))
290 {
292 pChainPara.cbSize = sizeof(CERT_CHAIN_PARA);
293 if (!global::Interop.crypt32.CertGetCertificateChain((IntPtr)0, _certContext, null, SafePointerHandle<SafeCertStoreHandle>.InvalidHandle, ref pChainPara, CertChainFlags.None, IntPtr.Zero, out ppChainContext))
294 {
295 throw Marshal.GetHRForLastWin32Error().ToCryptographicException();
296 }
297 if (!global::Interop.crypt32.CertGetCertificateContextProperty(_certContext, CertContextPropId.CERT_PUBKEY_ALG_PARA_PROP_ID, null, ref pcbData))
298 {
299 throw Marshal.GetHRForLastWin32Error().ToCryptographicException();
300 }
301 }
302 byte[] array = new byte[pcbData];
303 if (!global::Interop.crypt32.CertGetCertificateContextProperty(_certContext, CertContextPropId.CERT_PUBKEY_ALG_PARA_PROP_ID, array, ref pcbData))
304 {
305 throw Marshal.GetHRForLastWin32Error().ToCryptographicException();
306 }
307 return array;
308 }
309 finally
310 {
311 ppChainContext?.Dispose();
312 }
313 }
314
316 {
317 return global::Interop.crypt32.CertGetNameString(_certContext, MapNameType(nameType), forIssuer ? CertNameFlags.CERT_NAME_ISSUER_FLAG : CertNameFlags.None, (CertNameStringType)33554435);
318 }
319
321 {
322 if (!HasPrivateKey)
323 {
324 return;
325 }
326 sb.AppendLine();
327 sb.AppendLine();
328 sb.AppendLine("[Private Key]");
330 try
331 {
333 if (privateKeyCsp != null)
334 {
336 }
337 }
339 {
340 }
341 if (cspKeyContainerInfo == null)
342 {
343 return;
344 }
345 sb.AppendLine().Append(" Key Store: ").Append(cspKeyContainerInfo.MachineKeyStore ? "Machine" : "User");
346 sb.AppendLine().Append(" Provider Name: ").Append(cspKeyContainerInfo.ProviderName);
347 sb.AppendLine().Append(" Provider type: ").Append(cspKeyContainerInfo.ProviderType);
348 sb.AppendLine().Append(" Key Spec: ").Append(cspKeyContainerInfo.KeyNumber);
349 sb.AppendLine().Append(" Key Container Name: ").Append(cspKeyContainerInfo.KeyContainerName);
350 try
351 {
352 string uniqueKeyContainerName = cspKeyContainerInfo.UniqueKeyContainerName;
353 sb.AppendLine().Append(" Unique Key Container Name: ").Append(uniqueKeyContainerName);
354 }
356 {
357 }
359 {
360 }
361 try
362 {
363 bool hardwareDevice = cspKeyContainerInfo.HardwareDevice;
364 sb.AppendLine().Append(" Hardware Device: ").Append(hardwareDevice);
365 }
367 {
368 }
369 try
370 {
371 bool removable = cspKeyContainerInfo.Removable;
372 sb.AppendLine().Append(" Removable: ").Append(removable);
373 }
375 {
376 }
377 try
378 {
379 bool @protected = cspKeyContainerInfo.Protected;
380 sb.AppendLine().Append(" Protected: ").Append(@protected);
381 }
383 {
384 }
386 {
387 }
388 }
389
390 public void Dispose()
391 {
393 _certContext = null;
394 if (certContext != null && !certContext.IsInvalid)
395 {
396 certContext.Dispose();
397 }
398 }
399
401 {
402 switch (nameType)
403 {
404 case X509NameType.SimpleName:
405 return CertNameType.CERT_NAME_SIMPLE_DISPLAY_TYPE;
406 case X509NameType.EmailName:
407 return CertNameType.CERT_NAME_EMAIL_TYPE;
408 case X509NameType.UpnName:
409 return CertNameType.CERT_NAME_UPN_TYPE;
410 case X509NameType.DnsName:
411 case X509NameType.DnsFromAlternativeName:
412 return CertNameType.CERT_NAME_DNS_TYPE;
413 case X509NameType.UrlName:
414 return CertNameType.CERT_NAME_URL_TYPE;
415 default:
417 }
418 }
419
420 private string GetIssuerOrSubject(bool issuer, bool reverse)
421 {
422 return global::Interop.crypt32.CertGetNameString(_certContext, CertNameType.CERT_NAME_RDN_TYPE, issuer ? CertNameFlags.CERT_NAME_ISSUER_FLAG : CertNameFlags.None, CertNameStringType.CERT_X500_NAME_STR | (reverse ? CertNameStringType.CERT_NAME_STR_REVERSE_FLAG : ((CertNameStringType)0)));
423 }
424
429
431 {
433 {
435 certContext = global::Interop.crypt32.CertDuplicateCertificateContextWithKeyContainerDeletion(safeCertContextHandle.DangerousGetHandle());
437 }
439 }
440
446
451
456
458 {
459 bool flag = fileName != null;
461 bool deleteKeyContainer = false;
465 try
466 {
468 fixed (byte* pbData = rawData)
469 {
470 fixed (char* ptr = fileName)
471 {
472 CRYPTOAPI_BLOB cRYPTOAPI_BLOB = new CRYPTOAPI_BLOB((!flag) ? rawData.Length : 0, pbData);
473 CertQueryObjectType dwObjectType = (flag ? CertQueryObjectType.CERT_QUERY_OBJECT_FILE : CertQueryObjectType.CERT_QUERY_OBJECT_BLOB);
474 void* pvObject = (flag ? ((void*)ptr) : ((void*)(&cRYPTOAPI_BLOB)));
475 if (!global::Interop.crypt32.CryptQueryObject(dwObjectType, pvObject, ExpectedContentTypeFlags.CERT_QUERY_CONTENT_FLAG_CERT | ExpectedContentTypeFlags.CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT | ExpectedContentTypeFlags.CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED | ExpectedContentTypeFlags.CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED | ExpectedContentTypeFlags.CERT_QUERY_CONTENT_FLAG_PFX, ExpectedFormatTypeFlags.CERT_QUERY_FORMAT_FLAG_ALL, 0, out var _, out pdwContentType, out var _, out phCertStore, out phMsg, out ppvContext))
476 {
478 throw hRForLastWin32Error.ToCryptographicException();
479 }
480 }
481 }
482 switch (pdwContentType)
483 {
484 case ContentType.CERT_QUERY_CONTENT_PKCS7_SIGNED:
485 case ContentType.CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED:
487 break;
488 case ContentType.CERT_QUERY_CONTENT_PFX:
489 if (flag)
490 {
492 }
494 deleteKeyContainer = (keyStorageFlags & (X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.EphemeralKeySet)) == 0;
495 break;
496 }
498 ppvContext = null;
499 return result;
500 }
501 finally
502 {
503 phCertStore?.Dispose();
504 phMsg?.Dispose();
505 ppvContext?.Dispose();
506 }
507 }
508
510 {
511 int pcbData = 4;
512 if (!global::Interop.crypt32.CryptMsgGetParam(hCryptMsg, CryptMessageParameterType.CMSG_SIGNER_COUNT_PARAM, 0, out var pvData, ref pcbData))
513 {
514 throw Marshal.GetHRForLastWin32Error().ToCryptographicException();
515 }
516 if (pvData == 0)
517 {
518 throw (-2146889714).ToCryptographicException();
519 }
520 int pcbData2 = 0;
521 if (!global::Interop.crypt32.CryptMsgGetParam(hCryptMsg, CryptMessageParameterType.CMSG_SIGNER_INFO_PARAM, 0, null, ref pcbData2))
522 {
523 throw Marshal.GetHRForLastWin32Error().ToCryptographicException();
524 }
525 fixed (byte* ptr = new byte[pcbData2])
526 {
527 if (!global::Interop.crypt32.CryptMsgGetParam(hCryptMsg, CryptMessageParameterType.CMSG_SIGNER_INFO_PARAM, 0, ptr, ref pcbData2))
528 {
529 throw Marshal.GetHRForLastWin32Error().ToCryptographicException();
530 }
532 CERT_INFO cERT_INFO = default(CERT_INFO);
533 cERT_INFO.Issuer.cbData = ptr2->Issuer.cbData;
534 cERT_INFO.Issuer.pbData = ptr2->Issuer.pbData;
535 cERT_INFO.SerialNumber.cbData = ptr2->SerialNumber.cbData;
536 cERT_INFO.SerialNumber.pbData = ptr2->SerialNumber.pbData;
537 SafeCertContextHandle pCertContext = null;
538 if (!global::Interop.crypt32.CertFindCertificateInStore(hCertStore, CertFindType.CERT_FIND_SUBJECT_CERT, &cERT_INFO, ref pCertContext))
539 {
540 throw Marshal.GetHRForLastWin32Error().ToCryptographicException();
541 }
542 return pCertContext;
543 }
544 }
545
547 {
549 fixed (byte* pbData = rawData)
550 {
551 CRYPTOAPI_BLOB pPFX = new CRYPTOAPI_BLOB(rawData.Length, pbData);
552 safeCertStoreHandle = global::Interop.crypt32.PFXImportCertStore(ref pPFX, password, pfxCertStoreFlags);
553 if (safeCertStoreHandle.IsInvalid)
554 {
555 throw Marshal.GetHRForLastWin32Error().ToCryptographicException();
556 }
557 }
558 try
559 {
561 SafeCertContextHandle pCertContext = null;
562 while (global::Interop.crypt32.CertEnumCertificatesInStore(safeCertStoreHandle, ref pCertContext))
563 {
564 if (pCertContext.ContainsPrivateKey)
565 {
566 if (!safeCertContextHandle.IsInvalid && safeCertContextHandle.ContainsPrivateKey)
567 {
568 if (pCertContext.HasPersistedPrivateKey)
569 {
571 }
572 }
573 else
574 {
575 safeCertContextHandle.Dispose();
576 safeCertContextHandle = pCertContext.Duplicate();
577 }
578 }
579 else if (safeCertContextHandle.IsInvalid)
580 {
581 safeCertContextHandle = pCertContext.Duplicate();
582 }
583 }
584 if (safeCertContextHandle.IsInvalid)
585 {
587 }
589 }
590 finally
591 {
592 safeCertStoreHandle.Dispose();
593 }
594 }
595
597 {
598 if ((keyStorageFlags & (X509KeyStorageFlags.UserKeySet | X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable | X509KeyStorageFlags.UserProtected | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.EphemeralKeySet)) != keyStorageFlags)
599 {
600 throw new ArgumentException(System.SR.Argument_InvalidFlag, "keyStorageFlags");
601 }
603 if ((keyStorageFlags & X509KeyStorageFlags.UserKeySet) == X509KeyStorageFlags.UserKeySet)
604 {
605 pfxCertStoreFlags |= PfxCertStoreFlags.CRYPT_USER_KEYSET;
606 }
607 else if ((keyStorageFlags & X509KeyStorageFlags.MachineKeySet) == X509KeyStorageFlags.MachineKeySet)
608 {
609 pfxCertStoreFlags |= PfxCertStoreFlags.CRYPT_MACHINE_KEYSET;
610 }
611 if ((keyStorageFlags & X509KeyStorageFlags.Exportable) == X509KeyStorageFlags.Exportable)
612 {
613 pfxCertStoreFlags |= PfxCertStoreFlags.CRYPT_EXPORTABLE;
614 }
615 if ((keyStorageFlags & X509KeyStorageFlags.UserProtected) == X509KeyStorageFlags.UserProtected)
616 {
617 pfxCertStoreFlags |= PfxCertStoreFlags.CRYPT_USER_PROTECTED;
618 }
619 if ((keyStorageFlags & X509KeyStorageFlags.EphemeralKeySet) == X509KeyStorageFlags.EphemeralKeySet)
620 {
621 pfxCertStoreFlags |= PfxCertStoreFlags.PKCS12_ALWAYS_CNG_KSP | PfxCertStoreFlags.PKCS12_NO_PERSIST_KEY;
622 }
623 return pfxCertStoreFlags;
624 }
625
630
635
643
651
653 {
656 if (dSACng != null)
657 {
659 if (certificatePal != null)
660 {
661 return certificatePal;
662 }
663 }
665 {
667 if (certificatePal != null)
668 {
669 return certificatePal;
670 }
671 }
672 DSAParameters parameters = dsa.ExportParameters(includePrivateParameters: true);
673 using (PinAndClear.Track(parameters.X))
674 {
675 using DSACng dSACng2 = new DSACng();
676 dSACng2.ImportParameters(parameters);
677 return CopyWithEphemeralKey(dSACng2.Key);
678 }
679 }
680
682 {
684 {
686 if (certificatePal != null)
687 {
688 return certificatePal;
689 }
690 }
691 ECParameters parameters = ecdsa.ExportParameters(includePrivateParameters: true);
692 using (PinAndClear.Track(parameters.D))
693 {
694 using ECDsaCng eCDsaCng2 = new ECDsaCng();
695 eCDsaCng2.ImportParameters(parameters);
697 }
698 }
699
701 {
703 {
705 if (certificatePal != null)
706 {
707 return certificatePal;
708 }
709 }
710 ECParameters parameters = ecdh.ExportParameters(includePrivateParameters: true);
711 using (PinAndClear.Track(parameters.D))
712 {
714 eCDiffieHellmanCng2.ImportParameters(parameters);
716 }
717 }
718
720 {
723 if (rSACng != null)
724 {
726 if (certificatePal != null)
727 {
728 return certificatePal;
729 }
730 }
732 {
734 if (certificatePal != null)
735 {
736 return certificatePal;
737 }
738 }
739 RSAParameters parameters = rsa.ExportParameters(includePrivateParameters: true);
740 using (PinAndClear.Track(parameters.D))
741 {
742 using (PinAndClear.Track(parameters.P))
743 {
744 using (PinAndClear.Track(parameters.Q))
745 {
746 using (PinAndClear.Track(parameters.DP))
747 {
748 using (PinAndClear.Track(parameters.DQ))
749 {
750 using (PinAndClear.Track(parameters.InverseQ))
751 {
752 using RSACng rSACng2 = new RSACng();
753 rSACng2.ImportParameters(parameters);
754 return CopyWithEphemeralKey(rSACng2.Key);
755 }
756 }
757 }
758 }
759 }
760 }
761 }
762
764 {
767 if (safeNCryptKeyHandle != null)
768 {
770 return createCng(arg);
771 }
773 if (privateKeyCsp == null)
774 {
775 return null;
776 }
777 if (privateKeyCsp.ProviderType == 0)
778 {
779 string providerName = privateKeyCsp.ProviderName;
780 string keyContainerName = privateKeyCsp.KeyContainerName;
781 CngKey arg2 = CngKey.Open(keyContainerName, new CngProvider(providerName));
782 return createCng(arg2);
783 }
784 privateKeyCsp.Flags |= CspProviderFlags.UseExistingKey;
785 return createCsp(privateKeyCsp);
786 }
787
789 {
790 if (!certificateContext.HasPersistedPrivateKey)
791 {
792 int pcbData = IntPtr.Size;
793 if (global::Interop.crypt32.CertGetCertificateContextProperty(certificateContext, CertContextPropId.CERT_NCRYPT_KEY_HANDLE_PROP_ID, out IntPtr pvData, ref pcbData))
794 {
797 }
798 }
799 bool pfCallerFreeProvOrNCryptKey = true;
802 try
803 {
804 int pdwKeySpec = 0;
805 if (!global::Interop.crypt32.CryptAcquireCertificatePrivateKey(certificateContext, CryptAcquireFlags.CRYPT_ACQUIRE_ONLY_NCRYPT_KEY_FLAG, IntPtr.Zero, out phCryptProvOrNCryptKey, out pdwKeySpec, out pfCallerFreeProvOrNCryptKey))
806 {
808 phCryptProvOrNCryptKey?.SetHandleAsInvalid();
809 return null;
810 }
812 {
814 phCryptProvOrNCryptKey.SetHandleAsInvalid();
817 }
819 }
820 catch
821 {
823 {
824 phCryptProvOrNCryptKey.SetHandleAsInvalid();
825 }
826 throw;
827 }
828 }
829
831 {
832 int pcbData = 0;
833 if (!global::Interop.crypt32.CertGetCertificateContextProperty(_certContext, CertContextPropId.CERT_KEY_PROV_INFO_PROP_ID, null, ref pcbData))
834 {
836 if (lastWin32Error == -2146885628)
837 {
838 return null;
839 }
840 throw lastWin32Error.ToCryptographicException();
841 }
842 byte[] array = new byte[pcbData];
843 fixed (byte* ptr = array)
844 {
845 if (!global::Interop.crypt32.CertGetCertificateContextProperty(_certContext, CertContextPropId.CERT_KEY_PROV_INFO_PROP_ID, array, ref pcbData))
846 {
847 throw Marshal.GetLastWin32Error().ToCryptographicException();
848 }
851 cspParameters.ProviderName = Marshal.PtrToStringUni((IntPtr)ptr2->pwszProvName);
852 cspParameters.KeyContainerName = Marshal.PtrToStringUni((IntPtr)ptr2->pwszContainerName);
853 cspParameters.ProviderType = ptr2->dwProvType;
854 cspParameters.KeyNumber = ptr2->dwKeySpec;
855 cspParameters.Flags = (((ptr2->dwFlags & CryptAcquireContextFlags.CRYPT_MACHINE_KEYSET) == CryptAcquireContextFlags.CRYPT_MACHINE_KEYSET) ? CspProviderFlags.UseMachineKeyStore : CspProviderFlags.NoFlags);
856 return cspParameters;
857 }
858 }
859
861 {
862 //The blocks IL_0090, IL_00a9, IL_00ac, IL_00ae, IL_00ce are reachable both inside and outside the pinned region starting at IL_008b. ILSpy has duplicated these blocks in order to place them both within and outside the `fixed` statement.
863 if (string.IsNullOrEmpty(cngKey.KeyName))
864 {
865 return null;
866 }
868 CngProvider provider = cngKey.Provider;
869 string keyName = cngKey.KeyName;
870 bool isMachineKey = cngKey.IsMachineKey;
871 int dwKeySpec = GuessKeySpec(provider, keyName, isMachineKey, cngKey.AlgorithmGroup);
873 fixed (char* pwszContainerName = cngKey.KeyName)
874 {
875 string provider2 = cngKey.Provider.Provider;
876 char* intPtr;
878 int dwFlags;
879 if (provider2 == null)
880 {
881 char* pwszProvName;
882 intPtr = (pwszProvName = null);
883 cRYPT_KEY_PROV_INFO.pwszContainerName = pwszContainerName;
884 cRYPT_KEY_PROV_INFO.pwszProvName = pwszProvName;
886 dwFlags = (isMachineKey ? 32 : 0);
887 reference.dwFlags = (CryptAcquireContextFlags)dwFlags;
888 cRYPT_KEY_PROV_INFO.dwKeySpec = dwKeySpec;
889 if (!global::Interop.crypt32.CertSetCertificateContextProperty(certificatePal._certContext, CertContextPropId.CERT_KEY_PROV_INFO_PROP_ID, CertSetPropertyFlags.None, &cRYPT_KEY_PROV_INFO))
890 {
891 certificatePal.Dispose();
892 throw Marshal.GetLastWin32Error().ToCryptographicException();
893 }
894 }
895 else
896 {
897 fixed (char* ptr = &provider2.GetPinnableReference())
898 {
899 char* pwszProvName;
900 intPtr = (pwszProvName = ptr);
901 cRYPT_KEY_PROV_INFO.pwszContainerName = pwszContainerName;
902 cRYPT_KEY_PROV_INFO.pwszProvName = pwszProvName;
904 dwFlags = (int)(reference.dwFlags = (isMachineKey ? CryptAcquireContextFlags.CRYPT_MACHINE_KEYSET : CryptAcquireContextFlags.None));
905 cRYPT_KEY_PROV_INFO.dwKeySpec = dwKeySpec;
906 if (!global::Interop.crypt32.CertSetCertificateContextProperty(certificatePal._certContext, CertContextPropId.CERT_KEY_PROV_INFO_PROP_ID, CertSetPropertyFlags.None, &cRYPT_KEY_PROV_INFO))
907 {
908 certificatePal.Dispose();
909 throw Marshal.GetLastWin32Error().ToCryptographicException();
910 }
911 }
912 }
913 }
914 return certificatePal;
915 }
916
918 {
920 {
921 return 0;
922 }
923 try
924 {
925 CngKeyOpenOptions openOptions = (machineKey ? CngKeyOpenOptions.MachineKey : CngKeyOpenOptions.None);
927 {
928 return 0;
929 }
930 }
932 {
934 {
935 ProviderName = provider.Provider,
936 KeyContainerName = keyName,
937 Flags = CspProviderFlags.UseExistingKey,
938 KeyNumber = 2
939 };
940 if (machineKey)
941 {
942 cspParameters.Flags |= CspProviderFlags.UseMachineKeyStore;
943 }
945 {
946 return keySpec;
947 }
948 throw;
949 }
950 }
951
953 {
955 {
957 }
959 {
961 }
962 keySpec = 0;
963 return false;
964 }
965
967 {
968 int[] array = new int[4] { 1, 24, 12, 2 };
969 int[] array2 = array;
970 foreach (int providerType in array2)
971 {
972 cspParameters.ProviderType = providerType;
973 try
974 {
976 {
977 keySpec = cspParameters.KeyNumber;
978 return true;
979 }
980 }
982 {
983 }
984 }
985 keySpec = 0;
986 return false;
987 }
988
990 {
991 int[] array = new int[2] { 13, 3 };
992 int[] array2 = array;
993 foreach (int providerType in array2)
994 {
995 cspParameters.ProviderType = providerType;
996 try
997 {
999 {
1000 keySpec = cspParameters.KeyNumber;
1001 return true;
1002 }
1003 }
1005 {
1006 }
1007 }
1008 keySpec = 0;
1009 return false;
1010 }
1011
1013 {
1014 //The blocks IL_0063, IL_0080, IL_0083, IL_0085, IL_00b6 are reachable both inside and outside the pinned region starting at IL_005e. ILSpy has duplicated these blocks in order to place them both within and outside the `fixed` statement.
1015 if (string.IsNullOrEmpty(keyContainerInfo.KeyContainerName))
1016 {
1017 return null;
1018 }
1021 fixed (char* pwszContainerName = keyContainerInfo.KeyContainerName)
1022 {
1023 string? providerName = keyContainerInfo.ProviderName;
1024 char* intPtr;
1026 int dwFlags;
1027 if (providerName == null)
1028 {
1029 char* pwszProvName;
1030 intPtr = (pwszProvName = null);
1031 cRYPT_KEY_PROV_INFO.pwszContainerName = pwszContainerName;
1032 cRYPT_KEY_PROV_INFO.pwszProvName = pwszProvName;
1034 dwFlags = (keyContainerInfo.MachineKeyStore ? 32 : 0);
1035 reference.dwFlags = (CryptAcquireContextFlags)dwFlags;
1036 cRYPT_KEY_PROV_INFO.dwProvType = keyContainerInfo.ProviderType;
1037 cRYPT_KEY_PROV_INFO.dwKeySpec = (int)keyContainerInfo.KeyNumber;
1038 if (!global::Interop.crypt32.CertSetCertificateContextProperty(certificatePal._certContext, CertContextPropId.CERT_KEY_PROV_INFO_PROP_ID, CertSetPropertyFlags.None, &cRYPT_KEY_PROV_INFO))
1039 {
1040 certificatePal.Dispose();
1041 throw Marshal.GetLastWin32Error().ToCryptographicException();
1042 }
1043 }
1044 else
1045 {
1046 fixed (char* ptr = &providerName.GetPinnableReference())
1047 {
1048 char* pwszProvName;
1049 intPtr = (pwszProvName = ptr);
1050 cRYPT_KEY_PROV_INFO.pwszContainerName = pwszContainerName;
1051 cRYPT_KEY_PROV_INFO.pwszProvName = pwszProvName;
1053 dwFlags = (int)(reference.dwFlags = (keyContainerInfo.MachineKeyStore ? CryptAcquireContextFlags.CRYPT_MACHINE_KEYSET : CryptAcquireContextFlags.None));
1054 cRYPT_KEY_PROV_INFO.dwProvType = keyContainerInfo.ProviderType;
1055 cRYPT_KEY_PROV_INFO.dwKeySpec = (int)keyContainerInfo.KeyNumber;
1056 if (!global::Interop.crypt32.CertSetCertificateContextProperty(certificatePal._certContext, CertContextPropId.CERT_KEY_PROV_INFO_PROP_ID, CertSetPropertyFlags.None, &cRYPT_KEY_PROV_INFO))
1057 {
1058 certificatePal.Dispose();
1059 throw Marshal.GetLastWin32Error().ToCryptographicException();
1060 }
1061 }
1062 }
1063 }
1064 return certificatePal;
1065 }
1066
1068 {
1071 if (!global::Interop.crypt32.CertSetCertificateContextProperty(certificatePal._certContext, CertContextPropId.CERT_NCRYPT_KEY_HANDLE_PROP_ID, CertSetPropertyFlags.CERT_SET_PROPERTY_INHIBIT_PERSIST_FLAG, handle))
1072 {
1073 certificatePal.Dispose();
1074 throw Marshal.GetLastWin32Error().ToCryptographicException();
1075 }
1076 handle.SetHandleAsInvalid();
1077 return certificatePal;
1078 }
1079}
ICertificatePal CopyWithEphemeralKey(CngKey cngKey)
ICertificatePal CopyWithPrivateKey(DSA dsa)
ICertificatePal CopyWithPrivateKey(ECDiffieHellman ecdh)
static bool TryGuessKeySpec(CspParameters cspParameters, CngAlgorithmGroup algorithmGroup, out int keySpec)
static int GuessKeySpec(CngProvider provider, string keyName, bool machineKey, CngAlgorithmGroup algorithmGroup)
unsafe ICertificatePal CopyWithPersistedCapiKey(CspKeyContainerInfo keyContainerInfo)
static PfxCertStoreFlags MapKeyStorageFlags(X509KeyStorageFlags keyStorageFlags)
static ICertificatePal FromOtherCert(X509Certificate copyFrom)
unsafe X500DistinguishedName IssuerName
string GetIssuerOrSubject(bool issuer, bool reverse)
static ICertificatePal FromHandle(IntPtr handle)
byte[] Export(X509ContentType contentType, SafePasswordHandle password)
static SafeNCryptKeyHandle TryAcquireCngPrivateKey(SafeCertContextHandle certificateContext, out CngKeyHandleOpenOptions handleOptions)
unsafe ICertificatePal CopyWithPersistedCngKey(CngKey cngKey)
static unsafe SafeCertContextHandle FilterPFXStore(ReadOnlySpan< byte > rawData, SafePasswordHandle password, PfxCertStoreFlags pfxCertStoreFlags)
ICertificatePal CopyWithPrivateKey(ECDsa ecdsa)
static unsafe ICertificatePal FromBlobOrFile(ReadOnlySpan< byte > rawData, string fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
static unsafe SafeCertContextHandle GetSignerInPKCS7Store(SafeCertStoreHandle hCertStore, SafeCryptMsgHandle hCryptMsg)
unsafe X500DistinguishedName SubjectName
static bool TryGuessRsaKeySpec(CspParameters cspParameters, out int keySpec)
ICertificatePal CopyWithPrivateKey(RSA rsa)
string GetNameInfo(X509NameType nameType, bool forIssuer)
static bool TryGuessDsaKeySpec(CspParameters cspParameters, out int keySpec)
T GetPrivateKey< T >(Func< CspParameters, T > createCsp, Func< CngKey, T > createCng)
CertificatePal(SafeCertContextHandle certContext, bool deleteKeyContainer)
static CertNameType MapNameType(X509NameType nameType)
static ICertificatePal FromBlob(ReadOnlySpan< byte > rawData, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
static ICertificatePal FromFile(string fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
static IExportPal FromCertificate(ICertificatePalCore cert)
Definition StorePal.cs:254
static void Reverse(Array array)
Definition Array.cs:2207
static void KeepAlive(object? obj)
Definition GC.cs:180
Definition GC.cs:8
static byte[] ReadAllBytes(string path)
Definition File.cs:314
static void FreeHGlobal(IntPtr hglobal)
Definition Marshal.cs:1680
static unsafe? string PtrToStringUni(IntPtr ptr)
Definition Marshal.cs:652
static unsafe? string PtrToStringAnsi(IntPtr ptr)
Definition Marshal.cs:630
static unsafe IntPtr StringToHGlobalUni(string? s)
Definition Marshal.cs:1310
static string Arg_InvalidHandle
Definition SR.cs:14
static string Argument_InvalidFlag
Definition SR.cs:688
static string Cryptography_Pfx_NoCertificates
Definition SR.cs:82
static string NotSupported_ECDiffieHellman_Csp
Definition SR.cs:112
static string NotSupported_ECDsa_Csp
Definition SR.cs:110
static string Argument_InvalidNameType
Definition SR.cs:32
Definition SR.cs:7
static CngKey Open(string keyName)
Definition CngKey.cs:799
static CngProvider MicrosoftSmartCardKeyStorageProvider
static CngProvider MicrosoftSoftwareKeyStorageProvider
StringBuilder Append(char value, int repeatCount)
unsafe CERT_EXTENSION * rgExtension
Definition CERT_INFO.cs:27
static PinAndClear Track(byte[] data)
static int Size
Definition IntPtr.cs:21
static readonly IntPtr Zero
Definition IntPtr.cs:18