CertificateStatusRequestItemV2.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using System.IO;
  5. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Tls
  6. {
  7. /// <summary>Implementation of the RFC 6961 2.2. CertificateStatusRequestItemV2.</summary>
  8. public sealed class CertificateStatusRequestItemV2
  9. {
  10. private readonly short m_statusType;
  11. private readonly object m_request;
  12. public CertificateStatusRequestItemV2(short statusType, object request)
  13. {
  14. if (!IsCorrectType(statusType, request))
  15. throw new ArgumentException("not an instance of the correct type", "request");
  16. this.m_statusType = statusType;
  17. this.m_request = request;
  18. }
  19. public short StatusType
  20. {
  21. get { return m_statusType; }
  22. }
  23. public object Request
  24. {
  25. get { return m_request; }
  26. }
  27. public OcspStatusRequest OcspStatusRequest
  28. {
  29. get
  30. {
  31. if (!(m_request is OcspStatusRequest))
  32. throw new InvalidOperationException("'request' is not an OcspStatusRequest");
  33. return (OcspStatusRequest)m_request;
  34. }
  35. }
  36. /// <summary>Encode this <see cref="CertificateStatusRequestItemV2"/> to a <see cref="Stream"/>.</summary>
  37. /// <param name="output">the <see cref="Stream"/> to encode to.</param>
  38. /// <exception cref="IOException"/>
  39. public void Encode(Stream output)
  40. {
  41. TlsUtilities.WriteUint8(m_statusType, output);
  42. MemoryStream buf = new MemoryStream();
  43. switch (m_statusType)
  44. {
  45. case CertificateStatusType.ocsp:
  46. case CertificateStatusType.ocsp_multi:
  47. ((OcspStatusRequest)m_request).Encode(buf);
  48. break;
  49. default:
  50. throw new TlsFatalAlert(AlertDescription.internal_error);
  51. }
  52. byte[] requestBytes = buf.ToArray();
  53. TlsUtilities.WriteOpaque16(requestBytes, output);
  54. }
  55. /// <summary>Parse a <see cref="CertificateStatusRequestItemV2"/> from a <see cref="Stream"/>.</summary>
  56. /// <param name="input">the <see cref="Stream"/> to parse from.</param>
  57. /// <returns>a <see cref="CertificateStatusRequestItemV2"/> object.</returns>
  58. /// <exception cref="IOException"/>
  59. public static CertificateStatusRequestItemV2 Parse(Stream input)
  60. {
  61. short status_type = TlsUtilities.ReadUint8(input);
  62. object request;
  63. byte[] requestBytes = TlsUtilities.ReadOpaque16(input);
  64. MemoryStream buf = new MemoryStream(requestBytes, false);
  65. switch (status_type)
  66. {
  67. case CertificateStatusType.ocsp:
  68. case CertificateStatusType.ocsp_multi:
  69. request = OcspStatusRequest.Parse(buf);
  70. break;
  71. default:
  72. throw new TlsFatalAlert(AlertDescription.decode_error);
  73. }
  74. TlsProtocol.AssertEmpty(buf);
  75. return new CertificateStatusRequestItemV2(status_type, request);
  76. }
  77. private static bool IsCorrectType(short statusType, object request)
  78. {
  79. switch (statusType)
  80. {
  81. case CertificateStatusType.ocsp:
  82. case CertificateStatusType.ocsp_multi:
  83. return request is OcspStatusRequest;
  84. default:
  85. throw new ArgumentException("unsupported CertificateStatusType", "statusType");
  86. }
  87. }
  88. }
  89. }
  90. #pragma warning restore
  91. #endif