Files
Common-VS2019/SacsCoreUnitTests/Standard/Base/Data/SacsAesIvCrypter_Tester.cs
T

93 lines
2.8 KiB
C#

using System;
using System.Text;
using System.Collections.Generic;
using NUnit.Framework;
using System.Linq;
using Sarand.Net.Standard.Base.Data;
namespace Sacs.UnitTests.Net.Standard.Base.Data
{
[TestFixture]
public class SacsAesIvCrypter_Tester
{
// --- Data Members ---
private static readonly Random random = new Random(11437);
// --- Tests ---
[Test]
public void EncryptDecrypt_RoundTripsRandomText()
{
for (int i = 0; i < 200; i++)
{
String data = RandomString(random.Next(10, 2048), true);
String key = RandomString(random.Next(10, 128), true);
String encrypted = SacsAesIvCrypter.Encrypt(data, key);
Assert.That(SacsAesIvCrypter.Decrypt(encrypted, key), Is.EqualTo(data));
}
}
[Test]
public void Decrypt_ReadsLegacyCiphertext()
{
const String encrypted = "0qlOvuM3L9+yzc6XnuHSv2Jq/1v1pyPq6CaCYnMauW6n+bBc9YOBNPtaNFm+2JGz;zgCog0OpwdN+I8yK5UAU8g==";
const String key = "Compatibility-Key-2026!";
String decrypted = SacsAesIvCrypter.Decrypt(encrypted, key);
Assert.That(decrypted, Is.EqualTo("Legacy compatibility payload £ € 漢字"));
}
[Test]
public void Decrypt_ReturnsUnencryptedTextUnchanged()
{
const String value = "A value without an appended IV";
String decrypted = SacsAesIvCrypter.Decrypt(value, "unused-key");
Assert.That(decrypted, Is.SameAs(value));
}
[Test]
public void Encrypt_UsesUniqueInitializationVectors()
{
const String value = "Repeated value";
const String key = "Repeated-key";
String first = SacsAesIvCrypter.Encrypt(value, key);
String second = SacsAesIvCrypter.Encrypt(value, key);
Assert.That(first, Is.Not.EqualTo(second));
Assert.That(SacsAesIvCrypter.Decrypt(first, key), Is.EqualTo(value));
Assert.That(SacsAesIvCrypter.Decrypt(second, key), Is.EqualTo(value));
}
[Test]
public void Encrypt_ProducesKnownCiphertextForExplicitKeyAndIv()
{
Byte[] key = Enumerable.Range(0, 32).Select(value => (Byte)value).ToArray();
Byte[] iv = Enumerable.Range(16, 16).Select(value => (Byte)value).ToArray();
Byte[] encrypted = SacsAesIvCrypter.Encrypt("Known vector £ 漢字", key, iv);
Assert.That(Convert.ToBase64String(encrypted), Is.EqualTo("9yYFmwEr9e00Z3WMjGRWfkgT/XwV8OJ4Encs4x9HiVo="));
Assert.That(SacsAesIvCrypter.Decrypt(encrypted, key, iv), Is.EqualTo("Known vector £ 漢字"));
}
// --- Utilities ---
/// <summary>Generate random alphanumeric string</summary>
private static String RandomString(int length, bool includeLowerCase = true, bool includeSymbols = true)
{
String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
if (includeLowerCase) chars += "abcdefghijklmnopqrstuvwxyz";
if (includeSymbols) chars += "`¬!\"£$%^&*()-=_+{}[];:'@#~<>?/.,\\| ";
return new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray());
}
// --- The End ---
}
}