SecurityAccess(0x27)服务
此服务的目的是提供访问数据和/或诊断服务的手段,这些服务因安全,排放或安全原因而受到限制。 用于将
例程或数据下载/上传到服务器和从服务器读取特定存储器位置的诊断服务是可能需要安全访问的情况。 下载
到服务器的不正常程序或数据可能会损坏电子设备或其他车辆部件,或者导致车辆遵守排放,安全或安全标准。
安全概念使用种子和密钥关系。
使用此服务的典型示例如下所示:
客户端请求“种子”,
服务器发送“种子”,
客户端发送“密钥”(适用于接收的种子),
服务器响应“密钥”有效,并且它将自行解锁。
'requestSeed’子功能参数值应始终为奇数,并且相同安全级别的相应 'sendKey’子功能参数值应等于
'requestSeed’子功能参数值加1。
在任何时刻只有一个安全级别处于活动状态。 例如,如果与requestSeed 0x03关联的安全级别处于活动状态,并且测试者请求已成功解锁与requestSeed 0x01关联的安全级别,则只有与requestSeed 0x01关联的安全级别支持的安全功能才能在此时解锁。 之前由与requestSeed 0x03关联的安全级别解锁的任何其他安全功能将不再处于活动状态。 安全级别编号是任意的,并不意味着级别之间的任何关系。
客户端应通过发送服务SecurityAccess’requestSeed’消息来请求服务器“解锁”。 服务器应通过使用服务
SecurityAccess’requestSeed’肯定响应消息发送“种子”来响应。 然后,客户端应该通过使用适当的服务
SecurityAccess’sendKey’请求消息返回一个“密钥”号码回应服务器。 服务器应将此“密钥”与内部存储/计算的密钥进行比较。 如果两个号码匹配,则服务器应启用(“解锁”)客户端对特定服务/数据的访问,并通
过服务SecurityAccess’sendKey’正面响应消息指示。 如果两个数字不匹配,则应视为错误的访问尝试。 无效密钥要求客户端从SecurityAccess’requestSeed’消息的开头重新开始
如果服务器支持安全性,但在接收到SecurityAccess’requestSeed’消息时所请求的安全级别已解锁,则该服务器应使用种子值等于零(0)的SecurityAccess’requestSeed’肯定响应消息服务进行响应。 服务器永远不会为当前锁定的给定安全级别发送全零种子。 客户端应使用此方法通过检查非零种子来确定服务器是否被锁定为特定的安全级别。
在服务器能够在服务器上电/重置之后以及在一定次数的错误访问尝试(参见下面的进一步描述)之后,积极响
应来自客户端的服务SecurityAccess’requestSeed’消息之前,可能需要车辆制造商特定的时间延迟。 如果支持此延迟计 时器,则应 在车辆制造 商指定的错 误访问次数 达到或服务 器启动 / 重 置 以 及 之 前 执 行的SecurityAccess服务由于单次错误访问尝试而失败后启用延迟。 如果服务器支持这个延迟计时器,那么在执行成功的SecurityAccess服务’sendKey’之后,服务器会在服务器清除上电/复位时延迟计时器调用的服务器内部指示信息。 如果服务器支持这个延时定时器,并且无法确定之前在加电/复位之前执行的SecurityAccess服务是否失败,那么延时定时器应在加电/复位后始终处于活动状态。 只有当服务器在加电/复位时被锁定时才需要延迟。 车辆制造商应选择是否支持延时定时器。
尝试访问安全性不应妨碍正常的车辆通信或其他诊断通信。
如果服务器被锁定时请求安全服务,则提供安全性的服务器应支持拒绝消息。
实现步骤
客户请求种子(Request Seed):诊断设备发送请求种子消息,包括所需的安全级别。例如,可以有不同级别的访问权限,如只读访问、写入访问等。
生成种子(Generate Seed):ECU收到请求后,会根据请求的安全级别生成一个随机数(种子),然后将种子发送给诊断设备。
计算密钥(Calculate Key):诊断设备接收到种子后,使用预先定义的算法计算相应的密钥。
发送密钥(Send Key):诊断设备将计算出的密钥发送给ECU。
验证密钥(Verify Key):ECU收到密钥后,进行验证。如果密钥正确,则ECU确认诊断设备具有请求的安全访问权限,并允许访问受保护的功能或服务。
客户端请求种子
securityAccessDataRecord
此参数记录是用户可选的,用于在请求种子信息时将数据传输到服务器。 它可以包含服务器中验证的客户端标识。
子功能服务包括:
01 03 05 07-41 代表不同安全级别
服务端返回种子
返回SID subfunctin seed
客户端收到种子进行计算,发送密钥
SID + sendKey + 密钥码
sendKey = 前面请求的级别+1.比如请求的安全级别是01 ,则sendKey就是02;如果是03,那就是04。
服务端响应
负向响应
例子
处于锁状态
请求种子
返回种子
发送key
返回