1、NFC中的AID是什么?
AID,英文全称为Application Identifier,这是NFC技术中的概念,AID用于唯一标识一个应用。
NFC应用的AID相关操作,包括注册和删除应用的AID、查询应用是否是指定AID的默认应用、获取应用的AID等 。
2、AID的组成
根据标准GB/T16649.5,AID由两个部分组成:RID(5字节) + PIX(0 - 11字节)
RID(5字节):注册标识符,由ISO组织分配,标识一个全球唯一的应用提供商。一般是分配给相关卡组织,比如分配给 Master、银联等。
PIX(0 - 11字节):扩展应用标识符,一般由应用提供商自己定义。
示例:数字钥匙的AID为A000000809434343444B467631
共占用13字节,前5字节为RID,后8字节为PIX,具体解析如下:
前5 字节A000000809为RID。
后8字节434343444B467631为PIX,该数据串解析成ASCII码为CCCDKFv1,其意思就是CCC Digital Key Framework version 1。
3、相关流程
目前常见的NFC智能IC卡上运行着 JavaCard 虚拟机,NFC智能 IC 卡上可以运行由精简后的 Java 语言编写的卡应用(简称 Applet)。
NFC智能 IC 卡的 Applet 不能自己启动,必须由外部终端(例如 POS 机,地铁刷卡终端等)向卡片发送 Select 命令,由此选中卡片中的 Applet,Applet 才能运行。
Applet 侧重于数据的处理,没有类似MCU的相关 I/O 功能。
Applet 的程序有生命周期和指定入口,具体如下:
3.1 public static void install(byte[] bArray, short bOffset, byte bLength)
该函数构建了 Applet 子类的实例,JCRE ( Java Card Runtime Environment )将会最先调用这个,所有的初始化和分配内存的操作在这个里面实现,可以获取卡外实体传进来的一些应用初始化参数。
3.2 public void process(APDU apdu)
类似于正常 java class 的 main,在安装后,APDU 的执行将在这里实现。
3.3 protected final void register()
applet 用来在 JCRE 中注册该 applet 实例。
另外还有函数register(byte[] bArray, short bOffset, byte bLength),和register() 功能一样,但其增加了可以分配其特定的 AID 的功能。
3.4 public boolean select()
JCRE 一旦接收到 SELECT[by name] 命令时,将寻找命令中指示的 AID 对应的 Applet,使之处于激活状态,接收并处理接下来的 APDU 命令;
在选择新的 Applet 前,JCRE 先调用当前 Applet 的 deselect 方法;
Applet 可以拒绝被选择,此时 select 方法返回 false;SELECT[by name] 命令本身也将传递给 applet 处理,此时通过 selecting Applet 用以判断当前状态。
4、总结
- AID用于唯一标识一个应用,故AID标识的不是NFC卡,而是NFC卡中的applet。
- 数字钥匙的AID为A000000809434343444B467631
- 车端的NFC读卡器发起的select命令中包含数字钥匙的AID,NFC设备(如手机或NFC卡片)接收到该AID命令后,激活其中数字钥匙的Applet。
- 之后NFC设备(如手机或NFC卡片)即可以和车端模块进行数字钥匙功能相关交互。
5、参考
- 参考文章:https://blog.csdn.net/liwei16611
- 参考标准:CCC-TS-101-Digital-Key-R3.pdf