| 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); |
| } |
| } |
| } |