图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
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)通讯模型
第二种通信模型依靠J2SE RMI分布式对象模型的一个子集。
在RMI模型中,一个服务器应用程序创建并生成可访问的远程对象,并且一个客户应用程序获得到远程对象的远程引用,然后调用它们的远程方法。在JCRMI中,Java Card小应用程序是服务器,而主应用程序是客户端。
JCRMI由类RMIService提供到扩展程序包javacardx.rmi中。JCRMI消息被封装到传入RMIService方法的APDU对象中,换句话说,JCRMI提供了一个基于APDU消息传递模型的分布式对象模型机制,通过这个机制服务器和客户端通信,往返传送方法信息、参数和返回值。