[metrics-lib/master] Calculate descriptor digests.

commit 8a1dce943a3b5ae791cba66dc3081fa633cee20f Author: Karsten Loesing <karsten.loesing@gmx.net> Date: Thu Mar 22 15:43:12 2012 +0100 Calculate descriptor digests. --- .../torproject/descriptor/ExtraInfoDescriptor.java | 4 ++ .../torproject/descriptor/ServerDescriptor.java | 4 ++ .../descriptor/impl/ExtraInfoDescriptorImpl.java | 30 ++++++++++++++++++++ .../descriptor/impl/ServerDescriptorImpl.java | 30 ++++++++++++++++++++ 4 files changed, 68 insertions(+), 0 deletions(-) diff --git a/src/org/torproject/descriptor/ExtraInfoDescriptor.java b/src/org/torproject/descriptor/ExtraInfoDescriptor.java index 18a5b97..229b075 100644 --- a/src/org/torproject/descriptor/ExtraInfoDescriptor.java +++ b/src/org/torproject/descriptor/ExtraInfoDescriptor.java @@ -7,6 +7,10 @@ import java.util.SortedMap; public interface ExtraInfoDescriptor extends Descriptor { + /* Return the descriptor digest that is used to reference this + * extra-info descriptor in a server descriptor. */ + public String getExtraInfoDigest(); + /* Return the relay's nickname. */ public String getNickname(); diff --git a/src/org/torproject/descriptor/ServerDescriptor.java b/src/org/torproject/descriptor/ServerDescriptor.java index 1fe1f21..d641d49 100644 --- a/src/org/torproject/descriptor/ServerDescriptor.java +++ b/src/org/torproject/descriptor/ServerDescriptor.java @@ -7,6 +7,10 @@ import java.util.List; /* Contains a relay server descriptor. */ public interface ServerDescriptor extends Descriptor { + /* Return the descriptor digest that is used to reference this server + * descriptor in a network status. */ + public String getServerDescriptorDigest(); + /* Return the relay's nickname. */ public String getNickname(); diff --git a/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java b/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java index 7f2194e..a198d70 100644 --- a/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java +++ b/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java @@ -5,6 +5,7 @@ package org.torproject.descriptor.impl; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; +import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -13,6 +14,7 @@ import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; +import org.apache.commons.codec.digest.DigestUtils; import org.torproject.descriptor.BandwidthHistory; import org.torproject.descriptor.ExtraInfoDescriptor; @@ -41,6 +43,7 @@ public class ExtraInfoDescriptorImpl extends DescriptorImpl throws DescriptorParseException { super(descriptorBytes, failUnrecognizedDescriptorLines); this.parseDescriptorBytes(); + this.calculateDigest(); Set<String> exactlyOnceKeywords = new HashSet<String>(Arrays.asList(( "extra-info,published").split(","))); this.checkExactlyOnceKeywords(exactlyOnceKeywords); @@ -492,6 +495,33 @@ public class ExtraInfoDescriptorImpl extends DescriptorImpl /* Not parsing crypto parts (yet). */ } + private void calculateDigest() throws DescriptorParseException { + try { + String ascii = new String(this.getRawDescriptorBytes(), "US-ASCII"); + String startToken = "router "; + String sigToken = "\nrouter-signature\n"; + int start = ascii.indexOf(startToken); + int sig = ascii.indexOf(sigToken) + sigToken.length(); + if (start >= 0 || sig >= 0 || sig > start) { + byte[] forDigest = new byte[sig - start]; + System.arraycopy(this.getRawDescriptorBytes(), start, + forDigest, 0, sig - start); + this.extraInfoDigest = DigestUtils.shaHex(forDigest); + } + } catch (UnsupportedEncodingException e) { + /* Handle below. */ + } + if (this.extraInfoDigest == null) { + throw new DescriptorParseException("Could not calculate extra-info " + + "descriptor digest."); + } + } + + private String extraInfoDigest; + public String getExtraInfoDigest() { + return this.extraInfoDigest; + } + private String nickname; public String getNickname() { return this.nickname; diff --git a/src/org/torproject/descriptor/impl/ServerDescriptorImpl.java b/src/org/torproject/descriptor/impl/ServerDescriptorImpl.java index 67b4d09..200b8b5 100644 --- a/src/org/torproject/descriptor/impl/ServerDescriptorImpl.java +++ b/src/org/torproject/descriptor/impl/ServerDescriptorImpl.java @@ -5,12 +5,14 @@ package org.torproject.descriptor.impl; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; +import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; +import org.apache.commons.codec.digest.DigestUtils; import org.torproject.descriptor.BandwidthHistory; import org.torproject.descriptor.ServerDescriptor; @@ -45,6 +47,7 @@ public class ServerDescriptorImpl extends DescriptorImpl throws DescriptorParseException { super(descriptorBytes, failUnrecognizedDescriptorLines); this.parseDescriptorBytes(); + this.calculateDigest(); Set<String> exactlyOnceKeywords = new HashSet<String>(Arrays.asList( "router,bandwidth,published".split(","))); this.checkExactlyOnceKeywords(exactlyOnceKeywords); @@ -424,6 +427,33 @@ public class ServerDescriptorImpl extends DescriptorImpl this.allowSingleHopExits = true; } + private void calculateDigest() throws DescriptorParseException { + try { + String ascii = new String(this.getRawDescriptorBytes(), "US-ASCII"); + String startToken = "router "; + String sigToken = "\nrouter-signature\n"; + int start = ascii.indexOf(startToken); + int sig = ascii.indexOf(sigToken) + sigToken.length(); + if (start >= 0 || sig >= 0 || sig > start) { + byte[] forDigest = new byte[sig - start]; + System.arraycopy(this.getRawDescriptorBytes(), start, + forDigest, 0, sig - start); + this.serverDescriptorDigest = DigestUtils.shaHex(forDigest); + } + } catch (UnsupportedEncodingException e) { + /* Handle below. */ + } + if (this.serverDescriptorDigest == null) { + throw new DescriptorParseException("Could not calculate server " + + "descriptor digest."); + } + } + + private String serverDescriptorDigest; + public String getServerDescriptorDigest() { + return this.serverDescriptorDigest; + } + private String nickname; public String getNickname() { return this.nickname;
participants (1)
-
karsten@torproject.org