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
* from.
*/
protected DERObject buildObject(
- int tag,
+ int tag,
byte[] bytes)
throws IOException
{
bIn = new ByteArrayInputStream(bytes);
dIn = new BERInputStream(bIn);
- DERSet set = new DERSet(dIn.readObject());
+ DEREncodableVector v = new DEREncodableVector();
try
{
{
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];
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:
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());
}
//
//
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);
//
if (dIn.available() == 0)
{
- return new DERTaggedObject(tag & 0x0f, dObj);
+ return new DERTaggedObject(tag & 0x1f, dObj);
}
//
// ignore --
}
- return new DERTaggedObject(false, tag & 0x0f, seq);
+ return new DERTaggedObject(false, tag & 0x1f, seq);
}
return new DERUnknownTag(tag, bytes);