Search code examples
javacardsmartcard-readerpcscglobalplatform

Java Card have a weird response to APDU with INS = 0x70


Below, you see a simple applet that returns 0x6781 to incoming APDU commands with INS=0x70 or INS=0x71:

package testPack;
import javacard.framework.*;

public class TestApp extends Applet
{

    public static void install(byte[] bArray, short bOffset, byte bLength) 
    {
        new TestApp().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
    }

    public void process(APDU apdu)
    {
        if (selectingApplet())
        {
            return;
        }

        byte[] buf = apdu.getBuffer();
        switch (buf[ISO7816.OFFSET_INS])
        {
        case (byte)0x70:
            ISOException.throwIt((short)0x6781);
            break;
        case (byte)0x71:
            ISOException.throwIt((short)0x6781);
            break;
        default:
            ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
        }
    }
}

The problem is that, I receive 0x6C01 to the APDU command with INS=0x70:

Send: 00 A4 04 00 07 01 02 03 04 05 00 00 00
Recv: 90 00

Send: 00 70 00 00 00
Recv: 6C 01
Send: 00 70 00 00 01
Recv: 01 90 00

Send: 00 71 00 00 00
Recv: 67 81

I tried two different Java Cards (One is NXP JCOP v2.4.2 r3 and another is a KONA java card) through both contact and contactless interfaces and using two different cap file generated inside two different laptops via two different IDE!!!( How Suspicious am I? :D ) But the response is equal.

I suspect to the PCSC or Card Manager for this weird response. Because in the simulator, even the process method doesn't called for this special INS value.

What's wrong with it?


Solution

  • INS = 70with CLA = 00 is the MANAGE CHANNEL command according to the ISO-7816 specification, as well as INS = A4 means SELECT.

    If you want to use these INS codes, you must use CLA >= 0x80 in order to specify that it is your proprietary command.