public void AccountsForTurnPositionsDirectionsAndStartingKey() { var match = new SpatialMatch { Token = "zxcvbn", Graph = "qwerty", Turns = 3, ShiftedCount = 0, i = 1, j = 2, }; var l = match.Token.Length; var s = SpatialGuessesCalculator.KeyboardStartingPositions; var d = SpatialGuessesCalculator.KeyboardAverageDegree; var expected = 0.0; for (var i = 2; i <= l; i++) { for (var j = 1; j <= Math.Min(match.Turns, i - 1); j++) { expected += PasswordScoring.Binomial(i - 1, j - 1) * s * Math.Pow(d, j); } } var actual = SpatialGuessesCalculator.CalculateGuesses(match); actual.Should().Be(expected); }
/// <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 GuessesWhenThereAreNoTurns() { var match = new SpatialMatch { Token = "zxcvbn", Graph = "qwerty", Turns = 1, ShiftedCount = 0, i = 1, j = 2, }; var expected = SpatialGuessesCalculator.KeyboardStartingPositions * SpatialGuessesCalculator.KeyboardAverageDegree * (match.Token.Length - 1); var actual = SpatialGuessesCalculator.CalculateGuesses(match); actual.Should().Be(expected); }
public void DoublesGuessesIfEverythingIsShifted() { var match = new SpatialMatch { Token = "zxcvbn", Graph = "qwerty", Turns = 1, ShiftedCount = 6, i = 1, j = 2, }; var expected = SpatialGuessesCalculator.KeyboardStartingPositions * SpatialGuessesCalculator.KeyboardAverageDegree * (match.Token.Length - 1) * 2; var actual = SpatialGuessesCalculator.CalculateGuesses(match); actual.Should().Be(expected); }