From 35996019a20acf24a2bd592309f95f6794180df6 Mon Sep 17 00:00:00 2001 From: Christian Basler Date: Wed, 10 Jun 2015 00:49:44 +0200 Subject: [PATCH] There's something wrong with the V5 broadcast signature. I'm not quite shure what it is, so I made a test. --- .../ch/dissem/bitmessage/entity/Plaintext.java | 13 ++++++++----- .../bitmessage/entity/payload/Broadcast.java | 15 +++++++++++++++ .../bitmessage/entity/payload/V4Broadcast.java | 10 ---------- .../ch/dissem/bitmessage/DecryptionTest.java | 11 +++++++++-- .../ch/dissem/bitmessage/utils/TestUtils.java | 7 +++++++ .../BM-2D9Vc5rFxxR5vTi53T9gkLfemViHRMVLQZ.pubkey | Bin 0 -> 210 bytes .../BM-2cXxfcSetKnbHJX2Y85rSkaVpsdNUZ5q9h.pubkey | Bin 0 -> 210 bytes 7 files changed, 39 insertions(+), 17 deletions(-) create mode 100644 domain/src/test/resources/BM-2D9Vc5rFxxR5vTi53T9gkLfemViHRMVLQZ.pubkey create mode 100644 domain/src/test/resources/BM-2cXxfcSetKnbHJX2Y85rSkaVpsdNUZ5q9h.pubkey diff --git a/domain/src/main/java/ch/dissem/bitmessage/entity/Plaintext.java b/domain/src/main/java/ch/dissem/bitmessage/entity/Plaintext.java index 9b5e268..28cebfa 100644 --- a/domain/src/main/java/ch/dissem/bitmessage/entity/Plaintext.java +++ b/domain/src/main/java/ch/dissem/bitmessage/entity/Plaintext.java @@ -67,14 +67,15 @@ public class Plaintext implements Streamable { } public static Plaintext.Builder readWithoutSignature(Type type, InputStream in) throws IOException { + long version = Decode.varInt(in); return new Builder(type) - .addressVersion(Decode.varInt(in)) + .addressVersion(version) .stream(Decode.varInt(in)) .behaviorBitfield(Decode.int32(in)) .publicSigningKey(Decode.bytes(in, 64)) .publicEncryptionKey(Decode.bytes(in, 64)) - .nonceTrialsPerByte(Decode.varInt(in)) - .extraBytes(Decode.varInt(in)) + .nonceTrialsPerByte(version >= 3 ? Decode.varInt(in) : 0) + .extraBytes(version >= 3 ? Decode.varInt(in) : 0) .destinationRipe(type == Type.MSG ? Decode.bytes(in, 20) : null) .encoding(Decode.varInt(in)) .message(Decode.varBytes(in)) @@ -136,8 +137,10 @@ public class Plaintext implements Streamable { Encode.int32(from.getPubkey().getBehaviorBitfield(), out); out.write(from.getPubkey().getSigningKey(), 1, 64); out.write(from.getPubkey().getEncryptionKey(), 1, 64); - Encode.varInt(from.getPubkey().getNonceTrialsPerByte(), out); - Encode.varInt(from.getPubkey().getExtraBytes(), out); + if (from.getVersion() >= 3) { + Encode.varInt(from.getPubkey().getNonceTrialsPerByte(), out); + Encode.varInt(from.getPubkey().getExtraBytes(), out); + } if (type == Type.MSG) { out.write(to.getRipe()); } diff --git a/domain/src/main/java/ch/dissem/bitmessage/entity/payload/Broadcast.java b/domain/src/main/java/ch/dissem/bitmessage/entity/payload/Broadcast.java index 1d86310..2491d85 100644 --- a/domain/src/main/java/ch/dissem/bitmessage/entity/payload/Broadcast.java +++ b/domain/src/main/java/ch/dissem/bitmessage/entity/payload/Broadcast.java @@ -47,6 +47,21 @@ public abstract class Broadcast extends ObjectPayload implements Encrypted, Plai return address.getVersion() < 4 ? 4 : 5; } + @Override + public boolean isSigned() { + return true; + } + + @Override + public byte[] getSignature() { + return plaintext.getSignature(); + } + + @Override + public void setSignature(byte[] signature) { + plaintext.setSignature(signature); + } + @Override public long getStream() { return stream; diff --git a/domain/src/main/java/ch/dissem/bitmessage/entity/payload/V4Broadcast.java b/domain/src/main/java/ch/dissem/bitmessage/entity/payload/V4Broadcast.java index f0f579e..39127a8 100644 --- a/domain/src/main/java/ch/dissem/bitmessage/entity/payload/V4Broadcast.java +++ b/domain/src/main/java/ch/dissem/bitmessage/entity/payload/V4Broadcast.java @@ -52,16 +52,6 @@ public class V4Broadcast extends Broadcast { plaintext.write(out, false); } - @Override - public byte[] getSignature() { - return plaintext.getSignature(); - } - - @Override - public void setSignature(byte[] signature) { - plaintext.setSignature(signature); - } - @Override public void write(OutputStream out) throws IOException { encrypted.write(out); diff --git a/domain/src/test/java/ch/dissem/bitmessage/DecryptionTest.java b/domain/src/test/java/ch/dissem/bitmessage/DecryptionTest.java index 8fd6df1..ebb3707 100644 --- a/domain/src/test/java/ch/dissem/bitmessage/DecryptionTest.java +++ b/domain/src/test/java/ch/dissem/bitmessage/DecryptionTest.java @@ -27,21 +27,28 @@ import org.junit.Test; import java.io.IOException; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; public class DecryptionTest { @Test public void ensureV4BroadcastIsDecryptedCorrectly() throws IOException, DecryptionFailedException { + BitmessageAddress address = new BitmessageAddress("BM-2D9Vc5rFxxR5vTi53T9gkLfemViHRMVLQZ"); + TestUtils.loadPubkey(address); ObjectMessage objectMessage = TestUtils.loadObjectMessage(5, "V4Broadcast.payload"); V4Broadcast broadcast = (V4Broadcast) objectMessage.getPayload(); - broadcast.decrypt(new BitmessageAddress("BM-2D9Vc5rFxxR5vTi53T9gkLfemViHRMVLQZ")); + broadcast.decrypt(address); assertEquals("Test-Broadcast", broadcast.getPlaintext().getSubject()); + assertTrue(objectMessage.isSignatureValid(address.getPubkey())); } @Test public void ensureV5BroadcastIsDecryptedCorrectly() throws IOException, DecryptionFailedException { + BitmessageAddress address = new BitmessageAddress("BM-2cXxfcSetKnbHJX2Y85rSkaVpsdNUZ5q9h"); + TestUtils.loadPubkey(address); ObjectMessage objectMessage = TestUtils.loadObjectMessage(5, "V5Broadcast.payload"); V5Broadcast broadcast = (V5Broadcast) objectMessage.getPayload(); - broadcast.decrypt(new BitmessageAddress("BM-2cXxfcSetKnbHJX2Y85rSkaVpsdNUZ5q9h")); + broadcast.decrypt(address); assertEquals("Test-Broadcast", broadcast.getPlaintext().getSubject()); + assertTrue(objectMessage.isSignatureValid(address.getPubkey())); } } diff --git a/domain/src/test/java/ch/dissem/bitmessage/utils/TestUtils.java b/domain/src/test/java/ch/dissem/bitmessage/utils/TestUtils.java index 18ed654..770039d 100644 --- a/domain/src/test/java/ch/dissem/bitmessage/utils/TestUtils.java +++ b/domain/src/test/java/ch/dissem/bitmessage/utils/TestUtils.java @@ -18,6 +18,7 @@ package ch.dissem.bitmessage.utils; import ch.dissem.bitmessage.entity.BitmessageAddress; import ch.dissem.bitmessage.entity.ObjectMessage; +import ch.dissem.bitmessage.entity.payload.Pubkey; import ch.dissem.bitmessage.entity.payload.V4Pubkey; import ch.dissem.bitmessage.entity.valueobject.PrivateKey; import ch.dissem.bitmessage.exception.DecryptionFailedException; @@ -76,4 +77,10 @@ public class TestUtils { address.setPubkey((V4Pubkey) object.getPayload()); return address; } + + public static void loadPubkey(BitmessageAddress address) throws IOException { + byte[] bytes = getBytes(address.getAddress() + ".pubkey"); + Pubkey pubkey = Factory.readPubkey(address.getVersion(), address.getStream(), new ByteArrayInputStream(bytes), bytes.length, false); + address.setPubkey(pubkey); + } } diff --git a/domain/src/test/resources/BM-2D9Vc5rFxxR5vTi53T9gkLfemViHRMVLQZ.pubkey b/domain/src/test/resources/BM-2D9Vc5rFxxR5vTi53T9gkLfemViHRMVLQZ.pubkey new file mode 100644 index 0000000000000000000000000000000000000000..39e5802c7a5f23d7924a13cce528ed9407bfd4e9 GIT binary patch literal 210 zcmV;@04@Ij0003sR9}Qf& zP)z;o4!|5${i7BgSYsW5x(Dx|FB~)B@|pr60J=y#Hj_V#)%q(9nW&ZKk@J4jq8ECv MX9R<#Flqs+-2d=n7XSbN literal 0 HcmV?d00001 diff --git a/domain/src/test/resources/BM-2cXxfcSetKnbHJX2Y85rSkaVpsdNUZ5q9h.pubkey b/domain/src/test/resources/BM-2cXxfcSetKnbHJX2Y85rSkaVpsdNUZ5q9h.pubkey new file mode 100644 index 0000000000000000000000000000000000000000..fe7d2c75d620101bfb8eb11e653137bfd4d42dab GIT binary patch literal 210 zcmV;@04@Ij0003bF{sk%!_S&sW(-zyG31tq`KKGJx}9N{w#E>?A~$sa^C!}%&{&^D zphHV=%PM+V)@lS&E~P-Z4$DExi)SaJ?f*Zm&T1>i_=#=$Elq>|DH}Xao2_+ z@R^HVOpFKzV>d77`2ue2{T?_vCc3BIRwJYAD$8=%D1rF>1L*w&=tnR`0wDl}lEV@s zuj;T2Cg0Az+U^4JLl@G=&PlY<+#L3rFubw?ATFV8Mq%%zDA;4W=Xe~_c%AnZ)VCUs M{IV^$!r4m1pdNK;?f?J) literal 0 HcmV?d00001