Implimented broadcast encryption (testing)
This commit is contained in:
parent
afd644a97d
commit
896b96b7c7
|
@ -590,7 +590,7 @@ class receiveDataThread(QThread):
|
||||||
broadcastVersion, broadcastVersionLength = decodeVarint(data[readPosition:readPosition+9])
|
broadcastVersion, broadcastVersionLength = decodeVarint(data[readPosition:readPosition+9])
|
||||||
readPosition += broadcastVersionLength
|
readPosition += broadcastVersionLength
|
||||||
if broadcastVersion < 1 or broadcastVersion > 2:
|
if broadcastVersion < 1 or broadcastVersion > 2:
|
||||||
#Cannot decode incoming broadcast versions higher than 2. Assuming the sender isn\' being silly, you should upgrade Bitmessage because this message shall be ignored.
|
print 'Cannot decode incoming broadcast versions higher than 2. Assuming the sender isn\' being silly, you should upgrade Bitmessage because this message shall be ignored.'
|
||||||
return
|
return
|
||||||
if broadcastVersion == 1:
|
if broadcastVersion == 1:
|
||||||
beginningOfPubkeyPosition = readPosition #used when we add the pubkey to our pubkey table
|
beginningOfPubkeyPosition = readPosition #used when we add the pubkey to our pubkey table
|
||||||
|
@ -704,9 +704,8 @@ class receiveDataThread(QThread):
|
||||||
printLock.release()
|
printLock.release()
|
||||||
if broadcastVersion == 2:
|
if broadcastVersion == 2:
|
||||||
cleartextStreamNumber, cleartextStreamNumberLength = decodeVarint(data[readPosition:readPosition+10])
|
cleartextStreamNumber, cleartextStreamNumberLength = decodeVarint(data[readPosition:readPosition+10])
|
||||||
readPosition += streamNumberLength
|
readPosition += cleartextStreamNumberLength
|
||||||
initialDecryptionSuccessful = False
|
initialDecryptionSuccessful = False
|
||||||
|
|
||||||
for key, cryptorObject in MyECSubscriptionCryptorObjects.items():
|
for key, cryptorObject in MyECSubscriptionCryptorObjects.items():
|
||||||
try:
|
try:
|
||||||
decryptedData = cryptorObject.decrypt(data[readPosition:])
|
decryptedData = cryptorObject.decrypt(data[readPosition:])
|
||||||
|
@ -756,6 +755,12 @@ class receiveDataThread(QThread):
|
||||||
ripe = hashlib.new('ripemd160')
|
ripe = hashlib.new('ripemd160')
|
||||||
ripe.update(sha.digest())
|
ripe.update(sha.digest())
|
||||||
|
|
||||||
|
if toRipe != ripe.digest():
|
||||||
|
print 'The encryption key used to encrypt this message doesn\'t match the keys inbedded in the message itself. Ignoring message.'
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
print 'The encryption key DOES match the keys in the message.'
|
||||||
|
|
||||||
messageEncodingType, messageEncodingTypeLength = decodeVarint(decryptedData[readPosition:readPosition+9])
|
messageEncodingType, messageEncodingTypeLength = decodeVarint(decryptedData[readPosition:readPosition+9])
|
||||||
if messageEncodingType == 0:
|
if messageEncodingType == 0:
|
||||||
return
|
return
|
||||||
|
@ -2265,6 +2270,27 @@ def isAddressInMyAddressBook(address):
|
||||||
sqlLock.release()
|
sqlLock.release()
|
||||||
return queryreturn != []
|
return queryreturn != []
|
||||||
|
|
||||||
|
def isAddressInMyAddressBookSubscriptionsListOrWhitelist(address):
|
||||||
|
if isAddressInMyAddressBook(address):
|
||||||
|
return True
|
||||||
|
|
||||||
|
sqlLock.acquire()
|
||||||
|
sqlSubmitQueue.put('''SELECT address FROM whitelist where address=? and enabled = '1' ''')
|
||||||
|
sqlSubmitQueue.put((address,))
|
||||||
|
queryreturn = sqlReturnQueue.get()
|
||||||
|
sqlLock.release()
|
||||||
|
if queryreturn <> []:
|
||||||
|
return True
|
||||||
|
|
||||||
|
sqlLock.acquire()
|
||||||
|
sqlSubmitQueue.put('''select address from subscriptions where address=? and enabled = '1' ''')
|
||||||
|
sqlSubmitQueue.put((address,))
|
||||||
|
queryreturn = sqlReturnQueue.get()
|
||||||
|
sqlLock.release()
|
||||||
|
if queryreturn <> []:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
def assembleVersionMessage(remoteHost,remotePort,myStreamNumber):
|
def assembleVersionMessage(remoteHost,remotePort,myStreamNumber):
|
||||||
global softwareVersion
|
global softwareVersion
|
||||||
payload = ''
|
payload = ''
|
||||||
|
@ -2383,6 +2409,9 @@ class sqlThread(QThread):
|
||||||
self.cur.execute( '''CREATE TABLE pubkeys (hash blob, transmitdata blob, time int, usedpersonally text, UNIQUE(hash) ON CONFLICT REPLACE)''' )
|
self.cur.execute( '''CREATE TABLE pubkeys (hash blob, transmitdata blob, time int, usedpersonally text, UNIQUE(hash) ON CONFLICT REPLACE)''' )
|
||||||
self.cur.execute( '''INSERT INTO pubkeys SELECT hash, transmitdata, time, usedpersonally FROM pubkeys_backup;''')
|
self.cur.execute( '''INSERT INTO pubkeys SELECT hash, transmitdata, time, usedpersonally FROM pubkeys_backup;''')
|
||||||
self.cur.execute( '''DROP TABLE pubkeys_backup;''')
|
self.cur.execute( '''DROP TABLE pubkeys_backup;''')
|
||||||
|
print 'Deleting all pubkeys from inventory. They will be redownloaded and then saved with the correct times.'
|
||||||
|
self.cur.execute( '''delete from inventory where objecttype = 'pubkey';''')
|
||||||
|
print 'Commiting.'
|
||||||
self.conn.commit()
|
self.conn.commit()
|
||||||
print 'Vacuuming message.dat. You might notice that the file size gets much smaller.'
|
print 'Vacuuming message.dat. You might notice that the file size gets much smaller.'
|
||||||
self.cur.execute( ''' VACUUM ''')
|
self.cur.execute( ''' VACUUM ''')
|
||||||
|
@ -2844,7 +2873,6 @@ class singleWorker(QThread):
|
||||||
signature = highlevelcrypto.sign(payload,privSigningKeyHex)
|
signature = highlevelcrypto.sign(payload,privSigningKeyHex)
|
||||||
dataToEncrypt += encodeVarint(len(signature))
|
dataToEncrypt += encodeVarint(len(signature))
|
||||||
dataToEncrypt += signature
|
dataToEncrypt += signature
|
||||||
print 'The string that we will hash to make the privEncryptionKey is', (encodeVarint(addressVersionNumber)+encodeVarint(streamNumber)+ripe).encode('hex')
|
|
||||||
privEncryptionKey = hashlib.sha512(encodeVarint(addressVersionNumber)+encodeVarint(streamNumber)+ripe).digest()[:32]
|
privEncryptionKey = hashlib.sha512(encodeVarint(addressVersionNumber)+encodeVarint(streamNumber)+ripe).digest()[:32]
|
||||||
pubEncryptionKey = pointMult(privEncryptionKey)
|
pubEncryptionKey = pointMult(privEncryptionKey)
|
||||||
payload += highlevelcrypto.encrypt(dataToEncrypt,pubEncryptionKey.encode('hex'))
|
payload += highlevelcrypto.encrypt(dataToEncrypt,pubEncryptionKey.encode('hex'))
|
||||||
|
@ -2964,8 +2992,13 @@ class singleWorker(QThread):
|
||||||
|
|
||||||
payload += pubSigningKey[1:] #The \x04 on the beginning of the public keys are not sent. This way there is only one acceptable way to encode and send a public key.
|
payload += pubSigningKey[1:] #The \x04 on the beginning of the public keys are not sent. This way there is only one acceptable way to encode and send a public key.
|
||||||
payload += pubEncryptionKey[1:]
|
payload += pubEncryptionKey[1:]
|
||||||
payload += encodeVarint(config.getint(fromaddress,'noncetrialsperbyte'))#todo: check and see whether the addressee is in our address book, subscription list, or whitelist and set lower POW requirement if yes.
|
#If the receiver of our message is in our address book, subscriptions list, or whitelist then we will allow them to do the network-minimum proof of work. Let us check to see if the receiver is in any of those lists.
|
||||||
payload += encodeVarint(config.getint(fromaddress,'payloadlengthextrabytes'))
|
if isAddressInMyAddressBookSubscriptionsListOrWhitelist(toaddress):
|
||||||
|
payload += encodeVarint(networkDefaultProofOfWorkNonceTrialsPerByte)
|
||||||
|
payload += encodeVarint(networkDefaultPayloadLengthExtraBytes)
|
||||||
|
else:
|
||||||
|
payload += encodeVarint(config.getint(fromaddress,'noncetrialsperbyte'))
|
||||||
|
payload += encodeVarint(config.getint(fromaddress,'payloadlengthextrabytes'))
|
||||||
|
|
||||||
payload += toHash #This hash will be checked by the receiver of the message to verify that toHash belongs to them. This prevents a Surreptitious Forwarding Attack.
|
payload += toHash #This hash will be checked by the receiver of the message to verify that toHash belongs to them. This prevents a Surreptitious Forwarding Attack.
|
||||||
payload += '\x02' #Type 2 is simple UTF-8 message encoding as specified on the Protocol Specification on the Bitmessage Wiki.
|
payload += '\x02' #Type 2 is simple UTF-8 message encoding as specified on the Protocol Specification on the Bitmessage Wiki.
|
||||||
|
@ -3024,17 +3057,11 @@ class singleWorker(QThread):
|
||||||
|
|
||||||
nonce = 0
|
nonce = 0
|
||||||
trialValue = 99999999999999999999
|
trialValue = 99999999999999999999
|
||||||
|
|
||||||
encodedStreamNumber = encodeVarint(toStreamNumber)
|
|
||||||
#We are now dropping the unencrypted data in payload since it has already been encrypted and replacing it with the encrypted payload that we will send out.
|
#We are now dropping the unencrypted data in payload since it has already been encrypted and replacing it with the encrypted payload that we will send out.
|
||||||
payload = embeddedTime + encodedStreamNumber + encrypted
|
payload = embeddedTime + encodeVarint(toStreamNumber) + encrypted
|
||||||
target = 2**64 / ((len(payload)+requiredPayloadLengthExtraBytes+8) * requiredAverageProofOfWorkNonceTrialsPerByte)
|
target = 2**64 / ((len(payload)+requiredPayloadLengthExtraBytes+8) * requiredAverageProofOfWorkNonceTrialsPerByte)
|
||||||
printLock.acquire()
|
printLock.acquire()
|
||||||
print '(For msg message) Doing proof of work. Target:', target
|
print '(For msg message) Doing proof of work. Total required difficulty:', float(requiredAverageProofOfWorkNonceTrialsPerByte)/networkDefaultProofOfWorkNonceTrialsPerByte,'Required small message difficulty:', float(requiredPayloadLengthExtraBytes)/networkDefaultPayloadLengthExtraBytes
|
||||||
print 'Using requiredAverageProofOfWorkNonceTrialsPerByte', requiredAverageProofOfWorkNonceTrialsPerByte
|
|
||||||
print 'Using requiredPayloadLengthExtraBytes =', requiredPayloadLengthExtraBytes
|
|
||||||
print 'The required total difficulty is', float(requiredAverageProofOfWorkNonceTrialsPerByte)/networkDefaultProofOfWorkNonceTrialsPerByte
|
|
||||||
print 'The required small message difficulty is', float(requiredPayloadLengthExtraBytes)/networkDefaultPayloadLengthExtraBytes
|
|
||||||
printLock.release()
|
printLock.release()
|
||||||
powStartTime = time.time()
|
powStartTime = time.time()
|
||||||
initialHash = hashlib.sha512(payload).digest()
|
initialHash = hashlib.sha512(payload).digest()
|
||||||
|
@ -3107,8 +3134,7 @@ class singleWorker(QThread):
|
||||||
def generateFullAckMessage(self,ackdata,toStreamNumber,embeddedTime):
|
def generateFullAckMessage(self,ackdata,toStreamNumber,embeddedTime):
|
||||||
nonce = 0
|
nonce = 0
|
||||||
trialValue = 99999999999999999999
|
trialValue = 99999999999999999999
|
||||||
encodedStreamNumber = encodeVarint(toStreamNumber)
|
payload = embeddedTime + encodeVarint(toStreamNumber) + ackdata
|
||||||
payload = embeddedTime + encodedStreamNumber + ackdata
|
|
||||||
target = 2**64 / ((len(payload)+networkDefaultPayloadLengthExtraBytes+8) * networkDefaultProofOfWorkNonceTrialsPerByte)
|
target = 2**64 / ((len(payload)+networkDefaultPayloadLengthExtraBytes+8) * networkDefaultProofOfWorkNonceTrialsPerByte)
|
||||||
printLock.acquire()
|
printLock.acquire()
|
||||||
print '(For ack message) Doing proof of work...'
|
print '(For ack message) Doing proof of work...'
|
||||||
|
@ -3146,7 +3172,6 @@ class addressGenerator(QThread):
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
if self.addressVersionNumber == 3:
|
if self.addressVersionNumber == 3:
|
||||||
|
|
||||||
if self.deterministicPassphrase == "":
|
if self.deterministicPassphrase == "":
|
||||||
statusbar = 'Generating one new address'
|
statusbar = 'Generating one new address'
|
||||||
self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"),statusbar)
|
self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"),statusbar)
|
||||||
|
|
Reference in New Issue
Block a user