@Override
    public final int read() throws IOException {
        if (ostart >= ofinish) {
            // we loop for new data as the spec says we are blocking
            int i = 0;
            while (i == 0) {
                i = getMoreData();
            }
            if (i == -1) {
                return -1;
            }
        }
        return (int) obuffer[ostart++] & 0xff;
    }
Reads the next byte of data from this input stream. The value
byte is returned as an <code>int</code> in the range
<code>0</code> to <code>255</code>. If no byte is available
because the end of the stream has been reached, the value
<code>-1</code> is returned. This method blocks until input data
is available, the end of the stream is detected, or an exception
is thrown.

@return the next byte of data, or <code>-1</code> if the end of the
stream is reached.
@throws IOException if an I/O error occurs.
src/main/java/org/gaul/s3proxy/crypto/DecryptionInputStream.java