/// <summary> /// Estimates the attempts required to guess the password. /// </summary> /// <param name="match">The match.</param> /// <param name="password">The actual password.</param> /// <returns>The guesses estimate.</returns> public static double EstimateGuesses(Match match, string password) { if (match.Guesses != 0) { return(match.Guesses); } var minGuesses = 1.0; if (match.Token.Length < password.Length) { minGuesses = match.Token.Length == 1 ? BruteForceGuessesCalculator.MinSubmatchGuessesSingleCharacter : BruteForceGuessesCalculator.MinSubmatchGuessesMultiCharacter; } var guesses = 0.0; switch (match.Pattern) { case "bruteforce": guesses = BruteForceGuessesCalculator.CalculateGuesses(match as BruteForceMatch); break; case "date": guesses = DateGuessesCalculator.CalculateGuesses(match as DateMatch); break; case "dictionary": guesses = DictionaryGuessesCalculator.CalculateGuesses(match as DictionaryMatch); break; case "regex": guesses = RegexGuessesCalculator.CalculateGuesses(match as RegexMatch); break; case "repeat": guesses = RepeatGuessesCalculator.CalculateGuesses(match as RepeatMatch); break; case "sequence": guesses = SequenceGuessesCalculator.CalculateGuesses(match as SequenceMatch); break; case "spatial": guesses = SpatialGuessesCalculator.CalculateGuesses(match as SpatialMatch); break; } match.Guesses = Math.Max(guesses, minGuesses); return(match.Guesses); }
public void IsDelegatedToByEstimateGuesses() { var match = new RepeatMatch { Token = "aa", BaseToken = "a", BaseGuesses = PasswordScoring.MostGuessableMatchSequence("a", Core.GetAllMatches("a")).Guesses, BaseMatchItems = new List <Match>(), RepeatCount = 2, i = 1, j = 2, }; var expected = RepeatGuessesCalculator.CalculateGuesses(match); var actual = PasswordScoring.EstimateGuesses(match, "aa"); actual.Should().Be(expected); }
public void CalculatesTheRightNumberOfGuesses(string token, string baseToken, int expectedRepeats) { var baseGuesses = PasswordScoring.MostGuessableMatchSequence(baseToken, Core.GetAllMatches(baseToken)).Guesses; var match = new RepeatMatch { Token = token, BaseToken = baseToken, BaseGuesses = baseGuesses, RepeatCount = expectedRepeats, BaseMatchItems = new List <Match>(), i = 1, j = 2, }; var expected = baseGuesses * expectedRepeats; var actual = RepeatGuessesCalculator.CalculateGuesses(match); actual.Should().Be(expected); }