From cd7dcd5c0935e2fc6189b9929faf5397baa2e696 Mon Sep 17 00:00:00 2001 From: ian Date: Wed, 12 Jul 2023 10:16:03 +0100 Subject: [PATCH] Encode hex auth as bytes in bitswap --- src/main/java/org/peergos/protocol/bitswap/Bitswap.java | 3 ++- .../java/org/peergos/protocol/bitswap/BitswapEngine.java | 9 ++++++--- src/main/java/org/peergos/util/ArrayOps.java | 6 ++++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/peergos/protocol/bitswap/Bitswap.java b/src/main/java/org/peergos/protocol/bitswap/Bitswap.java index e318dd4e..008eeb64 100644 --- a/src/main/java/org/peergos/protocol/bitswap/Bitswap.java +++ b/src/main/java/org/peergos/protocol/bitswap/Bitswap.java @@ -8,6 +8,7 @@ import io.libp2p.core.multistream.*; import org.peergos.*; import org.peergos.protocol.bitswap.pb.*; +import org.peergos.util.*; import java.util.*; import java.util.concurrent.*; @@ -74,7 +75,7 @@ public void sendWants(Host us, Set peers) { MessageOuterClass.Message.Wantlist.WantType.Block : MessageOuterClass.Message.Wantlist.WantType.Have) .setBlock(ByteString.copyFrom(want.cid.toBytes())) - .setAuth(ByteString.copyFrom(want.auth.orElse("").getBytes())) + .setAuth(ByteString.copyFrom(ArrayOps.hexToBytes(want.auth.orElse("")))) .build()) .collect(Collectors.toList()); engine.buildAndSendMessages(wantsProto, Collections.emptyList(), Collections.emptyList(), diff --git a/src/main/java/org/peergos/protocol/bitswap/BitswapEngine.java b/src/main/java/org/peergos/protocol/bitswap/BitswapEngine.java index d30cbd27..01c7ce71 100644 --- a/src/main/java/org/peergos/protocol/bitswap/BitswapEngine.java +++ b/src/main/java/org/peergos/protocol/bitswap/BitswapEngine.java @@ -9,6 +9,7 @@ import org.peergos.*; import org.peergos.blockstore.*; import org.peergos.protocol.bitswap.pb.*; +import org.peergos.util.*; import java.io.*; import java.nio.charset.*; @@ -98,7 +99,7 @@ public void receiveMessage(MessageOuterClass.Message msg, Stream source) { if (msg.hasWantlist()) { for (MessageOuterClass.Message.Wantlist.Entry e : msg.getWantlist().getEntriesList()) { Cid c = Cid.cast(e.getBlock().toByteArray()); - Optional auth = e.getAuth().isEmpty() ? Optional.empty() : Optional.of(e.getAuth().toStringUtf8()); + Optional auth = e.getAuth().isEmpty() ? Optional.empty() : Optional.of(ArrayOps.bytesToHex(e.getAuth().toByteArray())); boolean isCancel = e.getCancel(); boolean sendDontHave = e.getSendDontHave(); boolean wantBlock = e.getWantType().getNumber() == 0; @@ -155,7 +156,7 @@ public void receiveMessage(MessageOuterClass.Message msg, Stream source) { byte[] cidPrefix = block.getPrefix().toByteArray(); Optional auth = block.getAuth().isEmpty() ? Optional.empty() : - Optional.of(block.getAuth().toStringUtf8()); + Optional.of(ArrayOps.bytesToHex(block.getAuth().toByteArray())); byte[] data = block.getData().toByteArray(); ByteArrayInputStream bin = new ByteArrayInputStream(cidPrefix); try { @@ -188,7 +189,9 @@ public void receiveMessage(MessageOuterClass.Message msg, Stream source) { LOG.info("Remaining: " + localWants.size()); for (MessageOuterClass.Message.BlockPresence blockPresence : msg.getBlockPresencesList()) { Cid c = Cid.cast(blockPresence.getCid().toByteArray()); - Optional auth = blockPresence.getAuth().isEmpty() ? Optional.empty() : Optional.of(blockPresence.getAuth().toStringUtf8()); + Optional auth = blockPresence.getAuth().isEmpty() ? + Optional.empty() : + Optional.of(ArrayOps.bytesToHex(blockPresence.getAuth().toByteArray())); Want w = new Want(c, auth); boolean have = blockPresence.getType().getNumber() == 0; if (have && localWants.containsKey(w)) { diff --git a/src/main/java/org/peergos/util/ArrayOps.java b/src/main/java/org/peergos/util/ArrayOps.java index 3606d8bf..b7d60c32 100644 --- a/src/main/java/org/peergos/util/ArrayOps.java +++ b/src/main/java/org/peergos/util/ArrayOps.java @@ -22,4 +22,10 @@ public static String bytesToHex(byte[] data) return s.toString(); } + public static byte[] hexToBytes(String hex) { + byte[] res = new byte[hex.length()/2]; + for (int i=0; i < res.length; i++) + res[i] = (byte) Integer.parseInt(hex.substring(2*i, 2*i+2), 16); + return res; + } }