/*
* Copyright 2013 Licel LLC.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.licel.jcardsim.base;
import com.licel.jcardsim.samples.HelloWorldApplet;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import javacard.framework.AID;
import javacard.framework.Applet;
import javacard.framework.ISO7816;
import javacard.framework.Util;
import junit.framework.TestCase;
import org.bouncycastle.util.Arrays;
import org.bouncycastle.util.encoders.Hex;
/**
*
*/
public class SimulatorTest extends TestCase {
private static final byte[] ETALON_ATR = Hex.decode("3BFA1800008131FE454A434F5033315632333298");
private static final byte[] TEST_APPLET_AID_BYTES = Hex.decode("010203040506070809");
private static final Class<? extends Applet> TEST_APPLET_CLASS = HelloWorldApplet.class;
private static final String TEST_APPLET_CLASSNAME = "com.licel.jcardsim.samples.HelloWorldApplet";
private static final AID TEST_APPLET_AID = new AID(TEST_APPLET_AID_BYTES, (short)0, (byte) TEST_APPLET_AID_BYTES.length);
private static final byte[] TEST_APPLET1_AID_BYTES = Hex.decode("01020304050607080A");
private static final String TEST_APPLET1_CLASSNAME = "com.licel.jcardsim.samples.HelloWorldApplet1";
private static final AID TEST_APPLET1_AID = new AID(TEST_APPLET1_AID_BYTES, (short)0, (byte) TEST_APPLET1_AID_BYTES.length);
byte[] createData = null;
byte[] appletJarContents = null;
public SimulatorTest(String testName) {
super(testName);
}
@Override
protected void setUp() throws Exception {
super.setUp();
createData = new byte[1+TEST_APPLET_AID_BYTES.length+1+2+3];
createData[0] = (byte) TEST_APPLET_AID_BYTES.length;
System.arraycopy(TEST_APPLET_AID_BYTES, 0, createData, 1, TEST_APPLET_AID_BYTES.length);
createData[1+TEST_APPLET_AID_BYTES.length] = (byte) 5;
createData[2+TEST_APPLET_AID_BYTES.length] = 0; // aid
createData[3+TEST_APPLET_AID_BYTES.length] = 0; // control
createData[4+TEST_APPLET_AID_BYTES.length] = 2; // params
createData[5+TEST_APPLET_AID_BYTES.length] = 0xF; // params
createData[6+TEST_APPLET_AID_BYTES.length] = 0xF; // params
InputStream is = SimulatorTest.class.getResourceAsStream("helloworld.jar");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] chunk = new byte[1024];
int readed = is.read(chunk);
while (readed > 0) {
bos.write(chunk, 0, readed);
readed = is.read(chunk);
}
appletJarContents = bos.toByteArray();
bos.close();
is.close();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
/**
* Test of loadApplet method, of class Simulator.
*/
public void testLoadApplet_3args() {
System.out.println("loadApplet");
Simulator instance = new Simulator();
assertEquals(instance.loadApplet(TEST_APPLET1_AID, TEST_APPLET1_CLASSNAME, appletJarContents).equals(TEST_APPLET1_AID),true);
}
/**
* Test of loadApplet method, of class Simulator.
*/
public void testLoadApplet_AID_String() {
System.out.println("loadApplet");
Simulator instance = new Simulator();
assertEquals(instance.loadApplet(TEST_APPLET_AID, TEST_APPLET_CLASSNAME).equals(TEST_APPLET_AID),true);
}
/**
* Test of loadApplet method, of class Simulator.
*/
public void testLoadApplet_AID_Class() {
System.out.println("loadApplet");
Simulator instance = new Simulator();
assertEquals(instance.loadApplet(TEST_APPLET_AID, TEST_APPLET_CLASS).equals(TEST_APPLET_AID),true);
}
/**
* Test of createApplet method, of class Simulator.
*/
public void testCreateApplet() {
System.out.println("createApplet");
Simulator instance = new Simulator();
assertEquals(instance.loadApplet(TEST_APPLET_AID, TEST_APPLET_CLASS).equals(TEST_APPLET_AID),true);
assertEquals(instance.createApplet(TEST_APPLET_AID, createData, (short)0, (byte) createData.length).equals(TEST_APPLET_AID),true);
}
/**
* Test of installApplet method, of class Simulator.
*/
public void testInstallApplet_AID_Class() {
System.out.println("installApplet");
Simulator instance = new Simulator();
instance.installApplet(TEST_APPLET_AID, TEST_APPLET_CLASS);
assertEquals(instance.selectApplet(TEST_APPLET_AID), true);
}
/**
* Test of installApplet method, of class Simulator.
*/
public void testInstallApplet_5args_1() {
System.out.println("installApplet");
Simulator instance = new Simulator();
assertEquals(instance.installApplet(TEST_APPLET_AID, TEST_APPLET_CLASS, createData, (short)0, (byte) createData.length).equals(TEST_APPLET_AID),true);
}
/**
* Test of installApplet method, of class Simulator.
*/
public void testInstallApplet_5args_2() {
System.out.println("installApplet");
Simulator instance = new Simulator();
assertEquals(instance.installApplet(TEST_APPLET_AID, TEST_APPLET_CLASSNAME, createData, (short)0, (byte) createData.length).equals(TEST_APPLET_AID),true);
}
/**
* Test of installApplet method, of class Simulator.
*/
public void testInstallApplet_6args() {
System.out.println("installApplet");
Simulator instance = new Simulator();
assertEquals(instance.installApplet(TEST_APPLET1_AID, TEST_APPLET1_CLASSNAME, appletJarContents, createData, (short)0, (byte) createData.length).equals(TEST_APPLET1_AID),true);
assertEquals(instance.selectApplet(TEST_APPLET1_AID), true);
// test NOP
byte[] response = instance.transmitCommand(new byte[]{0x01, 0x02, 0x00, 0x00});
assertEquals(Arrays.areEqual(new byte[]{(byte)0x90, 0x00}, response), true);
}
public void testNopWithLengthExtensionsFails() {
Simulator instance = new Simulator();
instance.installApplet(TEST_APPLET_AID, TEST_APPLET_CLASS);
instance.selectApplet(TEST_APPLET_AID);
// test NOP with Lc=1
byte[] response1 = instance.transmitCommand(new byte[]{0x01, 0x02, 0x00, 0x00, 0, 0, 1, 0xA});
assertEquals(ISO7816.SW_WRONG_LENGTH, Util.getShort(response1, (short) 0));
// test NOP with Le=1
byte[] response2 = instance.transmitCommand(new byte[]{0x01, 0x02, 0x00, 0x00, 0, 0, 1});
assertEquals(ISO7816.SW_WRONG_LENGTH, Util.getShort(response2, (short) 0));
// test NOP with Lc=1, Le=1
byte[] response3 = instance.transmitCommand(new byte[]{0x01, 0x02, 0x00, 0x00, 0, 0, 1, 0xA, 0, 1});
assertEquals(ISO7816.SW_WRONG_LENGTH, Util.getShort(response3, (short) 0));
}
/**
* Test of selectApplet method, of class Simulator.
*/
public void testSelectApplet() {
System.out.println("selectApplet");
Simulator instance = new Simulator();
instance.installApplet(TEST_APPLET_AID, TEST_APPLET_CLASS);
assertEquals(instance.selectApplet(TEST_APPLET_AID), true);
}
/**
* Test of selectAppletWithResult method, of class Simulator.
*/
public void testSelectAppletWithResult() {
System.out.println("selectApplet");
Simulator instance = new Simulator();
instance.installApplet(TEST_APPLET_AID, TEST_APPLET_CLASS);
byte[] result = instance.selectAppletWithResult(TEST_APPLET_AID);
assertEquals(result[0], (byte)0x90);
assertEquals(result[1], 0x00);
}
/**
* Test of transmitCommand method, of class Simulator.
*/
public void testTransmitCommand() {
System.out.println("transmitCommand");
Simulator instance = new Simulator();
instance.installApplet(TEST_APPLET_AID, TEST_APPLET_CLASS);
assertEquals(instance.selectApplet(TEST_APPLET_AID), true);
// test NOP
byte[] response = instance.transmitCommand(new byte[]{0x01, 0x02, 0x00, 0x00});
assertEquals(Arrays.areEqual(new byte[]{(byte)0x90, 0x00}, response), true);
}
/**
* Test of reset method, of class Simulator.
*/
public void testReset() {
System.out.println("reset");
Simulator instance = new Simulator();
instance.installApplet(TEST_APPLET_AID, TEST_APPLET_CLASS);
instance.reset();
// after reset installed applets not deleted
assertEquals(instance.selectApplet(TEST_APPLET_AID), true);
}
/**
* Test of resetRuntime method, of class Simulator.
*/
public void testResetRuntime() {
System.out.println("resetRuntime");
Simulator instance = new Simulator();
instance.installApplet(TEST_APPLET_AID, TEST_APPLET_CLASS);
instance.resetRuntime();
// after reset runtime all applets removed
assertEquals(instance.selectApplet(TEST_APPLET_AID), false);
}
/**
* Test of getATR method, of class Simulator.
*/
public void testGetATR() {
System.out.println("getATR");
Simulator instance = new Simulator();
byte[] result = instance.getATR();
assertEquals(Arrays.areEqual(ETALON_ATR, result), true);
}
/**
* Test of selectApplet method, of class Simulator.
*/
public void testSelectAppletWith2Simulators() {
System.out.println("selectAppletWith2Simulators");
Simulator instance1 = new Simulator(new SimulatorRuntime());
Simulator instance2 = new Simulator(new SimulatorRuntime());
instance1.installApplet(TEST_APPLET_AID, TEST_APPLET_CLASS);
assertTrue(instance1.selectApplet(TEST_APPLET_AID));
assertFalse(instance2.selectApplet(TEST_APPLET_AID));
instance2.installApplet(TEST_APPLET_AID, TEST_APPLET_CLASS);
assertTrue(instance1.selectApplet(TEST_APPLET_AID));
assertTrue(instance2.selectApplet(TEST_APPLET_AID));
instance2.resetRuntime();
assertTrue(instance1.selectApplet(TEST_APPLET_AID));
assertFalse(instance2.selectApplet(TEST_APPLET_AID));
instance1.resetRuntime();
assertFalse(instance1.selectApplet(TEST_APPLET_AID));
assertFalse(instance2.selectApplet(TEST_APPLET_AID));
}
}