package com.github.devnied.emvnfccard.utils; import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.List; import org.fest.assertions.Assertions; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.reflect.Whitebox; import com.github.devnied.emvnfccard.enums.TagTypeEnum; import com.github.devnied.emvnfccard.enums.TagValueTypeEnum; import com.github.devnied.emvnfccard.iso7816emv.EmvTags; import com.github.devnied.emvnfccard.iso7816emv.ITag; import com.github.devnied.emvnfccard.iso7816emv.TagAndLength; import fr.devnied.bitlib.BytesUtils; @RunWith(PowerMockRunner.class) @PrepareForTest({ TlvUtil.class }) public class TlvUtilTest { private static final byte[] DATA = BytesUtils.fromString("70 63 61 13 4f 09 a0 00 00 03 15 10 10 05 28 50" + "03 50 49 4e 87 01 01 61 15 4f 07 a0 00 00 00 04 30 60 50 07 4d 41 45 53 54 52 4f 87 01 02 61 1d" + "4f 07 a0 00 00 00 04 80 02 50 0f 53 65 63 75 72 65 43 6f 64 65 20 41 75 74 68 87 01 00 61 16 4f" + "07 a0 00 00 03 15 60 20 50 08 43 68 69 70 6b 6e 69 70 87 01 00 90 00"); @Test public void test() { String expResult = "\n"// + "70 63 -- Record Template (EMV Proprietary)\n" // + " 61 13 -- Application Template\n" // + " 4F 09 -- Application Identifier (AID) - card\n" // + " A0 00 00 03 15 10 10 05 28 (BINARY)\n" // + " 50 03 -- Application Label\n" // + " 50 49 4E (=PIN)\n" // + " 87 01 -- Application Priority Indicator\n"// + " 01 (BINARY)\n" // + " 61 15 -- Application Template\n"// + " 4F 07 -- Application Identifier (AID) - card\n"// + " A0 00 00 00 04 30 60 (BINARY)\n" // + " 50 07 -- Application Label\n"// + " 4D 41 45 53 54 52 4F (=MAESTRO)\n" // + " 87 01 -- Application Priority Indicator\n"// + " 02 (BINARY)\n" // + " 61 1D -- Application Template\n"// + " 4F 07 -- Application Identifier (AID) - card\n"// + " A0 00 00 00 04 80 02 (BINARY)\n" // + " 50 0F -- Application Label\n"// + " 53 65 63 75 72 65 43 6F 64 65 20 41 75 74 68 (=SecureCode Auth)\n" // + " 87 01 -- Application Priority Indicator\n" // + " 00 (BINARY)\n"// + " 61 16 -- Application Template\n" // + " 4F 07 -- Application Identifier (AID) - card\n"// + " A0 00 00 03 15 60 20 (BINARY)\n" // + " 50 08 -- Application Label\n"// + " 43 68 69 70 6B 6E 69 70 (=Chipknip)\n"// + " 87 01 -- Application Priority Indicator\n" // + " 00 (BINARY)\n" // + "90 00 -- Command successfully executed (OK)"; Assertions.assertThat(TlvUtil.prettyPrintAPDUResponse(DATA)).isEqualTo(expResult); } /** * @throws Exception * */ @Test public void testSearchTagById() throws Exception { ITag tag = (ITag) Whitebox.invokeMethod(TlvUtil.class, "searchTagById", BytesUtils.fromString("9F6B")); Assertions.assertThat(tag).isEqualTo(EmvTags.TRACK2_DATA); tag = (ITag) Whitebox.invokeMethod(TlvUtil.class, "searchTagById", BytesUtils.fromString("FFFF")); Assertions.assertThat(tag.getName()).isEqualTo("[UNKNOWN TAG]"); Assertions.assertThat(tag.getDescription()).isEqualTo(""); Assertions.assertThat(tag.getTagBytes()).isEqualTo(BytesUtils.fromString("FFFF")); Assertions.assertThat(tag.getNumTagBytes()).isEqualTo(2); Assertions.assertThat(tag.isConstructed()).isEqualTo(true); Assertions.assertThat(tag.getTagValueType()).isEqualTo(TagValueTypeEnum.BINARY); Assertions.assertThat(tag.getType()).isEqualTo(TagTypeEnum.CONSTRUCTED); } /** * @throws Exception * */ @Test public void testSearchTagByIdIn() throws Exception { ByteArrayInputStream in = new ByteArrayInputStream(BytesUtils.fromString("9F6B")); ITag tag = (ITag) Whitebox.invokeMethod(TlvUtil.class, "searchTagById", in); Assertions.assertThat(tag).isEqualTo(EmvTags.TRACK2_DATA); in = new ByteArrayInputStream(BytesUtils.fromString("FFFF")); tag = (ITag) Whitebox.invokeMethod(TlvUtil.class, "searchTagById", in); Assertions.assertThat(tag.getName()).isEqualTo("[UNKNOWN TAG]"); Assertions.assertThat(tag.getDescription()).isEqualTo(""); Assertions.assertThat(tag.getTagBytes()).isEqualTo(BytesUtils.fromString("FFFF")); Assertions.assertThat(tag.getNumTagBytes()).isEqualTo(2); Assertions.assertThat(tag.isConstructed()).isEqualTo(true); Assertions.assertThat(tag.getTagValueType()).isEqualTo(TagValueTypeEnum.BINARY); Assertions.assertThat(tag.getType()).isEqualTo(TagTypeEnum.CONSTRUCTED); } @Test public void testGetFormattedTagAndLength() throws Exception { byte[] data = BytesUtils.fromString("9f6b01"); Assertions.assertThat(TlvUtil.getFormattedTagAndLength(data, 1)).isEqualTo(" 9F 6B 01 -- Track 2 Data"); } @Test public void testListTLV() throws Exception { Assertions.assertThat(TlvUtil.getlistTLV(DATA, EmvTags.APPLICATION_TEMPLATE, false).size()).isEqualTo(12); Assertions.assertThat(TlvUtil.getlistTLV(DATA, EmvTags.RECORD_TEMPLATE, false).size()).isEqualTo(4); Assertions.assertThat(TlvUtil.getlistTLV(DATA, EmvTags.TRANSACTION_CURRENCY_CODE, false).size()).isEqualTo(0); } @Test public void testParseTagAndLength() throws Exception { Assertions.assertThat(TlvUtil.parseTagAndLength(null)).isEqualTo(new ArrayList<TagAndLength>()); } @Test public void testGetLength() throws Exception { Assertions.assertThat(TlvUtil.getLength(null)).isEqualTo(0); Assertions.assertThat(TlvUtil.getLength(new ArrayList<TagAndLength>())).isEqualTo(0); List<TagAndLength> list = new ArrayList<TagAndLength>(); list.add(new TagAndLength(EmvTags.AID_CARD, 12)); list.add(new TagAndLength(EmvTags.AID_TERMINAL, 2)); Assertions.assertThat(TlvUtil.getLength(list)).isEqualTo(14); } @Test public void testGetTagValueAsString() throws Exception { Assertions .assertThat( (String) Whitebox.invokeMethod(TlvUtil.class, "getTagValueAsString", EmvTags.ACQUIRER_IDENTIFIER, "56".getBytes())).isEqualTo("NUMERIC"); Assertions.assertThat( (String) Whitebox.invokeMethod(TlvUtil.class, "getTagValueAsString", EmvTags.ISSUER_COUNTRY_CODE_ALPHA3, "56".getBytes())).isEqualTo("=56"); Assertions.assertThat( (String) Whitebox.invokeMethod(TlvUtil.class, "getTagValueAsString", EmvTags.APP_DISCRETIONARY_DATA, "56".getBytes())).isEqualTo("BINARY"); Assertions.assertThat( (String) Whitebox.invokeMethod(TlvUtil.class, "getTagValueAsString", EmvTags.BANK_IDENTIFIER_CODE, "56".getBytes())).isEqualTo("=56"); Assertions .assertThat((String) Whitebox.invokeMethod(TlvUtil.class, "getTagValueAsString", EmvTags.DDOL, "56".getBytes())) .isEqualTo(""); } }