基于ATL的智能卡中间件的实现

摘     要:COM(组件对象模型)为组件的开发和应用提供了一个标准平台。介绍了智能卡和其基于ATL(活动模板库)的 COM组件的实现,重点阐述其实现过程和实现流程,最后简述中间件的应用。该组件封装智能卡COS(片内操作系统),并以dll文件形式提供给用户,增强了组件的重用性,且方便系统升级和扩展。

关  键  词:智能卡 ;组件对象模型;活动模板库;片内操作系统


     智能卡(Smart Card),即IC卡,它将存储和处理信息数据的芯片镶嵌于塑料基片中,具有标准信用卡大小。智能卡存储容量大、安全性高、寿命长、适应性强、应用范围广,但其最大的特点是:在保持安全的情况下,一卡多用。在现阶段,CPU卡是使用最广泛的智能卡,卡中包含:CPU、E2PROM、RAM以及固化在ROM中的片内操作系统(COS)。

    在智能卡中,COS遵循ISO/IEC7816规范,它主要负责存储空间管理、文件系统管理和安全管理。虽然COS提供了智能卡底层接口的实现,但如果用户使用不同的操作系统、读卡器或开发平台,这就需要为不同的用户开发不同的应用软件,这样势必极大地增加软件开发的工作量,同时给用户的使用带来不便。那么,能否开发一种通用的智能卡软件呢?智能卡中间件就是答案。

    由于智能卡COS是硬件相关的,此时,藉用COM技术对COS进行封装,使之成为智能卡中间件。这样,降低了智能卡应用的难度,扩展了智能卡应用的广度。图1体现了中间件的逻辑位置以及调用层次关系。

基于ATL的智能卡中间件的实现_第1张图片
图1中间件调用层次图




    1  COM技术概述


     根据组件化程序设计思想,一个大型的应用程序划分为多个模块,且每个模块保持一定的功能独立性,在协同工作的同时通过相互之间的接口完成实际的任务,这样每一个独立的模块叫组件。当所有的组件开发完毕,将它们装配在一起便成为一个完整的系统。当软硬件环境发生变化或用户需求有所改变时,只需要对受影响的个别组件进行修改,重新组装即可完成系统的更改。

    COM(Component Object Model)是微软开发的公共组件标准,该标准包括规范和实现两大部分。规范部分定义了怎样以独立于语言和独立于位置的方式调用对象,怎样定位和标识组件,以及怎样创建组件对象。实现部分主要是COM库(包含于ole32.dll和rpcss.dll中),它提供系统服务,具体包括:定位和装入组件,执行进程间通信和远程通信等工作。

    在Windows平台上,COM组件以dll或exe文件形式发布,当组件在操作系统的注册表中注册后,用户可以像使用标准ActiveX控件一样享受其服务。应该注意的是,COM对象只通过接口提供服务,提供服务同时隐藏了其内部实现,这就不同于C++对象在源代码级上的封装,COM对象实现的必须是二进制级上的封装。根据COM规范,COM对象接口(简称COM接口)能自我描述,且不依赖具体实现对象,并且需要消除接口调用与接口实现之间的耦合,这就要求COM接口用一种与具体实现语言无关的语言来定义,该语言就是IDL(Interface Definition Language)。另外,按照COM规范,COM对象和接口必须唯一被标识,对象标识符称为CLSID,接口标识符称为IID,两者都是由生成的128二进制位的GUID来标识(Global unique identifier,基于概率的算法保证其全球唯一性)。


    2 COM接口及对象的创建


     任何COM接口都是从一个IUnknown接口(也叫未知接口)继承。IUnknown接口包含三个成员函数:QueryInterface()、AddRef()和Release()。三者十分重要,不可或缺,QueryInterface ()用于查询组件实现的其它接口,AddRef()用于增加引用计数,Release()用于减少引用计数,当引用计数减为零时,接口自动在内存中释放组件本身。

    同时一个COM对象还包括一个叫IClassFactory(类厂)的基本接口,该接口中最重要的一个函数就是CreateInstance,它用来创建COM对象的实例,一般情况用户不会直接调用它。

    还有一个基本的接口叫做IDispatch接口(调度接口)。用来解决不支持指针的上层语言(如脚本语言VBscript,javascript等)的函数调用问题。该接口把每个函数和属性都编上号,客户程序将编号传递给IDispatch接口完成调用。

    图2较详细的说明了创建对象的流程。


图2 进程内服务器对象创建流程 


     3  基于ATL的中间件创建


    3.1中间件开发工具选择

    目前,中间件开发有三种方式:(1)COM SDK直接开发;(2)MFC开发;(3)ATL开发。用
SDK开发工作量大,需仔细了解COM底层原理,且很多重复劳动;MFC开发的组件需要运行时MFC42.dll库来支持,组件体积大、时间开销大,且要求是扩展dll;ATL是专用于开发组件的C++模板库,它将与COM相关的众多工具集成到统一的编程环境中,ATL利用模板使程序代码量小,执行效率较高。所以,用ATL开发智能卡组件是一个比较好的选择。

    3.2中间件软件结构和主要功能

    为使中间件具有更好的适应性,中间件的软件采用了分层结构模型。如图3所示, 应用层为用户提供API,实现诸如对卡的上、下电操作,密钥对生成,数据加解密等。智能卡层响应用户层的请求,向下传递信息,同样也将下层的信息返回给应用层。读卡器层,由配置文件选择相应的读卡器,并将请求向下传递。数据传输层实现数据传输协议。这种分层结构能够很好的屏蔽硬件之间的差异,灵活性好。




    图3 中间件分层模型



 该中间件基于智能卡COS所提供的命令接口来进行开发,主要完成一些基本过程:(1)建立文件系统,如建立MF、DF文件和各种EF文件;(2)文件系统操作;(3)身份认证和鉴权;(4)智能卡复位、锁定和解锁;(5)密钥生成,由卡生成RSA密钥或外部装入RSA密钥;(6)读写公钥和私钥等。

    3.3中间件实现流程
 
    VC中的ATL封装了COM技术细节,提供了AppWizard向导,简化了难度,同时也支持COM的一些高级特性,如双节口、连接点、ActiveX控件等。下面简述中间件的实现过程。
 
    (1)利用AppWizard创建一个ATL工程。选择DLL服务器(进程内组件),不需要选择proxy/stub、MFC和MTS,然后引入底层dll的头文件,这样,该程序框架中就包含了一组COM标准所要求的导出函数和一个全局成员:CComModule  _Module.
 
    (2)添加一个COM对象,它包含底层对应的众多接口,如ISCard接口(智能卡指令和相关PC/SC的接口)、IIError接口(错误代码的设置和读取等功能接口)、IIIOP接口(读写器和IC卡资源管理器等功能接口)、IICardProperties接口(智能卡的相关信息接口)。
 
    (3)IDL支持自定义结构体,在IDL文件中引入底层智能卡COS自定义的结构体,并加上唯一的UUID,需要删除底层头文件中的重复定义。

    (4)为各接口添加属性和方法。注意接口方法要用IDL语言(和C++接近)声明,从IDL定义的接口代码需要经过编译器(MIDL.exe)编译,编译后的文件组成如图4所示。
除了声明参数类型外,还要声明参数的属性,如属性修饰[out,retval],表示通知客户端,该参数必须作为方法调用的返回值被返回。例如:
HRESULT GenerateRSAKey(const unsigned char wPubKeyFileID,[out,retval] long *bRet);
属性修饰缺省的情况下表示输入参数,const unsigned char wPubKeyFileID省略了 [in]。



图4  idl文件编译结构




    (5)实现每个接口中包含的方法,针对该实现,需要实现大量的方法,这个过程是繁琐的、耗时的,可能需要迭代开发模式,以减少客户端测试的时间。一个简化例子如图5所示:




    图5 COM层函数的简单实现
 
    (6)编译、建造工程,VC自行注册组件。
 到此,智能卡中间件创建完成。下面还需要建立客户端程序测试和验证中间件。

    3.4中间件的应用

    无论在哪种开发环境下使用组件,在二次开发的初期,必须建立COM组件的运行环境。以VC为例,重点说明一种组件运行环境的建立。

    首先引入头文件*.h(组件接口声明)和*_i.c(定义组件所有的CLSID和IID);然后初始化COM库,调用CoCreateInstance()得到所需接口的指针;当客户端调用完毕,释放实例,最后卸载COM库。
另一种方式,可以使用#import指令导入类型库(*.tlb)的方式,此处不再赘述。
建立COM运行环境后,可实现智能卡的应用。图6展示了一典型的中间件应用流程:



图6 智能卡工作逻辑




    4  结束语


     智能卡中间件利用ATL实现了COM规范。同时注意到,编写中间件测试程序也是必要的,只有开发和测试交替进行,才能保证组件的可用性。另一方面,在组件结构方面,该组件使用分层模型,这就很好地屏蔽了硬件信息,为用户提供了一个统一的接口,实现组件的通用性、可扩展性和移植性。 

你可能感兴趣的:(基于ATL的智能卡中间件的实现)