爪哇卡(JavaCard)技术可使以爪哇语言所写成的程序,在智能卡和其它资源受限装置上执行。本文将让您一览爪哇卡技术,包括该系统的结构和组件。本概述的目的在让您对爪哇卡技术有一个整体性了解,并介绍有关爪哇卡系统的重点和基本概念,以利程序开发者设计程序之用。 一、爪哇卡技术之组件 爪哇卡技术包括下列部分: *精简后之爪哇程序语言以及适合智能卡应用的虚拟机(JavaCardVirtualMachine,JCVM)定义 *核心之爪哇卡应用程序接口(ApplicationProgrammingInterface,API)及其延伸部分 *爪哇卡之执行时期环境(JavaCardRuntimeEnvironment,JCRE) 爪哇卡应用程序接口和执行时期环境是以智能卡工业标准ISO7816为模型而设计,因此,爪哇卡平台可轻易支持跟ISO7816第一到第六部分兼容的智能卡系统和应用。 爪哇卡应用程序被称为applets。爪哇卡平台可支持多重应用(multiapplication)环境。爪哇卡应用程序则是在爪哇之执行时期环境内处理和执行。 二、精简之爪哇卡语言 若智能卡的程序可使用爪哇程序语言的所有功能写成当然最好,不过对智能卡和其它资源受限装置来说,由于运算资源有限,要完全支持爪哇程序语言是不可能也不切实际的事。一般智能卡是以1K的随机存取内存(RAM),以及16K的非挥发性内存(EEPROM或RAM)和24K的只读存储器(ROM)规格出现,因此,爪哇卡平台仅能支持经小心选取且已规格化而有精简功能的爪哇语言。此精简爪哇语言包含之功能,适于设计智能卡以及其它小型装置的程序,同时还能保留爪哇程序语言以对象为导向(object-oriented)的能力。说明爪哇程序语言所不支持的功能,可能要比说明其可支持的功能容易许多。爪哇卡平台不支持: *大型基本数据类型:长整数、双倍浮点、浮点 *字符和字符串 *多元数组 *动态类别加载 *安全管理者 *垃圾收集及终结 *穿线 *对象复制 这些不受支持功能的关键词自然会自爪哇语言中省略。部分进阶爪哇智能卡可提供垃圾收集机能,以激活爪哇卡应用程序删除功能。遭删除的应用程序空间可能可以,也可能无法再被使用,不过此乃视在该智能卡上所使用的垃圾收集者之功能范围而定。一般而言,如果某项语言功能未清楚指明为不受支持的话,它就属于受支持的精简功能。 三、爪哇卡平台结构 爪哇程序语言原本是为运算资源相当丰富的系统而设计。尽管爪哇卡平台支持一规格化之精简爪哇程序语言,但是将整个爪哇卡平台安装在有限内存和处理能力的智能卡上,是不适合的事。即使做得到,但是如此一来,类别库(classlibraries)或应用程序将无空间可用。爪哇卡平台的一项重要特色是其为一分布式系统。事实上,它是在空间和时间上分散于智能卡和桌上计算机间的系统。
许多不受执行时期限制的处理工作,例如类别加载(classloading)、验证(verification)、决议(resolution)和连结(linking),以及位码最佳化(bytecodeoptimization)等主要是在卡外(offcard)之个人计算机环境中执行的系统组件上运作。通常在个人计算机中资源不是考量的重点。驻在卡上的系统组件较紧密,也适于智能卡内存模型。爪哇卡执行时期环境(JCRE)即由这些组件组成。JCRE负责应用程序的执行,并且驱使卡内(oncard)系统和应用程序安全的执行。图一列出爪哇卡平台卡内系统的结构。 JCRE位于智能卡硬件和基础操作系统常规之上。JCRE包含爪哇卡虚拟机(位码解译器)、爪哇卡应用架构类别(APIs)、特定工业延伸、以及JCRE系统服务。API和JCRE系统服务是以ISO7816智能卡标准为模型,同时可协助应用程序和ISO7816兼容。 JCRE将爪哇卡应用程序自智能卡商的专属技术中分隔出来,同时也提供标准系统和API接口给应用程序。因此应用程序较小、也较容易编写,同时也可转置于不同的智能卡架构上。 JCRE的底层含有爪哇卡虚拟机(JCVM)。JCVM会执行位码,并且确定爪哇语言安全。上图中的JCVM只有虚拟机的位码解译器(bytecodeinterpreter)的部分。JCVM的另一部分嵌于一个称为转换器 (converter)的组件内。转换器是在卡外执行,下文将进一步说明此转换器。 系统类别(systemclasses)为JCRE之执行者,他们负责管理对象的持续和暂时行为,支持细部作业和交易,并管理主机和爪哇卡应用程序之间的通讯,控制应用程序的建立、选取和取消选取。为了完成任务,系统类别通常会激活本地的方法(nativemethod)服务。 爪哇卡应用程序架构(framework)界定出应用程序设计接口。此架构包含四种API包裹的中心和延伸部分。API类别相当紧密,同时其规格是为开发智能卡应用程序而定出。此架构之最大优点为,它极易建立一个爪哇卡应用程序。程序开发者可将大部份的精力放在应用程序上,而不是在智能卡系统的基础建构上。爪哇卡应用程序乃透过API类别取得JCRE服务。 特定的产业或企业可用附加的应用数据库,提供额外的服务或改善安全和系统模型。例如,威士忌开放平台(VisaOpenPlatform)延伸JCRE服务,以符合威士忌的特定安全需要。这些附加功能强化了发卡者对所发出信用卡的控制,同时也可明订信用卡个人化的一套标准指令。 爪哇卡应用程序可以下载(downloadable)。他们可在爪哇智能卡已生产之后再附加到卡上。安装器(installer)要负责爪哇卡应用程序的加载和安装。通常安装器会利用卡外安装程序的协助,两者一起完成安装应用程序的任务。由于JCRE不是必需支持动态应用程序安装,所以安装器只是JCRE的一项选择性组件。如果没有安装器的话,应用程序必须在智能卡生产制造时,就放置到卡片上,完成生产制造之后的卡片上就无法再附加任何的应用程序。 爪哇卡应用程序当然是以爪哇程序语言编写的。应用程序是由JCRE所控制管理。爪哇卡执行时期环境包含驻在卡上的爪哇卡系统组件。爪哇卡转换器和卡外安装程序则组成爪哇卡平台的其它部分。这个部分是在个人计算机环境中执行。转换器预先处理组成爪哇包裹之类别档(classfile),并建立紧密的二元档案(binaryfile),称为CAP档。CAP文件为可下载的组件。卡外安装程序取得CAP文件并将它传送给卡内安装器。 四、爪哇卡虚拟机 爪哇卡虚拟机(JCVM)和爪哇虚拟机(JVM)之间主要的不同在于JCVM被建构为两个不同的部分,如图二所示。 JCVM的卡内部分包括爪哇卡位元码解译器。爪哇卡转换器是在个人计算机或工作站上执行。该转换器是JCVM的卡外部分。他们两者结合可以支持虚拟机功能,其中包括加载爪哇类别档,并且以特别的语法执行这些档案。转换器会预先处理类别档,同时会执行验证、决议、准备、和位码最佳化等工作,这些工作在爪哇虚拟机是在类别加载时期执行的。转换器的输出是一个CAP档案。此CAP档接着被放置到爪哇智能卡上,并由解译器执行。
1.爪哇卡转换器 不像爪哇虚拟机一次只能处理一个类别,爪哇卡转换器的加载和转换单位是一个包裹。转换器会预先处理组成爪哇包裹的类别档,并且将该包裹转换成一个CAPn。在转换的过程中,转换器会执行下列步骤: *验证和精简爪哇语言检查:确认类别的加载形象(image)妥善形成,同时检查爪哇卡精简语言是否有任何违规情况。 *连结和决议:将类别、方法、和区域的符号型参考(symbolicreferences),分解成较紧密的形式,使之可在卡上更有效的处理。 *位码最佳化:利用在类别加载和连结时期取得的信息,优化其位码。 *准备和初始化:为不同类别安排储存空间,并建立VM数据结构;同时初始化静态变量。 转换器的输入不仅包括将被转换的类别档,同时还包括了一个或一个以上的输出档(exportfiles)。输出档内含经由被转换的类别所输入的包裹内容的名称和连结信息。除了产生一个CAP档之外,转换器还会为被转换的包裹产生一个输出档。 2.CAP档和输出档 CAP是被转换的应用程序(convertedapplet)的缩写。一个CAP档通常是指定义一个或多个爪哇卡应用程序的包裹。不过,包裹未必定义一个应用程序。在该情况下,CAP文件可代表一个数据库包裹,提供由应用程序所共享的一般类别和服务。例如,爪哇卡架构API包裹全都是数据库包裹。 爪哇程序的一但编写随处执行(writeoncerunanywhere)或许是爪哇平台最重要的特色。在爪哇技术中,类别文件是爪哇结构的中心部分。其定义出爪哇平台二元码兼容性(binarycompatibility)的标准。由于爪哇卡虚拟机结构的分散特性,CAP档可为爪哇平台执行码兼容性设定标准档案格式。CAP文件格式是一种特别形式,软件可以此种形式载在执行爪哇卡执行时期环境的智能卡上。 输出档并非载在智能卡上,因此爪哇卡解译器并不直接使用之。相反的,输出档是转换器因连结目的而产生和使用的。输出文件可被认为C语言中的起头文件(headerfile)。输出文件包含整个类别包裹的公共API信息(类别的名称和连结信息、接口、方法、和包裹中的区域),程序开发者可以自由的将输出文件送到该应用程序的潜在使用者处。 3.爪哇卡解译器 爪哇卡解译器本身不加载或操控CAP档。它只执行在CAP档中所发现的爪哇卡应用程序,CAP文件是由安装器所加载。爪哇卡解译器和安装器之间的功能划分,使得解译器既小巧,同时还使安装器的实作极有弹性。 爪哇卡解译器在实施执行时期安全上扮演重要的角色。例如解译器经由应用程序之防火墙机能,控制了对JCRE服务和应用程序内部通讯的存取。 到目前为止,本文一直说明爪哇卡虚拟机是包含转换器和解译器在内。不过,传统上爪哇卡虚拟机是被定义为虚拟机的卡上部分。虚拟机在我们目前的定义中是解译器。在早期许多刊物中,这种传统说法已经不可动摇。因此,在本文剩余部分,爪哇卡解译器和爪哇卡虚拟机也以此定义为主,除非文章中有特别声明。 五、爪哇卡执行时期环境 在个人计算机或工作站中,爪哇虚拟机是如操作系统过程一样执行。当COS过程终结时,爪哇应用程序和其对象就会被自动摧毁。 相反的,爪哇卡虚拟机是在爪哇卡执行时期环境中执行。JCRE是在卡片初始化时期被初始化。在卡片的整个生命期中,JCRE初始化只会被执行一次。在此过程中,JCRE会初始化虚拟机,并且建立对象,以提供JCRE服务并管理应用程序。一旦应用程序被安装后,JCRE会建立应用程序实体(appletinstances),同时应用程序也会建立对象来储存资料。 大部分储存在卡片上的信息,即使在卡片没电时,也必须获得保存。非挥发性内存技术(像是EEPROM)就可使智能卡在没有获得供电时也能储存信息。由于JCRE和卡片上所建立的对象常被用来代表持续的应用程序信息,所以JCRE的寿命和卡片的寿命是一样的。当电力供应中断时,JCRE可被视为在一个无限长的时频周期(clockcycle)中运作。 在卡片下一次得到能量时,JCRE就会醒过来,并且开始虚拟机的执行。不过这里有一点值得注意的是,JCRE到时不会回到虚拟机在失去电力时的运作。虚拟机到时会重新设定(reset),并且自main循环一开始的地方开始执行。JCRE重新设定和初始化是不同的,因为它可保存卡片上所建立的应用程序和对象。在重新设定的过程中,如果有交易动作先前未完成,JCRE会执行任何必须的清理动作,以将JCRE带入前后一致的状态。 六、爪哇卡API 爪哇卡API是由一组特别规划的类别所组成,用以设计依据ISO7816模型为基础的智能卡应用程序。类别的中心和其延伸部分比爪哇平台上的类别要紧密简洁,同时能提供基本服务给爪哇卡应用程序。 爪哇卡API包含三个核心包裹和一个延伸包裹。这三个核心包裹分别是java.lang,javacard.framework和javacard.security。延伸包裹为javacardx.crypto。除了在java.lang包裹中的类别之外,熟悉爪哇平台的程序开发者不一定认识大部分爪哇卡的类别。这是因为许多爪哇类别是支持GUI接口和网络,以及桌上型档案系统IO。智能卡并没有显示器,同时他们是使用不同的网络协议和档案系统结构。 1.java.lang包裹 一般来说,在爪哇卡API中不支持任何爪哇API类别。不过有些来自java.lang包裹的类别,可提供基本的爪哇语言支持。这种类别是Object、Throwable以及一些与VM相关的exception类别。Object类别定义出爪哇卡类别阶层的根基,而Throwable类别则提供所有exception一个共同之前导者(ancestor)。在因爪哇语言有违规情况而发生错误时,被支持的exception类别可确保爪哇语言的语意正确。例如,爪哇虚拟机和爪哇卡虚拟机在存取到一个空置参考(null-reference)时,都会出一个NullPointerException。在爪哇卡平台上所支持的类别列于表1。 表1 爪哇卡java.lang包裹 Object Throwable Exception Runtime Exception Arithmetic Excep-tion Array Index out Of Bounds Exception Array Stor Exception Class Cast Excep-tion Index Out Of Bounds Exception NullPointerException SecurityException NegativeArraySizeException 爪哇卡java.lang包裹是在爪哇平台上与其对等的java.lang的精简版。由于java.lang包裹中所支持的类别,爪哇卡applet是向上兼容的。在类别通路中所需的爪哇卡类别在可用时,爪哇卡applet即可在桌上型爪哇环境中执行。 2.javacard.framework包裹 javacard.framework是一种基本包裹。它为爪哇卡应用程序的核心功能提供架构类别和接口。最重 要的是,它定义出一个和爪哇应用程序类别具有相同角色的基础应用程序类别。基础类别“applet”在 应用程序的生命周期中,为应用程序之执行提供架构,同时也提供和JCRE的交互作用。一个使用者应 用程序类别必须延伸自基础“applet类别,并且会改写“applet类别中的方法,以实施应用程序的功能。 在javacard.framework包裹中另一个重要的类别是APDU类别。APDU为applicationprotocoldataunits之缩写,是在智能卡应用程序和主机应用程序之间交换的资料包裹。每个APDU包含一个主机下给智能卡应用程序的指令,或应用程序回给主机的响应。应用程序开发者可以使用在APDU类别中所提供的方法,而更轻易的处理APDU指令。 java.lang.System类别是不被支持的。爪哇卡平台会提供接口给系统行为的javacard.framework.JCSystem类别。JCSystem类别包括一组方法,来控制应用程序的执行、资源管理、交易管理、以及在爪哇卡平台上应用程序和应用程序之间的对象分享。 其它在javacard.framework包裹中所支持的类别是个人识别码(PIN)、工具(utility)、和exceptions类别。 3.javacard.security包裹 javacard.security包裹提供架构给爪哇卡平台上所支持的密码学(cryptographic)功能。其设计是以java.security包裹为基础。 javacard.security包裹定义出一个关键的类别keyBuilder和各种接口。这些接口代表在对称(DES)或非对称(DSA和RSA)演算中所使用的密码金钥。此外它还支持抽象基础类别RandomData,Signature,和MessageDigest。这些类别是用来产生随机资料,并计算讯息摘要(digests)和签章(signatures)。 4.javacardx.crypto包裹 javacardx.crypto包裹是一延伸(extension)包裹。其包含密码学类别和输出所控制的功能接口。javacardx.crypto包裹定义出支持编码和译码功能的抽象基础类别Cipher。 javacard.security和javacardx.crypto包裹定义出应用程序呼叫密码学服务的API接口。不过,它们并不提供任何实作。JCRE提供者需要供应可执行关键接口的类别,和自抽象类别RandomData,Signature,MessageDigest,和Cipher所延伸出的类别。通常在智能卡上会存有一个独立的密码辅助处理器,来执行密码学计算。 七、爪哇卡应用程序 爪哇卡应用程序被称为applet。它就像其它计算机操作系统环境中的应用程序处理或使用者空间一样。 您不该只因为它们名称中都有应用程序,而将爪哇卡应用程序和爪哇应用程序给搞混了。爪哇卡应用程序是一种依附一组规范的爪哇程序,因此能在爪哇卡执行时期环境内执行。爪哇卡应用程序并不预期在浏览器环境中执行。 选择应用程序来命名爪哇卡应用程序的理由,是爪哇卡应用程序在卡片被生产之后可加载爪哇卡执行时期环境内。也就是说,不像许多嵌入系统,应用程序得要嵌入ROM。相反的,它们可在稍后被动态的下载到卡片上。 爪哇卡执行时期环境支持一个多重应用环境。每个应用程序都由一个AID独一认定。一个应用程序也可以多重实例。例如,您可为了支持美金,建立一个电子钱包(wallet)应用程序实例,另外为英镑建立一个电子钱包应用程序实例。 应用程序类别必须延伸自javacard.framework.Applet类别。基础applet类别是所有驻在爪哇卡上的应用程序的超级类别。其定义出应用程序必须支持的一般方法,以便在应用程序的生命周期内和JCRE交互作用。 八、应用程序开发过程 爪哇卡应用程序开发的开始和其它任何爪哇程序一样,也就是程序开发者编写一个或一个以上的爪哇类别,并以爪哇编码器来编辑来源码,并如图三所示,产生一个或一个以上的类别档。一个应用程序会被组织成一个包裹或一组包裹。最小的应用程序是具有一个自 javacard.framework.Applet类别所得来的单一类别的包裹。 首先,应用程序在个人计算机或工作站的爪哇环境中被执行、测试、并进行除虫动作。此过程乃利用现存的爪哇开发工具来测试应用程序的功能。不过,在此步骤中,爪哇卡平台的部分特点无法被测试,例如应用程序防火墙、和对象的暂时性以及持续性行为就无法被测试。 接下来,应用程序是在一个仿真环境中进行测试。仿真器会在个人计算机或工作站上仿真爪哇卡执行时期环境。应用程序在仿真器执行的行为应该和它在一个真正卡片中执行的行为一样。在此开发阶段,不但应用程序会被进一步测试,应用程序的执行时期行为也会被测试。
通常,仿真器和除虫器是一起的。除虫器可让您设定一个分隔点(breakpoint),或将程序变成单一步骤,并且看到仿真爪哇执行时期环境中应用程序变化的执行状态。 最后当应用程序准备被下载进一个真正的卡片内时,组成应用程序的类别文件会利用爪哇卡转换器而转换成CAP档案。应用程序的转换过程列于图四。转换器的输入不仅包括将被转换的类别档,同时还包括了一个或一个以上的输出档。当应用程序包裹在转换时,转换器也同时产生该包裹的一个输出档。一个CAP档或一个输出档代表一个爪哇包裹。在进行转换之后,由一个或数个CAP文件所代表的应用程序,会被加载并安装在爪哇智能卡上。
|