• 【车载开发系列】UDS诊断---安全访问服务($0x27)


    【车载开发系列】UDS诊断—安全访问服务($0x27)

    一.概念定义

    该服务提供了一种保护机制,该机制用来保护访问限制的诊断服务。
    加密策略采用种子和密钥相关联的方法。采用随机产生的种子,通过安全算法得到唯一的秘钥。
    若秘钥匹配正确则可以调用受到保护的诊断服务。这个服务解锁的是处在某个安全等级下的服务。

    二.安全控制过程

    1. 诊断工具请求种子;
    2. ECU发送种子,并根据安全算法计算密钥;
    3. 诊断工具根据接收到的种子也进行密钥计算,并进行发送;
    4. ECU接收到密钥,与自身计算的密钥进行比较;
    5. ECU根据比较结果决定自身是否解锁,并返回响应(肯定/否定响应)信息
      在这里插入图片描述

    三.报文格式

    1)请求种子

    以请求进入01安全等级为例(请求Seed的"Sub-function"不一定要是01,也可以是03、05,或者07-7D之间的任意奇数值,代表不同的安全等级),则此时请求种子的格式如下:
    在这里插入图片描述
    ECU收到请求后,应当生成随机的种子,并通过响应报文返回种子。响应报文格式如下:
    其中种子及密钥均为 4 字节(32 位)的数值
    在这里插入图片描述在这里插入图片描述

    2)发送密钥

    以请求进入01安全等级为例,在接收到前面一小节生成的种子后,诊断工具将根据车产定义的安全算法进行密钥的计算。并进行密钥的发送。此时密钥的发送格式如下:
    (发送密钥时的第二个字节值不一定就是02(01+1),可以是04、06,或者08-7E间的任意偶数值,不过注意要是之前请求Seed的"Sub-function"+1,即像01对应02,03对应04,07对应08这样对应起来。)
    在这里插入图片描述
    ECU收到SendKey之后,肯定响应报文格式如下:
    在这里插入图片描述

    3)否定响应

    请求Seed和SendKey他们两个在失败的时候,都返回以下格式的否定响应。在这里插入图片描述

    四.否定响应码列表

    如果诊断工具发送一个无效的密钥,ECU拒绝请求并发送否定响应码 35h“密钥无效(InvalidKey),安全访问失败计数加 1。该计数器的初始值为零。
    当失败计数器数值达到一定回数时,ECU 需要等待10 秒方可接受下次“请求种子”(Request Seed)报文并返回 36h(请求次数超出限制)否定响应。
    在这 10s 内,任何“SecurityAccess- RequestSeed”都将不被处理,且 ECU 返回 37h(延时时间未到)否定响应。
    对于35/36/37这三个错误码,需要比较关注一下。这三个错误往往是成对出现的。

    Hex(bit6~0)Description描述说明
    0x12subFunctionNotSupported功能不支持如果子功能参数不支持,发送此否定响应码
    0x13incorrectMessageLengthOrInvalidFormat报文长度错误如果报文长度错误,发送此否定响应码
    0x24requestSequenceError请求序列错误在接收到“sendKey”子功能前没有先接收到“requestSeed”请求报文
    0x35invalidKey密钥无效接收到预期的“sendKey”子功能但是密钥值与 ECU 内部存储或计算的密钥不相等
    0x36exceededNumberOfAttempts超出密钥访问次数限制延迟定时器因为超过最大允许失败尝试的次数激活
    0x37requiredTimeDelayNotExpired超时周期未到,延时时间未到在 ECU 要求的超时周期未到之前,发送了尝试获取安全访问权限的请求报文

    五.参数定义

    子功能关联的安全等级由整车厂定义。在这里我们只要知道0x01和0x02输入一个安全级,而0x09和0x0A输入一个安全级别,必须成对的使用。

    HexDescription描述
    0x01requestSeed to reach security level: Unlocked (Level 1)请求种子以进入安全级别:解锁(级别 1)
    0x02sendKey to reach security level: Unlocked (Level 1)发送密钥以进入安全级别:解锁(级别 1)
    0x09RequestSeed to reach security level: Unlocked (Flash,Level2)请求种子以进入安全级别:解锁(级别 2)
    0x0AsendKey to reach security level: Unlocked (Flash,level2发送密钥以进入安全级别:解锁(级别 2)

    在某一时间只有一个安全级别可以被激活。例如,如果与请求种子 09h 相关联的安全级别已激活,而诊断工具成功请求解锁与请求种子 01h相关联的安全级别,此时只有与请求种子01h相关联的安全级别支持的受限功能被解锁。

    六.注意事项

    1. ECU上电或者Reset复位操作之后, ECU处在locked状态;
    2. 同一时刻只有1个安全等级是 active ,与这个安全等级相关的功能和诊断服务可以使用,其它安全等级相关功能和诊断服务是not active 。
    3. 1个ECU内部可以有多个安全等级,安全等级之间是否关联取决于诊断规范的定义,如果没有关联,就是例如解锁安全等级2时,无需先解锁安全等级1.
    4. 如果当收到RequestSeed时,ECU已经处在unlocked状态,应给出positive response, 其中seedValue 0x00
    5. 具体的安全加密算法由车厂自行决定的。
    6. SecurityAccess服务定义了三种状态(两个不同级别):锁
      定、解锁(级别 1)、解锁(级别 2)
  • 相关阅读:
    SparkSql中的窗口函数
    Excel 数学
    gd32部分映射1/2,完全映射,备用功能选择等
    全志H616语言控制刷抖音小项目(守护进程、udev机制)
    递归代码和动态规划代码相互转化
    基于CMake的C++项目管理实践
    【C++】String -- 详解
    你听说过OTA吗?
    c++模板
    RabbitMQ、RocketMQ、Kafka常见消息队列不得不知道的事
  • 原文地址:https://blog.csdn.net/Last_Impression/article/details/128041782