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