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

cz.d1x.dxcrypto.encryption.io.EncryptingInputStream Maven / Gradle / Ivy

package cz.d1x.dxcrypto.encryption.io;

import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Wrapper around InputStream which reads IV before reading given InputStream
 *
 * @author d.richter
 */
public class EncryptingInputStream extends FilterInputStream {

    private final byte[] iv;
    private AtomicInteger ivReadPosition = new AtomicInteger();

    public EncryptingInputStream(InputStream in, byte[] iv) {
        super(in);
        this.iv = iv;
    }

    @Override
    public int read() throws IOException {
        if (ivReadPosition.get() < iv.length) {
            return iv[ivReadPosition.getAndIncrement()];
        }
        return super.read();
    }

    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        if (ivReadPosition.get() < iv.length) {
            final int copyLength = Math.min(len, iv.length - ivReadPosition.get());
            System.arraycopy(iv, ivReadPosition.getAndAdd(copyLength), b, off, copyLength);
            return copyLength;
        }
        return super.read(b, off, len);
    }

    @Override
    public long skip(long n) {
        throw new UnsupportedOperationException("Skip is not supported.");
    }

    @Override
    public int available() throws IOException {
        return (iv.length - ivReadPosition.get()) + super.available();
    }

    @Override
    public synchronized void mark(int readlimit) {
    }

    @Override
    public synchronized void reset() {
    }

    @Override
    public boolean markSupported() {
        return false;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy