diff options
Diffstat (limited to 'core/src/main/java/org/spongycastle/crypto/StreamBlockCipher.java')
-rw-r--r-- | core/src/main/java/org/spongycastle/crypto/StreamBlockCipher.java | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/core/src/main/java/org/spongycastle/crypto/StreamBlockCipher.java b/core/src/main/java/org/spongycastle/crypto/StreamBlockCipher.java new file mode 100644 index 00000000..58410183 --- /dev/null +++ b/core/src/main/java/org/spongycastle/crypto/StreamBlockCipher.java @@ -0,0 +1,58 @@ +package org.spongycastle.crypto; + +/** + * A parent class for block cipher modes that do not require block aligned data to be processed, but can function in + * a streaming mode. + */ +public abstract class StreamBlockCipher + implements BlockCipher, StreamCipher +{ + private final BlockCipher cipher; + + protected StreamBlockCipher(BlockCipher cipher) + { + this.cipher = cipher; + } + + /** + * return the underlying block cipher that we are wrapping. + * + * @return the underlying block cipher that we are wrapping. + */ + public BlockCipher getUnderlyingCipher() + { + return cipher; + } + + public final byte returnByte(byte in) + { + return calculateByte(in); + } + + public int processBytes(byte[] in, int inOff, int len, byte[] out, int outOff) + throws DataLengthException + { + if (outOff + len > out.length) + { + throw new DataLengthException("output buffer too short"); + } + + if (inOff + len > in.length) + { + throw new DataLengthException("input buffer too small"); + } + + int inStart = inOff; + int inEnd = inOff + len; + int outStart = outOff; + + while (inStart < inEnd) + { + out[outStart++] = calculateByte(in[inStart++]); + } + + return len; + } + + protected abstract byte calculateByte(byte b); +}
\ No newline at end of file |