commit c87533acaad1e8499bd4efdd99535a39d8359a04
parent e7d233a7a2de7424c737ed115b0e59fdc3e30c6c
Author: ThomasV <thomasv@gitorious>
Date: Tue, 29 Nov 2011 10:26:47 +0100
use python slowaes library
Diffstat:
2 files changed, 53 insertions(+), 22 deletions(-)
diff --git a/client/electrum.py b/client/electrum.py
@@ -26,10 +26,11 @@ except:
sys.exit(1)
try:
- import Crypto
- has_encryption = True
+ import aes
except:
- has_encryption = False
+ print "AES does not seem to be installed. Try 'sudo easy_install slowaes'"
+ sys.exit(1)
+
############ functions from pywallet #####################
@@ -149,13 +150,10 @@ def int_to_hex(i, length=1):
return s.decode('hex')[::-1].encode('hex')
-# password encryption
-from Crypto.Cipher import AES
-BLOCK_SIZE = 32
-PADDING = '{'
-pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
-EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
-DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)
+
+EncodeAES = lambda secret, s: base64.b64encode(aes.encryptData(secret,s))
+DecodeAES = lambda secret, e: aes.decryptData(secret, base64.b64decode(e))
+
# secp256k1, http://www.oid-info.com/get/1.3.132.0.10
@@ -224,7 +222,7 @@ class Wallet:
self.host = 'ecdsa.org'
self.port = 50000
self.fee = 0.005
- self.version = 1
+ self.version = 2 # bump this everytime the wallet format is modified
# saved fields
self.use_encryption = False
@@ -381,6 +379,8 @@ class Wallet:
self.labels, self.addressbook) = sequence
except:
raise BaseException("version error.")
+ if self.version == 1 and self.use_encryption:
+ raise BaseException("version error: please upgrade your wallet first")
self.update_tx_history()
return True
@@ -529,16 +529,14 @@ class Wallet:
def pw_encode(self, s, password):
if password:
secret = Hash(password)
- cipher = AES.new(secret)
- return EncodeAES(cipher, s)
+ return EncodeAES(secret, s)
else:
return s
def pw_decode(self, s, password):
if password:
secret = Hash(password)
- cipher = AES.new(secret)
- return DecodeAES(cipher, s)
+ return DecodeAES(secret, s)
else:
return s
@@ -671,13 +669,12 @@ if __name__ == '__main__':
if wallet.read():
print "remove the existing wallet first!"
sys.exit(0)
- if has_encryption:
- password = getpass.getpass("Password (hit return if you do not wish to encrypt your wallet):")
- if password:
- password2 = getpass.getpass("Confirm password:")
- if password != password2:
- print "error"
- sys.exit(1)
+ password = getpass.getpass("Password (hit return if you do not wish to encrypt your wallet):")
+ if password:
+ password2 = getpass.getpass("Confirm password:")
+ if password != password2:
+ print "error"
+ sys.exit(1)
else:
password = None
print "in order to use wallet encryption, please install pycrypto (sudo easy_install pycrypto)"
diff --git a/client/upgrade.py b/client/upgrade.py
@@ -0,0 +1,34 @@
+import electrum, getpass, base64,ast
+
+wallet = electrum.Wallet(None)
+try:
+ wallet.read()
+ print "ok"
+except BaseException:
+ if wallet.version == 1 and wallet.use_encryption:
+ # version 1 used pycrypto for wallet encryption
+ import Crypto
+ from Crypto.Cipher import AES
+ BLOCK_SIZE = 32
+ PADDING = '{'
+ pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
+ EncodeAES = lambda secret, s: base64.b64encode(AES.new(secret).encrypt(pad(s)))
+ DecodeAES = lambda secret, e: AES.new(secret).decrypt(base64.b64decode(e)).rstrip(PADDING)
+
+ print "encrypted seed", wallet.seed
+ print "please provide your password"
+ password = getpass.getpass("Password:")
+ secret = electrum.Hash(password)
+ try:
+ seed = DecodeAES( secret, wallet.seed )
+ private_keys = ast.literal_eval( DecodeAES( secret, wallet.private_keys ) )
+ except:
+ print "sorry"
+ exit(1)
+ print seed
+ print private_keys
+ wallet.version = 2
+ wallet.seed = wallet.pw_encode( seed, password)
+ wallet.private_keys = wallet.pw_encode( repr( private_keys ), password)
+ wallet.save()
+ print "wallet was upgraded"