该服务提供了一种保护机制,该机制用来保护访问限制的诊断服务。
加密策略采用种子和密钥相关联的方法。采用随机产生的种子,通过安全算法得到唯一的秘钥。
若秘钥匹配正确则可以调用受到保护的诊断服务。这个服务解锁的是处在某个安全等级下的服务。
以请求进入01安全等级为例(请求Seed的"Sub-function"不一定要是01,也可以是03、05,或者07-7D之间的任意奇数值,代表不同的安全等级),则此时请求种子的格式如下:
ECU收到请求后,应当生成随机的种子,并通过响应报文返回种子。响应报文格式如下:
其中种子及密钥均为 4 字节(32 位)的数值
以请求进入01安全等级为例,在接收到前面一小节生成的种子后,诊断工具将根据车产定义的安全算法进行密钥的计算。并进行密钥的发送。此时密钥的发送格式如下:
(发送密钥时的第二个字节值不一定就是02(01+1),可以是04、06,或者08-7E间的任意偶数值,不过注意要是之前请求Seed的"Sub-function"+1,即像01对应02,03对应04,07对应08这样对应起来。)
ECU收到SendKey之后,肯定响应报文格式如下:
请求Seed和SendKey他们两个在失败的时候,都返回以下格式的否定响应。
如果诊断工具发送一个无效的密钥,ECU拒绝请求并发送否定响应码 35h“密钥无效(InvalidKey),安全访问失败计数加 1。该计数器的初始值为零。
当失败计数器数值达到一定回数时,ECU 需要等待10 秒方可接受下次“请求种子”(Request Seed)报文并返回 36h(请求次数超出限制)否定响应。
在这 10s 内,任何“SecurityAccess- RequestSeed”都将不被处理,且 ECU 返回 37h(延时时间未到)否定响应。
对于35/36/37这三个错误码,需要比较关注一下。这三个错误往往是成对出现的。
Hex(bit6~0) | Description | 描述 | 说明 |
---|---|---|---|
0x12 | subFunctionNotSupported | 功能不支持 | 如果子功能参数不支持,发送此否定响应码 |
0x13 | incorrectMessageLengthOrInvalidFormat | 报文长度错误 | 如果报文长度错误,发送此否定响应码 |
0x24 | requestSequenceError | 请求序列错误 | 在接收到“sendKey”子功能前没有先接收到“requestSeed”请求报文 |
0x35 | invalidKey | 密钥无效 | 接收到预期的“sendKey”子功能但是密钥值与 ECU 内部存储或计算的密钥不相等 |
0x36 | exceededNumberOfAttempts | 超出密钥访问次数限制 | 延迟定时器因为超过最大允许失败尝试的次数激活 |
0x37 | requiredTimeDelayNotExpired | 超时周期未到,延时时间未到 | 在 ECU 要求的超时周期未到之前,发送了尝试获取安全访问权限的请求报文 |
子功能关联的安全等级由整车厂定义。在这里我们只要知道0x01和0x02输入一个安全级,而0x09和0x0A输入一个安全级别,必须成对的使用。
Hex | Description | 描述 |
---|---|---|
0x01 | requestSeed to reach security level: Unlocked (Level 1) | 请求种子以进入安全级别:解锁(级别 1) |
0x02 | sendKey to reach security level: Unlocked (Level 1) | 发送密钥以进入安全级别:解锁(级别 1) |
0x09 | RequestSeed to reach security level: Unlocked (Flash,Level2) | 请求种子以进入安全级别:解锁(级别 2) |
0x0A | sendKey to reach security level: Unlocked (Flash,level2 | 发送密钥以进入安全级别:解锁(级别 2) |
在某一时间只有一个安全级别可以被激活。例如,如果与请求种子 09h 相关联的安全级别已激活,而诊断工具成功请求解锁与请求种子 01h相关联的安全级别,此时只有与请求种子01h相关联的安全级别支持的受限功能被解锁。