From 24540abe6b52051633864e36fe6460bae2081f0f Mon Sep 17 00:00:00 2001 From: Kevin Froman Date: Fri, 16 Mar 2018 15:38:33 -0500 Subject: [PATCH] finished pub encrypt function --- onionr/api.py | 5 +++++ onionr/communicator.py | 9 +++++++-- onionr/onionrcrypto.py | 18 ++++++++++++++---- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/onionr/api.py b/onionr/api.py index 33b759a4..7ff3a002 100755 --- a/onionr/api.py +++ b/onionr/api.py @@ -154,6 +154,11 @@ class API: if len(response) == 0: response = 'none' resp = Response(response) + elif action == 'kex': + response = ','.join(self._core.listPeers()) + if len(response) == 0: + response = 'none' + resp = Response(response) else: resp = Response("") diff --git a/onionr/communicator.py b/onionr/communicator.py index 45bb8bae..9c2b88b7 100755 --- a/onionr/communicator.py +++ b/onionr/communicator.py @@ -70,6 +70,7 @@ class OnionrCommunicate: pexCount += 1 if pexTimer == pexCount: self.getNewPeers() + pexCount = 0 if heartBeatRate == heartBeatTimer: logger.debug('Communicator heartbeat') heartBeatTimer = 0 @@ -92,15 +93,19 @@ class OnionrCommunicate: peersCheck = 5 # Amount of peers to ask for new peers + keys peersChecked = 0 peerList = list(self._core.listAdders()) # random ordered list of peers - logger.warn(len(peerList)) newKeys = [] newAdders = [] + if len(peerList) > 0: + maxN = len(peerList) - 1 + else: + peersCheck = 0 + maxN = 0 if len(peerList) > peersCheck: peersCheck = len(peerList) while peersCheck > peersChecked: - i = random.randint(0, len(peerList)) + i = random.randint(0, maxN) logger.info('Using ' + peerList[i] + ' to find new peers') try: newAdders = self.performGet('pex', peerList[i]) diff --git a/onionr/onionrcrypto.py b/onionr/onionrcrypto.py index 22a542b8..4000e272 100644 --- a/onionr/onionrcrypto.py +++ b/onionr/onionrcrypto.py @@ -60,11 +60,21 @@ class OnionrCrypto: retData = key.sign(data.encode()) return retData - def pubKeyEncrypt(self, data, peer): - '''Encrypt to a peers public key (Curve25519, taken from Ed25519 pubkey)''' - return + def pubKeyEncrypt(self, data, pubkey, anonymous=False): + '''Encrypt to a public key (Curve25519, taken from base32 Ed25519 pubkey)''' + retVal = '' + 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) + 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) + return retVal - def pubKeyEncrypt(self, data, peer): + def pubKeyDecrypt(self, data, peer): '''pubkey decrypt (Curve25519, taken from Ed25519 pubkey)''' return