ASN1Sequence.java
上传用户:lior1029
上传日期:2013-05-07
资源大小:209k
文件大小:4k
源码类别:

CA认证

开发平台:

Java

  1. package org.bouncycastle.asn1;
  2. import java.io.*;
  3. import java.util.*;
  4. public abstract class ASN1Sequence
  5.     extends DERObject
  6. {
  7.     private Vector seq = new Vector();
  8.     /**
  9.      * return an ASN1Sequence from the given object.
  10.      *
  11.      * @param obj the object we want converted.
  12.      * @exception IllegalArgumentException if the object cannot be converted.
  13.      */
  14.     public static ASN1Sequence getInstance(
  15.         Object  obj)
  16.     {
  17.         if (obj == null || obj instanceof ASN1Sequence)
  18.         {
  19.             return (ASN1Sequence)obj;
  20.         }
  21.         throw new IllegalArgumentException("unknown object in getInstance");
  22.     }
  23.     /**
  24.      * Return an ASN1 sequence from a tagged object. There is a special
  25.      * case here, if an object appears to have been explicitly tagged on
  26.      * reading but we were expecting it to be implictly tagged in the
  27.      * normal course of events it indicates that we lost the surrounding
  28.      * sequence - so we need to add it back (this will happen if the tagged
  29.      * object is a sequence that contains other sequences). If you are
  30.      * dealing with implicitly tagged sequences you really <b>should</b>
  31.      * be using this method.
  32.      *
  33.      * @param obj the tagged object.
  34.      * @param explicit true if the object is meant to be explicitly tagged,
  35.      *          false otherwise.
  36.      * @exception IllegalArgumentException if the tagged object cannot
  37.      *          be converted.
  38.      */
  39.     public static ASN1Sequence getInstance(
  40.         ASN1TaggedObject    obj,
  41.         boolean             explicit)
  42.     {
  43.         if (explicit)
  44.         {
  45.             if (!obj.isExplicit())
  46.             {
  47.                 throw new IllegalArgumentException("object implicit - explicit expected.");
  48.             }
  49.             return (ASN1Sequence)obj.getObject();
  50.         }
  51.         else
  52.         {
  53.             //
  54.             // constructed object which appears to be explicitly tagged
  55.             // when it should be implicit means we have to add the
  56.             // surrounding sequence.
  57.             //
  58.             if (obj.isExplicit())
  59.             {
  60.                 ASN1Sequence    seq;
  61.                 if (obj instanceof BERTaggedObject)
  62.                 {
  63.                     return new BERSequence(obj.getObject());
  64.                 }
  65.                 else
  66.                 {
  67.                     return new DERSequence(obj.getObject());
  68.                 }
  69.             }
  70.             else
  71.             {
  72.                 ASN1Sequence    seq;
  73.                 if (obj.getObject() instanceof ASN1Sequence)
  74.                 {
  75.                     return (ASN1Sequence)obj.getObject();
  76.                 }
  77.             }
  78.         }
  79.         throw new IllegalArgumentException(
  80.                 "unknown object in getInstanceFromTagged");
  81.     }
  82.     public Enumeration getObjects()
  83.     {
  84.         return seq.elements();
  85.     }
  86.     /**
  87.      * return the object at the sequence postion indicated by index.
  88.      *
  89.      * @param the sequence number (starting at zero) of the object
  90.      * @return the object at the sequence postion indicated by index.
  91.      */
  92.     public DEREncodable getObjectAt(
  93.         int index)
  94.     {
  95.         return (DEREncodable)seq.elementAt(index);
  96.     }
  97.     /**
  98.      * return the number of objects in this sequence.
  99.      *
  100.      * @return the number of objects in this sequence.
  101.      */
  102.     public int size()
  103.     {
  104.         return seq.size();
  105.     }
  106.     public int hashCode()
  107.     {
  108.         Enumeration             e = this.getObjects();
  109.         int                     hashCode = 0;
  110.         while (e.hasMoreElements())
  111.         {
  112.             hashCode ^= e.nextElement().hashCode();
  113.         }
  114.         return hashCode;
  115.     }
  116.     public boolean equals(
  117.         Object  o)
  118.     {
  119.         if (o == null || !(o instanceof ASN1Sequence))
  120.         {
  121.             return false;
  122.         }
  123.         ASN1Sequence   other = (ASN1Sequence)o;
  124.         if (this.size() != other.size())
  125.         {
  126.             return false;
  127.         }
  128.         Enumeration s1 = this.getObjects();
  129.         Enumeration s2 = other.getObjects();
  130.         while (s1.hasMoreElements())
  131.         {
  132.             if (!s1.nextElement().equals(s2.nextElement()))
  133.             {
  134.                 return false;
  135.             }
  136.         }
  137.         return true;
  138.     }
  139. public Vector getSeq()
  140. {
  141. return seq;
  142. }
  143.     protected void addObject(
  144.         DEREncodable obj)
  145.     {
  146.         seq.addElement(obj);
  147.     }
  148.     abstract void encode(DEROutputStream out)
  149.         throws IOException;
  150. }