Applet执行流程
本篇简单地以JCOP Shell工具为例讲讲Applet执行流程。
无论是JCOP Shell工具,抑或是其他的执行Applet的工具,遵循的都是一套规范,要执行Applet,都要做好那几个工作(包括外部认证、下载cap文件到卡片、安装Applet、选定AID等操作),最终转换成APDU指令(也就是那一堆十六进制的字节)都是一样的,卡片可不管你用啥工具发,只要发给我的APDU指令遵循规范格式就行了。
/term:打开终端(针对JCOP Shell,与通信无关)
/card:重置卡片,选择GlobalPlatform平台卡片管理器,类似于让卡片准备好状态吧
set-key:注册密钥,呆会外部认证要密钥,内部认证是在卡片处理的,外部认证表示在卡片外(如PC)进行的处理
init-update:执行初始化更新命令,CardManager开始认证。相当于密码算法中的init和update,初始化密钥和模式等
ext-auth plain:完成外部认证
delete:从卡片中删除应用或文件包。删除该id的applet/pakage,如果有。返回值表明之前并没有这个id的applet/pakage
upload:将cap文件加载到卡片中。把cap传输到卡片上去。后面是工具对一系列返回值的自动往下处理
install:使用AID安装并注册应用(需要身份验证),注意手动安装时要在参数中指定C9标记。
card-info:获取卡片中包涵的应用和文件包信息。让卡片返回卡片AID、状态、Applet_ID等信息
/select:通过给定的AID选择卡片中的应用。
/send:通过JCShell发送给卡片一个无条件命令。
上面提到cap文件,这里简单说一下自己看到的对cap文件的一些解释。因为javacard使用的java语言跟标准java不同,算是缩小版java,包括用的库也不太同,所以不同于标准java中间文件是.class文件,javacard这里,给虚拟机执行的中间文件是cap文件,是经过处理之后发送并保存到卡片的文件形式。然后因为javacard使用的java语言不同于标准java,所以编译也不同,javacard自己在某处看到是说先转成标准java再编译,然后再扔给虚拟机执行。
再扯扯java语言所谓的硬件无关,说java语言硬件无关可移植到任意平台,那是因为在java里面多了虚拟机(JVM)这一层,所以虚拟机其实是硬件相关的,举个例子,就像排插一样,上层我不管你里面硬不硬件相关,JVM你这一层反正给我提供一个统一的“插口”(API接口)就行了,其他硬件相关的事情你去搞定它。就是这个意思。所以java相比于C/C++,它其实是通过添加了一层,JVM,屏蔽了下层硬件相关的东西,顶层编写java代码你只需要关注我提供给你们的统一的接口就行了,那不就是硬件无关,代码一次编写,到处机子执行么!
至于C/C++、java这两种语言怎么相互协作的,其实貌似有工具可以使程序员用C/C++&java混合使用来编程了。这么理解,无论是C/C++还是java,最终都是要转化成0101的机器码执行的,只要你编译器足够强大,提供了这样的编译,啥语言都混着来用都OK啦!你能把它们转化成汇编代码然后机器码就行,最终给硬件执行的还不是同样的东西,就是0101。所以可以知道,在C/C++到java的过渡这里,肯定会有个强大的转换工具(编译器or解释器?),这是java之父java创建者干的事,编程语言谁都可以提一个自己觉得好的出来,但是你得提供个强大的编译器去把你的语言编出来的代码转成汇编/机器码才是最基础的。