blob: c7342adfdeab0302592f238bbc22f874ee683d08 [file] [log] [blame]
package org.bouncycastle.asn1;
import java.io.IOException;
import java.util.Enumeration;
/**
* Note: this class is for processing DER/DL encoded sequences only.
*/
class LazyEncodedSequence
extends ASN1Sequence
{
private byte[] encoded;
LazyEncodedSequence(
byte[] encoded)
throws IOException
{
this.encoded = encoded;
}
private void parse()
{
Enumeration en = new LazyConstructionEnumeration(encoded);
while (en.hasMoreElements())
{
seq.addElement(en.nextElement());
}
encoded = null;
}
public synchronized ASN1Encodable getObjectAt(int index)
{
if (encoded != null)
{
parse();
}
return super.getObjectAt(index);
}
public synchronized Enumeration getObjects()
{
if (encoded == null)
{
return super.getObjects();
}
return new LazyConstructionEnumeration(encoded);
}
public synchronized int size()
{
if (encoded != null)
{
parse();
}
return super.size();
}
ASN1Primitive toDERObject()
{
if (encoded != null)
{
parse();
}
return super.toDERObject();
}
ASN1Primitive toDLObject()
{
if (encoded != null)
{
parse();
}
return super.toDLObject();
}
int encodedLength()
throws IOException
{
if (encoded != null)
{
return 1 + StreamUtil.calculateBodyLength(encoded.length) + encoded.length;
}
else
{
return super.toDLObject().encodedLength();
}
}
void encode(
ASN1OutputStream out)
throws IOException
{
if (encoded != null)
{
out.writeEncoded(BERTags.SEQUENCE | BERTags.CONSTRUCTED, encoded);
}
else
{
super.toDLObject().encode(out);
}
}
}