JAVACARD减少应用开发风险的建议

Posted 共鸣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVACARD减少应用开发风险的建议相关的知识,希望对你有一定的参考价值。

参考Java Card & STK Applet Development Guidelines by gemalto文档。

  由于EEPROM和闪存的寿命有限,应用频繁的读写同一位置可能导致运行故障。本文主要描述了如何设计程序,尽量最小读写内存的必要。如果不遵守本文的建议的话,实际运行过程中可能会导致严重的问题,javacard可能会导致意想不到的行为。

  1.检查所有的变量的存储位置,如果NVM存在压力风险,移动这些变量的位置。(保证100000的EEPROM和FLASH的擦写次数)。

   java和javacard内存模型是不同的:javacard中,对象的位置存储在NVM。包括:所有基本数据类型(byte,short)的全局变量;使用new创建出来对象。

    存储在RAM的内存部分包括:局部变量、方法的参数。通过专用Javacard.framework.APIs显式创建的瞬态对象,其引用存放于NVM,被引用的数组存放于RAM中。

    如下代码所示,i,j,k,counter,workingBuffer,transientBuffer,是全局变量,存储于NVM区域,reg是ToolkitRegistry类型的对象,也在NVM中。

    apdu是一个方法的参数,存储于RAM中。

public class exampleF1 extends Applet {
byte counter=0;
byte[] workingBuffer;
byte[] transientBuffer;
short i, j, k;
private ToolkitRegistry reg;

void process(APDU apdu){
short i, j, k;//located RAM  
byte[] reference;//located RAM
…
}

public exampleF1 () {
transientBuffer =                //transientBuffer是一个全局变量,存储于NVM。其引用的数组存放于RAM中
JCSystem.makeTransientByteArray((short)10
0, JCSystem.CLEAR_ON_RESET);
workingBuffer = new byte[12];//全局变量,located NVM
}

}

   2.在接收状态更新事件的时候,避免在NVM中的写操作。

    当有一个STATUS APDU命令进来的时候,一个相应的注册状态事件将会被处理。特别要注意的是,在应用程序处理过程中的NVM读写部分。

public class exampleF2 extends Applet
implements ToolkitInterface{
byte[] workingBuffer;
byte[] transientBuffer;
short s;
public exampleF2() {
transientBuffer =
JCSystem.makeTransientByteArray((short)20
0, JCSystem.CLEAR_ON_RESET);
workingBuffer = new byte[200];
}

void processToolkit(byte event){
short i;
switch (event) {
case EVENT_STATUS_COMMAND:
for (s=0; s<200; s++) {
workingBuffer[s]=(byte)s;//workingBuffer是全局数组,s也是全局变量,都存放于NVM中,注册事件可能导致频繁的读写NVM,一段时间后NVM寿命会很快耗尽。
}
default:
break;
}

void processToolkit(byte event){
short i;
switch (event) {
case EVENT_STATUS_COMMAND:
for (i=0; i<200; i++) {
transientBuffer[i]=(byte)i;//i和transientBuffer存在RAM中。
}
default:
break;
}

  3.1避免传递太多参数在函数中(最多4,5个);

  3.2避免在每个方法中声明太多的局部变量;

  3.3减少方法调用嵌套问题。

      一个javacard存储所有方法的参数和局部变量在RAM的专用区域中,叫做J-Stack。并且RAM资源是有限的。

  4.所有的对象创建,需要在初始化的过程完成。

   和java不同的是,javacard不需要使用垃圾回收器。因此,建议所有的对象创建的时候在应用初始化的时候完成(例如在install()和构造函数中完成初始化)。

  5. 插入一个MORE TIME主动命令,当你的toolkit处理过程大于2s的时候,这样可以防止在等待的过程中用户打断手机处理。

  6.注意FLAH是使用页面。

   SIM卡越来越多的使用FLASH技术,FLASH技术使用page为单位,一page包含64个字节、128个字节或者256个字节。因此每一次你更新一个字节的话,一整个page将会更新。所以,如果程序设计不好的话,flash的page将会更新很频繁,导致缩减寿命。

  6.1避免声明循环次数较多的变量在同一个位置;

  6.2循环文件会降低flsh的寿命。

以上是关于JAVACARD减少应用开发风险的建议的主要内容,如果未能解决你的问题,请参考以下文章

Javacard 中的 ECDSA 签名

如何与同一物理智能卡上的多个 javacard 应用程序交互(如 yubikey)

主机应用程序如何在 Netbeans 中的模拟智能卡上查询 javacard 小程序?

iOS代码片段CodeSnippets

PCSC Gemplus Javacard 中的 Smartcardio.Terminal 连接错误

vscode代码片段建议bug