package org.bouncycastle.asn1; // BEGIN android-removed //import java.io.ByteArrayOutputStream; //import java.io.IOException; // END android-removed import java.util.Enumeration; // BEGIN android-removed //import java.util.Vector; // END android-removed; // BEGIN android-note // Changed inheritence of class. // END android-note abstract public class ASN1Set extends ASN1Collection { // BEGIN android-removed //protected Vector set = new Vector(); // END android-removed /** * return an ASN1Set from the given object. * * @param obj the object we want converted. * @exception IllegalArgumentException if the object cannot be converted. */ public static ASN1Set getInstance( Object obj) { if (obj == null || obj instanceof ASN1Set) { return (ASN1Set)obj; } throw new IllegalArgumentException("unknown object in getInstance"); } /** * Return an ASN1 set from a tagged object. There is a special * case here, if an object appears to have been explicitly tagged on * reading but we were expecting it to be implictly tagged in the * normal course of events it indicates that we lost the surrounding * set - so we need to add it back (this will happen if the tagged * object is a sequence that contains other sequences). If you are * dealing with implicitly tagged sets you really <b>should</b> * be using this method. * * @param obj the tagged object. * @param explicit true if the object is meant to be explicitly tagged * false otherwise. * @exception IllegalArgumentException if the tagged object cannot * be converted. */ public static ASN1Set getInstance( ASN1TaggedObject obj, boolean explicit) { if (explicit) { if (!obj.isExplicit()) { throw new IllegalArgumentException("object implicit - explicit expected."); } return (ASN1Set)obj.getObject(); } else { // // constructed object which appears to be explicitly tagged // and it's really implicit means we have to add the // surrounding sequence. // if (obj.isExplicit()) { ASN1Set set = new DERSet(obj.getObject()); return set; } else { if (obj.getObject() instanceof ASN1Set) { return (ASN1Set)obj.getObject(); } // // in this case the parser returns a sequence, convert it // into a set. // ASN1EncodableVector v = new ASN1EncodableVector(); if (obj.getObject() instanceof ASN1Sequence) { ASN1Sequence s = (ASN1Sequence)obj.getObject(); Enumeration e = s.getObjects(); while (e.hasMoreElements()) { v.add((DEREncodable)e.nextElement()); } return new DERSet(v, false); } } } throw new IllegalArgumentException( "unknown object in getInstanceFromTagged"); } public ASN1Set() { } // BEGIN android-removed //public Enumeration getObjects() //{ // return set.elements(); //} ///** // * return the object at the set postion indicated by index. // * // * @param index the set number (starting at zero) of the object // * @return the object at the set postion indicated by index. // */ //public DEREncodable getObjectAt( // int index) //{ // return (DEREncodable)set.elementAt(index); //} ///** // * return the number of objects in this set. // * // * @return the number of objects in this set. // */ //public int size() //{ // return set.size(); //} //public int hashCode() //{ // Enumeration e = this.getObjects(); // int hashCode = 0; // while (e.hasMoreElements()) // { // hashCode ^= e.nextElement().hashCode(); // } // return hashCode; //} // END android-removed public boolean equals( Object o) { if (o == this) { return true; } if (!(o instanceof DEREncodable)) { return false; } DERObject dObj = ((DEREncodable)o).getDERObject(); if (!(dObj instanceof ASN1Set)) { return false; } ASN1Set other = (ASN1Set)dObj; if (this.size() != other.size()) { return false; } Enumeration s1 = this.getObjects(); Enumeration s2 = other.getObjects(); while (s1.hasMoreElements()) { if (!s1.nextElement().equals(s2.nextElement())) { return false; } } return true; } // BEGIN android-removed ///** // * return true if a <= b (arrays are assumed padded with zeros). // */ //private boolean lessThanOrEqual( // byte[] a, // byte[] b) //{ // if (a.length <= b.length) // { // for (int i = 0; i != a.length; i++) // { // int l = a[i] & 0xff; // int r = b[i] & 0xff; // // if (r > l) // { // return true; // } // else if (l > r) // { // return false; // } // } // return true; // } // else // { // for (int i = 0; i != b.length; i++) // { // int l = a[i] & 0xff; // int r = b[i] & 0xff; // // if (r > l) // { // return true; // } // else if (l > r) // { // return false; // } // } // return false; // } //} //private byte[] getEncoded( // DEREncodable obj) //{ // ByteArrayOutputStream bOut = new ByteArrayOutputStream(); // ASN1OutputStream aOut = new ASN1OutputStream(bOut); // try // { // aOut.writeObject(obj); // } // catch (IOException e) // { // throw new IllegalArgumentException("cannot encode object added to SET"); // } // return bOut.toByteArray(); //} //protected void sort() //{ // if (set.size() > 1) // { // boolean swapped = true; // while (swapped) // { // int index = 0; // byte[] a = getEncoded((DEREncodable)set.elementAt(0)); // // swapped = false; // // while (index != set.size() - 1) // { // byte[] b = getEncoded((DEREncodable)set.elementAt(index + 1)); // if (lessThanOrEqual(a, b)) // { // a = b; // } // else // { // Object o = set.elementAt(index); // set.setElementAt(set.elementAt(index + 1), index); // set.setElementAt(o, index + 1); // swapped = true; // } // index++; // } // } // } //} //protected void addObject( // DEREncodable obj) //{ // set.addElement(obj); //} //abstract void encode(DEROutputStream out) // throws IOException; //public String toString() //{ // return set.toString(); //} // END android-removed }