[tor-commits] [chutney/master] Add minimal mixed tor version networks

teor at torproject.org teor at torproject.org
Thu Aug 18 05:43:41 UTC 2016


commit a5dc7bcf871b851d05432f01375338682c20d0dd
Author: teor <teor2345 at gmail.com>
Date:   Thu Aug 18 15:18:32 2016 +1000

    Add minimal mixed tor version networks
    
    These networks attempt to have an even split of Tor versions.
    When that's not possible, they choose the final one at random.
    
    This means they need multiple verifies to cover all possible
    version combinations.
    
    Assists in testing Tor ticket #19163.
---
 networks/basic-min-mixed | 47 +++++++++++++++++++++++++++++++++++++
 networks/hs-min-mixed    | 61 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 108 insertions(+)

diff --git a/networks/basic-min-mixed b/networks/basic-min-mixed
new file mode 100644
index 0000000..5ae7bd5
--- /dev/null
+++ b/networks/basic-min-mixed
@@ -0,0 +1,47 @@
+# This network generates a random mix of tor versions each time it is run
+# You'll need at least 4 runs to cover all possibilities
+
+import random
+rng = random.SystemRandom()
+
+# We have to use the same tags for old and new versions, otherwise switching
+# between them at random does not work
+OLD_TOR="tor-stable"
+
+# By default, Authorities are not configured as exits
+Authority = Node(tag="a", authority=1, relay=1, torrc="authority.tmpl")
+OldAuthority = Node(tag="a", authority=1, relay=1, torrc="authority.tmpl",
+                    tor=OLD_TOR)
+
+ExitRelay = Node(tag="r", relay=1, exit=1, torrc="relay.tmpl")
+OldExitRelay = Node(tag="r", relay=1, exit=1, torrc="relay.tmpl",
+                    tor=OLD_TOR)
+
+Client = Node(tag="c", torrc="client.tmpl")
+OldClient = Node(tag="c", torrc="client.tmpl", tor=OLD_TOR)
+
+# Choose old or new Exit and Client at random
+OldNewExitRelay = rng.choice([OldExitRelay, ExitRelay])
+OldNewClient = rng.choice([OldClient, Client])
+
+def version(node):
+  if node._env["tor"] == Authority._env["tor"]:
+    return "new"
+  elif node._env["tor"] == OldAuthority._env["tor"]:
+    return "old"
+  else:
+    return "unk"
+
+# Every time chutney takes an action, it will pick versions at random
+# It will likely choose different versions for each action
+# This could be confusing, so log a message each time
+print("Chose 1 %s authority, 1 %s authority, 1 %s exit and 1 %s client"
+      % (version(Authority),
+         version(OldAuthority),
+         version(OldNewExitRelay),
+         version(OldNewClient)))
+
+# The minimum number of authorities/relays/exits is 3, the minimum path length
+NODES = Authority.getN(1) + OldAuthority.getN(1) + OldExitRelay.getN(1) + OldClient.getN(1)
+
+ConfigureNodes(NODES)
diff --git a/networks/hs-min-mixed b/networks/hs-min-mixed
new file mode 100644
index 0000000..8de3825
--- /dev/null
+++ b/networks/hs-min-mixed
@@ -0,0 +1,61 @@
+# This network generates a random mix of tor versions each time it is run
+# You'll need at least 8 runs to cover all possibilities
+
+import random
+rng = random.SystemRandom()
+
+# We have to use the same tags for old and new versions, otherwise switching
+# between them at random does not work
+OLD_TOR="tor-stable"
+
+# By default, Authorities are not configured as exits
+Authority = Node(tag="a", authority=1, relay=1, torrc="authority.tmpl")
+OldAuthority = Node(tag="a", authority=1, relay=1, torrc="authority.tmpl",
+                    tor=OLD_TOR)
+
+NonExitRelay = Node(tag="r", relay=1, torrc="relay-non-exit.tmpl")
+OldNonExitRelay = Node(tag="r", relay=1, torrc="relay-non-exit.tmpl",
+                       tor=OLD_TOR)
+
+Client = Node(tag="c", torrc="client.tmpl")
+OldClient = Node(tag="c", torrc="client.tmpl", tor=OLD_TOR)
+
+HS = Node(tag="h", hs=1, torrc="hs.tmpl")
+OldHS = Node(tag="h", hs=1, torrc="hs.tmpl", tor=OLD_TOR)
+
+# Choose old or new Relay, Client, and HS at random
+OldNewNonExitRelay = rng.choice([OldNonExitRelay, NonExitRelay])
+OldNewClient = rng.choice([OldClient, Client])
+OldNewHS = rng.choice([OldHS, HS])
+
+def version(node):
+  if node._env["tor"] == Authority._env["tor"]:
+    return "new"
+  elif node._env["tor"] == OldAuthority._env["tor"]:
+    return "old"
+  else:
+    return "unk"
+
+# Every time chutney takes an action, it will pick versions at random
+# It will likely choose different versions for each action
+# This could be confusing, so log a message each time
+print(("Chose 1 %s authority, 1 %s authority, %d %s non-exit relay, " +
+       "%d %s non-exit relay, 1 %s client and 1 %s hidden service")
+      % (version(Authority),
+         version(OldAuthority),
+         2 if OldNewNonExitRelay == NonExitRelay else 1,
+	 version(NonExitRelay),
+         2 if OldNewNonExitRelay == OldNonExitRelay else 1,
+	 version(OldNonExitRelay),
+	 version(OldNewClient),
+         version(OldNewHS)))
+
+# A hidden service needs 5 authorities/relays to ensure it can build HS
+# connections:
+# a minimum path length of 3, plus the client-nominated rendezvous point,
+# plus a seperate introduction point
+NODES = Authority.getN(1) + OldAuthority.getN(1) + NonExitRelay.getN(1) + \
+        OldNonExitRelay.getN(1) + OldNewNonExitRelay.getN(1) + \
+        OldNewClient.getN(1) + OldNewHS.getN(1)
+
+ConfigureNodes(NODES)



More information about the tor-commits mailing list