You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.6 KiB
122 lines
3.6 KiB
8 months ago
|
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
|
||
|
#pragma warning disable
|
||
|
using System;
|
||
|
|
||
|
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// A class that allows encoding of data using a specific encoder to be processed in chunks.
|
||
|
/// </summary>
|
||
|
public class BufferedEncoder
|
||
|
{
|
||
|
internal byte[] Buffer;
|
||
|
internal int bufOff;
|
||
|
|
||
|
internal ITranslator translator;
|
||
|
|
||
|
|
||
|
/// <summary>
|
||
|
/// Create.
|
||
|
/// </summary>
|
||
|
/// <param name="translator">The translator to use.</param>
|
||
|
/// <param name="bufferSize">Size of the chunks.</param>
|
||
|
public BufferedEncoder(
|
||
|
ITranslator translator,
|
||
|
int bufferSize)
|
||
|
{
|
||
|
this.translator = translator;
|
||
|
|
||
|
if ((bufferSize % translator.GetEncodedBlockSize()) != 0)
|
||
|
{
|
||
|
throw new ArgumentException("buffer size not multiple of input block size");
|
||
|
}
|
||
|
|
||
|
Buffer = new byte[bufferSize];
|
||
|
// bufOff = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
/// <summary>
|
||
|
/// Process one byte of data.
|
||
|
/// </summary>
|
||
|
/// <param name="input">The byte.</param>
|
||
|
/// <param name="outBytes">An array to store output in.</param>
|
||
|
/// <param name="outOff">Offset within output array to start writing from.</param>
|
||
|
/// <returns></returns>
|
||
|
public int ProcessByte(
|
||
|
byte input,
|
||
|
byte[] outBytes,
|
||
|
int outOff)
|
||
|
{
|
||
|
int resultLen = 0;
|
||
|
|
||
|
Buffer[bufOff++] = input;
|
||
|
|
||
|
if (bufOff == Buffer.Length)
|
||
|
{
|
||
|
resultLen = translator.Encode(Buffer, 0, Buffer.Length, outBytes, outOff);
|
||
|
bufOff = 0;
|
||
|
}
|
||
|
|
||
|
return resultLen;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Process data from a byte array.
|
||
|
/// </summary>
|
||
|
/// <param name="input">Input data Byte array containing data to be processed.</param>
|
||
|
/// <param name="inOff">Start position within input data array.</param>
|
||
|
/// <param name="len">Amount of input data to be processed.</param>
|
||
|
/// <param name="outBytes">Output data array.</param>
|
||
|
/// <param name="outOff">Offset within output data array to start writing to.</param>
|
||
|
/// <returns>The amount of data written.</returns>
|
||
|
public int ProcessBytes(
|
||
|
byte[] input,
|
||
|
int inOff,
|
||
|
int len,
|
||
|
byte[] outBytes,
|
||
|
int outOff)
|
||
|
{
|
||
|
if (len < 0)
|
||
|
{
|
||
|
throw new ArgumentException("Can't have a negative input length!");
|
||
|
}
|
||
|
|
||
|
int resultLen = 0;
|
||
|
int gapLen = Buffer.Length - bufOff;
|
||
|
|
||
|
if (len > gapLen)
|
||
|
{
|
||
|
Array.Copy(input, inOff, Buffer, bufOff, gapLen);
|
||
|
|
||
|
resultLen += translator.Encode(Buffer, 0, Buffer.Length, outBytes, outOff);
|
||
|
|
||
|
bufOff = 0;
|
||
|
|
||
|
len -= gapLen;
|
||
|
inOff += gapLen;
|
||
|
outOff += resultLen;
|
||
|
|
||
|
int chunkSize = len - (len % Buffer.Length);
|
||
|
|
||
|
resultLen += translator.Encode(input, inOff, chunkSize, outBytes, outOff);
|
||
|
|
||
|
len -= chunkSize;
|
||
|
inOff += chunkSize;
|
||
|
}
|
||
|
|
||
|
if (len != 0)
|
||
|
{
|
||
|
Array.Copy(input, inOff, Buffer, bufOff, len);
|
||
|
|
||
|
bufOff += len;
|
||
|
}
|
||
|
|
||
|
return resultLen;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
#pragma warning restore
|
||
|
#endif
|