var page = require('webpage').create();
var url = 'src/index.html';
-var testMaxTime = 5000;
+var testMaxTime = 10000;
page.onResourceError = function(e) {
console.log("Error loading " + e.url);
maxTime = testMaxTime;
}
var origFeedback = page.evaluate(function() {
- return $(".entropy-feedback").text();
+ return $(".entropy-container").text();
});
var start = new Date().getTime();
var wait = function keepWaiting() {
return;
}
var feedback = page.evaluate(function() {
- return $(".entropy-feedback").text();
+ return $(".entropy-container").text();
});
var hasFinished = feedback != origFeedback;
if (hasFinished) {
"dice",
"base 10",
"hexadecimal",
+ "cards",
];
for (var i=0; i<options.length; i++) {
var option = options[i];
[ "222F", "16" ],
[ "FFFF", "16" ],
[ "0000101017", "33" ], // 10 events at 3.32 bits per event
+ [ "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks", "226" ], // cards are not replaced, so a full deck is not 52^52 entropy which is 296 bits, it's 52!, which is 226 bits
]
// use entropy
page.evaluate(function(e) {
// check the number of bits of entropy is shown
waitForEntropyFeedback(function() {
var entropyText = page.evaluate(function() {
- return $(".entropy-feedback").text();
+ return $(".entropy-container").text();
});
if (entropyText.replace(/\s/g,"").indexOf("Bits" + expected) == -1) {
console.log("Accumulated entropy is not shown correctly for " + entropy);
events: 32,
bits: 128,
words: 12,
+ strength: "easily cracked",
+ },
+ {
+ entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA",
+ filtered: "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDA",
+ type: "hexadecimal",
+ events: 32,
+ bits: 128,
+ words: 12,
strength: "strong",
},
{
- entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD EEEEEEEE",
- filtered: "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDDEEEEEEEE",
+ entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA EEEEEEEE",
+ filtered: "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDAEEEEEEEE",
type: "hexadecimal",
events: 40,
bits: 160,
strength: "very strong",
},
{
- entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD EEEEEEEE FFFFFFFF",
- filtered: "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDDEEEEEEEEFFFFFFFF",
+ entropy: "AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDA EEEEEEEE FFFFFFFF",
+ filtered: "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDAEEEEEEEEFFFFFFFF",
type: "hexadecimal",
events: 48,
bits: 192,
words: 18,
strength: "extremely strong",
},
+ {
+ entropy: "7d",
+ type: "card",
+ events: 1,
+ bits: 5,
+ words: 0,
+ strength: "extremely weak",
+ },
+ {
+ entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks",
+ type: "card (full deck)",
+ events: 52,
+ bits: 226,
+ words: 27,
+ strength: "extremely strong",
+ },
+ {
+ entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks3d",
+ type: "card (full deck, 1 duplicate: 3d)",
+ events: 53,
+ bits: 232,
+ words: 27,
+ strength: "extremely strong",
+ },
+ {
+ entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d",
+ type: "card (2 duplicates: 3d 4d)",
+ events: 53,
+ bits: 232,
+ words: 27,
+ strength: "extremely strong",
+ },
+ {
+ entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d5d6d",
+ type: "card (4 duplicates: 3d 4d 5d...)",
+ events: 53,
+ bits: 243,
+ words: 27,
+ strength: "extremely strong",
+ },
+ // Next test was throwing uncaught error in zxcvbn
+ {
+ entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsksac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks",
+ type: "card (full deck, 52 duplicates: ac 2c 3c...)",
+ events: 104,
+ bits: 452,
+ words: 54,
+ strength: "extremely strong",
+ },
];
// use entropy
page.evaluate(function() {
});
var nextTest = function runNextTest(i) {
function getFeedbackError(expected, actual) {
- if (actual.indexOf(expected.filtered) == -1) {
+ if ("filtered" in expected && actual.indexOf(expected.filtered) == -1) {
return "Filtered value not in feedback";
}
if (actual.indexOf(expected.type) == -1) {
}
// check feedback
var feedback = page.evaluate(function() {
- return $(".entropy-feedback").text();
+ return $(".entropy-container").text();
});
var feedbackError = getFeedbackError(test, feedback);
if (feedbackError) {
});
},
-// Entropy is truncated from the right
+// Entropy is truncated from the left
function() {
page.open(url, function(status) {
- var expected = "abandon abandon ability";
+ var expected = "avocado zoo zone";
// use entropy
page.evaluate(function() {
$(".use-entropy").prop("checked", true).trigger("change");
var entropy = "00000000 00000000 00000000 00000000";
- entropy += "11111111 11111111 11111111 1111"; // Missing last byte, only first 8 bytes are used
+ entropy += "11111111 11111111 11111111 1111"; // Missing last byte
$(".entropy").val(entropy).trigger("input");
});
// check the entropy is truncated from the right
// https://bip32jp.github.io/english/index.html
// NOTES:
// Is incompatible with:
-// base 6 with leading zeros
-// base 6 wth 12 words / 53 chars
// base 20
function() {
page.open(url, function(status) {