功能简介
27服务,即 SecurityAccess
(安全访问)服务,安全理念采用的是种子与密钥式关系。
应用场景
常见场景:
- 在针对Server重新编程时,需要首先通过27安全解锁才能够进行后续的重编程操作,否则将对Server造成极大的安全风险;
- 在产线写入较为重要的版本或者标定等信息过程中,则首先需要使用27服务才能够使用写操作的诊断指令,如2E服务;
- 一般而言,如果需要往Flash中写入相关数据时都需要优先执行27安全解锁之后才能够进行安全写入;
- 执行十分重要的31 Routine时,也需要优先执行27安全解锁之后才能够执行对应的routine;
安全解锁基本原理
针对27服务的安全解锁的过程是基于Seed-Key 机制来实现,具体过程可分为以下四个阶段:
- Client向Server请求种子;
- Server向Client发送随机种子;
- Client基于接收到来自Server的随机种子计算出对应的Key并发送给到Server;
- Server接受来自Client算出来的Key并与内部算出的Key比较,如果一致则解锁成功,否则解锁不成功;
请求和响应
1、请求
基本格式
归纳起来,诊断的request格式无非以下两种:
<SID> + <Sub-function> + <Parameter>
<SID> + <Parameter>
即有无sub-function的区别。Parameter可以是DID,可以是输入参数,可以是自定义的值,字节数视具体要求而定。
2、子功能
子功能参数定义(1字节数据):
- Bit7:抑制肯定响应消息指示位suppressPosRspMsgIndicationBit
- 0=False:需要肯定响应
- 1=True:禁止肯定响应
- Bit6-0:子功能参数值(0x00~0x7F)
简单来说,不同安全级别的请求种子和发送密钥是一一对应的,相邻的一对奇偶数对应一种安全级别,其中奇数代表请求种子,偶数代表发送密钥,例如:
0x01
和 0x02
分别代表一个安全级别的请求种子和发送密钥0x03
和 0x04
分别代表另一个安全级别的请求种子和发送密钥
3、肯定响应
基本格式:
<SID + 0x40> + <Sub-function> + <Parameter>
<SID + 0x40> + <Parameter>
要注意,第一个字节是由SID和0x40的和构成。这里的Parameter项是optional的,具体要看协议规定。
4、否定响应
基本格式:
<0x7F> + <SID> + <NRC>
看起来比较简单,格式比较固定,只要是Negative Response,第一字节就是0x7F,第二字节照抄原来的SID,第三个字节是错误响应码,指示具体错误响应的原因
注意
- 1、请求种子和发送密钥的数字大小并不代表其等级的高低。
- 2、同一时刻最多只能有一个安全等级是解锁的状态,因此从一个安全等级接收到另外一个等级的请求并且解锁成功后,之前的安全等级将被重新锁定,而由于切换安全等级致使先前解锁的状态被锁定后,其依赖于被锁定的等级的服务和功能也一并被关闭。
- 3、如果被请求的安全等级当前是已经解锁的状态,那么在响应种子时,在放种子的位置都放上0,表示已经解锁了,你不要再请求了。并且实际上种子应该是一个随机数,一般全0和全F都不允许作为普通种子放到响应里
报文示例
UDS中常用 NRC
参考
- https://zhuanlan.zhihu.com/p/446348996