2003/02/12 06:21:04
[org.ibex.core.git] / src / org / bouncycastle / asn1 / DERInputStream.java
index 61de735..9cf0ef1 100644 (file)
@@ -1,7 +1,13 @@
 package org.bouncycastle.asn1;
 
 import java.math.BigInteger;
-import java.io.*;
+import java.io.FilterInputStream;
+
+import java.io.InputStream;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.EOFException;
+
 
 public class DERInputStream
     extends FilterInputStream implements DERTags
@@ -69,7 +75,7 @@ public class DERInputStream
         * from.
         */
     protected DERObject buildObject(
-               int     tag,
+               int         tag,
                byte[]  bytes)
                throws IOException
        {
@@ -99,7 +105,7 @@ public class DERInputStream
             bIn = new ByteArrayInputStream(bytes);
             dIn = new BERInputStream(bIn);
 
-            DERSet       set = new DERSet(dIn.readObject());
+            DEREncodableVector    v = new DEREncodableVector();
 
             try
             {
@@ -107,41 +113,21 @@ public class DERInputStream
                 {
                     DERObject   obj = dIn.readObject();
 
-                    set.addObject(obj);
+                    v.add(obj);
                 }
             }
             catch (EOFException ex)
             {
-                return set;
+                return new DERConstructedSet(v);
             }
         case BOOLEAN:
             return new DERBoolean(bytes);
         case INTEGER:
             return new DERInteger(bytes);
+        case ENUMERATED:
+            return new DEREnumerated(bytes);
         case OBJECT_IDENTIFIER:
-            int             head = bytes[0] & 0xff;
-            StringBuffer    objId = new StringBuffer();
-    
-            objId.append(Integer.toString(head / 40));
-            objId.append('.');
-            objId.append(Integer.toString(head % 40));
-            
-            int value = 0;
-    
-            for (int i = 1; i != bytes.length; i++)
-            {
-                int b = bytes[i] & 0xff;
-    
-                value = value * 128 + (b & 0x7f);
-                if ((b & 128) == 0)             // end of number reached
-                {
-                    objId.append('.');
-                    objId.append(Integer.toString(value));
-                    value = 0;
-                }
-            }
-    
-            return new DERObjectIdentifier(objId.toString());
+            return new DERObjectIdentifier(bytes);
         case BIT_STRING:
             int     padBits = bytes[0];
             byte[]  data = new byte[bytes.length - 1];
@@ -149,6 +135,8 @@ public class DERInputStream
             System.arraycopy(bytes, 1, data, 0, bytes.length - 1);
 
             return new DERBitString(data, padBits);
+        case UTF8_STRING:
+            return new DERUTF8String(bytes);
         case PRINTABLE_STRING:
             return new DERPrintableString(bytes);
         case IA5_STRING:
@@ -157,21 +145,30 @@ public class DERInputStream
             return new DERT61String(bytes);
         case VISIBLE_STRING:
             return new DERVisibleString(bytes);
+        case UNIVERSAL_STRING:
+            return new DERUniversalString(bytes);
         case BMP_STRING:
             return new DERBMPString(bytes);
         case OCTET_STRING:
             return new DEROctetString(bytes);
         case UTC_TIME:
-            return new DERUTCTime(new String(bytes));
+            return new DERUTCTime(bytes);
+        case GENERALIZED_TIME:
+            return new DERGeneralizedTime(bytes);
         default:
             //
-            // with tagged object tag number is bottom 4 bits
+            // with tagged object tag number is bottom 5 bits
             //
-            if ((tag & (TAGGED | CONSTRUCTED)) != 0)  
+            if ((tag & TAGGED) != 0)  
             {
+                if ((tag & 0x1f) == 0x1f)
+                {
+                    throw new IOException("unsupported high tag encountered");
+                }
+
                 if (bytes.length == 0)        // empty tag!
                 {
-                    return new DERTaggedObject(tag & 0x0f);
+                    return new DERTaggedObject(false, tag & 0x1f, new DERConstructedSequence());
                 }
 
                 //
@@ -179,7 +176,7 @@ public class DERInputStream
                 //
                 if ((tag & CONSTRUCTED) == 0)
                 {
-                    return new DERTaggedObject(false, tag & 0x0f, new DEROctetString(bytes));
+                    return new DERTaggedObject(false, tag & 0x1f, new DEROctetString(bytes));
                 }
 
                 bIn = new ByteArrayInputStream(bytes);
@@ -193,7 +190,7 @@ public class DERInputStream
                 //
                 if (dIn.available() == 0)
                 {
-                    return new DERTaggedObject(tag & 0x0f, dObj);
+                    return new DERTaggedObject(tag & 0x1f, dObj);
                 }
 
                 //
@@ -217,7 +214,7 @@ public class DERInputStream
                     // ignore --
                 }
 
-                return new DERTaggedObject(false, tag & 0x0f, seq);
+                return new DERTaggedObject(false, tag & 0x1f, seq);
             }
 
             return new DERUnknownTag(tag, bytes);