图1中说明的消息传递模型是所有Java Card通信的基础。它的核心就是应用程序协议数据单元(APDU),CAD和Java Card框架之间交换的一个逻辑数据包。JavaCard框架接收任何CAD发送进来的APDU命令并且传送到相应的小应用程序中。小应用程序处理APDU命令,然后返回一个响应APDU。那些APDU遵守国际标准规格ISO/IEC 7816 - 3和7816 - 4。
图1使用消息传递模型通讯
读卡器和卡之间的通信通常基于下面两种连接协议的一种,面向字节的T = 0,或者面向数据块的T = 1。还可能会用到被称为T = USB和T = RF的替换协议。JCRE APDU类向应用程序隐藏了一些协议细节,但不是全部,因为T = 0协议相当的复杂。
⒈APDU命令
一个APDU命令的结构由它的第一个字节的值控制,大部分情况下看上去如下所示:
图2、APDU命令
一个APDU命令有一个必须有的头和一个可选的体,包含:
· CLA(1字节):这个必要的字段识别指令的一个特定应用程序类。有效的CLA值在ISO 7816 - 4规范中定义:
表格1、ISO 7816 CLA值
CLA 值 |
指令类 |
0x0n, 0x1n |
ISO 7816 - 4卡指令,比如文件存取和安全操作 |
20 to 0x7F |
保留 |
0x8n or 0x9n |
你可以用作你的特定的应用程序指令的ISO/IEC 7816 - 4格式,根据标准解释 X |
0xAn |
特定的应用程序或者供应商的指令 |
B0 to CF |
你可以用作特定应用程序的ISO/IEC 7816 - 4格式 |
D0 to FE |
特定的应用程序或者供应商的指令 |
FF |
保留给协议类型选择 | · 理论上,你可以使用所有的CLA值0x80或者更高值来用于特定应用程序指令,但是在许多现在的Java Card实现中,只有黑体显示的是实际认可的。
· INS(1字节):这个必需的字段指明CLA字段中标示的指令类中的一个特定指令。ISO 7816 - 4标准指定用于访问卡上的数据的基本指令,当它根据在像标准中定义的卡上的文件系统那样结构化的时候。附加功能已经在这个标准中的其它地方说明,其中一些是安全功能。表2中是一个ISO 7816指令的列表。只有当使用一个相应的CLA字节值时,你才可以根据标准定义你自己的特定应用程序的INS值,。
表格2、当 CLA = 0x时的ISO 7816 - 4 INS值
INS 值 |
命令描述 |
0E |
Erase Binary |
20 |
Verify |
70 |
Manage Channel |
82 |
External Authenticate |
84 |
Get Challenge |
88 |
Internal Authenticate |
A4 |
Select File |
B0 |
Read Binary |
B2 |
Read Record(s) |
C0 |
Get Response |
C2 |
Envelope |
CA |
Get Data |
D0 |
Write Binary |
D2 |
Write Record |
D6 |
Update Binary |
DA |
Put Data |
/dc/ DC |
Update Record |
E2 |
Append Record |
· P1(1字节):这个必需的字段定义指令参数1。你可以使用这个字段来检验INS字段,或者用于输入数据。
· P2(1字节):这个必需的字段定义指令参数⒉你可以使用这个字段来检验INS字段,或者用于输入数据。
· Lc(1字节):这个可选的字段是命令的数据字段的字节数。
· 数据字段(可变的,字节Lc数):这个可选的字段保存命令数据。
· Le(1字节):这个可选的字段指定在期望响应的数据字段中的极限字节数。
取决于命令数据的存在与否以及相应是否必须,命令APDU有四种变化。只有在你使用协议T = 0时,你才需要关心这些变化:
图3、APDU命令的四个可能的结构
一个典型的应用程序将以不同的结构方式使用不同的APDU命令。
2、响应APDU
响应APDU的格式很简单的:
图4、响应APDU
和一个APDU命令相似,响应APDU有可选择的和必要的字段:
· 数据字段(可变长度,由APDU命令中的Le确定):这个可选择的字段包含小应用程序返回的数据。
· SW1(1字节):这个必要的字段是状态字1。
· SW2(1字节):这个必要的字段是状态字2。
这些状态字的值在ISO 7816 - 4规范中定义:
图5、响应状态码
Java Card框架应用编程接口中的ISO7816 Java接口定义了许多常数来帮助规范返回错误代码。
3、过程APDU
每当有一个进入的APDU用于所选择的小应用程序,JCRE就调用小应用程序的process ()方法,把进入的APDU作为一个参数传送。这个小应用程序必须解析APDU命令,处理数据、生成一个响应APDU,然后把控制权返回给JCRE。
RMI(JCRMI)通讯模型
第二种通信模型依靠java/j2se/ J2SE RMI分布式对象模型的一个子集。
在RMI模型中,一个/server/ 服务器应用程序创建并生成可访问的远程对象,并且一个客户应用程序获得到远程对象的远程引用,然后调用它们的远程方法。在JCRMI中,Java Card小应用程序是服务器,而主应用程序是客户端。
JCRMI由类RMIService提供到扩展程序包javacardx.rmi中。JCRMI消息被封装到传入RMIService方法的APDU对象中,换句话说,JCRMI提供了一个基于APDU消息传递模型的分布式对象模型机制,通过这个机制服务器和客户端通信,来回传送方法信息、参数和返回值。
|