Added password change for streams
This commit is contained in:
parent
83850f318e
commit
96f7832722
@ -279,6 +279,93 @@ namespace Encrypter_Tests
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task TestChangedPasswordBehaviourStreaming()
|
||||||
|
{
|
||||||
|
var tempFileInput = Path.GetTempFileName();
|
||||||
|
var tempFileEncryptedPrevious = Path.GetTempFileName();
|
||||||
|
var tempFileReEncrypted = Path.GetTempFileName();
|
||||||
|
var tempFileDecrypted = Path.GetTempFileName();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var message = "This is a test with umlauts äüö.";
|
||||||
|
await File.WriteAllTextAsync(tempFileInput, message);
|
||||||
|
|
||||||
|
var passwordPrevious = "test password";
|
||||||
|
var passwordNext = "better password";
|
||||||
|
var iterations = 1_000;
|
||||||
|
|
||||||
|
await using (var outputStream = File.OpenWrite(tempFileEncryptedPrevious))
|
||||||
|
{
|
||||||
|
await using var inputStream = File.OpenRead(tempFileInput);
|
||||||
|
await CryptoProcessor.Encrypt(inputStream, outputStream, passwordPrevious, iterations);
|
||||||
|
}
|
||||||
|
|
||||||
|
await using (var outputStream = File.OpenWrite(tempFileReEncrypted))
|
||||||
|
{
|
||||||
|
await using var inputStream = File.OpenRead(tempFileEncryptedPrevious);
|
||||||
|
await CryptoProcessor.ChangePassword(inputStream, outputStream, passwordPrevious, passwordNext, iterations);
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert.That(await File.ReadAllBytesAsync(tempFileEncryptedPrevious), Is.Not.EqualTo(await File.ReadAllBytesAsync(tempFileReEncrypted)));
|
||||||
|
|
||||||
|
await using (var outputStream = File.OpenWrite(tempFileDecrypted))
|
||||||
|
{
|
||||||
|
await using var inputStream = File.OpenRead(tempFileReEncrypted);
|
||||||
|
await CryptoProcessor.Decrypt(inputStream, outputStream, passwordNext, iterations);
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert.That(await File.ReadAllTextAsync(tempFileDecrypted), Is.EqualTo(message));
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await using var tempBuffer = new MemoryStream();
|
||||||
|
await using var inputStream = File.OpenRead(tempFileReEncrypted);
|
||||||
|
await CryptoProcessor.Decrypt(inputStream, tempBuffer, passwordPrevious, iterations);
|
||||||
|
Assert.Fail("Should not be reached!");
|
||||||
|
}
|
||||||
|
catch (CryptographicException e)
|
||||||
|
{
|
||||||
|
Assert.That(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File.Delete(tempFileInput);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File.Delete(tempFileDecrypted);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File.Delete(tempFileEncryptedPrevious);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File.Delete(tempFileReEncrypted);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public async Task TestSimpleStream()
|
public async Task TestSimpleStream()
|
||||||
{
|
{
|
||||||
|
@ -374,5 +374,44 @@ namespace Encrypter
|
|||||||
// Encrypt the data with the new settings:
|
// Encrypt the data with the new settings:
|
||||||
return await CryptoProcessor.Encrypt(decryptedData, newPassword, iterations);
|
return await CryptoProcessor.Encrypt(decryptedData, newPassword, iterations);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Changes the password of the encryption. In order to re-encrypt the stream, a temporary file
|
||||||
|
/// gets used. When the returned task is finished, the re-encryption is done as well.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="encryptedInput">With the previous password encrypted data.</param>
|
||||||
|
/// <param name="reEncryptedOutput">The re-encrypted data.</param>
|
||||||
|
/// <param name="previousPassword">The previous password.</param>
|
||||||
|
/// <param name="newPassword">The new password.</param>
|
||||||
|
/// <param name="iterations">The used iterations.</param>
|
||||||
|
public static async Task ChangePassword(Stream encryptedInput, Stream reEncryptedOutput, string previousPassword, string newPassword, int iterations = ITERATIONS_YEAR_2020)
|
||||||
|
{
|
||||||
|
var tempFileCache = Path.GetTempFileName();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await using (var tempCacheStream = File.OpenWrite(tempFileCache))
|
||||||
|
{
|
||||||
|
// Decrypt the data with the previous settings:
|
||||||
|
await Decrypt(encryptedInput, tempCacheStream, previousPassword, iterations);
|
||||||
|
}
|
||||||
|
|
||||||
|
await using (var tempCacheStream = File.OpenRead(tempFileCache))
|
||||||
|
{
|
||||||
|
// Encrypt the data with the new settings:
|
||||||
|
await Encrypt(tempCacheStream, reEncryptedOutput, newPassword, iterations);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File.Delete(tempFileCache);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -96,6 +96,17 @@
|
|||||||
<param name="iterations">The used iterations.</param>
|
<param name="iterations">The used iterations.</param>
|
||||||
<returns>The re-encrypted data.</returns>
|
<returns>The re-encrypted data.</returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:Encrypter.CryptoProcessor.ChangePassword(System.IO.Stream,System.IO.Stream,System.String,System.String,System.Int32)">
|
||||||
|
<summary>
|
||||||
|
Changes the password of the encryption. In order to re-encrypt the stream, a temporary file
|
||||||
|
gets used. When the returned task is finished, the re-encryption is done as well.
|
||||||
|
</summary>
|
||||||
|
<param name="encryptedInput">With the previous password encrypted data.</param>
|
||||||
|
<param name="reEncryptedOutput">The re-encrypted data.</param>
|
||||||
|
<param name="previousPassword">The previous password.</param>
|
||||||
|
<param name="newPassword">The new password.</param>
|
||||||
|
<param name="iterations">The used iterations.</param>
|
||||||
|
</member>
|
||||||
<member name="M:Encrypter.Extensions.Encrypt(System.String,System.String,System.Int32)">
|
<member name="M:Encrypter.Extensions.Encrypt(System.String,System.String,System.Int32)">
|
||||||
<summary>
|
<summary>
|
||||||
Encrypts this string by means of AES. The result gets base64 encoded.
|
Encrypts this string by means of AES. The result gets base64 encoded.
|
||||||
|
Loading…
Reference in New Issue
Block a user