]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/BIP39.git/blobdiff - tests.js
xpub key can be used as bip32 root key
[perso/Immae/Projets/Cryptomonnaies/BIP39.git] / tests.js
index 4f8f60fc47d5a373d4bf779ffc2badcbc350dbf1..19a371272c705a51c786a8ca10495ae57580c0cc 100644 (file)
--- a/tests.js
+++ b/tests.js
@@ -6,6 +6,11 @@ var page = require('webpage').create();
 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();
@@ -2726,6 +2731,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 +2786,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 +2814,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 +2822,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);
@@ -2995,6 +3047,200 @@ page.open(url, function(status) {
 });
 },
 
+// 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...