14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.asn1;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.IOException;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.util.Enumeration;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom/**
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * Note: this class is for processing DER/DL encoded sequences only.
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom */
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromclass LazyEncodedSequence
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends ASN1Sequence
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private byte[] encoded;
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    LazyEncodedSequence(
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        byte[] encoded)
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.encoded = encoded;
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private void parse()
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Enumeration en = new LazyConstructionEnumeration(encoded);
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        while (en.hasMoreElements())
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            seq.addElement(en.nextElement());
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        encoded = null;
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public synchronized ASN1Encodable getObjectAt(int index)
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (encoded != null)
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            parse();
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return super.getObjectAt(index);
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public synchronized Enumeration getObjects()
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (encoded == null)
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return super.getObjects();
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return new LazyConstructionEnumeration(encoded);
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public synchronized int size()
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (encoded != null)
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            parse();
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return super.size();
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    ASN1Primitive toDERObject()
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (encoded != null)
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            parse();
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return super.toDERObject();
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    ASN1Primitive toDLObject()
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (encoded != null)
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            parse();
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return super.toDLObject();
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    int encodedLength()
844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (encoded != null)
874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return 1 + StreamUtil.calculateBodyLength(encoded.length) + encoded.length;
894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else
914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return super.toDLObject().encodedLength();
934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    void encode(
974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1OutputStream out)
984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (encoded != null)
1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            out.writeEncoded(BERTags.SEQUENCE | BERTags.CONSTRUCTED, encoded);
1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else
1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            super.toDLObject().encode(out);
1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
110