package org.bouncycastle.asn1;
import java.io.EOFException;
import java.io.InputStream;
import java.io.IOException;
class DefiniteLengthInputStream
extends LimitedInputStream
{
private int _length;
DefiniteLengthInputStream(
InputStream in,
int length)
{
super(in);
if (length < 0)
{
throw new IllegalArgumentException("negative lengths not allowed");
}
this._length = length;
}
public int read()
throws IOException
{
if (_length > 0)
{
int b = _in.read();
if (b < 0)
{
throw new EOFException();
}
--_length;
return b;
}
setParentEofDetect(true);
return -1;
}
public int read(byte[] buf, int off, int len)
throws IOException
{
if (_length > 0)
{
int toRead = Math.min(len, _length);
int numRead = _in.read(buf, off, toRead);
if (numRead < 0)
throw new EOFException();
_length -= numRead;
return numRead;
}
setParentEofDetect(true);
return -1;
}
byte[] toByteArray()
throws IOException
{
byte[] bytes = new byte[_length];
if (_length > 0)
{
int pos = 0;
do
{
int read = _in.read(bytes, pos, _length - pos);
if (read < 0)
{
throw new EOFException();
}
pos += read;
}
while (pos < _length);
_length = 0;
}
setParentEofDetect(true);
return bytes;
}
}