From adb6ea4b6cb62a4630f041902460e55814486a70 Mon Sep 17 00:00:00 2001 From: Jonathan Warren Date: Sun, 7 Apr 2013 16:16:54 -0400 Subject: [PATCH 1/3] Fix address generation bug (3 null bytes on beginning of RIPE hash) --- addresses.py | 6 ++++++ bitmessagemain.py | 26 +++++++++++++++----------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/addresses.py b/addresses.py index d3423503..65c2bf66 100644 --- a/addresses.py +++ b/addresses.py @@ -181,6 +181,12 @@ def decodeAddress(address): return status,addressVersionNumber,streamNumber,data[bytesUsedByVersionNumber+bytesUsedByStreamNumber:-4] elif len(data[bytesUsedByVersionNumber+bytesUsedByStreamNumber:-4]) == 18: return status,addressVersionNumber,streamNumber,'\x00\x00'+data[bytesUsedByVersionNumber+bytesUsedByStreamNumber:-4] + elif len(data[bytesUsedByVersionNumber+bytesUsedByStreamNumber:-4]) < 18: + return 'ripetooshort',0,0,0 + elif len(data[bytesUsedByVersionNumber+bytesUsedByStreamNumber:-4]) > 20: + return 'ripetoolong',0,0,0 + else: + return 'otherproblem',0,0,0 def addBMIfNotPresent(address): address = str(address).strip() diff --git a/bitmessagemain.py b/bitmessagemain.py index cb88df1e..2733c7fe 100755 --- a/bitmessagemain.py +++ b/bitmessagemain.py @@ -2608,10 +2608,7 @@ class addressGenerator(QThread): break print 'Generated address with ripe digest:', ripe.digest().encode('hex') print 'Address generator calculated', numberOfAddressesWeHadToMakeBeforeWeFoundOneWithTheCorrectRipePrefix, 'addresses at', numberOfAddressesWeHadToMakeBeforeWeFoundOneWithTheCorrectRipePrefix/(time.time()-startTime),'addresses per second before finding one with the correct ripe-prefix.' - if ripe.digest()[:2] == '\x00\x00': - address = encodeAddress(2,self.streamNumber,ripe.digest()[2:]) - elif ripe.digest()[:1] == '\x00': - address = encodeAddress(2,self.streamNumber,ripe.digest()[1:]) + address = encodeAddress(2,self.streamNumber,ripe.digest()) #self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"),'Finished generating address. Writing to keys.dat') #An excellent way for us to store our keys is in Wallet Import Format. Let us convert now. @@ -2680,10 +2677,7 @@ class addressGenerator(QThread): print 'ripe.digest', ripe.digest().encode('hex') print 'Address generator calculated', numberOfAddressesWeHadToMakeBeforeWeFoundOneWithTheCorrectRipePrefix, 'addresses at', numberOfAddressesWeHadToMakeBeforeWeFoundOneWithTheCorrectRipePrefix/(time.time()-startTime),'keys per second.' - if ripe.digest()[:2] == '\x00\x00': - address = encodeAddress(2,self.streamNumber,ripe.digest()[2:]) - elif ripe.digest()[:1] == '\x00': - address = encodeAddress(2,self.streamNumber,ripe.digest()[1:]) + address = encodeAddress(2,self.streamNumber,ripe.digest()) #self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"),'Finished generating address. Writing to keys.dat') #An excellent way for us to store our keys is in Wallet Import Format. Let us convert now. @@ -3276,6 +3270,10 @@ class NewSubscriptionDialog(QtGui.QDialog): self.ui.labelSubscriptionAddressCheck.setText('The version number of this address is higher than this software can support. Please upgrade Bitmessage.') elif status == 'invalidcharacters': self.ui.labelSubscriptionAddressCheck.setText('The address contains invalid characters.') + elif status == 'ripetooshort': + self.ui.labelSubscriptionAddressCheck.setText('Some data encoded in the address is too short.') + elif status == 'ripetoolong': + self.ui.labelSubscriptionAddressCheck.setText('Some data encoded in the address is too long.') elif status == 'success': self.ui.labelSubscriptionAddressCheck.setText('Address is valid.') @@ -3935,12 +3933,18 @@ class MyForm(QtGui.QMainWindow): printLock.release() if status == 'missingbm': self.statusBar().showMessage('Error: Bitmessage addresses start with BM- Please check ' + toAddress) - if status == 'checksumfailed': + elif status == 'checksumfailed': self.statusBar().showMessage('Error: The address ' + toAddress+' is not typed or copied correctly. Please check it.') - if status == 'invalidcharacters': + elif status == 'invalidcharacters': self.statusBar().showMessage('Error: The address '+ toAddress+ ' contains invalid characters. Please check it.') - if status == 'versiontoohigh': + elif status == 'versiontoohigh': self.statusBar().showMessage('Error: The address version in '+ toAddress+ ' is too high. Either you need to upgrade your Bitmessage software or your acquaintance is being clever.') + elif status == 'ripetooshort': + self.statusBar().showMessage('Error: Some data encoded in the address '+ toAddress+ ' is too short. There might be something wrong with the software of your acquaintance.') + elif status == 'ripetoolong': + self.statusBar().showMessage('Error: Some data encoded in the address '+ toAddress+ ' is too long. There might be something wrong with the software of your acquaintance.') + else: + self.statusBar().showMessage('Error: Something is wrong with the address '+ toAddress+ '.') elif fromAddress == '': self.statusBar().showMessage('Error: You must specify a From address. If you don\'t have one, go to the \'Your Identities\' tab.') else: From 8000d7d73346bba9b299bd95b7fba30c080e52be Mon Sep 17 00:00:00 2001 From: Jonathan Warren Date: Sun, 7 Apr 2013 16:23:19 -0400 Subject: [PATCH 2/3] Show error if encodeAddress function is given a RIPE hash that is not 20 bytes long --- addresses.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addresses.py b/addresses.py index 65c2bf66..7b2650df 100644 --- a/addresses.py +++ b/addresses.py @@ -96,6 +96,8 @@ def calculateInventoryHash(data): def encodeAddress(version,stream,ripe): if version >= 2: + if len(ripe) != 20: + sys.stderr.write('Programming error in encodeAddress: The length of a given ripe hash was not 20.') if ripe[:2] == '\x00\x00': ripe = ripe[2:] elif ripe[:1] == '\x00': From fc69d42acf636d56e8131f34e482780bd36b645d Mon Sep 17 00:00:00 2001 From: Jonathan Warren Date: Sun, 7 Apr 2013 16:46:13 -0400 Subject: [PATCH 3/3] Show error if encodeAddress function is given a RIPE hash that is not 20 bytes long --- addresses.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addresses.py b/addresses.py index 7b2650df..402f3a7d 100644 --- a/addresses.py +++ b/addresses.py @@ -97,7 +97,7 @@ def calculateInventoryHash(data): def encodeAddress(version,stream,ripe): if version >= 2: if len(ripe) != 20: - sys.stderr.write('Programming error in encodeAddress: The length of a given ripe hash was not 20.') + raise Exception("Programming error in encodeAddress: The length of a given ripe hash was not 20.") if ripe[:2] == '\x00\x00': ripe = ripe[2:] elif ripe[:1] == '\x00':