一、前言
Java的技术,因为 computing resource的不同,而区分为不同性质的Java平台,如 Enterprise Java、 Embedded Java与 Java Card等。若是以Embedded Java来说,因为功能上的要求有限,并且受限於硬体资源大小(如呼叫器),所以在硬体与Java执行环境上必须有所妥协。Java Card也是基於硬体与应用的 求所开发的技术,目的是使得 Java的技术能够在如同smart card晶片般大小的有限资源下执行。所以,目前Java Card可以说是最小的Java平台。
二、简介
Java Card是Java 平台中最小的 subset,其设定的执行环境为smart card上的晶片或是有严格硬体限制的环境。Java Card的问世,一方面是为了推展Java的应用层次,一方面也是为了将Java平台的特性以及Java Card 的好处带到smart card上,这些好处主要有:
Platform-Indep endent:使得 Java Card applets (在Java Card上执行的程式)能够在不同卡片的JCAE( Java Card Application Environment)上执行,即透过Java VM 的机制来达到跨平台的能力。
Multi-Applicat ion Capable:在同一个Java Card 中能够存放多个 Java Card applets ,并且也能够透过 download的方式来下载必要的applets 而达到一卡多用途的好处,使得卡的使用能够更有弹性。
Compatible with Existing Smart Card Standards: Java Card能与国№ 标准ISO 7816( Smart Card标准)以及工业界标准如 Europay/Master Card/Visa (EMV)相容。
所以,在未来Java Card不但能够取代今日Smart Card的功能,更能够发展出多样化的应用,如身份识别、医疗资讯记录、电子钱包、门禁管控等,甚至能将许多不同的应用程式集合於一张卡上,使得这些随身的软体能够更小更实用。
JavaCard现行的版本有2.0与2.1版,其中2.0版是在1997 年底所释出,而2.1 版则是在今年刚释出。
三、运作逻辑
如图1所示Java Card实№运作的模式,主要分为二个部分。
图1、 JavaCard运作模式图
第一个部分就是 Java Card这一端,配合CAD(Card Acceptance Device ),也就是图1中的Card Reader来传输、读取Card中的资料,并且供给 Card所 的电源。而JavaCard本身则可以执行applet程式,使得一些敏感的资料与行为能够安全执行而不受外部程式影响。第二部分则是图1右方的 Terminal端,负责提供服务程式及操作介面,并透过CAD 与JavaCard沟通。
另外,在图1中所表示的 APDU(Application Protocol Data Units)即双箭头的部分,则是 terminal与Java Card沟通的格式与协定。由terminal 端传送给Java Card 的APDU称为Command APDU,主要适用来下达指令以及传输资料给Java Card。图2即Command APDU的格式。
图2、 Command APDU格式
其栏位所表示的意义分别为:
CLA - Class Byte,用於识别applet
INS - Instruction Byte ,下达给applet之指令
P1 - 第一个指令参数
P2 - 第二个指令参数
Lc - Data Field之长度
Data Field - 资料栏位
Le - 回传资料之长度
例如,terminal要下达两个byte相加的加法指令(INS= 0x01)给applet( CLA=0x80)时, Command APDU的写法可能为:
而当Java Card applet接收到此一指令时则会先判断 CLA byte是否为 0x80,接著再根据 terminal端所下达的指令来执行,并将Data Field依指令性质取出两个独立的byte来相加。
而由Java Card端回传给terminal端的 APDU则称为 Response APDU,图3则为此APDU之格式。
图4
其栏位所表示的意义分别为:
Data Field - return之资料栏位
SW1 - 执行状态参数1
SW2 - 执行状态参数2
所以,利用上述的加法为例,Java Card applet执行後所return的值若为 short value(16-bit integer),则 Response APDU的表示法可能为:
其中Data Field为一short integer(以两个bytes表示),而SW1与SW2所表示的意义(0x9000 )即"success"或是 "no error"的意思。
根据图1的运作模式,若以电子钱包为例,我们一开始会在Java Card上 install一个applet ,负责提款、付帐与维护帐目,当我们 要提款时,必须Java Card放入提款机(Terminal)的Card Reader中,透过提款机的服务程式与介面来提出我们 要的款项,并且通知Java Card 上的applet将这笔款项存入Java Card 的帐目中。如此我们所持有的Java Card就成为一个行动的卡片钱包。若我们 要消费的话(如搭公车、网路购物等),就可以透过相同的逻辑来扣除款项。所以,在诸如此类的消费行为里,我们就可以透过这种简单的读卡动作来达到消费的目的。不同於一般信用卡的是,我们不但能做小额的消费,也省去了付帐的繁杂手续与携带零钱的麻烦。
四、Java Card硬体需求
Java Card有如一部具体而微的电脑,其硬体的规格主要是在於维护Java Card runtime environment的 求,其最小的规格要求为:
512 bytes RAM:主要用於存放程式执行时的 stack、暂存资料以及做为I/O的缓冲区。
24 KB ROM :主要用於存放系统的程式以及 Runtime Environment,如 JVM、applets、 native functions 等。
8 KB EEPROM:用於储存我们所下载至 Java Card的 applets,并且做为 object heap存放之处。
8-bit processor: Java Card必须至少支援8位元的处理器。
五、Java Card软体架构
在上述的硬体架构中,基本上我们可以将Java Card想像为一部PC的缩影,而Java Card的软体架构则具有OS、 native functions 、JCRE(Java Card Runtime Environment)以及架构在此JCRE上的应用程式(Java Card applets),事实上Java Card的软体架构也是与今日的软体架构相仿,图5即为Java Card之软体架构。
图5 Java Card之软体架构图
在此软体架构中,最底层的OS and Native Functions 是负责低阶的处理工作,如同今日的作业系统。而在上面两层Java Card Interpreter与Java Card APIs and Framework就是我们所谓的JCRE,主要负责执行Java Card applets以及提供 applet执行所 要的环境。而 Industry Add-on Classes则是 service provider 所提供的classes,使得企业与公司能够提供属於自己的服务程式。
Java Card的最上层就是所谓的Java Card applets,就如图5-1所示,一个 Java Card可以执行多个Java Card applets,但是要特别注意,Java Card 的执行环境并无支援Multi-thread,所以一次只能执行一个applet,并且 applet与applet之间也有firewall的阻隔。尽管如此,在Java Card的设计之中亦有让不同的 applets相互沟通的机制,我们只 要让applet implement javacard.framewor k.Shareable interface就能够分享applet 的 resource。
因为受限於体积与 resource,所以 Java Card在执行环境上的支援是相当有限的,表即 Java Card执行环境的支援现况,其他详细内容请参考 references。
六、Java Ring
Java Ring又名 Java-Powered iButton,是Dallas Semiconductor公司的产品,事实上 Java Ring只是Java Card的另外一种型态,Dallas公司将它制作成为钮扣的形状,进而镶嵌在戒指之上,成为一个Java Ring。
因为Java Ring是沿袭Java Card的规格,所以在软体的架构上是相同的。而 Java Ring在Java Card的原有的硬体架构下加强了其原有的结构,并且发展出与Java Card不同的应用层面。
七、Java Card API
Java Card的2.1版总共分为四个 packages,而其内容与重要的物件分述如下:
javacard.lang package:提供 Java language重要的classes,如 Object物件,因为所有的Java物件皆继承其下。
Object class - root of class hierarchy
Throwable class - 为所有 error及exception 的superclass,这亦表示Java Card支援exception
javacard.frame work package :是Java Card API 主要的core package,提供了实做Java Card applet基本的物件与工具。
IOS7816 abstract interface - 提供了ISO7816所使用的常数值
PIN abstract interface - 使其 subclass能透过此一介面能够做check PIN number及验证 PIN是否为validate 等功能
Shareable abstract interface - 使得不同的applets能够透过implement此介面来达到互相沟通的功能
AID class - AID(Application Identifier)是用来唯一表示Java Card applet的number,使得JCRE能够透过一个AID table来识别或选择我们所要执行的applet
APDU class - 是属於 JCRE的物件,是藉由maintain一个 byte array buffer 来接收与传送 terminal端的指令与回传applet执行的结果与状态的标准格式
Applet class - 每一个 Java Card applet 都必须继承在此 class之下。其中在 implement时要特别注意几个methods,如select、 deselect是当 terminal端跟据 applet的AID下达 select或deselect 此applet的指令时,由JCRE来启动的 methods。而 install与register 则是applet下载至 Java Card安装并向 JCRE注册之methods 。等到applet安装注册完成,并且被 terminal所select 时,所有下达的 APDU command接会交由applet的 process method来处理并负责回传结果
JCSystem class - 负责管理 applet与Java Card 的系统资源,如AID