X509ExtensionUtil.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using System.Collections;
  5. using System.IO;
  6. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1;
  7. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509;
  8. using BestHTTP.SecureProtocol.Org.BouncyCastle.Security.Certificates;
  9. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
  10. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.X509.Extension
  11. {
  12. public class X509ExtensionUtilities
  13. {
  14. public static Asn1Object FromExtensionValue(
  15. Asn1OctetString extensionValue)
  16. {
  17. return Asn1Object.FromByteArray(extensionValue.GetOctets());
  18. }
  19. public static ICollection GetIssuerAlternativeNames(
  20. X509Certificate cert)
  21. {
  22. Asn1OctetString extVal = cert.GetExtensionValue(X509Extensions.IssuerAlternativeName);
  23. return GetAlternativeName(extVal);
  24. }
  25. public static ICollection GetSubjectAlternativeNames(
  26. X509Certificate cert)
  27. {
  28. Asn1OctetString extVal = cert.GetExtensionValue(X509Extensions.SubjectAlternativeName);
  29. return GetAlternativeName(extVal);
  30. }
  31. private static ICollection GetAlternativeName(
  32. Asn1OctetString extVal)
  33. {
  34. IList temp = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList();
  35. if (extVal != null)
  36. {
  37. try
  38. {
  39. Asn1Sequence seq = DerSequence.GetInstance(FromExtensionValue(extVal));
  40. foreach (Asn1Encodable primName in seq)
  41. {
  42. IList list = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList();
  43. GeneralName genName = GeneralName.GetInstance(primName);
  44. list.Add(genName.TagNo);
  45. switch (genName.TagNo)
  46. {
  47. case GeneralName.EdiPartyName:
  48. case GeneralName.X400Address:
  49. case GeneralName.OtherName:
  50. list.Add(genName.Name.ToAsn1Object());
  51. break;
  52. case GeneralName.DirectoryName:
  53. list.Add(X509Name.GetInstance(genName.Name).ToString());
  54. break;
  55. case GeneralName.DnsName:
  56. case GeneralName.Rfc822Name:
  57. case GeneralName.UniformResourceIdentifier:
  58. list.Add(((IAsn1String)genName.Name).GetString());
  59. break;
  60. case GeneralName.RegisteredID:
  61. list.Add(DerObjectIdentifier.GetInstance(genName.Name).Id);
  62. break;
  63. case GeneralName.IPAddress:
  64. list.Add(DerOctetString.GetInstance(genName.Name).GetOctets());
  65. break;
  66. default:
  67. throw new IOException("Bad tag number: " + genName.TagNo);
  68. }
  69. temp.Add(list);
  70. }
  71. }
  72. catch (Exception e)
  73. {
  74. throw new CertificateParsingException(e.Message);
  75. }
  76. }
  77. return temp;
  78. }
  79. }
  80. }
  81. #pragma warning restore
  82. #endif