diff --git a/app/src/main/java/im/status/applet_installer_test/appletinstaller/APDUResponse.java b/app/src/main/java/im/status/applet_installer_test/appletinstaller/APDUResponse.java new file mode 100644 index 0000000..dffc433 --- /dev/null +++ b/app/src/main/java/im/status/applet_installer_test/appletinstaller/APDUResponse.java @@ -0,0 +1,53 @@ +package im.status.applet_installer_test.appletinstaller; + +public class APDUResponse { + public static int SW_OK = 0x9000; + public static int SW_SECURITY_CONDITION_NOT_SATISFIED = 0x6982; + public static int SW_AUTHENTICATION_METHOD_BLOCKED = 0x6983; + + private byte[] apdu; + private byte[] data; + private int sw; + private int sw1; + private int sw2; + + public APDUResponse(byte[] apdu) { + if (apdu.length < 2) { + throw new IllegalArgumentException("APDU response must be at least 2 bytes"); + + } + this.apdu = apdu; + this.parse(); + } + + private void parse() { + int length = this.apdu.length; + + this.sw1 = this.apdu[length - 2] & 0xff; + this.sw2 = this.apdu[length - 1] & 0xff; + this.sw = (this.sw1 << 8) | this.sw2; + + this.data = new byte[length - 2]; + System.arraycopy(this.apdu, 0, this.data, 0, length - 2); + } + + public boolean isOK() { + return this.sw == SW_OK; + } + + public byte[] getData() { + return this.data; + } + + public int getSw() { + return this.sw; + } + + public int getSw1() { + return this.sw1; + } + + public int getSw2() { + return this.sw2; + } +} diff --git a/app/src/test/java/im/status/applet_installer_test/appletinstaller/APDUResponseTest.java b/app/src/test/java/im/status/applet_installer_test/appletinstaller/APDUResponseTest.java new file mode 100644 index 0000000..d5b0bf2 --- /dev/null +++ b/app/src/test/java/im/status/applet_installer_test/appletinstaller/APDUResponseTest.java @@ -0,0 +1,23 @@ +package im.status.applet_installer_test.appletinstaller; + +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.*; + +public class APDUResponseTest { + @Test + public void parsing() { + byte[] apdu = HexUtils.hexStringToByteArray("000002650183039536622002003b5e508f751c0af3016e3fbc23d3a69000"); + APDUResponse resp = new APDUResponse(apdu); + + assertEquals(0x9000, resp.getSw()); + assertEquals(0x90, resp.getSw1()); + assertEquals(0x00, resp.getSw2()); + + String expected = "000002650183039536622002003B5E508F751C0AF3016E3FBC23D3A6"; + assertEquals(expected, HexUtils.byteArrayToHexString(resp.getData())); + assertTrue(resp.isOK()); + } +} \ No newline at end of file