《UDS协议从入门到精通》系列——图解0x27:安全访问
Tip📌:本文描述中但凡涉及到其他UDS服务的,将陆续提供链接跳转方式以便快速了解他们。(各服务介绍持续更新中…)
学习UDS基础知识以及其他相关内容?>>>>>>>>> 返回专栏总目录 《UDS协议从入门到精通(UDS速查手册)》<<<<<<<<<
一、简介
1.1 什么是安全访问服务?
车载ECU中的一些数据或者操作是比较重要的,对于这种企业敏感的数据或者操作肯定不是人人都能访问的,诊断服务0x27应运而生。它主要用于车载ECU数据上传或者下载,传递重要信息以及敏感操作等过程中。即对请求执行操作的人进行鉴权,只有正确解锁对应的安全等级,才能访问该安全等级的数据,否则无法访问。
1.2 应用场景有哪些?
- 通常在向Flash中写数据时,都需要先执行0x27安全解锁之后才能进行安全写入,最常见的就是对ECU进行软件刷写时,需要先通过0x27安全解锁才能进行后续重编程操作,否则将对ECU造成极大的安全风险;
- 使用0x31服务执行十分重要的routine时,需要优先执行0x27进行安全解锁之后才能够执行对应的routine;
- 在产线写入较为重要的版本或者标定等信息过程中,需要先使用0x27服务才能使用写操作的诊断指令,如0x2E服务;
1.3 实现安全访问的基本原理是什么?
第一回合:
- Tester向目标ECU请求种子(“种子“:简单理解它就是个随机数)
- 目标ECU向Tester发送种子
第二回合:
- Tester基于接收到来自目标ECU的种子计算出对应的key并发送给目标ECU
- 目标ECU接收来自Tester算出来的key并与内部算出的key比较,如果一致则解锁成功,否则解锁不成功
请求+响应为一组,共两个来回,用图示方式看起来更直观一些:
Tips📌: 虽然该服务也支持抑制正响应,但由于该服务需要通过回复正响应或者负响应判断是否成功解锁,所以一般情况下针对0x27服务我们不会使能SPR位。
二、数据包格式
2.1 服务请求格式
该服务共两次请求+响应,两次请求数据包的格式不一样:
请求种子数据包:
发送 key数据包:
Tips📌:两个请求中sub-function: securityAccessType的含义
- “请求种子“数据包中,该字段必须为奇数;“发送key“数据包中该字段必须为偶数,不同的数字代表不同的安全等级
- 每一次完整的0x27服务流程中,“请求种子“和“发送key“两个数据包中该字段数值必须存在一个定量关系,即:
“请求种子“ 的securityAccessType + 1 == “发送key“ 的securityAccessType
例如: “请求种子“ 的securityAccessType= 0x01 ——> “发送key“ 的securityAccessType= 0x02
Tips📌:两次请求携带的数据含义
- securityAccessDataRecord: 传输到目标ECU端的标识性信息,一般不使用
- securityKey: Tester通过安全算法根据随机数种子计算出来的密钥值,发送给目标ECU
2.2 服务响应格式
2.2.1 肯定响应
securityAccessType:取值与请求中的sub-function值保持一致即可;
securitySeed:该参数仅在对应请求的sub-function为奇数(即“请求种子“)时才会有,其他情况下,目标ECU只会回复前两个字节(0x67 & sub-function),该参数取值范围只能为0x00-0x7F。
2.2.2 否定响应
可能出现的NRC及其含义如下:
NRC | 含义 |
---|---|
0x12 | 子功能参数不受支持 |
0x13 | 消息长度错误 |
0x22 | 不满足请求标准/条件 |
0x24 | 请求顺序错误,比如应该先发送请求种子,而不是先发送密钥数据 |
0x31 | 请求中携带的数据是无效的 |
0x35 | 密钥不匹配,即Tester计算出来的key和目标ECU计算出来的不一样:若始终不匹配还不断尝试, ECU会回复下面的NRC=36,告诉你已经超过失败的次数了,不能再请求安全解锁了 |
0x36 | 超过最大试错次数,已达到解锁最大错误次数,若你执意再请求,ECU就会回复你下面的NRC=37, 意思是ECU现在不接受安全访问,这就是ECU锁死的现象,需等待一定时间后才可继续请求安全访问 |
0x37 | 当前服务器处于延时状态,超时时间未到 |
Tips📌:
- ECU上电后,保持上锁状态,一般进入扩展会话才能请求0x27服务,而编程会话的安全等级与扩展会话的安全的等级不一致。所以如果想进行ECU软件刷写操作flash,那进入编程会话后一般还需要再请求0x27服务进入另一个安全等级。
- 若已成功解锁安全等级,再请求相同层级的解锁服务,ECU一般会回复的种子(随机数)为0。而未解锁的安全等级下,27服务中目标ECU发送来的随机数种子是不允许为0的。因此,可以通过判断种子的值得知当前安全等级是否处于解锁状态。
- 同一时刻,只允许有一个安全等级处于解锁状态。
- 安全等级的值没有特别的含义,不存在高低之分,比如解锁level3并不需要先处于level2。
三、通信示例
假设现在需要解锁目标ECU的安全等级1,并且此时目标ECU的这个等级处于上锁状态:
在上一步成功解锁安全等级1的基础上,继续发送解锁目标ECU的安全等级1的请求: