|
| 1 | +<!DOCTYPE html> |
| 2 | +<html lang="en"> |
| 3 | +<head> |
| 4 | +<title>D++</title> |
| 5 | +<meta charset="utf-8"> |
| 6 | +<meta name="viewport" content="width=device-width, initial-scale=1"> |
| 7 | +<!--link rel="shortcut icon" type="image/jpg" href="taproot.ico"/--> |
| 8 | +<base target="_blank"/> |
| 9 | +<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> |
| 10 | +<script src="https://cdn.rawgit.com/davidshimjs/qrcodejs/gh-pages/qrcode.min.js"></script> |
| 11 | +<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> |
| 12 | +<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> |
| 13 | +<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> |
| 14 | +<style> |
| 15 | +@import url('https://fonts.googleapis.com/css2?family=PT+Sans+Narrow:wght@400;700&family=Roboto:wght@300;400;500&display=swap'); |
| 16 | +</style> |
| 17 | +<script src="files/words.js"></script> |
| 18 | +<link rel="stylesheet" href="files/style.css"> |
| 19 | +</head> |
| 20 | + |
| 21 | +<script> |
| 22 | +function binString2buf(string) { |
| 23 | + var result = new Uint8Array(32); |
| 24 | + for (var i = 0; i < 32; i++) { |
| 25 | + // taking 8 bytes and putting it into 8 bits |
| 26 | + // console.log("loop #" + i); |
| 27 | + result[i] = 0; |
| 28 | + for (var c = 0; c < 8; c++) { |
| 29 | + if (Number(string[i*8 + c]) === 1) { |
| 30 | + result[i] |= 1 << (7 - c); |
| 31 | + } |
| 32 | + } |
| 33 | + // console.log("result[" + i + "] is: " + result[i]); |
| 34 | + } |
| 35 | + return result; |
| 36 | +} |
| 37 | + |
| 38 | +function buf2bin(buffer) { |
| 39 | + var view = new Uint8Array(buffer); |
| 40 | + var result = ""; |
| 41 | + for (var i = 0; i < view.length; i++) { |
| 42 | + var binary = view[i].toString(2); |
| 43 | + binary = "00000000".substr(binary.length) + binary; |
| 44 | + result += binary; |
| 45 | + } |
| 46 | + return result; |
| 47 | +} |
| 48 | + |
| 49 | +function buf2hex(buffer) { |
| 50 | + // buffer is an ArrayBuffer |
| 51 | + return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join(''); |
| 52 | +} |
| 53 | + |
| 54 | +async function shaMe(inputString) { |
| 55 | + console.log("inputstring is " + inputString); |
| 56 | + var inputBytes = binString2buf(inputString); |
| 57 | + console.log("inputBytes is " + inputBytes); |
| 58 | + var hashBytes = await window.crypto.subtle.digest("SHA-256", inputBytes); |
| 59 | + |
| 60 | + // console.log(buf2hex(hashBytes)); |
| 61 | + // console.log(buf2bin(hashBytes)); |
| 62 | + return buf2bin(hashBytes); |
| 63 | +} |
| 64 | + |
| 65 | +function convertBin() { |
| 66 | + var binary = document.getElementById("binary").value; |
| 67 | + if (binary == "") |
| 68 | + $("#result").html("Please input a binary number."); |
| 69 | + else { |
| 70 | + binary = parseInt(binary, 2); |
| 71 | + console.log(binary); |
| 72 | + console.log(); |
| 73 | + $("#result").html("<center><b>Result:</b><br>" + wordlist[binary] + "<br><br><b>Decimal:</b><br>" + binary + "<br><br>"); |
| 74 | + } |
| 75 | +} |
| 76 | + |
| 77 | +function isNumberKey(evt, element, max) { |
| 78 | + var charCode = (evt.which) ? evt.which : event.keyCode; |
| 79 | + var len = $(element).val().length; |
| 80 | + |
| 81 | + if (len >= max) |
| 82 | + return false; |
| 83 | + |
| 84 | + |
| 85 | + if (charCode != 48 && charCode != 49) |
| 86 | + return false; |
| 87 | +} |
| 88 | + |
| 89 | +function searchStringInArray (str, strArray) { |
| 90 | + str = str.toLowerCase(); |
| 91 | + for (var j = 0; j < strArray.length; j++) { |
| 92 | + if (strArray[j] == str) { |
| 93 | + console.log('we found a match, it is ' + strArray[j]); |
| 94 | + return j; |
| 95 | + } |
| 96 | + } |
| 97 | + return -1; |
| 98 | +} |
| 99 | + |
| 100 | +function hex2bin(hex){ |
| 101 | + return ("00000000" + (parseInt(hex, 16)).toString(2)).substr(-8); |
| 102 | +} |
| 103 | + |
| 104 | +async function checksum() { |
| 105 | + var key = ""; |
| 106 | + var wallet = ""; |
| 107 | + |
| 108 | + var words = document.getElementsByClassName("bip-input"); |
| 109 | + for (var i = 0; i < words.length; i++) { |
| 110 | + var binary = words[i].value; |
| 111 | + if (binary == "") { |
| 112 | + $("#checksum-result").html("Please enter valid seed words."); |
| 113 | + document.getElementById("qrcode-container").style.display = "none"; |
| 114 | + return false; |
| 115 | + } |
| 116 | + |
| 117 | + wallet = wallet + binary + " "; |
| 118 | + |
| 119 | + binary = searchStringInArray(binary, wordlist); |
| 120 | + if (binary < 0) { |
| 121 | + $("#checksum-result").html("Invalid seed words."); |
| 122 | + document.getElementById("qrcode-container").style.display = "none"; |
| 123 | + return false; |
| 124 | + } |
| 125 | + binary = binary.toString(2) |
| 126 | + binary = "00000000000".substr(binary.length) + binary; |
| 127 | + |
| 128 | + key += binary; |
| 129 | + } |
| 130 | + console.log("wallet is " + wallet); |
| 131 | + if ($('#checksum').val() == "") { |
| 132 | + $("#checksum-result").html("Please enter the first three bits of the checksum."); |
| 133 | + document.getElementById("qrcode-container").style.display = "none"; |
| 134 | + return false; |
| 135 | + } |
| 136 | + |
| 137 | + // for fun, show all 8 possible checksum words |
| 138 | + validChecksums(key); |
| 139 | + |
| 140 | + key += $("#checksum").val(); |
| 141 | + console.log("key is " + key); |
| 142 | + console.log("key length is " + key.length); |
| 143 | + var result = await shaMe(key); |
| 144 | + |
| 145 | + var hash = result.substring(0, 8); |
| 146 | + hash = Number($('#checksum').val() + hash); |
| 147 | + |
| 148 | + var twentyFour = wordlist[parseInt(hash, 2)]; |
| 149 | + wallet += twentyFour; |
| 150 | + |
| 151 | + // generateQRCode(wallet); |
| 152 | + |
| 153 | + console.log(wallet); |
| 154 | + $("#checksum-result").html("<b>Seed Phrase in Binary:</b><br>" + key + "<br><br><b>SHA-256 Hash of Seed Phrase:</b><br>" + result); |
| 155 | + // $("#checksum-result").html("<b>Checksum:</b><br>" + twentyFour + "<br><br><b>Binary:</b><br>" + key + "<br><br><b>Hash:</b><br>" + result + "<br><br><b>Mnemonic:</b><br>" + wallet); |
| 156 | +} |
| 157 | + |
| 158 | +async function validChecksums(key) { |
| 159 | + var results = ""; |
| 160 | + |
| 161 | + // document.getElementById("possible-checksums-result").innerHTML = "<br><b>All Possible Checksums:</b><br>"; |
| 162 | + for (var i = 0; i < 8; i++) { |
| 163 | + var myKey = key; |
| 164 | + var binary = i.toString(2); |
| 165 | + binary = "000".substr(binary.length) + binary; |
| 166 | + console.log("binary for checksum is: " + binary); |
| 167 | + |
| 168 | + myKey += binary; |
| 169 | + |
| 170 | + let result = await shaMe(myKey); |
| 171 | + |
| 172 | + var hash = result.substring(0, 8); |
| 173 | + console.log("binary(blurg) here is " + binary); |
| 174 | + hash = binary + hash; |
| 175 | + console.log("last 11 bits are now: " + hash); |
| 176 | + |
| 177 | + var twentyFour = wordlist[parseInt(hash, 2)]; |
| 178 | + console.log("possible checksum is " + twentyFour); |
| 179 | + results += twentyFour + " "; |
| 180 | + console.log("results is now " + results); |
| 181 | + } |
| 182 | + console.log("all the results are " + results); |
| 183 | + // document.getElementById("possible-checksums-result").innerHTML += results; |
| 184 | +} |
| 185 | + |
| 186 | +function autofill(word, checksum) { |
| 187 | + $(".bip-input").val(word); |
| 188 | + $('#checksum').val(checksum); |
| 189 | +} |
| 190 | + |
| 191 | +function generateQRCode(string) { |
| 192 | + let qrcodeContainer = document.getElementById("qrcode"); |
| 193 | + qrcodeContainer.innerHTML = ""; |
| 194 | + new QRCode(qrcodeContainer, string); |
| 195 | + document.getElementById("qrcode-container").style.display = "block"; |
| 196 | +} |
| 197 | +</script> |
| 198 | +<header> |
| 199 | +<!--img src=images/Title.png style="width:500px; max-width:95%"--> |
| 200 | +</header> |
| 201 | +<br> |
| 202 | +<div class="container"> |
| 203 | +<h3>Convert Binary to BIP 39 Word</h3> |
| 204 | + |
| 205 | +<input class="button-class" placeholder="11 Bit Binary Number" id="binary" onkeypress="return isNumberKey(event,this, 11)"><br> |
| 206 | +<button class="button-class" onclick="convertBin()">Convert</button> |
| 207 | +<br><br> |
| 208 | + |
| 209 | +<div id="result" style="font-size:17px;"></div> |
| 210 | + |
| 211 | +<br> |
| 212 | + |
| 213 | +<h3>Calculate Hash of Seed Phrase</h3> |
| 214 | + |
| 215 | +<center> |
| 216 | +<!--button onclick="autofill('abandon', '000')">Autofill (All Zeros)</button> |
| 217 | +<button onclick="autofill('zoo', '111')">Autofill (All Ones)</button><br> |
| 218 | +<button onclick="autofill('bacon', '000')" style="margin-top:5px">Autofill (All Bacons)</button> |
| 219 | +<br><br--> |
| 220 | + |
| 221 | + <div class="row" style="margin-top:10px"> |
| 222 | + <div class="col-sm-6 text-center"><span class="number">1.</span><input class="bip-input"></div> |
| 223 | + <div class="col-sm-6 text-center"><span class="number">2.</span><input class="bip-input"></div> |
| 224 | + </div> |
| 225 | + <div class="row"> |
| 226 | + <div class="col-sm-6 text-center"><span class="number">3.</span><input class="bip-input"></div> |
| 227 | + <div class="col-sm-6 text-center"><span class="number">4.</span><input class="bip-input"></div> |
| 228 | + </div> |
| 229 | + <div class="row"> |
| 230 | + <div class="col-sm-6 text-center"><span class="number">5.</span><input class="bip-input"></div> |
| 231 | + <div class="col-sm-6 text-center"><span class="number">6.</span><input class="bip-input"></div> |
| 232 | + </div> |
| 233 | + <div class="row"> |
| 234 | + <div class="col-sm-6 text-center"><span class="number">7.</span><input class="bip-input"></div> |
| 235 | + <div class="col-sm-6 text-center"><span class="number">8.</span><input class="bip-input"></div> |
| 236 | + </div> |
| 237 | + <div class="row"> |
| 238 | + <div class="col-sm-6 text-center"><span class="number">9.</span><input class="bip-input"></div> |
| 239 | + <div class="col-sm-6 text-center"><span class="number">10.</span><input class="bip-input"></div> |
| 240 | + </div> |
| 241 | + <div class="row"> |
| 242 | + <div class="col-sm-6 text-center"><span class="number">11.</span><input class="bip-input"></div> |
| 243 | + <div class="col-sm-6 text-center"><span class="number">12.</span><input class="bip-input"></div> |
| 244 | + </div> |
| 245 | + <div class="row"> |
| 246 | + <div class="col-sm-6 text-center"><span class="number">13.</span><input class="bip-input"></div> |
| 247 | + <div class="col-sm-6 text-center"><span class="number">14.</span><input class="bip-input"></div> |
| 248 | + </div> |
| 249 | + <div class="row"> |
| 250 | + <div class="col-sm-6 text-center"><span class="number">15.</span><input class="bip-input"></div> |
| 251 | + <div class="col-sm-6 text-center"><span class="number">16.</span><input class="bip-input"></div> |
| 252 | + </div> |
| 253 | + <div class="row"> |
| 254 | + <div class="col-sm-6 text-center"><span class="number">17.</span><input class="bip-input"></div> |
| 255 | + <div class="col-sm-6 text-center"><span class="number">18.</span><input class="bip-input"></div> |
| 256 | + </div> |
| 257 | + <div class="row"> |
| 258 | + <div class="col-sm-6 text-center"><span class="number">19.</span><input class="bip-input"></div> |
| 259 | + <div class="col-sm-6 text-center"><span class="number">20.</span><input class="bip-input"></div> |
| 260 | + </div> |
| 261 | + <div class="row"> |
| 262 | + <div class="col-sm-6 text-center"><span class="number">21.</span><input class="bip-input"></div> |
| 263 | + <div class="col-sm-6 text-center"><span class="number">22.</span><input class="bip-input"></div> |
| 264 | + </div> |
| 265 | + <div class="row"> |
| 266 | + <div class="col-sm-6 text-center"><span class="number">23.</span><input class="bip-input"></div> |
| 267 | + <div class="col-sm-6 text-center"><span class="number">24.</span><input id="checksum" class="input" placeholder="First 3 bits of checksum" onkeypress="return isNumberKey(event,this, 3)"></div> |
| 268 | + </div> |
| 269 | + |
| 270 | +<button onclick="checksum()" class="button-class" id="submit-button">Submit</button> |
| 271 | + |
| 272 | + |
| 273 | + |
| 274 | +<div id="possible-checksums-result"></div> |
| 275 | + |
| 276 | +<div id="checksum-result"></div> |
| 277 | + |
| 278 | +<div id="qrcode-container" style="margin-top:25px;"> |
| 279 | + <div id="qrcode" class="qrcode"></div> |
| 280 | +</div> |
| 281 | +</div> <!-- end container --> |
| 282 | +<script src="files/footer.js"></script> |
| 283 | + |
| 284 | +</html> |
0 commit comments