From b984f1931f66337270d82a70fbc59daa7b389d99 Mon Sep 17 00:00:00 2001
From: Jonathan Warren <me@jonwarren.org>
Date: Fri, 23 Nov 2012 03:22:56 -0500
Subject: [PATCH] Fixed POW, changed checksum, other minor changes

---
 bitmessagemain.py    | 246 ++++++++++++++++++++++++-------------------
 defaultKnownNodes.py |   2 +-
 rsa/__init__.pyc     | Bin 1226 -> 0 bytes
 rsa/_compat.pyc      | Bin 3873 -> 0 bytes
 rsa/bigfile.pyc      | Bin 2864 -> 0 bytes
 rsa/common.pyc       | Bin 4327 -> 0 bytes
 rsa/core.pyc         | Bin 1547 -> 0 bytes
 rsa/key.pyc          | Bin 17872 -> 0 bytes
 rsa/pem.pyc          | Bin 2808 -> 0 bytes
 rsa/pkcs1.pyc        | Bin 12044 -> 0 bytes
 rsa/prime.pyc        | Bin 3817 -> 0 bytes
 rsa/randnum.pyc      | Bin 1830 -> 0 bytes
 rsa/transform.pyc    | Bin 5885 -> 0 bytes
 rsa/varblock.pyc     | Bin 3860 -> 0 bytes
 14 files changed, 141 insertions(+), 107 deletions(-)
 delete mode 100644 rsa/__init__.pyc
 delete mode 100644 rsa/_compat.pyc
 delete mode 100644 rsa/bigfile.pyc
 delete mode 100644 rsa/common.pyc
 delete mode 100644 rsa/core.pyc
 delete mode 100644 rsa/key.pyc
 delete mode 100644 rsa/pem.pyc
 delete mode 100644 rsa/pkcs1.pyc
 delete mode 100644 rsa/prime.pyc
 delete mode 100644 rsa/randnum.pyc
 delete mode 100644 rsa/transform.pyc
 delete mode 100644 rsa/varblock.pyc

diff --git a/bitmessagemain.py b/bitmessagemain.py
index 56d4db12..dcd9792f 100644
--- a/bitmessagemain.py
+++ b/bitmessagemain.py
@@ -123,8 +123,6 @@ class singleListener(QThread):
 
         while True:
         #for i in range(0,1): #uncomment this line and comment the line above this to accept only one connection.
-
-
             rd = receiveDataThread()
             a,(HOST,PORT) = sock.accept()
             while HOST in connectedHostsList:
@@ -136,7 +134,6 @@ class singleListener(QThread):
             print self, 'connected to', HOST,'during INCOMING request.'
             rd.start()
 
-
             sd = sendDataThread()
             sd.setup(a,HOST,PORT,-1)
             sd.start()
@@ -181,13 +178,13 @@ class receiveDataThread(QThread):
                 break
             except Exception, err:
                 printLock.acquire()
-                print 'Error receiving data. Closing receiveData thread.'
+                print 'sock.recv error. Closing receiveData thread.'
                 printLock.release()
                 break
             #print 'Received', repr(self.data)
             if self.data == "":
                 printLock.acquire()
-                print 'Socket timeout.'
+                print 'Connection closed.'
                 printLock.release()
                 break
             else:
@@ -240,7 +237,9 @@ class receiveDataThread(QThread):
                             knownNodes[self.streamNumber][self.HOST] = (self.PORT,int(time.time()))
                         remoteCommand = self.data[4:16]
                         if verbose >= 2:
+                            printLock.acquire()
                             print 'remoteCommand ', remoteCommand, 'from', self.HOST
+                            printLock.release()
                         if remoteCommand == 'version\x00\x00\x00\x00\x00':
                             self.recversion()
                         elif remoteCommand == 'verack\x00\x00\x00\x00\x00\x00':
@@ -286,37 +285,23 @@ class receiveDataThread(QThread):
                                     self.sendgetdata(objectHash)
                                     del self.objectsThatWeHaveYetToGet[objectHash] #It is possible that the remote node doesn't respond with the object. In that case, we'll very likely get it from someone else anyway.
                                     break
-                            print 'within processData, length of objectsThatWeHaveYetToGet is now', len(self.objectsThatWeHaveYetToGet)
-                        self.processData()
-
-
-                        #if self.versionSent == 0:
-                        #    self.sendversion()
-                        '''if (self.versionRec == 1) and (self.getaddrthreadalreadycreated == 0):
-                            while (threading.activeCount() > maxGlobalThreads):#If there too many open threads, just wait. This includes full and half-open.
-                                time.sleep(0.1)
                             printLock.acquire()
-                            print 'Starting a new getaddrSender thread'
+                            print 'within processData, length of objectsThatWeHaveYetToGet is now', len(self.objectsThatWeHaveYetToGet)
                             printLock.release()
-                            bar = getaddrSender((self.sock,self.addr))
-                            bar.daemon = True
-                            self.getaddrthreadalreadycreated = 1 #we're about to start it
-                            while True: #My goal is to try bar.start() until it succeedes
-                                while (threading.activeCount() > maxGlobalThreads):#If there too many open threads, just wait. This includes full and half-open.
-                                    time.sleep(0.1)
-                                try:
-                                    bar.start()
-                                except:
-                                    maxGlobalThreads = maxGlobalThreads - 20
-                                    sys.stderr.write('Problem! Your OS did not allow the starting of another thread. Reducing the number of threads to %s and trying again.\n' % maxGlobalThreads)
-                                    continue #..the while loop again right now
-                                break    '''
+                        self.processData()
                     else:
-                        print 'Checksum incorrect. Clearing messages and waiting for new data.'
-                        self.data = ''
+                        print 'Checksum incorrect. Clearing this message.'
+                        self.data = self.data[self.payloadLength+24:]
+
+    def isProofOfWorkSufficient(self):
+        POW, = unpack('>Q',hashlib.sha512(hashlib.sha512(self.data[24:32]+ hashlib.sha512(self.data[32:24+self.payloadLength]).digest()).digest()).digest()[0:8])
+        print 'POW:', POW
+        #Notice that I have divided the averageProofOfWorkNonceTrialsPerByte by two. This makes the POW requirement easier. This gives us wiggle-room: if we decide that we want to make the POW easier, the change won't obsolete old clients because they already expect a lower POW. If we decide that the current work done by clients feels approperate then we can remove this division by 2 and make the requirement match what is actually done by a sending node. If we want to raise the POW requirement then old nodes will HAVE to upgrade no matter what.
+        return POW < 2**64 / ((self.payloadLength+payloadLengthExtraBytes) * (averageProofOfWorkNonceTrialsPerByte/2))
+
     def sendpong(self):
         print 'Sending pong'
-        self.sock.sendall('\xE9\xBE\xB4\xD9\x70\x6F\x6E\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x6D\xf0\x68')
+        self.sock.sendall('\xE9\xBE\xB4\xD9\x70\x6F\x6E\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x83\xe1\x35')
 
     def recverack(self):
         print 'verack received'
@@ -334,11 +319,13 @@ class receiveDataThread(QThread):
         connectionsCount[self.streamNumber] += 1
         self.emit(SIGNAL("updateNetworkStatusTab(PyQt_PyObject,PyQt_PyObject)"),self.streamNumber,connectionsCount[self.streamNumber])
         connectionsCountLock.release()
-        self.sendaddr()
         remoteNodeIncomingPort, remoteNodeSeenTime = knownNodes[self.streamNumber][self.HOST]
-        print 'within connectionFullyEstablished, self.HOST and remoteNodeIncomingPort:', self.HOST, remoteNodeIncomingPort
+        printLock.acquire()
+        print 'Connection fully established with', self.HOST, remoteNodeIncomingPort
         print 'broadcasting addr from within connectionFullyEstablished function.'
-        self.broadcastaddr([(int(time.time()), self.streamNumber, 1, self.HOST, remoteNodeIncomingPort)])
+        printLock.release()
+        self.broadcastaddr([(int(time.time()), self.streamNumber, 1, self.HOST, remoteNodeIncomingPort)]) #This lets all of our peers know about this new node.
+        self.sendaddr() #This is one addr message to this one peer.
         if connectionsCount[self.streamNumber] > 150:
             print 'We are connected to too many people. Closing connection.'
             self.sock.close()
@@ -374,27 +361,31 @@ class receiveDataThread(QThread):
                 payload += hash
                 numberOfObjectsInInvMessage += 1
                 if numberOfObjectsInInvMessage >= 50000: #We can only send a max of 50000 items per inv message but we may have more objects to advertise. They must be split up into multiple inv messages.
-                    sendinvMessageToJustThisOnePeer(numberOfObjectsInInvMessage,payload,)
+                    sendinvMessageToJustThisOnePeer(numberOfObjectsInInvMessage,payload)
                     payload = ''
                     numberOfObjectsInInvMessage = 0
             if numberOfObjectsInInvMessage > 0:
-                self.sendinvMessageToJustThisOnePeer(numberOfObjectsInInvMessage,payload,)
+                self.sendinvMessageToJustThisOnePeer(numberOfObjectsInInvMessage,payload)
                 
-    #Notice that there is also a broadcastinv function for broadcasting invs to everyone in our stream.
-    def sendinvMessageToJustThisOnePeer(self,numberOfObjects,payload,destination):
+    #Self explanatory. Notice that there is also a broadcastinv function for broadcasting invs to everyone in our stream.
+    def sendinvMessageToJustThisOnePeer(self,numberOfObjects,payload):
         payload = encodeVarint(numberOfObjects) + payload
         headerData = '\xe9\xbe\xb4\xd9' #magic bits, slighly different from Bitcoin's magic bits.
         headerData = headerData + 'inv\x00\x00\x00\x00\x00\x00\x00\x00\x00'
         headerData = headerData + pack('>L',len(payload))
         headerData = headerData + hashlib.sha512(payload).digest()[:4]
+        print 'Sending inv message to just this one peer'
         self.sock.send(headerData + payload)
 
     #We have received a broadcast message
     def recbroadcast(self):
         #First we must check to make sure the proof of work is sufficient.
-        POW, = unpack('>Q',hashlib.sha512(self.data[24:24+self.payloadLength]).digest()[4:12])
-        if POW > 2**64 / ((self.payloadLength+payloadLengthExtraBytes) * averageProofOfWorkNonceTrialsPerByte):
-            print 'The proof of work in this broadcast message is insufficient. Ignoring message.'
+        #POW, = unpack('>Q',hashlib.sha512(self.data[24:24+self.payloadLength]).digest()[4:12])
+        #if POW > 2**64 / ((self.payloadLength+payloadLengthExtraBytes) * averageProofOfWorkNonceTrialsPerByte):
+        #    print 'The proof of work in this broadcast message is insufficient. Ignoring message.'
+        #    return
+        if not self.isProofOfWorkSufficient():
+            print 'Proof of work in broadcast message insufficient.'
             return
         embeddedTime, = unpack('>I',self.data[32:36])
         if embeddedTime > (int(time.time())+10800): #prevent funny business
@@ -510,13 +501,16 @@ class receiveDataThread(QThread):
     #We have received a msg message.
     def recmsg(self):
         #First we must check to make sure the proof of work is sufficient.
-        POW, = unpack('>Q',hashlib.sha512(self.data[24:24+self.payloadLength]).digest()[4:12])
-        print 'POW:', POW
-        initialDecryptionSuccessful = False
-        if POW > 2**64 / ((self.payloadLength+payloadLengthExtraBytes) * averageProofOfWorkNonceTrialsPerByte):
+        #POW, = unpack('>Q',hashlib.sha512(self.data[24:24+self.payloadLength]).digest()[4:12])
+        #print 'POW:', POW
+        
+        #if POW > 2**64 / ((self.payloadLength+payloadLengthExtraBytes) * averageProofOfWorkNonceTrialsPerByte):
+        #    print 'Proof of work in msg message insufficient.'
+        #    return
+        if not self.isProofOfWorkSufficient():
             print 'Proof of work in msg message insufficient.'
             return
-
+        initialDecryptionSuccessful = False
         readPosition = 32
         embeddedTime, = unpack('>I',self.data[readPosition:readPosition+4])
         if embeddedTime > int(time.time())+10800:
@@ -547,7 +541,7 @@ class receiveDataThread(QThread):
         #Let's check whether this is a message acknowledgement bound for us.
         if self.data[readPosition:24+self.payloadLength] in ackdataForWhichImWatching:
             printLock.acquire()
-            print 'This msg is an acknowledgement bound for me.'
+            print 'This msg IS an acknowledgement bound for me.'
             printLock.release()
             del ackdataForWhichImWatching[self.data[readPosition:24+self.payloadLength]]
             t = ('ackreceived',self.data[readPosition:24+self.payloadLength])
@@ -561,8 +555,8 @@ class receiveDataThread(QThread):
             return
         else:
             printLock.acquire()
-            print 'This was NOT an acknowledgement bound for me. Msg potential ack data:', repr(self.data[readPosition:24+self.payloadLength])
-            print 'ackdataForWhichImWatching', ackdataForWhichImWatching
+            print 'This was NOT an acknowledgement bound for me.' #Msg potential ack data:', repr(self.data[readPosition:24+self.payloadLength])
+            #print 'ackdataForWhichImWatching', ackdataForWhichImWatching
             printLock.release()
 
         #This is not an acknowledgement bound for me. See if it is a message bound for me by trying to decrypt it with my private keys.
@@ -723,37 +717,52 @@ class receiveDataThread(QThread):
                                 sqlLock.release()
                                 self.emit(SIGNAL("displayNewMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"),inventoryHash,toAddress,fromAddress,subject,body)
                         #Now let's send the acknowledgement
-                        POW, = unpack('>Q',hashlib.sha512(hashlib.sha512(ackData[24:]).digest()).digest()[4:12])
-                        if POW <= 2**64 / ((len(ackData[24:])+payloadLengthExtraBytes) * averageProofOfWorkNonceTrialsPerByte):
-                            print 'The POW is strong enough that this ackdataPayload will be accepted by the Bitmessage network.'
+                        #POW, = unpack('>Q',hashlib.sha512(hashlib.sha512(ackData[24:]).digest()).digest()[4:12])
+                        #if POW <= 2**64 / ((len(ackData[24:])+payloadLengthExtraBytes) * averageProofOfWorkNonceTrialsPerByte):
+                            #print 'The POW is strong enough that this ackdataPayload will be accepted by the Bitmessage network.'
                             #Currently PyBitmessage only supports sending a message with the acknowledgement in the form of a msg message. But future versions, and other clients, could send any object and this software will relay them. This can be used to relay identifying information, like your public key, through another Bitmessage host in case you believe that your Internet connection is being individually watched. You may pick a random address, hope its owner is online, and send a message with encoding type 0 so that they ignore the message but send your acknowledgement data over the network. If you send and receive many messages, it would also be clever to take someone else's acknowledgement data and use it for your own. Assuming that your message is delivered successfully, both will be acknowledged simultaneously (though if it is not delivered successfully, you will be in a pickle.)
                             #print 'self.data before:', repr(self.data)
+                        #We'll need to make sure that our client will properly process the ackData; if the packet is malformed, we could clear out self.data and an attacker could use that behavior to determine that we were capable of decoding this message.
+                        ackDataValidThusFar = True
+                        if len(ackData) < 24:
+                            print 'The length of Ackdata is unreasonably short. Not sending ackData.'
+                            ackDataValidThusFar = False
+                        if ackData[0:4] != '\xe9\xbe\xb4\xd9':
+                            print 'Ackdata magic bytes were wrong. Not sending ackData.'
+                            ackDataValidThusFar = False
+                        if ackDataValidThusFar:
+                            ackDataPayloadLength, = unpack('>L',ackData[16:20])
+                            if len(ackData)-24 != ackDataPayloadLength:
+                                print 'ackData payload length doesn\'t match the payload length specified in the header. Not sending ackdata.'
+                                ackDataValidThusFar = False
+                        if ackDataValidThusFar:
+                            print 'ackData is valid. Will process it.'
                             self.data = self.data[:self.payloadLength+24] + ackData + self.data[self.payloadLength+24:]
                             #print 'self.data after:', repr(self.data)
-                            '''if ackData[4:16] == 'msg\x00\x00\x00\x00\x00\x00\x00\x00\x00':
-                                inventoryHash = calculateInventoryHash(ackData[24:])
-                                #objectType = 'msg'
-                                #inventory[inventoryHash] = (objectType, self.streamNumber, ackData[24:], embeddedTime) #We should probably be storing the embeddedTime of the ackData, not the embeddedTime of the original incoming msg message, but this is probably close enough.
-                                #print 'sending the inv for the msg which is actually an acknowledgement (within sendmsg function)'
-                                #self.broadcastinv(inventoryHash)
-                                self.data[:payloadLength+24] + ackData + self.data[payloadLength+24:]
-                            elif ackData[4:16] == 'getpubkey\x00\x00\x00':
-                                #objectType = 'getpubkey'
-                                #inventory[inventoryHash] = (objectType, self.streamNumber, ackData[24:], embeddedTime) #We should probably be storing the embeddedTime of the ackData, not the embeddedTime of the original incoming msg message, but this is probably close enough.
-                                #print 'sending the inv for the getpubkey which is actually an acknowledgement (within sendmsg function)'
-                                self.data[:payloadLength+24] + ackData + self.data[payloadLength+24:]
-                            elif ackData[4:16] == 'pubkey\x00\x00\x00\x00\x00\x00':
-                                #objectType = 'pubkey'
-                                #inventory[inventoryHash] = (objectType, self.streamNumber, ackData[24:], embeddedTime) #We should probably be storing the embeddedTime of the ackData, not the embeddedTime of the original incoming msg message, but this is probably close enough.
-                                #print 'sending the inv for a pubkey which is actually an acknowledgement (within sendmsg function)'
-                                self.data[:payloadLength+24] + ackData + self.data[payloadLength+24:]
-                            elif ackData[4:16] == 'broadcast\x00\x00\x00':
-                                #objectType = 'broadcast'
-                                #inventory[inventoryHash] = (objectType, self.streamNumber, ackData[24:], embeddedTime) #We should probably be storing the embeddedTime of the ackData, not the embeddedTime of the original incoming msg message, but this is probably close enough.
-                                #print 'sending the inv for a broadcast which is actually an acknowledgement (within sendmsg function)'
-                                self.data[:payloadLength+24] + ackData + self.data[payloadLength+24:]'''
-                        else:
-                            print 'ACK POW not strong enough to be accepted by the Bitmessage network.'
+                        '''if ackData[4:16] == 'msg\x00\x00\x00\x00\x00\x00\x00\x00\x00':
+                            inventoryHash = calculateInventoryHash(ackData[24:])
+                            #objectType = 'msg'
+                            #inventory[inventoryHash] = (objectType, self.streamNumber, ackData[24:], embeddedTime) #We should probably be storing the embeddedTime of the ackData, not the embeddedTime of the original incoming msg message, but this is probably close enough.
+                            #print 'sending the inv for the msg which is actually an acknowledgement (within sendmsg function)'
+                            #self.broadcastinv(inventoryHash)
+                            self.data[:payloadLength+24] + ackData + self.data[payloadLength+24:]
+                        elif ackData[4:16] == 'getpubkey\x00\x00\x00':
+                            #objectType = 'getpubkey'
+                            #inventory[inventoryHash] = (objectType, self.streamNumber, ackData[24:], embeddedTime) #We should probably be storing the embeddedTime of the ackData, not the embeddedTime of the original incoming msg message, but this is probably close enough.
+                            #print 'sending the inv for the getpubkey which is actually an acknowledgement (within sendmsg function)'
+                            self.data[:payloadLength+24] + ackData + self.data[payloadLength+24:]
+                        elif ackData[4:16] == 'pubkey\x00\x00\x00\x00\x00\x00':
+                            #objectType = 'pubkey'
+                            #inventory[inventoryHash] = (objectType, self.streamNumber, ackData[24:], embeddedTime) #We should probably be storing the embeddedTime of the ackData, not the embeddedTime of the original incoming msg message, but this is probably close enough.
+                            #print 'sending the inv for a pubkey which is actually an acknowledgement (within sendmsg function)'
+                            self.data[:payloadLength+24] + ackData + self.data[payloadLength+24:]
+                        elif ackData[4:16] == 'broadcast\x00\x00\x00':
+                            #objectType = 'broadcast'
+                            #inventory[inventoryHash] = (objectType, self.streamNumber, ackData[24:], embeddedTime) #We should probably be storing the embeddedTime of the ackData, not the embeddedTime of the original incoming msg message, but this is probably close enough.
+                            #print 'sending the inv for a broadcast which is actually an acknowledgement (within sendmsg function)'
+                            self.data[:payloadLength+24] + ackData + self.data[payloadLength+24:]'''
+                        #else:
+                            #print 'ACK POW not strong enough to be accepted by the Bitmessage network.'
 
                 else:
                     print 'This program cannot decode messages from addresses with versions higher than 1. Ignoring.'
@@ -776,16 +785,22 @@ class receiveDataThread(QThread):
         if inventoryHash in inventory:
             print 'We have already received this pubkey. Ignoring it.'
             return
+        elif isInSqlInventory(inventoryHash):
+            print 'We have already received this pubkey (it is stored on disk in the SQL inventory). Ignoring it.'
+            return
 
         #We must check to make sure the proof of work is sufficient.
-        POW, = unpack('>Q',hashlib.sha512(hashlib.sha512(self.data[24:24+self.payloadLength]).digest()).digest()[4:12])
-        print 'POW:', POW
-        if POW > 2**64 / ((self.payloadLength+payloadLengthExtraBytes) * averageProofOfWorkNonceTrialsPerByte):
-            printLock.acquire()
-            print 'The Proof of Work in the pubkey message is insufficient. Ignoring it.'
-            print 'pubkey payload length:', len(self.data[24:self.payloadLength+24])
-            print repr(self.data[24:self.payloadLength+24])
-            printLock.release()
+        #POW, = unpack('>Q',hashlib.sha512(hashlib.sha512(self.data[24:24+self.payloadLength]).digest()).digest()[4:12])
+        #print 'POW:', POW
+        #if POW > 2**64 / ((self.payloadLength+payloadLengthExtraBytes) * averageProofOfWorkNonceTrialsPerByte):
+        #    printLock.acquire()
+        #    print 'The Proof of Work in the pubkey message is insufficient. Ignoring it.'
+        #    print 'pubkey payload length:', len(self.data[24:self.payloadLength+24])
+        #    print repr(self.data[24:self.payloadLength+24])
+        #    printLock.release()
+        #    return
+        if not self.isProofOfWorkSufficient():
+            print 'Proof of work in pubkey message insufficient.'
             return
 
         objectType = 'pubkey'
@@ -844,10 +859,13 @@ class receiveDataThread(QThread):
             objectType = 'pubkeyrequest'
             inventory[inventoryHash] = (objectType, self.streamNumber, self.data[24:self.payloadLength+24], int(time.time()))
             #First we must check to make sure the proof of work is sufficient.
-            POW, = unpack('>Q',hashlib.sha512(hashlib.sha512(self.data[24:24+self.payloadLength]).digest()).digest()[4:12])
-            print 'POW:', POW
-            if POW > 2**64 / ((self.payloadLength+payloadLengthExtraBytes) * averageProofOfWorkNonceTrialsPerByte):
-                print 'POW value in getpubkey message is insufficient. Ignoring it.'
+            #POW, = unpack('>Q',hashlib.sha512(hashlib.sha512(self.data[24:24+self.payloadLength]).digest()).digest()[4:12])
+            #print 'POW:', POW
+            #if POW > 2**64 / ((self.payloadLength+payloadLengthExtraBytes) * averageProofOfWorkNonceTrialsPerByte):
+            #    print 'POW value in getpubkey message is insufficient. Ignoring it.'
+            #    return
+            if not self.isProofOfWorkSufficient():
+                print 'Proof of work in getpubkey message insufficient.'
                 return
             #Now let us make sure that the getpubkey request isn't too old or with a fake (future) time.
             embeddedTime, = unpack('>I',self.data[32:36])
@@ -889,11 +907,13 @@ class receiveDataThread(QThread):
 
                     nonce = 0
                     trialValue = 99999999999999999999
-                    target = 2**64 / ((len(payload)+payloadLengthExtraBytes+8) * averageProofOfWorkNonceTrialsPerByte) #The 108 added to the payload length is 8 for the size of the nonce + 50 as an extra penalty simply for having this seperate message exist.
+                    target = 2**64 / ((len(payload)+payloadLengthExtraBytes+8) * averageProofOfWorkNonceTrialsPerByte)
                     print '(For pubkey message) Doing proof of work...'
+                    initialHash = hashlib.sha512(payload).digest()
                     while trialValue > target:
                         nonce += 1
-                        trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + payload).digest()).digest()[4:12])
+                        trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
+                        #trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + payload).digest()).digest()[4:12])
                     print '(For pubkey message) Found proof of work', trialValue, 'Nonce:', nonce
 
                     payload = pack('>Q',nonce) + payload
@@ -1340,7 +1360,8 @@ class receiveDataThread(QThread):
     #Sends a verack message
     def sendverack(self):
         print 'Sending verack'
-        self.sock.sendall('\xE9\xBE\xB4\xD9\x76\x65\x72\x61\x63\x6B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x6D\xf0\x68')
+        self.sock.sendall('\xE9\xBE\xB4\xD9\x76\x65\x72\x61\x63\x6B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x83\xe1\x35')
+                                                                                                             #cf  83  e1  35
         self.verackSent = True
         if self.verackReceived == True:
             self.connectionFullyEstablished()
@@ -1406,14 +1427,14 @@ class sendDataThread(QThread):
         while True:
             deststream,command,data = self.mailbox.get()
             printLock.acquire()
-            print 'within a sendDataThread, destream:', deststream,', Command:', command, self
+            print 'sendDataThread, destream:', deststream, ', Command:', command, ', ID:',id(self), ', HOST:', self.HOST
             printLock.release()
 
             if deststream == self.streamNumber or deststream == 0:
                 if command == 'shutdown':
                     if data == self.HOST or data == 'all':
                         printLock.acquire()
-                        print 'sendDataThread thread (associated with', self.HOST,')', self, 'shutting down now.'
+                        print 'sendDataThread thread (associated with', self.HOST,') ID:',id(self), 'shutting down now.'
                         self.sock.close()
                         sendDataQueues.remove(self.mailbox)
                         print 'len of sendDataQueues', len(sendDataQueues)
@@ -1423,7 +1444,7 @@ class sendDataThread(QThread):
                     hostInMessage, specifiedStreamNumber = data
                     if hostInMessage == self.HOST:
                         printLock.acquire()
-                        print 'setting the stream number in the sendData thread to', specifiedStreamNumber, self
+                        print 'setting the stream number in the sendData thread (ID:',id(self), ') to', specifiedStreamNumber
                         printLock.release()
                         self.streamNumber = specifiedStreamNumber
                 elif command == 'send':
@@ -1444,7 +1465,7 @@ class sendDataThread(QThread):
                         #Send out a pong message to keep the connection alive.
                         print 'Sending pong to', self.HOST, 'to keep connection alive.'
                         try:
-                            self.sock.sendall('\xE9\xBE\xB4\xD9\x70\x6F\x6E\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x6D\xf0\x68')
+                            self.sock.sendall('\xE9\xBE\xB4\xD9\x70\x6F\x6E\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x83\xe1\x35')
                             self.lastTimeISentData = int(time.time())
                         except:
                             print 'self.sock.send pong failed'
@@ -1753,9 +1774,10 @@ class singleWorker(QThread):
             trialValue = 99999999999999999999
             target = 2**64 / ((len(payload)+payloadLengthExtraBytes+8) * averageProofOfWorkNonceTrialsPerByte)
             print '(For broadcast message) Doing proof of work...'
+            initialHash = hashlib.sha512(payload).digest()
             while trialValue > target:
                 nonce += 1
-                trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + payload).digest()).digest()[4:12])
+                trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
             print '(For broadcast message) Found proof of work', trialValue, 'Nonce:', nonce
 
             payload = pack('>Q',nonce) + payload
@@ -1873,9 +1895,10 @@ class singleWorker(QThread):
             target = 2**64 / ((len(payload)+payloadLengthExtraBytes+8) * averageProofOfWorkNonceTrialsPerByte)
             print '(For msg message) Doing proof of work. Target:', target
             powStartTime = time.time()
+            initialHash = hashlib.sha512(payload).digest()
             while trialValue > target:
                 nonce += 1
-                trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + payload).digest()).digest()[4:12])
+                trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
             print '(For msg message) Found proof of work', trialValue, 'Nonce:', nonce
             print 'POW took', int(time.time()-powStartTime), 'seconds.', nonce/(time.time()-powStartTime), 'nonce trials per second.'
             payload = pack('>Q',nonce) + payload
@@ -1921,9 +1944,10 @@ class singleWorker(QThread):
         self.emit(SIGNAL("updateSentItemStatusByHash(PyQt_PyObject,PyQt_PyObject)"),ripe,'Doing work necessary to request public key.')
         print 'Doing proof-of-work necessary to send getpubkey message.'
         target = 2**64 / ((len(payload)+payloadLengthExtraBytes+8) * averageProofOfWorkNonceTrialsPerByte)
+        initialHash = hashlib.sha512(payload).digest()
         while trialValue > target:
             nonce += 1
-            trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + payload).digest()).digest()[4:12])
+            trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
         print 'Found proof of work', trialValue, 'Nonce:', nonce
 
         payload = pack('>Q',nonce) + payload
@@ -1950,11 +1974,18 @@ class singleWorker(QThread):
         encodedStreamNumber = encodeVarint(toStreamNumber)
         payload = embeddedTime + encodedStreamNumber + ackdata
         target = 2**64 / ((len(payload)+payloadLengthExtraBytes+8) * averageProofOfWorkNonceTrialsPerByte)
+        printLock.acquire()
         print '(For ack message) Doing proof of work...'
+        printLock.release()
+        powStartTime = time.time()
+        initialHash = hashlib.sha512(payload).digest()
         while trialValue > target:
             nonce += 1
-            trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + payload).digest()).digest()[4:12])
+            trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
+        printLock.acquire()
         print '(For ack message) Found proof of work', trialValue, 'Nonce:', nonce
+        print 'POW took', int(time.time()-powStartTime), 'seconds.', nonce/(time.time()-powStartTime), 'nonce trials per second.'
+        printLock.release()
         payload = pack('>Q',nonce) + payload
         headerData = '\xe9\xbe\xb4\xd9' #magic bits, slighly different from Bitcoin's magic bits.
         headerData = headerData + 'msg\x00\x00\x00\x00\x00\x00\x00\x00\x00'
@@ -2508,7 +2539,7 @@ class MyForm(QtGui.QMainWindow):
 
     def updateNetworkStatusTab(self,streamNumber,connectionCount):
         global statusIconColor
-        print 'updating network status tab'
+        #print 'updating network status tab'
         totalNumberOfConnectionsFromAllStreams = 0 #One would think we could use len(sendDataQueues) for this, but sendData threads don't remove themselves from sendDataQueues fast enough for len(sendDataQueues) to be accurate here.
         for currentRow in range(self.ui.tableWidgetConnectionCount.rowCount()):
             rowStreamNumber = int(self.ui.tableWidgetConnectionCount.item(currentRow,0).text())
@@ -2523,7 +2554,7 @@ class MyForm(QtGui.QMainWindow):
 
     def setStatusIcon(self,color):
         global statusIconColor
-        print 'setting status icon color'
+        #print 'setting status icon color'
         if color == 'red':
             self.ui.pushButtonStatusIcon.setIcon(QIcon(":/newPrefix/images/redicon.png"))
             statusIconColor = 'red'
@@ -2653,7 +2684,6 @@ class MyForm(QtGui.QMainWindow):
                             random.seed()
                             ackdata += pack('>Q',random.randrange(1, 18446744073709551615))
                         ackdataForWhichImWatching[ackdata] = 0
-                        print 'ackdataForWhichImWatching within pushButtonSend', repr(ackdataForWhichImWatching)
                         sqlLock.acquire()
                         t = ('',toAddress,ripe,fromAddress,subject,message,ackdata,int(time.time()),'findingpubkey',1,1,'sent')
                         sqlSubmitQueue.put('''INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?)''')
@@ -3391,9 +3421,9 @@ eightBytesOfRandomDataUsedToDetectConnectionsToSelf = pack('>Q',random.randrange
 connectedHostsList = {} #List of hosts to which we are connected. Used to guarantee that the outgoingSynSender thread won't connect to the same remote node twice.
 neededPubkeys = {}
 
-#These constants are not at the top because if changed they will cause particularly unexpected behavior
-averageProofOfWorkNonceTrialsPerByte = 2 #The amount of work that should be performed (and demanded) per byte of the payload. Double this number to double the work.
-payloadLengthExtraBytes = 1 #To make sending short messages a little more difficult, this value is added to the payload length for use in calculating the proof of work target.
+#These constants are not at the top because if changed they will cause particularly unexpected behavior: You won't be able to either send or receive messages because the proof of work you do (or demand) won't match that done or demanded by others. Don't change them!
+averageProofOfWorkNonceTrialsPerByte = 320 #The amount of work that should be performed (and demanded) per byte of the payload. Double this number to double the work.
+payloadLengthExtraBytes = 14000 #To make sending short messages a little more difficult, this value is added to the payload length for use in calculating the proof of work target.
 
 if __name__ == "__main__":
     major, minor, revision = sqlite3.sqlite_version_info
@@ -3471,4 +3501,8 @@ if __name__ == "__main__":
         if 'win' in sys.platform:
             myapp.setWindowFlags(Qt.ToolTip)
     
-    sys.exit(app.exec_())
\ No newline at end of file
+    sys.exit(app.exec_())
+
+# So far, the Bitmessage protocol, this client, the Wiki, and the forums
+# are all a one-man operation. Bitcoin tips are quite appreciated!
+# 1H5XaDA6fYENLbknwZyjiYXYPQaFjjLX2u
\ No newline at end of file
diff --git a/defaultKnownNodes.py b/defaultKnownNodes.py
index fe804818..1ab30397 100644
--- a/defaultKnownNodes.py
+++ b/defaultKnownNodes.py
@@ -67,7 +67,7 @@ if __name__ == "__main__":
         appdata = path.expanduser(path.join("~", "." + APPNAME + "/"))
 
 
-    #print 'New list of all known nodes:', createDefaultKnownNodes(appdata)
+    print 'New list of all known nodes:', createDefaultKnownNodes(appdata)
     readDefaultKnownNodes(appdata)
 
 
diff --git a/rsa/__init__.pyc b/rsa/__init__.pyc
deleted file mode 100644
index 756984fd83942e45122f91a2250a56eeeb71bfd2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1226
zcmZuw&2Aev5T2E7*<MSI?ev%fPlXPO5G6ng1Vs@iDGDdBYpl^0T?nA*<w#=9p9RU4
zv*#ZAECu>beTY0jGF&N6P;>>&a=0_!_stBs^<kKQTmSoW1)FD|-Y@AN{vjg)O0pT0
z8OR=#J&;>aZh_nexdVC|%np=0VERz@!R$i03t9Ts2fYVoAIg0&Ig~k=11Jx`44@o<
z8A3S(a|q=jWcUE&F5LFO|J9-Hfj)xr2=EC0IEFs~GD`yXLFOP2Kn_3-K^}snv?Gwm
zupp8Xkb7`7I!UVk&H#$5Q)ZlOH0Jqv_hxhFStWGUXc3iNFfIH7S?!g<FlNF^mXgp`
zzOAEjcFZJxSqHVSl$EEr6?!#S6~Q<=VQ03|jl{qfXwk2+>*hwQsskm0m59i0u?>?v
z|LwH6IJ@}i1&d1+m@>6SgEn?pOge(GF0v*d^F-wgtA&(AJZ6<MwZ{;Ml({+OV_s<#
zKH~exl&zb{qN93nMR?3(jZr0qR2)_AD4yzf#!z~|s_`neiQl_br+~!$LacWxE~!l(
zN$c61wXR`zg764>DOSh?wbkPq0so_a-03DFHg9azakIIn8j{xQYahg<zOBOa`g$`P
z;t0=ZWLNEtN6W5avqC*)uY~t4J4YeA4*rgT`inI?7j_}EsFl`j$SLpXlj+mPPo6)X
zeiwGgeKwg+rs^X-qb+jdE*Xn=sq-;~U#>^-4%?WH_+>XF@<#p7(VOXanVadyZTgs|
zA5&B}`ZhkG<(vD{@uT<7$79<2^{bPy-rb{J&W%u(^NWHUD3Z1!p%zJWkzk8nGIVaC
zNTQ3BHF`*<Q^L7)73W<IoQozdohNq<E$MKPb3nnIle~03$WJh-;Z*#ZwF6HyUG4X?
z_+K^m8a5nOn8cB`NlC;IyLDR7CEI8eT5~?45cp!kOLAYon4O-!VsD)laVhNVvZVs-
z>_$bpc|k1j>t*oOjKs}2S5`&NCw1G2_<ntxe|SWI;TtmjUO%H>?@>0{9%O@T*gMHS
E0gJOptpET3

diff --git a/rsa/_compat.pyc b/rsa/_compat.pyc
deleted file mode 100644
index c0d859bdd71a138b8c9c62fb5c6f6f249a4b252a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3873
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
L@3cCtZW#Orc-FFY

diff --git a/rsa/bigfile.pyc b/rsa/bigfile.pyc
deleted file mode 100644
index d6fe60839f6a6c54a604d9c4bdceadb9ba9b884d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2864
zcmcIm>uwuG6h3R`>QX4F8YmKCgjDJujYWR|lDVc$T1ulN+D1i+Qf=3}6MK{09cO2p
z#>n|Yc_E&Nhu{I=J7?BOhytn*Sn+sf_T10+olW!i>#a|QzilN{e;WAx4qv;AB_+a7
z8c^DxJfNaMyA3LuwA-X&hIVJDn5ErW3Rt2^`5YDVv^$UU4E+Mt1xjaSvq<S2rSsH>
zffl6;^sK$eKGvE<8*$awYCp@hvZLY9RIb%h_^ha2rQ<^t`)66{jIu?X=ekn8+$4wg
zo{Gy<=`yLtL#Nz87yiaNQ)xbn9W|BEX|1QS5}F1AmDuh~9lH3CgGdH=d_jw2gR@k7
zN13yK382!6DXptUi3CwQHC5Kn$~d2T*cs?cCe^;FirA^ls@UR?=jIjMyh2!7O(yV%
z7&Uy2omOy>#7>v7%S_qz0Y7@Ov97vbtLN+CvnN}dtn*-F>*3S$O{Y`m=I<f9vA+3u
z=X;h|TisdpcIrDkJ&r5Xc?BgkDaw`WvhN1U>~k?un4Z-~BV9U`#xCxt=OT^J3PibI
znL<*3Y)l`$+^&o>z0v+zlVA~vmMFf{eN<i=8jH)g2ZeG}^l%MloUrYPvGo|ukOGV>
z)H#eV6zZg{Q$213K;fg6XUB0q(jCRM9%TJNEv2k>VhzIg;Wy2=l-^pYPhg2F%x%c6
zQNy@$)0BNZyumzXpDg(*%X6_eh>sa(&_pckg~Rz2CEwvYf%JKg6NYXoVLo3CeM9`y
zdkn}tE7>y2%}IL4H9}g*9g3z#ga`-&l+AwPO0}{-@M+J0QVxuwLp^qL_(f+5Q@UAf
zhlh#1?-sCwX;E$mI5^hfq!QMf$Crg4;%k4!;)o^<aseGQ=yika9kvg$<8t|RKtBgm
zij9L=zB-sATw+vwaN48^1e^5!=?qPvK2PxN7U`hHBKQkVw&Z+`Ch#%C*4JKqNvE^q
z-lBu+G!cuqJ)IM|x7mz)hbH0!_klO-&%seiKVs-SYjgPaCQ@7XV*yQ-Mu1mU=CZP{
z&?%Jit{FLQ&|R+mrG9wmNr$^YLtH?HWxHZ&CC@M=Oz%K5-;KhM@?A}G4d^hQ&bUyk
z*S@aS=eT5ADH$*3ih$teVl=~1FG7pEsyiHa6X4QzUsg8mY>#?*mORztmmJr0E;6P(
z&+SJjju%qUN90GNtkUT{)f+k0H%{HDGKNTY4a;Wx23FVNv&}Hz;xf@8PTY^F9XONI
z&UmQTtIAZNpo)!v5)tDQ=pphTlvG28T*z>9>|k2^sGef(U0jYcou|=$cA`^1>O+1l
zImTz57EnSY_9D*}0X_y+n}r1ZzG<RVH$e7v^(1UmA!77fIeAwcGNVXNo<{tBF>TzD
zEcRRM9(MOuS0AV!3`X)GF88*_ZeYqiWQ}QP<G#MQwN<i*4&kcLK<W&~fbv-`QGLCF
zE4ze+7MFsXjpd-#TyEYDmar3ga#UPAp=S@9H=^gs=ge|uC^7NYUfdzj6N!P8ASrmu
zEb}y75GsP5N1uUD4e*KkWN)E`YyRygBfRbbhSIcq|I9G~??nW^8K0!=SJC0$^6QMC
zm-tj=$5#^y5Add#GHUt{zy(GrlxN#Z{Vk<7<$s-!yXWb{l&Y0rI%L3lJ}@Rc^ru7G
zo&&%39<sKKxsd4-GF@b@59=(#TYSS5JsU{>19a<XrqF!^ca|fYLU$<$-@_^V5X)wp
z=ZTOnic*tAk&qRHkb20-kUV`ASeVCIgxA+Fc79%*8LQ3UWg122dHr|1T!8nl3X_g<
U{S8}{tmYaY2R9mvw-;~x372{g8UO$Q

diff --git a/rsa/common.pyc b/rsa/common.pyc
deleted file mode 100644
index 178b430545e166b87119cebb6a9cd356776db6c6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4327
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

diff --git a/rsa/core.pyc b/rsa/core.pyc
deleted file mode 100644
index 4099997e88aa350e62e077e7a32243a569af2e82..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1547
zcmb_cO>fgc5FI;7OG8U5B#_|3A{3fKTXErnTGS7EL8wJ;#i5F1x%MV8v3ITAO+%#i
zLiwNk2z~&(S*K~aAyM1=yt^|yJNxF@jbAJ6*VWJClxA0m_b!@!3&@DhfB|J86#<nY
zorM%+4f+8?gR-XYG%0KOPK&YyI_WO*@+-iBHd2&{8%jW)CWX+IH0Ww&x7zK~VQvK;
z*hP}MG3+U?h)(uIURH%HrE=bTLrjKwI%H?9imAwCKUXqq-;IrFtwgSz97u!k`EOj^
z0BN{3Ah+?%mhus~HPH^x>?XhwT@qafWY+lDCk}@W=n@an*O2-lJ%#Z*W?}5|@+12K
z*s;P6^|;8yIZiQ8U_&VFM8|d;@QKjKEdfral{_>?8$XKUv`DOtV;|44>qTN5=cSTT
zcJU?;b{oBecfGy6eeqE%Fq){|=cyZN)jQ8!DXmQg@^06fv}bJ6V?wv8siy#2N#mG?
z=LlyPIDEJqG{cm4<~C<!f<es)NVrDLdEjMmGYAPX-~sr74n{;~pO~~3lL(%aC-gF;
zQIpJo92P7vnV7jH6HYib&w}WXt{XS<*+l|}DmBx}S&@j@3B}mvY9M57fQ-aQPQ|(e
zu0tc*jM!Z2Y+Pue91C%_(v!-5ND=Jj0J7_VW7d<>YE#Jpw00qd8kgr#kVqg!JFY4e
zOJ?>Jd`}_Nn@l>nm#)^L(AcxDjZizCyvr0uEr6%|OHzzy1z+LKE~M!fdQwY(8L#xD
zmIzlP;)J6Ifcq@{L&Tdg#<hQmp<M$|V<o^11+1byt5v}1&sDI4!9S`1wBD`a6^hEW
z<WTk#;DemkGM!dKX@ryC+^nAb1ITKJc}=swYT6dK=5^)oxsJj?d}-OeW{y8iUx0`Y
zUe|-Uj~+2Fxe;@H-we<4XNKP(yyYCJSu^}NIO_7AUXXE|=`@ZVXNNCzD^7J;CC>jN
l>b#d>iB<u(Ir`rJ{{{H;+nz@G{t5b)Cl(rO;nL#L>K{A^a<%{f

diff --git a/rsa/key.pyc b/rsa/key.pyc
deleted file mode 100644
index 55ccd3a55c19906834acca44580ccccf8d682298..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 17872
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
RBnfP}!fERW6waQ){{n(aHe>(*

diff --git a/rsa/pem.pyc b/rsa/pem.pyc
deleted file mode 100644
index 69728a589b5b9faa7c34601e6966130abd3944f9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2808
zcmds3&2Ah;5U!coUB`|C*cQnJC7p=im52?8C_*NR;v`NKevCDaf-pv_-kG*N>)Dyj
zbZ;D^^#voIf>Vw>00*9eH{ik>a7OS|^{l-~IDnKBqn+BS>h9|5`uV1#KhDj(H~8&~
zgz6{6|82bX0Z2-;1sYHqQXbG282lp2L+VGg6;Z!ITMY`*27QmIO-h@>v?y%}GsP=6
z+f!`tLy-H!B5_$+SmpM#Q+cUVrHfP@RGBksW9{=LQzT_-Qni!i#x7@n;aP99Q!W7M
zx-+1e?Q{>Fu?egAZQ#9&*WLtiL?fc(fU1kk^u%e1M??iiLv{)J^H8x6jfEZdlr7m0
zKxP!4*tlUO&KhN%uADe);4oZOeO>LF%F0aJ#G0YoS^CJ%gInU~&f0^A>*}f%!M-(C
zudUx3E87v2F`vM-KvKhJkHJw}lr!K4rr+^9wPk>b{TSr#%J%B&9ra0BXauv^-Z*r7
zWwG7OT;Eu$cg-Ygt7N;fdK=c32Zs{H+NwRz205(MoDJr~b3wx4X2nTZFTooQYrtXM
z4(SNLh<1sN8l0D-CO!K}Vja>k(Y<eeq@xy%TGWeJ_Pl*aPu}MYKtBp;Kcwng8a1gZ
z$ThgGpyZr<7f70#Y_(p{B>TfDUp*HSk(hX1@4vyRMcKgtSZdLJi>hD7YZ}y>VkL$G
znEZ0oAp5)QisVo3%I^Fr0}UEQlkUKDlh^mo5LSaZnj$w%y%`!!vAEgh1lnH_sLxQ;
zR%s~_uHxkxsgT<PUFp6`%EFn#*%fqvIgwPkBQnodu2dN&RfEd7$)%^2;1~O<7%%0D
ztc_n&c9`rbZPjADxvDnehmThut*KAfzFHJ}T-pbFrcj6Fu#!$wdpvofYF}C>Ba2-9
zCkFg%F6MupTX)C!^f(JzNe<c7*4((h<f}a$JFU9L9T+&pae1-XUN)sOYt&<%56xOt
zmDP$r%tSm@W)Z@tI?vK;YNxD}d8YdVgjP;{vcbt&>PRNKC`t!Mux41Kwd?jBWOkE1
z^Ip}HuUxfPlsm{0BgnL3FJjtyDQSOoq8JoQ^%Mq?NlP*TJ%-jl3lekhIR=&cI=83;
zaCVSqF3$>MWx%>B8_2+ED9}knkE)>u5djrF7+^0M=#{7|u2Y`@Hw)Hhfo&DLZEkwO
zhH;g~3{a?Z4?}V+$6(H-$X3TA-Ya%ID>^)gVt2A9k2tmh?P~@w{(A6cmtoyr2cb9T
z!&cA=7lPRc|IuvF3Km!+(mbR_1RBmkX8l6+_9@tLtnad=pFv&)J0!U$-wg(VsD>=?
zIHU)iV_+gsBcxpqh_^U>__`qA9x?EdJdOa4?+PGdsz4;P7cK)#06h#+0w%$euK`kC
z0R#nVdEs;~s8|p@W=Ilj+HCU~YzG*$sh^tvj6uL1|Mf-hc=Rf(zWzT$(D<@Zm;1kl
zAd3*wOw6s6;ic?0NSm8M`Zj(8oOGApz;~B4PGttUPU`mLbXB_8^$n7nBIb^a&w)rQ
z#(Zax7L4bZ<C}%_QuoI7c!34(xNcr1`yJn#Y*FOb+-er}Bz+D0a>1e5`EW6q4lf0B
z!5r=k3!w)O28T{3Et5{iM}a-W#bddXl>LEra=DQkkB`&^49Ay1P8}BRwcK!S_RDmb
Vn_C<_%Lv*EXM^+M^x5fKe*>tCm?8iG

diff --git a/rsa/pkcs1.pyc b/rsa/pkcs1.pyc
deleted file mode 100644
index b66943b154d54fe50a2cf246fa332b6d32a91a78..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12044
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
Xj^Q3{%o#@C3B-dHXQ(uZ%+-GZraw9i

diff --git a/rsa/prime.pyc b/rsa/prime.pyc
deleted file mode 100644
index c012bcbd90914dde6a1d831b0a305095a107c4ad..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3817
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

diff --git a/rsa/randnum.pyc b/rsa/randnum.pyc
deleted file mode 100644
index 4fac94cbfad7e243ab75c6d880f261ba78093548..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1830
zcmcIk-)|d55T5%HCk{^10tpdM`$SAtjMA4@RVb87NFYe73sNP^m9_D$<4x}N%<Vd{
zk^59$`5Te=7x)9<n>o8F;<a3|<JsNW*`06Zo8+&Z?a!uvJRi~Oi}CvnhJOi>6ZIh@
z%3~@b>O;YQLPbnvLj8owl=>+}yqZ$6L1l~jEzCFQHyquhyd}yO<(s0k+0$8fi!bOx
zd^dBWU@Pa<xT@8Kai-S6x(iinmsh27v+~^3zGwf&ciQF0g%-r9D$B}+HqT+|ak}hA
zJWC<Y7r~5pwt<mgJj3vp5P@hZ0lkT75Yy|3UdI$7x{PTV(Hl$?TE_gytCZ?7g=Dph
zps~vaDJ@fm0cM9kVul;BfSqMRpWwK|6$xVGhxp$iGNW^^j@-Eo{%9Q-PkP(i3g7o*
zC40(xcNCOXH<PL`tI$<7RveDMue4KUj%a1BZfsGgbEEWhYFut|EQE>pt6Z^AVPaHK
z-I!YOP0E|llTFLeTMV)cP?r%BM00yxR(W8AD<3xTGi!1H2(VP=8E-ZAd`O-wC!M@6
z@M6uEg>BX(f4L4ieDHR9t&5rAw37(`HMD1s2Tz}VtA41Q4ioJLFBV}^xd9xN#(RBX
z-c@})8q{77*gHz2H(i7~>>UUXn;VDxf={vLcOhtVKiNw<(SEcWeH4#4VvdGWBPDSR
zr6~!{Z1nF+KuMqykXI>~!za&CDp)y_D)f(Vw8^Yq=hV7jE`T^vhOE@p+?F~RB%?_$
zzigERfu3KIby)CJYFUtc06$&X<Sb;2rhxl@ptlF-@1lpRzr>Q~DxtI!?WG?!urXx(
zCV{Pj0@yAEn+7@H1bF6WgbJ!JnK!q5f=+Z5QT>=+FgsxJO0bRT0OzinxipqXNJ3)*
z!aan?Uk>TzEuH?v#hD4S8V%z=u+N18>R6q8rRFS3Jr~TR@J0Nj!3=!`)~IV!FTfDA
znqW(#tW$n!Ms{pR%G)qQ7eZI+F*(<6lrsiIJ{3lZyHF_~s@mKax{Zp;Bl~a7tyeJU
zK2Z1WsngHZ7wWjN8*3k67bY+mulk?3v+MFelw>*Y4M!RKjMoCE1!Xk!_E#gF?&o@D
zGESnj8`)pqpD{C}a6)a3&zKMInR{HHOgmJ~2~__v1a0lbt*9M!@R!C1=}xp8ccq5e
zdN|Ch(Que?NYYrqW(lp~fV2v)dqed1sSeU|8j5g?8T-EtLA3YMLm1W*biY|)p4^4*
RnU$@y6CXr(;`V-f=O1htuD<{P

diff --git a/rsa/transform.pyc b/rsa/transform.pyc
deleted file mode 100644
index 22df6934528f1f81c8f5daec068a27d95fd63578..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5885
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
A%>V!Z

diff --git a/rsa/varblock.pyc b/rsa/varblock.pyc
deleted file mode 100644
index 0a6d5e3715ead898f5401db1ef7fb7623fbb9796..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3860
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