Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ultraviolet
GitHub Repository: ultraviolet/bitaddress.org
Path: blob/master/src/ninja.detailwallet.js
248 views
1
(function (wallets, qrCode, privateKey, translator) {
2
var detail = wallets.detailwallet = {
3
isOpen: function () {
4
return (document.getElementById("detailwallet").className.indexOf("selected") != -1);
5
},
6
7
open: function () {
8
document.getElementById("detailarea").style.display = "block";
9
document.getElementById("detailprivkey").focus();
10
},
11
12
close: function () {
13
document.getElementById("detailarea").style.display = "none";
14
},
15
16
openCloseFaq: function (faqNum) {
17
// do close
18
if (document.getElementById("detaila" + faqNum).style.display == "block") {
19
document.getElementById("detaila" + faqNum).style.display = "none";
20
document.getElementById("detaile" + faqNum).setAttribute("class", "more");
21
}
22
// do open
23
else {
24
document.getElementById("detaila" + faqNum).style.display = "block";
25
document.getElementById("detaile" + faqNum).setAttribute("class", "less");
26
}
27
},
28
29
getKeyFromInput: function () {
30
var key = document.getElementById("detailprivkey").value.toString().replace(/^\s+|\s+$/g, ""); // trim white space
31
document.getElementById("detailprivkey").value = key;
32
return key;
33
},
34
35
checkAndShowMini: function (key) {
36
if (Bitcoin.ECKey.isMiniFormat(key)) {
37
// show Private Key Mini Format
38
document.getElementById("detailprivmini").innerHTML = key;
39
document.getElementById("detailmini").style.display = "block";
40
}
41
},
42
43
checkAndShowBase6: function (key) {
44
if (Bitcoin.ECKey.isBase6Format(key)) {
45
// show Private Key Base6 Format
46
document.getElementById("detailprivb6").innerHTML = key;
47
document.getElementById("detailb6").style.display = "block";
48
}
49
},
50
51
keyToECKeyWithBrain: function (key) {
52
var btcKey = new Bitcoin.ECKey(key);
53
if (btcKey.error != null) {
54
alert(translator.get("detailalertnotvalidprivatekey") + "\n" + btcKey.error);
55
}
56
else if (btcKey.priv == null) {
57
// enforce a minimum passphrase length
58
if (key.length >= wallets.brainwallet.minPassphraseLength) {
59
// Deterministic Wallet confirm box to ask if user wants to SHA256 the input to get a private key
60
var usePassphrase = confirm(translator.get("detailconfirmsha256"));
61
if (usePassphrase) {
62
var bytes = Crypto.SHA256(key, { asBytes: true });
63
btcKey = new Bitcoin.ECKey(bytes);
64
}
65
}
66
else {
67
alert(translator.get("detailalertnotvalidprivatekey"));
68
}
69
}
70
return btcKey;
71
},
72
73
decryptBip38: function () {
74
detail.clear();
75
var key = detail.getKeyFromInput();
76
if (key == "") {
77
return;
78
}
79
if (privateKey.isBIP38Format(key) == false) {
80
return;
81
}
82
document.getElementById("detailbip38toggle").style.display = "none";
83
var passphrase = document.getElementById("detailprivkeypassphrase").value.toString()
84
if (passphrase == "") {
85
alert(translator.get("bip38alertpassphraserequired"));
86
return;
87
}
88
document.getElementById("busyblock").className = "busy";
89
// show Private Key BIP38 Format
90
document.getElementById("detailprivbip38").innerHTML = key;
91
document.getElementById("detailbip38").style.display = "block";
92
qrCode.showQrCode({
93
"detailqrcodeprivatebip38": key
94
}, 4);
95
privateKey.BIP38EncryptedKeyToByteArrayAsync(key, passphrase, function (btcKeyOrError) {
96
document.getElementById("busyblock").className = "";
97
if (btcKeyOrError.message) {
98
alert(btcKeyOrError.message);
99
detail.clear();
100
} else {
101
detail.populateKeyDetails(new Bitcoin.ECKey(btcKeyOrError));
102
}
103
});
104
},
105
106
encryptBip38: function () {
107
detail.clear();
108
var key = detail.getKeyFromInput();
109
if (key == "") {
110
return;
111
}
112
if (privateKey.isBIP38Format(key)) {
113
return;
114
}
115
detail.checkAndShowMini(key);
116
detail.checkAndShowBase6(key);
117
var btcKey = detail.keyToECKeyWithBrain(key);
118
if (btcKey.priv == null) {
119
return;
120
}
121
var detailEncryptCheckbox = document.getElementById("detailbip38checkbox");
122
if (detailEncryptCheckbox.checked == true) {
123
document.getElementById("detailbip38commands").style.display = "block";
124
var passphrase = document.getElementById("detailprivkeypassphrase").value.toString()
125
if (passphrase == "") {
126
alert(translator.get("bip38alertpassphraserequired"));
127
return;
128
}
129
document.getElementById("busyblock").className = "busy";
130
privateKey.BIP38PrivateKeyToEncryptedKeyAsync(btcKey.getBitcoinWalletImportFormat(), passphrase, btcKey.compressed, function (encryptedKey) {
131
qrCode.showQrCode({
132
"detailqrcodeprivatebip38": encryptedKey
133
}, 4);
134
// show Private Key BIP38 Format
135
document.getElementById("detailprivbip38").innerHTML = encryptedKey;
136
document.getElementById("detailbip38").style.display = "block";
137
document.getElementById("busyblock").className = "";
138
});
139
detail.populateKeyDetails(btcKey);
140
}
141
},
142
143
viewDetails: function () {
144
detail.clear();
145
document.getElementById("detailbip38checkbox").checked = false;
146
var key = detail.getKeyFromInput();
147
if (key == "") {
148
return;
149
}
150
if (privateKey.isBIP38Format(key)) {
151
document.getElementById("detailbip38commands").style.display = "block";
152
document.getElementById("detailprivkeypassphrase").focus();
153
return;
154
}
155
document.getElementById("detailbip38commands").style.display = "none";
156
detail.checkAndShowMini(key);
157
detail.checkAndShowBase6(key);
158
var btcKey = detail.keyToECKeyWithBrain(key);
159
if(btcKey.priv == null){
160
return;
161
}
162
detail.populateKeyDetails(btcKey);
163
},
164
165
populateKeyDetails: function (btcKey) {
166
if (btcKey.priv != null) {
167
// get the original compression value and set it back later in this function
168
var originalCompression = btcKey.compressed;
169
btcKey.setCompressed(false);
170
document.getElementById("detailprivhex").innerHTML = btcKey.toString().toUpperCase();
171
document.getElementById("detailprivb64").innerHTML = btcKey.toString("base64");
172
var bitcoinAddress = btcKey.getBitcoinAddress();
173
var wif = btcKey.getBitcoinWalletImportFormat();
174
document.getElementById("detailpubkey").innerHTML = btcKey.getPubKeyHex();
175
document.getElementById("detailaddress").innerHTML = bitcoinAddress;
176
document.getElementById("detailprivwif").innerHTML = wif;
177
btcKey.setCompressed(true);
178
var bitcoinAddressComp = btcKey.getBitcoinAddress();
179
var wifComp = btcKey.getBitcoinWalletImportFormat();
180
document.getElementById("detailpubkeycomp").innerHTML = btcKey.getPubKeyHex();
181
document.getElementById("detailaddresscomp").innerHTML = bitcoinAddressComp;
182
document.getElementById("detailprivwifcomp").innerHTML = wifComp;
183
btcKey.setCompressed(originalCompression); // to satisfy the key pool
184
var pool1 = new Bitcoin.ECKey(wif); // to satisfy the key pool
185
var pool2 = new Bitcoin.ECKey(wifComp); // to satisfy the key pool
186
187
qrCode.showQrCode({
188
"detailqrcodepublic": bitcoinAddress,
189
"detailqrcodepubliccomp": bitcoinAddressComp,
190
"detailqrcodeprivate": wif,
191
"detailqrcodeprivatecomp": wifComp
192
}, 4);
193
}
194
},
195
196
clear: function () {
197
var key = detail.getKeyFromInput();
198
if (privateKey.isBIP38Format(key)) {
199
document.getElementById("detailbip38commands").style.display = "block";
200
document.getElementById("detailbip38toggle").style.display = "none";
201
document.getElementById("detailbip38decryptspan").style.display = "inline-block";
202
document.getElementById("detailbip38encryptspan").style.display = "none";
203
document.getElementById("detailbip38checkbox").checked = false;
204
}
205
else {
206
document.getElementById("detailbip38toggle").style.display = "block";
207
if (document.getElementById("detailbip38checkbox").checked) {
208
document.getElementById("detailbip38commands").style.display = "block";
209
document.getElementById("detailbip38decryptspan").style.display = "none";
210
document.getElementById("detailbip38encryptspan").style.display = "inline-block";
211
}
212
else {
213
document.getElementById("detailbip38commands").style.display = "none";
214
document.getElementById("detailbip38decryptspan").style.display = "inline-block";
215
document.getElementById("detailbip38encryptspan").style.display = "none";
216
}
217
}
218
document.getElementById("detailpubkey").innerHTML = "";
219
document.getElementById("detailpubkeycomp").innerHTML = "";
220
document.getElementById("detailaddress").innerHTML = "";
221
document.getElementById("detailaddresscomp").innerHTML = "";
222
document.getElementById("detailprivwif").innerHTML = "";
223
document.getElementById("detailprivwifcomp").innerHTML = "";
224
document.getElementById("detailprivhex").innerHTML = "";
225
document.getElementById("detailprivb64").innerHTML = "";
226
document.getElementById("detailprivb6").innerHTML = "";
227
document.getElementById("detailprivmini").innerHTML = "";
228
document.getElementById("detailprivbip38").innerHTML = "";
229
document.getElementById("detailqrcodepublic").innerHTML = "";
230
document.getElementById("detailqrcodepubliccomp").innerHTML = "";
231
document.getElementById("detailqrcodeprivate").innerHTML = "";
232
document.getElementById("detailqrcodeprivatecomp").innerHTML = "";
233
document.getElementById("detailb6").style.display = "none";
234
document.getElementById("detailmini").style.display = "none";
235
document.getElementById("detailbip38").style.display = "none";
236
},
237
238
enterOnPassphrase: function () {
239
var detailEncryptCheckbox = document.getElementById("detailbip38checkbox");
240
if (detailEncryptCheckbox.checked) {
241
detail.encryptBip38();
242
}
243
else {
244
detail.decryptBip38();
245
}
246
},
247
248
toggleEncrypt: function (element) {
249
// enable/disable passphrase textbox
250
var bip38CommandDisplay = document.getElementById("detailbip38commands").style.display;
251
var key = detail.getKeyFromInput();
252
253
if (element.checked == true) {
254
if (privateKey.isBIP38Format(key)) {
255
document.getElementById("detailbip38toggle").style.display = "none";
256
document.getElementById("detailbip38commands").style.display = "block";
257
document.getElementById("detailprivkeypassphrase").focus();
258
return;
259
}
260
else {
261
// show encrypt button
262
document.getElementById("detailbip38commands").style.display = "block";
263
document.getElementById("detailprivkeypassphrase").focus();
264
document.getElementById("detailbip38decryptspan").style.display = "none";
265
document.getElementById("detailbip38encryptspan").style.display = "inline-block";
266
}
267
}
268
else {
269
// show decrypt button
270
document.getElementById("detailbip38decryptspan").style.display = "inline-block";
271
document.getElementById("detailbip38encryptspan").style.display = "none";
272
document.getElementById("detailbip38commands").style.display = "none";
273
}
274
}
275
};
276
})(ninja.wallets, ninja.qrCode, ninja.privateKey, ninja.translator);
277