CertificateStatusRequest.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 3546 3.6. CertificateStatusRequest.</summary>
  8. public sealed class CertificateStatusRequest
  9. {
  10. private short m_statusType;
  11. private object m_request;
  12. public CertificateStatusRequest(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 (!IsCorrectType(CertificateStatusType.ocsp, m_request))
  32. throw new InvalidOperationException("'request' is not an OCSPStatusRequest");
  33. return (OcspStatusRequest)m_request;
  34. }
  35. }
  36. /// <summary>Encode this <see cref="CertificateStatusRequest"/> 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. switch (m_statusType)
  43. {
  44. case CertificateStatusType.ocsp:
  45. ((OcspStatusRequest)m_request).Encode(output);
  46. break;
  47. default:
  48. throw new TlsFatalAlert(AlertDescription.internal_error);
  49. }
  50. }
  51. /// <summary>Parse a <see cref="CertificateStatusRequest"/> from a <see cref="Stream"/>.</summary>
  52. /// <param name="input">the <see cref="Stream"/> to parse from.</param>
  53. /// <returns>a <see cref="CertificateStatusRequest"/> object.</returns>
  54. /// <exception cref="IOException"/>
  55. public static CertificateStatusRequest Parse(Stream input)
  56. {
  57. short status_type = TlsUtilities.ReadUint8(input);
  58. object request;
  59. switch (status_type)
  60. {
  61. case CertificateStatusType.ocsp:
  62. request = OcspStatusRequest.Parse(input);
  63. break;
  64. default:
  65. throw new TlsFatalAlert(AlertDescription.decode_error);
  66. }
  67. return new CertificateStatusRequest(status_type, request);
  68. }
  69. private static bool IsCorrectType(short statusType, object request)
  70. {
  71. switch (statusType)
  72. {
  73. case CertificateStatusType.ocsp:
  74. return request is OcspStatusRequest;
  75. default:
  76. throw new ArgumentException("unsupported CertificateStatusType", "statusType");
  77. }
  78. }
  79. }
  80. }
  81. #pragma warning restore
  82. #endif