// ReSharper disable once InconsistentNaming private static void CalulateL33tEntropy(L33tDictionaryMatch match) { // I'm a bit dubious about this function, but I have duplicated zxcvbn functionality regardless var possibilities = 0; foreach (var kvp in match.Subs) { var subbedChars = match.Token.Count(c => c == kvp.Key); var unsubbedChars = match.Token.Count(c => c == kvp.Value); // Won't this always be zero? possibilities += Enumerable.Range(0, Math.Min(subbedChars, unsubbedChars) + 1).Sum(i => (int)PasswordScoring.Binomial(subbedChars + unsubbedChars, i)); } var entropy = Math.Log(possibilities, 2); // In the case of only a single subsitution (e.g. 4pple) this would otherwise come out as zero, so give it one bit match.L33tEntropy = (entropy < 1 ? 1 : entropy); match.Entropy += match.L33tEntropy; // We have to recalculate the uppercase entropy -- the password matcher will have used the subbed password not the original text match.Entropy -= match.UppercaseEntropy; match.UppercaseEntropy = PasswordScoring.CalculateUppercaseEntropy(match.Token); match.Entropy += match.UppercaseEntropy; }
private void CalulateL33tEntropy(L33tDictionaryMatch match) { // I'm a bit dubious about this function, but I have duplicated zxcvbn functionality regardless var possibilities = 0; foreach (var kvp in match.Subs) { var subbedChars = match.Token.Where(c => c == kvp.Key).Count(); var unsubbedChars = match.Token.Where(c => c == kvp.Value).Count(); // Won't this always be zero? possibilities += Enumerable.Range(0, Math.Min(subbedChars, unsubbedChars) + 1).Sum(i => (int)PasswordScoring.Binomial(subbedChars + unsubbedChars, i)); } var entropy = Math.Log(possibilities, 2); // In the case of only a single subsitution (e.g. 4pple) this would otherwise come out as zero, so give it one bit match.L33tEntropy = (entropy < 1 ? 1 : entropy); match.Entropy += match.L33tEntropy; // We have to recalculate the uppercase entropy -- the password matcher will have used the subbed password not the original text match.Entropy -= match.UppercaseEntropy; match.UppercaseEntropy = PasswordScoring.CalculateUppercaseEntropy(match.Token); match.Entropy += match.UppercaseEntropy; }