]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/BIP39.git/blobdiff - bip39-standalone.html
xpub key can be used as bip32 root key
[perso/Immae/Projets/Cryptomonnaies/BIP39.git] / bip39-standalone.html
index 45380a339fb1c8a600e536416a38e1c4b18602ff..367d9a2fdc1d923728b3cf88e45a1c2f18a0f0c6 100644 (file)
             .qr-image {
                 margin: 5px;
             }
-            .qr-hint {
+            .qr-hint,
+            .qr-warning {
                 padding: 2px;
+                max-width: 150px;
+            }
+            .more-info {
+                cursor: help;
+                border-bottom: 1px dashed #000;
+                text-decoration: none;
             }
         </style>
     </head>
                                     <div class="row">
                                         <label class="col-sm-3 control-label" data-translate>Word Count</label>
                                         <div class="word-count col-sm-3 form-control-static"></div>
-                                        <label class="col-sm-3 control-label" data-translate>Total Bits</label>
+                                        <label class="col-sm-3 control-label" data-translate><span class="more-info" data-translate-title title="Total bits of entropy may be less than indicated if any entropy event uses a weak source.">Total Bits</span></label>
                                         <div class="bits col-sm-3 form-control-static"></div>
                                     </div>
                                     <label class="col-sm-3 control-label" data-translate>Filtered Entropy</label>
                                     <label class="col-sm-2 control-label">
                                     </label>
                                     <div class="col-sm-10">
-                                        <p data-translate>The account extendend keys can be used for importing to most BIP44 compatible wallets, such as mycelium or electrum.</p>
+                                        <p data-translate>The account extended keys can be used for importing to most BIP44 compatible wallets, such as mycelium or electrum.</p>
                                     </div>
                                 </div>
                                 <div class="form-group">
                     <p>
                         <a href="https://bitcointalk.org/index.php?topic=311000.msg3345309#msg3345309" target="_blank" data-translate>You are not a good source of entropy.</a>
                     </p>
+                    <h3 data-translate>License</h3>
+                    <p>
+                    <span data-translate-html>Please refer to <a href="https://github.com/iancoleman/bip39/blob/master/LICENSE" target="_blank">the software license</a> for more detail.
+                    </span>
+                    </p>
+                    <p data-translate>The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software.</p>
                 </div>
             </div>
 
         </div>
 
         <div class="qr-container hidden">
-            <div class="qr-hint bg-primary" data-translate>Click field to hide QR</div>
-            <div class="qr-hint bg-primary hidden" data-translate>Click field to show QR</div>
-            <div class="qr-image"></div>
+            <div class="qr-hint bg-primary hidden" data-translate>Click field to hide QR</div>
+            <div class="qr-hint bg-primary" data-translate>Click field to show QR</div>
+            <div class="qr-hider hidden">
+                <div class="qr-image"></div>
+                <div class="qr-warning bg-primary" data-translate>Caution: Scanner may keep history</div>
+            </div>
         </div>
 
         <div class="feedback-container">
@@ -14702,7 +14718,8 @@ sjcl.hash.sha256.prototype = {
 //
 //   <div data-translate>Test</div>
 //   <div data-translate-html><em>keep em tag</em></div>
-//   <input data-translate-placeholder placeholder="Example text">
+//   <input data-translate-placeholder placeholder="Example placeholder">
+//   <span data-translate-title title="Example title"></span>
 //
 // Obtain all the phrases to be translated via js debug console:
 //
@@ -14717,7 +14734,8 @@ sjcl.hash.sha256.prototype = {
 //   Translate.loadForeignPhrases("es", {
 //       "Test": "Test in Spanish",
 //       "<em>keep em tag</em>": "<em>keep em tag in Spanish</em>",
-//       "Example text": "Example text in Spanish"
+//       "Example placeholder": "Example placeholder in Spanish"
+//       "Example title": "Example title in Spanish"
 //   });
 //
 // In your UI put a listener for clicking on the Spanish button:
@@ -14768,10 +14786,21 @@ Translate = new (function() {
         },
     }
 
+    var title = {
+        selector: "[data-translate-title]",
+        getKey: function() {
+            return this.getAttribute("title").trim().replace(/\s+/g, " ");
+        },
+        setPhrase: function(p) {
+            this.setAttribute("title", p);
+        },
+    }
+
     // Get elements to be translated
     var allEls = getEls(text)
         .concat(getEls(html))
-        .concat(getEls(placeholder));
+        .concat(getEls(placeholder))
+        .concat(getEls(title));
 
     // Provides access to phrases from a non-default language.
     // See phrases_en.js for example usage.
@@ -18624,7 +18653,7 @@ window.Entropy = new (function() {
     var showAddress = true;
     var showPubKey = true;
     var showPrivKey = true;
-    var showQr = true;
+    var showQr = false;
 
     var entropyChangeTimeoutEvent = null;
     var phraseChangeTimeoutEvent = null;
@@ -18678,6 +18707,7 @@ window.Entropy = new (function() {
     DOM.privateKeyToggle = $(".private-key-toggle");
     DOM.languages = $(".languages a");
     DOM.qrContainer = $(".qr-container");
+    DOM.qrHider = DOM.qrContainer.find(".qr-hider");
     DOM.qrImage = DOM.qrContainer.find(".qr-image");
     DOM.qrHint = DOM.qrContainer.find(".qr-hint");
     DOM.showQrEls = $("[data-show-qr]");
@@ -18838,11 +18868,11 @@ window.Entropy = new (function() {
         // Calculate and display
         calcBip32RootKeyFromBase58(rootKeyBase58);
         calcForDerivationPath();
-        hidePending();
     }
 
     function calcForDerivationPath() {
         showPending();
+        clearAddressesList();
         hideValidationError();
         // Get the derivation path
         var derivationPath = getDerivationPath();
@@ -18944,7 +18974,12 @@ window.Entropy = new (function() {
                 continue;
             }
             var hardened = bit[bit.length-1] == "'";
-            if (hardened) {
+            var isPriv = "privKey" in extendedKey;
+            var invalidDerivationPath = hardened && !isPriv;
+            if (invalidDerivationPath) {
+                extendedKey = null;
+            }
+            else if (hardened) {
                 extendedKey = extendedKey.deriveHardened(index);
             }
             else {
@@ -19063,6 +19098,12 @@ window.Entropy = new (function() {
                 }
             }
         }
+        // Check no hardened derivation path when using xpub keys
+        var hardened = path.indexOf("'") > -1;
+        var isXpubkey = !("privKey" in bip32RootKey);
+        if (hardened && isXpubkey) {
+            return "Hardened derivation path is invalid with xpub key";
+        }
         return false;
     }
 
@@ -19089,7 +19130,11 @@ window.Entropy = new (function() {
         DOM.seed.val(seed);
         var rootKey = bip32RootKey.toBase58();
         DOM.rootKey.val(rootKey);
-        var extendedPrivKey = bip32ExtendedKey.toBase58();
+        var xprvkeyB58 = "NA";
+        if (bip32ExtendedKey.privKey) {
+            xprvkeyB58 = bip32ExtendedKey.toBase58();
+        }
+        var extendedPrivKey = xprvkeyB58;
         DOM.extendedPrivKey.val(extendedPrivKey);
         var extendedPubKey = bip32ExtendedKey.toBase58(false);
         DOM.extendedPubKey.val(extendedPubKey);
@@ -19123,7 +19168,10 @@ window.Entropy = new (function() {
                     key = bip32ExtendedKey.derive(index);
                 }
                 var address = key.getAddress().toString();
-                var privkey = key.privKey.toWIF(network);
+                var privkey = "NA";
+                if (key.privKey) {
+                    privkey = key.privKey.toWIF(network);
+                }
                 var pubkey = key.pubKey.toHex();
                 var indexText = getDerivationPath() + "/" + index;
                 if (useHardenedAddresses) {
@@ -19557,7 +19605,10 @@ window.Entropy = new (function() {
             var size = 130;
             DOM.qrImage.qrcode({width: size, height: size, text: content});
             if (!showQr) {
-                DOM.qrImage.addClass("hidden");
+                DOM.qrHider.addClass("hidden");
+            }
+            else {
+                DOM.qrHider.removeClass("hidden");
             }
             DOM.qrContainer.removeClass("hidden");
         }
@@ -19570,7 +19621,7 @@ window.Entropy = new (function() {
 
     function toggleQr() {
         showQr = !showQr;
-        DOM.qrImage.toggleClass("hidden");
+        DOM.qrHider.toggleClass("hidden");
         DOM.qrHint.toggleClass("hidden");
     }