diff options
-rw-r--r-- | bip39-standalone.html | 170 |
1 files changed, 96 insertions, 74 deletions
diff --git a/bip39-standalone.html b/bip39-standalone.html index b7471d0..8094f7c 100644 --- a/bip39-standalone.html +++ b/bip39-standalone.html | |||
@@ -47,7 +47,7 @@ | |||
47 | .phrase { | 47 | .phrase { |
48 | word-break: keep-all; | 48 | word-break: keep-all; |
49 | } | 49 | } |
50 | .strength { | 50 | .generate-container .strength { |
51 | /* override mobile width from bootstrap */ | 51 | /* override mobile width from bootstrap */ |
52 | width: auto!important; | 52 | width: auto!important; |
53 | display: inline-block; | 53 | display: inline-block; |
@@ -58,6 +58,29 @@ | |||
58 | .monospace { | 58 | .monospace { |
59 | font-family: monospace; | 59 | font-family: monospace; |
60 | } | 60 | } |
61 | .entropy-container .filtered, | ||
62 | .entropy-container .binary { | ||
63 | word-wrap: break-word; | ||
64 | } | ||
65 | .entropy-container li { | ||
66 | padding-bottom: 5px; | ||
67 | } | ||
68 | .card-suit { | ||
69 | font-size: 19px; | ||
70 | line-height: 0; | ||
71 | } | ||
72 | .card-suit.club { | ||
73 | color: #009F00; | ||
74 | } | ||
75 | .card-suit.diamond { | ||
76 | color: #3D5DC4; | ||
77 | } | ||
78 | .card-suit.heart { | ||
79 | color: #F00; | ||
80 | } | ||
81 | .card-suit.spade { | ||
82 | color: #000; | ||
83 | } | ||
61 | </style> | 84 | </style> |
62 | </head> | 85 | </head> |
63 | <body> | 86 | <body> |
@@ -99,58 +122,36 @@ | |||
99 | </div> | 122 | </div> |
100 | </div> | 123 | </div> |
101 | <div class="entropy-container hidden"> | 124 | <div class="entropy-container hidden"> |
102 | <div class="form-group"> | 125 | <div class="form-group text-danger"> |
103 | <label for="entropy" class="col-sm-2 control-label">Entropy</label> | 126 | <label class="col-sm-2 control-label">Warning</label> |
104 | <div class="col-sm-6"> | 127 | <div class="col-sm-10 form-control-static"> |
105 | <textarea id="entropy" rows="6" class="entropy form-control" placeholder="Accepts binary, base 6, 6-sided dice, base 10, hexadecimal, cards"></textarea> | 128 | Entropy is an advanced feature. |
106 | <span class="help-block"> | 129 | Your mnemonic may be insecure if this feature is used incorrectly. |
107 | <div class="text-danger"> | 130 | <a href="#entropy-notes">Read more</a> |
108 | This is an advanced feature. | ||
109 | Your mnemonic may be insecure if this feature is used incorrectly. | ||
110 | <a href="#entropy-notes">Read more</a> | ||
111 | </div> | ||
112 | </span> | ||
113 | </div> | ||
114 | <div class="pull-right col-sm-4"> | ||
115 | <p>Valid entropy values include:</p> | ||
116 | <ul> | ||
117 | <li>Binary: [0-1] eg 101010011</li> | ||
118 | <li>Base 6: [0-5] eg 123434014</li> | ||
119 | <li>Dice: [1-6] eg 62535634</li> | ||
120 | <li>Base 10: [0-9] eg 90834528</li> | ||
121 | <li>Hex: [0-9A-F] eg 4187a8bfd9</li> | ||
122 | <li>Card: [A2-9TJQK][CDHS] eg AHQS9DTC</li> | ||
123 | </ul> | ||
124 | </div> | 131 | </div> |
125 | </div> | 132 | </div> |
126 | <div class="entropy-feedback"> | 133 | <div class="form-group"> |
127 | <div class="form-group"> | 134 | <label for="entropy" class="col-sm-2 control-label">Entropy</label> |
128 | <label class="col-sm-2 control-label">Filtered</label> | 135 | <div class="col-sm-7"> |
129 | <div class="filtered col-sm-10 form-control-static"></div> | 136 | <textarea id="entropy" rows="2" class="entropy form-control" placeholder="Accepts binary, base 6, 6-sided dice, base 10, hexadecimal, cards"></textarea> |
130 | </div> | 137 | <label class="col-sm-3 control-label">Strength</label> |
131 | <div class="form-group"> | 138 | <div class="strength col-sm-3 form-control-static"></div> |
132 | <label class="col-sm-2 control-label">Type</label> | 139 | <label class="col-sm-3 control-label">Event Count</label> |
133 | <div class="type col-sm-10 form-control-static"></div> | 140 | <div class="event-count col-sm-3 form-control-static"></div> |
134 | </div> | 141 | <label class="col-sm-3 control-label">Entropy Type</label> |
135 | <div class="form-group"> | 142 | <div class="type col-sm-3 form-control-static"></div> |
136 | <label class="col-sm-2 control-label">Strength</label> | 143 | <label class="col-sm-3 control-label">Bits Per Event</label> |
137 | <div class="strength col-sm-10 form-control-static"></div> | 144 | <div class="bits-per-event col-sm-3 form-control-static"></div> |
138 | </div> | 145 | <label class="col-sm-3 control-label">Word Count</label> |
139 | <div class="form-group"> | 146 | <div class="word-count col-sm-3 form-control-static"></div> |
140 | <label class="col-sm-2 control-label">Event Count</label> | 147 | <label class="col-sm-3 control-label">Total Bits</label> |
141 | <div class="event-count col-sm-10 form-control-static"></div> | 148 | <div class="bits col-sm-3 form-control-static"></div> |
142 | </div> | 149 | <label class="col-sm-3 control-label">Filtered Entropy</label> |
143 | <div class="form-group"> | 150 | <div class="filtered col-sm-9 form-control-static"></div> |
144 | <label class="col-sm-2 control-label">Bits Per Event</label> | 151 | <label class="col-sm-3 control-label">Raw Binary</label> |
145 | <div class="bits-per-event col-sm-10 form-control-static"></div> | 152 | <div class="binary col-sm-9 form-control-static"></div> |
146 | </div> | 153 | <label class="col-sm-3 control-label">Mnemonic Length</label> |
147 | <div class="form-group"> | 154 | <div class="col-sm-9"> |
148 | <label class="col-sm-2 control-label">Bits</label> | ||
149 | <div class="bits col-sm-10 form-control-static"></div> | ||
150 | </div> | ||
151 | <div class="form-group"> | ||
152 | <label class="col-sm-2 control-label">Mnemonic Length</label> | ||
153 | <div class="col-sm-10"> | ||
154 | <select class="mnemonic-length form-control"> | 155 | <select class="mnemonic-length form-control"> |
155 | <option value="raw">From entropy length (3 words per 32 bits)</option> | 156 | <option value="raw">From entropy length (3 words per 32 bits)</option> |
156 | <option value="12">12 Words</option> | 157 | <option value="12">12 Words</option> |
@@ -161,6 +162,17 @@ | |||
161 | </select> | 162 | </select> |
162 | </div> | 163 | </div> |
163 | </div> | 164 | </div> |
165 | <div class="col-sm-3"> | ||
166 | <p>Valid entropy values include:</p> | ||
167 | <ul> | ||
168 | <li><strong>Binary</strong> [0-1]<br>101010011</li> | ||
169 | <li><strong>Base 6</strong> [0-5]<br>123434014</li> | ||
170 | <li><strong>Dice</strong> [1-6]<br>62535634</li> | ||
171 | <li><strong>Base 10</strong> [0-9]<br>90834528</li> | ||
172 | <li><strong>Hex</strong> [0-9A-F]<br>4187a8bfd9</li> | ||
173 | <li><strong>Card</strong> [A2-9TJQK][CDHS]<br>ahqs9dtc</li> | ||
174 | </ul> | ||
175 | </div> | ||
164 | </div> | 176 | </div> |
165 | </div> | 177 | </div> |
166 | <div class="form-group"> | 178 | <div class="form-group"> |
@@ -16387,6 +16399,7 @@ window.Entropy = new (function() { | |||
16387 | return { | 16399 | return { |
16388 | binaryStr: "", | 16400 | binaryStr: "", |
16389 | cleanStr: "", | 16401 | cleanStr: "", |
16402 | cleanHtml: "", | ||
16390 | base: base, | 16403 | base: base, |
16391 | }; | 16404 | }; |
16392 | } | 16405 | } |
@@ -16412,16 +16425,23 @@ window.Entropy = new (function() { | |||
16412 | } | 16425 | } |
16413 | // Supply a 'filtered' entropy string for display purposes | 16426 | // Supply a 'filtered' entropy string for display purposes |
16414 | var entropyClean = base.parts.join(""); | 16427 | var entropyClean = base.parts.join(""); |
16428 | var entropyHtml = base.parts.join(""); | ||
16415 | if (base.asInt == 52) { | 16429 | if (base.asInt == 52) { |
16416 | entropyClean = base.parts.join(" ").toUpperCase(); | 16430 | entropyClean = base.parts.join(" ").toUpperCase(); |
16417 | entropyClean = entropyClean.replace(/C/g, "\u2663"); | 16431 | entropyClean = entropyClean.replace(/C/g, "\u2663"); |
16418 | entropyClean = entropyClean.replace(/D/g, "\u2666"); | 16432 | entropyClean = entropyClean.replace(/D/g, "\u2666"); |
16419 | entropyClean = entropyClean.replace(/H/g, "\u2665"); | 16433 | entropyClean = entropyClean.replace(/H/g, "\u2665"); |
16420 | entropyClean = entropyClean.replace(/S/g, "\u2660"); | 16434 | entropyClean = entropyClean.replace(/S/g, "\u2660"); |
16435 | entropyHtml = base.parts.join(" ").toUpperCase(); | ||
16436 | entropyHtml = entropyHtml.replace(/C/g, "<span class='card-suit club'>\u2663</span>"); | ||
16437 | entropyHtml = entropyHtml.replace(/D/g, "<span class='card-suit diamond'>\u2666</span>"); | ||
16438 | entropyHtml = entropyHtml.replace(/H/g, "<span class='card-suit heart'>\u2665</span>"); | ||
16439 | entropyHtml = entropyHtml.replace(/S/g, "<span class='card-suit spade'>\u2660</span>"); | ||
16421 | } | 16440 | } |
16422 | var e = { | 16441 | var e = { |
16423 | binaryStr: entropyBin, | 16442 | binaryStr: entropyBin, |
16424 | cleanStr: entropyClean, | 16443 | cleanStr: entropyClean, |
16444 | cleanHtml: entropyHtml, | ||
16425 | base: base, | 16445 | base: base, |
16426 | } | 16446 | } |
16427 | return e; | 16447 | return e; |
@@ -18162,14 +18182,15 @@ exports.BigInteger = BigInteger; | |||
18162 | DOM.useEntropy = $(".use-entropy"); | 18182 | DOM.useEntropy = $(".use-entropy"); |
18163 | DOM.entropyContainer = $(".entropy-container"); | 18183 | DOM.entropyContainer = $(".entropy-container"); |
18164 | DOM.entropy = $(".entropy"); | 18184 | DOM.entropy = $(".entropy"); |
18165 | DOM.entropyFeedback = $(".entropy-feedback"); | 18185 | DOM.entropyFiltered = DOM.entropyContainer.find(".filtered"); |
18166 | DOM.entropyFiltered = DOM.entropyFeedback.find(".filtered"); | 18186 | DOM.entropyType = DOM.entropyContainer.find(".type"); |
18167 | DOM.entropyType = DOM.entropyFeedback.find(".type"); | 18187 | DOM.entropyStrength = DOM.entropyContainer.find(".strength"); |
18168 | DOM.entropyStrength = DOM.entropyFeedback.find(".strength"); | 18188 | DOM.entropyEventCount = DOM.entropyContainer.find(".event-count"); |
18169 | DOM.entropyEventCount = DOM.entropyFeedback.find(".event-count"); | 18189 | DOM.entropyBits = DOM.entropyContainer.find(".bits"); |
18170 | DOM.entropyBits = DOM.entropyFeedback.find(".bits"); | 18190 | DOM.entropyBitsPerEvent = DOM.entropyContainer.find(".bits-per-event"); |
18171 | DOM.entropyBitsPerEvent = DOM.entropyFeedback.find(".bits-per-event"); | 18191 | DOM.entropyWordCount = DOM.entropyContainer.find(".word-count"); |
18172 | DOM.entropyMnemonicLength = DOM.entropyFeedback.find(".mnemonic-length"); | 18192 | DOM.entropyBinary = DOM.entropyContainer.find(".binary"); |
18193 | DOM.entropyMnemonicLength = DOM.entropyContainer.find(".mnemonic-length"); | ||
18173 | DOM.phrase = $(".phrase"); | 18194 | DOM.phrase = $(".phrase"); |
18174 | DOM.passphrase = $(".passphrase"); | 18195 | DOM.passphrase = $(".passphrase"); |
18175 | DOM.generateContainer = $(".generate-container"); | 18196 | DOM.generateContainer = $(".generate-container"); |
@@ -18299,7 +18320,7 @@ exports.BigInteger = BigInteger; | |||
18299 | // If blank entropy, clear mnemonic, addresses, errors | 18320 | // If blank entropy, clear mnemonic, addresses, errors |
18300 | if (DOM.entropy.val().trim().length == 0) { | 18321 | if (DOM.entropy.val().trim().length == 0) { |
18301 | clearDisplay(); | 18322 | clearDisplay(); |
18302 | hideEntropyFeedback(); | 18323 | clearEntropyFeedback(); |
18303 | DOM.phrase.val(""); | 18324 | DOM.phrase.val(""); |
18304 | showValidationError("Blank entropy"); | 18325 | showValidationError("Blank entropy"); |
18305 | return; | 18326 | return; |
@@ -18873,7 +18894,7 @@ exports.BigInteger = BigInteger; | |||
18873 | } | 18894 | } |
18874 | 18895 | ||
18875 | function setMnemonicFromEntropy() { | 18896 | function setMnemonicFromEntropy() { |
18876 | hideEntropyFeedback(); | 18897 | clearEntropyFeedback(); |
18877 | // Get entropy value | 18898 | // Get entropy value |
18878 | var entropyStr = DOM.entropy.val(); | 18899 | var entropyStr = DOM.entropy.val(); |
18879 | // Work out minimum base for entropy | 18900 | // Work out minimum base for entropy |
@@ -18901,7 +18922,8 @@ exports.BigInteger = BigInteger; | |||
18901 | } | 18922 | } |
18902 | // Discard trailing entropy | 18923 | // Discard trailing entropy |
18903 | var bitsToUse = Math.floor(bits.length / 32) * 32; | 18924 | var bitsToUse = Math.floor(bits.length / 32) * 32; |
18904 | var binaryStr = bits.substring(0, bitsToUse); | 18925 | var start = bits.length - bitsToUse; |
18926 | var binaryStr = bits.substring(start); | ||
18905 | // Convert entropy string to numeric array | 18927 | // Convert entropy string to numeric array |
18906 | var entropyArr = []; | 18928 | var entropyArr = []; |
18907 | for (var i=0; i<binaryStr.length / 8; i++) { | 18929 | for (var i=0; i<binaryStr.length / 8; i++) { |
@@ -18915,14 +18937,15 @@ exports.BigInteger = BigInteger; | |||
18915 | DOM.phrase.val(phrase); | 18937 | DOM.phrase.val(phrase); |
18916 | } | 18938 | } |
18917 | 18939 | ||
18918 | function hideEntropyFeedback() { | 18940 | function clearEntropyFeedback() { |
18919 | DOM.entropyFeedback.addClass("hidden"); | 18941 | DOM.entropyStrength.text("..."); |
18920 | DOM.entropyFiltered.text(""); | ||
18921 | DOM.entropyType.text(""); | 18942 | DOM.entropyType.text(""); |
18922 | DOM.entropyStrength.text(""); | 18943 | DOM.entropyWordCount.text("0"); |
18923 | DOM.entropyEventCount.text(""); | 18944 | DOM.entropyEventCount.text("0"); |
18924 | DOM.entropyBits.text(""); | 18945 | DOM.entropyBitsPerEvent.text("0"); |
18925 | DOM.entropyBitsPerEvent.text(""); | 18946 | DOM.entropyBits.text("0"); |
18947 | DOM.entropyFiltered.html(" "); | ||
18948 | DOM.entropyBinary.html(" "); | ||
18926 | } | 18949 | } |
18927 | 18950 | ||
18928 | function showEntropyFeedback(entropy) { | 18951 | function showEntropyFeedback(entropy) { |
@@ -18954,16 +18977,15 @@ exports.BigInteger = BigInteger; | |||
18954 | }; | 18977 | }; |
18955 | } | 18978 | } |
18956 | var bitsStr = entropy.binaryStr.length; | 18979 | var bitsStr = entropy.binaryStr.length; |
18957 | if (entropy.base.asInt != 2) { | 18980 | var wordCount = Math.floor(entropy.binaryStr.length / 32) * 3; |
18958 | bitsStr += " (" + entropy.binaryStr + ")"; | 18981 | DOM.entropyFiltered.html(entropy.cleanHtml); |
18959 | } | ||
18960 | DOM.entropyFiltered.text(entropy.cleanStr); | ||
18961 | DOM.entropyType.text(entropy.base.str); | 18982 | DOM.entropyType.text(entropy.base.str); |
18962 | DOM.entropyStrength.text(strength); | 18983 | DOM.entropyStrength.text(strength); |
18963 | DOM.entropyEventCount.text(entropy.base.ints.length); | 18984 | DOM.entropyEventCount.text(entropy.base.ints.length); |
18964 | DOM.entropyBits.text(bitsStr); | 18985 | DOM.entropyBits.text(bitsStr); |
18986 | DOM.entropyWordCount.text(wordCount); | ||
18987 | DOM.entropyBinary.text(entropy.binaryStr); | ||
18965 | DOM.entropyBitsPerEvent.text(Math.log2(entropy.base.asInt).toFixed(2)); | 18988 | DOM.entropyBitsPerEvent.text(Math.log2(entropy.base.asInt).toFixed(2)); |
18966 | DOM.entropyFeedback.removeClass("hidden"); | ||
18967 | } | 18989 | } |
18968 | 18990 | ||
18969 | var networks = [ | 18991 | var networks = [ |