10.4 安全访问(27)服务
来自:ISO 14229-1-2020.pdf
10.4.1 服务描述
本服务的目的是提供一种访问数据和/或诊断服务的方法,这些数据和/或诊断服务由于安全、排放或安全原因而被限制访问。用于将例程或数据下载/上传到服务器以及从服务器读取特定内存位置的诊断服务是可能需要安全访问的情况。不适当的程序或数据下载到服务器可能会损坏电子设备或其他车辆部件,或危及车辆的排放、安全或安保标准。安全概念使用种子和密钥的关系。
使用这项服务的典型例子如下:
- 客户请求“种子”,
- 服务器发送“种子”,
- 客户端发送“密钥”(适用于收到的种子),
- 服务器回复“密钥”是有效的,它将自己解锁。
‘requestSeed’ SubFunction参数值应该总是一个奇数,相同安全级别对应的’ sendKey’ SubFunction参数值应该等于’requestSeed’ SubFunction参数值加1。
在任何时刻,只有一个安全级别是活动的。例如,如果与requestSeed 03相关联的安全级别是活动的,并且测试者请求成功地解锁了与requestSeed 01相关联的安全级别,那么此时只有与requestSeed 01相关联的安全级别所支持的安全功能应该被解锁。之前由与requestSeed 03关联的安全级别解锁的任何额外安全功能都将不再激活。安全级别编号是任意的,并不意味着级别之间有任何关系。
客户端通过发送服务SecurityAccess ’ requestSeed '消息请求服务器“解锁”。服务器应通过使用服务SecurityAccess ’ requestSeed '积极响应消息发送一个“种子”来响应。然后客户端将通过使用适当的服务SecurityAccess ’ sendKey '请求消息返回一个“密钥”号码给服务器进行响应。服务器将此“密钥”与内部存储/计算的“密钥”进行比较。如果两个数字匹配,那么服务器将启用(“解锁”)客户端对特定服务/数据的访问,并通过服务SecurityAccess ’ sendKey '积极响应消息指示。如果两个号码不匹配,这将被认为是一次错误的访问尝试。一个无效的密钥将要求客户端重新开始使用SecurityAccess 'requestSeed’消息,如附件I所述。关于安全访问处理细节的其他细节在附件I中规定。
如果服务器支持安全,但是当接收到SecurityAccess ’ requestSeed '消息时,请求的安全级别已经解锁,该服务器应响应SecurityAccess ’ requestSeed '积极响应消息服务,其种子值为零(0)。服务器永远不会为当前锁定的给定安全级别发送全零种子。客户端应使用此方法通过检查非零种子来确定服务器是否针对特定安全级别被锁定。
在服务器上电/重置后,以及在一定次数的错误访问尝试之后(参见下面的进一步描述),服务器可以积极响应来自客户端的服务SecurityAccess ’ requestSeed '消息之前,可能需要车辆制造商特定的时间延迟。如果支持此延迟定时器,则在达到车辆制造商指定的错误访问尝试次数之后,或者当服务器上电/重置并且之前执行的SecurityAccess服务由于一次错误访问尝试而失败时,将激活延迟。如果服务器支持此延迟定时器,则在SecurityAccess服务sendKey成功执行后,服务器应清除上电/复位时延迟定时器调用的服务器内部指示信息。如果服务器支持该延迟定时器,并且无法确定在上电/重置之前执行的SecurityAccess服务是否失败,则延迟定时器应在上电/重置后始终处于活动状态。只有当服务器在上电/重置时被锁定时才需要延迟。车辆制造商应选择是否支持延迟计时器。
试图进入安全系统不应妨碍正常的车辆通信或其他诊断通信。
如果在服务器被锁定时请求安全服务,提供安全性的服务器应该支持拒绝消息。
在特定诊断会话期间请求的某些诊断功能/服务可能需要一个成功的安全访问序列。在这种情况下,应要求下列服务顺序:
- diagnostics sessioncontrol服务,
- SecurityAccess服务和
- 安全诊断服务。
服务器中启用的诊断会话(会话启动)允许使用不同的accessModes。
重要:服务器和客户端必须满足8.7中规定的请求和响应消息行为。
10.4.2 请求消息
10.4.2.1 请求消息定义
表40指定了请求消息定义- SubFunction = requestSeed。
- #1:安全访问请求服务标识符(SA),值为[27]
- #2:子功能=[安全访问类型=请求种子](LEV_SAT_RSD),值为[01、03、05、07到7D]
- #3,…,#n:安全访问数据记录[]=[参数#1,…,参数#m](SECACCDR_PARA1,…,SECACCDR_PARAm),值为[00到FF,…,00到FF]
表41指定了请求消息定义- SubFunction = sendKey。
- #1:安全访问请求服务标识符(SA),值为[27]
- #2:子函数=[安全访问类型= 发送密钥](LEV_SAT_SK),值为[02,04,06,08到7E]
- #3,…,#n:安全密钥[] = [Key #1(高字节),…,Key #m(低字节)](SECKEY_KEY1HB,…,SECKEY_KEYmLB),值为[00到FF,…,00到FF]
10.4.2.2 请求消息子函数参数$Level (LEV_)定义
SubFunction参数securityAccessType向服务器指示该服务正在进行的步骤、客户端希望访问的安全级别以及种子和密钥的格式。如果服务器支持不同级别的安全,则每个级别都由requestSeed值标识,该值与sendKey值有固定的关系:
- " requestSeed = 01 “定义了” requestSeed = 01 “和” sendKey = 02 "之间的固定关系。
- " requestSeed = 03 “定义了” requestSeed = 03 “和” sendKey = 04 "之间的固定关系。
requestSeed和sendKey的值在表42中定义(suppressPosRspMsgIndicationBit(位7)未显示)。
注:
- 00:ISOSAEReserved(ISOSAERESRVD),此值为本文档保留。
- 01:requestSeed(RSD),使用汽车制造商定义的安全级别RequestSeed。
- 02:sendKey(SK),使用汽车制造商定义的安全级别的SendKey。
- 03, 05, 07到41:requestSeed(RSD),RequestSeed与汽车制造商定义的不同安全级别。
- 04、06、08到42:sendKey(SK),由汽车制造商定义的不同安全级别的SendKey。
- 43到5E:ISOSAEReserved(ISOSAERESRVD),此值由本文档保留,以供将来定义。
- 5F:ISO26021-2值(RSD),为ISO 26021-2中定义的机载烟火装置的寿命结束激活定义了不同安全级别的种子。
- 60:ISO26021-2 sendKey值(SK),SendKey具有不同级别的安全定义,用于ISO 26021-2中定义的机载烟火装置的寿命结束激活。
- 61到7E:systemSupplierSpecific(SSS),这个范围的值是为系统供应商特定的使用而保留的。
- 7F:ISOSAEReserved(ISOSAERESRVD),此值由本文档保留,以供将来定义。
10.4.2.3 请求消息数据参数定义
表43指定请求消息的数据参数。
注:
- securityKey(高字节和低字节):请求消息中的“Key”参数是由安全算法生成的值,对应于特定的“Seed”值。
- securityAccessDataRecord:此参数记录是用户可选的,用于在请求种子信息时向服务器传输数据。例如,它可以包含在服务器中验证的客户机标识。
10.4.3 积极响应信息
10.4.3.1 积极响应消息定义
表44指定了积极响应消息。
注:
- #1:安全访问响应服务标识符(SAPR),值为[67]
- #2:子功能= [安全访问类型](LEV_SAT_SK),值为[00-7F]
- #3,…,#n:安全种子[] = [种子#1(高字节),…,种子#m(低字节)](SECSEED_SEED1HB,…,SECSEED_SEEDmLB),值为[00到FF,…,00到FF]
- C:该参数的存在取决于参数securityAccessType。如果securityAccessType参数表示客户端希望从服务器检索种子,则必须出现该参数。
10.4.3.2 正面响应消息数据参数定义
表45指定响应消息的数据参数。
- securityAccessType:该参数是请求消息中SubFunction参数的第6位到第0位的回显。
- securitySeed(高字节和低字节):seed参数是服务器发送的数据值,客户端在计算访问安全性所需的密钥时使用它。只有在发送请求消息时,SubFunction设置为请求服务器种子的值,securitySeed数据字节才会出现在响应消息中。
10.4.4 支持的消极响应码(NRC_)
本服务应实施以下否定响应代码。表46记录了每个响应代码发生的情况。如果错误场景适用于服务器,则列出的否定响应应使用。
NRC | 描述 | 助记符 |
---|---|---|
12 | SubFunctionNotSupported:如果SubFunction参数不支持,将发送此NRC。 | SFNS |
13 | incorrectMessageLengthOrInvalidFormat:如果信息长度错误,则应发送此NRC。 | IMLOIF |
22 | conditionsNotCorrect:如果不满足安全访问请求的标准,则该NRC将被返回。 | CNC |
24 | requestSequenceError:如果sendKey子函数没有先接收到requestSeed请求消息,则发送。 | RSE |
31 | requestOutOfRange:如果用户可选的securityAccessDataRecord包含无效数据,将发送此NRC。 | ROOR |
35 | invalidKey:如果接收到期望的sendKey子函数值,该键的值与服务器内部存储/计算的键不匹配,并且延迟计时器不被此请求激活。 | IK |
36 | exceededNumberOfAttempts:如果接收到一个期望的’ sendKey '子函数,密钥的值与服务器内部存储/计算的密钥不匹配,并且延迟计时器被这个请求激活(即由于达到了激活延迟计时器的错误访问尝试的限制)。 | ENOA |
37 | requiredTimeDelayNotExpired:如果接收到requestSeed子函数,并且延迟定时器为所请求的安全级别激活,则发送。 | RTDNE |
10.4.5 消息流举例:SecurityAccess
10.4.5.1假设
对于下面给出的消息流示例,如果服务器处于“锁定”状态,则假设以下条件可以成功解锁:
- SubFunction请求种子:01 (requestSeed)
- 子函数发送密钥:02 (sendKey)
- 服务器的种子(2字节):3657
- 服务器的密钥(2字节):C9A9(例如2的种子值的补码)
通过将suppressPosRspMsgIndicationBit (SubFunction参数的第7位)设置为"FALSE"(‘0’),客户端请求有一个响应消息。
10.4.5.2 例1 - server处于“locked”状态
10.4.5.2.1 步骤#1:请求种子
表47指定了SecurityAccess请求消息流示例#1 -步骤#1。
表48指定了SecurityAccess正向响应消息流示例#1 -步骤#1。
10.4.5.2.2 步骤#2:发送密钥
表49指定了SecurityAccess请求消息流示例#1 -步骤#2。
表50指定了SecurityAccess正向响应消息流示例#1 -步骤#2。
10.4.5.3 例2 - server处于“未锁定”状态
10.4.5.3.1 步骤#1: 请求种子
表51指定了SecurityAccess请求消息流示例#2 -步骤#1。
表52指定了SecurityAccess正向响应消息流示例#2 -步骤#2。