Java Card CAP组件分析——Header Component

Header组件中包含了该CAP文件的基本信息,其中包括最重要的文件版本信息和包AID值。版本信息用以判断JAVA卡是否支持对该文件的解析。AID是CAP文件的唯一识别,单张JAVA智能卡上不支持装载相同AID的CAP文件。
header_component {
    u1 tag
    u2 size
    u4 magic    // 必须为0xDECAFFE
    u1 minor_version
    u1 major_version
    u1 flags    // ACC_INT - 0x01; ACC_EXPORT - 0x02; ACC_APPLET - 0x04
    package_info package
    package_name_info package_name
}

其中CAP File Package Flags:

Flags Value

ACC_INT

0×01

ACC_EXPORT

0×02

ACC_APPLET

0×04

package_info {
    u1 minor_version
    u1 major_version
    u1 AID_length
    u1 AID[AID_length]
}
 1
2
3
4
package_name_info {
    u1 name_length  // 当包内没有定义任何remote interfaces或者remote classes的时候值可以为0
    u1 name[name_length]
}

以 HelloWorld.cap 文件中的Header.cap中的信息为例:

0×01 | 0×00 0×13 | 0xDE 0xCA 0xFF 0xED | 0×01 | 0×02 | 0×04 |0×00 0×01 | 0×09 | 0xA0 0×00 0×00 0×00 0×62 0×03 0×01 0x0C 0×01

  • tag: 0×01 COMPONENT_Header
  • size: 0×13 = 19 除去tag和size后的大小
  • magic: 0xDECAFFED 用以标识Java卡CAP文件格式,若一个文件不是以0xDECAFFED开头则肯定不是JavaCard CAP文件,因为它不符合规范
  • minor_version: 0×01 次版本号
  • major_version: 0×02 主版本号, 该CAP文件格式的版本号是02.01;如果CAP文件的版本号超出了Java虚拟机所能够处理的有效范围,Java虚拟机将不会处理该CAP文件
  • flag: 0×04 包中没有用到int类型、CAP文件中没有Export组件、CAP文件中有Applet组件。
  • package_info:
    • minor_version: 0×00
    • major_version: 0×01
    • AID_length: 0×09
    • AID: 0xA0 0×00 0×00 0×00 0×62 0×03 0×01 0x0C 0×01
对应卡内installer:
CardApplet* newapplet=new CardApplet();
int iPos = 0;
u1 c1;
 
c1=dataBuffer[iPos];
 
// Read Header Component
 
if(c1!=TAG_HEADER_COMP){
    std::cerr<<"Not an applet!"<pHeader = new HeaderComponent(pi,appletMajVer,appletMinVer,appletFlags);
 
}
作者: fish
转自: http://www.dreamingfish123.info/?p=684

你可能感兴趣的:(JavaCard)