From effb2ac2fb698fedfd009f921ea5267258af6c8f Mon Sep 17 00:00:00 2001 From: Christian Basler Date: Wed, 10 Jun 2015 02:46:45 +0200 Subject: [PATCH] Fixing issue #4 - leading zeroes must be omitted on writing the coordinate components --- .../bitmessage/entity/payload/CryptoBox.java | 25 +++++++++++-------- .../bitmessage/entity/SerializationTest.java | 3 --- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/domain/src/main/java/ch/dissem/bitmessage/entity/payload/CryptoBox.java b/domain/src/main/java/ch/dissem/bitmessage/entity/payload/CryptoBox.java index 8db2238..8fe6ff8 100644 --- a/domain/src/main/java/ch/dissem/bitmessage/entity/payload/CryptoBox.java +++ b/domain/src/main/java/ch/dissem/bitmessage/entity/payload/CryptoBox.java @@ -28,6 +28,7 @@ import org.bouncycastle.crypto.paddings.PKCS7Padding; import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.crypto.params.ParametersWithIV; +import org.bouncycastle.math.ec.ECFieldElement; import org.bouncycastle.math.ec.ECPoint; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -152,16 +153,20 @@ public class CryptoBox implements Streamable { return buffer; } - private void writeWithoutMAC(OutputStream stream) throws IOException { - stream.write(initializationVector); - Encode.int16(curveType, stream); - byte[] x = R.getXCoord().getEncoded(); - byte[] y = R.getYCoord().getEncoded(); - Encode.int16(x.length, stream); - stream.write(x); - Encode.int16(y.length, stream); - stream.write(y); - stream.write(encrypted); + private void writeWithoutMAC(OutputStream out) throws IOException { + out.write(initializationVector); + Encode.int16(curveType, out); + writeCoordinateComponent(out, R.getXCoord()); + writeCoordinateComponent(out, R.getYCoord()); + out.write(encrypted); + } + + private void writeCoordinateComponent(OutputStream out, ECFieldElement coord) throws IOException { + byte[] x = coord.getEncoded(); + int offset = Bytes.numberOfLeadingZeros(x); + int length = x.length - offset; + Encode.int16(length, out); + out.write(x, offset, length); } @Override diff --git a/domain/src/test/java/ch/dissem/bitmessage/entity/SerializationTest.java b/domain/src/test/java/ch/dissem/bitmessage/entity/SerializationTest.java index 720c9bf..7e56f95 100644 --- a/domain/src/test/java/ch/dissem/bitmessage/entity/SerializationTest.java +++ b/domain/src/test/java/ch/dissem/bitmessage/entity/SerializationTest.java @@ -31,9 +31,6 @@ import static ch.dissem.bitmessage.entity.Plaintext.Type.MSG; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; -/** - * Created by chris on 28.04.15. - */ public class SerializationTest { @Test public void ensureGetPubkeyIsDeserializedAndSerializedCorrectly() throws IOException {