mirror of
https://github.com/OneKeyHQ/bip39.git
synced 2026-04-06 02:43:49 +00:00
Entropy with more than 4 decks can be calculated
This commit is contained in:
@@ -18467,7 +18467,12 @@ window.Entropy = new (function() {
|
||||
}
|
||||
// Work out the total number of bits for this many decks
|
||||
// See http://crypto.stackexchange.com/q/41886
|
||||
var gainedBits = Math.log2(factorial(52 * numberOfDecks));
|
||||
var gainedBits = 0;
|
||||
// Equivalent of Math.log2(factorial(52*numberOfDecks))
|
||||
// which becomes infinity for numberOfDecks > 4
|
||||
for (var i=1; i<=52*numberOfDecks; i++) {
|
||||
gainedBits = gainedBits + Math.log2(i);
|
||||
}
|
||||
var lostBits = 52 * Math.log2(factorial(numberOfDecks));
|
||||
var maxBits = gainedBits - lostBits;
|
||||
// Convert the drawn cards to a binary representation.
|
||||
|
||||
@@ -263,7 +263,12 @@ window.Entropy = new (function() {
|
||||
}
|
||||
// Work out the total number of bits for this many decks
|
||||
// See http://crypto.stackexchange.com/q/41886
|
||||
var gainedBits = Math.log2(factorial(52 * numberOfDecks));
|
||||
var gainedBits = 0;
|
||||
// Equivalent of Math.log2(factorial(52*numberOfDecks))
|
||||
// which becomes infinity for numberOfDecks > 4
|
||||
for (var i=1; i<=52*numberOfDecks; i++) {
|
||||
gainedBits = gainedBits + Math.log2(i);
|
||||
}
|
||||
var lostBits = 52 * Math.log2(factorial(numberOfDecks));
|
||||
var maxBits = gainedBits - lostBits;
|
||||
// Convert the drawn cards to a binary representation.
|
||||
|
||||
59
tests.js
59
tests.js
@@ -2726,6 +2726,50 @@ page.open(url, function(status) {
|
||||
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() {
|
||||
@@ -2737,18 +2781,21 @@ page.open(url, function(status) {
|
||||
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];
|
||||
@@ -2762,7 +2809,7 @@ page.open(url, function(status) {
|
||||
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);
|
||||
@@ -2770,7 +2817,7 @@ page.open(url, function(status) {
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user