Browse Source

Adding some handling of block offsets for in place encryption/decryption

master
Teknikode 3 years ago
parent
commit
3bef7915dd

+ 6
- 6
Utilities/Utilities/Crypto.cs View File

@@ -209,7 +209,7 @@ namespace Teknik.Utilities
// Process the stream and save the bytes to the output
do
{
int processedBytes = ProcessCipherBlock(cipher, input, chunkSize, output, cipherOffset, out bytesRead);
int processedBytes = ProcessCipherBlock(cipher, input, 0, chunkSize, output, cipherOffset, out bytesRead);
cipherOffset += processedBytes;
}
while (bytesRead > 0);
@@ -234,7 +234,7 @@ namespace Teknik.Utilities
int bytesRead = 0;
do
{
processedBytes = ProcessCipherBlock(cipher, input, chunkSize, buffer, 0, out bytesRead);
processedBytes = ProcessCipherBlock(cipher, input, 0, chunkSize, buffer, 0, out bytesRead);
if (processedBytes > 0)
{
// We have bytes, lets write them to the file
@@ -268,17 +268,17 @@ namespace Teknik.Utilities
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
byte[] buffer = new byte[chunkSize];
byte[] buffer = new byte[chunkSize + inputOffset];

// Read the next block of data
bytesRead = input.Read(buffer, 0, chunkSize);
bytesRead = input.Read(buffer, 0, chunkSize + inputOffset);
if (bytesRead > 0)
{
// 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;

+ 1
- 1
Utilities/Utilities/ResponseHelper.cs View File

@@ -100,7 +100,7 @@ namespace Teknik.Utilities
{
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)
{
response.OutputStream.Write(buffer, 0, processedBytes);

+ 14
- 1
Utilities/Utilities/StreamHelper.cs View File

@@ -24,9 +24,22 @@ namespace Teknik.Utilities
if (_Inner != null && CanRead)
{
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
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)
{

Loading…
Cancel
Save