commit 1413dfb124729a3c41dd1a9ac9c2823b2e608aa2 Author: Karsten Loesing karsten.loesing@gmx.net Date: Fri May 20 11:39:51 2016 +0200
Parse crypto parts in network status votes. --- CHANGELOG.md | 1 + .../impl/RelayNetworkStatusVoteImpl.java | 92 +++++++++++++++++++++- .../impl/RelayNetworkStatusVoteImplTest.java | 15 ++++ 3 files changed, 104 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md index 66da859..a1b9a75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - Rename properties for overriding default descriptor source implementation classes. - Actually return the signing key digest in network status votes. + - Parse crypto parts in network status votes.
* Minor changes - Include a Torperf results line with more than one unrecognized diff --git a/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java b/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java index 68f3b38..8d18919 100644 --- a/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java +++ b/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java @@ -3,6 +3,7 @@ package org.torproject.descriptor.impl;
import org.torproject.descriptor.DescriptorParseException; + import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -75,7 +76,8 @@ public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl this.ignoringAdvertisedBws = -1;
Scanner s = new Scanner(new String(headerBytes)).useDelimiter("\n"); - boolean skipCrypto = false; /* TODO Parse crypto parts. */ + String nextCrypto = ""; + StringBuilder crypto = null; while (s.hasNext()) { String line = s.next(); String[] parts = line.split("[ \t]+"); @@ -145,18 +147,52 @@ public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl this.parseDirKeyExpiresLine(line, parts); break; case "dir-identity-key": + this.parseDirIdentityKeyLine(line, parts); + nextCrypto = "dir-identity-key"; + break; case "dir-signing-key": + this.parseDirSigningKeyLine(line, parts); + nextCrypto = "dir-signing-key"; + break; case "dir-key-crosscert": + this.parseDirKeyCrosscertLine(line, parts); + nextCrypto = "dir-key-crosscert"; + break; case "dir-key-certification": + this.parseDirKeyCertificationLine(line, parts); + nextCrypto = "dir-key-certification"; break; case "-----BEGIN": - skipCrypto = true; + crypto = new StringBuilder(); + crypto.append(line).append("\n"); break; case "-----END": - skipCrypto = false; + crypto.append(line).append("\n"); + String cryptoString = crypto.toString(); + crypto = null; + switch (nextCrypto) { + case "dir-identity-key": + this.dirIdentityKey = cryptoString; + break; + case "dir-signing-key": + this.dirSigningKey = cryptoString; + break; + case "dir-key-crosscert": + this.dirKeyCrosscert = cryptoString; + break; + case "dir-key-certification": + this.dirKeyCertification = cryptoString; + break; + default: + throw new DescriptorParseException("Unrecognized crypto " + + "block in vote."); + } + nextCrypto = ""; break; default: - if (!skipCrypto) { + if (crypto != null) { + crypto.append(line).append("\n"); + } else { if (this.failUnrecognizedDescriptorLines) { throw new DescriptorParseException("Unrecognized line '" + line + "' in vote."); @@ -414,6 +450,34 @@ public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl parts, 1, 2); }
+ private void parseDirIdentityKeyLine(String line, String[] parts) + throws DescriptorParseException { + if (!line.equals("dir-identity-key")) { + throw new DescriptorParseException("Illegal line '" + line + "'."); + } + } + + private void parseDirSigningKeyLine(String line, String[] parts) + throws DescriptorParseException { + if (!line.equals("dir-signing-key")) { + throw new DescriptorParseException("Illegal line '" + line + "'."); + } + } + + private void parseDirKeyCrosscertLine(String line, String[] parts) + throws DescriptorParseException { + if (!line.equals("dir-key-crosscert")) { + throw new DescriptorParseException("Illegal line '" + line + "'."); + } + } + + private void parseDirKeyCertificationLine(String line, String[] parts) + throws DescriptorParseException { + if (!line.equals("dir-key-certification")) { + throw new DescriptorParseException("Illegal line '" + line + "'."); + } + } + protected void parseFooter(byte[] footerBytes) throws DescriptorParseException { Scanner s = new Scanner(new String(footerBytes)).useDelimiter("\n"); @@ -488,6 +552,26 @@ public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl return this.dirKeyExpiresMillis; }
+ private String dirIdentityKey; + public String getDirIdentityKey() { + return this.dirIdentityKey; + } + + private String dirSigningKey; + public String getDirSigningKey() { + return this.dirSigningKey; + } + + private String dirKeyCrosscert; + public String getDirKeyCrosscert() { + return this.dirKeyCrosscert; + } + + private String dirKeyCertification; + public String getDirKeyCertification() { + return this.dirKeyCertification; + } + public String getSigningKeyDigest() { String signingKeyDigest = null; if (!this.directorySignatures.isEmpty()) { diff --git a/test/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java b/test/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java index 6111b59..261abd4 100644 --- a/test/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java +++ b/test/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java @@ -506,6 +506,21 @@ public class RelayNetworkStatusVoteImplTest { assertEquals("Tor 0.2.1.29 (r8e9b25e6c7a2e70c)", vote.getStatusEntry("00343A8024F70E214728F0C5AF7ACE0C1508F073"). getVersion()); + assertEquals(3, vote.getDirKeyCertificateVersion()); + assertEquals("80550987E1D626E3EBA5E5E75A458DE0626D088C", + vote.getIdentity()); + assertEquals(1303882477000L, /* 2011-04-27 05:34:37 */ + vote.getDirKeyPublishedMillis()); + assertEquals(1335504877000L, /* 2012-04-27 05:34:37 */ + vote.getDirKeyExpiresMillis()); + assertEquals("-----BEGIN RSA PUBLIC KEY-----", + vote.getDirIdentityKey().split("\n")[0]); + assertEquals("-----BEGIN RSA PUBLIC KEY-----", + vote.getDirSigningKey().split("\n")[0]); + assertEquals("-----BEGIN ID SIGNATURE-----", + vote.getDirKeyCrosscert().split("\n")[0]); + assertEquals("-----BEGIN SIGNATURE-----", + vote.getDirKeyCertification().split("\n")[0]); assertTrue(vote.getUnrecognizedLines().isEmpty()); }
tor-commits@lists.torproject.org