分析CAP各组件
各Component的定义
根据JCVM规范,各组件的结构如下。
Header组件
各package的AID和name。
Directory组件
目录,记录各组件的大小,CAP文件的import package数量,applet数量等。
ConstantPool组件
ConstantPool存的并不是常量对象,而是类、方法和静态域等项的引用。在JavaCard技术中,引用不是地址值,而是token值。在CAP文件的上下文中,对其它项的引用是通过CAP的常量池间接进行的。
Applet组件
个人理解就是简化版的特殊Class。包含Applet的AID和install方法的地址。
Class组件
类列表。描述了package内所有类的信息,包括:实现的接口,字段,方法的引用。
Method组件
方法列表。保存了所有方法的入参、所需栈大小以及字节码。
StaticField组件
包含所有初始化与未初始化的静态域。
Reference Location组件
记录Method组件中info字段到ConstantPool中constant_pool[]字段的偏移,利用这个信息,可以将Method对3类资源的间接引用替换为直接引用。
Descriptor组件
辅助描述的作用,非必选。
各Component间的引用关系
1. 安装成功后,卡上留下的5个组件间的引用关系
● 有Export Component意味着该package的属性为public,否则就没有Export组件。
● 类、方法、静态域都从ConstanPool间接访问,前提是这3类资源的地址不变。在Applet运行过程中,Class、Method组件的内容不变、地址不变,但StaticField内容可能发生改变,Flash磨损均衡策略会改变StaticField的地址,再把StaticField组件的引用放到ConstantPool中就不合适。
Applet的下载、安装、注册流程
下载
通过APDU指令,把CAP各组件下载到卡的内存中。
安装+注册
安装:JCRE通过JCVM调用Applet的install方法,new出一个Applet对象。
注册:将安装好的Applet对象注册到JCRE的Applet表中。
Applet组件中有install方法的偏移,JCRE可以通过JCVM执行该Applet的install方法进行安装。
以下的流程图为自己推测,因为JCRE的实现并未有统一版本,只要符合规范即可。