Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
X509Certificate2.cs
Go to the documentation of this file.
2using System.IO;
6using System.Text;
9
11
13{
14 private volatile byte[] _lazyRawData;
15
16 private volatile Oid _lazySignatureAlgorithm;
17
18 private volatile int _lazyVersion;
19
21
23
24 private volatile PublicKey _lazyPublicKey;
25
27
29
30 private static readonly string[] s_EcPublicKeyPrivateKeyLabels = new string[2] { "EC PRIVATE KEY", "PRIVATE KEY" };
31
32 private static readonly string[] s_RsaPublicKeyPrivateKeyLabels = new string[2] { "RSA PRIVATE KEY", "PRIVATE KEY" };
33
34 private static readonly string[] s_DsaPublicKeyPrivateKeyLabels = new string[1] { "PRIVATE KEY" };
35
36 internal new ICertificatePal Pal => (ICertificatePal)base.Pal;
37
38 public bool Archived
39 {
40 get
41 {
43 return Pal.Archived;
44 }
45 [SupportedOSPlatform("windows")]
46 set
47 {
50 }
51 }
52
78
79 public string FriendlyName
80 {
81 get
82 {
84 return Pal.FriendlyName;
85 }
86 [SupportedOSPlatform("windows")]
87 set
88 {
91 }
92 }
93
94 public bool HasPrivateKey
95 {
96 get
97 {
99 return Pal.HasPrivateKey;
100 }
101 }
102
103 [Obsolete("X509Certificate2.PrivateKey is obsolete. Use the appropriate method to get the private key, such as GetRSAPrivateKey, or use the CopyWithPrivateKey method to create a new instance with a private key.", DiagnosticId = "SYSLIB0028", UrlFormat = "https://aka.ms/dotnet-warnings/{0}")]
105 {
106 get
107 {
109 if (!HasPrivateKey)
110 {
111 return null;
112 }
113 if (_lazyPrivateKey == null)
114 {
115 string keyAlgorithm = GetKeyAlgorithm();
117 if (!(keyAlgorithm == "1.2.840.113549.1.1.1"))
118 {
119 if (!(keyAlgorithm == "1.2.840.10040.4.1"))
120 {
122 }
123 lazyPrivateKey = Pal.GetDSAPrivateKey();
124 }
125 else
126 {
127 lazyPrivateKey = Pal.GetRSAPrivateKey();
128 }
130 }
131 return _lazyPrivateKey;
132 }
133 set
134 {
136 }
137 }
138
140 {
141 get
142 {
145 if (x500DistinguishedName == null)
146 {
147 x500DistinguishedName = (_lazyIssuerName = Pal.IssuerName);
148 }
150 }
151 }
152
154
156
158 {
159 get
160 {
163 if (publicKey == null)
164 {
165 string keyAlgorithm = GetKeyAlgorithm();
167 byte[] publicKey2 = GetPublicKey();
168 Oid oid = new Oid(keyAlgorithm);
170 }
171 return publicKey;
172 }
173 }
174
175 public byte[] RawData
176 {
177 get
178 {
180 byte[] array = _lazyRawData;
181 if (array == null)
182 {
183 array = (_lazyRawData = Pal.RawData);
184 }
185 return array.CloneByteArray();
186 }
187 }
188
190
192 {
193 get
194 {
197 if (oid == null)
198 {
199 string signatureAlgorithm = Pal.SignatureAlgorithm;
201 }
202 return oid;
203 }
204 }
205
207 {
208 get
209 {
212 if (x500DistinguishedName == null)
213 {
214 x500DistinguishedName = (_lazySubjectName = Pal.SubjectName);
215 }
217 }
218 }
219
220 public string Thumbprint => GetCertHashString();
221
222 public int Version
223 {
224 get
225 {
227 int num = _lazyVersion;
228 if (num == 0)
229 {
230 num = (_lazyVersion = Pal.Version);
231 }
232 return num;
233 }
234 }
235
236 public override void Reset()
237 {
238 _lazyRawData = null;
240 _lazyVersion = 0;
241 _lazySubjectName = null;
242 _lazyIssuerName = null;
243 _lazyPublicKey = null;
244 _lazyPrivateKey = null;
245 _lazyExtensions = null;
246 base.Reset();
247 }
248
249 [Obsolete("X509Certificate and X509Certificate2 are immutable. Use the appropriate constructor to create a new certificate.", DiagnosticId = "SYSLIB0026", UrlFormat = "https://aka.ms/dotnet-warnings/{0}")]
251 {
252 }
253
255 : base(rawData)
256 {
257 }
258
259 public X509Certificate2(byte[] rawData, string? password)
261 {
262 }
263
264 [CLSCompliant(false)]
267 {
268 }
269
274
275 [CLSCompliant(false)]
280
285
290
292 : base(handle)
293 {
294 }
295
297 : base(pal)
298 {
299 }
300
302 : base(fileName)
303 {
304 }
305
306 public X509Certificate2(string fileName, string? password)
308 {
309 }
310
311 [CLSCompliant(false)]
316
321
322 [CLSCompliant(false)]
327
332
337
339 : base(info, context)
340 {
342 }
343
345 {
346 if (rawData == null || rawData.Length == 0)
347 {
348 throw new ArgumentException(System.SR.Arg_EmptyOrNullArray, "rawData");
349 }
350 return X509Pal.Instance.GetCertContentType(rawData);
351 }
352
354 {
355 if (rawData.Length == 0)
356 {
357 throw new ArgumentException(System.SR.Arg_EmptyOrNullArray, "rawData");
358 }
359 return X509Pal.Instance.GetCertContentType(rawData);
360 }
361
363 {
364 if (fileName == null)
365 {
366 throw new ArgumentNullException("fileName");
367 }
369 return X509Pal.Instance.GetCertContentType(fileName);
370 }
371
373 {
374 return Pal.GetNameInfo(nameType, forIssuer);
375 }
376
377 public override string ToString()
378 {
379 return base.ToString(fVerbose: true);
380 }
381
382 public override string ToString(bool verbose)
383 {
384 if (!verbose || Pal == null)
385 {
386 return ToString();
387 }
389 stringBuilder.AppendLine("[Version]");
390 stringBuilder.Append(" V");
391 stringBuilder.Append(Version);
392 stringBuilder.AppendLine();
393 stringBuilder.AppendLine();
394 stringBuilder.AppendLine("[Subject]");
395 stringBuilder.Append(" ");
397 string nameInfo = GetNameInfo(X509NameType.SimpleName, forIssuer: false);
398 if (nameInfo.Length > 0)
399 {
400 stringBuilder.AppendLine();
401 stringBuilder.Append(" ");
402 stringBuilder.Append("Simple Name: ");
403 stringBuilder.Append(nameInfo);
404 }
405 string nameInfo2 = GetNameInfo(X509NameType.EmailName, forIssuer: false);
406 if (nameInfo2.Length > 0)
407 {
408 stringBuilder.AppendLine();
409 stringBuilder.Append(" ");
410 stringBuilder.Append("Email Name: ");
411 stringBuilder.Append(nameInfo2);
412 }
413 string nameInfo3 = GetNameInfo(X509NameType.UpnName, forIssuer: false);
414 if (nameInfo3.Length > 0)
415 {
416 stringBuilder.AppendLine();
417 stringBuilder.Append(" ");
418 stringBuilder.Append("UPN Name: ");
419 stringBuilder.Append(nameInfo3);
420 }
421 string nameInfo4 = GetNameInfo(X509NameType.DnsName, forIssuer: false);
422 if (nameInfo4.Length > 0)
423 {
424 stringBuilder.AppendLine();
425 stringBuilder.Append(" ");
426 stringBuilder.Append("DNS Name: ");
427 stringBuilder.Append(nameInfo4);
428 }
429 stringBuilder.AppendLine();
430 stringBuilder.AppendLine();
431 stringBuilder.AppendLine("[Issuer]");
432 stringBuilder.Append(" ");
434 nameInfo = GetNameInfo(X509NameType.SimpleName, forIssuer: true);
435 if (nameInfo.Length > 0)
436 {
437 stringBuilder.AppendLine();
438 stringBuilder.Append(" ");
439 stringBuilder.Append("Simple Name: ");
440 stringBuilder.Append(nameInfo);
441 }
442 nameInfo2 = GetNameInfo(X509NameType.EmailName, forIssuer: true);
443 if (nameInfo2.Length > 0)
444 {
445 stringBuilder.AppendLine();
446 stringBuilder.Append(" ");
447 stringBuilder.Append("Email Name: ");
448 stringBuilder.Append(nameInfo2);
449 }
451 if (nameInfo3.Length > 0)
452 {
453 stringBuilder.AppendLine();
454 stringBuilder.Append(" ");
455 stringBuilder.Append("UPN Name: ");
456 stringBuilder.Append(nameInfo3);
457 }
459 if (nameInfo4.Length > 0)
460 {
461 stringBuilder.AppendLine();
462 stringBuilder.Append(" ");
463 stringBuilder.Append("DNS Name: ");
464 stringBuilder.Append(nameInfo4);
465 }
466 stringBuilder.AppendLine();
467 stringBuilder.AppendLine();
468 stringBuilder.AppendLine("[Serial Number]");
469 stringBuilder.Append(" ");
470 stringBuilder.AppendLine(SerialNumber);
471 stringBuilder.AppendLine();
472 stringBuilder.AppendLine("[Not Before]");
473 stringBuilder.Append(" ");
475 stringBuilder.AppendLine();
476 stringBuilder.AppendLine("[Not After]");
477 stringBuilder.Append(" ");
479 stringBuilder.AppendLine();
480 stringBuilder.AppendLine("[Thumbprint]");
481 stringBuilder.Append(" ");
482 stringBuilder.AppendLine(Thumbprint);
483 stringBuilder.AppendLine();
484 stringBuilder.AppendLine("[Signature Algorithm]");
485 stringBuilder.Append(" ");
487 stringBuilder.Append('(');
489 stringBuilder.AppendLine(")");
490 stringBuilder.AppendLine();
491 stringBuilder.Append("[Public Key]");
492 try
493 {
495 stringBuilder.AppendLine();
496 stringBuilder.Append(" ");
497 stringBuilder.Append("Algorithm: ");
498 stringBuilder.Append(publicKey.Oid.FriendlyName);
499 try
500 {
501 stringBuilder.AppendLine();
502 stringBuilder.Append(" ");
503 stringBuilder.Append("Length: ");
504 using RSA rSA = this.GetRSAPublicKey();
505 if (rSA != null)
506 {
507 stringBuilder.Append(rSA.KeySize);
508 }
509 }
511 {
512 }
513 stringBuilder.AppendLine();
514 stringBuilder.Append(" ");
515 stringBuilder.Append("Key Blob: ");
516 stringBuilder.AppendLine(publicKey.EncodedKeyValue.Format(multiLine: true));
517 stringBuilder.Append(" ");
518 stringBuilder.Append("Parameters: ");
519 stringBuilder.Append(publicKey.EncodedParameters.Format(multiLine: true));
520 }
522 {
523 }
524 Pal.AppendPrivateKeyInfo(stringBuilder);
526 if (extensions.Count > 0)
527 {
528 stringBuilder.AppendLine();
529 stringBuilder.AppendLine();
530 stringBuilder.Append("[Extensions]");
531 foreach (X509Extension item in extensions)
532 {
533 try
534 {
535 stringBuilder.AppendLine();
536 stringBuilder.Append("* ");
537 stringBuilder.Append(item.Oid.FriendlyName);
538 stringBuilder.Append('(');
539 stringBuilder.Append(item.Oid.Value);
540 stringBuilder.Append("):");
541 stringBuilder.AppendLine();
542 stringBuilder.Append(" ");
543 stringBuilder.Append(item.Format(multiLine: true));
544 }
546 {
547 }
548 }
549 }
550 stringBuilder.AppendLine();
551 return stringBuilder.ToString();
552 }
553
554 [Obsolete("X509Certificate and X509Certificate2 are immutable. Use the appropriate constructor to create a new certificate.", DiagnosticId = "SYSLIB0026", UrlFormat = "https://aka.ms/dotnet-warnings/{0}")]
555 public override void Import(byte[] rawData)
556 {
557 base.Import(rawData);
558 }
559
560 [Obsolete("X509Certificate and X509Certificate2 are immutable. Use the appropriate constructor to create a new certificate.", DiagnosticId = "SYSLIB0026", UrlFormat = "https://aka.ms/dotnet-warnings/{0}")]
561 public override void Import(byte[] rawData, string? password, X509KeyStorageFlags keyStorageFlags)
562 {
564 }
565
566 [CLSCompliant(false)]
567 [Obsolete("X509Certificate and X509Certificate2 are immutable. Use the appropriate constructor to create a new certificate.", DiagnosticId = "SYSLIB0026", UrlFormat = "https://aka.ms/dotnet-warnings/{0}")]
569 {
571 }
572
573 [Obsolete("X509Certificate and X509Certificate2 are immutable. Use the appropriate constructor to create a new certificate.", DiagnosticId = "SYSLIB0026", UrlFormat = "https://aka.ms/dotnet-warnings/{0}")]
574 public override void Import(string fileName)
575 {
576 base.Import(fileName);
577 }
578
579 [Obsolete("X509Certificate and X509Certificate2 are immutable. Use the appropriate constructor to create a new certificate.", DiagnosticId = "SYSLIB0026", UrlFormat = "https://aka.ms/dotnet-warnings/{0}")]
580 public override void Import(string fileName, string? password, X509KeyStorageFlags keyStorageFlags)
581 {
583 }
584
585 [CLSCompliant(false)]
586 [Obsolete("X509Certificate and X509Certificate2 are immutable. Use the appropriate constructor to create a new certificate.", DiagnosticId = "SYSLIB0026", UrlFormat = "https://aka.ms/dotnet-warnings/{0}")]
591
592 public bool Verify()
593 {
595 using X509Chain x509Chain = new X509Chain();
596 bool result = x509Chain.Build(this, throwOnException: false);
597 for (int i = 0; i < x509Chain.ChainElements.Count; i++)
598 {
599 x509Chain.ChainElements[i].Certificate.Dispose();
600 }
601 return result;
602 }
603
608
613
638
649
660
662 {
664 string keyAlgorithm = x509Certificate.GetKeyAlgorithm();
665 switch (keyAlgorithm)
666 {
667 case "1.2.840.113549.1.1.1":
669 case "1.2.840.10040.4.1":
671 {
673 }
674 break;
675 case "1.2.840.10045.2.1":
677 {
679 }
681 {
683 }
684 break;
685 }
687 }
688
690 {
692 string keyAlgorithm = x509Certificate.GetKeyAlgorithm();
693 switch (keyAlgorithm)
694 {
695 case "1.2.840.113549.1.1.1":
697 case "1.2.840.10040.4.1":
699 {
701 }
702 break;
703 case "1.2.840.10045.2.1":
705 {
707 }
709 {
711 }
712 break;
713 }
715 }
716
718 {
719 using ECDsa eCDsa = certificate.GetECDsaPublicKey();
720 return eCDsa != null;
721 }
722
724 {
725 using ECDiffieHellman eCDiffieHellman = certificate.GetECDiffieHellmanPublicKey();
726 return eCDiffieHellman != null;
727 }
728
730 {
732 while (enumerator.MoveNext())
733 {
737 contents = readOnlySpan;
738 ReadOnlySpan<char> span = contents[pemFields2.Label];
739 if (span.SequenceEqual("CERTIFICATE"))
740 {
741 byte[] array = System.Security.Cryptography.CryptoPool.Rent(pemFields2.DecodedDataLength);
742 contents = readOnlySpan;
743 if (!Convert.TryFromBase64Chars(contents[pemFields2.Base64Data], array, out var bytesWritten) || bytesWritten != pemFields2.DecodedDataLength)
744 {
746 }
748 try
749 {
751 }
753 {
755 }
756 X509Certificate2 result = new X509Certificate2(encoded.Span);
758 return result;
759 }
760 }
762 }
763
765 {
767 while (enumerator.MoveNext())
768 {
772 contents = readOnlySpan;
773 ReadOnlySpan<char> span = contents[pemFields2.Label];
774 foreach (string text in labels)
775 {
776 if (span.SequenceEqual(text))
777 {
778 TAlg val = factory();
779 contents = readOnlySpan;
780 val.ImportFromPem(contents[pemFields2.Location]);
781 try
782 {
783 return import(val);
784 }
785 catch (ArgumentException inner)
786 {
788 }
789 }
790 }
791 }
793 }
794
796 {
798 while (enumerator.MoveNext())
799 {
803 contents = readOnlySpan;
804 ReadOnlySpan<char> span = contents[pemFields2.Label];
805 if (span.SequenceEqual("ENCRYPTED PRIVATE KEY"))
806 {
807 TAlg val = factory();
808 contents = readOnlySpan;
809 val.ImportFromEncryptedPem(contents[pemFields2.Location], password);
810 try
811 {
812 return import(val);
813 }
814 catch (ArgumentException inner)
815 {
817 }
818 }
819 }
821 }
822
824 {
825 return oid.Value switch
826 {
828 "2.5.29.19" => new X509BasicConstraintsExtension(),
829 "2.5.29.15" => new X509KeyUsageExtension(),
830 "2.5.29.37" => new X509EnhancedKeyUsageExtension(),
831 "2.5.29.14" => new X509SubjectKeyIdentifierExtension(),
832 _ => null,
833 };
834 }
835
837 {
838 foreach (X509Extension extension in certificate.Extensions)
839 {
840 if (extension.Oid?.Value == "2.5.29.15" && extension is X509KeyUsageExtension x509KeyUsageExtension)
841 {
842 return (x509KeyUsageExtension.KeyUsages & X509KeyUsageFlags.KeyAgreement) != 0;
843 }
844 }
845 return true;
846 }
847}
static bool AreSamePublicECParameters(ECParameters aParameters, ECParameters bParameters)
Definition Helpers.cs:194
static bool TryFromBase64Chars(ReadOnlySpan< char > chars, Span< byte > bytes, out int bytesWritten)
Definition Convert.cs:2925
static string ReadAllText(string path)
Definition File.cs:246
static string GetFullPath(string path)
Definition Path.cs:881
static string Cryptography_X509_NoOrMismatchedPemKey
Definition SR.cs:106
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string NotSupported_KeyAlgorithm
Definition SR.cs:114
static string Cryptography_X509_NoPemCertificate
Definition SR.cs:104
static string Cryptography_Cert_AlreadyHasPrivateKey
Definition SR.cs:40
static string Cryptography_UnknownKeyAlgorithm
Definition SR.cs:90
static string Cryptography_PrivateKey_WrongAlgorithm
Definition SR.cs:86
static string Cryptography_PrivateKey_DoesNotMatch
Definition SR.cs:84
static string Arg_EmptyOrNullArray
Definition SR.cs:14
Definition SR.cs:7
static void Return(byte[] array, int clearSize=-1)
Definition CryptoPool.cs:12
static byte[] Rent(int minimumLength)
Definition CryptoPool.cs:7
static new? DSA Create(string algName)
Definition DSA.cs:19
static new? ECDiffieHellman Create(string algorithm)
static new? ECDsa Create(string algorithm)
Definition ECDsa.cs:20
static new? RSA Create(string algName)
Definition RSA.cs:21
static bool HasECDiffieHellmanKeyUsage(X509Certificate2 certificate)
static X509Certificate2 CreateFromPem(ReadOnlySpan< char > certPem, ReadOnlySpan< char > keyPem)
static X509Certificate2 CreateFromPemFile(string certPemFilePath, string? keyPemFilePath=null)
static X509Certificate2 CreateFromEncryptedPem(ReadOnlySpan< char > certPem, ReadOnlySpan< char > keyPem, ReadOnlySpan< char > password)
override void Import(byte[] rawData, string? password, X509KeyStorageFlags keyStorageFlags)
X509Certificate2(string fileName, SecureString? password, X509KeyStorageFlags keyStorageFlags)
X509Certificate2(string fileName, ReadOnlySpan< char > password, X509KeyStorageFlags keyStorageFlags=X509KeyStorageFlags.DefaultKeySet)
X509Certificate2(SerializationInfo info, StreamingContext context)
override void Import(string fileName, string? password, X509KeyStorageFlags keyStorageFlags)
static X509ContentType GetCertContentType(ReadOnlySpan< byte > rawData)
override void Import(byte[] rawData, SecureString? password, X509KeyStorageFlags keyStorageFlags)
X509Certificate2(string fileName, string? password, X509KeyStorageFlags keyStorageFlags)
override void Import(string fileName, SecureString? password, X509KeyStorageFlags keyStorageFlags)
X509Certificate2(byte[] rawData, string? password, X509KeyStorageFlags keyStorageFlags)
X509Certificate2 CopyWithPrivateKey(ECDiffieHellman privateKey)
X509Certificate2(string fileName, SecureString? password)
static X509Certificate2 ExtractKeyFromEncryptedPem< TAlg >(ReadOnlySpan< char > keyPem, ReadOnlySpan< char > password, Func< TAlg > factory, Func< TAlg, X509Certificate2 > import)
X509Certificate2(ReadOnlySpan< byte > rawData, ReadOnlySpan< char > password, X509KeyStorageFlags keyStorageFlags=X509KeyStorageFlags.DefaultKeySet)
X509Certificate2(byte[] rawData, SecureString? password, X509KeyStorageFlags keyStorageFlags)
static X509Certificate2 ExtractKeyFromPem< TAlg >(ReadOnlySpan< char > keyPem, string[] labels, Func< TAlg > factory, Func< TAlg, X509Certificate2 > import)
static X509Certificate2 CreateFromPem(ReadOnlySpan< char > certPem)
static X509Certificate2 CreateFromEncryptedPemFile(string certPemFilePath, ReadOnlySpan< char > password, string? keyPemFilePath=null)
string GetNameInfo(X509NameType nameType, bool forIssuer)
static bool IsECDiffieHellman(X509Certificate2 certificate)
ICertificatePal CopyWithPrivateKey(DSA privateKey)
void Deconstruct(out ReadOnlySpan< char > contents, out PemFields pemFields)
static CertificateAsn Decode(ReadOnlyMemory< byte > encoded, AsnEncodingRules ruleSet)