Skip to content

Commit

Permalink
Merge pull request #215 from aegoroff:develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
aegoroff authored Nov 29, 2024
2 parents 7c6ce0a + 0af3a34 commit 4e5fb63
Show file tree
Hide file tree
Showing 16 changed files with 1,578 additions and 1,597 deletions.
691 changes: 343 additions & 348 deletions src/_tst.net/CmdFileTests.cs

Large diffs are not rendered by default.

308 changes: 151 additions & 157 deletions src/_tst.net/CmdStringTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,165 +9,159 @@
using FluentAssertions;
using Xunit;

namespace _tst.net
{
[Trait("Mode", "cmd")]
public abstract class CmdStringTests<T> : StringTests<T>
namespace _tst.net;

[Trait("Mode", "cmd")]
public abstract class CmdStringTests<T>() : StringTests<T>(new T())
where T : Architecture, new()
{
private const string SourceOpt = "-s";
private const string Base64Opt = "-b";
private const string LowCaseOpt = "-l";
private const string NoProbeOpt = "--noprobe";
private const string MaxOpt = "-x";
private const string MinOpt = "-n";
private const string DictOpt = "-a";
private const string PerfOpt = "-p";
private const string EmptyStr = "\"\"";
private const string StringCmd = "string";
private const string HashCmd = "hash";

protected override IList<string> RunEmptyStringCrack(Hash h) =>
this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.EmptyStringHash);

protected override IList<string> RunStringCrack(Hash h) =>
this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.HashString, MaxOpt, "3");

protected override IList<string> RunStringCrackTooShort(Hash h) =>
this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.HashString, MaxOpt,
(h.InitialString.Length - 1).ToString(), DictOpt, h.InitialString);

protected override IList<string> RunStringCrackTooMinLength(Hash h) =>
this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.HashString, MinOpt,
(h.InitialString.Length + 1).ToString(), MaxOpt,
(h.InitialString.Length + 2).ToString(), DictOpt, h.InitialString);

protected override IList<string> RunStringCrackLowCaseHash(Hash h) =>
this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.HashString.ToLowerInvariant(), MaxOpt, "3", DictOpt,
h.InitialString);

protected override IList<string> RunStringHash(Hash h) => this.Runner.Run(h.Algorithm, StringCmd, SourceOpt, h.InitialString);

protected override IList<string> RunStringHashLowCase(Hash h) =>
this.Runner.Run(h.Algorithm, StringCmd, SourceOpt, h.InitialString, LowCaseOpt);

protected override IList<string> RunEmptyStringHash(Hash h) => this.Runner.Run(h.Algorithm, StringCmd, SourceOpt, EmptyStr);

protected override IList<string> RunStringHashAsBase64(Hash h) =>
this.Runner.Run(h.Algorithm, StringCmd, Base64Opt, SourceOpt, h.InitialString);

protected override IList<string> RunCrackStringUsingNonDefaultDictionary(Hash h, string dict) =>
this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.StartPartStringHash, DictOpt, dict, MaxOpt, "2", MinOpt,
"2");

[Trait("Type", "crack")]
[Theory, MemberData(nameof(Hashes))]
public void CrackString_Base64_Success(Hash h)
{
private const string SourceOpt = "-s";
private const string Base64Opt = "-b";
private const string LowCaseOpt = "-l";
private const string NoProbeOpt = "--noprobe";
private const string MaxOpt = "-x";
private const string MinOpt = "-n";
private const string DictOpt = "-a";
private const string PerfOpt = "-p";
private const string EmptyStr = "\"\"";
private const string StringCmd = "string";
private const string HashCmd = "hash";


protected CmdStringTests() : base(new T())
{
}

protected override IList<string> RunEmptyStringCrack(Hash h) =>
this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.EmptyStringHash);

protected override IList<string> RunStringCrack(Hash h) =>
this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.HashString, MaxOpt, "3");

protected override IList<string> RunStringCrackTooShort(Hash h) =>
this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.HashString, MaxOpt,
(h.InitialString.Length - 1).ToString(), DictOpt, h.InitialString);

protected override IList<string> RunStringCrackTooMinLength(Hash h) =>
this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.HashString, MinOpt,
(h.InitialString.Length + 1).ToString(), MaxOpt,
(h.InitialString.Length + 2).ToString(), DictOpt, h.InitialString);

protected override IList<string> RunStringCrackLowCaseHash(Hash h) =>
this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.HashString.ToLowerInvariant(), MaxOpt, "3", DictOpt,
h.InitialString);

protected override IList<string> RunStringHash(Hash h) => this.Runner.Run(h.Algorithm, StringCmd, SourceOpt, h.InitialString);

protected override IList<string> RunStringHashLowCase(Hash h) =>
this.Runner.Run(h.Algorithm, StringCmd, SourceOpt, h.InitialString, LowCaseOpt);

protected override IList<string> RunEmptyStringHash(Hash h) => this.Runner.Run(h.Algorithm, StringCmd, SourceOpt, EmptyStr);

protected override IList<string> RunStringHashAsBase64(Hash h) =>
this.Runner.Run(h.Algorithm, StringCmd, Base64Opt, SourceOpt, h.InitialString);

protected override IList<string> RunCrackStringUsingNonDefaultDictionary(Hash h, string dict) =>
this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.StartPartStringHash, DictOpt, dict, MaxOpt, "2", MinOpt,
"2");

[Trait("Type", "crack")]
[Theory, MemberData(nameof(Hashes))]
public void CrackString_Base64_Success(Hash h)
{
// Arrange
var bytes = Convert.FromHexString(h.HashString);
var base64 = Convert.ToBase64String(bytes);
// Arrange
var bytes = Convert.FromHexString(h.HashString);
var base64 = Convert.ToBase64String(bytes);

// Act
var results = this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, "-b", SourceOpt, base64, MaxOpt, "3");

// Assert
results[1].Should().Be(string.Format(RestoredStringTemplate, h.InitialString), $"Because {base64} must be restored to {h.InitialString}");
results.Should().HaveCount(2);
}

[Trait("Type", "crack")]
[Theory, MemberData(nameof(Hashes))]
public void CrackString_SingleThread_Success(Hash h)
{
// Act
var results = this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.HashString, MaxOpt, "3", "-T", "1");

// Assert
results[1].Should().Be(string.Format(RestoredStringTemplate, h.InitialString));
results.Should().HaveCount(2);
}

[Trait("Type", "crack")]
[Theory, MemberData(nameof(HashesAndBadThreads))]
public void CrackString_BadThreadCountNumber_Success(Hash h, string threads)
{
// Act
var results = this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.HashString, MaxOpt, "3", "-T", threads);

// Assert
results[2].Should().Be(string.Format(RestoredStringTemplate, h.InitialString));
results.Should().HaveCount(3);
}

public static IEnumerable<object[]> HashesAndBadThreads => CreateProperty(new object[] {"-1", "10000"});

[Trait("Type", "crack")]
[Theory, MemberData(nameof(Hashes))]
public void CrackString_SingleCharStringWithMaxOpt_Success(Hash h)
{
// Act
var results = this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.MiddlePartStringHash, MaxOpt, "2");

// Assert
results[1].Should().Be(string.Format(RestoredStringTemplate, "2"));
results.Should().HaveCount(2);
}

[Trait("Type", "crack")]
[Theory, MemberData(nameof(Hashes))]
public void CrackString_SingleCharStringWithMaxOptOnSingleThread_Success(Hash h)
{
// Act
var results = this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.MiddlePartStringHash, MaxOpt, "2", "-T", "1");

// Assert
Assert.Equal(string.Format(RestoredStringTemplate, "2"), results[1]);
results.Should().HaveCount(2);
}

[Trait("Type", "crack")]
[Theory, MemberData(nameof(Hashes))]
public void CrackString_SingleCharStringWithMaxOptAndNonDefaultDict_Success(Hash h)
{
// Act
var results = this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.MiddlePartStringHash, MaxOpt, "2", DictOpt, "[0-9]");

// Assert
Assert.Equal(string.Format(RestoredStringTemplate, "2"), results[1]);
results.Should().HaveCount(2);
}

[Trait("Type", "crack")]
[Theory, MemberData(nameof(Hashes))]
public void CrackString_TestPerformance_Success(Hash h)
{
// Act
var results = this.Runner.Run(h.Algorithm, HashCmd, PerfOpt, DictOpt, "12345", MaxOpt, "5", MinOpt, "5");

// Assert
Assert.Equal(string.Format(RestoredStringTemplate, "12345"), results[2]);
results.Should().HaveCount(3);
}

[Trait("Type", "crack")]
[Fact]
public void CrackString_NonAscii_Success()
{
// Arrange
Hash h = new Md5();

// Act
var results = this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, "327108899019B3BCFFF1683FBFDAF226", DictOpt, "еграб", MinOpt, "6", MaxOpt, "6");

// Assert
results.Should().HaveCount(2);
results[1].Should().MatchRegex("Initial string is: *");
}
// Act
var results = this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, "-b", SourceOpt, base64, MaxOpt, "3");

// Assert
results[1].Should().Be(string.Format(RestoredStringTemplate, h.InitialString), $"Because {base64} must be restored to {h.InitialString}");
results.Should().HaveCount(2);
}

[Trait("Type", "crack")]
[Theory, MemberData(nameof(Hashes))]
public void CrackString_SingleThread_Success(Hash h)
{
// Act
var results = this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.HashString, MaxOpt, "3", "-T", "1");

// Assert
results[1].Should().Be(string.Format(RestoredStringTemplate, h.InitialString));
results.Should().HaveCount(2);
}

[Trait("Type", "crack")]
[Theory, MemberData(nameof(HashesAndBadThreads))]
public void CrackString_BadThreadCountNumber_Success(Hash h, string threads)
{
// Act
var results = this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.HashString, MaxOpt, "3", "-T", threads);

// Assert
results[2].Should().Be(string.Format(RestoredStringTemplate, h.InitialString));
results.Should().HaveCount(3);
}

public static IEnumerable<object[]> HashesAndBadThreads => CreateProperty(["-1", "10000"]);

[Trait("Type", "crack")]
[Theory, MemberData(nameof(Hashes))]
public void CrackString_SingleCharStringWithMaxOpt_Success(Hash h)
{
// Act
var results = this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.MiddlePartStringHash, MaxOpt, "2");

// Assert
results[1].Should().Be(string.Format(RestoredStringTemplate, "2"));
results.Should().HaveCount(2);
}

[Trait("Type", "crack")]
[Theory, MemberData(nameof(Hashes))]
public void CrackString_SingleCharStringWithMaxOptOnSingleThread_Success(Hash h)
{
// Act
var results = this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.MiddlePartStringHash, MaxOpt, "2", "-T", "1");

// Assert
Assert.Equal(string.Format(RestoredStringTemplate, "2"), results[1]);
results.Should().HaveCount(2);
}

[Trait("Type", "crack")]
[Theory, MemberData(nameof(Hashes))]
public void CrackString_SingleCharStringWithMaxOptAndNonDefaultDict_Success(Hash h)
{
// Act
var results = this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, h.MiddlePartStringHash, MaxOpt, "2", DictOpt, "[0-9]");

// Assert
Assert.Equal(string.Format(RestoredStringTemplate, "2"), results[1]);
results.Should().HaveCount(2);
}

[Trait("Type", "crack")]
[Theory, MemberData(nameof(Hashes))]
public void CrackString_TestPerformance_Success(Hash h)
{
// Act
var results = this.Runner.Run(h.Algorithm, HashCmd, PerfOpt, DictOpt, "12345", MaxOpt, "5", MinOpt, "5");

// Assert
Assert.Equal(string.Format(RestoredStringTemplate, "12345"), results[2]);
results.Should().HaveCount(3);
}

[Trait("Type", "crack")]
[Fact]
public void CrackString_NonAscii_Success()
{
// Arrange
Hash h = new Md5();

// Act
var results = this.Runner.Run(h.Algorithm, HashCmd, NoProbeOpt, SourceOpt, "327108899019B3BCFFF1683FBFDAF226", DictOpt, "еграб", MinOpt, "6", MaxOpt, "6");

// Assert
results.Should().HaveCount(2);
results[1].Should().MatchRegex("Initial string is: *");
}
}
51 changes: 25 additions & 26 deletions src/_tst.net/ExeWrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,49 +8,48 @@
using System.IO;
using Xunit;

namespace _tst.net
{
public abstract class ExeWrapper<T> : IClassFixture<T>
namespace _tst.net;

public abstract class ExeWrapper<T> : IClassFixture<T>
where T : Architecture, new()
{
protected string Arch { get; }
{
protected string Arch { get; }

protected ProcessRunner Runner { get; }
protected ProcessRunner Runner { get; }

protected abstract string Executable { get; }
protected abstract string Executable { get; }

protected ExeWrapper(T data)
{
this.Arch = data.Arch;
this.Runner = new ProcessRunner(Path.Combine(data.ExecutableBasePath, this.Executable));
}
protected ExeWrapper(T data)
{
this.Arch = data.Arch;
this.Runner = new ProcessRunner(Path.Combine(data.ExecutableBasePath, this.Executable));
}
}

public abstract class Architecture
{
public string ExecutableBasePath => Path.Combine(BasePath, RelativeCommonPath, this.RelativePath);
public abstract class Architecture
{
public string ExecutableBasePath => Path.Combine(BasePath, RelativeCommonPath, this.RelativePath);

private static string BasePath => Environment.GetEnvironmentVariable("PROJECT_BASE_PATH") ?? Environment.CurrentDirectory;
private static string BasePath => Environment.GetEnvironmentVariable("PROJECT_BASE_PATH") ?? Environment.CurrentDirectory;

protected abstract string RelativePath { get; }
protected abstract string RelativePath { get; }

private static string RelativeCommonPath => Environment.GetEnvironmentVariable("PROJECT_BASE_PATH") == null ? Path.Combine("..", "..", "..") : string.Empty;
private static string RelativeCommonPath => Environment.GetEnvironmentVariable("PROJECT_BASE_PATH") == null ? Path.Combine("..", "..", "..") : string.Empty;

public abstract string Arch { get; }
public abstract string Arch { get; }

#if DEBUG

internal const string Configuration = "Debug";
internal const string Configuration = "Debug";

#else
internal const string Configuration = "Release";
#endif
}
}

public class ArchWin64 : Architecture
{
protected override string RelativePath => Path.Combine("x64", Configuration);
public class ArchWin64 : Architecture
{
protected override string RelativePath => Path.Combine("x64", Configuration);

public override string Arch => "x64";
}
public override string Arch => "x64";
}
Loading

0 comments on commit 4e5fb63

Please sign in to comment.