首页> 中国专利> 一种在CAP文件中替换函数的方法、装置及系统

一种在CAP文件中替换函数的方法、装置及系统

摘要

本发明公开了一种在CAP文件中替换函数的方法、装置及系统,以对JavaCard设备CAP文件的函数进行替换。该方法为:接收第一APDU命令,在本地CAP文件中确定需更改的第一函数,以及该函数归属的类,并确定该类中定义的用于放置新函数的存储位置,根据第一APDU命令生成用于替换第一函数的第二函数,将第二函数存入所述存储位置,并接收第二APDU命令,根据该命令从所述存储位置读取第二函数,对CAP文件中的第一函数进行替换。这样,将第二函数保存为方法数组,再替换第一函数,不需预留存储空间即可替换CAP文件中的函数,提高了效率,节约了成本。本发明同时公开了一种在CAP文件中替换函数的装置及系统。

著录项

  • 公开/公告号CN101976211A

    专利类型发明专利

  • 公开/公告日2011-02-16

    原文格式PDF

  • 申请/专利权人 北京握奇数据系统有限公司;

    申请/专利号CN201010292309.4

  • 发明设计人 周伟楠;

    申请日2010-09-26

  • 分类号G06F11/00(20060101);

  • 代理机构11291 北京同达信恒知识产权代理有限公司;

  • 代理人黄志华

  • 地址 100015 北京市朝阳区东直门外西八间房万红西街2号燕东商务花园

  • 入库时间 2023-12-18 01:43:44

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-09-23

    未缴年费专利权终止 IPC(主分类):G06F11/00 专利号:ZL2010102923094 申请日:20100926 授权公告日:20130313

    专利权的终止

  • 2018-01-26

    专利权人的姓名或者名称、地址的变更 IPC(主分类):G06F11/00 变更前: 变更后: 申请日:20100926

    专利权人的姓名或者名称、地址的变更

  • 2013-03-13

    授权

    授权

  • 2011-03-30

    实质审查的生效 IPC(主分类):G06F11/00 申请日:20100926

    实质审查的生效

  • 2011-02-16

    公开

    公开

说明书

技术领域

本发明涉及智能卡领域,尤其涉及Java Card应用中一种在CAP文件中替换函数的方法、装置及系统。

背景技术

智能卡的存储器体系主要是由读写存储器(RAM)、只读存储器(ROM)以及可擦写编程存储器(EEPROM)组成,智能卡所有的程序内容都保存在非易失性的存储器中。Java Card是可以运行Java程序代码的智能卡。

考虑智能卡的存储空间有限,不能直接存储Java源代码或class类文件,在将Java Card类导入一个Java Card设备之前,需要通过转换装置将类文件转换为标准的转化小应用程序(Converted Applet,CAP)文件,该CAP文件包含了Java程序包中的所有类文件。在Java编程语言中,方法是实现功能的最小单位,为了叙述方便,这里统一将方法称为函数。对于Java源代码中的每个函数,转换为CAP文件后,都是由方法头和多个操作码组成,其中,每个操作码用一个字节表示,能够实现特定的功能。

现有技术中,在将CAP文件导入Java Card设备后,对于存储在ROM中的CAP文件,如果CAP文件中的某个Java函数出现错误,或者是需要修改某个函数以实现新的功能时,不能直接改写CAP文件的操作码,可能需要更换新的Java Card设备。同样,对于存储在EEPROM中的CAP文件,理论上可以改写操作码,但是实际应用中,由于CAP文件在下载到Java Card设备上时,每个函数占用的存储空间已经确定,可能使得存放新函数操作码的存储空间不足,再者,在下载CAP文件时,可能已经经过链接并包含用户数据,CAP文件内容各组件之间的关系已经确定,如果直接改写该CAP文件中的函数,可能会引起错误。

综上所述,需要寻求一种替换已下载到Java Card设备上的函数的方法,以克服不能改写Java Card设备存储的CAP文件中的函数,或者改写时容易出现错误的缺陷。

发明内容

本发明提供一种在CAP文件中替换函数的方法、装置及系统,用以在不影响CAP文件其它功能以及用户数据的情况下,对存储在Java Card设备上的CAP文件中的函数进行替换。

本发明实施例提供的具体技术方案如下:

一种在CAP文件中替换函数的方法,包括:

接收卡片接受设备发送的第一应用程序协议数据单元(APDU)命令;

在本地预存的CAP文件中确定需更改的第一函数,并确定该第一函数归属的类;

确定所述类中定义的用于放置新生成函数的存储位置,并根据所述第一APDU命令生成相应的用于替换第一函数的第二函数,以及将第二函数存入所述存储位置;

接收卡片接受设备发送的第二APDU命令,根据该第二APDU命令,从所述存储位置读取第二函数,对所述CAP文件中的第一函数进行替换。

一种在CAP文件中替换函数的装置,包括:

第一处理单元,用于接收卡片接受设备发送的第一应用程序协议数据单元(APDU)命令;

第二处理单元,用于在本地预存的CAP文件中确定需更改的第一函数,并确定该第一函数归属的类;

第三处理单元,用于确定所述类中定义的用于放置新生成函数的存储位置,并根据所述第一APDU命令生成相应的用于替换第一函数的第二函数,以及将第二函数存入所述存储位置;

第四处理单元,用于接收卡片接受设备发送的第二APDU命令,根据该第二APDU命令,从所述存储位置读取第二函数,对所述CAP文件中的第一函数进行替换。

一种在CAP文件中替换函数的系统,包括:

卡片接受设备,用于向Java Card设备发送第一APDU命令以及第二APDU命令;

Java Card设备,用于接收卡片接受设备发送的第一应用程序协议数据单元(APDU)命令,在本地预存的CAP文件中确定需更改的第一函数,确定该第一函数归属的类,以及确定所述类中定义的用于放置新生成函数的存储位置,根据所述第一APDU命令生成相应的用于替换第一函数的第二函数,以及将第二函数存入所述存储位置,并接收卡片接受设备发送的第二APDU命令,根据该第二APDU命令,从所述存储位置读取第二函数,对所述CAP文件中的第一函数进行替换。

基于上述技术方案,本发明实施例中,通过在源程序中添加方法数组生成函数,将新函数(第二函数)对应的数据文件保存到方法数组中,再采用该方法数组替换CAP文件中存在的第一函数,对第二函数的保存是通过创建方法数组来实现的,不需要预留存储空间,只需在源程序中对预期会改变的函数添加方法数组生成函数,即可根据APDU命令替换CAP文件中的函数,达到修正错误或实现新功能的目的,同时,对CAP文件中的其他功能和数据不会造成影响,可以方便快捷地对CAP文件中的函数进行替换,提高了效率,节约了成本。

附图说明

图1为本发明实施例中在CAP文件中替换函数的系统架构图;

图2为本发明实施例中在CAP文件中替换函数的装置结构图;

图3为本发明实施例中在CAP文件中替换函数的详细流程图。

具体实施方式

为了克服Java Card存储方式导致的无法修改CAP文件中的函数这一技术缺陷,本发明实施例提供了一种在CAP文件中替换函数的方法,能够在不影响Java Card已有的功能和数据的情况下,对Java Card上存储的CAP文件中的函数进行替换,提高效率,节约成本。该方法为:接收卡片接受设备发送的第一应用程序协议数据单元(APDU)命令,在本地预存的CAP文件中确定需更改的第一函数,并确定该第一函数归属的类,确定上述类中定义的用于放置新生成函数的存储位置,并根据上述第一APDU命令生成相应的用于替换第一函数的第二函数,以及将第二函数存入上述存储位置,并接收卡片接受设备发送的第二APDU命令,根据该第二APDU命令,从上述存储位置读取第二函数,对上述CAP文件中的第一函数进行替换。

下面结合附图对本发明优选的实施方式进行详细说明。

参阅附图1所示,本发明实施例中,在CAP文件中替换函数的系统主要包括卡片接受设备10和Java Card设备11,其中,

卡片接受设备10,用于向Java Card设备11发送第一APDU命令以及第二APDU命令;

Java Card设备11,用于接收卡片接受设备10发送的第一应用程序协议数据单元(APDU)命令,在本地预存的CAP文件中确定需更改的第一函数,并确定该第一函数归属的类,确定该类中定义的用于放置新生成函数的存储位置,并根据上述第一APDU命令生成相应的用于替换第一函数的第二函数,以及将第二函数存入上述存储位置,并接收卡片接受设备发送的第二APDU命令,根据该第二APDU命令,从上述存储位置读取第二函数,对上述CAP文件中的第一函数进行替换。

参阅附图2所示,本发明实施例中,Java Card设备11主要包括以下处理单元:

第一处理单元111,用于接收卡片接受设备发送的第一应用程序协议数据单元(APDU)命令;

第二处理单元112,用于在本地预存的CAP文件中确定需更改的第一函数,并确定该第一函数归属的类;

第三处理单元113,用于确定所述类中定义的用于放置新生成函数的存储位置,并根据所述第一APDU命令生成相应的用于替换第一函数的第二函数,以及将第二函数存入所述存储位置;

第四处理单元114,用于接收卡片接受设备发送的第二APDU命令,根据该第二APDU命令,从所述存储位置读取第二函数,对所述CAP文件中的第一函数进行替换。

为了实现上述技术方案,本发明实施例中,首先需要在操作系统中新增本地应用程序编程接口,该本地应用程序编程接口用于实现新函数调用。

本地应用程序编程接口(native Application Program Interface,native API)是指采用非Java语言实现的本地函数,native API能够代替部分Java源代码,以达到提高效率或实现特殊功能的目的。这些nativeAPI可以通过CAP文件中自定义的特殊标记来区分,并在运行调用相应的native API。

例如,CAP文件方法头中的第一个字节是0X20,表示该方法头对应的函数属于native API。

在Java Card操作系统中新增的native API能够被所有的Java源程序调用。

本发明实施例中,新增的native API的参数至少包括一个byte数据类型的数组的引用。在Java Card操作系统中新增的native API的参考格式如下所示,public static void callMethod(byte[]bArray,short offset),该native API(函数callMethod)实现的功能为从输入参数byte数据类型数组bArray中,由short数据类型的参数offset所确定的偏移位置开始,进行Java函数的调用。

其次,需要在源程序中定义方法数组生成函数,该方法数组生成函数用于生成方法数组。

该方法数组用于保存第二函数转换为CAP文件后对应的方法头和操作码,该第二函数用于替换Java Card设备上存储的CAP文件中的第一函数。

在需要下载到Java Card设备的Java源程序中,增加方法数组生成函数,该方法数组生成函数的功能为根据输入数据生成方法数组,将该方法数组作为上述新增native API的输入,执行native API调用。

本发明实施例中,方法数组生成函数的参数至少包括:一个目的byte数据类型数组的引用,一个源byte数据类型数组的应用,源byte数据类型数组内数据的起始地址,以及从源byte数据类型数组的起始地址开始的数据长度。

在Java源程序中增加方法数组生成函数的参考格式如下所示,public void saveMethod(byte[]destArray,byte[]srcArray,short offset,short length),该方法数组生成函数实现的功能为将输入参数的源数组srcArray中,以offset字节的偏移量所确定的位置作为起始位置,截取length字节长度的数据,生成新的byte数据类型的方法数组。也就是,将源数组中指定的数据起始地址开始的指定长度的数据复制到上述方法数组中,并使得destArray指向该方法数组的存储位置。

在Java Card应用中,应用程序协议数据单元(Application Protocol Data Unit,APDU)命令用于卡片接受设备10和Java Card设备11之间进行通信。Java Card接收任何卡片接受设备10发送的APDU命令,并传送到相应的应用程序中,应用程序处理APDU命令并返回响应APDU,APDU遵守ISO/IEC7816-3和7816-4。APDU命令包括命令头(Header)和命令体(Body),其中,命令头由五个字节组成,第1个字节(CLA字节)用于识别指令的一个特定应用程序类,第2个字节(INS字节)用于指示CLA字节中标示的某个指令类中的一个特定指令,该特定指令用于完成特定的功能,第5个字节用于存放APDU命令体的总长度,第3、4字节可以由用户根据需要自行定义,本发明实施例中,第3、4字节可用于表示命令体中存放数据文件的位置和长度,APDU命令体部分用于存放数据文件(如,某函数对应数据文件)。

本发明实施例中,需要找到Java Card设备上的CAP文件在被下载到JavaCard设备之前,保存在Java Card设备之外(如,计算机上)的Java源文件,在该Java源文件中,直接删除原来的第一函数,并且在原来第一函数的位置加入第二函数,再将重新编辑后的Java源文件转换为新的CAP文件,从该新的CAP文件中截取出第二函数对应的数据文件,并将该第二函数对应的数据文件发送给卡片接受设备10,以将第二函数的数据文件保存在APDU命令体中,上述第二函数的数据文件包括方法头和操作码。在APDU命令头中存放用于指示命令体中包含的第二函数数据文件的存放位置以及长度的指示信息,在SaveMethod函数中,将APDU命令作为源数组传入函数中,并从APDU命令头中提取用于指示第二函数的数据文件在命令体中的存放位置信息以及长度信息的指示信息,以获得saveMethod输入参数中的offset和length。

例如,APDU命令为0x00 0x30 0x00 0x00 0x06 0x01 0x00 0x05 0x81 0x000x01,其中0x00 0x30 0x00 0x00 0x06前5个字节的内容为命令头,0x01 0x000x05 0x81 0x00 0x01为命令体,根据命令头中前两个字节可知该APDU命令需要对Java Card设备上的第一函数进行更新,对第一函数进行更新的第二函数对应的方法头和操作码保存在命令体中,根据命令头中后3个字节,可以确定第二函数对应的方法头和操作码为0x01 0x00 0x05 0x81 0x00 0x01。

基于上述原理,参阅附图3所示,本发明实施例中,实现在CAP文件中替换函数的详细流程如下:

步骤301:接收卡片接受设备10发送的第一应用程序协议数据单元(APDU)命令。

其中,第一APDU命令用于调用方法数组生成函数,同时,该第一APDU命令中包含新函数的数据文件,以及用于指示该数据文件位置信息和长度信息的指示信息。上述数据文件由方法头和操作码组成。

步骤302:在本地预存的CAP文件中确定需更改的第一函数,并确定该第一函数归属的类。

步骤303:确定上述类中定义的用于放置新生成函数的存储位置,并根据上述第一APDU命令生成相应的用于替换第一函数的第二函数,以及将第二函数存入上述存储位置。

根据上述第一APDU命令生成相应的用于替换第一函数的第二函数,具体为:根据第一APDU命令中特定的指令,调用方法数组生成函数;根据第一APDU命令中预定义的指令,从该第一APDU命令中获取上述第二函数对应的数据文件,以及该第二函数对应的数据文件的长度信息;在上述方法数组生成函数中,根据上述第二函数对应的数据文件的长度创建方法数组;将上述第二函数对应的数据文件保存至上述方法数组。

其中,第一APDU命令中特定的指令是指该第一APDU命令的命令头中INS字节所指示的特定指令,该特定指令用于完成特定的功能,在源程序执行过程中,通过第一APDU命令的命令头中的特定指令(如,0X30)的指示,来执行方法数组生成函数,以将第二函数保存为方法数组。

其中,第一APDU命令中预定义的指令是指在该第一APDU命令的命令头中(第3、4字节)预定义的用于指示第一APDU命令中包含的数据文件的位置信息和长度信息的指令。

本发明实施例中,在第一函数归属的类中定义引用类型的实例域,该引用类型的实例域用于指示方法数组的存储位置,即用于指示第二函数的存储位置,在方法数组生成函数生成与第二函数对应的方法数组后,将第二函数对应的方法数组的引用保存至上述引用类型的实例域。

例如,在需要更改的第一函数所属的类中,定义byte数据类型的数组的引用destArray,在savaMethod函数中,将生成的方法数组的引用保存至byte数据类型的数组的引用destArray中,通过destArray输出第二函数对应方法数组。

步骤304:接收卡片接受设备10发送的第二APDU命令,根据该第二APDU命令,从上述存储位置读取第二函数,对上述CAP文件中的第一函数进行替换。

具体为:根据第二APDU命令中特定的指令,判断上述存储位置保存的数据是否为空,若是,执行第一函数;否则,通过本地应用程序编程接口(native API)调用第二函数对第一函数进行替换。上述native API即为在操作系统中定义的callMethod函数。其中,通过native API调用第二函数对应的方法数组,并执行所述方法数组,对第一函数进行替换。

其中,根据第二APDU命令中特定的指令,判断上述存储位置保存的数据为空,表示在上述存储位置中没有保存第二函数对应的方法数组,即没有调用方法数组生成函数,也就是并不需要对本地CAP文件中的第一函数进行替换,直接根据第二APDU命令执行第一函数即可。而根据第二APDU命令中特定的指令,判断上述存储位置保存的数据非空,表示已存在第二函数相对应的方法数组,该方法数组保存有第二函数的数据文件,执行native API调用该第二函数对应的方法数组,通过执行native API来实现执行第二函数,从而取代第一函数,达到对第一函数进行替换的目的。

下面以两个具体的程序为例,对本发明实施例中在CAP文件中替换函数的方法进行进一步的说明。

例1,未采用本发明实施例对Java Card设备上的函数进行替换时的情况:

private byte a;

public void process(APDU apdu)

{

    byte buffer[]=apdu.getBuffer();

    short bytesRead=apdu.setIncomingAndReceive();

    if(buffer[ISO7816.OFFSET_INS]==0x20)

    {

        method1();

    }

}

public void method 1()

{

byte a=(byte)1;

}

例1为Java Card中在process中调用method1函数,在method1中有一个byte类型的实例域a,如果APDU命令中携带的预定义的指令为0x20,执行函数method1,将a的值置为1。如果例1所示的程序已经下载到Java Card设备上,在后续的测试过程中出现问题或者需要对函数功能进行修改,如将method1修改为,

public void method1()

{

    byte a=(byte)2;

}

如果例1是掩膜在ROM中则无法对method1进行修改。

例2,采用本发明实施例对Java Card设备上的函数进行替换的实现程序如下:

private byte a;

public byte[]method1_patch;

public void process(APDU apdu)

{

   byte buffer[]=apdu.getBuffer();

   short bytesRead=apdu.setIncomingAndReceive();

   if(buffer[ISO7816.OFFSET_INS]==0x20)

   {

           if(method1_patch==null)

           {

                 method1();

            }

                else

                {

                      nativeAPI.callMethod(method1_patch,(short)0);

                 }

         }

         else if(buffer[ISO7816.OFFSET_INS]==0x30)

         {

          saveMethod(method1_patch,buffer,buffer[ISO7816.OFFSET_CDATA],

    buffer[ISO7816.OFFSET_LC]);

         }

    }

    public void saveMethod(byte[]destArray,byte[]srcArray,short offset,short

length)

    {

        destArray=new byte[length];

        Util.arrayCopy(srcArray,offset,length,destArray,(short)0);

    }

例2的process中加入了本发明实施例中对Java Card设备上的函数进行替换的方法,在process中增加了方法数组的引用method1_patch,方法数组用于保存第二函数对应的方法头和操作码。根据APDU命令头中预定义的指令执行相应的操作,如果APDU命令头中预定义的指令为0x20,则需要执行具有特定功能的函数,这时,需要判断是否存在第二函数用以替换Java Card上具有特定功能的第一函数,这里通过判断引用method1_patch是否为空值,来判断是否存在对第一函数进行替换的第二函数,如果是空值,表示不存在第二函数对应的方法数组,也就是不需要对第一函数进行替换,直接执行第一函数即可,否则,引用method1_patch不是空值,表示存在method1_patch引用的方法数组,就是存在用以更新第一函数的第二函数,这时需要通过定义的native API执行第二函数对应的方法数组,实现将第一函数更新为第二函数。如果APDU命令头中预定义的指令为0x30,则需要对Java Card上保存的第一函数进行更新,这时调用savaMethod函数,将APDU命令体中包含的第二函数的方法头和操作码保存为方法数组,并将该方法数组保存至引用method1_patch,在process再次判断APDU命令体中预定义的指令为0x20需要执行特定的功能函数时,通过nativeAPI执行第二函数对应的方法数组。

基于上述实施例,对存储在Java Card设备ROM或EEPROM上的CAP文件中的函数进行替换时,在源程序中添加方法数组生成函数,生成的方法数组用以保存第二函数对应的方法头和操作码,第二函数是用以替换Java Card设备上已经存在的第一函数的,在操作系统中定义native API,用以执行方法数组。这样,对第二函数的保存是通过创建数组来实现的,不需要预留空间,只要在源程序中对预期可能会改变的函数添加新函数的方法数组生成函数,以及与生成的方法数组相对应的引用,即可根据APDU中预定义的指令在CAP文件中进行函数替换,以达到修正错误或者实现新功能的目的,同时,对程序的其他功能和用户数据不会造成影响,并且通过方便快捷地对在Java Card设备上存储的CAP文件中的函数进行替换,提高了效率,节约了成本。

显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号