Java Card CAP 文件组件分析 00

来源:互联网 发布:如何导入sql数据库 编辑:程序博客网 时间:2024/06/06 12:40

JAVA 智能的可执行文件(CAP 文件)是编译多个应用程序(Applet)的生成结果,包含了一个包中定义的所有类和接口,与包之间是一一对应的关系。实际发卡操作时,首先需要将该可执行文件下载至卡片中,并安装需要的应用实例;用户使用该安装的应用实例执行操作功能。

CAP文件包含12个组件:

Component Type

Value

COMPONENT_Header

1

COMPONENT_Directory

2

COMPONENT_Applet

3

COMPONENT_Import

4

COMPONENT_ConstantPool

5

COMPONENT_Class

6

COMPONENT_Method

7

COMPONENT_StaticField

8

COMPONENT_ReferenceLocation

9

COMPONENT_Export

10

COMPONENT_Descriptor

11

COMPONENT_Debug

12


一个完整的CAP文件,除Applet、Export 和Debug组件是可选外,其他均为必选。每个组件封装成一个CAP包,包含在Jar包中。最后在卡上只保留了5个组件:COMPONET_Method,COMPONET_Class,COMPONET_ConstantPool,COMPONET_StaticField和 COMPONET_Export。其余的组件只是安装时提取有用信息而不在卡中保存。

12个组件中,类class组件保存本应用声明的所有类和接口的信息; 方法method组件保存本应用声明的所有方法和接口,method中利用2字节索引index引用类、方法和域;常数池constant pool组件保存method组件引用的所有类、方法和域信息,分为类、实例域、虚方法、父方法、静态域和静态方法6类,每组信息为4个字节;相关地址reference location组件保存method组件中索引的偏移。

对于JavaCard而言,应用程序的下载过程是即CAP文件写入到EEPROM的过程,即是对CAP文件的下载过程。在CAP文件的下载过程中,需要将一部分组件进行解析,同时对reference location中指定的位置进行链接,能够链接到method组件中的一个索引号,并根据索引号查找constant pool中保存的、与该索引号对应的类、方法或域在 EEPROM中的实际地址,调用实际地址中存储的数据。也就是说,方法的调用其实是需要两个步骤来实现的:

  1. 根据reference location中指定的位置进行链接,获取method组件中的索引号;
  2. 根据索引号查找constant pool中保存的、与该索引号对应的类、方法或域在EEPROM中的实际地址,调用实际地址中存储的数据。

查看一个CAP文件的组件,可以通过两种方法实现:

  • 解压缩软件直接解压得到
  • 通过JCK中的capdump将其分解成各个组件

所有的组件均有通用结构格式,如下:

1
2
3
4
5
6
7
component {
    u1 tag      //u1表示无符号单字节类型的数据变量类型;tag为组件索引号,按照上面组件名称的顺序从1至12排列
 
    u2 size     //u2表示无符号双字节的数据变量类型;size为可变长度数组info[]的元素个数
 
    u1 info[]   //数组info[]中含了组件的所有信息,依据各组件属性不同而各不相同
}

注:多字节数据总是按照大端(big-endian)顺序存放。

例如:HelloWorld.cap中的Applet组件:

1
2
0000000: 0300 0e01 0aa0 0000 0062 0301 0c01 0100  .........b......
0000010: 140a                                     ..

第一个03是tag,然后是000e是size也就是等于15,说明info为15个字符,01标示了这是包中的第一个applet,0a为该Applet的AID的长度,后面的a0 0000 0062 0301 0c01 01即为applet的AID,后面的0014是该Applet的install_method_offset,即当前Applet中的install()在Method组件info[]中的偏移,最后以0a结束。

推荐的CAP组件安装顺序:

  1. COMPONENT_Header
  2. COMPONENT_Directory
  3. COMPONENT_Import
  4. COMPONENT_Applet
  5. COMPONENT_Class
  6. COMPONENT_Method
  7. COMPONENT_StaticField
  8. COMPONENT_Export
  9. COMPONENT_ConstantPool
  10. COMPONENT_ReferenceLocation
  11. COMPONENT_Descriptor (optional)

COMPONENT_Debug组件不需要下载到卡内。


作者:fish
转自:http://www.dreamingfish123.info/?p=684

0 0
原创粉丝点击