Java Card CAP组件分析——Header Component

Header组件中包含了该CAP文件的基本信息,其中包括最重要的文件版本信息和包AID值。版本信息用以判断JAVA卡是否支持对该文件的解析。AID是CAP文件的唯一识别,单张JAVA智能卡上不支持装载相同AID的CAP文件。
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. header_component {  
  2.     u1 tag  
  3.     u2 size  
  4.     u4 magic    // 必须为0xDECAFFE  
  5.     u1 minor_version  
  6.     u1 major_version  
  7.     u1 flags    // ACC_INT - 0x01; ACC_EXPORT - 0x02; ACC_APPLET - 0x04  
  8.     package_info package  
  9.     package_name_info package_name  
  10. }  

其中CAP File Package Flags:

Flags Value

ACC_INT

0×01

ACC_EXPORT

0×02

ACC_APPLET

0×04

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package_info {  
  2.     u1 minor_version  
  3.     u1 major_version  
  4.     u1 AID_length  
  5.     u1 AID[AID_length]  
  6. }  
  7.  1  
  8. 2  
  9. 3  
  10. 4  
  11. package_name_info {  
  12.     u1 name_length  // 当包内没有定义任何remote interfaces或者remote classes的时候值可以为0  
  13.     u1 name[name_length]  
  14. }  

以 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:
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. CardApplet* newapplet=new CardApplet();  
  2. int iPos = 0;  
  3. u1 c1;  
  4.    
  5. c1=dataBuffer[iPos];  
  6.    
  7. // Read Header Component  
  8.    
  9. if(c1!=TAG_HEADER_COMP){  
  10.     std::cerr<<"Not an applet!"<<std::endl;  
  11. }  
  12. else  
  13. {  
  14.     iPos+=7;  
  15.    
  16.     u1 appletMinVer  = dataBuffer[iPos++];  
  17.     u1 appletMajVer  = dataBuffer[iPos++];  
  18.     u1 appletFlags   = dataBuffer[iPos++];  
  19.     u1 packageMinVer = dataBuffer[iPos++];  
  20.     u1 packageMajVer = dataBuffer[iPos++];  
  21.     u1 aidLength     = dataBuffer[iPos++];  
  22.     u1* aid          = new u1[(int)aidLength];  
  23.     for(int i=0;i<aidLength;i++)  
  24.     {  
  25.         aid[i]=dataBuffer[iPos++];  
  26.     }  
  27.    
  28.     PackageInfo* pi = new PackageInfo(aid,aidLength,packageMajVer,packageMinVer);  
  29.     newapplet->pHeader = new HeaderComponent(pi,appletMajVer,appletMinVer,appletFlags);  
  30.    
  31. }  
作者: fish
转自: http://www.dreamingfish123.info/?p=684
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Card是为了智能卡和嵌入式设备开发的一种Java平台。它支持Java SE的子集,因此可以使用Java Swing组件来构建用户界面。如果您想在Java Card应用程序中组合两个Java Swing组件,可以按照以下步骤操作: 1. 在Java Card应用程序中创建一个Java Swing JFrame窗口。 2. 在JFrame窗口中添加两个Java Swing组件,例如JTextField和JButton。您可以使用setLayout()方法定义组件的布局。 3. 定义一个Java Card应用程序中的APDU命令,以便在智能卡上触发应用程序。例如,您可以定义一个命令来启动JFrame窗口。 4. 在Java Card应用程序中实现处理APDU命令的代码。当智能卡接收到定义的命令时,它将执行相应的代码,显示JFrame窗口和两个Java Swing组件。 例如,以下是一个简单的Java Card应用程序代码示例,它创建一个JFrame窗口,添加一个JTextField和一个JButton组件,并在智能卡上启动JFrame窗口: ```java import javacard.framework.*; import javax.swing.*; import java.awt.*; public class MyCardApplet extends Applet { private JFrame frame; private JTextField textField; private JButton button; public MyCardApplet() { initUI(); } public static void install(byte[] bArray, short bOffset, byte bLength) { new MyCardApplet().register(); } public void process(APDU apdu) { // Handle APDU commands here } private void initUI() { frame = new JFrame("My Card App"); frame.setLayout(new FlowLayout()); textField = new JTextField(20); button = new JButton("Click Me"); frame.add(textField); frame.add(button); frame.pack(); } public void start() { frame.setVisible(true); } } ``` 这只是一个简单的示例,您可以根据您的需求进行修改和扩展。请注意,Java Card应用程序的可用内存和处理能力可能有限,因此您需要谨慎考虑您的应用程序设计和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值