OcspStatusRequest.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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.Ocsp;
  8. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509;
  9. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Utilities.IO;
  10. namespace Best.HTTP.SecureProtocol.Org.BouncyCastle.Tls
  11. {
  12. /// <summary>RFC 3546 3.6</summary>
  13. public sealed class OcspStatusRequest
  14. {
  15. private readonly IList<ResponderID> m_responderIDList;
  16. private readonly X509Extensions m_requestExtensions;
  17. /// <param name="responderIDList">an <see cref="IList{T}"/> of <see cref="ResponderID"/>, specifying the list of
  18. /// trusted OCSP responders. An empty list has the special meaning that the responders are implicitly known to
  19. /// the server - e.g., by prior arrangement.</param>
  20. /// <param name="requestExtensions">OCSP request extensions. A null value means that there are no extensions.
  21. /// </param>
  22. public OcspStatusRequest(IList<ResponderID> responderIDList, X509Extensions requestExtensions)
  23. {
  24. this.m_responderIDList = responderIDList;
  25. this.m_requestExtensions = requestExtensions;
  26. }
  27. /// <returns>an <see cref="IList{T}"/> of <see cref="ResponderID"/>.</returns>
  28. public IList<ResponderID> ResponderIDList
  29. {
  30. get { return m_responderIDList; }
  31. }
  32. /// <returns>OCSP request extensions.</returns>
  33. public X509Extensions RequestExtensions
  34. {
  35. get { return m_requestExtensions; }
  36. }
  37. /// <summary>Encode this <see cref="OcspStatusRequest"/> to a <see cref="Stream"/>.</summary>
  38. /// <param name="output">the <see cref="Stream"/> to encode to.</param>
  39. /// <exception cref="IOException"/>
  40. public void Encode(Stream output)
  41. {
  42. if (m_responderIDList == null || m_responderIDList.Count < 1)
  43. {
  44. TlsUtilities.WriteUint16(0, output);
  45. }
  46. else
  47. {
  48. MemoryStream buf = new MemoryStream();
  49. foreach (ResponderID responderID in m_responderIDList)
  50. {
  51. byte[] derEncoding = responderID.GetEncoded(Asn1Encodable.Der);
  52. TlsUtilities.WriteOpaque16(derEncoding, buf);
  53. }
  54. TlsUtilities.CheckUint16(buf.Length);
  55. TlsUtilities.WriteUint16(Convert.ToInt32(buf.Length), output);
  56. buf.WriteTo(output);
  57. }
  58. if (m_requestExtensions == null)
  59. {
  60. TlsUtilities.WriteUint16(0, output);
  61. }
  62. else
  63. {
  64. byte[] derEncoding = m_requestExtensions.GetEncoded(Asn1Encodable.Der);
  65. TlsUtilities.CheckUint16(derEncoding.Length);
  66. TlsUtilities.WriteUint16(derEncoding.Length, output);
  67. output.Write(derEncoding, 0, derEncoding.Length);
  68. }
  69. }
  70. /// <summary>Parse an <see cref="OcspStatusRequest"/> from a <see cref="Stream"/>.</summary>
  71. /// <param name="input">the <see cref="Stream"/> to parse from.</param>
  72. /// <returns>an <see cref="OcspStatusRequest"/> object.</returns>
  73. /// <exception cref="IOException"/>
  74. public static OcspStatusRequest Parse(Stream input)
  75. {
  76. var responderIDList = new List<ResponderID>();
  77. {
  78. byte[] data = TlsUtilities.ReadOpaque16(input);
  79. if (data.Length > 0)
  80. {
  81. MemoryStream buf = new MemoryStream(data, false);
  82. do
  83. {
  84. byte[] derEncoding = TlsUtilities.ReadOpaque16(buf, 1);
  85. Asn1Object asn1 = TlsUtilities.ReadAsn1Object(derEncoding);
  86. ResponderID responderID = ResponderID.GetInstance(asn1);
  87. TlsUtilities.RequireDerEncoding(responderID, derEncoding);
  88. responderIDList.Add(responderID);
  89. }
  90. while (buf.Position < buf.Length);
  91. }
  92. }
  93. X509Extensions requestExtensions = null;
  94. {
  95. byte[] derEncoding = TlsUtilities.ReadOpaque16(input);
  96. if (derEncoding.Length > 0)
  97. {
  98. Asn1Object asn1 = TlsUtilities.ReadAsn1Object(derEncoding);
  99. X509Extensions extensions = X509Extensions.GetInstance(asn1);
  100. TlsUtilities.RequireDerEncoding(extensions, derEncoding);
  101. requestExtensions = extensions;
  102. }
  103. }
  104. return new OcspStatusRequest(responderIDList, requestExtensions);
  105. }
  106. }
  107. }
  108. #pragma warning restore
  109. #endif