2019-07-25 16:39:43 +02:00
|
|
|
|
using System.Text;
|
|
|
|
|
using ModernKeePassLib.Cryptography;
|
|
|
|
|
using ModernKeePassLib.Security;
|
|
|
|
|
using ModernKeePassLib.Utility;
|
2019-07-29 17:30:15 +02:00
|
|
|
|
using NUnit.Framework;
|
2019-07-25 16:39:43 +02:00
|
|
|
|
|
|
|
|
|
namespace ModernKeePassLib.Test.Security
|
|
|
|
|
{
|
2019-07-29 17:30:15 +02:00
|
|
|
|
[TestFixture]
|
2019-07-25 16:39:43 +02:00
|
|
|
|
public class ProtectedObjectsTests
|
|
|
|
|
{
|
|
|
|
|
private readonly Encoding _enc = StrUtil.Utf8;
|
|
|
|
|
|
2019-07-29 17:30:15 +02:00
|
|
|
|
[Test]
|
2019-07-25 16:39:43 +02:00
|
|
|
|
public void TestAreBinaryObjectsProtected()
|
|
|
|
|
{
|
|
|
|
|
var pbData = _enc.GetBytes("Test Test Test Test");
|
|
|
|
|
var pb = new ProtectedBinary(true, pbData);
|
2019-07-29 17:30:15 +02:00
|
|
|
|
Assert.That(pb.IsProtected, Is.True);
|
2019-07-25 16:39:43 +02:00
|
|
|
|
|
|
|
|
|
var pbDec = pb.ReadData();
|
2019-07-29 17:30:15 +02:00
|
|
|
|
Assert.That(MemUtil.ArraysEqual(pbData, pbDec), Is.True);
|
|
|
|
|
Assert.That(pb.IsProtected, Is.True);
|
2019-07-25 16:39:43 +02:00
|
|
|
|
|
|
|
|
|
var pbData2 = _enc.GetBytes("Test Test Test Test");
|
|
|
|
|
var pbData3 = _enc.GetBytes("Test Test Test Test Test");
|
|
|
|
|
var pb2 = new ProtectedBinary(true, pbData2);
|
|
|
|
|
var pb3 = new ProtectedBinary(true, pbData3);
|
2019-07-29 17:30:15 +02:00
|
|
|
|
Assert.That(pb.Equals(pb2), Is.True);
|
|
|
|
|
Assert.That(pb.Equals(pb3), Is.False);
|
|
|
|
|
Assert.That(pb2.Equals(pb3), Is.False);
|
|
|
|
|
|
|
|
|
|
Assert.That(pb.GetHashCode(), Is.EqualTo(pb2.GetHashCode()));
|
|
|
|
|
Assert.That(pb.Equals((object) pb2), Is.True);
|
|
|
|
|
Assert.That(pb.Equals((object) pb3), Is.False);
|
|
|
|
|
Assert.That(pb2.Equals((object) pb3), Is.False);
|
2019-07-25 16:39:43 +02:00
|
|
|
|
}
|
|
|
|
|
|
2019-07-29 17:30:15 +02:00
|
|
|
|
[Test]
|
2019-07-25 16:39:43 +02:00
|
|
|
|
public void TestIsEmptyProtectedStringEmpty()
|
|
|
|
|
{
|
|
|
|
|
var ps = new ProtectedString();
|
2019-07-29 17:30:15 +02:00
|
|
|
|
Assert.That(ps.Length, Is.EqualTo(0));
|
|
|
|
|
Assert.That(ps.IsEmpty, Is.True);
|
|
|
|
|
Assert.That(ps.ReadString().Length, Is.EqualTo(0));
|
2019-07-25 16:39:43 +02:00
|
|
|
|
}
|
|
|
|
|
|
2019-07-29 17:30:15 +02:00
|
|
|
|
[Test]
|
2019-07-25 16:39:43 +02:00
|
|
|
|
public void TestAreEqualStringsProtected()
|
|
|
|
|
{
|
|
|
|
|
var ps = new ProtectedString(true, "Test");
|
|
|
|
|
var ps2 = new ProtectedString(true, _enc.GetBytes("Test"));
|
2019-07-29 17:30:15 +02:00
|
|
|
|
Assert.That(ps.IsEmpty, Is.False);
|
2019-07-25 16:39:43 +02:00
|
|
|
|
var pbData = ps.ReadUtf8();
|
|
|
|
|
var pbData2 = ps2.ReadUtf8();
|
2019-07-29 17:30:15 +02:00
|
|
|
|
Assert.That(MemUtil.ArraysEqual(pbData, pbData2), Is.True);
|
|
|
|
|
Assert.That(pbData.Length, Is.EqualTo(4));
|
|
|
|
|
Assert.That(ps.ReadString(), Is.EqualTo(ps2.ReadString()));
|
2019-07-25 16:39:43 +02:00
|
|
|
|
pbData = ps.ReadUtf8();
|
|
|
|
|
pbData2 = ps2.ReadUtf8();
|
2019-07-29 17:30:15 +02:00
|
|
|
|
Assert.That(MemUtil.ArraysEqual(pbData, pbData2), Is.True);
|
|
|
|
|
Assert.That(ps.IsProtected, Is.True);
|
|
|
|
|
Assert.That(ps2.IsProtected, Is.True);
|
2019-07-25 16:39:43 +02:00
|
|
|
|
}
|
|
|
|
|
|
2019-07-29 17:30:15 +02:00
|
|
|
|
[Test]
|
2019-07-25 16:39:43 +02:00
|
|
|
|
public void TestIsRandomStringProtected()
|
|
|
|
|
{
|
|
|
|
|
var r = CryptoRandom.NewWeakRandom();
|
|
|
|
|
var str = string.Empty;
|
|
|
|
|
var ps = new ProtectedString();
|
|
|
|
|
for (var i = 0; i < 100; ++i)
|
|
|
|
|
{
|
|
|
|
|
var bProt = ((r.Next() % 4) != 0);
|
|
|
|
|
ps = ps.WithProtection(bProt);
|
|
|
|
|
|
|
|
|
|
var x = r.Next(str.Length + 1);
|
|
|
|
|
var c = r.Next(20);
|
|
|
|
|
var ch = (char) r.Next(1, 256);
|
|
|
|
|
|
|
|
|
|
var strIns = new string(ch, c);
|
|
|
|
|
str = str.Insert(x, strIns);
|
|
|
|
|
ps = ps.Insert(x, strIns);
|
|
|
|
|
|
2019-07-29 17:30:15 +02:00
|
|
|
|
Assert.That(ps.IsProtected, Is.EqualTo(bProt));
|
|
|
|
|
Assert.That(ps.ReadString(), Is.EqualTo(str));
|
2019-07-25 16:39:43 +02:00
|
|
|
|
|
|
|
|
|
ps = ps.WithProtection(bProt);
|
|
|
|
|
|
|
|
|
|
x = r.Next(str.Length);
|
|
|
|
|
c = r.Next(str.Length - x + 1);
|
|
|
|
|
|
|
|
|
|
str = str.Remove(x, c);
|
|
|
|
|
ps = ps.Remove(x, c);
|
|
|
|
|
|
2019-07-29 17:30:15 +02:00
|
|
|
|
Assert.That(ps.IsProtected, Is.EqualTo(bProt));
|
|
|
|
|
Assert.That(ps.ReadString(), Is.EqualTo(str));
|
2019-07-25 16:39:43 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-29 17:30:15 +02:00
|
|
|
|
[Test]
|
2019-07-25 16:39:43 +02:00
|
|
|
|
public void TestAreConcatenatedStringsProtected()
|
|
|
|
|
{
|
|
|
|
|
var ps = new ProtectedString(false, "ABCD");
|
|
|
|
|
var ps2 = new ProtectedString(true, "EFG");
|
|
|
|
|
ps += (ps2 + "HI");
|
2019-07-29 17:30:15 +02:00
|
|
|
|
Assert.That(ps.Equals(new ProtectedString(true, "ABCDEFGHI"), true), Is.True);
|
|
|
|
|
Assert.That(ps.Equals(new ProtectedString(false, "ABCDEFGHI"), false), Is.True);
|
2019-07-25 16:39:43 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|