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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

书生·浦语大模型第二课作业

作业一:小故事创作 作业要求:使用 InternLM-Chat-7B 模型生成 300 字的小故事(需截图) 完成情况: 作业二:熟悉 hugging face 下载功能 作业要求:熟悉 hugging face 下载功能,使用…

Anaconda 环境中安装OpenCV (cv2)

1、使用Anaconda 的对应环境,查看环境中的Python版本号 (1)使用Anaconda 查看存在的环境:conda info --env (2)激活环境:conda activate XXX 2、根据版本号,下载对应的 python-opencv 包 (1)选择国内源的…

[MySQL]视图索引以及连接查询案列

目录 1.视图 1.1视图是什么 1.2视图的作用 1.3操作 1.3.1创建视图 1.3.2视图的修改 1.3.3删除视图 1.3.4查看视图 2.索引 2.1什么是索引 2.2为什么要使用索引 2.3索引的优缺点 2.3.1优点 2.3.2缺点 2.4索引的分类 3.连接查询案列 4.思维导图 1.视图 1.1视图是什么 视图…

el-table魔改样式出现BUG,表格内容区域出现滚动条

问题:el-table表格内容区域在高度自适应的情况下冒出滚动条 解决办法: 代码排查后发现时我设置了fixed:“xxx” 属性就会导致滚动条出现的问题,不设置则无。 [{ type: index, label: 序号, fixed: left },{ prop: enterprisesName, label: …

【C++】带你学会使用C++线程库thread、原子库atomic、互斥量库mutex、条件变量库condition_variable

C线程相关知识讲解 前言正式开始C官方为啥要提供线程库thread构造函数代码演示this_threadget_id()yield()sleep_until和sleep_for mutex构造函数lock和unlock上锁全局锁局部锁lambda表达式 try_lock 其他锁时间锁递归版本专用锁recursive_mutex 锁的异常处理lock_guardunique_…

springboot整合缓存技术

缓存(cache) 为啥需要使用缓存 问题描述:企业级应用主要作用是信息处理,当需要读取数据时,由于受限于数据库的访问效率,导致整体系统性能偏低。(就是说:应用程序直接与数据库打交道…

深入C++继承:面向对象编程的核心概念

C是一种功能强大的编程语言,支持面向对象编程(OOP)范式。在面向对象编程中,继承是一种重要的概念,它使得我们能够创建具有层次结构的类,并实现代码的重用和扩展。本文将深入探讨C中的继承机制,介…

[C#]C# OpenVINO部署yolov8-pose姿态估计模型

【源码地址】 github地址:https://github.com/ultralytics/ultralytics 【算法介绍】 Yolov8-Pose算法是一种基于深度神经网络的目标检测算法,用于对人体姿势进行准确检测。该算法在Yolov8的基础上引入了姿势估计模块,通过联合检测和姿势…

屏幕截图--Snagit

Snagit是一款优秀的屏幕、文本和视频捕获、编辑与转换软件。它不仅可以捕获静止的图像,还能获得动态的图像和声音。软件界面干净清爽,功能板块一目了然,为用户提供专业的屏幕录制方案。可以根据自己的需求调整录制视频的分辨率、帧数、输出格…

Linux学习记录——삼십유 传输层TCP协议(1)

文章目录 1、TCP协议报文1、报头和有效载荷的分离2、TCP可靠性3、序号和确认序号4、16位窗口大小5、6个标志位和紧急指针 2、TCP可靠性1、应答机制2、超时重传机制3、连接管理机制握手挥手 3、流量控制 1、TCP协议报文 UDP属于TCP/IP协议族。 1、报头和有效载荷的分离 从头…

邮件群发怎么做才有效果?如何做邮件群发?

邮件群发的注意事项有哪些?QQ邮箱群发邮件的方法? 在当今的数字营销时代,邮件群发已成为企业与客户保持联系的重要手段。但如何确保邮件群发的效果最大化呢?下面,蜂邮EDM将探讨几个关键要素,帮助您更有效地…

HackTheBox - Medium - Linux - Ambassador

Ambassador Ambassador 是一台中等难度的 Linux 机器,用于解决硬编码的明文凭据留在旧版本代码中的问题。首先,“Grafana”CVE (“CVE-2021-43798”) 用于读取目标上的任意文件。在研究了服务的常见配置方式后,将在其…

阿里云服务器在哪个城市?云服务器地域节点分布表

2024年阿里云服务器地域分布表,地域指数据中心所在的地理区域,通常按照数据中心所在的城市划分,例如华北2(北京)地域表示数据中心所在的城市是北京。阿里云地域分为四部分即中国、亚太其他国家、欧洲与美洲和中东&…

C++20新特性解析:深入探讨协程库的实现原理与应用

C20新特性解析:深入探讨协程库的实现原理与应用 一、C20的协程库简介二、C20协程基础知识2.1、协程的基本概念和使用方法2.2、C20中的协程支持2.3、协程与传统线程的对比 三、C20协程库的实现原理四、C20协程库的应用实例总结 一、C20的协程库简介 C20引入了对协程…

2024年 复习 HTML5+CSS3+移动web 笔记 之HTML5遍

2023年黑 马学习视频 ---作复习!!! 前言 和 路向 第一天 基础标签 1.开发环境安装 2.标签语法 3.Html 基本骨架 4.标签的关系 5.注释 6.标题标签 7.段落标签 8.换行与水平线标签 9.文本格式化标签 10.图像标签 11.路径(绝对和相…

k8s之pod的基础(下)

k8s的pod重启策略 Always deployment的yaml文件只能是Always pod的yaml三种模式都可以,不论正常退出还是非正常退出都重启 OnDailure: 只有状态码非0才会重启。正常退出是不重启的 Never 正常退出和非正常退出都不重启 容器的退出了,pod才…

【软件测试】软件开发各阶段的自动测试技术

说到自动化测试,你可能最为熟悉的就是GUI自动化测试了。比如,早年的C/S架构,通常就是用自动化测试脚本打开被测应用,然后在界面上以自动化的方式执行一系列的操作;再比如,现今的Web站点测试,也是…

模板元编程简介

从引入 template 关键字开始,C里就出现了泛型编程,而又泛型编程衍生出的模板元编程(template meta_programming,简称“元编程”)则是众多编程范式中最复杂、最强大和最具有权威的一种。所谓“元编程”——metaprogramm…

学习笔记——C++ 逢七过 问题

试用for循环语句解决以下案例: 案例描述:从1开始数到数字100,如果数字个位含有7,或者数字十位含有7,或者该数字是7的倍数,我们打印敲桌子,过,其余数字直接打印输出。 思路&#xf…

C++进阶--map和set的介绍及使用

map和set的介绍及使用 一、关联式容器与键值对关联式容器键值对pair树形结构的关联式容器 二、set2.1 set的介绍2.2 set的使用2.2.1 set的模板参数列表2.2.2 set的构造2.2.3 set的迭代器2.2.4 set的容量2.2.5 set修改操作2.2.6 set的使用举例 三、multiset3.1 multiset的介绍3.…