package com.licel.jcardsim.base; import com.licel.jcardsim.samples.MultiInstanceApplet; import com.licel.jcardsim.utils.AIDUtil; import com.licel.jcardsim.utils.ByteUtil; import javacard.framework.*; import junit.framework.TestCase; import org.bouncycastle.util.encoders.Hex; import java.util.Arrays; public class SelectTest extends TestCase { private static final byte CLA = (byte) 0x80; private static final byte INS_GET_FULL_AID = 0; private static boolean selectedCalled; private static class UnselectableApplet extends Applet { @SuppressWarnings("unused") public static void install(byte[] bArray, short bOffset, byte bLength) { new UnselectableApplet().register(); } @Override public boolean select() { selectedCalled = true; return false; } @Override public void process(APDU apdu) throws ISOException { } } public SelectTest(String name) { super(name); } public void testAidComparator() { AID[] input = new AID[] { AIDUtil.create("A000008812"), AIDUtil.create("FF00066767"), AIDUtil.create("D0000CAFE001"), AIDUtil.create("D0000CAFE000"), AIDUtil.create("D0000CAFE00023"), AIDUtil.create("D0000CAFE00001"), AIDUtil.create("0100CAFE01"), AIDUtil.create("0200888888") }; Arrays.sort(input, AIDUtil.comparator()); String[] tmp = new String[input.length]; for (int i = 0; i < input.length; i++) { tmp[i] = AIDUtil.toString(input[i]); } String expected = "[0100CAFE01, 0200888888, A000008812, " + "D0000CAFE000, D0000CAFE00001, D0000CAFE00023, D0000CAFE001, FF00066767]"; assertEquals(expected, Arrays.toString(tmp)); } private Simulator prepareSimulator() { AID aid0 = AIDUtil.create("010203040506070809"); AID aid1 = AIDUtil.create("d0000cafe00001"); AID aid2 = AIDUtil.create("d0000cafe00002"); Simulator simulator = new Simulator(); simulator.installApplet(aid0, MultiInstanceApplet.class); simulator.installApplet(aid2, MultiInstanceApplet.class); simulator.installApplet(aid1, MultiInstanceApplet.class); return simulator; } public void testPartialSelectWorks1() { Simulator simulator = prepareSimulator(); // should select d0000cafe00001 assertTrue(simulator.selectApplet(AIDUtil.create("d0000cafe0"))); byte[] expected = Hex.decode("d0000cafe000019000"); byte[] actual = simulator.transmitCommand(new byte[]{CLA,INS_GET_FULL_AID,0,0}); assertEquals(Arrays.toString(expected), Arrays.toString(actual)); } public void testPartialSelectWorks2() { Simulator simulator = prepareSimulator(); // should select d0000cafe00001 simulator.transmitCommand(new byte[]{0, ISO7816.INS_SELECT, 4, 0, 1, (byte) 0xD0}); byte[] expected = Hex.decode("d0000cafe000019000"); byte[] actual = simulator.transmitCommand(new byte[]{CLA,INS_GET_FULL_AID,0,0}); assertEquals(Arrays.toString(expected), Arrays.toString(actual)); } public void testEmptySelectWorks() { final byte[] expected = Hex.decode("0102030405060708099000"); Simulator simulator = prepareSimulator(); // should select 010203040506070809 simulator.transmitCommand(new byte[]{0, ISO7816.INS_SELECT, 4, 0}); byte[] actual = simulator.transmitCommand(new byte[]{CLA,INS_GET_FULL_AID, 0, 0}); assertEquals(Arrays.toString(expected), Arrays.toString(actual)); // should select 010203040506070809 simulator.transmitCommand(new byte[]{0, ISO7816.INS_SELECT, 4, 0, 0}); actual = simulator.transmitCommand(new byte[]{CLA,INS_GET_FULL_AID,0,0}); assertEquals(Arrays.toString(expected), Arrays.toString(actual)); } public void testCanNotSelectUnselectableApplet() { selectedCalled = false; AID aid = AIDUtil.create("010203040506070809"); Simulator simulator = new Simulator(); simulator.installApplet(aid, UnselectableApplet.class); byte[] result = simulator.selectAppletWithResult(aid); assertEquals(2, result.length); assertEquals(ISO7816.SW_APPLET_SELECT_FAILED, Util.getShort(result, (short)0)); assertTrue(selectedCalled); } public void testApduWithoutSelectedAppletFails() { Simulator simulator = new Simulator(); byte[] cmd = new byte[]{CLA, INS_GET_FULL_AID, 0, 0}; byte[] result; result = simulator.transmitCommand(cmd); assertEquals(ISO7816.SW_COMMAND_NOT_ALLOWED, ByteUtil.getSW(result)); result = CardManager.dispatchApdu(simulator, new byte[]{CLA,INS_GET_FULL_AID, 0, 0}); assertEquals(ISO7816.SW_COMMAND_NOT_ALLOWED, ByteUtil.getSW(result)); } }