QMessageBox.warning(None, _('Error'), _('No seed'), _('OK'))
return
+ if not Wallet.is_seed(seed):
+ QMessageBox.warning(None, _('Error'), _('Invalid seed'), _('OK'))
+ return
+
return seed
elif action == 'restore':
seed = self.seed_dialog()
- if not seed:
+ if not Wallet.is_seed(seed):
return
wallet = Wallet.from_seed(seed, self.storage)
ok, old_password, password = self.password_dialog(wallet)
menu.addAction(_("Copy to clipboard"), lambda: self.app.clipboard().setText(addr))
menu.addAction(_("QR code"), lambda: self.show_qrcode("bitcoin:" + addr, _("Address")) )
menu.addAction(_("Edit label"), lambda: self.edit_label(True))
+ menu.addAction(_("Public keys"), lambda: self.show_public_keys(addr))
if self.wallet.seed:
menu.addAction(_("Private key"), lambda: self.show_private_key(addr))
menu.addAction(_("Sign/verify message"), lambda: self.sign_verify_message(addr))
apply( func, args)
+ def show_public_keys(self, address):
+ if not address: return
+ try:
+ pubkey_list = self.wallet.get_public_keys(address)
+ except Exception as e:
+ traceback.print_exc(file=sys.stdout)
+ self.show_message(str(e))
+ return
+
+ d = QDialog(self)
+ d.setMinimumSize(600, 200)
+ d.setModal(1)
+ vbox = QVBoxLayout()
+ vbox.addWidget( QLabel(_("Address") + ': ' + address))
+ vbox.addWidget( QLabel(_("Public key") + ':'))
+ keys = QTextEdit()
+ keys.setReadOnly(True)
+ keys.setText('\n'.join(pubkey_list))
+ vbox.addWidget(keys)
+ #vbox.addWidget( QRCodeWidget('\n'.join(pk_list)) )
+ vbox.addLayout(close_button(d))
+ d.setLayout(vbox)
+ d.exec_()
+
@protected
def show_private_key(self, address, password):
if not address: return
return PBKDF2(mnemonic, 'mnemonic' + passphrase, iterations = PBKDF2_ROUNDS, macmodule = hmac, digestmodule = hashlib.sha512).read(64)
from version import SEED_PREFIX
-is_seed = lambda x: hmac_sha_512("Seed version", x).encode('hex')[0:2].startswith(SEED_PREFIX)
+is_new_seed = lambda x: hmac_sha_512("Seed version", x).encode('hex')[0:2].startswith(SEED_PREFIX)
+
+def is_old_seed(seed):
+ import mnemonic
+ words = seed.strip().split()
+ try:
+ mnemonic.mn_decode(words)
+ uses_electrum_words = True
+ except Exception:
+ uses_electrum_words = False
+
+ try:
+ seed.decode('hex')
+ is_hex = True
+ except Exception:
+ is_hex = False
+
+ return is_hex or (uses_electrum_words and len(words) == 12)
+
# pywallet openssl private key implementation
# we keep only 13 words, that's approximately 139 bits of entropy
words = mnemonic.mn_encode(s)[0:13]
seed = ' '.join(words)
- if is_seed(seed):
+ if is_new_seed(seed):
break # this will remove 8 bits of entropy
nonce += 1
@classmethod
- def from_seed(self, seed, storage):
- import mnemonic
+ def is_seed(self, seed):
if not seed:
- return
-
- words = seed.strip().split()
- try:
- mnemonic.mn_decode(words)
- uses_electrum_words = True
- except Exception:
- uses_electrum_words = False
-
- try:
- seed.decode('hex')
- is_hex = True
- except Exception:
- is_hex = False
-
- if is_hex or (uses_electrum_words and len(words) == 12):
- #print "old style wallet", len(words), words
- w = OldWallet(storage)
- w.init_seed(seed) #hex
- else:
- assert is_seed(seed)
- w = NewWallet(storage)
- w.init_seed(seed)
+ return False
+ elif is_old_seed(seed):
+ return OldWallet
+ elif is_new_seed(seed):
+ return NewWallet
+ else:
+ return False
+ @classmethod
+ def from_seed(self, seed, storage):
+ klass = self.is_seed(seed)
+ w = klass(storage)
+ w.init_seed(seed)
return w
-
@classmethod
def from_mpk(self, mpk, storage):