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

CA认证

开发平台:

Java

  1. package org.bouncycastle.asn1;
  2. import java.io.*;
  3. import java.util.*;
  4. abstract public class ASN1Set
  5.     extends DERObject
  6. {
  7.     protected Vector set = new Vector();
  8.     /**
  9.      * return an ASN1Set 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 ASN1Set getInstance(
  15.         Object  obj)
  16.     {
  17.         if (obj == null || obj instanceof ASN1Set)
  18.         {
  19.             return (ASN1Set)obj;
  20.         }
  21.         throw new IllegalArgumentException("unknown object in getInstance");
  22.     }
  23.     /**
  24.      * Return an ASN1 set 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.      * set - 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 sets 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 ASN1Set 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 (ASN1Set)obj.getObject();
  50.         }
  51.         else
  52.         {
  53.             //
  54.             // constructed object which appears to be explicitly tagged
  55.             // and it's really implicit means we have to add the
  56.             // surrounding sequence.
  57.             //
  58.             if (obj.isExplicit())
  59.             {
  60.                 ASN1Set    set = new DERSet(obj.getObject());
  61.                 return set;
  62.             }
  63.             else
  64.             {
  65.                 if (obj.getObject() instanceof ASN1Set)
  66.                 {
  67.                     return (ASN1Set)obj.getObject();
  68.                 }
  69.                 //
  70.                 // in this case the parser returns a sequence, convert it
  71.                 // into a set.
  72.                 //
  73.                 ASN1EncodableVector  v = new ASN1EncodableVector();
  74.                 if (obj.getObject() instanceof ASN1Sequence)
  75.                 {
  76.                     ASN1Sequence s = (ASN1Sequence)obj.getObject();
  77.                     Enumeration e = s.getObjects();
  78.                     while (e.hasMoreElements())
  79.                     {
  80.                         v.add((DEREncodable)e.nextElement());
  81.                     }
  82.                     return new DERSet(v);
  83.                 }
  84.             }
  85.         }
  86.         throw new IllegalArgumentException(
  87.                     "unknown object in getInstanceFromTagged");
  88.     }
  89.     public ASN1Set()
  90.     {
  91.     }
  92.     public Enumeration getObjects()
  93.     {
  94.         return set.elements();
  95.     }
  96.     /**
  97.      * return the object at the set postion indicated by index.
  98.      *
  99.      * @param the set number (starting at zero) of the object
  100.      * @return the object at the set postion indicated by index.
  101.      */
  102.     public DEREncodable getObjectAt(
  103.         int index)
  104.     {
  105.         return (DEREncodable)set.elementAt(index);
  106.     }
  107.     /**
  108.      * return the number of objects in this set.
  109.      *
  110.      * @return the number of objects in this set.
  111.      */
  112.     public int size()
  113.     {
  114.         return set.size();
  115.     }
  116.     public int hashCode()
  117.     {
  118.         Enumeration             e = this.getObjects();
  119.         int                     hashCode = 0;
  120.         while (e.hasMoreElements())
  121.         {
  122.             hashCode ^= e.nextElement().hashCode();
  123.         }
  124.         return hashCode;
  125.     }
  126.     public boolean equals(
  127.         Object  o)
  128.     {
  129.         if (o == null || !(o instanceof ASN1Set))
  130.         {
  131.             return false;
  132.         }
  133.         ASN1Set   other = (ASN1Set)o;
  134.         if (this.size() != other.size())
  135.         {
  136.             return false;
  137.         }
  138.         Enumeration s1 = this.getObjects();
  139.         Enumeration s2 = other.getObjects();
  140.         while (s1.hasMoreElements())
  141.         {
  142.             if (!s1.nextElement().equals(s2.nextElement()))
  143.             {
  144.                 return false;
  145.             }
  146.         }
  147.         return true;
  148.     }
  149.     protected void addObject(
  150.         DEREncodable obj)
  151.     {
  152.         set.addElement(obj);
  153.     }
  154.     abstract void encode(DEROutputStream out)
  155.             throws IOException;
  156. }