catch (e) {
return e.message;
}
- // Leading zeros for card entropy as binary string
+ // Leading zeros for card entropy as binary string.
+ // Card entropy is hashed so 2c does not produce leading zeros.
try {
- e = Entropy.fromString("2c");
- if (e.binaryStr != "00001") {
+ e = Entropy.fromString("4c");
+ if (e.binaryStr != "0001") {
return "Card entropy as binary has leading zeros";
}
}
// [ cards, binary ]
try {
var cards = [
- [ "ac", "00000" ],
- [ "acqs", "00000110001" ],
- [ "acks", "00000110010" ],
- [ "2cac", "00000110011" ],
- [ "2c", "00001" ],
- [ "3d", "01111" ],
- [ "4h", "11101" ],
- [ "5s", "101011" ],
- [ "6c", "00101" ],
- [ "7d", "10011" ],
- [ "8h", "100001" ],
- [ "9s", "101111" ],
- [ "tc", "01001" ],
- [ "jd", "10111" ],
- [ "qh", "100101" ],
- [ "ks", "110011" ],
- [ "ks2c", "101000101001" ],
- [ "KS2C", "101000101001" ],
+ [ "ac", "0100" ],
+ [ "acqs", "10111101" ],
+ [ "acks", "11110000" ],
+ [ "2cac", "11000010" ],
+ [ "2c", "1000" ],
+ [ "3d", "1111" ],
+ [ "4h", "0011" ],
+ [ "5s", "1001" ],
+ [ "6c", "1011" ],
+ [ "7d", "1101" ],
+ [ "8h", "1011" ],
+ [ "9s", "1010" ],
+ [ "tc", "1101" ],
+ [ "jd", "1101" ],
+ [ "qh", "1100" ],
+ [ "ks", "1111" ],
+ [ "ks2c", "10000001" ],
+ [ "KS2C", "10000001" ],
];
for (var i=0; i<cards.length; i++) {
var card = cards[i][0];
e = Entropy.fromString(card);
console.log(e.binary + " " + result);
if (e.binaryStr !== result) {
- return "card entropy not parsed correctly: " + result + " != " + e.binaryStr;
+ return "card entropy " + card + " not parsed correctly: " + result + " != " + e.binaryStr;
}
}
}
// use entropy
page.evaluate(function() {
$(".use-entropy").prop("checked", true).trigger("change");
+ $(".mnemonic-length").val("raw");
$(".entropy").val("00000000 00000000 00000000 00000000").trigger("input");
});
// check the mnemonic is set and address is correct
entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks3d",
type: "card (full deck, 1 duplicate: 3d)",
events: 53,
- bits: 231,
+ bits: 254,
words: 21,
strength: "extremely strong",
},
entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d",
type: "card (2 duplicates: 3d 4d, 1 missing: KS)",
events: 53,
- bits: 231,
+ bits: 254,
words: 21,
strength: "extremely strong",
},
entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d5d6d",
type: "card (4 duplicates: 3d 4d 5d..., 1 missing: KS)",
events: 53,
- bits: 242,
- words: 21,
+ bits: 264,
+ words: 24,
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: 451,
- words: 42,
+ bits: 499,
+ words: 45,
strength: "extremely strong",
},
// Case insensitivity to duplicate cards
entropy: "asAS",
type: "card (1 duplicate: AS)",
events: 2,
- bits: 12,
+ bits: 9,
words: 0,
strength: "extremely weak",
},
entropy: "ASas",
type: "card (1 duplicate: as)",
events: 2,
- bits: 12,
+ bits: 9,
words: 0,
strength: "extremely weak",
},
entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks",
type: "card (1 missing: 9C)",
events: 51,
- bits: 225,
- words: 21,
+ bits: 221,
+ words: 18,
strength: "extremely strong",
},
{
entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d 6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks",
type: "card (2 missing: 9C 5D)",
events: 50,
- bits: 224,
- words: 21,
+ bits: 216,
+ words: 18,
strength: "extremely strong",
},
{
entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d 6d7d8d9dtdjd kdah2h3h 5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks",
type: "card (4 missing: 9C 5D QD...)",
events: 48,
- bits: 220,
+ bits: 208,
words: 18,
strength: "extremely strong",
},
entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d 6d 8d9d jd kdah2h3h 5h6h7h8h9hthjhqhkh 2s3s4s5s6s7s8s9stsjsqsks",
type: "card",
events: 45,
- bits: 213,
+ bits: 195,
words: 18,
strength: "extremely strong",
},
// use entropy
page.evaluate(function() {
$(".use-entropy").prop("checked", true).trigger("change");
+ $(".mnemonic-length").val("raw");
});
var nextTest = function runNextTest(i) {
function getFeedbackError(expected, actual) {
if (test.words == 0) {
if (mnemonic.length > 0) {
console.log("Mnemonic length for " + test.strength + " strength is not " + test.words);
+ console.log("Entropy: " + test.entropy);
console.log("Mnemonic: " + mnemonic);
fail();
}
else {
if (mnemonic.split(" ").length != test.words) {
console.log("Mnemonic length for " + test.strength + " strength is not " + test.words);
+ console.log("Entropy: " + test.entropy);
console.log("Mnemonic: " + mnemonic);
fail();
}
// use entropy
page.evaluate(function() {
$(".use-entropy").prop("checked", true).trigger("change");
+ $(".mnemonic-length").val("raw");
var entropy = "00000000 00000000 00000000 00000000";
entropy += "11111111 11111111 11111111 1111"; // Missing last byte
$(".entropy").val(entropy).trigger("input");
// use entropy
page.evaluate(function() {
$(".use-entropy").prop("checked", true).trigger("change");
+ $(".mnemonic-length").val("raw");
var entropy = "";
// Generate a very long entropy string
for (var i=0; i<33; i++) {
// use entropy
page.evaluate(function() {
$(".use-entropy").prop("checked", true).trigger("change");
+ $(".mnemonic-length").val("raw");
var entropy = "543210543210543210543210543210543210543210543210543210543210543210543210543210543210543210543210543";
$(".entropy").val(entropy).trigger("input");
});
});
},
+// Github issue 33
+// https://github.com/iancoleman/bip39/issues/33
+// Final cards should contribute entropy
+function() {
+page.open(url, function(status) {
+ // use entropy
+ page.evaluate(function() {
+ $(".use-entropy").prop("checked", true).trigger("change");
+ $(".mnemonic-length").val("raw");
+ $(".entropy").val("7S 9H 9S QH 8C KS AS 7D 7C QD 4S 4D TC 2D 5S JS 3D 8S 8H 4C 3C AC 3S QC 9C JC 7H AD TD JD 6D KH 5C QS 2S 6S 6H JH KD 9D-6C TS TH 4H KC 5H 2H AH 2C 8D 3H 5D").trigger("input");
+ });
+ // get the mnemonic
+ waitForGenerate(function() {
+ var originalPhrase = page.evaluate(function() {
+ return $(".phrase").val();
+ });
+ // Set the last 12 cards to be AS
+ page.evaluate(function() {
+ $(".addresses").empty();
+ $(".entropy").val("7S 9H 9S QH 8C KS AS 7D 7C QD 4S 4D TC 2D 5S JS 3D 8S 8H 4C 3C AC 3S QC 9C JC 7H AD TD JD 6D KH 5C QS 2S 6S 6H JH KD 9D-AS AS AS AS AS AS AS AS AS AS AS AS").trigger("input");
+ });
+ // get the new mnemonic
+ waitForGenerate(function() {
+ var newPhrase = page.evaluate(function() {
+ return $(".phrase").val();
+ });
+ // check the phrase has changed
+ if (newPhrase == originalPhrase) {
+ console.log("Changing last 12 cards does not change mnemonic");
+ console.log("Original:");
+ console.log(originalPhrase);
+ console.log("New:");
+ console.log(newPhrase);
+ fail();
+ }
+ next();
+ });
+ });
+});
+},
+
+
// If you wish to add more tests, do so here...
// Here is a blank test template