diff --git a/src/main/java/com/payneteasy/tlv/BerTlvParser.java b/src/main/java/com/payneteasy/tlv/BerTlvParser.java index 8785372..a6a53a9 100644 --- a/src/main/java/com/payneteasy/tlv/BerTlvParser.java +++ b/src/main/java/com/payneteasy/tlv/BerTlvParser.java @@ -116,7 +116,7 @@ private ParseResult parseWithResult(int aLevel, byte[] aBuf, int aOffset, int aL private void addChildren(int aLevel, byte[] aBuf, int aOffset, String levelPadding, int aTagBytesCount, int aDataBytesCount, int valueLength, ArrayList list) { int startPosition = aOffset + aTagBytesCount + aDataBytesCount; int len = valueLength; - while (startPosition < aOffset + valueLength) { + while (startPosition <= aOffset + valueLength) { ParseResult result = parseWithResult(aLevel+1, aBuf, startPosition, len); list.add(result.tlv); diff --git a/src/test/java/com/payneteasy/tlv/BerTlvBuilderTest.java b/src/test/java/com/payneteasy/tlv/BerTlvBuilderTest.java index 1606b38..a10544e 100644 --- a/src/test/java/com/payneteasy/tlv/BerTlvBuilderTest.java +++ b/src/test/java/com/payneteasy/tlv/BerTlvBuilderTest.java @@ -3,6 +3,7 @@ import org.junit.Assert; import org.junit.Test; +import java.util.Arrays; import java.util.List; import static com.payneteasy.tlv.BerTlvBuilder.template; @@ -159,6 +160,18 @@ public void addToTlvs() { } + @Test + public void getContructedTagBytes() { + BerTlv constructedTag = new BerTlv(new BerTag(0xE4) + , Arrays.asList(new BerTlv(new BerTag(0x86), HexUtil.parseHex("ED3C3B8B03928D0E0012"))) + ); + + BerTlvBuilder builder = new BerTlvBuilder(); + builder.addBerTlv(constructedTag); + byte[] bytes = builder.buildArray(); + Assert.assertEquals("[14] : E4 0C 86 0A ED 3C 3B 8B 03 92 8D 0E 00 12", HexUtil.toFormattedHexString(bytes)); + } + @Test public void testBigData() { byte[] bigData = new byte[1024]; @@ -170,4 +183,37 @@ public void testBigData() { Assert.assertEquals(1, berTlvs.getList().size()); } + + @Test + public void test_empty() { + BerTlv tlv = new BerTlv(new BerTag(0x01), new byte[]{}); + + byte[] bytes = new BerTlvBuilder(new BerTag(0xe3)) + .addBerTlv(tlv) + .buildArray(); + + BerTlv berTlv = new BerTlvBuilder(new BerTag(0xe3)) + .addBerTlv(tlv) + .buildTlv(); + + BerTlvLogger.log(" ", berTlv, new BerTlvLoggerSlf4j()); + + System.out.println("bytes = " + HexUtil.toFormattedHexString(bytes)); + } + + @Test + public void test_empty_length() { + BerTlv tlv = new BerTlv(new BerTag(0x01),new byte[]{}); + + BerTlv some = new BerTlvBuilder() + .addBytes(new BerTag(0xE3), new BerTlvBuilder().addBerTlv(tlv).buildArray()) + .buildTlv(); + + Assert.assertEquals(some.getTag(), new BerTag(0xe3)); + Assert.assertNotNull(some.getValues()); + Assert.assertEquals(1, some.getValues().size()); + BerTlv empty = some.getValues().get(0); + Assert.assertEquals(new BerTag(0x01), empty.getTag()); + Assert.assertEquals("", empty.getHexValue()); + } } diff --git a/src/test/java/com/payneteasy/tlv/BerTlvParserTest.java b/src/test/java/com/payneteasy/tlv/BerTlvParserTest.java index 225a304..5121704 100644 --- a/src/test/java/com/payneteasy/tlv/BerTlvParserTest.java +++ b/src/test/java/com/payneteasy/tlv/BerTlvParserTest.java @@ -98,4 +98,17 @@ public void testMulti() { } + + @Test + public void test_empty_length() { + BerTlv tlv = new BerTlvParser(LOG).parseConstructed(HexUtil.parseHex("E3 02 01 00")); + BerTlvLogger.log(" ", tlv, LOG); + + Assert.assertEquals(tlv.getTag(), new BerTag(0xe3)); + Assert.assertNotNull(tlv.getValues()); + Assert.assertEquals(1, tlv.getValues().size()); + BerTlv emptyTag = tlv.getValues().get(0); + Assert.assertEquals(new BerTag(0x01), emptyTag.getTag()); + Assert.assertEquals("", emptyTag.getHexValue()); + } }