BufferedCipherBase
namespace Org.BouncyCastle.Crypto
{
public abstract class BufferedCipherBase : IBufferedCipher
{
protected static readonly byte[] EmptyBuffer = new byte[0];
public abstract string AlgorithmName { get; }
public abstract void Init(bool forEncryption, ICipherParameters parameters);
public abstract int GetBlockSize();
public abstract int GetOutputSize(int inputLen);
public abstract int GetUpdateOutputSize(int inputLen);
public abstract byte[] ProcessByte(byte input);
public virtual int ProcessByte(byte input, byte[] output, int outOff)
{
byte[] array = ProcessByte(input);
if (array == null)
return 0;
if (outOff + array.Length > output.Length)
throw new DataLengthException("output buffer too short");
array.CopyTo(output, outOff);
return array.Length;
}
public virtual byte[] ProcessBytes(byte[] input)
{
return ProcessBytes(input, 0, input.Length);
}
public abstract byte[] ProcessBytes(byte[] input, int inOff, int length);
public virtual int ProcessBytes(byte[] input, byte[] output, int outOff)
{
return ProcessBytes(input, 0, input.Length, output, outOff);
}
public virtual int ProcessBytes(byte[] input, int inOff, int length, byte[] output, int outOff)
{
byte[] array = ProcessBytes(input, inOff, length);
if (array == null)
return 0;
if (outOff + array.Length > output.Length)
throw new DataLengthException("output buffer too short");
array.CopyTo(output, outOff);
return array.Length;
}
public abstract byte[] DoFinal();
public virtual byte[] DoFinal(byte[] input)
{
return DoFinal(input, 0, input.Length);
}
public abstract byte[] DoFinal(byte[] input, int inOff, int length);
public virtual int DoFinal(byte[] output, int outOff)
{
byte[] array = DoFinal();
if (outOff + array.Length > output.Length)
throw new DataLengthException("output buffer too short");
array.CopyTo(output, outOff);
return array.Length;
}
public virtual int DoFinal(byte[] input, byte[] output, int outOff)
{
return DoFinal(input, 0, input.Length, output, outOff);
}
public virtual int DoFinal(byte[] input, int inOff, int length, byte[] output, int outOff)
{
int num = ProcessBytes(input, inOff, length, output, outOff);
return num + DoFinal(output, outOff + num);
}
public abstract void Reset();
internal static int GetFullBlocksSize(int totalSize, int blockSize)
{
if (totalSize < 0)
return 0;
int num = blockSize - 1;
if ((blockSize & num) == 0)
return totalSize & ~num;
return totalSize - totalSize % blockSize;
}
internal static bool SegmentsOverlap(int aOff, int aLen, int bOff, int bLen)
{
if (aLen > 0 && bLen > 0 && aOff < bOff + bLen)
return bOff < aOff + aLen;
return false;
}
}
}