Skip to content

Commit 96319a3

Browse files
fix async/dispose problem in Secrets.DecryptFileTo* functions
1 parent 0f356bf commit 96319a3

File tree

4 files changed

+59
-20
lines changed

4 files changed

+59
-20
lines changed

RELEASE_NOTES.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
### 0.2.1
2+
- fix async/dispose problem in Secrets.DecryptFileTo* functions
3+
14
### 0.2.0
25
- refactoring: all encrypt/decrypt combinations with systematic naming scheme
36
- `Secrets.Encrypt[Stream|Buffer|String|File]To[Stream|Buffer|File]Async`

data/image.jpg

143 KB
Loading

src/Aardvark.Base.Cryptography.Tests/SecretsTests.cs

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ private static TestFile SRC_FILE
2020
}
2121
}
2222

23-
private static byte[] ENCRYPTED_BUFFER = Secrets.EncryptStringToBufferAsync(SRC_STRING, PWD).Result;
23+
private static readonly byte[] ENCRYPTED_BUFFER = Secrets.EncryptStringToBufferAsync(SRC_STRING, PWD).Result;
2424
private static Stream ENCRYPTED_STREAM => new MemoryStream(ENCRYPTED_BUFFER);
2525
private static TestFile ENCRYPTED_FILE
2626
{
@@ -32,35 +32,35 @@ private static TestFile ENCRYPTED_FILE
3232
}
3333
}
3434

35-
private async Task CheckEncryptedAsync(MemoryStream encrypted)
35+
private static async Task CheckEncryptedAsync(MemoryStream encrypted)
3636
{
3737
var decrypted = await Secrets.DecryptBufferToStringAsync(encrypted.ToArray(), PWD);
3838
Assert.True(decrypted == SRC_STRING);
3939
}
40-
private async Task CheckEncryptedAsync(byte[] encrypted)
40+
private static async Task CheckEncryptedAsync(byte[] encrypted)
4141
{
4242
var decrypted = await Secrets.DecryptBufferToStringAsync(encrypted, PWD);
4343
Assert.True(decrypted == SRC_STRING);
4444
}
45-
private async Task CheckEncryptedAsync(TestFile encrypted)
45+
private static async Task CheckEncryptedAsync(TestFile encrypted)
4646
{
4747
var decrypted = await Secrets.DecryptFileToStringAsync(encrypted.Path, PWD);
4848
Assert.True(decrypted == SRC_STRING);
4949
}
5050

51-
private void CheckDecrypted(string decrypted)
51+
private static void CheckDecrypted(string decrypted)
5252
{
5353
Assert.True(decrypted == SRC_STRING);
5454
}
55-
private void CheckDecryptedAsync(MemoryStream decrypted)
55+
private static void CheckDecryptedAsync(MemoryStream decrypted)
5656
{
5757
CheckDecrypted(decrypted.ToArray());
5858
}
59-
private void CheckDecrypted(byte[] decrypted)
59+
private static void CheckDecrypted(byte[] decrypted)
6060
{
6161
CheckDecrypted(Encoding.UTF8.GetString(decrypted));
6262
}
63-
private void CheckDecrypted(TestFile decrypted)
63+
private static void CheckDecrypted(TestFile decrypted)
6464
{
6565
var s = File.ReadAllText(decrypted.Path);
6666
Assert.True(s == SRC_STRING);
@@ -328,5 +328,34 @@ public async Task Roundtrip_UrlEncodedBase64()
328328

329329
Assert.True(plaintext0 == plaintext1);
330330
}
331+
332+
333+
334+
[Fact]
335+
public async Task RoundTrip_Large_File()
336+
{
337+
var sourceFile = Path.GetFullPath(@"../../../../../data/image.jpg");
338+
var encryptedFile = sourceFile + ".encrypted";
339+
var decryptedFile = sourceFile + ".decrypted.jpg";
340+
341+
try
342+
{
343+
await Secrets.EncryptFileToFileAsync(sourceFile, encryptedFile, "password");
344+
await Secrets.DecryptFileToFileAsync(encryptedFile, decryptedFile, "password");
345+
346+
var buffer0 = File.ReadAllBytes(sourceFile);
347+
var buffer1 = File.ReadAllBytes(decryptedFile);
348+
Assert.True(buffer0.Length == buffer1.Length);
349+
for (var i = 0; i < buffer0.Length; i++)
350+
{
351+
if (buffer0[i] != buffer1[i]) Assert.Fail("Decrypted file is not identical to original file.");
352+
}
353+
}
354+
finally
355+
{
356+
File.Delete(encryptedFile);
357+
File.Delete(decryptedFile);
358+
}
359+
}
331360
}
332361
}

src/Aardvark.Base.Cryptography/Secrets.cs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -360,38 +360,45 @@ public static Task DecryptBufferToFileAsync(byte[] source, string targetFile, st
360360
/// <summary>
361361
/// Decrypt file to stream.
362362
/// </summary>
363-
public static Task DecryptFileToStreamAsync(string sourceFile, Stream target, string password)
363+
public static async Task DecryptFileToStreamAsync(string sourceFile, Stream target, string password)
364364
{
365-
using var sourceStream = GetFileReadStream(sourceFile);
366-
return DecryptStreamToStreamAsync(sourceStream, target, password);
365+
var sourceStream = GetFileReadStream(sourceFile);
366+
await DecryptStreamToStreamAsync(sourceStream, target, password);
367+
sourceStream.Dispose();
367368
}
368369

369370
/// <summary>
370371
/// Decrypt file to buffer.
371372
/// </summary>
372-
public static Task<byte[]> DecryptFileToBufferAsync(string sourceFile, string password)
373+
public static async Task<byte[]> DecryptFileToBufferAsync(string sourceFile, string password)
373374
{
374-
using var sourceStream = GetFileReadStream(sourceFile);
375-
return DecryptStreamToBufferAsync(sourceStream, password);
375+
var sourceStream = GetFileReadStream(sourceFile);
376+
var result = await DecryptStreamToBufferAsync(sourceStream, password);
377+
sourceStream.Dispose();
378+
return result;
376379
}
377380

378381
/// <summary>
379382
/// Decrypt file to string.
380383
/// </summary>
381384
public static async Task<string> DecryptFileToStringAsync(string sourceFile, string password)
382385
{
383-
using var sourceStream = GetFileReadStream(sourceFile);
384-
return await DecryptStreamToStringAsync(sourceStream, password);
386+
var sourceStream = GetFileReadStream(sourceFile);
387+
var result = await DecryptStreamToStringAsync(sourceStream, password);
388+
sourceStream.Dispose();
389+
return result;
385390
}
386391

387392
/// <summary>
388393
/// Decrypt file to file.
389394
/// </summary>
390-
public static Task DecryptFileToFileAsync(string sourceFile, string targetFile, string password)
395+
public static async Task DecryptFileToFileAsync(string sourceFile, string targetFile, string password)
391396
{
392-
using var sourceStream = GetFileReadStream(sourceFile);
393-
using var targetStream = GetFileWriteStream(targetFile);
394-
return DecryptStreamToStreamAsync(sourceStream, targetStream, password);
397+
var sourceStream = GetFileReadStream(sourceFile);
398+
var targetStream = GetFileWriteStream(targetFile);
399+
await DecryptStreamToStreamAsync(sourceStream, targetStream, password);
400+
sourceStream.Dispose();
401+
targetStream.Dispose();
395402
}
396403

397404
#endregion

0 commit comments

Comments
 (0)