Browse Source

wip single pass

Chelsea H. Komlo 4 years ago
parent
commit
7efe0688f9
1 changed files with 38 additions and 18 deletions
  1. 38 18
      relay.py

+ 38 - 18
relay.py

@@ -789,13 +789,17 @@ class ChannelManager:
 class RelayChannelManager(ChannelManager):
     """The subclass of ChannelManager for relays."""
 
-    def __init__(self, myaddr, dirauthaddrs, onionprivkey, idpubkey, perfstats):
+    def __init__(self, myaddr, dirauthaddrs, onionprivkey, idpubkey,
+            path_selection_key, perfstats):
         super().__init__(myaddr, dirauthaddrs, perfstats)
         self.onionkey = onionprivkey
         self.idpubkey = idpubkey
         if network.thenetwork.womode != network.WOMode.VANILLA:
             self.endive = None
 
+        if network.thenetwork.womode == network.WOMode.SINGLEPASS:
+            self.path_selection_key = path_selection_key
+
     def get_consensus(self):
         """Download a fresh consensus (and ENDIVE if using Walking
         Onions) from a random dirauth."""
@@ -879,7 +883,7 @@ class RelayChannelManager(ChannelManager):
             # A new circuit has arrived
             circhandler = channel.new_circuit_with_circid(msg.circid)
             # Create the ntor reply for the circuit-extension key
-            reply, secret = NTor.reply(self.onionkey, self.idpubkey,
+            (reply, secret), blinded_client_pubkey = NTor.reply(self.onionkey, self.idpubkey,
                     msg.ntor_request, self.perfstats,  b'circuit')
 
             # Set up the circuit to use the shared secret established from the
@@ -892,22 +896,38 @@ class RelayChannelManager(ChannelManager):
             # the following:
             # 1. determining the next relay using the client's path selection
             #    key in conjunction with our own
+            print("server path selection key: " + str(self.path_selection_key))
+            print("client path selection key: " +
+                    str(msg.client_path_selection_key))
+            idx = nacl.public.Box(self.path_selection_key, msg.client_path_selection_key).shared_key()
+            sys.exit("TODO convert shared secret into integer type modulo alpha")
+            nexthop = self.relaypicker.pick_relay_by_uniform_index(idx)
+            if nexthop == None:
+                print("WARNING: Unimplemented! Need to validate next hop is not null, if it is, we should send a CLOSE cell.")
+
+
+
             # 2. blinding each of the client's public keys to send to the next
             #    hop.
 
             # Add a handler for once the next relay replies to say that the
             # circuit has been created
             # be at most one on this circuit).
-            # TODO add the proper interface for the handler
-            circhandler.replace_celltype_handler(
-                    SinglePassCreatedCircuitCell,
-                    SinglePassCreatedCircuitHandler())
-
-            # Send the next create message to the next hop
-            # TODO add the correct interface here
-            self.send_msg(CircuitCellMsg(msg.circid,
-                    SinglePassCreateCircuitCell()), peeraddr)
-
+#            circhandler.replace_celltype_handler(
+#                    SinglePassCreatedCircuitCell,
+#                    SinglePassCreatedCircuitHandler(ntorreply, next_snip))
+#
+#            # Allocate a new circuit id to the requested next hop
+#            channelmgr = circhandler.channel.channelmgr
+#            nexthopchannel = channelmgr.get_channel_to(next_snip.snipdict["addr"])
+#            newcircid, newcirchandler = nexthopchannel.new_circuit()
+#
+#            # Send the next create message to the next hop
+#            # TODO add the correct interface here
+#            self.send_msg(CircuitCellMsg(msg.circid,
+#                    SinglePassCreateCircuitCell(newcircid, ntorrequest,
+#                        next_client_path_selection_key)), peeraddr)
+#
             sys.exit("have not yet implemented circuit handling for single-pass in relays")
         else:
             return super().received_msg(msg, peeraddr, channel)
@@ -944,18 +964,18 @@ class Relay(network.Server):
         network.thenetwork.wantepochticks(self, True, end=True)
         network.thenetwork.wantepochticks(self, True)
 
+        if network.thenetwork.womode == network.WOMode.SINGLEPASS:
+            self.path_selection_key = nacl.public.PrivateKey.generate()
+        else:
+            self.path_selection_key = None
+
         # Create the RelayChannelManager connection manager
         self.channelmgr = RelayChannelManager(self.netaddr, dirauthaddrs,
-                self.onionkey, self.idkey.verify_key, self.perfstats)
+                self.onionkey, self.idkey.verify_key, self.path_selection_key, self.perfstats)
 
         # Initially, we're not a fallback relay
         self.is_fallbackrelay = False
 
-        if network.thenetwork.womode == network.WOMode.SINGLEPASS:
-            self.path_selection_key = nacl.public.PrivateKey.generate()
-        else:
-            self.path_selection_key = None
-
         self.uploaddesc()
 
     def terminate(self):