From 8022781a8f48e84bd8f53550ea80d469f11e5310 Mon Sep 17 00:00:00 2001 From: Kevin Froman Date: Sun, 1 Apr 2018 19:33:09 -0500 Subject: [PATCH] lot of work on OnionrCrypto updated logo fixed broken peerinfo functions in core removed gnupg from travis installation --- .travis.yml | 2 +- Makefile | 2 +- docs/onionr-logo.png | Bin 5344 -> 5316 bytes onionr/communicator.py | 12 ++++- onionr/core.py | 13 +++--- onionr/onionrcrypto.py | 100 ++++++++++++++++++++++++++++++++++++----- 6 files changed, 108 insertions(+), 21 deletions(-) diff --git a/.travis.yml b/.travis.yml index e1cee1fc..603021b5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,6 @@ python: - "3.6.4" # install dependencies install: - - sudo apt install gnupg tor + - sudo apt install tor - pip install -r requirements.txt script: make test diff --git a/Makefile b/Makefile index 10ab5390..eb2d27ac 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ uninstall: test: @rm -rf onionr/data-backup @mv onionr/data onionr/data-backup | true > /dev/null 2>&1 - -@cd onionr; ./tests.py + -@cd onionr; ./tests.py; ./cryptotests.py; @rm -rf onionr/data @mv onionr/data-backup onionr/data | true > /dev/null 2>&1 diff --git a/docs/onionr-logo.png b/docs/onionr-logo.png index dade75ca8705da5b57bbbd11bae60a803343ed07..4ecf329392fa802b76487eba03812b83ddf6fc0b 100644 GIT binary patch literal 5316 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 hENt 10: + if skipHighFailureAddress and self.peerData[peer]['failCount'] > self.highFailureAmount: retData = False logger.debug('Skipping ' + peer + ' because of high failure rate') else: @@ -251,6 +260,7 @@ class OnionrCommunicate: self.peerData[peer]['failCount'] += 1 else: self.peerData[peer]['connectCount'] += 1 + self.peerData[peer]['failCount'] -= 1 self.peerData[peer]['lastConnectTime'] = math.floor(time.time()) return retData diff --git a/onionr/core.py b/onionr/core.py index ef91549c..1b519985 100644 --- a/onionr/core.py +++ b/onionr/core.py @@ -369,16 +369,17 @@ class Core: id text 0 name text, 1 - adders text, 2 - forwardKey text, 3 - dateSeen not null, 4 - bytesStored int, 5 - trust int 6 + pubkey text, 2 + adders text, 3 + forwardKey text, 4 + dateSeen not null, 5 + bytesStored int, 6 + trust int 7 ''' conn = sqlite3.connect(self.peerDB) c = conn.cursor() command = (peer,) - infoNumbers = {'id': 0, 'name': 1, 'adders': 2, 'forwardKey': 3, 'dateSeen': 4, 'bytesStored': 5, 'trust': 6} + infoNumbers = {'id': 0, 'name': 1, 'pubkey': 2, 'adders': 3, 'forwardKey': 4, 'dateSeen': 5, 'bytesStored': 6, 'trust': 7} info = infoNumbers[info] iterCount = 0 retVal = '' diff --git a/onionr/onionrcrypto.py b/onionr/onionrcrypto.py index 4000e272..251d1502 100644 --- a/onionr/onionrcrypto.py +++ b/onionr/onionrcrypto.py @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . ''' -import nacl.signing, nacl.encoding, nacl.public, os +import nacl.signing, nacl.encoding, nacl.public, nacl.secret, os, binascii, base64 class OnionrCrypto: def __init__(self, coreInstance): @@ -60,36 +60,112 @@ class OnionrCrypto: retData = key.sign(data.encode()) return retData - def pubKeyEncrypt(self, data, pubkey, anonymous=False): + def pubKeyEncrypt(self, data, pubkey, anonymous=False, encodedData=False): '''Encrypt to a public key (Curve25519, taken from base32 Ed25519 pubkey)''' retVal = '' + + if encodedData: + encoding = nacl.encoding.Base64Encoder + else: + encoding = nacl.encoding.RawEncoder + if self.privKey != None and not anonymous: ownKey = nacl.signing.SigningKey(seed=self.privKey, encoder=nacl.encoding.Base32Encoder()) key = nacl.signing.VerifyKey(key=pubkey, encoder=nacl.encoding.Base32Encoder).to_curve25519_public_key() ourBox = nacl.public.Box(ownKey, key) - retVal = ourBox.encrypt(data.encode(), encoder=nacl.encoding.RawEncoder) + retVal = ourBox.encrypt(data.encode(), encoder=encoding) elif anonymous: key = nacl.signing.VerifyKey(key=pubkey, encoder=nacl.encoding.Base32Encoder).to_curve25519_public_key() anonBox = nacl.public.SealedBox(key) - retVal = anonBox.encrypt(data.encode(), encoder=nacl.encoding.RawEncoder) + retVal = anonBox.encrypt(data.encode(), encoder=encoding) return retVal - def pubKeyDecrypt(self, data, peer): + def pubKeyDecrypt(self, data, pubkey, anonymous=False, encodedData=False): '''pubkey decrypt (Curve25519, taken from Ed25519 pubkey)''' - return + retVal = '' + if encodedData: + encoding = nacl.encoding.Base64Encoder + else: + encoding = nacl.encoding.RawEncoder + ownKey = nacl.signing.SigningKey(seed=self.privKey, encoder=nacl.encoding.Base32Encoder()) + if self.privKey != None and not anoymous: + ourBox = nacl.public.Box(ownKey, pubkey) + decrypted = ourBox.decrypt(data, encoder=encoding) + elif anonymous: + anonBox = nacl.public.SealedBox(ownKey) + decrypted = anonBox.decrypt(data.encode(), encoder=encoding) + return decrypted - def symmetricPeerEncrypt(self, data): - '''Salsa20 encrypt data to peer (with mac)''' - return + def symmetricPeerEncrypt(self, data, peer): + '''Salsa20 encrypt data to peer (with mac) + this function does not accept a key, it is a wrapper for encryption with a peer + ''' + key = self._core.getPeerInfo(4) + if type(key) != bytes: + key = self._core.getPeerInfo(2) + encrypted = self.symmetricEncrypt(data, key, encodedKey=True) + return encrypted def symmetricPeerDecrypt(self, data, peer): - '''Salsa20 decrypt data from peer (with mac)''' + '''Salsa20 decrypt data from peer (with mac) + this function does not accept a key, it is a wrapper for encryption with a peer + ''' + key = self._core.getPeerInfo(4) + if type(key) != bytes: + key = self._core.getPeerInfo(2) + decrypted = self.symmetricDecrypt(data, key, encodedKey=True) + return decrypted + return + + def symmetricEncrypt(self, data, key, encodedKey=False, returnEncoded=True): + '''Encrypt data to a 32-byte key (Salsa20-Poly1305 MAC)''' + if encodedKey: + encoding = nacl.encoding.Base64Encoder + else: + encoding = nacl.encoding.RawEncoder + + # Make sure data is bytes + if type(data) != bytes: + data = data.encode() + + box = nacl.secret.SecretBox(key, encoder=encoding) + + if returnEncoded: + encoding = nacl.encoding.Base64Encoder + else: + encoding = nacl.encoding.RawEncoder + + encrypted = box.encrypt(data, encoder=encoding) + return encrypted + + def symmetricDecrypt(self, data, key, encodedKey=False, encodedMessage=False, returnEncoded=False): + '''Decrypt data to a 32-byte key (Salsa20-Poly1305 MAC)''' + if encodedKey: + encoding = nacl.encoding.Base64Encoder + else: + encoding = nacl.encoding.RawEncoder + box = nacl.secret.SecretBox(key, encoder=encoding) + + if encodedMessage: + encoding = nacl.encoding.Base64Encoder + else: + encoding = nacl.encoding.RawEncoder + decrypted = box.decrypt(data, encoder=encoding) + if returnEncoded: + decrypted = base64.b64encode(decrypted) + return decrypted - def generateSymmetric(self, data, peer): - '''Generate symmetric key''' + def generateSymmetricPeer(self, peer): + '''Generate symmetric key for a peer and save it to the peer database''' + key = self.generateSymmetric() + self._core.setPeerInfo(peer, 'forwardKey', key) return + def generateSymmetric(self): + '''Generate a symmetric key (bytes) and return it''' + return binascii.hexlify(nacl.utils.random(nacl.secret.SecretBox.KEY_SIZE)) + def generatePubKey(self): '''Generate a Ed25519 public key pair, return tuple of base64encoded pubkey, privkey''' private_key = nacl.signing.SigningKey.generate()