为什么我的小程序的处理方法不能抛出异常?
Why I can't throw an exception in the process method of my applet?
下面是一个程序,它在 SELECT APDU 命令后接收任何命令时抛出异常:
public class MyApp extends Applet {
private MyApp() {
}
public static void install(byte bArray[], short bOffset, byte bLength)
throws ISOException {
new MyApp().register();
}
public void process(APDU arg0) throws ISOException {
if (selectingApplet()){
return;
}
ISOException.throwIt((short) 0x0002);
}
}
问题是:为什么任何 APDU 命令(SELECT APDU 命令除外)传输失败?
OSC: opensc-tool -s 00a404000b0102030405060708090002 -s 0000000
Using reader with a card: ACS CCID USB Reader 0
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 02
Received (SW1=0x90, SW2=0x00)
Sending: 00 00 00 00
APDU transmit failed: Transmit failed
是否限制在process方法体中使用异常?
否,但您的问题可能与使用的状态字有关。您应该遵守 ISO 7816-4 定义的状态字。在 6xxx 范围内尝试一些。您可能对 T=0 和 T=1 有不同的反应。
异常状态字必须符合7816 specification.Such as ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
也许你的程序需要这样写:
public无效进程(APDU apdu)
{
if (selectingApplet())
{
return;
}
byte[] buf = apdu.getBuffer();
switch (buf[ISO7816.OFFSET_INS])
{
case (byte)0x00:
//......
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
下面是一个程序,它在 SELECT APDU 命令后接收任何命令时抛出异常:
public class MyApp extends Applet {
private MyApp() {
}
public static void install(byte bArray[], short bOffset, byte bLength)
throws ISOException {
new MyApp().register();
}
public void process(APDU arg0) throws ISOException {
if (selectingApplet()){
return;
}
ISOException.throwIt((short) 0x0002);
}
}
问题是:为什么任何 APDU 命令(SELECT APDU 命令除外)传输失败?
OSC: opensc-tool -s 00a404000b0102030405060708090002 -s 0000000
Using reader with a card: ACS CCID USB Reader 0
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 02
Received (SW1=0x90, SW2=0x00)
Sending: 00 00 00 00
APDU transmit failed: Transmit failed
是否限制在process方法体中使用异常?
否,但您的问题可能与使用的状态字有关。您应该遵守 ISO 7816-4 定义的状态字。在 6xxx 范围内尝试一些。您可能对 T=0 和 T=1 有不同的反应。
异常状态字必须符合7816 specification.Such as ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
也许你的程序需要这样写:
public无效进程(APDU apdu) {
if (selectingApplet())
{
return;
}
byte[] buf = apdu.getBuffer();
switch (buf[ISO7816.OFFSET_INS])
{
case (byte)0x00:
//......
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}