Holder.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
  5. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509
  6. {
  7. /**
  8. * The Holder object.
  9. * <p>
  10. * For an v2 attribute certificate this is:
  11. *
  12. * <pre>
  13. * Holder ::= SEQUENCE {
  14. * baseCertificateID [0] IssuerSerial OPTIONAL,
  15. * -- the issuer and serial number of
  16. * -- the holder's Public Key Certificate
  17. * entityName [1] GeneralNames OPTIONAL,
  18. * -- the name of the claimant or role
  19. * objectDigestInfo [2] ObjectDigestInfo OPTIONAL
  20. * -- used to directly authenticate the holder,
  21. * -- for example, an executable
  22. * }
  23. * </pre>
  24. * </p>
  25. * <p>
  26. * For an v1 attribute certificate this is:
  27. *
  28. * <pre>
  29. * subject CHOICE {
  30. * baseCertificateID [0] EXPLICIT IssuerSerial,
  31. * -- associated with a Public Key Certificate
  32. * subjectName [1] EXPLICIT GeneralNames },
  33. * -- associated with a name
  34. * </pre>
  35. * </p>
  36. */
  37. public class Holder
  38. : Asn1Encodable
  39. {
  40. internal readonly IssuerSerial baseCertificateID;
  41. internal readonly GeneralNames entityName;
  42. internal readonly ObjectDigestInfo objectDigestInfo;
  43. private readonly int version;
  44. public static Holder GetInstance(
  45. object obj)
  46. {
  47. if (obj is Holder)
  48. {
  49. return (Holder) obj;
  50. }
  51. if (obj is Asn1Sequence)
  52. {
  53. return new Holder((Asn1Sequence) obj);
  54. }
  55. if (obj is Asn1TaggedObject)
  56. {
  57. return new Holder((Asn1TaggedObject) obj);
  58. }
  59. throw new ArgumentException("unknown object in factory: " + BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.GetTypeName(obj), "obj");
  60. }
  61. /**
  62. * Constructor for a holder for an v1 attribute certificate.
  63. *
  64. * @param tagObj The ASN.1 tagged holder object.
  65. */
  66. public Holder(
  67. Asn1TaggedObject tagObj)
  68. {
  69. switch (tagObj.TagNo)
  70. {
  71. case 0:
  72. baseCertificateID = IssuerSerial.GetInstance(tagObj, true);
  73. break;
  74. case 1:
  75. entityName = GeneralNames.GetInstance(tagObj, true);
  76. break;
  77. default:
  78. throw new ArgumentException("unknown tag in Holder");
  79. }
  80. this.version = 0;
  81. }
  82. /**
  83. * Constructor for a holder for an v2 attribute certificate. *
  84. *
  85. * @param seq The ASN.1 sequence.
  86. */
  87. private Holder(
  88. Asn1Sequence seq)
  89. {
  90. if (seq.Count > 3)
  91. throw new ArgumentException("Bad sequence size: " + seq.Count);
  92. for (int i = 0; i != seq.Count; i++)
  93. {
  94. Asn1TaggedObject tObj = Asn1TaggedObject.GetInstance(seq[i]);
  95. switch (tObj.TagNo)
  96. {
  97. case 0:
  98. baseCertificateID = IssuerSerial.GetInstance(tObj, false);
  99. break;
  100. case 1:
  101. entityName = GeneralNames.GetInstance(tObj, false);
  102. break;
  103. case 2:
  104. objectDigestInfo = ObjectDigestInfo.GetInstance(tObj, false);
  105. break;
  106. default:
  107. throw new ArgumentException("unknown tag in Holder");
  108. }
  109. }
  110. this.version = 1;
  111. }
  112. public Holder(
  113. IssuerSerial baseCertificateID)
  114. : this(baseCertificateID, 1)
  115. {
  116. }
  117. /**
  118. * Constructs a holder from a IssuerSerial.
  119. * @param baseCertificateID The IssuerSerial.
  120. * @param version The version of the attribute certificate.
  121. */
  122. public Holder(
  123. IssuerSerial baseCertificateID,
  124. int version)
  125. {
  126. this.baseCertificateID = baseCertificateID;
  127. this.version = version;
  128. }
  129. /**
  130. * Returns 1 for v2 attribute certificates or 0 for v1 attribute
  131. * certificates.
  132. * @return The version of the attribute certificate.
  133. */
  134. public int Version
  135. {
  136. get { return version; }
  137. }
  138. /**
  139. * Constructs a holder with an entityName for v2 attribute certificates or
  140. * with a subjectName for v1 attribute certificates.
  141. *
  142. * @param entityName The entity or subject name.
  143. */
  144. public Holder(
  145. GeneralNames entityName)
  146. : this(entityName, 1)
  147. {
  148. }
  149. /**
  150. * Constructs a holder with an entityName for v2 attribute certificates or
  151. * with a subjectName for v1 attribute certificates.
  152. *
  153. * @param entityName The entity or subject name.
  154. * @param version The version of the attribute certificate.
  155. */
  156. public Holder(
  157. GeneralNames entityName,
  158. int version)
  159. {
  160. this.entityName = entityName;
  161. this.version = version;
  162. }
  163. /**
  164. * Constructs a holder from an object digest info.
  165. *
  166. * @param objectDigestInfo The object digest info object.
  167. */
  168. public Holder(
  169. ObjectDigestInfo objectDigestInfo)
  170. {
  171. this.objectDigestInfo = objectDigestInfo;
  172. this.version = 1;
  173. }
  174. public IssuerSerial BaseCertificateID
  175. {
  176. get { return baseCertificateID; }
  177. }
  178. /**
  179. * Returns the entityName for an v2 attribute certificate or the subjectName
  180. * for an v1 attribute certificate.
  181. *
  182. * @return The entityname or subjectname.
  183. */
  184. public GeneralNames EntityName
  185. {
  186. get { return entityName; }
  187. }
  188. public ObjectDigestInfo ObjectDigestInfo
  189. {
  190. get { return objectDigestInfo; }
  191. }
  192. /**
  193. * The Holder object.
  194. * <pre>
  195. * Holder ::= Sequence {
  196. * baseCertificateID [0] IssuerSerial OPTIONAL,
  197. * -- the issuer and serial number of
  198. * -- the holder's Public Key Certificate
  199. * entityName [1] GeneralNames OPTIONAL,
  200. * -- the name of the claimant or role
  201. * objectDigestInfo [2] ObjectDigestInfo OPTIONAL
  202. * -- used to directly authenticate the holder,
  203. * -- for example, an executable
  204. * }
  205. * </pre>
  206. */
  207. public override Asn1Object ToAsn1Object()
  208. {
  209. if (version == 1)
  210. {
  211. Asn1EncodableVector v = new Asn1EncodableVector(3);
  212. v.AddOptionalTagged(false, 0, baseCertificateID);
  213. v.AddOptionalTagged(false, 1, entityName);
  214. v.AddOptionalTagged(false, 2, objectDigestInfo);
  215. return new DerSequence(v);
  216. }
  217. if (entityName != null)
  218. {
  219. return new DerTaggedObject(true, 1, entityName);
  220. }
  221. return new DerTaggedObject(true, 0, baseCertificateID);
  222. }
  223. }
  224. }
  225. #pragma warning restore
  226. #endif