coffeenode-zxcvbn
Version:
realistic password strength estimation
1,084 lines (1,024 loc) • 977 kB
JavaScript
(function () { // Generated by CoffeeScript 1.6.3
var SEQUENCES, build_dict_matcher, build_ranked_dict, check_date, date_match, date_rx_year_prefix, date_rx_year_suffix, date_sep_match, date_without_sep_match, dictionary_match, digits_match, digits_rx, empty, enumerate_l33t_subs, extend, findall, l33t_match, l33t_table, omnimatch, relevent_l33t_subtable, repeat, repeat_match, sequence_match, spatial_match, spatial_match_helper, translate, year_match, year_rx;
empty = function(obj) {
var k;
return ((function() {
var _results;
_results = [];
for (k in obj) {
_results.push(k);
}
return _results;
})()).length === 0;
};
extend = function(lst, lst2) {
return lst.push.apply(lst, lst2);
};
translate = function(string, chr_map) {
var chr;
return ((function() {
var _i, _len, _ref, _results;
_ref = string.split('');
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
chr = _ref[_i];
_results.push(chr_map[chr] || chr);
}
return _results;
})()).join('');
};
omnimatch = function(password) {
var matcher, matches, _i, _len;
matches = [];
for (_i = 0, _len = MATCHERS.length; _i < _len; _i++) {
matcher = MATCHERS[_i];
extend(matches, matcher(password));
}
return matches.sort(function(match1, match2) {
return (match1.i - match2.i) || (match1.j - match2.j);
});
};
dictionary_match = function(password, ranked_dict) {
var i, j, len, password_lower, rank, result, word, _i, _j;
result = [];
len = password.length;
password_lower = password.toLowerCase();
for (i = _i = 0; 0 <= len ? _i < len : _i > len; i = 0 <= len ? ++_i : --_i) {
for (j = _j = i; i <= len ? _j < len : _j > len; j = i <= len ? ++_j : --_j) {
if (password_lower.slice(i, +j + 1 || 9e9) in ranked_dict) {
word = password_lower.slice(i, +j + 1 || 9e9);
rank = ranked_dict[word];
result.push({
pattern: 'dictionary',
i: i,
j: j,
token: password.slice(i, +j + 1 || 9e9),
matched_word: word,
rank: rank
});
}
}
}
return result;
};
build_ranked_dict = function(unranked_list) {
var i, result, word, _i, _len;
result = {};
i = 1;
for (_i = 0, _len = unranked_list.length; _i < _len; _i++) {
word = unranked_list[_i];
result[word] = i;
i += 1;
}
return result;
};
build_dict_matcher = function(dict_name, ranked_dict) {
return function(password) {
var match, matches, _i, _len;
matches = dictionary_match(password, ranked_dict);
for (_i = 0, _len = matches.length; _i < _len; _i++) {
match = matches[_i];
match.dictionary_name = dict_name;
}
return matches;
};
};
l33t_table = {
a: ['4', '@'],
b: ['8'],
c: ['(', '{', '[', '<'],
e: ['3'],
g: ['6', '9'],
i: ['1', '!', '|'],
l: ['1', '|', '7'],
o: ['0'],
s: ['$', '5'],
t: ['+', '7'],
x: ['%'],
z: ['2']
};
relevent_l33t_subtable = function(password) {
var chr, filtered, letter, password_chars, relevent_subs, sub, subs, _i, _len, _ref;
password_chars = {};
_ref = password.split('');
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
chr = _ref[_i];
password_chars[chr] = true;
}
filtered = {};
for (letter in l33t_table) {
subs = l33t_table[letter];
relevent_subs = (function() {
var _j, _len1, _results;
_results = [];
for (_j = 0, _len1 = subs.length; _j < _len1; _j++) {
sub = subs[_j];
if (sub in password_chars) {
_results.push(sub);
}
}
return _results;
})();
if (relevent_subs.length > 0) {
filtered[letter] = relevent_subs;
}
}
return filtered;
};
enumerate_l33t_subs = function(table) {
var chr, dedup, helper, k, keys, l33t_chr, sub, sub_dict, sub_dicts, subs, _i, _j, _len, _len1, _ref;
keys = (function() {
var _results;
_results = [];
for (k in table) {
_results.push(k);
}
return _results;
})();
subs = [[]];
dedup = function(subs) {
var assoc, deduped, label, members, sub, v, _i, _len;
deduped = [];
members = {};
for (_i = 0, _len = subs.length; _i < _len; _i++) {
sub = subs[_i];
assoc = (function() {
var _j, _len1, _results;
_results = [];
for (v = _j = 0, _len1 = sub.length; _j < _len1; v = ++_j) {
k = sub[v];
_results.push([k, v]);
}
return _results;
})();
assoc.sort();
label = ((function() {
var _j, _len1, _results;
_results = [];
for (v = _j = 0, _len1 = assoc.length; _j < _len1; v = ++_j) {
k = assoc[v];
_results.push(k + ',' + v);
}
return _results;
})()).join('-');
if (!(label in members)) {
members[label] = true;
deduped.push(sub);
}
}
return deduped;
};
helper = function(keys) {
var dup_l33t_index, first_key, i, l33t_chr, next_subs, rest_keys, sub, sub_alternative, sub_extension, _i, _j, _k, _len, _len1, _ref, _ref1;
if (!keys.length) {
return;
}
first_key = keys[0];
rest_keys = keys.slice(1);
next_subs = [];
_ref = table[first_key];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
l33t_chr = _ref[_i];
for (_j = 0, _len1 = subs.length; _j < _len1; _j++) {
sub = subs[_j];
dup_l33t_index = -1;
for (i = _k = 0, _ref1 = sub.length; 0 <= _ref1 ? _k < _ref1 : _k > _ref1; i = 0 <= _ref1 ? ++_k : --_k) {
if (sub[i][0] === l33t_chr) {
dup_l33t_index = i;
break;
}
}
if (dup_l33t_index === -1) {
sub_extension = sub.concat([[l33t_chr, first_key]]);
next_subs.push(sub_extension);
} else {
sub_alternative = sub.slice(0);
sub_alternative.splice(dup_l33t_index, 1);
sub_alternative.push([l33t_chr, first_key]);
next_subs.push(sub);
next_subs.push(sub_alternative);
}
}
}
subs = dedup(next_subs);
return helper(rest_keys);
};
helper(keys);
sub_dicts = [];
for (_i = 0, _len = subs.length; _i < _len; _i++) {
sub = subs[_i];
sub_dict = {};
for (_j = 0, _len1 = sub.length; _j < _len1; _j++) {
_ref = sub[_j], l33t_chr = _ref[0], chr = _ref[1];
sub_dict[l33t_chr] = chr;
}
sub_dicts.push(sub_dict);
}
return sub_dicts;
};
l33t_match = function(password) {
var chr, k, match, match_sub, matcher, matches, sub, subbed_chr, subbed_password, token, v, _i, _j, _k, _len, _len1, _len2, _ref, _ref1;
matches = [];
_ref = enumerate_l33t_subs(relevent_l33t_subtable(password));
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
sub = _ref[_i];
if (empty(sub)) {
break;
}
for (_j = 0, _len1 = DICTIONARY_MATCHERS.length; _j < _len1; _j++) {
matcher = DICTIONARY_MATCHERS[_j];
subbed_password = translate(password, sub);
_ref1 = matcher(subbed_password);
for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) {
match = _ref1[_k];
token = password.slice(match.i, +match.j + 1 || 9e9);
if (token.toLowerCase() === match.matched_word) {
continue;
}
match_sub = {};
for (subbed_chr in sub) {
chr = sub[subbed_chr];
if (token.indexOf(subbed_chr) !== -1) {
match_sub[subbed_chr] = chr;
}
}
match.l33t = true;
match.token = token;
match.sub = match_sub;
match.sub_display = ((function() {
var _results;
_results = [];
for (k in match_sub) {
v = match_sub[k];
_results.push("" + k + " -> " + v);
}
return _results;
})()).join(', ');
matches.push(match);
}
}
}
return matches;
};
spatial_match = function(password) {
var graph, graph_name, matches;
matches = [];
for (graph_name in GRAPHS) {
graph = GRAPHS[graph_name];
extend(matches, spatial_match_helper(password, graph, graph_name));
}
return matches;
};
spatial_match_helper = function(password, graph, graph_name) {
var adj, adjacents, cur_char, cur_direction, found, found_direction, i, j, last_direction, prev_char, result, shifted_count, turns, _i, _len;
result = [];
i = 0;
while (i < password.length - 1) {
j = i + 1;
last_direction = null;
turns = 0;
shifted_count = 0;
while (true) {
prev_char = password.charAt(j - 1);
found = false;
found_direction = -1;
cur_direction = -1;
adjacents = graph[prev_char] || [];
if (j < password.length) {
cur_char = password.charAt(j);
for (_i = 0, _len = adjacents.length; _i < _len; _i++) {
adj = adjacents[_i];
cur_direction += 1;
if (adj && adj.indexOf(cur_char) !== -1) {
found = true;
found_direction = cur_direction;
if (adj.indexOf(cur_char) === 1) {
shifted_count += 1;
}
if (last_direction !== found_direction) {
turns += 1;
last_direction = found_direction;
}
break;
}
}
}
if (found) {
j += 1;
} else {
if (j - i > 2) {
result.push({
pattern: 'spatial',
i: i,
j: j - 1,
token: password.slice(i, j),
graph: graph_name,
turns: turns,
shifted_count: shifted_count
});
}
i = j;
break;
}
}
}
return result;
};
repeat_match = function(password) {
var cur_char, i, j, prev_char, result, _ref;
result = [];
i = 0;
while (i < password.length) {
j = i + 1;
while (true) {
_ref = password.slice(j - 1, +j + 1 || 9e9), prev_char = _ref[0], cur_char = _ref[1];
if (password.charAt(j - 1) === password.charAt(j)) {
j += 1;
} else {
if (j - i > 2) {
result.push({
pattern: 'repeat',
i: i,
j: j - 1,
token: password.slice(i, j),
repeated_char: password.charAt(i)
});
}
break;
}
}
i = j;
}
return result;
};
SEQUENCES = {
lower: 'abcdefghijklmnopqrstuvwxyz',
upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
digits: '01234567890'
};
sequence_match = function(password) {
var chr, cur_char, cur_n, direction, i, i_n, j, j_n, prev_char, prev_n, result, seq, seq_candidate, seq_candidate_name, seq_direction, seq_name, _ref, _ref1, _ref2;
result = [];
i = 0;
while (i < password.length) {
j = i + 1;
seq = null;
seq_name = null;
seq_direction = null;
for (seq_candidate_name in SEQUENCES) {
seq_candidate = SEQUENCES[seq_candidate_name];
_ref = (function() {
var _i, _len, _ref, _results;
_ref = [password.charAt(i), password.charAt(j)];
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
chr = _ref[_i];
_results.push(seq_candidate.indexOf(chr));
}
return _results;
})(), i_n = _ref[0], j_n = _ref[1];
if (i_n > -1 && j_n > -1) {
direction = j_n - i_n;
if (direction === 1 || direction === (-1)) {
seq = seq_candidate;
seq_name = seq_candidate_name;
seq_direction = direction;
break;
}
}
}
if (seq) {
while (true) {
_ref1 = password.slice(j - 1, +j + 1 || 9e9), prev_char = _ref1[0], cur_char = _ref1[1];
_ref2 = (function() {
var _i, _len, _ref2, _results;
_ref2 = [prev_char, cur_char];
_results = [];
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
chr = _ref2[_i];
_results.push(seq_candidate.indexOf(chr));
}
return _results;
})(), prev_n = _ref2[0], cur_n = _ref2[1];
if (cur_n - prev_n === seq_direction) {
j += 1;
} else {
if (j - i > 2) {
result.push({
pattern: 'sequence',
i: i,
j: j - 1,
token: password.slice(i, j),
sequence_name: seq_name,
sequence_space: seq.length,
ascending: seq_direction === 1
});
}
break;
}
}
}
i = j;
}
return result;
};
repeat = function(chr, n) {
var i;
return ((function() {
var _i, _results;
_results = [];
for (i = _i = 1; 1 <= n ? _i <= n : _i >= n; i = 1 <= n ? ++_i : --_i) {
_results.push(chr);
}
return _results;
})()).join('');
};
findall = function(password, rx) {
var match, matches;
matches = [];
while (true) {
match = password.match(rx);
if (!match) {
break;
}
match.i = match.index;
match.j = match.index + match[0].length - 1;
matches.push(match);
password = password.replace(match[0], repeat(' ', match[0].length));
}
return matches;
};
digits_rx = /\d{3,}/;
digits_match = function(password) {
var i, j, match, _i, _len, _ref, _ref1, _results;
_ref = findall(password, digits_rx);
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
match = _ref[_i];
_ref1 = [match.i, match.j], i = _ref1[0], j = _ref1[1];
_results.push({
pattern: 'digits',
i: i,
j: j,
token: password.slice(i, +j + 1 || 9e9)
});
}
return _results;
};
year_rx = /19\d\d|200\d|201\d/;
year_match = function(password) {
var i, j, match, _i, _len, _ref, _ref1, _results;
_ref = findall(password, year_rx);
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
match = _ref[_i];
_ref1 = [match.i, match.j], i = _ref1[0], j = _ref1[1];
_results.push({
pattern: 'year',
i: i,
j: j,
token: password.slice(i, +j + 1 || 9e9)
});
}
return _results;
};
date_match = function(password) {
return date_without_sep_match(password).concat(date_sep_match(password));
};
date_without_sep_match = function(password) {
var candidate, candidates_round_1, candidates_round_2, date_matches, day, digit_match, end, i, j, month, token, valid, year, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _ref3;
date_matches = [];
_ref = findall(password, /\d{4,8}/);
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
digit_match = _ref[_i];
_ref1 = [digit_match.i, digit_match.j], i = _ref1[0], j = _ref1[1];
token = password.slice(i, +j + 1 || 9e9);
end = token.length;
candidates_round_1 = [];
if (token.length <= 6) {
candidates_round_1.push({
daymonth: token.slice(2),
year: token.slice(0, 2),
i: i,
j: j
});
candidates_round_1.push({
daymonth: token.slice(0, end - 2),
year: token.slice(end - 2),
i: i,
j: j
});
}
if (token.length >= 6) {
candidates_round_1.push({
daymonth: token.slice(4),
year: token.slice(0, 4),
i: i,
j: j
});
candidates_round_1.push({
daymonth: token.slice(0, end - 4),
year: token.slice(end - 4),
i: i,
j: j
});
}
candidates_round_2 = [];
for (_j = 0, _len1 = candidates_round_1.length; _j < _len1; _j++) {
candidate = candidates_round_1[_j];
switch (candidate.daymonth.length) {
case 2:
candidates_round_2.push({
day: candidate.daymonth[0],
month: candidate.daymonth[1],
year: candidate.year,
i: candidate.i,
j: candidate.j
});
break;
case 3:
candidates_round_2.push({
day: candidate.daymonth.slice(0, 2),
month: candidate.daymonth[2],
year: candidate.year,
i: candidate.i,
j: candidate.j
});
candidates_round_2.push({
day: candidate.daymonth[0],
month: candidate.daymonth.slice(1, 3),
year: candidate.year,
i: candidate.i,
j: candidate.j
});
break;
case 4:
candidates_round_2.push({
day: candidate.daymonth.slice(0, 2),
month: candidate.daymonth.slice(2, 4),
year: candidate.year,
i: candidate.i,
j: candidate.j
});
}
}
for (_k = 0, _len2 = candidates_round_2.length; _k < _len2; _k++) {
candidate = candidates_round_2[_k];
day = parseInt(candidate.day);
month = parseInt(candidate.month);
year = parseInt(candidate.year);
_ref2 = check_date(day, month, year), valid = _ref2[0], (_ref3 = _ref2[1], day = _ref3[0], month = _ref3[1], year = _ref3[2]);
if (!valid) {
continue;
}
date_matches.push({
pattern: 'date',
i: candidate.i,
j: candidate.j,
token: password.slice(i, +j + 1 || 9e9),
separator: '',
day: day,
month: month,
year: year
});
}
}
return date_matches;
};
date_rx_year_suffix = /(\d{1,2})(\s|-|\/|\\|_|\.)(\d{1,2})\2(19\d{2}|200\d|201\d|\d{2})/;
date_rx_year_prefix = /(19\d{2}|200\d|201\d|\d{2})(\s|-|\/|\\|_|\.)(\d{1,2})\2(\d{1,2})/;
date_sep_match = function(password) {
var day, k, match, matches, month, valid, year, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _results;
matches = [];
_ref = findall(password, date_rx_year_suffix);
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
match = _ref[_i];
_ref1 = (function() {
var _j, _len1, _ref1, _results;
_ref1 = [1, 3, 4];
_results = [];
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
k = _ref1[_j];
_results.push(parseInt(match[k]));
}
return _results;
})(), match.day = _ref1[0], match.month = _ref1[1], match.year = _ref1[2];
match.sep = match[2];
matches.push(match);
}
_ref2 = findall(password, date_rx_year_prefix);
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
match = _ref2[_j];
_ref3 = (function() {
var _k, _len2, _ref3, _results;
_ref3 = [4, 3, 1];
_results = [];
for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) {
k = _ref3[_k];
_results.push(parseInt(match[k]));
}
return _results;
})(), match.day = _ref3[0], match.month = _ref3[1], match.year = _ref3[2];
match.sep = match[2];
matches.push(match);
}
_results = [];
for (_k = 0, _len2 = matches.length; _k < _len2; _k++) {
match = matches[_k];
_ref4 = check_date(match.day, match.month, match.year), valid = _ref4[0], (_ref5 = _ref4[1], day = _ref5[0], month = _ref5[1], year = _ref5[2]);
if (!valid) {
continue;
}
_results.push({
pattern: 'date',
i: match.i,
j: match.j,
token: password.slice(match.i, +match.j + 1 || 9e9),
separator: match.sep,
day: day,
month: month,
year: year
});
}
return _results;
};
check_date = function(day, month, year) {
var _ref;
if ((12 <= month && month <= 31) && day <= 12) {
_ref = [month, day], day = _ref[0], month = _ref[1];
}
if (day > 31 || month > 12) {
return [false, []];
}
if (!((1900 <= year && year <= 2019))) {
return [false, []];
}
return [true, [day, month, year]];
};
// Generated by CoffeeScript 1.6.3
var ALL_LOWER, ALL_UPPER, END_UPPER, NUM_ATTACKERS, NUM_DAYS, NUM_MONTHS, NUM_YEARS, SECONDS_PER_GUESS, SINGLE_GUESS, START_UPPER, calc_bruteforce_cardinality, calc_entropy, crack_time_to_score, date_entropy, dictionary_entropy, digits_entropy, display_time, entropy_to_crack_time, extra_l33t_entropy, extra_uppercase_entropy, lg, minimum_entropy_match_sequence, nCk, repeat_entropy, round_to_x_digits, sequence_entropy, spatial_entropy, year_entropy;
nCk = function(n, k) {
var d, r, _i;
if (k > n) {
return 0;
}
if (k === 0) {
return 1;
}
r = 1;
for (d = _i = 1; 1 <= k ? _i <= k : _i >= k; d = 1 <= k ? ++_i : --_i) {
r *= n;
r /= d;
n -= 1;
}
return r;
};
lg = function(n) {
return Math.log(n) / Math.log(2);
};
minimum_entropy_match_sequence = function(password, matches) {
var backpointers, bruteforce_cardinality, candidate_entropy, crack_time, i, j, k, make_bruteforce_match, match, match_sequence, match_sequence_copy, min_entropy, up_to_k, _i, _j, _k, _len, _len1, _ref, _ref1, _ref2;
bruteforce_cardinality = calc_bruteforce_cardinality(password);
up_to_k = [];
backpointers = [];
for (k = _i = 0, _ref = password.length; 0 <= _ref ? _i < _ref : _i > _ref; k = 0 <= _ref ? ++_i : --_i) {
up_to_k[k] = (up_to_k[k - 1] || 0) + lg(bruteforce_cardinality);
backpointers[k] = null;
for (_j = 0, _len = matches.length; _j < _len; _j++) {
match = matches[_j];
if (!(match.j === k)) {
continue;
}
_ref1 = [match.i, match.j], i = _ref1[0], j = _ref1[1];
candidate_entropy = (up_to_k[i - 1] || 0) + calc_entropy(match);
if (candidate_entropy < up_to_k[j]) {
up_to_k[j] = candidate_entropy;
backpointers[j] = match;
}
}
}
match_sequence = [];
k = password.length - 1;
while (k >= 0) {
match = backpointers[k];
if (match) {
match_sequence.push(match);
k = match.i - 1;
} else {
k -= 1;
}
}
match_sequence.reverse();
make_bruteforce_match = function(i, j) {
return {
pattern: 'bruteforce',
i: i,
j: j,
token: password.slice(i, +j + 1 || 9e9),
entropy: lg(Math.pow(bruteforce_cardinality, j - i + 1)),
cardinality: bruteforce_cardinality
};
};
k = 0;
match_sequence_copy = [];
for (_k = 0, _len1 = match_sequence.length; _k < _len1; _k++) {
match = match_sequence[_k];
_ref2 = [match.i, match.j], i = _ref2[0], j = _ref2[1];
if (i - k > 0) {
match_sequence_copy.push(make_bruteforce_match(k, i - 1));
}
k = j + 1;
match_sequence_copy.push(match);
}
if (k < password.length) {
match_sequence_copy.push(make_bruteforce_match(k, password.length - 1));
}
match_sequence = match_sequence_copy;
min_entropy = up_to_k[password.length - 1] || 0;
crack_time = entropy_to_crack_time(min_entropy);
return {
password: password,
entropy: round_to_x_digits(min_entropy, 3),
match_sequence: match_sequence,
crack_time: round_to_x_digits(crack_time, 3),
crack_time_display: display_time(crack_time),
score: crack_time_to_score(crack_time)
};
};
round_to_x_digits = function(n, x) {
return Math.round(n * Math.pow(10, x)) / Math.pow(10, x);
};
SINGLE_GUESS = .010;
NUM_ATTACKERS = 100;
SECONDS_PER_GUESS = SINGLE_GUESS / NUM_ATTACKERS;
entropy_to_crack_time = function(entropy) {
return .5 * Math.pow(2, entropy) * SECONDS_PER_GUESS;
};
crack_time_to_score = function(seconds) {
if (seconds < Math.pow(10, 2)) {
return 0;
}
if (seconds < Math.pow(10, 4)) {
return 1;
}
if (seconds < Math.pow(10, 6)) {
return 2;
}
if (seconds < Math.pow(10, 8)) {
return 3;
}
return 4;
};
calc_entropy = function(match) {
var entropy_func;
if (match.entropy != null) {
return match.entropy;
}
entropy_func = (function() {
switch (match.pattern) {
case 'repeat':
return repeat_entropy;
case 'sequence':
return sequence_entropy;
case 'digits':
return digits_entropy;
case 'year':
return year_entropy;
case 'date':
return date_entropy;
case 'spatial':
return spatial_entropy;
case 'dictionary':
return dictionary_entropy;
}
})();
return match.entropy = entropy_func(match);
};
repeat_entropy = function(match) {
var cardinality;
cardinality = calc_bruteforce_cardinality(match.token);
return lg(cardinality * match.token.length);
};
sequence_entropy = function(match) {
var base_entropy, first_chr;
first_chr = match.token.charAt(0);
if (first_chr === 'a' || first_chr === '1') {
base_entropy = 1;
} else {
if (first_chr.match(/\d/)) {
base_entropy = lg(10);
} else if (first_chr.match(/[a-z]/)) {
base_entropy = lg(26);
} else {
base_entropy = lg(26) + 1;
}
}
if (!match.ascending) {
base_entropy += 1;
}
return base_entropy + lg(match.token.length);
};
digits_entropy = function(match) {
return lg(Math.pow(10, match.token.length));
};
NUM_YEARS = 119;
NUM_MONTHS = 12;
NUM_DAYS = 31;
year_entropy = function(match) {
return lg(NUM_YEARS);
};
date_entropy = function(match) {
var entropy;
if (match.year < 100) {
entropy = lg(NUM_DAYS * NUM_MONTHS * 100);
} else {
entropy = lg(NUM_DAYS * NUM_MONTHS * NUM_YEARS);
}
if (match.separator) {
entropy += 2;
}
return entropy;
};
spatial_entropy = function(match) {
var L, S, U, d, entropy, i, j, possibilities, possible_turns, s, t, _i, _j, _k, _ref, _ref1;
if ((_ref = match.graph) === 'qwerty' || _ref === 'dvorak') {
s = KEYBOARD_STARTING_POSITIONS;
d = KEYBOARD_AVERAGE_DEGREE;
} else {
s = KEYPAD_STARTING_POSITIONS;
d = KEYPAD_AVERAGE_DEGREE;
}
possibilities = 0;
L = match.token.length;
t = match.turns;
for (i = _i = 2; 2 <= L ? _i <= L : _i >= L; i = 2 <= L ? ++_i : --_i) {
possible_turns = Math.min(t, i - 1);
for (j = _j = 1; 1 <= possible_turns ? _j <= possible_turns : _j >= possible_turns; j = 1 <= possible_turns ? ++_j : --_j) {
possibilities += nCk(i - 1, j - 1) * s * Math.pow(d, j);
}
}
entropy = lg(possibilities);
if (match.shifted_count) {
S = match.shifted_count;
U = match.token.length - match.shifted_count;
possibilities = 0;
for (i = _k = 0, _ref1 = Math.min(S, U); 0 <= _ref1 ? _k <= _ref1 : _k >= _ref1; i = 0 <= _ref1 ? ++_k : --_k) {
possibilities += nCk(S + U, i);
}
entropy += lg(possibilities);
}
return entropy;
};
dictionary_entropy = function(match) {
match.base_entropy = lg(match.rank);
match.uppercase_entropy = extra_uppercase_entropy(match);
match.l33t_entropy = extra_l33t_entropy(match);
return match.base_entropy + match.uppercase_entropy + match.l33t_entropy;
};
START_UPPER = /^[A-Z][^A-Z]+$/;
END_UPPER = /^[^A-Z]+[A-Z]$/;
ALL_UPPER = /^[^a-z]+$/;
ALL_LOWER = /^[^A-Z]+$/;
extra_uppercase_entropy = function(match) {
var L, U, chr, i, possibilities, regex, word, _i, _j, _len, _ref, _ref1;
word = match.token;
if (word.match(ALL_LOWER)) {
return 0;
}
_ref = [START_UPPER, END_UPPER, ALL_UPPER];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
regex = _ref[_i];
if (word.match(regex)) {
return 1;
}
}
U = ((function() {
var _j, _len1, _ref1, _results;
_ref1 = word.split('');
_results = [];
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
chr = _ref1[_j];
if (chr.match(/[A-Z]/)) {
_results.push(chr);
}
}
return _results;
})()).length;
L = ((function() {
var _j, _len1, _ref1, _results;
_ref1 = word.split('');
_results = [];
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
chr = _ref1[_j];
if (chr.match(/[a-z]/)) {
_results.push(chr);
}
}
return _results;
})()).length;
possibilities = 0;
for (i = _j = 0, _ref1 = Math.min(U, L); 0 <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = 0 <= _ref1 ? ++_j : --_j) {
possibilities += nCk(U + L, i);
}
return lg(possibilities);
};
extra_l33t_entropy = function(match) {
var S, U, chr, i, possibilities, subbed, unsubbed, _i, _ref, _ref1;
if (!match.l33t) {
return 0;
}
possibilities = 0;
_ref = match.sub;
for (subbed in _ref) {
unsubbed = _ref[subbed];
S = ((function() {
var _i, _len, _ref1, _results;
_ref1 = match.token.split('');
_results = [];
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
chr = _ref1[_i];
if (chr === subbed) {
_results.push(chr);
}
}
return _results;
})()).length;
U = ((function() {
var _i, _len, _ref1, _results;
_ref1 = match.token.split('');
_results = [];
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
chr = _ref1[_i];
if (chr === unsubbed) {
_results.push(chr);
}
}
return _results;
})()).length;
for (i = _i = 0, _ref1 = Math.min(U, S); 0 <= _ref1 ? _i <= _ref1 : _i >= _ref1; i = 0 <= _ref1 ? ++_i : --_i) {
possibilities += nCk(U + S, i);
}
}
return lg(possibilities) || 1;
};
calc_bruteforce_cardinality = function(password) {
var c, chr, digits, lower, ord, symbols, upper, _i, _len, _ref, _ref1;
_ref = [false, false, false, false], lower = _ref[0], upper = _ref[1], digits = _ref[2], symbols = _ref[3];
_ref1 = password.split('');
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
chr = _ref1[_i];
ord = chr.charCodeAt(0);
if ((0x30 <= ord && ord <= 0x39)) {
digits = true;
} else if ((0x41 <= ord && ord <= 0x5a)) {
upper = true;
} else if ((0x61 <= ord && ord <= 0x7a)) {
lower = true;
} else {
symbols = true;
}
}
c = 0;
if (digits) {
c += 10;
}
if (upper) {
c += 26;
}
if (lower) {
c += 26;
}
if (symbols) {
c += 33;
}
return c;
};
display_time = function(seconds) {
var century, day, hour, minute, month, year;
minute = 60;
hour = minute * 60;
day = hour * 24;
month = day * 31;
year = month * 12;
century = year * 100;
if (seconds < minute) {
return 'instant';
} else if (seconds < hour) {
return "" + (1 + Math.ceil(seconds / minute)) + " minutes";
} else if (seconds < day) {
return "" + (1 + Math.ceil(seconds / hour)) + " hours";
} else if (seconds < month) {
return "" + (1 + Math.ceil(seconds / day)) + " days";
} else if (seconds < year) {
return "" + (1 + Math.ceil(seconds / month)) + " months";
} else if (seconds < century) {
return "" + (1 + Math.ceil(seconds / year)) + " years";
} else {
return 'centuries';
}
};
var qwerty = {"!": ["`~", null, null, "2@", "qQ", null], "\"": [";:", "[{", "]}", null, null, "/?"], "#": ["2@", null, null, "4$", "eE", "wW"], "$": ["3#", null, null, "5%", "rR", "eE"], "%": ["4$", null, null, "6^", "tT", "rR"], "&": ["6^", null, null, "8*", "uU", "yY"], "'": [";:", "[{", "]}", null, null, "/?"], "(": ["8*", null, null, "0)", "oO", "iI"], ")": ["9(", null, null, "-_", "pP", "oO"], "*": ["7&", null, null, "9(", "iI", "uU"], "+": ["-_", null, null, null, "]}", "[{"], ",": ["mM", "kK", "lL", ".>", null, null], "-": ["0)", null, null, "=+", "[{", "pP"], ".": [",<", "lL", ";:", "/?", null, null], "/": [".>", ";:", "'\"", null, null, null], "0": ["9(", null, null, "-_", "pP", "oO"], "1": ["`~", null, null, "2@", "qQ", null], "2": ["1!", null, null, "3#", "wW", "qQ"], "3": ["2@", null, null, "4$", "eE", "wW"], "4": ["3#", null, null, "5%", "rR", "eE"], "5": ["4$", null, null, "6^", "tT", "rR"], "6": ["5%", null, null, "7&", "yY", "tT"], "7": ["6^", null, null, "8*", "uU", "yY"], "8": ["7&", null, null, "9(", "iI", "uU"], "9": ["8*", null, null, "0)", "oO", "iI"], ":": ["lL", "pP", "[{", "'\"", "/?", ".>"], ";": ["lL", "pP", "[{", "'\"", "/?", ".>"], "<": ["mM", "kK", "lL", ".>", null, null], "=": ["-_", null, null, null, "]}", "[{"], ">": [",<", "lL", ";:", "/?", null, null], "?": [".>", ";:", "'\"", null, null, null], "@": ["1!", null, null, "3#", "wW", "qQ"], "A": [null, "qQ", "wW", "sS", "zZ", null], "B": ["vV", "gG", "hH", "nN", null, null], "C": ["xX", "dD", "fF", "vV", null, null], "D": ["sS", "eE", "rR", "fF", "cC", "xX"], "E": ["wW", "3#", "4$", "rR", "dD", "sS"], "F": ["dD", "rR", "tT", "gG", "vV", "cC"], "G": ["fF", "tT", "yY", "hH", "bB", "vV"], "H": ["gG", "yY", "uU", "jJ", "nN", "bB"], "I": ["uU", "8*", "9(", "oO", "kK", "jJ"], "J": ["hH", "uU", "iI", "kK", "mM", "nN"], "K": ["jJ", "iI", "oO", "lL", ",<", "mM"], "L": ["kK", "oO", "pP", ";:", ".>", ",<"], "M": ["nN", "jJ", "kK", ",<", null, null], "N": ["bB", "hH", "jJ", "mM", null, null], "O": ["iI", "9(", "0)", "pP", "lL", "kK"], "P": ["oO", "0)", "-_", "[{", ";:", "lL"], "Q": [null, "1!", "2@", "wW", "aA", null], "R": ["eE", "4$", "5%", "tT", "fF", "dD"], "S": ["aA", "wW", "eE", "dD", "xX", "zZ"], "T": ["rR", "5%", "6^", "yY", "gG", "fF"], "U": ["yY", "7&", "8*", "iI", "jJ", "hH"], "V": ["cC", "fF", "gG", "bB", null, null], "W": ["qQ", "2@", "3#", "eE", "sS", "aA"], "X": ["zZ", "sS", "dD", "cC", null, null], "Y": ["tT", "6^", "7&", "uU", "hH", "gG"], "Z": [null, "aA", "sS", "xX", null, null], "[": ["pP", "-_", "=+", "]}", "'\"", ";:"], "\\": ["]}", null, null, null, null, null], "]": ["[{", "=+", null, "\\|", null, "'\""], "^": ["5%", null, null, "7&", "yY", "tT"], "_": ["0)", null, null, "=+", "[{", "pP"], "`": [null, null, null, "1!", null, null], "a": [null, "qQ", "wW", "sS", "zZ", null], "b": ["vV", "gG", "hH", "nN", null, null], "c": ["xX", "dD", "fF", "vV", null, null], "d": ["sS", "eE", "rR", "fF", "cC", "xX"], "e": ["wW", "3#", "4$", "rR", "dD", "sS"], "f": ["dD", "rR", "tT", "gG", "vV", "cC"], "g": ["fF", "tT", "yY", "hH", "bB", "vV"], "h": ["gG", "yY", "uU", "jJ", "nN", "bB"], "i": ["uU", "8*", "9(", "oO", "kK", "jJ"], "j": ["hH", "uU", "iI", "kK", "mM", "nN"], "k": ["jJ", "iI", "oO", "lL", ",<", "mM"], "l": ["kK", "oO", "pP", ";:", ".>", ",<"], "m": ["nN", "jJ", "kK", ",<", null, null], "n": ["bB", "hH", "jJ", "mM", null, null], "o": ["iI", "9(", "0)", "pP", "lL", "kK"], "p": ["oO", "0)", "-_", "[{", ";:", "lL"], "q": [null, "1!", "2@", "wW", "aA", null], "r": ["eE", "4$", "5%", "tT", "fF", "dD"], "s": ["aA", "wW", "eE", "dD", "xX", "zZ"], "t": ["rR", "5%", "6^", "yY", "gG", "fF"], "u": ["yY", "7&", "8*", "iI", "jJ", "hH"], "v": ["cC", "fF", "gG", "bB", null, null], "w": ["qQ", "2@", "3#", "eE", "sS", "aA"], "x": ["zZ", "sS", "dD", "cC", null, null], "y": ["tT", "6^", "7&", "uU", "hH", "gG"], "z": [null, "aA", "sS", "xX", null, null], "{": ["pP", "-_", "=+", "]}", "'\"", ";:"], "|": ["]}", null, null, null, null, null], "}": ["[{", "=+", null, "\\|", null, "'\""], "~": [null, null, null, "1!", null, null]};
var dvorak = {"!": ["`~", null, null, "2@", "'\"", null], "\"": [null, "1!", "2@", ",<", "aA", null], "#": ["2@", null, null, "4$", ".>", ",<"], "$": ["3#", null, null, "5%", "pP", ".>"], "%": ["4$", null, null, "6^", "yY", "pP"], "&": ["6^", null, null, "8*", "gG", "fF"], "'": [null, "1!", "2@", ",<", "aA", null], "(": ["8*", null, null, "0)", "rR", "cC"], ")": ["9(", null, null, "[{", "lL", "rR"], "*": ["7&", null, null, "9(", "cC", "gG"], "+": ["/?", "]}", null, "\\|", null, "-_"], ",": ["'\"", "2@", "3#", ".>", "oO", "aA"], "-": ["sS", "/?", "=+", null, null, "zZ"], ".": [",<", "3#", "4$", "pP", "eE", "oO"], "/": ["lL", "[{", "]}", "=+", "-_", "sS"], "0": ["9(", null, null, "[{", "lL", "rR"], "1": ["`~", null, null, "2@", "'\"", null], "2": ["1!", null, null, "3#", ",<", "'\""], "3": ["2@", null, null, "4$", ".>", ",<"], "4": ["3#", null, null, "5%", "pP", ".>"], "5": ["4$", null, null, "6^", "yY", "pP"], "6": ["5%", null, null, "7&", "fF", "yY"], "7": ["6^", null, null, "8*", "gG", "fF"], "8": ["7&", null, null, "9(", "cC", "gG"], "9": ["8*", null, null, "0)", "rR", "cC"], ":": [null, "aA", "oO", "qQ", null, null], ";": [null, "aA", "oO", "qQ", null, null], "<": ["'\"", "2@", "3#", ".>", "oO", "aA"], "=": ["/?", "]}", null, "\\|", null, "-_"], ">": [",<", "3#", "4$", "pP", "eE", "oO"], "?": ["lL", "[{", "]}", "=+", "-_", "sS"], "@": ["1!", null, null, "3#", ",<", "'\""], "A": [null, "'\"", ",<", "oO", ";:", null], "B": ["xX", "dD", "hH", "mM", null, null], "C": ["gG", "8*", "9(", "rR", "tT", "hH"], "D": ["iI", "fF", "gG", "hH", "bB", "xX"], "E": ["oO", ".>", "pP", "uU", "jJ", "qQ"], "F": ["yY", "6^", "7&", "gG", "dD", "iI"], "G": ["fF", "7&", "8*", "cC", "hH", "dD"], "H": ["dD", "gG", "cC", "tT", "mM", "bB"], "I": ["uU", "yY", "fF", "dD", "xX", "kK"], "J": ["qQ", "eE", "uU", "kK", null, null], "K": ["jJ", "uU", "iI", "xX", null, null], "L": ["rR", "0)", "[{", "/?", "sS", "nN"], "M": ["bB", "hH", "tT", "wW", null, null], "N": ["tT", "rR", "lL", "sS", "vV", "wW"], "O": ["aA", ",<", ".>", "eE", "qQ", ";:"], "P": [".>", "4$", "5%", "yY", "uU", "eE"], "Q": [";:", "oO", "eE", "jJ", null, null], "R": ["cC", "9(", "0)", "lL", "nN", "tT"], "S": ["nN", "lL", "/?", "-_", "zZ", "vV"], "T": ["hH", "cC", "rR", "nN", "wW", "mM"], "U": ["eE", "pP", "yY", "iI", "kK", "jJ"], "V": ["wW", "nN", "sS", "zZ", null, null], "W": ["mM", "tT", "nN", "vV", null, null], "X": ["kK", "iI", "dD", "bB", null, null], "Y": ["pP", "5%", "6^", "fF", "iI", "uU"], "Z": ["vV", "sS", "-_", null, null, null], "[": ["0)", null, null, "]}", "/?", "lL"], "\\": ["=+", null, null, null, null, null], "]": ["[{", null, null, null, "=+", "/?"], "^": ["5%", null, null, "7&", "fF", "yY"], "_": ["sS", "/?", "=+", null, null, "zZ"], "`": [null, null, null, "1!", null, null], "a": [null, "'\"", ",<", "oO", ";:", null], "b": ["xX", "dD", "hH", "mM", null, null], "c": ["gG", "8*", "9(", "rR", "tT", "hH"], "d": ["iI", "fF", "gG", "hH", "bB", "xX"], "e": ["oO", ".>", "pP", "uU", "jJ", "qQ"], "f": ["yY", "6^", "7&", "gG", "dD", "iI"], "g": ["fF", "7&", "8*", "cC", "hH", "dD"], "h": ["dD", "gG", "cC", "tT", "mM", "bB"], "i": ["uU", "yY", "fF", "dD", "xX", "kK"], "j": ["qQ", "eE", "uU", "kK", null, null], "k": ["jJ", "uU", "iI", "xX", null, null], "l": ["rR", "0)", "[{", "/?", "sS", "nN"], "m": ["bB", "hH", "tT", "wW", null, null], "n": ["tT", "rR", "lL", "sS", "vV", "wW"], "o": ["aA", ",<", ".>", "eE", "qQ", ";:"], "p": [".>", "4$", "5%", "yY", "uU", "eE"], "q": [";:", "oO", "eE", "jJ", null, null], "r": ["cC", "9(", "0)", "lL", "nN", "tT"], "s": ["nN", "lL", "/?", "-_", "zZ", "vV"], "t": ["hH", "cC", "rR", "nN", "wW", "mM"], "u": ["eE", "pP", "yY", "iI", "kK", "jJ"], "v": ["wW", "nN", "sS", "zZ", null, null], "w": ["mM", "tT", "nN", "vV", null, null], "x": ["kK", "iI", "dD", "bB", null, null], "y": ["pP", "5%", "6^", "fF", "iI", "uU"], "z": ["vV", "sS", "-_", null, null, null], "{": ["0)", null, null, "]}", "/?", "lL"], "|": ["=+", null, null, null, null, null], "}": ["[{", null, null, null, "=+", "/?"], "~": [null, null, null, "1!", null, null]};
var keypad = {"*": ["/", null, null, null, "-", "+", "9", "8"], "+": ["9", "*", "-", null, null, null, null, "6"], "-": ["*", null, null, null, null, null, "+", "9"], ".": ["0", "2", "3", null, null, null, null, null], "/": [null, null, null, null, "*", "9", "8", "7"], "0": [null, "1", "2", "3", ".", null, null, null], "1": [null, null, "4", "5", "2", "0", null, null], "2": ["1", "4", "5", "6", "3", ".", "0", null], "3": ["2", "5", "6", null, null, null, ".", "0"], "4": [null, null, "7", "8", "5", "2", "1", null], "5": ["4", "7", "8", "9", "6", "3", "2", "1"], "6": ["5", "8", "9", "+", null, null, "3", "2"], "7": [null, null, null, "/", "8", "5", "4", null], "8": ["7", null, "/", "*", "9", "6", "5", "4"], "9": ["8", "/", "*", "-", "+", null, "6", "5"]};
var mac_keypad = {"*": ["/", null, null, null, null, null, "-", "9"], "+": ["6", "9", "-", null, null, null, null, "3"], "-": ["9", "/", "*", null, null, null, "+", "6"], ".": ["0", "2", "3", null, null, null, null, null], "/": ["=", null, null, null, "*", "-", "9", "8"], "0": [null, "1", "2", "3", ".", null, null, null], "1": [null, null, "4", "5", "2", "0", null, null], "2": ["1", "4", "5", "6", "3", ".", "0", null], "3": ["2", "5", "6", "+", null, null, ".", "0"], "4": [null, null, "7", "8", "5", "2", "1", null], "5": ["4", "7", "8", "9", "6", "3", "2", "1"], "6": ["5", "8", "9", "-", "+", null, "3", "2"], "7": [null, null, null, "=", "8", "5", "4", null], "8": ["7", null, "=", "/", "9", "6", "5", "4"], "9": ["8", "=", "/", "*", "-", "+", "6", "5"], "=": [null, null, null, null, "/", "9", "8", "7"]};
var passwords = ["password", "123456", "12345678", "1234", "qwerty", "12345", "dragon", "pussy", "baseball", "football", "letmein", "monkey", "696969", "abc123", "mustang", "shadow", "master", "111111", "2000", "jordan", "superman", "harley", "1234567", "fuckme", "hunter", "fuckyou", "trustno1", "ranger", "buster", "tigger", "soccer", "fuck", "batman", "test", "pass", "killer", "hockey", "charlie", "love", "sunshine", "asshole", "6969", "pepper", "access", "123456789", "654321", "maggie", "starwars", "silver", "dallas", "yankees", "123123", "666666", "hello", "orange", "biteme", "freedom", "computer", "sexy", "thunder", "ginger", "hammer", "summer", "corvette", "fucker", "austin", "1111", "merlin", "121212", "golfer", "cheese", "princess", "chelsea", "diamond", "yellow", "bigdog", "secret", "asdfgh", "sparky", "cowboy", "camaro", "matrix", "falcon", "iloveyou", "guitar", "purple", "scooter", "phoenix", "aaaaaa", "tigers", "porsche", "mickey", "maverick", "cookie", "nascar", "peanut", "131313", "money", "horny", "samantha", "panties", "steelers", "snoopy", "boomer", "whatever", "iceman", "smokey", "gateway", "dakota", "cowboys", "eagles", "chicken", "dick", "black", "zxcvbn", "ferrari", "knight", "hardcore", "compaq", "coffee", "booboo", "bitch", "bulldog", "xxxxxx", "welcome", "player", "ncc1701", "wizard", "scooby", "junior", "internet", "bigdick", "brandy", "tennis", "blowjob", "banana", "monster", "spider", "lakers", "rabbit", "enter", "mercedes", "fender", "yamaha", "diablo", "boston", "tiger", "marine", "chicago", "rangers", "gandalf", "winter", "bigtits", "barney", "raiders", "porn", "badboy", "blowme", "spanky", "bigdaddy", "chester", "london", "midnight", "blue", "fishing", "000000", "hannah", "slayer", "11111111", "sexsex", "redsox", "thx1138", "asdf", "marlboro", "panther", "zxcvbnm", "arsenal", "qazwsx", "mother", "7777777", "jasper", "winner", "golden", "butthead", "viking", "iwantu", "angels", "prince", "cameron", "girls", "madison", "hooters", "startrek", "captain", "maddog", "jasmine", "butter", "booger", "golf", "rocket", "theman", "liverpoo", "flower", "forever", "muffin", "turtle", "sophie", "redskins", "toyota", "sierra", "winston", "giants", "packers", "newyork", "casper", "bubba", "112233", "lovers", "mountain", "united", "driver", "helpme", "fucking", "pookie", "lucky", "maxwell", "8675309", "bear", "suckit", "gators", "5150", "222222", "shithead", "fuckoff", "jaguar", "hotdog", "tits", "gemini", "lover", "xxxxxxxx", "777777", "canada", "florida", "88888888", "rosebud", "metallic", "doctor", "trouble", "success", "stupid", "tomcat", "warrior", "peaches", "apples", "fish", "qwertyui", "magic", "buddy", "dolphins", "rainbow", "gunner", "987654", "freddy", "alexis", "braves", "cock", "2112", "1212", "cocacola", "xavier", "dolphin", "testing", "bond007", "member", "voodoo", "7777", "samson", "apollo", "fire", "tester", "beavis", "voyager", "porno", "rush2112", "beer", "apple", "scorpio", "skippy", "sydney", "red123", "power", "beaver", "star", "jackass", "flyers", "boobs", "232323", "zzzzzz", "scorpion", "doggie", "legend", "ou812", "yankee", "blazer", "runner", "birdie", "bitches", "555555", "topgun", "asdfasdf", "heaven", "viper", "animal", "2222", "bigboy", "4444", "private", "godzilla", "lifehack", "phantom", "rock", "august", "sammy", "cool", "platinum", "jake", "bronco", "heka6w2", "copper", "cumshot", "garfield", "willow", "cunt", "slut", "69696969", "kitten", "super", "jordan23", "eagle1", "shelby", "america", "11111", "free", "123321", "chevy", "bullshit", "broncos", "horney", "surfer", "nissan", "999999", "saturn", "airborne", "elephant", "shit", "action", "adidas", "qwert", "1313", "explorer", "police", "christin", "december", "wolf", "sweet", "therock", "online", "dickhead", "brooklyn", "cricket", "racing", "penis", "0000", "teens", "redwings", "dreams", "michigan", "hentai", "magnum", "87654321", "donkey", "trinity", "digital", "333333", "cartman", "guinness", "123abc", "speedy", "buffalo", "kitty", "pimpin", "eagle", "einstein", "nirvana", "vampire", "xxxx", "playboy", "pumpkin", "snowball", "test123", "sucker", "mexico", "beatles", "fantasy", "celtic", "cherry", "cassie", "888888", "sniper", "genesis", "hotrod", "reddog", "alexande", "college", "jester", "passw0rd", "bigcock", "lasvegas", "slipknot", "3333", "death", "1q2w3e", "eclipse", "1q2w3e4r", "drummer", "montana", "music", "aaaa", "carolina", "colorado", "creative", "hello1", "goober", "friday", "bollocks", "scotty", "abcdef", "bubbles", "hawaii", "fluffy", "horses", "thumper", "5555", "pussies", "darkness", "asdfghjk", "boobies", "buddha", "sandman", "naughty", "honda", "azerty", "6666", "shorty", "money1", "beach", "loveme", "4321", "simple", "poohbear", "444444", "badass", "destiny", "vikings", "lizard", "assman", "nintendo", "123qwe", "november", "xxxxx", "october", "leather", "bastard", "101010", "extreme", "password1", "pussy1", "lacrosse", "hotmail", "spooky", "amateur", "alaska", "badger", "paradise", "maryjane", "poop", "mozart", "video", "vagina", "spitfire", "cherokee", "cougar", "420420", "horse", "enigma", "raider", "brazil", "blonde", "55555", "dude", "drowssap", "lovely", "1qaz2wsx", "booty", "snickers", "nipples", "diesel", "rocks", "eminem", "westside", "suzuki", "passion", "hummer", "ladies", "alpha", "suckme", "147147", "pirate", "semperfi", "jupiter", "redrum", "freeuser", "wanker", "stinky", "ducati", "paris", "babygirl", "windows", "spirit", "pantera", "monday", "patches", "brutus", "smooth", "penguin", "marley", "forest", "cream", "212121", "flash", "maximus", "nipple", "vision", "pokemon", "champion", "fireman", "indian", "softball", "picard", "system", "cobra", "enjoy", "lucky1", "boogie", "marines", "security", "dirty", "admin", "wildcats", "pimp", "dancer", "hardon", "fucked", "abcd1234", "abcdefg", "ironman", "wolverin", "freepass", "bigred", "squirt", "justice", "hobbes", "pearljam", "mercury", "domino", "9999", "rascal", "hitman", "mistress", "bbbbbb", "peekaboo", "naked", "budlight", "electric", "sluts", "stargate", "saints", "bondage", "bigman", "zombie", "swimming", "duke", "qwerty1", "babes", "scotland", "disney", "rooster", "mookie", "swordfis", "hunting", "blink182", "8888", "samsung", "bubba1", "whore", "general", "passport", "aaaaaaaa", "erotic", "liberty", "arizona", "abcd", "newport", "skipper", "rolltide", "balls", "happy1", "galore", "christ", "weasel", "242424", "wombat", "digger", "classic", "bulldogs", "poopoo", "accord", "popcorn", "turkey", "bunny", "mouse", "007007", "titanic", "liverpool", "dreamer", "everton", "chevelle", "psycho", "nemesis", "pontiac", "connor", "eatme", "lickme", "cumming", "ireland", "spiderma", "patriots", "goblue", "devils", "empire", "asdfg", "cardinal", "shaggy", "froggy", "qwer", "kawasaki", "kodiak", "phpbb", "54321", "chopper", "hooker", "whynot", "lesbian", "snake", "teen", "ncc1701d", "qqqqqq", "airplane", "britney", "avalon", "sugar", "sublime", "wildcat", "raven", "scarface", "elizabet", "123654", "trucks", "wolfpack", "pervert", "redhead", "american", "bambam", "woody", "shaved", "snowman", "tiger1", "chicks", "raptor", "1969", "stingray", "shooter", "france", "stars", "madmax", "sports", "789456", "simpsons", "lights", "chronic", "hahaha", "packard", "hendrix", "service", "spring", "srinivas", "spike", "252525", "bigmac", "suck", "single", "popeye", "tattoo", "texas", "bullet", "taurus", "sailor", "wolves", "panthers", "japan", "strike", "pussycat", "chris1", "loverboy", "berlin", "sticky", "tarheels", "russia", "wolfgang", "testtest", "mature", "catch22", "juice", "michael1", "nigger", "159753", "alpha1", "trooper", "hawkeye", "freaky", "dodgers", "pakistan", "machine", "pyramid", "vegeta", "katana", "moose", "tinker", "coyote", "infinity", "pepsi", "letmein1", "bang", "hercules", "james1", "tickle", "outlaw", "browns", "billybob", "pickle", "test1", "sucks", "pavilion", "changeme", "caesar", "prelude", "darkside", "bowling", "wutang", "sunset", "alabama", "danger", "zeppelin", "pppppp", "2001", "ping", "darkstar", "madonna", "qwe123", "bigone", "casino", "charlie1", "mmmmmm", "integra", "wrangler", "apache", "tweety", "qwerty12", "bobafett", "transam", "2323", "seattle", "ssssss", "openup", "pandora", "pussys", "trucker", "indigo", "storm", "malibu", "weed", "review", "babydoll", "doggy", "dilbert", "pegasus", "joker", "catfish", "flipper", "fuckit", "detroit", "cheyenne", "bruins", "smoke", "marino", "fetish", "xfiles", "stinger", "pizza", "babe", "stealth", "manutd", "gundam", "cessna", "longhorn", "presario", "mnbvcxz", "wicked", "mustang1", "victory", "21122112", "awesome", "athena", "q1w2e3r4", "holiday", "knicks", "redneck", "12341234", "gizmo", "scully", "dragon1", "devildog", "triumph", "bluebird", "shotgun", "peewee", "angel1", "metallica", "madman", "impala", "lennon", "omega", "access14", "enterpri", "search", "smitty", "blizzard", "unicorn", "tight", "asdf1234", "trigger", "truck", "beauty", "thailand", "1234567890", "cadillac", "castle", "bobcat", "buddy1", "sunny", "stones", "asian", "butt", "loveyou", "hellfire", "hotsex", "indiana", "panzer", "lonewolf", "trumpet", "colors", "blaster", "12121212", "fireball", "precious", "jungle", "atlanta", "gold", "corona", "polaris", "timber", "theone", "baller", "chipper", "skyline", "dragons", "dogs", "licker", "engineer", "kong", "pencil", "basketba", "hornet", "barbie", "wetpussy", "indians", "redman", "foobar", "travel", "morpheus", "target", "141414", "hotstuff", "photos", "rocky1", "fuck_inside", "dollar", "turbo", "design", "hottie", "202020", "blondes", "4128", "lestat", "avatar", "goforit", "random", "abgrtyu", "jjjjjj", "cancer", "q1w2e3", "smiley", "express", "virgin", "zipper", "wrinkle1", "babylon", "consumer", "monkey1", "serenity", "samurai", "99999999", "bigboobs", "skeeter", "joejoe", "master1", "aaaaa", "chocolat", "christia", "stephani", "tang", "1234qwer", "98765432", "sexual", "maxima", "77777777", "buckeye", "highland", "seminole", "reaper", "bassman", "nugget", "lucifer", "airforce", "n