CCC数字钥匙设计【NFC】--NFC通信之APDU TLV

CCC3.0,包含NFC、BLE、UWB技术。当采用NFC通信时,车端与手机端是通过APDU来进行交互的。而在APDU中的data数据段,又可能会嵌入TLV协议的数据,以完成车端与手机端的通信交互。

本文先介绍APDU及TLV的一些基础知识,再通过示例说明下,车端与手机端是如何进行通信交互的。

1、什么是APDU?

APDU,应用协议数据单元,英文全称为Application Protocal Data Unit。APDU是无线通信中的一种协议,用于在NFC设备之间传递数据。

APDU分为发送命令(C-APDU)返回命令(R-APDU)

APDU包含一条指令或响应信息。在智能卡的世界里采用的是主从模式,而智能卡永远扮演从的角色

在CCC数字钥匙系统中,手机扮演的是智能卡的角色。

换句话说,手机总是在等待来自终端(车端模块)的命令APDU(C-APDU。随后,手机执行APDU规定的动作,并以一个 应答APDU(R-APDU向终端(车端模块)作出回答。

下图,前面绿色背景部分是命令APDU,后面蓝色背景部分是响应APDU。

两种命令的数据格式简化描述如下:

上表【】中的内部为可选部分。

具体展开描述如下。

1.1命令APDU

发送命令(C-APDU)的格式如下,包含一个必须头部段和一个可选数据段。

1.1.1命令详细解析

下面对命令APDU的每个字段展开介绍:

1)类别码CLA(1字节)

类别码字节,用于命令类别的标示。在很多智能卡上,这个字节用来表示应用程序。

如0x00表示标准指令集,0x80表示安全指令集。具体详见ISO IEC 7816-4-2020的第5.4章节

CCC3.0规范规定4 个CLA类别,如下表:

2)命令码INS(1字节)

表示指令代码(instruction)。

1) b1(即最低位)指明数据字段格式

b1=1,即该INS为奇数,数据字段按BER-TLV编码。--详见ISO IEC 7816-4-2020的8.1章节

b1=0,即该INS为偶数,不提供数据字段格式的指示

2) 6X和9X为无效的INS。

具体详见ISO IEC 7816-4-2020的第5.5章节

3)参数P1(1字节)

指令参数1,如果没有,则填0

4)参数P2(1字节)

指令参数2,如果没有,则填0

5)Lc(1字节)

可选字段,指的是命令的数据字段的字节数。

6)Data Field

可选字段,采用TLV数据格式进行填充。

7)Le(1字节)

可选字段,指定在期望响应的数据字段中的最大字节数。

1.1.2四种C-APDU结构

上图4种Case分别说明如下:

  • Case1: CLA INS P1 P2

    命令中没有数据送到卡(Lc)中,也没有数据从卡中返回(Le)。

  • Case2: CLA INS P1 P2 Le

    命令中没有数据送到卡( Lc)中,有数据从卡中返回( Le)。

  • case3 : CLA INS P1 P2 Lc Data

    命令中有数据送到卡( Lc)中,没有数据从卡中返回( Le)

  • case4 : CLA INS P1 P2 Lc Data Le

    命令中既有数据送到卡( Lc)中,也有数据从卡中返回( Le)。

1.2、响应APDU

响应命令(R-APDU)的格式如下,包含一个必须头部段和一个可选数据段。

R-APDU由一个可变长度的Data Field和两个字节Tailer组成,具体报文格式如下图:

其中CCC规范使用了如下几个Status Word充当SW1-SW2,具体可详见CCC3.0规范15.3章节。

2、什么是TLV?

TLV协议是BER编码的一种,全称是Tag、Length、Value。该协议简单高效,能适用于各种通信场景,且具有良好的可扩展性。

有如下两种编码方式:

方式1:基础类型Primitive Data编码(单一编码)--当Tag的bit5=0时

方式2:结构类型Constructed Data编码(嵌套编码)--当Tag的bit5=1时

具体采用哪一种编码方式,取决于Tag字节中的bit5。

2.1Tag

Tag由一个或多个字节组成,下图描述首字节0~7位的具体含义

① Tag首字节说明

  • Bit6~7:表示TLV的类型

  • Bit5:表示Value的编码方式,分别支持Primitive及Constructed两种编码方式。

0:为Primitive Data编码,即后续的Value未嵌套TLV

1:为Constructed Data编码,即后续的Value有嵌套TLV

  • Bit0-4:当Tag Value小于0x1F(31)时,首字节0~4位用来描述Tag Value,否则0~4位全部置1,作为存在后续字节的标志,Tag Value将采用后续字节进行描述。

② Tag后续字节说明

后续字节采用每个字节的0~6位(即7bit)来存储Tag Value, 第7位用来标识是否还有后续字节

  • Bit7:用来描述是否还有后续字节,1表示有后续字节,0表示没有后续字节,即结束字节。

  • Bit0~6:填充Tag Value的对应bit(从低位到高位开始填充)。

如:Tag Value为:0000001 11111111 11111111 (即16进制:0x1FFFF),填充后实际字节内容为:10000111 11111111 01111111。

整体的Tag值应该为XXX11111 10000111 11111111 01111111

CCC3.0规范中使用的Tag,最长为2字节。

2.2Length

用来描述Value的长度。

描述Value部分所占字节的个数,编码格式分两类:定长方式(DefiniteForm)和不定长方式(IndefiniteForm)。

当第一个Length取值为0x80时,则为不定长方式。其他值,则为定长方式。

2.2.1定长方式

定长方式中,按长度是否超过一个字节,又分为短、长两种形式,编码方式如下:

  • 短形式Length占用1个字节):

字节第7位为0,表示Length使用1个字节即可满足Value类型长度的描述,范围在0~127之间的。

  • 长形式(Length占用多个字节):

即Value类型的长度大于127时,Length需要多个字节来描述,这时第一个字节的bit7为1,bit0~6用来描述Length值占用的字节数。然后将Length值转为byte后附在其后。

如:Value大小占202个字节(11001010),由于大于127,这时Length需要使用两个字节来描述,如下:

10000001 11001010

示例中绿色的1,表示后面的length占用1字节;

示例中蓝色11001010,表示length为202;

示例2:

若Value需占用0x114578个字节,则Length取值如下:0x83114578

2.2.2不定长方式

Length所在八位组固定编码为0x80,但在Value编码结束后以两个0x00结尾。这种方式使得可以在编码没有完全结束的情况下,可以先发送部分数据给对方。

2.3Value

Value中存放需交互的数据。

但其里面可能还嵌套着其他TLV的值,具体需根据本TVL中Tag的bit5来确定。

3、示例Select Command发送与响应

CCC规范中要求SELECT command的通信数据格式如下,具体详见CCC规范15.3章节:

command: CLA1 A4 04 00 Lc [instance AID] 00

response: [Table 15-12] 90 00

CLA1取值为0,如下表:

Table15-12的定义如下:

根据前面APDU及TLV的知识,解析该Select Command命令的发送数据与响应数据,具体分析如下:

Command实际发送数据可能为:00 A4 04 00 0D A000000809434343444B467631 00,具体分析如下表:

Response实际响应数据可能为:5C 04 01 00 01 10 90 00,具体分析如下表:

4、总结

1) 车端与手机端通过APDU来进行NFC通信交互。

2) APDU分为发送命令(C-APDU)和返回命令(R-APDU)。数据格式简化描述如下表:

指令

格式

命令APDU

CLA INS P1 P2 【Lc Data】【Le】

响应APDU

【Data】 SW1 SW2

3) APDU中的data数据段,又可能会嵌入包含TLV的通信协议的数据。

4) TLV,即该数据包可以分为三个部分Tag,Length,Value。

5) TLV数据可单一发送,也可以嵌套发送,具体根据本Tag的bit5来决定

6) Tag取值 1~n个字节,但一般最多为4字节。CCC使用的长度为1-2字节。

7) Length取值长度为1~n字节,但一般最多为4字节。

5、参考文章

1.http://www.3scard.com/index.php?articleID=11&f=read&m=book

2.https://blog.csdn.net/Hakuryou/article/details/107289012

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/603753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

断更后的故事1

文章目录 技术男为何开始写感悟博客?简单的自我介绍为什么断更了默默进化的日子琐碎的事情对阶段1的思索和总结 技术男为何开始写感悟博客? 其实我是一个偏感性的一个技术男,可能这样就有点违背技术男这个定义了,很多时候还是挺理…

全连接网络、卷积神经网络、递归神经网络 通俗的解释

全连接网络、卷积神经网络和递归神经网络是三种不同类型的神经网络,它们在结构和应用上有所不同。下面我将尽量用通俗易懂的语言来解释和对比这三种神经网络。 1.全连接网络 全连接网络是一种最常见的神经网络类型,它的每一层都由许多神经元组成&#…

SSH 密钥身份验证和管理

安全外壳协议(Security Shell Protocol)是一种应用于计算机网络的安全通信协议,其提供的服务可用于保护网络上的连接和数据传输安全性,其核心思想是为网络上的两台计算机之间搭建一个安全的外壳,以保护数据传输的安全性…

简单介绍Java 的内存泄漏

java最明显的一个优势就是它的内存管理机制。你只需简单创建对象,java的垃圾回收机制负责分配和释放内存。然而情况并不像想像的那么简单,因为在Java应用中经常发生内存泄漏。 本教程演示了什么是内存泄漏,为什么会发生内存泄漏以及如何预防…

2、C语言:控制流

控制流 语句:在表达式后面加上分号,构成语句。 程序块:用一对花括号“{”与“}”把一组声明和语句括在一起就构成了一个复合语句。复合语句在语法上等同于单条语句。 if-else语句else-if语句:从上到下依次执行,等同于…

视频云存储/视频智能分析平台EasyCVR在麒麟系统中无法启动该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

【docker】网络模式管理

目录 一、Docker网络实现原理 二、Docker的网络模式 1、host模式 1.1 host模式原理 1.2 host模式实操 2、Container模式 2.2 container模式实操 3、none模式 4、bridger模式 4.1 bridge模式的原理 4.2 bridge实操 5、overlay模式 6、自定义网络模式 6.1 为什么需要…

017、使用包、单元包及模块来管理日渐复杂的项目

在编写较为复杂的项目时,合理地对代码进行组织与管理很重要,因为我们不太可能记住代码中所有的细枝末节。只有按照不同的特性来组织或分割相关功能的代码,我们才能够清晰地找到实现指定功能的代码片段,或确定哪些地方需要修改。 到…

【UML】第14篇 协作图

目录 一、协作图的概述 二、协作图的主要构成 2.1 对象 2.2 消息 2.3 链 三、协作图如何画 3.1 思路 3.2 步骤 这个系列暂停了好几天了,适当时候再恢复一下。 UML非常经典,只要在这个行业,代码可能不会写一辈子,但是图肯定…

Java socket编程学习笔记

一、初步了解 1、简易代码(存在socket提前关闭问题) 服务端代码: import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets;public class MySocketServer {public static void main(String[] args) throws IOEx…

js判断是否为数字的方法

找到一个比较好用的方法,记录下来,方便以后使用查找 function isNumber(value) {return !isNaN(parseFloat(value)) && isFinite(value); }目前测试情况: isNumber(123) —> true isNumber(12.3) —> true isNumber(-12.3) —…

阿里2面:万亿级消息,如何做存储设计?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、shein 希音、百度、网易的面试资格,小伙伴在面阿里时,遇到了一个存储设计相关的面试题: 存储架构,…

Ubuntu 虚拟机挂接 Windows 目录

Windows 共享目录 首先 Windows 下共享目录 我这里偷懒直接直接 Everyone ,也可以指定用户啥的 Ubuntu 挂接 挂接命令,类似如下: sudo mount -o usernamefananchong,passwordxxxx,uid1000,gid1000,file_mode0644,dir_mode0755,dynperm //…

leetcode09-机器人能否返回原点

题目链接: https://leetcode.cn/problems/robot-return-to-origin/?envTypestudy-plan-v2&envIdprogramming-skills 思路: 循环遍历,模拟即可 代码: class Solution {public boolean judgeCircle(String moves) {int n m…

5.云原生安全之kubesphere应用网关配置域名TLS证书

文章目录 cloudflare配置使用cloudflare托管域名获取cloudflare API Token在cloudflare中配置SSL/TLS kubesphere使用cert-manager申请cloudflare证书安装证书管理器创建Secret资源创建cluster-issuer.yaml创建cert.yaml申请证书已经查看申请状态 部署harbor并配置ingress使用证…

C++中的面向对象重点总结

面向对象的三大特性 封装 封装是将数据和操作这些数据的函数(方法)组合在一个类中的过程。 封装的主要目的是隐藏类的内部实现细节,仅暴露必要的接口给外部,通过控制类成员的访问级别,可以限制对类内部数据的直接访…

【面试】Redis基础知识

题目 为什么Redis是单线程却性能很高? Redis是一个高性能的基于内存的键值存储系统。它之所以能够达到高性能,主要有以下几个原因: 基于内存:Redis将数据存储在内存中,而不是硬盘上,这使得数据的读写速度…

回首2023,期待2024!

2023,在改变中到来 2023年1月1日,我从成都冷清的学校回到了哈尔滨的老家,开始了保研之前的最后一个寒假 当时的目标是将之前的科研理论转化为实际,生产出一篇sci,助力保研加分 星移斗转,事与愿违&#x…

编译ZLMediaKit(win10+msvc2019_x64)

前言 因工作需要,需要ZLMediaKit,为方便抓包分析,最好在windows系统上测试,但使用自己编译的第三方库一直出问题,无法编译通过。本文档记录下win10上的编译过程,供有需要的小伙伴使用 一、需要安装的软件…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)子线程 WorkerThread的实现 和 线程池ThreadPool的初始化

一、子线程 WorkerThread的实现 (1)工作线程 线程ID:每个线程都有一个唯一的ID,用于标识线程的名字:非必需,主要用于识别线程互斥锁:线程同步条件变量:线程阻塞EventLoop:在每个子…