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
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!"<<std::endl;
}
else
{
iPos+=7;
u1 appletMinVer = dataBuffer[iPos++];
u1 appletMajVer = dataBuffer[iPos++];
u1 appletFlags = dataBuffer[iPos++];
u1 packageMinVer = dataBuffer[iPos++];
u1 packageMajVer = dataBuffer[iPos++];
u1 aidLength = dataBuffer[iPos++];
u1* aid = new u1[(int)aidLength];
for(int i=0;i<aidLength;i++)
{
aid[i]=dataBuffer[iPos++];
}
PackageInfo* pi = new PackageInfo(aid,aidLength,packageMajVer,packageMinVer);
newapplet->pHeader = new HeaderComponent(pi,appletMajVer,appletMinVer,appletFlags);
}
作者:
fish
转自: http://www.dreamingfish123.info/?p=684