1.服务说明
此服务的目的是提供一种访问数据和/或诊断服务的方法,这些数据和/或诊断服务由于安全、排放或安全原因而受到访问限制。用于下载/上传例程或数据到服务器以及从服务器读取特定内存位置的诊断服务可能需要安全访问。不适当的例程或下载到服务器的数据可能会潜在地损坏电子设备或其他车辆部件,或危及车辆对排放、安全或安全标准的遵守。安全概念使用种子和密匙关系。
使用此服务的典型示例如下:
a .客户端请求“种子”,
b. 服务器发送“种子”
c. 客户端发送“密钥”(适用于收到的种子)
d. 服务器响应“密钥”是有效的,它将自己解锁
“requestSeed”子功能参数值应始终为奇数,同一安全级别的相应“endKey”子功能参数值应等于“requestSeed”子功能的参数值加一。
在任何时刻,只有一个安全级别是有效的。例如,如果与requestSeed 0x03相关联的安全级别处于活动状态,并且测试者请求成功地解锁了与requestSeed 0x01相关联的安全级别,那么此时只有与requestSeed 0x01相关联的安全级别所支持的安全功能将被解锁。先前由与requestSeed 0x03关联的安全级别解锁的任何其他安全功能将不再有效。安全级别编号是任意的,并不意味着有任何关系
客户端应通过发送服务SecurityAccess ` requestSeed `消息请求服务器“解锁”。服务器应该通过使用服务SecurityAccess的` requestSeed `积极响应消息发送一个“种子”来响应。然后,客户端将通过使用适当的service SecurityAccess ` sendKey `请求消息向服务器返回一个“密钥”数字来响应。服务器应将此“键”与内部存储/计算的键进行比较。如果两个数字匹配,那么服务器应该启用(“解锁”)客户端对特定服务/数据的访问,并通过service SecurityAccess ` sendKey `积极响应消息表示。如果两个数字不匹配,将被认为是错误的访问尝试。无效的密钥要求客户端使用SecurityAccess的` requestSeed `消息从头开始参考2.安全访问图。
如果服务器支持安全性,但所请求的安全级别已在SecurityAccess时解锁收到' requestSeed '消息后,服务器将响应一个SecurityAccess ' requestSeed '正面响应消息服务,其种子值等于0(0)。对于当前锁定的给定安全级别,服务器将永远不会发送全零种子。客户端应使用此方法通过检查非零种子来确定服务器是否为特定安全级别锁定。
在服务器启动/重置后,以及在一定数量的错误访问尝试(见下文的进一步描述)后,在服务器能够积极响应来自客户端的service SecurityAccess ` requestSeed `消息之前,可能需要车辆制造商特定的时间延迟。如果支持此延迟定时器,则延迟应在达到车辆制造商指定的错误访问尝试次数后激活,或当服务器通电/复位,以前执行的SecurityAccess服务由于一次错误访问尝试而失败时激活。如果服务器支持这个延迟定时器,那么在一个成功的SecurityAccess服务` sendKey `执行后,服务器内部的延迟定时器调用指示信息将由服务器清除。如果服务器支持这个延迟定时器,并且不能确定以前执行的SecurityAccess服务在上电/复位之前失败了,那么延迟定时器在上电/复位后总是活跃的。只有在服务器上电/重启时锁定时才需要此延迟。车辆制造商应选择是否支持延迟定时器。
试图访问安全装置不应妨碍正常的车辆通信或其他诊断通信。
提供安全性的服务器应支持在服务器被锁定时请求安全服务时拒绝消息。
在特定诊断会话期间请求的某些诊断功能/服务可能需要成功的安全访问序列。在这种情况下,应要求以下服务顺序:
a. DiagnosticSessionControl服务
b. SecurityAccess服务
c. 安全诊断服务
服务器中启用的诊断会话(会话已启动)允许不同的访问模式。
2.安全访问状态图
2.1简介
本小节的目的是基于具有状态转换条件和动作定义的状态图,描述ECU中的SecurityAccess服务处理。以下是定义的基础:
a. 使用析取范式,以便在状态之间和状态内部定义单个转换。
b. “析取范式”的定义:“如果一个语句是由一个或多个析取组成的析取(or序列),每个析取都是 一个或更多个字的合取(AND),那么它就是析取范式。”
2.2基于虚拟范式的状态转换定义
下图形方式描述了SecurityAccess处理的状态图。给定的数字表示转换条件和要在转换上执行的操作。
密匙:
(A)所有安全级别都已锁定。没有活性种子。
(B) 所有安全级别已锁定。种子已发送。正在等待密钥。
(C) 一个安全级别已解锁。没有活性种子。
(D) 一个安全级别已解锁。种子已发送。正在等待密钥。
状态图考虑到一般会话处理是在会话管理层内的适当位置完成的(见ISO 14229-2),因此不需要在状态图中考虑。
状态转换定义使用了一些参数,这些参数可以根据车辆制造商的具体要求进行设置Delay_Timer和Att_Cnt参数的支持是可选的,由车辆制造商决定。通常,对于较长的种子/密钥长度(例如,16字节及以上),对这些参数的支持不再那么重要。
3.请求消息
定义请求消息定义-子函数=requestSeed
定义了请求消息定义-子函数=sendKey。
3.1请求消息子功能参数$Level(LEV_)定义
子函数参数securityAccessType向服务器指示该服务正在进行的步骤、客户端想要访问的安全级别以及种子和密钥的格式。如果服务器支持不同级别的安全性,则每个级别应由requestSeed值标识,该值与endKey值具有固定关系:
a ." requestSeed = 0x01 "标识了" requestSeed = 0x01 "和" sendKey = 0x02 "之间的固定关系
b. " requestSeed = 0x03 "标识了" requestSeed = 0x03 "和" sendKey = 0x04 "之间的固定关系
下表中定义了requestSeed和sendKey占7bit的值
bit 6-0 | 代名词 | 描述 |
0x00 | ISOSAEReserved | 保留以供将来定义 |
0x01 | requestSeed | RequestSeed,使用车辆制造商定义的安全级别 |
0x02 | sendKey | SendKey和车辆制造商定义的安全级别 |
0x03, 0x05, 0x07 – 0x41 | requestSeed | RequestSeed具有由车辆制造商定义的不同安全级别。 |
0x04, 0x06, 0x08 – 0x42 | sendKey | SendKey具有由车辆制造商定义的不同安全级别。 |
0x43 – 0x5E | ISOSAEReserved | 保留以供将来定义 |
0x5F | ISO26021-2 values | 在ISO 26021-2中定义的机载烟火装置生命周期结束激活的不同安全级别的请求种子 |
0x60 | ISO26021-2 sendKey values | SendKey具有不同级别的安全定义,用于ISO 26021-2中定义的机载烟火装置的生命周期结束激活。 |
0x61 – 0x7E | systemSupplierSpecific | 此值范围是为系统供应商特定用途而保留的 |
0x7F | ISOSAEReserved | 保留以供将来定义 |
3.2请求消息数据参数定义
securityKey(高位和低位字节)
请求消息中的“Key”参数是由与特定“Seed”值相对应的安全算法生成的值。
securityAccessDataRecord
该参数记录是用户可选的,用于在请求种子信息时向服务器发送数据。例如,它可以包含在服务器中验证的客户端的标识。
4.肯定响应消息
C:此参数的存在取决于securityAccessType参数。如果securityAccessType参数指示客户端希望从服务器检索种子,则必须存在。
4.1肯定响应消息数据-参数定义
securityAccessType
此参数是来自请求消息的子函数参数的位6-0的应答
securitySeed (高位和低位字节)
seed参数是服务器发送的数据值,在计算访问安全性所需的密钥时由客户端使用。只有在发送请求消息时,子函数设置为请求服务器种子的值,那么securitySeed数据字节才会出现在响应消息中。
5.支持的否定响应代码(NRC_)
该服务应执行以下否定响应代码。表中记录了每个响应代码发生的情况。如果错误场景适用于服务器,则应使用列出的否定响应。
NRC码 | 代名词 | 描述 |
0x12 | sub-functionN\ otSupported | 如果子功能参数不受支持,则应发送该NRC。 |
0x13 | incorrectMess\ ageLengthOrIn\ validFormat | 如果消息长度错误,则应发送此NRC |
0x22 | conditionsN\ otCorrect | 如果未满足SecurityAccess请求的标准,则应返回此NRC |
0x24 | requestSequ\ enceError | 如果接收到“sendKey”子函数而未首先接收到“requestSeed”请求消息,则发送。 |
0x31 | requestOut\ OfRange | 如果用户可选安全访问数据记录包含无效数据,则应发送此NRC |
0x35 | invalidKey | 如果收到预期的“sendKey”子函数值,并且该键的值与服务器内部存储/计算的键不匹配,则发送。 |
0x36 | exceededN\ umberOfAttempts | 如果延迟计时器由于超过允许的虚假访问尝试的最大次数而处于活动状态,则发送 |
0x37 | requiredTi\ meDelayNotExpired | 如果延迟计时器处于活动状态并且发送了请求,则发送。 |
6.示例
对于以下给定的消息流示例,如果服务器处于“锁定”状态,则必须满足以下条件才能成功解锁服务器:
a. 请求种子的子函数:0x01(requestSeed)
b. 发送密钥的子函数:0x02(sendKey)
c. 服务器种子(2字节):0x3657
d. 服务器的密钥(2字节):0xC9A9(例如种子值的2的补码)
客户端通过将suppressPosRspMsgIndicationBit(子函数参数的第7位)设置为“FALSE”(“0”)来请求响应消息。
定义了SecurityAccess请求消息流示例#1–步骤#1
定义了SecurityAccess肯定响应消息流示例#1–步骤#1
发送密钥
表49定义了SecurityAccess请求消息流示例#1–步骤#2。
定义了SecurityAccess肯定响应消息流示例#1–步骤#2。
服务器处于“解锁”状态
步骤1:请求种子
定义了SecurityAccess肯定响应消息流示例#2–步骤#2。