All Downloads are FREE. Search and download functionalities are using the official Maven repository.

port.org.bouncycastle.asn1.DefiniteLengthInputStream Maven / Gradle / Ivy

There is a newer version: 6.0.d4j.2
Show newest version
package port.org.bouncycastle.asn1;

import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;

import port.org.bouncycastle.util.io.Streams;

class DefiniteLengthInputStream extends LimitedInputStream {

	private static final byte[] EMPTY_BYTES = new byte[0];

	private final int _originalLength;
	private int _remaining;

	DefiniteLengthInputStream(InputStream in, int length) {
		super(in, length);

		if (length < 0) {
			throw new IllegalArgumentException("negative lengths not allowed");
		}

		this._originalLength = length;
		this._remaining = length;

		if (length == 0) {
			setParentEofDetect(true);
		}
	}

	@Override
	int getRemaining() {
		return _remaining;
	}

	@Override
	public int read() throws IOException {
		if (_remaining == 0) {
			return -1;
		}

		int b = _in.read();

		if (b < 0) {
			throw new EOFException("DEF length " + _originalLength + " object truncated by " + _remaining);
		}

		if (--_remaining == 0) {
			setParentEofDetect(true);
		}

		return b;
	}

	@Override
	public int read(byte[] buf, int off, int len) throws IOException {
		if (_remaining == 0) {
			return -1;
		}

		int toRead = Math.min(len, _remaining);
		int numRead = _in.read(buf, off, toRead);

		if (numRead < 0) {
			throw new EOFException("DEF length " + _originalLength + " object truncated by " + _remaining);
		}

		if ((_remaining -= numRead) == 0) {
			setParentEofDetect(true);
		}

		return numRead;
	}

	byte[] toByteArray() throws IOException {
		if (_remaining == 0) {
			return EMPTY_BYTES;
		}

		byte[] bytes = new byte[_remaining];
		if ((_remaining -= Streams.readFully(_in, bytes)) != 0) {
			throw new EOFException("DEF length " + _originalLength + " object truncated by " + _remaining);
		}
		setParentEofDetect(true);
		return bytes;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy