如果命令数据超过3个字节,如何获取?

时间:2018-04-10 14:56:48

标签: java javacard apdu

如果buffer[ISO7816.OFFSET_LC]>=3,我想知道如何通过APDU命令发送数据。

其实我正在使用

if (numBytes == 1) {
    shortAmount = (short) buffer[ISO7816.OFFSET_CDATA];
} else if (numBytes == 2) {
    shortAmount = (short) Util.getShort(buffer, ISO7816.OFFSET_CDATA);
} else if(numBytes == 3) {
    //how to get the all data contained in the APDU?
}

3 个答案:

答案 0 :(得分:4)

对于大多数Java Card实现,不支持int基类型。这意味着您不能在一个变量中存储超过16位。

然而,您可以将其存储在数组中。并且 - 当你想到它 - 它已经是。 APDU缓冲区只不过是瞬态存储器中的字节数组(通常是RAM)* 1.

因此,如何处理APDU缓冲区中的APDU数据取决于您:

  • 你可以解析APDU缓冲区内的结构;
  • 您可以将其复制到另一个阵列,持久性(使用new byte[size]的EEPROM / Flash)或瞬态内存(RAM,通过JCSystem.makeTransientByteArray()
  • 您可以使用Util.getShort()将其转换为短片,并将结果存储在类似于字节数组的short数组中;
  • 您可以将其用作允许来自字节数组的任何API的输入,例如Key#setValue命令之一,OwnerPIN#check(),签名验证等等。

或者您可以执行上述任意组合。

如果要使用较大的值执行计算,则必须实现这些计算或访问特殊库。对于32位整数计算,请查看at my X-mas special answer。这也表明,即使您必须自己实现,也可以对数据进行任何类型的计算。 Java Card是图灵完备的,所以只要你没有耗尽CPU时间或内存,就可以对其进行任何可能的计算。

* 1好的,APDU缓冲区是Java Card系统处理它的一种相当特殊的数组,但在处理数据时它只是一个普通的Java Card字节数组。

答案 1 :(得分:1)

将数据存储到字节数组中。

关键是,如果数据大小为> = 3,则需要将数据处理为字节数组。但是,对于处理,您可以开发自己的API,也可以使用可用的API。

答案 2 :(得分:0)

如果要将通过APDU发送的数据解释为整数(== 4个字节),则需要将数据存储到字节数组中。现在,根据用例,您可以使用“Maarten Bodewes”提供的JCInteger类来进一步处理数据。

关键是,如果数据大小为> = 3,则需要将数据处理为字节数组。但是,对于处理,您可以开发自己的API,也可以使用可用的API。