在javacard中选择applet时,是否可以返回一些数据以及状态字9000?

时间:2015-01-19 17:20:07

标签: applet smartcard javacard apdu

我想知道我是否可以在选择javacard applet后从javacard applet发回一些数据。

因为select()方法返回一个布尔值,我不知道如何从中返回数据字节。

任何人都可以帮我这个吗?当我将select命令发送到卡时,我希望applet返回一个简单的字节数组以及状态字9000(默认为成功)。

即,当我发送以下命令时

  

00A4040006010203040506

我想要一个像

这样的回复
  

010203049000

(前四个字节是从applet返回的数据) TIA。 提前谢谢..

3 个答案:

答案 0 :(得分:3)

我猜你做了好的练习" "如果选择Applet()然后返回"在进程中?您需要处理传入的APDU而不是简单的返回。

您可以返回数据以选择正常方式,但如果选择成功,请小心返回0x9000。

答案 1 :(得分:0)

是的,可以在applet选择期间返回数据。

在applet选择期间,平台通常会调用select()方法。您可以在此方法中执行一些逻辑,如果您希望选择小程序,则返回true,否则返回false。调用此方法后,如果成功选择了applet,则平台将调用APDU.process方法,您可以像applet中的任何其他APDU命令一样处理Select命令。

但是,如果需要响应数据,则命令APDU应指示Le字段。您可以将命令APDU更改为00 A4 04 00 06 01 02 03 04 05 06 00以返回所有可用的响应数据。

至于返回9000,只需确保退出APDU.process方法而不抛出异常,否则您可以抛出ISOException 9000值。我更喜欢前者。

答案 2 :(得分:0)

查看下面的代码

if (selectingApplet())
    {
        byte[] apduBuffer = apdu.getBuffer();
        
        apduBuffer[0] = 0x01;
        apduBuffer[1] = 0x02;
        apduBuffer[2] = 0x03;
        apduBuffer[3] = 0x04;
        
        apdu.setOutgoingAndSend((short)0, (short)4);
        return;
    }

上传安装小程序后,尝试选择小程序,AID为112233445566

>> /send 00A4040006112233445566
>> 00 A4 04 00 06 11 22 33 44 55 66
<< 01 02 03 04 90 00

选择小程序时返回数据的另一种方式

private static final byte[] STACK_OVERFLOW = {'S','T','A','C','K',' ','O','V','E','R','F','L','O','W'};

if (selectingApplet())
    {
        byte[] apduBuffer = apdu.getBuffer();
        //copy array STACK_OVERFLOW to apduBuffer
        Util.arrayCopyNonAtomic(STACK_OVERFLOW,(short)0,apduBuffer,(short)0,(short)STACK_OVERFLOW.length);
        //set and set buffer with STACK_OVERFLOW array length
        apdu.setOutgoingAndSend((short)0, (short)STACK_OVERFLOW.length);
        return;
    }