Java 卡对 INS = 0x70 的 APDU 有奇怪的响应
Java Card have a weird response to APDU with INS = 0x70
下面,您会看到一个简单的小程序,它 returns 0x6781
使用 INS=0x70
或 INS=0x71
:
传入 APDU 命令
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);
}
}
}
问题是,我通过 INS=0x70
:
收到 APDU 命令的 0x6C01
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
我通过接触式和非接触式接口尝试了两种不同的 Java 卡(一种是 NXP JCOP v2.4.2 r3,另一种是 KONA java 卡)并使用内部生成的两个不同的 cap 文件两台不同的笔记本电脑通过两个不同的 IDE!!!(我有多可疑?:D)但是响应是相同的。
我向 PCSC 或卡片管理员怀疑这个奇怪的响应。因为在模拟器中,即使 process
方法也不会调用这个特殊的 INS 值。
怎么了?
INS = 70
和CLA = 00
是按照ISO-7816规范的MANAGE CHANNEL命令,还有INS = A4
表示SELECT.
如果您想使用这些 INS 代码,您必须使用 CLA >= 0x80
以指定它是您的专有命令。
我认为如果 class 代表行业间 class 那么只有 INS 将按照标准中定义的方式工作,这里 CLA - 00 代表行业间命令因此,卡响应行为与管理通道命令的行为相同因为你使用了 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
实际上您的卡正在向您返回逻辑通道号 -01。 ManageChannel
在我看来,如果 class 是专有的。这里的 INS 将不被视为标准中定义的 INS。希望具有相同 INS 0x70 的 CLA 80 会给你需要的结果。
希望对您有所帮助。
[Bit 8 set to 1 indicates the proprietary class]
下面,您会看到一个简单的小程序,它 returns 0x6781
使用 INS=0x70
或 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);
}
}
}
问题是,我通过 INS=0x70
:
0x6C01
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
我通过接触式和非接触式接口尝试了两种不同的 Java 卡(一种是 NXP JCOP v2.4.2 r3,另一种是 KONA java 卡)并使用内部生成的两个不同的 cap 文件两台不同的笔记本电脑通过两个不同的 IDE!!!(我有多可疑?:D)但是响应是相同的。
我向 PCSC 或卡片管理员怀疑这个奇怪的响应。因为在模拟器中,即使 process
方法也不会调用这个特殊的 INS 值。
怎么了?
INS = 70
和CLA = 00
是按照ISO-7816规范的MANAGE CHANNEL命令,还有INS = A4
表示SELECT.
如果您想使用这些 INS 代码,您必须使用 CLA >= 0x80
以指定它是您的专有命令。
我认为如果 class 代表行业间 class 那么只有 INS 将按照标准中定义的方式工作,这里 CLA - 00 代表行业间命令因此,卡响应行为与管理通道命令的行为相同因为你使用了 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
实际上您的卡正在向您返回逻辑通道号 -01。 ManageChannel
在我看来,如果 class 是专有的。这里的 INS 将不被视为标准中定义的 INS。希望具有相同 INS 0x70 的 CLA 80 会给你需要的结果。
希望对您有所帮助。
[Bit 8 set to 1 indicates the proprietary class]