var url = 'src/index.html';
var testMaxTime = 10000;
+page.viewportSize = {
+ width: 1024,
+ height: 720
+};
+
page.onResourceError = function(e) {
console.log("Error loading " + e.url);
phantom.exit();
words: 18,
strength: "extremely strong",
},
+ // Multiple decks of cards increases bits per event
+ {
+ entropy: "3d",
+ events: 1,
+ bits: 4,
+ bitsPerEvent: 4.34,
+ },
+ {
+ entropy: "3d3d",
+ events: 2,
+ bits: 9,
+ bitsPerEvent: 4.80,
+ },
+ {
+ entropy: "3d3d3d",
+ events: 3,
+ bits: 15,
+ bitsPerEvent: 5.01,
+ },
+ {
+ entropy: "3d3d3d3d",
+ events: 4,
+ bits: 20,
+ bitsPerEvent: 5.14,
+ },
+ {
+ entropy: "3d3d3d3d3d",
+ events: 5,
+ bits: 26,
+ bitsPerEvent: 5.22,
+ },
+ {
+ entropy: "3d3d3d3d3d3d",
+ events: 6,
+ bits: 31,
+ bitsPerEvent: 5.28,
+ },
+ {
+ entropy: "3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d",
+ events: 33,
+ bits: 184,
+ bitsPerEvent: 5.59,
+ strength: 'easily cracked - Repeats like "abcabcabc" are only slightly harder to guess than "abc"',
+ },
];
// use entropy
page.evaluate(function() {
if ("filtered" in expected && actual.indexOf(expected.filtered) == -1) {
return "Filtered value not in feedback";
}
- if (actual.indexOf(expected.type) == -1) {
+ if ("type" in expected && actual.indexOf(expected.type) == -1) {
return "Entropy type not in feedback";
}
- if (actual.indexOf(expected.events) == -1) {
+ if ("events" in expected && actual.indexOf(expected.events) == -1) {
return "Event count not in feedback";
}
- if (actual.indexOf(expected.bits) == -1) {
+ if ("bits" in expected && actual.indexOf(expected.bits) == -1) {
return "Bit count not in feedback";
}
- if (actual.indexOf(expected.strength) == -1) {
+ if ("strength" in expected && actual.indexOf(expected.strength) == -1) {
return "Strength not in feedback";
}
+ if ("bitsPerEvent" in expected && actual.indexOf(expected.bitsPerEvent) == -1) {
+ return "bitsPerEvent not in feedback";
+ }
return false;
}
test = tests[i];
return $(".phrase").val();
});
// Check mnemonic length
- if (test.words == 0) {
+ if ("words" in test && test.words == 0) {
if (mnemonic.length > 0) {
console.log("Mnemonic length for " + test.strength + " strength is not " + test.words);
console.log("Entropy: " + test.entropy);
fail();
}
}
- else {
+ else if ("words" in test) {
if (mnemonic.split(" ").length != test.words) {
console.log("Mnemonic length for " + test.strength + " strength is not " + test.words);
console.log("Entropy: " + test.entropy);
});
},
+// Github issue 35
+// https://github.com/iancoleman/bip39/issues/35
+// QR Code support
+function() {
+page.open(url, function(status) {
+ // use entropy
+ page.evaluate(function() {
+ $(".generate").click();
+ });
+ waitForGenerate(function() {
+ var p = page.evaluate(function() {
+ // get position of mnemonic element
+ return $(".phrase").offset();
+ });
+ p.top = Math.ceil(p.top);
+ p.left = Math.ceil(p.left);
+ // check the qr code shows
+ page.sendEvent("mousemove", p.left+4, p.top+4);
+ var qrShowing = page.evaluate(function() {
+ return $(".qr-container").find("canvas").length > 0;
+ });
+ if (!qrShowing) {
+ console.log("QR Code does not show");
+ fail();
+ }
+ // check the qr code hides
+ page.sendEvent("mousemove", p.left-4, p.top-4);
+ var qrHidden = page.evaluate(function() {
+ return $(".qr-container").find("canvas").length == 0;
+ });
+ if (!qrHidden) {
+ console.log("QR Code does not hide");
+ fail();
+ }
+ next();
+ });
+});
+},
+
+// BIP44 account extendend private key is shown
+// github issue 37 - compatibility with electrum
+function() {
+page.open(url, function(status) {
+ // set the phrase
+ var expected = "xprv9yzrnt4zWVJUr1k2VxSPy9ettKz5PpeDMgaVG7UKedhqnw1tDkxP2UyYNhuNSumk2sLE5ctwKZs9vwjsq3e1vo9egCK6CzP87H2cVYXpfwQ";
+ page.evaluate(function() {
+ $(".phrase").val("abandon abandon ability");
+ $(".phrase").trigger("input");
+ });
+ // check the BIP44 account extended private key
+ waitForGenerate(function() {
+ var actual = page.evaluate(function() {
+ return $(".account-xprv").val();
+ });
+ if (actual != expected) {
+ console.log("BIP44 account extended private key is incorrect");
+ console.log("Expected: " + expected);
+ console.log("Actual: " + actual);
+ fail();
+ }
+ next();
+ });
+});
+},
+
+// BIP44 account extendend public key is shown
+// github issue 37 - compatibility with electrum
+function() {
+page.open(url, function(status) {
+ // set the phrase
+ var expected = "xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf";
+ page.evaluate(function() {
+ $(".phrase").val("abandon abandon ability");
+ $(".phrase").trigger("input");
+ });
+ // check the BIP44 account extended public key
+ waitForGenerate(function() {
+ var actual = page.evaluate(function() {
+ return $(".account-xpub").val();
+ });
+ if (actual != expected) {
+ console.log("BIP44 account extended public key is incorrect");
+ console.log("Expected: " + expected);
+ console.log("Actual: " + actual);
+ fail();
+ }
+ next();
+ });
+});
+},
+
+// github issue 40
+// BIP32 root key can be set as an xpub
+function() {
+page.open(url, function(status) {
+ // set the phrase
+ page.evaluate(function() {
+ // set xpub for account 0 of bip44 for 'abandon abandon ability'
+ var bip44AccountXpub = "xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf";
+ $("#root-key").val(bip44AccountXpub);
+ $("#root-key").trigger("input");
+ });
+ waitForFeedback(function() {
+ page.evaluate(function() {
+ // Use bip32 tab
+ $("#bip32-tab a").click();
+ });
+ waitForGenerate(function() {
+ page.evaluate(function() {
+ // derive external addresses for this xpub
+ var firstAccountDerivationPath = "m/0";
+ $("#bip32-path").val(firstAccountDerivationPath);
+ $("#bip32-path").trigger("input");
+ });
+ waitForGenerate(function() {
+ // check the addresses are generated
+ var expected = "1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug";
+ var actual = page.evaluate(function() {
+ return $(".address:first").text();
+ });
+ if (actual != expected) {
+ console.log("xpub key does not generate addresses in table");
+ console.log("Expected: " + expected);
+ console.log("Actual: " + actual);
+ fail();
+ }
+ // check the xprv key is not set
+ var expected = "NA";
+ var actual = page.evaluate(function() {
+ return $(".extended-priv-key").val();
+ });
+ if (actual != expected) {
+ console.log("xpub key as root shows derived bip32 xprv key");
+ console.log("Expected: " + expected);
+ console.log("Actual: " + actual);
+ fail();
+ }
+ // check the private key is not set
+ var expected = "NA";
+ var actual = page.evaluate(function() {
+ return $(".privkey:first").text();
+ });
+ if (actual != expected) {
+ console.log("xpub key generates private key in addresses table");
+ console.log("Expected: " + expected);
+ console.log("Actual: " + actual);
+ fail();
+ }
+ next();
+ });
+ });
+ });
+});
+},
+
+// github issue 40
+// xpub for bip32 root key will not work with hardened derivation paths
+function() {
+page.open(url, function(status) {
+ // set the phrase
+ page.evaluate(function() {
+ // set xpub for account 0 of bip44 for 'abandon abandon ability'
+ var bip44AccountXpub = "xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf";
+ $("#root-key").val(bip44AccountXpub);
+ $("#root-key").trigger("input");
+ });
+ waitForFeedback(function() {
+ // Check feedback is correct
+ var expected = "Hardened derivation path is invalid with xpub key";
+ var actual = page.evaluate(function() {
+ return $(".feedback").text();
+ });
+ if (actual != expected) {
+ console.log("xpub key with hardened derivation path does not show feedback");
+ console.log("Expected: " + expected);
+ console.log("Actual: " + actual);
+ fail();
+ }
+ // Check no addresses are shown
+ var expected = 0;
+ var actual = page.evaluate(function() {
+ return $(".addresses tr").length;
+ });
+ if (actual != expected) {
+ console.log("addresses still show after setting xpub key with hardened derivation path");
+ console.log("Expected: " + expected);
+ console.log("Actual: " + actual);
+ fail();
+ }
+ next();
+ });
+});
+},
+
// If you wish to add more tests, do so here...