From a71c7ce698220a91e1a7d65db5e2835a688edbd8 Mon Sep 17 00:00:00 2001 From: Jeremy Lakeman Date: Wed, 22 Jun 2016 16:14:07 +0930 Subject: [PATCH] Add signing key to routing messages --- .../servalproject/json/JSONTableScanner.java | 4 +- .../org/servalproject/servaldna/BundleId.java | 7 +-- .../servalproject/servaldna/RouteLink.java | 8 ++- .../servalproject/servaldna/SigningKey.java | 25 +++++++++ .../servalproject/servaldna/Subscriber.java | 53 +++++++++++++++++++ network_cli.c | 6 +++ overlay_mdp.c | 2 + 7 files changed, 96 insertions(+), 9 deletions(-) create mode 100644 java/org/servalproject/servaldna/SigningKey.java create mode 100644 java/org/servalproject/servaldna/Subscriber.java diff --git a/java/org/servalproject/json/JSONTableScanner.java b/java/org/servalproject/json/JSONTableScanner.java index 3442b5e0..2cecfd15 100644 --- a/java/org/servalproject/json/JSONTableScanner.java +++ b/java/org/servalproject/json/JSONTableScanner.java @@ -30,6 +30,7 @@ import java.util.HashSet; public class JSONTableScanner { private static class Column { + public boolean supported; public String label; public Class type; public JSONTokeniser.Narrow opts; @@ -55,6 +56,7 @@ public class JSONTableScanner { col.label = label; col.type = type; col.opts = opts; + col.supported = JSONTokeniser.supportsNarrowTo(col.type); columnMap.put(label, col); return this; } @@ -91,7 +93,7 @@ public class JSONTableScanner { Column col = columns[i]; if (col != null) { Object value; - if (JSONTokeniser.supportsNarrowTo(col.type)) + if (col.supported) value = JSONTokeniser.narrow(row[i], col.type, col.opts); else { value = JSONTokeniser.narrow(row[i], col.opts); diff --git a/java/org/servalproject/servaldna/BundleId.java b/java/org/servalproject/servaldna/BundleId.java index e6086600..d7af83af 100644 --- a/java/org/servalproject/servaldna/BundleId.java +++ b/java/org/servalproject/servaldna/BundleId.java @@ -22,12 +22,7 @@ package org.servalproject.servaldna; import java.nio.ByteBuffer; -public class BundleId extends AbstractId { - - @Override - public int getBinarySize() { - return 32; - } +public class BundleId extends SigningKey { public BundleId(String hex) throws InvalidHexException { super(hex); diff --git a/java/org/servalproject/servaldna/RouteLink.java b/java/org/servalproject/servaldna/RouteLink.java index bcc1f439..5bb0badc 100644 --- a/java/org/servalproject/servaldna/RouteLink.java +++ b/java/org/servalproject/servaldna/RouteLink.java @@ -13,7 +13,10 @@ public class RouteLink { private static final int REACHABLE_UNICAST = (1<<2); //private static final int REACHABLE_INDIRECT = (1<<3); + public final Subscriber subscriber; + @Deprecated public final SubscriberId sid; + public final SubscriberId next_hop; public final SubscriberId prior_hop; public final int hop_count; @@ -34,7 +37,8 @@ public class RouteLink { } RouteLink(ByteBuffer buff) throws AbstractId.InvalidBinaryException, BufferUnderflowException { - sid = new SubscriberId(buff); + this.subscriber = new Subscriber(buff); + this.sid = subscriber.sid; reachable = 0xFF & (int)buff.get(); int hop_count=-1; SubscriberId next_hop = null; @@ -70,7 +74,7 @@ public class RouteLink { @Override public String toString() { return "RouteLink{" + - "sid=" + sid + + "subscriber=" + subscriber + ", next_hop=" + next_hop + ", prior_hop=" + prior_hop + ", hop_count=" + hop_count + diff --git a/java/org/servalproject/servaldna/SigningKey.java b/java/org/servalproject/servaldna/SigningKey.java new file mode 100644 index 00000000..4b66b9a2 --- /dev/null +++ b/java/org/servalproject/servaldna/SigningKey.java @@ -0,0 +1,25 @@ +package org.servalproject.servaldna; + +import java.nio.ByteBuffer; + +/** + * Created by jeremy on 22/06/16. + */ +public class SigningKey extends AbstractId { + public SigningKey(String hex) throws InvalidHexException { + super(hex); + } + + public SigningKey(ByteBuffer b) throws InvalidBinaryException { + super(b); + } + + public SigningKey(byte[] binary) throws InvalidBinaryException { + super(binary); + } + + @Override + int getBinarySize() { + return 32; + } +} diff --git a/java/org/servalproject/servaldna/Subscriber.java b/java/org/servalproject/servaldna/Subscriber.java new file mode 100644 index 00000000..1ff834b4 --- /dev/null +++ b/java/org/servalproject/servaldna/Subscriber.java @@ -0,0 +1,53 @@ +package org.servalproject.servaldna; + +import java.nio.ByteBuffer; + +/** + * Created by jeremy on 22/06/16. + */ +public final class Subscriber { + public final SubscriberId sid; + public final SigningKey signingKey; + public final boolean combined; + + public Subscriber(SubscriberId sid){ + this(sid, null, false); + } + + public Subscriber(SubscriberId sid, SigningKey signingKey, boolean combined){ + this.sid = sid; + this.signingKey = signingKey; + this.combined = combined; + } + + public Subscriber(ByteBuffer buff) throws AbstractId.InvalidBinaryException { + SubscriberId sid = new SubscriberId(buff); + SigningKey signingKey = new SigningKey(buff); + int signKeyFlags = 0xFF & (int)buff.get(); + if ((signKeyFlags&0x01)==0x00) + signingKey = null; + this.sid = sid; + this.signingKey = signingKey; + this.combined = (signKeyFlags&0x02)==0x02; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Subscriber that = (Subscriber) o; + + return sid.equals(that.sid); + } + + @Override + public int hashCode() { + return sid.hashCode(); + } + + @Override + public String toString(){ + return sid.toString(); + } +} diff --git a/network_cli.c b/network_cli.c index ba892f1c..cfbdec5a 100644 --- a/network_cli.c +++ b/network_cli.c @@ -497,6 +497,12 @@ static int app_route_print(const struct cli_parsed *parsed, struct cli_context * sid_t *sid = (sid_t *)ob_get_bytes_ptr(buff, SID_SIZE); if (!sid) break; + + // ignore signing key details for now + ob_skip(buff, SAS_SIZE+1); + if (ob_overrun(buff)) + break; + int reachable = ob_get(buff); if (reachable<0) break; diff --git a/overlay_mdp.c b/overlay_mdp.c index 1e155833..fd695bc2 100644 --- a/overlay_mdp.c +++ b/overlay_mdp.c @@ -1068,6 +1068,8 @@ static void send_route(struct subscriber *subscriber, struct socket_address *cli struct overlay_buffer *b = ob_static(payload, sizeof payload); ob_limitsize(b, sizeof payload); ob_append_bytes(b, subscriber->sid.binary, SID_SIZE); + ob_append_bytes(b, subscriber->sas_public, SAS_SIZE); + ob_append_byte(b, subscriber->sas_valid | (subscriber->sas_combined<<1)); ob_append_byte(b, subscriber->reachable); if (subscriber->reachable & REACHABLE){ ob_append_byte(b, subscriber->hop_count);