From bf96267f89d18f278e78cf02c97ab1e7513fb871 Mon Sep 17 00:00:00 2001 From: Ian Coleman Date: Thu, 1 Oct 2020 23:44:38 +0000 Subject: Remove bias from entropy in base 6 and base 10 --- tests/spec/tests.js | 96 ++++++++++++++++++++++++++++------------------------- 1 file changed, 51 insertions(+), 45 deletions(-) (limited to 'tests') diff --git a/tests/spec/tests.js b/tests/spec/tests.js index 14cdb8e..92df64a 100644 --- a/tests/spec/tests.js +++ b/tests/spec/tests.js @@ -3120,7 +3120,7 @@ it("Shows the number of bits of entropy for 4 bits of binary", function(done) { testEntropyBits(done, "0000", "4"); }); it("Shows the number of bits of entropy for 1 character of base 6 (dice)", function(done) { - // 6 in card is 0 in base 6, 0 in base 6 is 2.6 bits (rounded down to 2 bits) + // 6 in card is 0 in base 6, 0 is mapped to 00 by entropy.js testEntropyBits(done, "6", "2"); }); it("Shows the number of bits of entropy for 1 character of base 10 with 3 bits", function(done) { @@ -3128,13 +3128,15 @@ it("Shows the number of bits of entropy for 1 character of base 10 with 3 bits", testEntropyBits(done, "7", "3"); }); it("Shows the number of bits of entropy for 1 character of base 10 with 4 bis", function(done) { - testEntropyBits(done, "8", "4"); + // 8 in base 10 is mapped to 0 by entropy.js + testEntropyBits(done, "8", "1"); }); it("Shows the number of bits of entropy for 1 character of hex", function(done) { testEntropyBits(done, "F", "4"); }); it("Shows the number of bits of entropy for 2 characters of base 10", function(done) { - testEntropyBits(done, "29", "6"); + // 2 as base 10 is binary 010, 9 is mapped to binary 1 by entropy.js + testEntropyBits(done, "29", "4"); }); it("Shows the number of bits of entropy for 2 characters of hex", function(done) { testEntropyBits(done, "0A", "8"); @@ -3159,17 +3161,17 @@ it("Shows the number of bits of entropy for 4 characters of hex with leading zer testEntropyBits(done, "000A", "16"); }); it("Shows the number of bits of entropy for 4 characters of base 6", function(done) { - testEntropyBits(done, "5555", "11"); + // 5 in base 6 is mapped to binary 1 + testEntropyBits(done, "5555", "4"); }); it("Shows the number of bits of entropy for 4 characters of base 6 dice", function(done) { // uses dice, so entropy is actually 0000 in base 6, which is 4 lots of - // 2.58 bits, which is 10.32 bits (rounded down to 10 bits) - testEntropyBits(done, "6666", "10"); + // binary 00 + testEntropyBits(done, "6666", "8"); }); it("Shows the number of bits of entropy for 4 charactes of base 10", function(done) { - // Uses base 10, which is 4 lots of 3.32 bits, which is 13.3 bits (rounded - // down to 13) - testEntropyBits(done, "2227", "13"); + // 2 in base 10 is binary 010 and 7 is binary 111 so is 4 events of 3 bits + testEntropyBits(done, "2227", "12"); }); it("Shows the number of bits of entropy for 4 characters of hex with 2 leading zeros", function(done) { testEntropyBits(done, "222F", "16"); @@ -3178,13 +3180,16 @@ it("Shows the number of bits of entropy for 4 characters of hex starting with F" testEntropyBits(done, "FFFF", "16"); }); it("Shows the number of bits of entropy for 10 characters of base 10", function(done) { - // 10 events at 3.32 bits per event - testEntropyBits(done, "0000101017", "33"); + // 10 events with 3 bits for each event + testEntropyBits(done, "0000101017", "30"); +}); +it("Shows the number of bits of entropy for 10 characters of base 10 account for bias", function(done) { + // 9 events with 3 bits per event and 1 event with 1 bit per event + testEntropyBits(done, "0000101018", "28"); }); it("Shows the number of bits of entropy for a full deck of cards", function(done) { - // cards are not replaced, so a full deck is not 52^52 entropy which is 296 - // bits, it's 52!, which is 225 bits - testEntropyBits(done, "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks", "225"); + // removing bias is 32*5 + 16*4 + 4*2 + testEntropyBits(done, "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks", "232"); }); it("Shows details about the entered entropy", function(done) { @@ -3310,7 +3315,7 @@ it("Shows details about the entered entropy", function(done) { entropy: "7d", type: "card", events: "1", - bits: "4", + bits: "5", words: 0, strength: "less than a second", } @@ -3322,7 +3327,7 @@ it("Shows details about the entered entropy", function(done) { entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks", type: "card (full deck)", events: "52", - bits: "225", + bits: "232", words: 21, strength: "centuries", } @@ -3334,7 +3339,7 @@ it("Shows details about the entered entropy", function(done) { entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks3d", type: "card (full deck, 1 duplicate: 3d)", events: "53", - bits: "254", + bits: "237", words: 21, strength: "centuries", } @@ -3346,7 +3351,7 @@ it("Shows details about the entered entropy", function(done) { entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d", type: "card (2 duplicates: 3d 4d, 1 missing: KS)", events: "53", - bits: "254", + bits: "240", words: 21, strength: "centuries", } @@ -3358,8 +3363,8 @@ it("Shows details about the entered entropy", function(done) { entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqs3d4d5d6d", type: "card (4 duplicates: 3d 4d 5d..., 1 missing: KS)", events: "55", - bits: "264", - words: 24, + bits: "250", + words: 21, strength: "centuries", } ); @@ -3367,13 +3372,12 @@ it("Shows details about the entered entropy", function(done) { it("Shows details about the entered entropy", function(done) { testEntropyFeedback(done, // Next test was throwing uncaught error in zxcvbn - // Also tests 451 bits, ie Math.log2(52!)*2 = 225.58 * 2 { entropy: "ac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsksac2c3c4c5c6c7c8c9ctcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks", type: "card (full deck, 52 duplicates: ac 2c 3c...)", events: "104", - bits: "499", - words: 45, + bits: "464", + words: 42, strength: "centuries", } ); @@ -3385,7 +3389,7 @@ it("Shows details about the entered entropy", function(done) { entropy: "asAS", type: "card (1 duplicate: AS)", events: "2", - bits: "9", + bits: "8", words: 0, strength: "less than a second", } @@ -3397,7 +3401,7 @@ it("Shows details about the entered entropy", function(done) { entropy: "ASas", type: "card (1 duplicate: as)", events: "2", - bits: "9", + bits: "8", words: 0, strength: "less than a second", } @@ -3410,8 +3414,8 @@ it("Shows details about the entered entropy", function(done) { entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d5d6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks", type: "card (1 missing: 9C)", events: "51", - bits: "221", - words: 18, + bits: "227", + words: 21, strength: "centuries", } ); @@ -3422,7 +3426,7 @@ it("Shows details about the entered entropy", function(done) { entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d 6d7d8d9dtdjdqdkdah2h3h4h5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks", type: "card (2 missing: 9C 5D)", events: "50", - bits: "216", + bits: "222", words: 18, strength: "centuries", } @@ -3434,7 +3438,7 @@ it("Shows details about the entered entropy", function(done) { entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d 6d7d8d9dtdjd kdah2h3h 5h6h7h8h9hthjhqhkhas2s3s4s5s6s7s8s9stsjsqsks", type: "card (4 missing: 9C 5D QD...)", events: "48", - bits: "208", + bits: "212", words: 18, strength: "centuries", } @@ -3447,20 +3451,21 @@ it("Shows details about the entered entropy", function(done) { entropy: "ac2c3c4c5c6c7c8c tcjcqckcad2d3d4d 6d 8d9d jd kdah2h3h 5h6h7h8h9hthjhqhkh 2s3s4s5s6s7s8s9stsjsqsks", type: "card", events: "45", - bits: "195", + bits: "198", words: 18, strength: "centuries", } ); }); it("Shows details about the entered entropy", function(done) { + // multiple decks does not affect the bits per event + // since the bits are hardcoded in entropy.js testEntropyFeedback(done, - // Multiple decks of cards increases bits per event { entropy: "3d", events: "1", - bits: "4", - bitsPerEvent: "4.34", + bits: "5", + bitsPerEvent: "4.46", } ); }); @@ -3469,8 +3474,8 @@ it("Shows details about the entered entropy", function(done) { { entropy: "3d3d", events: "2", - bits: "9", - bitsPerEvent: "4.80", + bits: "10", + bitsPerEvent: "4.46", } ); }); @@ -3480,7 +3485,7 @@ it("Shows details about the entered entropy", function(done) { entropy: "3d3d3d", events: "3", bits: "15", - bitsPerEvent: "5.01", + bitsPerEvent: "4.46", } ); }); @@ -3490,7 +3495,7 @@ it("Shows details about the entered entropy", function(done) { entropy: "3d3d3d3d", events: "4", bits: "20", - bitsPerEvent: "5.14", + bitsPerEvent: "4.46", } ); }); @@ -3499,8 +3504,8 @@ it("Shows details about the entered entropy", function(done) { { entropy: "3d3d3d3d3d", events: "5", - bits: "26", - bitsPerEvent: "5.22", + bits: "25", + bitsPerEvent: "4.46", } ); }); @@ -3509,8 +3514,8 @@ it("Shows details about the entered entropy", function(done) { { entropy: "3d3d3d3d3d3d", events: "6", - bits: "31", - bitsPerEvent: "5.28", + bits: "30", + bitsPerEvent: "4.46", } ); }); @@ -3519,8 +3524,8 @@ it("Shows details about the entered entropy", function(done) { { entropy: "3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d", events: "33", - bits: "184", - bitsPerEvent: "5.59", + bits: "165", + bitsPerEvent: "4.46", strength: 'less than a second - Repeats like "abcabcabc" are only slightly harder to guess than "abc"', } ); @@ -3571,10 +3576,11 @@ it('Converts very long entropy to very long mnemonics', function(done) { // https://bip32jp.github.io/english/index.html // NOTES: // Is incompatible with: +// base 6 // base 20 it('Is compatible with bip32jp.github.io', function(done) { - var entropy = "543210543210543210543210543210543210543210543210543210543210543210543210543210543210543210543210543"; - var expectedPhrase = "train then jungle barely whip fiber purpose puppy eagle cloud clump hospital robot brave balcony utility detect estate old green desk skill multiply virus"; + var entropy = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; + var expectedPhrase = "primary fetch primary fetch primary fetch primary fetch primary fetch primary fetch primary fetch primary fetch primary fetch primary fetch primary fetch primary foster"; driver.findElement(By.css('.use-entropy')) .click(); driver.findElement(By.css('.entropy')) -- cgit v1.2.3