从SmartCard发送/接收数据

时间:2013-01-22 10:03:31

标签: netbeans smartcard javacard

我最近买了一些随附一些卡的智能卡读卡器(Gemplus USB智能卡读卡器)。我一直在阅读有关如何使用它们的几个教程,但我有几个问题。我正在尝试与智能卡通信(发送APDU),但没有成功。我将一个小程序安装到虚拟智能卡中(使用Netbeans)。

我的处理方法是这样的:

    byte[] buffer = apdu.getBuffer();
    byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA] & 0xFF);
    byte INS = (byte) (buffer[ISO7816.OFFSET_INS] & 0xFF);

    if (CLA != HW_CLA){
        ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
    }        
    switch (INS) {
        case HW_INS_ADD:               
            add(apdu);
            break;
        case HW_INS_SUBTRACT:                
            subtract(apdu);
            break;
        default:
            ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
    }

addsubtract方法将5个单位添加或减去声明的变量(余额)。我想在进行操作后将余额值保存到卡中。有谁知道我怎么能把这个价值写进卡片?如果可能的话,我怎么能在以前阅读呢?

感谢任何帮助。 谢谢。

3 个答案:

答案 0 :(得分:2)

答案很简单:只需在JavaCard applet类中添加字段即可。一旦“启动”Javacard applet“运行”,直到它们被卸载。

当然“运行”是错误的术语 - 它们保持其内部状态,如果接收到下一个APDU,则APDU之前的状态仍然存在,即使在接收到第一个卡后从智能卡读卡器中取出卡APDU。

答案 1 :(得分:2)

持久性(持久存储器意味着EEPROM或闪存)字段中的任何状态都将保留,直到删除Applet 实例。非瞬态数组元素中的状态也是如此。当然,您需要保留对数组的持久引用,以便实现此目的。一旦进行上下文切换,瞬态(瞬态意味着RAM)CLEAR_ON_DESELECT阵列的内容将被清除,例如,当选择另一个Applet(并取消当前的一个Applet)或发生软或硬复位时。当然CLEAR_ON_RESET阵列只会在复位时擦除(包括断电)。

基本上所有对象实例都存在于持久性内存中,这意味着使用new创建的任何对象实例。对于平台创建的任何对象,情况也是如此,其中API未明确指定结果是瞬态的。每次调用process方法时,都会清除APDU缓冲区本身

如果你想存储余额之类的东西,你需要了解Java Card事务机制,特别是如果你的操作不是原子的。

请注意,当包含模拟器的进程结束时,许多Java Card 模拟器 不会保留任何状态。这不是真正的Java Card实现行为的良好表现。

答案 2 :(得分:0)

其实你正在保存这些值:) 声明为瞬态或局部变量的值不存储在EEPROM中,否则所有值都存储在EEPROM中并且是非易失性的。删除后插入卡时,可以访问它们。

但是从你发布的代码中我不能说你正在使用什么类型的变量。如果您想要一个精确的答案,只需发布​​完整的代码,我们将准确回答您。