[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] r22090: {projects} When sanitizing bridge descriptors, optionally replace IP ad (projects/archives/trunk/bridge-desc-sanitizer)



Author: kloesing
Date: 2010-03-29 22:05:01 +0000 (Mon, 29 Mar 2010)
New Revision: 22090

Modified:
   projects/archives/trunk/bridge-desc-sanitizer/ConvertBridgeDescs.java
Log:
When sanitizing bridge descriptors, optionally replace IP address with
H(IP address + bridge identity + secret)[:4].


Modified: projects/archives/trunk/bridge-desc-sanitizer/ConvertBridgeDescs.java
===================================================================
--- projects/archives/trunk/bridge-desc-sanitizer/ConvertBridgeDescs.java	2010-03-29 17:06:34 UTC (rev 22089)
+++ projects/archives/trunk/bridge-desc-sanitizer/ConvertBridgeDescs.java	2010-03-29 22:05:01 UTC (rev 22090)
@@ -8,6 +8,15 @@
 
   public static void main(String[] args) throws Exception {
 
+    /* If the following flag is set to true, don't write 127.0.0.1 for
+     * bridge IP addresses, but put replace IP addresses with
+     * H(IP address + bridge identity + secret)[:4] formatted as IP
+     * address. An example for the hash input would be:
+     * "12.34.56.78ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDpassword"
+     * (without quotes) */
+    boolean hashIpAddresses = false;
+    String secret = "password";
+
     long started = System.currentTimeMillis();
 
     if (args.length < 5) {
@@ -254,7 +263,9 @@
       String asciiString = new String(allData, "US-ASCII");
       BufferedReader br = new BufferedReader(new StringReader(
           asciiString));
-      String line = null, country = null;
+      String line = null, country = null, originalAddress = null,
+          ipAddress = "127.0.0.1", routerLinePartOne = null,
+          routerLinePartTwo = null;
       StringBuilder scrubbed = null;
       boolean skipCrypto = false, contactWritten = false;
       while ((line = br.readLine()) != null) {
@@ -268,10 +279,11 @@
           if (unresolved.contains(country)) {
             country = "zz";
           }
-          scrubbed = new StringBuilder("router Unnamed"
-              + country.toUpperCase() + " 127.0.0.1 "
-              + line.split(" ")[3] + " " + line.split(" ")[4] + " "
-              + line.split(" ")[5] + "\n");
+          originalAddress = line.split(" ")[2];
+          scrubbed = new StringBuilder();
+          routerLinePartOne = "router Unnamed" + country.toUpperCase();
+          routerLinePartTwo = line.split(" ")[3] + " "
+              + line.split(" ")[4] + " " + line.split(" ")[5] + "\n";
           contactWritten = false;
           haveExtraInfo = null;
         } else if (line.startsWith("opt fingerprint ")) {
@@ -283,6 +295,15 @@
             scrubbed.append(" " + fingerprint.substring(4 * i,
                 4 * (i + 1)));
           scrubbed.append("\n");
+          if (hashIpAddresses) {
+            byte[] hashedOctets = DigestUtils.sha(originalAddress
+                + line.substring(16).replaceAll(" ", "") + secret);
+            String hashedIp = "";
+            for (int i = 0; i < 4; i++) {
+              hashedIp += "." + ((int) hashedOctets[i] + 256) % 256;
+            }
+            ipAddress = hashedIp.substring(1);
+          }
         } else if (line.startsWith("contact ")) {
           scrubbed.append("contact somebody at example dot " + country
               + "\n");
@@ -295,7 +316,8 @@
           System.arraycopy(allData, startDescriptorIndex, forDigest, 0,
               endDescriptorIndex - startDescriptorIndex);
           String originalHash = DigestUtils.shaHex(forDigest);
-          String scrubbedDesc = scrubbed.toString();
+          String scrubbedDesc = routerLinePartOne + " " + ipAddress
+              + " " + routerLinePartTwo + scrubbed.toString();
           String scrubbedHash = DigestUtils.shaHex(scrubbedDesc);
           if (descriptorMapping.containsKey(originalHash) &&
               !descriptorMapping.get(originalHash).equals(scrubbedHash)) {
@@ -430,11 +452,22 @@
           if (unresolved.contains(country)) {
             country = "zz";
           }
+          String ipAddress = "127.0.0.1";
+          if (hashIpAddresses) {
+            byte[] hashedOctets = DigestUtils.sha(parts[6]
+                + Hex.encodeHexString(Base64.decodeBase64(
+                bridgeIdentity)).toUpperCase() + secret);
+            String hashedIp = "";
+            for (int i = 0; i < 4; i++) {
+              hashedIp += "." + ((int) hashedOctets[i] + 256) % 256;
+            }
+            ipAddress = hashedIp.substring(1);
+          }
           scrubbed.append("r Unnamed" + country.toUpperCase() + " "
               + hashedBridgeIdentity
               + " " + replacementDescIdentifier + " " + parts[4] + " "
-              + parts[5] + " 127.0.0.1 " + parts[7] + " " + parts[8]
-              + "\n");
+              + parts[5] + " " + ipAddress + " " + parts[7] + " "
+              + parts[8] + "\n");
         } else if (line.startsWith("s ")) {
           scrubbed.append(line + "\n");
         } else {