(Javacard) Class APDU 命令的错误测试 'Select File'
(Javacard) Class Error Test of APDU Command 'Select File'
有
我不明白为什么错误 'Class is Not Supported' 没有发生。
首先我的源码和APDU命令如下
<源代码>
package SelectFileTest;
import javacard.framework.*;
public class SelectFileTest extends Applet{
public static void install(byte[] bArray, short bOffset, byte bLength) {
new SelectFileTest(bArray, bOffset, bLength);
}
private SelectFileTest(byte bArray[], short bOffset, byte bLength){
register();
}
public void process(APDU apdu){
byte buf[] = apdu.getBuffer();
if (buf[1]==(byte)0xA4) {
if((buf[0]&0xff)!=0x00) // Class Check (Question)
ISOException.throwIt((short)0xfff5);
if(selectingApplet())
{ }
else
ISOException.throwIt((short)0xffff); // 6881
}
return ;
}
}
[Card-1C] <== 00 A4 04 00 07 A0000000031234
[Card-1R] ==> 9000
[Card-2C] <== 00 A4 00 00 02 F801
[Card-2R] ==> FFFF // Expected
[Card-3C] <== 01 A4 00 00 02 F801
[Card-3R] ==> 6881 // (Question) Expect the SW 'FFF5'
[Card-4C] <== 08 A4 00 00 02 F801
[Card-4R] ==> FFF5 // Expected
通过命令 3 和 4,卡必须输出 SW 'FFF5',因为行'Class Checkin source code。但是,它在 CLA=01~07 时输出 6881(3R)(可能是 JCRE)。
我知道一旦选择了小程序,JCRE 就会将所有后续的 APDU 命令转发给所选小程序。因此,我认为 3rd response(3R) 也像 4R 一样 'FFF5'。我不明白,也找不到我的代码中的错误。
希望大家提出宝贵意见。提前致谢。
在CLA 字节中,逻辑信道在低位指示。您正在选择一个逻辑通道,平台然后尝试将其发送到正确的小程序。但是,除了基本通道(ID = 0)外,它不会找到任何开放通道。因此平台将处理错误而不是 Applet。这发生在之前 Applet 收到APDU;小程序将不会收到通知。
请注意,INS: MANAGE CHANNEL
也可能发生这种情况。我可能不必解释 AID 的 SELECT 最初也是由运行时环境处理的。
有关逻辑信道及其可能的使用方式的更多信息,请参见ISO/IEC 7816-4。
实际上,由于我在代码中设置的 class 字节,我曾经遇到过这个问题...因为我的 class 字节,我的命令被中止,并给出了我不期望的结果。 ..
在发送到卡之前,您需要解码class字节的含义。 ISO 7816 -3 和 -4 将有助于准确解码您的 class 字节...
希望对您有所帮助...
有
我不明白为什么错误 'Class is Not Supported' 没有发生。
首先我的源码和APDU命令如下
<源代码>
package SelectFileTest;
import javacard.framework.*;
public class SelectFileTest extends Applet{
public static void install(byte[] bArray, short bOffset, byte bLength) {
new SelectFileTest(bArray, bOffset, bLength);
}
private SelectFileTest(byte bArray[], short bOffset, byte bLength){
register();
}
public void process(APDU apdu){
byte buf[] = apdu.getBuffer();
if (buf[1]==(byte)0xA4) {
if((buf[0]&0xff)!=0x00) // Class Check (Question)
ISOException.throwIt((short)0xfff5);
if(selectingApplet())
{ }
else
ISOException.throwIt((short)0xffff); // 6881
}
return ;
}
}
[Card-1C] <== 00 A4 04 00 07 A0000000031234
[Card-1R] ==> 9000
[Card-2C] <== 00 A4 00 00 02 F801
[Card-2R] ==> FFFF // Expected
[Card-3C] <== 01 A4 00 00 02 F801
[Card-3R] ==> 6881 // (Question) Expect the SW 'FFF5'
[Card-4C] <== 08 A4 00 00 02 F801
[Card-4R] ==> FFF5 // Expected
通过命令 3 和 4,卡必须输出 SW 'FFF5',因为行'Class Checkin source code。但是,它在 CLA=01~07 时输出 6881(3R)(可能是 JCRE)。
我知道一旦选择了小程序,JCRE 就会将所有后续的 APDU 命令转发给所选小程序。因此,我认为 3rd response(3R) 也像 4R 一样 'FFF5'。我不明白,也找不到我的代码中的错误。
希望大家提出宝贵意见。提前致谢。
在CLA 字节中,逻辑信道在低位指示。您正在选择一个逻辑通道,平台然后尝试将其发送到正确的小程序。但是,除了基本通道(ID = 0)外,它不会找到任何开放通道。因此平台将处理错误而不是 Applet。这发生在之前 Applet 收到APDU;小程序将不会收到通知。
请注意,INS: MANAGE CHANNEL
也可能发生这种情况。我可能不必解释 AID 的 SELECT 最初也是由运行时环境处理的。
有关逻辑信道及其可能的使用方式的更多信息,请参见ISO/IEC 7816-4。
实际上,由于我在代码中设置的 class 字节,我曾经遇到过这个问题...因为我的 class 字节,我的命令被中止,并给出了我不期望的结果。 ..
在发送到卡之前,您需要解码class字节的含义。 ISO 7816 -3 和 -4 将有助于准确解码您的 class 字节...
希望对您有所帮助...