CertStatus.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509;
  5. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Math;
  6. namespace Best.HTTP.SecureProtocol.Org.BouncyCastle.Asn1.Cmp
  7. {
  8. public class CertStatus
  9. : Asn1Encodable
  10. {
  11. public static CertStatus GetInstance(object obj)
  12. {
  13. if (obj is CertStatus certStatus)
  14. return certStatus;
  15. if (obj != null)
  16. return new CertStatus(Asn1Sequence.GetInstance(obj));
  17. return null;
  18. }
  19. private readonly Asn1OctetString m_certHash;
  20. private readonly DerInteger m_certReqID;
  21. private readonly PkiStatusInfo m_statusInfo;
  22. private readonly AlgorithmIdentifier m_hashAlg;
  23. private CertStatus(Asn1Sequence seq)
  24. {
  25. m_certHash = Asn1OctetString.GetInstance(seq[0]);
  26. m_certReqID = DerInteger.GetInstance(seq[1]);
  27. if (seq.Count > 2)
  28. {
  29. for (int t = 2; t < seq.Count; t++)
  30. {
  31. Asn1Object p = seq[t].ToAsn1Object();
  32. if (p is Asn1Sequence s)
  33. {
  34. m_statusInfo = PkiStatusInfo.GetInstance(s);
  35. }
  36. if (p is Asn1TaggedObject dto)
  37. {
  38. if (dto.TagNo != 0)
  39. throw new ArgumentException("unknown tag " + dto.TagNo);
  40. m_hashAlg = AlgorithmIdentifier.GetInstance(dto, true);
  41. }
  42. }
  43. }
  44. }
  45. public CertStatus(byte[] certHash, BigInteger certReqID)
  46. {
  47. m_certHash = new DerOctetString(certHash);
  48. m_certReqID = new DerInteger(certReqID);
  49. }
  50. public CertStatus(byte[] certHash, BigInteger certReqID, PkiStatusInfo statusInfo)
  51. {
  52. m_certHash = new DerOctetString(certHash);
  53. m_certReqID = new DerInteger(certReqID);
  54. m_statusInfo = statusInfo;
  55. }
  56. public CertStatus(byte[] certHash, BigInteger certReqID, PkiStatusInfo statusInfo, AlgorithmIdentifier hashAlg)
  57. {
  58. m_certHash = new DerOctetString(certHash);
  59. m_certReqID = new DerInteger(certReqID);
  60. m_statusInfo = statusInfo;
  61. m_hashAlg = hashAlg;
  62. }
  63. public virtual Asn1OctetString CertHash => m_certHash;
  64. public virtual DerInteger CertReqID => m_certReqID;
  65. public virtual PkiStatusInfo StatusInfo => m_statusInfo;
  66. public virtual AlgorithmIdentifier HashAlg => m_hashAlg;
  67. /**
  68. * <pre>
  69. *
  70. * CertStatus ::= SEQUENCE {
  71. * certHash OCTET STRING,
  72. * certReqId INTEGER,
  73. * statusInfo PKIStatusInfo OPTIONAL,
  74. * hashAlg [0] AlgorithmIdentifier{DIGEST-ALGORITHM, {...}} OPTIONAL
  75. * }
  76. *
  77. * </pre>
  78. *
  79. * @return a basic ASN.1 object representation.
  80. */
  81. public override Asn1Object ToAsn1Object()
  82. {
  83. Asn1EncodableVector v = new Asn1EncodableVector(m_certHash, m_certReqID);
  84. v.AddOptional(m_statusInfo);
  85. v.AddOptionalTagged(true, 0, m_hashAlg);
  86. return new DerSequence(v);
  87. }
  88. }
  89. }
  90. #pragma warning restore
  91. #endif