resolve darcs stupidity
[org.ibex.core.git] / src / org / bouncycastle / asn1 / DERBMPString.java
index 8a58b4a..23f467b 100644 (file)
@@ -12,19 +12,63 @@ public class DERBMPString
     String  string;
 
     /**
+     * return a BMP String from the given object.
+     *
+     * @param obj the object we want converted.
+     * @exception IllegalArgumentException if the object cannot be converted.
+     */
+    public static DERBMPString getInstance(
+        Object  obj)
+    {
+        if (obj == null || obj instanceof DERBMPString)
+        {
+            return (DERBMPString)obj;
+        }
+
+        if (obj instanceof ASN1OctetString)
+        {
+            return new DERBMPString(((ASN1OctetString)obj).getOctets());
+        }
+
+        if (obj instanceof ASN1TaggedObject)
+        {
+            return getInstance(((ASN1TaggedObject)obj).getObject());
+        }
+
+        throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+    }
+
+    /**
+     * return a BMP String from a tagged object.
+     *
+     * @param obj the tagged object holding the object we want
+     * @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 DERBMPString getInstance(
+        ASN1TaggedObject obj,
+        boolean          explicit)
+    {
+        return getInstance(obj.getObject());
+    }
+    
+
+    /**
      * basic constructor - byte encoded string.
      */
     public DERBMPString(
         byte[]   string)
     {
-           try
-           {
-            this.string = new String(string, "UnicodeBig");
-           }
-           catch (UnsupportedEncodingException e)
-           {
-            throw new RuntimeException(e.toString());
-           }
+        char[]  cs = new char[string.length / 2];
+
+        for (int i = 0; i != cs.length; i++)
+        {
+            cs[i] = (char)((string[2 * i] << 8) | (string[2 * i + 1] & 0xff));
+        }
+
+        this.string = new String(cs);
     }
 
     /**
@@ -41,6 +85,24 @@ public class DERBMPString
         return string;
     }
 
+    public int hashCode()
+    {
+        return this.getString().hashCode();
+    }
+
+    public boolean equals(
+        Object  o)
+    {
+        if (!(o instanceof DERBMPString))
+        {
+            return false;
+        }
+
+        DERPrintableString  s = (DERPrintableString)o;
+
+        return this.getString().equals(s.getString());
+    }
+
     void encode(
         DEROutputStream  out)
         throws IOException
@@ -50,7 +112,7 @@ public class DERBMPString
 
         for (int i = 0; i != c.length; i++)
         {
-            b[2 * i] = (byte)((c[i] & 0xff00) >> 8);
+            b[2 * i] = (byte)(c[i] >> 8);
             b[2 * i + 1] = (byte)c[i];
         }