1c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrompackage org.bouncycastle.asn1;
2c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
3c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport java.io.ByteArrayInputStream;
4c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport java.io.IOException;
5c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport java.io.InputStream;
6c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
7c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrompublic class ASN1StreamParser
8c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom{
9c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    private final InputStream _in;
10c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    private final int         _limit;
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private final byte[][] tmpBuffers;
12c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
13c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public ASN1StreamParser(
14c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        InputStream in)
15c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this(in, StreamUtil.findLimit(in));
17c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
18c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
19c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public ASN1StreamParser(
20c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        InputStream in,
21c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        int         limit)
22c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
23c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        this._in = in;
24c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        this._limit = limit;
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.tmpBuffers = new byte[11][];
27c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
28c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
29c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public ASN1StreamParser(
30c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        byte[] encoding)
31c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
32c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        this(new ByteArrayInputStream(encoding), encoding.length);
33c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
34c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    ASN1Encodable readIndef(int tagValue) throws IOException
366e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
376e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        // Note: INDEF => CONSTRUCTED
386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
396e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        // TODO There are other tags that may be constructed (e.g. BIT_STRING)
406e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        switch (tagValue)
416e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            case BERTags.EXTERNAL:
436e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                return new DERExternalParser(this);
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            case BERTags.OCTET_STRING:
456e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                return new BEROctetStringParser(this);
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            case BERTags.SEQUENCE:
476e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                return new BERSequenceParser(this);
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            case BERTags.SET:
496e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                return new BERSetParser(this);
506e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            default:
516e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                throw new ASN1Exception("unknown BER object encountered: 0x" + Integer.toHexString(tagValue));
526e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
536e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
546e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    ASN1Encodable readImplicit(boolean constructed, int tag) throws IOException
566e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
576e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (_in instanceof IndefiniteLengthInputStream)
586e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
596e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            if (!constructed)
606e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
616e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                throw new IOException("indefinite length primitive encoding encountered");
626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return readIndef(tag);
656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
676e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (constructed)
686e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
696e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            switch (tag)
706e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                case BERTags.SET:
726e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    return new DERSetParser(this);
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                case BERTags.SEQUENCE:
746e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    return new DERSequenceParser(this);
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                case BERTags.OCTET_STRING:
766e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    return new BEROctetStringParser(this);
776e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
786e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
796e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        else
806e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
816e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            switch (tag)
826e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                case BERTags.SET:
846e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    throw new ASN1Exception("sequences must use constructed encoding (see X.690 8.9.1/8.10.1)");
854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                case BERTags.SEQUENCE:
866e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    throw new ASN1Exception("sets must use constructed encoding (see X.690 8.11.1/8.12.1)");
874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                case BERTags.OCTET_STRING:
886e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    return new DEROctetStringParser((DefiniteLengthInputStream)_in);
896e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
906e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
916e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
926e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        // TODO ASN1Exception
936e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        throw new RuntimeException("implicit tagging not implemented");
946e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
956e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    ASN1Primitive readTaggedObject(boolean constructed, int tag) throws IOException
976e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
986e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (!constructed)
996e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
1006e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            // Note: !CONSTRUCTED => IMPLICIT
1016e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            DefiniteLengthInputStream defIn = (DefiniteLengthInputStream)_in;
1026e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return new DERTaggedObject(false, tag, new DEROctetString(defIn.toByteArray()));
1036e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
1046e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1056e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        ASN1EncodableVector v = readVector();
1066e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1076e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (_in instanceof IndefiniteLengthInputStream)
1086e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
1096e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return v.size() == 1
1106e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                ?   new BERTaggedObject(true, tag, v.get(0))
1116e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                :   new BERTaggedObject(false, tag, BERFactory.createSequence(v));
1126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
1136e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1146e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return v.size() == 1
1156e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            ?   new DERTaggedObject(true, tag, v.get(0))
1166e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            :   new DERTaggedObject(false, tag, DERFactory.createSequence(v));
1176e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
1186e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Encodable readObject()
120c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        throws IOException
121c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
122c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        int tag = _in.read();
123c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        if (tag == -1)
124c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
125c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            return null;
126c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
127c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
128c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        //
129c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        // turn of looking for "00" while we resolve the tag
130c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        //
131c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        set00Check(false);
132c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
133c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        //
134c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        // calculate tag number
135c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        //
136c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        int tagNo = ASN1InputStream.readTagNumber(_in, tag);
137c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
1384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        boolean isConstructed = (tag & BERTags.CONSTRUCTED) != 0;
139c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
140c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        //
141c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        // calculate length
142c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        //
143c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        int length = ASN1InputStream.readLength(_in, _limit);
144c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
145c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        if (length < 0) // indefinite length method
146c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
147c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            if (!isConstructed)
148c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            {
149c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                throw new IOException("indefinite length primitive encoding encountered");
150c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            }
151c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
1526e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(_in, _limit);
1536e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            ASN1StreamParser sp = new ASN1StreamParser(indIn, _limit);
154c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
1554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if ((tag & BERTags.APPLICATION) != 0)
156c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            {
157c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                return new BERApplicationSpecificParser(tagNo, sp);
158c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            }
159c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
1604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if ((tag & BERTags.TAGGED) != 0)
161c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            {
1626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                return new BERTaggedObjectParser(true, tagNo, sp);
163c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            }
164c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
1656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return sp.readIndef(tagNo);
166c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
167c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        else
168c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
169c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(_in, length);
170c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
1714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if ((tag & BERTags.APPLICATION) != 0)
172c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            {
173c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                return new DERApplicationSpecific(isConstructed, tagNo, defIn.toByteArray());
174c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            }
175c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
1764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if ((tag & BERTags.TAGGED) != 0)
177c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            {
1786e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                return new BERTaggedObjectParser(isConstructed, tagNo, new ASN1StreamParser(defIn));
179c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            }
180c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
181c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            if (isConstructed)
182c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            {
183c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                // TODO There are other tags that may be constructed (e.g. BIT_STRING)
184c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                switch (tagNo)
185c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                {
1864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                    case BERTags.OCTET_STRING:
187c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                        //
188c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                        // yes, people actually do this...
189c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                        //
190c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                        return new BEROctetStringParser(new ASN1StreamParser(defIn));
1914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                    case BERTags.SEQUENCE:
192c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                        return new DERSequenceParser(new ASN1StreamParser(defIn));
1934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                    case BERTags.SET:
194c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                        return new DERSetParser(new ASN1StreamParser(defIn));
1954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                    case BERTags.EXTERNAL:
196c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                        return new DERExternalParser(new ASN1StreamParser(defIn));
197c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                    default:
1984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                        throw new IOException("unknown tag " + tagNo + " encountered");
199c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                }
200c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            }
201c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
202c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            // Some primitive encodings can be handled by parsers too...
203c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            switch (tagNo)
204c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            {
2054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                case BERTags.OCTET_STRING:
206c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                    return new DEROctetStringParser(defIn);
207c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            }
208c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
2096e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            try
2106e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
2114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                return ASN1InputStream.createPrimitiveDERObject(tagNo, defIn, tmpBuffers);
2126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
2136e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            catch (IllegalArgumentException e)
2146e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
2156e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                throw new ASN1Exception("corrupted stream detected", e);
2166e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
217c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
218c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
219c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
220c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    private void set00Check(boolean enabled)
221c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
222c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        if (_in instanceof IndefiniteLengthInputStream)
223c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
224c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            ((IndefiniteLengthInputStream)_in).setEofOn00(enabled);
225c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
226c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
227c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
228c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    ASN1EncodableVector readVector() throws IOException
229c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
230c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        ASN1EncodableVector v = new ASN1EncodableVector();
231c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
2324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1Encodable obj;
233c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        while ((obj = readObject()) != null)
234c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
2356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            if (obj instanceof InMemoryRepresentable)
2366e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
2376e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                v.add(((InMemoryRepresentable)obj).getLoadedObject());
2386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
2396e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            else
2406e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
2414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                v.add(obj.toASN1Primitive());
2426e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
243c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
244c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
245c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        return v;
246c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
247c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom}
248