X509CertPairParser.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Asn1;
  7. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509;
  8. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Security.Certificates;
  9. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Utilities.IO;
  10. namespace Best.HTTP.SecureProtocol.Org.BouncyCastle.X509
  11. {
  12. public class X509CertPairParser
  13. {
  14. private Stream currentStream;
  15. private X509CertificatePair ReadDerCrossCertificatePair(
  16. Stream inStream)
  17. {
  18. Asn1InputStream dIn = new Asn1InputStream(inStream);//, ProviderUtil.getReadLimit(in));
  19. Asn1Sequence seq = (Asn1Sequence)dIn.ReadObject();
  20. CertificatePair pair = CertificatePair.GetInstance(seq);
  21. return new X509CertificatePair(pair);
  22. }
  23. /// <summary>
  24. /// Create loading data from byte array.
  25. /// </summary>
  26. /// <param name="input"></param>
  27. public X509CertificatePair ReadCertPair(byte[] input)
  28. {
  29. return ReadCertPair(new MemoryStream(input, false));
  30. }
  31. /// <summary>
  32. /// Create loading data from byte array.
  33. /// </summary>
  34. /// <param name="input"></param>
  35. public IList<X509CertificatePair> ReadCertPairs(byte[] input)
  36. {
  37. return ReadCertPairs(new MemoryStream(input, false));
  38. }
  39. public X509CertificatePair ReadCertPair(Stream inStream)
  40. {
  41. if (inStream == null)
  42. throw new ArgumentNullException("inStream");
  43. if (!inStream.CanRead)
  44. throw new ArgumentException("inStream must be read-able", "inStream");
  45. if (currentStream == null)
  46. {
  47. currentStream = inStream;
  48. }
  49. else if (currentStream != inStream) // reset if input stream has changed
  50. {
  51. currentStream = inStream;
  52. }
  53. try
  54. {
  55. int tag = inStream.ReadByte();
  56. if (tag < 0)
  57. return null;
  58. if (inStream.CanSeek)
  59. {
  60. inStream.Seek(-1L, SeekOrigin.Current);
  61. }
  62. else
  63. {
  64. PushbackStream pis = new PushbackStream(inStream);
  65. pis.Unread(tag);
  66. inStream = pis;
  67. }
  68. return ReadDerCrossCertificatePair(inStream);
  69. }
  70. catch (Exception e)
  71. {
  72. throw new CertificateException(e.ToString());
  73. }
  74. }
  75. public IList<X509CertificatePair> ReadCertPairs(Stream inStream)
  76. {
  77. var certPairs = new List<X509CertificatePair>();
  78. X509CertificatePair certPair;
  79. while ((certPair = ReadCertPair(inStream)) != null)
  80. {
  81. certPairs.Add(certPair);
  82. }
  83. return certPairs;
  84. }
  85. }
  86. }
  87. #pragma warning restore
  88. #endif