uim详解-5(卡上操作系统cos)

    目前智能卡cos有两种,一种是采用javacard技术,另一种是native技术。

    javacard顾名思义就是使用java语言来实现应用,当然底层还是C语言。用java语言的目的是使得便于实现同一张卡多种应用applet。相对的native是使用C来编写,创建不同的ADF文件来实现不同应用。从个人化流程来说,JavaCard规范推荐统一的通用个人化流程(CPS),在创建安全通道后,通过统一的Store Data命令完成卡片的个人化。而native不同厂家定义完全不同的个人化流程,采用完全不同的个人化指令,纷繁复杂,不便于掌握,也不便于统一。JavaCard对applet进行添加,修改,删除不影响整体稳定,这是native卡难以做到的。

    下面介绍javacard与native两种技术的代码框架。


    native卡片开机流程:上电初始化之后,处在一个for循环中,读取串口数据,并解析。把从串口收到的数据经APDU解析后,通过INS(还需要检查CLA、P1、P2之类)等来找到该命令所对应的函数执行并返回结果。可以简单点来说就是一个APDU指令对应于卡内的一个功能函数。这种实现把硬件操作与应用糅杂在一起,便于实现,不方便维护。


    java卡cos仿造android系统,把跟硬件相关如native卡里的HAL层、通讯层、文件系统、算法、安全等都封装成了java的native方法,把java卡上的智能卡应用开发与底层接口开发分开,便于开发与维护。java卡的底层都是一些寄存器操作,这个需要根据芯片手册来分析,这里就不多介绍,本文主要讲java卡的vm与应用。

    java卡vm:


    上图很清晰的介绍了off-card跟on-card上jcvm的操作。jcvm简单说就是jvm的一个子集。

    接下来介绍一下openjcvm,源码路径:http://download.csdn.net/download/song_ey/5080467

    虚拟机文件转换java->class->cap->ijc,openjcvm就是一个进程,运行参数为ijc文件,源码如下:

	if(argc<2){
		std::cout<<"Usage: "<<argv[0]<<" library1.ijc library2.ijc ... applet.ijc"<<std::endl;
		//std::cout<<"Usage: "<<argv[0]<<"library1.ijc library2.ijc ... applet.ijc engine.ijc"<<std::endl;
		exit(1);
	}
    然后把java代码解析放入队列中:

	CardLibList::libList.push_back(buildJavaLang());
	CardLibList::libList.push_back(buildJNI());

	//for(i=1;i<argc-2;i++)
	for(i=1;i<argc-1;i++)
	{
		int iDataLength = readBin(argv[i],dataBuffer);
		CardLibList::libList.push_back(buildApplet(dataBuffer,iDataLength));
	}
    下面看一个运行的示例:

	unsigned char* dataBuffer=new unsigned char[10000];
	int iDataLength = readBin(ijcFileName,dataBuffer);

	CardApplet* capp = (CardApplet*)buildApplet(dataBuffer,iDataLength);
	capp->displayInfo();

	capp->install();
	capp->process();
    可以看出,虚拟机把ijc文件读出后转换成c++类来存放,然后调用里面的方法。

    java card语言特点:

1.不支持动态加载 2.不支持安全管理 3.不支持finalization 4.不支持多线程 5.不支持克隆 6.不支持java包中部分访问控制 7.不支持某些关键字,数据类型,核心类

    applet的状态切换:


    applet应用代码包含install跟process函数,install正常来说就是调用构造函数,process的入参为apdu。

applet开发过程:


    jcardsim为java card runtime environment simulator,类似手机模拟器,是针对java card的模拟器,以proxyclass方法,用自己的class文件替换原先库中的class文件,把native方法替换或者屏蔽。从而实现在PC上运行卡上代码。

    本文介绍了javacard跟native的cos,当然只是介绍了个框框,总的来说native代码与javacard的底层都是C语言,基本就是一个简单的逻辑,主要是跟寄存器打交道。javacard的applet就是实现install跟process等接口,达到安装运行。另外还讲到的jcvm,后续会再讲解vm。到此uicc的相关知识就到此为止。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值