diff --git a/src/main/java/com/riscure/trs/Trace.java b/src/main/java/com/riscure/trs/Trace.java index 9187e7c..23e016e 100644 --- a/src/main/java/com/riscure/trs/Trace.java +++ b/src/main/java/com/riscure/trs/Trace.java @@ -3,7 +3,6 @@ import com.riscure.trs.enums.Encoding; import com.riscure.trs.parameter.trace.TraceParameterMap; -import java.math.BigInteger; import java.nio.FloatBuffer; /** @@ -149,11 +148,12 @@ public TraceParameterMap getParameters() { /** * Get the supplementary (crypto) data of this trace as a hexadecimal string. + * Each byte is represented by exactly two uppercase hexadecimal characters. * * @return the supplementary (crypto) data of this trace as a hexadecimal string */ public String getDataString() { - return new BigInteger(getData()).toString(16); + return HexUtils.toHexString(getData()); } /** diff --git a/src/test/java/com/riscure/trs/TraceTest.java b/src/test/java/com/riscure/trs/TraceTest.java new file mode 100644 index 0000000..3f0b0e8 --- /dev/null +++ b/src/test/java/com/riscure/trs/TraceTest.java @@ -0,0 +1,34 @@ +package com.riscure.trs; + +import com.riscure.trs.parameter.trace.TraceParameterMap; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class TraceTest { + + @Test + void getDataStringReturnsUnsignedHexadecimal() { + assertDataString(new byte[] {(byte) 0xFF, (byte) 0x80, 0x01}, "FF8001"); + } + + @Test + void getDataStringPreservesLeadingZeroBytes() { + assertDataString(new byte[] {0x00, 0x00, 0x16}, "000016"); + } + + @Test + void getDataStringDoesNotPrefixHighBitValues() { + assertDataString(new byte[] {(byte) 0xFF, (byte) 0xFF, 0x55}, "FFFF55"); + } + + private static void assertDataString(byte[] data, String expected) { + TraceParameterMap parameters = new TraceParameterMap(); + parameters.put("data", data); + Trace trace = Trace.create("title", new float[] {0}, parameters); + + String actual = trace.getDataString(); + assertEquals(expected, actual); + assertEquals(data.length * 2, actual.length()); + } +}