LDSSecurityObject.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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.Icao
  7. {
  8. /**
  9. * The LDSSecurityObject object (V1.8).
  10. * <pre>
  11. * LDSSecurityObject ::= SEQUENCE {
  12. * version LDSSecurityObjectVersion,
  13. * hashAlgorithm DigestAlgorithmIdentifier,
  14. * dataGroupHashValues SEQUENCE SIZE (2..ub-DataGroups) OF DataHashGroup,
  15. * ldsVersionInfo LDSVersionInfo OPTIONAL
  16. * -- if present, version MUST be v1 }
  17. *
  18. * DigestAlgorithmIdentifier ::= AlgorithmIdentifier,
  19. *
  20. * LDSSecurityObjectVersion :: INTEGER {V0(0)}
  21. * </pre>
  22. */
  23. public class LdsSecurityObject
  24. : Asn1Encodable
  25. {
  26. public const int UBDataGroups = 16;
  27. private DerInteger version = new DerInteger(0);
  28. private AlgorithmIdentifier digestAlgorithmIdentifier;
  29. private DataGroupHash[] datagroupHash;
  30. private LdsVersionInfo versionInfo;
  31. public static LdsSecurityObject GetInstance(object obj)
  32. {
  33. if (obj is LdsSecurityObject)
  34. return (LdsSecurityObject)obj;
  35. if (obj != null)
  36. return new LdsSecurityObject(Asn1Sequence.GetInstance(obj));
  37. return null;
  38. }
  39. private LdsSecurityObject(Asn1Sequence seq)
  40. {
  41. if (seq == null || seq.Count == 0)
  42. throw new ArgumentException("null or empty sequence passed.");
  43. var e = seq.GetEnumerator();
  44. // version
  45. e.MoveNext();
  46. version = DerInteger.GetInstance(e.Current);
  47. // digestAlgorithmIdentifier
  48. e.MoveNext();
  49. digestAlgorithmIdentifier = AlgorithmIdentifier.GetInstance(e.Current);
  50. e.MoveNext();
  51. Asn1Sequence datagroupHashSeq = Asn1Sequence.GetInstance(e.Current);
  52. if (version.HasValue(1))
  53. {
  54. e.MoveNext();
  55. versionInfo = LdsVersionInfo.GetInstance(e.Current);
  56. }
  57. CheckDatagroupHashSeqSize(datagroupHashSeq.Count);
  58. datagroupHash = new DataGroupHash[datagroupHashSeq.Count];
  59. for (int i= 0; i< datagroupHashSeq.Count; i++)
  60. {
  61. datagroupHash[i] = DataGroupHash.GetInstance(datagroupHashSeq[i]);
  62. }
  63. }
  64. public LdsSecurityObject(
  65. AlgorithmIdentifier digestAlgorithmIdentifier,
  66. DataGroupHash[] datagroupHash)
  67. {
  68. this.version = new DerInteger(0);
  69. this.digestAlgorithmIdentifier = digestAlgorithmIdentifier;
  70. this.datagroupHash = datagroupHash;
  71. CheckDatagroupHashSeqSize(datagroupHash.Length);
  72. }
  73. public LdsSecurityObject(
  74. AlgorithmIdentifier digestAlgorithmIdentifier,
  75. DataGroupHash[] datagroupHash,
  76. LdsVersionInfo versionInfo)
  77. {
  78. this.version = new DerInteger(1);
  79. this.digestAlgorithmIdentifier = digestAlgorithmIdentifier;
  80. this.datagroupHash = datagroupHash;
  81. this.versionInfo = versionInfo;
  82. CheckDatagroupHashSeqSize(datagroupHash.Length);
  83. }
  84. private void CheckDatagroupHashSeqSize(int size)
  85. {
  86. if (size < 2 || size > UBDataGroups)
  87. throw new ArgumentException("wrong size in DataGroupHashValues : not in (2.."+ UBDataGroups +")");
  88. }
  89. public BigInteger Version
  90. {
  91. get { return version.Value; }
  92. }
  93. public AlgorithmIdentifier DigestAlgorithmIdentifier
  94. {
  95. get { return digestAlgorithmIdentifier; }
  96. }
  97. public DataGroupHash[] GetDatagroupHash()
  98. {
  99. return datagroupHash;
  100. }
  101. public LdsVersionInfo VersionInfo
  102. {
  103. get { return versionInfo; }
  104. }
  105. public override Asn1Object ToAsn1Object()
  106. {
  107. DerSequence hashSeq = new DerSequence(datagroupHash);
  108. Asn1EncodableVector v = new Asn1EncodableVector(version, digestAlgorithmIdentifier, hashSeq);
  109. v.AddOptional(versionInfo);
  110. return new DerSequence(v);
  111. }
  112. }
  113. }
  114. #pragma warning restore
  115. #endif