mirror of
https://git.teknik.io/Teknikode/Teknik.git
synced 2023-08-02 14:16:22 +02:00
Adding some handling of block offsets for in place encryption/decryption
This commit is contained in:
parent
3490104980
commit
3bef7915dd
@ -209,7 +209,7 @@ namespace Teknik.Utilities
|
|||||||
// Process the stream and save the bytes to the output
|
// Process the stream and save the bytes to the output
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
int processedBytes = ProcessCipherBlock(cipher, input, chunkSize, output, cipherOffset, out bytesRead);
|
int processedBytes = ProcessCipherBlock(cipher, input, 0, chunkSize, output, cipherOffset, out bytesRead);
|
||||||
cipherOffset += processedBytes;
|
cipherOffset += processedBytes;
|
||||||
}
|
}
|
||||||
while (bytesRead > 0);
|
while (bytesRead > 0);
|
||||||
@ -234,7 +234,7 @@ namespace Teknik.Utilities
|
|||||||
int bytesRead = 0;
|
int bytesRead = 0;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
processedBytes = ProcessCipherBlock(cipher, input, chunkSize, buffer, 0, out bytesRead);
|
processedBytes = ProcessCipherBlock(cipher, input, 0, chunkSize, buffer, 0, out bytesRead);
|
||||||
if (processedBytes > 0)
|
if (processedBytes > 0)
|
||||||
{
|
{
|
||||||
// We have bytes, lets write them to the file
|
// We have bytes, lets write them to the file
|
||||||
@ -268,17 +268,17 @@ namespace Teknik.Utilities
|
|||||||
return cipher;
|
return cipher;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int ProcessCipherBlock(IBufferedCipher cipher, Stream input, int chunkSize, byte[] output, int outputOffset, out int bytesRead)
|
public static int ProcessCipherBlock(IBufferedCipher cipher, Stream input, int inputOffset, int chunkSize, byte[] output, int outputOffset, out int bytesRead)
|
||||||
{
|
{
|
||||||
// Initialize buffer
|
// Initialize buffer
|
||||||
byte[] buffer = new byte[chunkSize];
|
byte[] buffer = new byte[chunkSize + inputOffset];
|
||||||
|
|
||||||
// Read the next block of data
|
// Read the next block of data
|
||||||
bytesRead = input.Read(buffer, 0, chunkSize);
|
bytesRead = input.Read(buffer, 0, chunkSize + inputOffset);
|
||||||
if (bytesRead > 0)
|
if (bytesRead > 0)
|
||||||
{
|
{
|
||||||
// process the cipher for the read block and add it to the output
|
// process the cipher for the read block and add it to the output
|
||||||
return cipher.ProcessBytes(buffer, 0, bytesRead, output, outputOffset);
|
return cipher.ProcessBytes(buffer, inputOffset, bytesRead - inputOffset, output, outputOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -100,7 +100,7 @@ namespace Teknik.Utilities
|
|||||||
{
|
{
|
||||||
bytesToRead = bytesRemaining;
|
bytesToRead = bytesRemaining;
|
||||||
}
|
}
|
||||||
processedBytes = AES.ProcessCipherBlock(cipher, stream, bytesToRead, buffer, 0, out bytesRead);
|
processedBytes = AES.ProcessCipherBlock(cipher, stream, 0, bytesToRead, buffer, 0, out bytesRead);
|
||||||
if (processedBytes > 0)
|
if (processedBytes > 0)
|
||||||
{
|
{
|
||||||
response.OutputStream.Write(buffer, 0, processedBytes);
|
response.OutputStream.Write(buffer, 0, processedBytes);
|
||||||
|
@ -24,9 +24,22 @@ namespace Teknik.Utilities
|
|||||||
if (_Inner != null && CanRead)
|
if (_Inner != null && CanRead)
|
||||||
{
|
{
|
||||||
int bytesRead = 0;
|
int bytesRead = 0;
|
||||||
|
long startPosition = _Inner.Position;
|
||||||
|
int blockSize = _Cipher.GetBlockSize();
|
||||||
|
long blockOffset = (startPosition % blockSize);
|
||||||
|
|
||||||
|
// Determine if we are at the start of a block, or not
|
||||||
|
if (blockOffset != 0)
|
||||||
|
{
|
||||||
|
// We are not a multiple of the block size, so let's backup to get the current block
|
||||||
|
_Inner.Seek(startPosition - blockOffset, SeekOrigin.Begin);
|
||||||
|
}
|
||||||
|
|
||||||
// Process the cipher
|
// Process the cipher
|
||||||
int processed = AES.ProcessCipherBlock(_Cipher, _Inner, count, buffer, offset, out bytesRead);
|
int processed = AES.ProcessCipherBlock(_Cipher, _Inner, 0, count + (int)blockOffset, buffer, offset, out bytesRead);
|
||||||
|
|
||||||
|
// Adjust bytes read by the block offset
|
||||||
|
bytesRead -= (int)blockOffset;
|
||||||
|
|
||||||
if (processed < bytesRead)
|
if (processed < bytesRead)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user