From 7997fd104e3a869a371ee9392376a8fb05aad81e Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Tue, 4 Oct 2022 09:11:20 +0200 Subject: [PATCH] Fix destination hash construction and random blob extraction --- RNS/Destination.py | 38 ++++++++++++++++---------------------- RNS/Identity.py | 3 ++- RNS/Transport.py | 10 ++++------ 3 files changed, 22 insertions(+), 29 deletions(-) diff --git a/RNS/Destination.py b/RNS/Destination.py index 49ddc32..2b3447e 100755 --- a/RNS/Destination.py +++ b/RNS/Destination.py @@ -89,19 +89,17 @@ class Destination: return name - # @staticmethod - # def hash(identity, app_name, *aspects): - # """ - # :returns: A destination name in adressable hash form, for an app_name and a number of aspects. - # """ - # base_name = Destination.expand_name(None, app_name, *aspects) - # hash_material = RNS.Identity.full_hash(base_name.encode("utf-8")) + @staticmethod + def hash(identity, app_name, *aspects): + """ + :returns: A destination name in adressable hash form, for an app_name and a number of aspects. + """ + name_hash = RNS.Identity.full_hash(Destination.expand_name(None, app_name, *aspects).encode("utf-8")) + addr_hash_material = name_hash + if identity != None: + addr_hash_material += identity.hash - # if identity != None: - # hash_material += identity.hash - - # # Create a digest for the destination - # return RNS.Identity.full_hash(hash_material)[:RNS.Reticulum.TRUNCATED_HASHLENGTH//8] + return RNS.Identity.full_hash(addr_hash_material)[:RNS.Reticulum.TRUNCATED_HASHLENGTH//8] @staticmethod def app_and_aspects_from_name(full_name): @@ -117,8 +115,8 @@ class Destination: :returns: A destination name in adressable hash form, for a full name string and Identity instance. """ app_name, aspects = Destination.app_and_aspects_from_name(full_name) - aspects.append(identity.hexhash) - return Destination.hash(app_name, *aspects) + + return Destination.hash(identity, app_name, *aspects) def __init__(self, identity, direction, type, app_name, *aspects): # Check input values and build name string @@ -144,15 +142,11 @@ class Destination: raise TypeError("Selected destination type PLAIN cannot hold an identity") self.identity = identity - self.full_name = Destination.expand_name(identity, app_name, *aspects) - - self.name_hash = RNS.Identity.full_hash(self.expand_name(None, app_name, *aspects).encode("utf-8")) - self.addr_hash_material = self.name_hash - if self.identity != None: - self.addr_hash_material += self.identity.hash + self.name = Destination.expand_name(identity, app_name, *aspects) # Generate the destination address hash - self.hash = RNS.Identity.full_hash(self.addr_hash_material)[:RNS.Reticulum.TRUNCATED_HASHLENGTH//8] + self.hash = Destination.hash(self.identity, app_name, *aspects) + self.name_hash = RNS.Identity.full_hash(self.expand_name(None, app_name, *aspects).encode("utf-8")) self.hexhash = self.hash.hex() self.default_app_data = None @@ -166,7 +160,7 @@ class Destination: """ :returns: A human-readable representation of the destination including addressable hash and full name. """ - return "<"+self.full_name+"/"+self.hexhash+">" + return "<"+self.name+"/"+self.hexhash+">" def announce(self, app_data=None, path_response=False, send=True): diff --git a/RNS/Identity.py b/RNS/Identity.py index 24bc901..b6a1395 100644 --- a/RNS/Identity.py +++ b/RNS/Identity.py @@ -219,7 +219,7 @@ class Identity: signature = packet.data[Identity.KEYSIZE//8+Identity.HASHLENGTH//8+10:Identity.KEYSIZE//8+Identity.HASHLENGTH//8+10+Identity.SIGLENGTH//8] app_data = b"" if len(packet.data) > Identity.KEYSIZE//8+Identity.HASHLENGTH//8+10+Identity.SIGLENGTH//8: - app_data = packet.data[Identity.KEYSIZE//8+10+Identity.KEYSIZE//8:] + app_data = packet.data[Identity.KEYSIZE//8+Identity.HASHLENGTH//8+10+Identity.SIGLENGTH//8:] signed_data = destination_hash+public_key+name_hash+random_hash+app_data @@ -245,6 +245,7 @@ class Identity: return True else: + RNS.log("Received invalid announce for "+RNS.prettyhexrep(destination_hash)+". Destination mismatch.", RNS.LOG_DEBUG) return False else: diff --git a/RNS/Transport.py b/RNS/Transport.py index 1e2f507..04422b8 100755 --- a/RNS/Transport.py +++ b/RNS/Transport.py @@ -1084,7 +1084,7 @@ class Transport: if (not any(packet.destination_hash == d.hash for d in Transport.destinations) and packet.hops < Transport.PATHFINDER_M+1): announce_emitted = Transport.announce_emitted(packet) - random_blob = packet.data[RNS.Identity.KEYSIZE//8:RNS.Identity.KEYSIZE//8+RNS.Reticulum.TRUNCATED_HASHLENGTH//8] + random_blob = packet.data[RNS.Identity.KEYSIZE//8+RNS.Identity.HASHLENGTH//8:RNS.Identity.KEYSIZE//8+RNS.Identity.HASHLENGTH//8+10] random_blobs = [] if packet.destination_hash in Transport.destination_table: random_blobs = Transport.destination_table[packet.destination_hash][4] @@ -1798,14 +1798,12 @@ class Transport: queued_announces = True if len(on_interface.announce_queue) > 0 else False if queued_announces: - # TODO: Reset to extra level, probably - RNS.log("Blocking recursive path request on "+str(on_interface)+" due to queued announces", RNS.LOG_DEBUG) + RNS.log("Blocking recursive path request on "+str(on_interface)+" due to queued announces", RNS.LOG_EXTREME) return else: now = time.time() if now < on_interface.announce_allowed_at: - # TODO: Reset to extra level, probably - RNS.log("Blocking recursive path request on "+str(on_interface)+" due to active announce cap", RNS.LOG_DEBUG) + RNS.log("Blocking recursive path request on "+str(on_interface)+" due to active announce cap", RNS.LOG_EXTREME) return else: tx_time = ((len(path_request_data)+RNS.Reticulum.HEADER_MINSIZE)*8) / on_interface.bitrate @@ -2058,7 +2056,7 @@ class Transport: @staticmethod def announce_emitted(packet): - random_blob = packet.data[RNS.Identity.KEYSIZE//8:RNS.Identity.KEYSIZE//8+RNS.Reticulum.TRUNCATED_HASHLENGTH//8] + random_blob = packet.data[RNS.Identity.KEYSIZE//8+RNS.Identity.HASHLENGTH//8:RNS.Identity.KEYSIZE//8+RNS.Identity.HASHLENGTH//8+10] announce_emitted = int.from_bytes(random_blob[5:10], "big") return announce_emitted