1
votes

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?

2

2 Answers

5
votes

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.

1
votes

I think if class represent interindustry class then only INS will work as defined in standard,Here CLA - 00 represent interindusty command therefore, card response behvaiour was like same behaviour as Manage channel command because you used INS = 70.

 6.16.4 Response message (nominal case)

Table 73 - MANAGE CHANNEL response APDU
Data field  Logical channel number if P1-P2='0000'
Empty if P1-P2!='0000'
SW1-SW2     Status bytes 

actually your card was returning logical channel no -01 to you. ManageChannel

it seems to me that if class is propriatry. here INS will not treated as defined INS in standard. Hope CLA 80 with same INS 0x70 will give you require result.

hope it helps.

[Bit 8 set to 1 indicates the proprietary class]