【车载开发系列】AutoSar当中的DcmDspSecurity容器
AutoSar当中的DcmDspSecurity容器
- 【车载开发系列】AutoSar当中的DcmDspSecurity容器
- 一. DcmDspSecurity容器位置
- 二. 关于对安全等级理解
- 三. 关于安全等级的定义
- 1)Extendedsecuritylevel
- 2)Programmingsecuritylevel
- 3)Immobilizersecuritylevel
- 4)systemSupplierSpecificlevel
- 四. DLS子模块功能
- 五. DcmDspSecurity容器
- 1)DcmDspSecurityBypassEnabled
- 2)DcmDspSecurityResetAttemptCounterOnTimeout
- 3)DcmDspSecuritySingleInstanceAttemptMonitor
- 4)DcmDspSecuritySingleInstanceDelayTimer
- 六. DcmDspSecurityRow的配置项目
- 1)DcmDspSecurityAttemptCounterEnabled
- 2)DcmDspSecurityCompareKeyFnc
- 3)DcmDspSecurityDelayTime
- 4DcmDspSecurityDelayTimeOnBoot
- 5)DcmDspSecurityDelayTimeOnFailedGetAttemptCounter
- 6)DcmDspSecurityGetAttemptCounterFnc
- 7)DcmDspSecurityGetSeedFnc
- 8)DcmDspSecurityKeySize
- 9)DcmDspSecurityLevel
- 10)DcmDspSecurityNumAttDelay
- 11)DcmDspSecuritySeedSize
- 12)DcmDspSecuritySetAttemptCounterFnc
- 13)DcmDspSecurityUsePort
- 七. 关于AttemptCounter
- 1)Dcm_Svc27WriteAttemptCounter
- 2)Dcm_Svc27UtiGetAttemptCntr
- 八. 安全访问延时机制
一. DcmDspSecurity容器位置
在AUTOSAR架构中,Dcm(Diagnostic Communication Manager)模块位于通信服务层。Dcm模块是独立于具体的网络的(不依赖于具体的CAN,Lin,Eth,Flexray等网络来实现)。用于获取或者设置安全等级的管理安全等级功能,就存在于DCM当中,我们称呼它叫:DLS子模块。
二. 关于对安全等级理解
DCM模块的每个诊断服务可以配置安全访问等级,一般有无需通过安全访问、需要通过安全等级1访问、需要通过安全等级2访问三种等级。比如对于0x2E下的服务都设定为需要过安全访问等级1后,我们在请求0x2E的服务时需要通过特定的安全校验后才能通过安全访问等级1,这样才能得到0x2E服务的积极响应。
三. 关于安全等级的定义
DLS子模块应该保存当前激活的安全等级状态。DLS模块提供两个接口用来设置和获取当前安全等级:
获取当前激活的安全等级:Dcm_GetSecurityLevel()
设置新的安全等级:DslInternal_SetSecurityLevel()
SecurityLevel安全级别定义一般可以有以下这四种。
1)Extendedsecuritylevel
它是扩展安全级,使用subfunction是$01$02。它是必须要定义的。
2)Programmingsecuritylevel
它是刷新安全级。是可配置选项。用subfunction是$09$0A。
3)Immobilizersecuritylevel
它是防盗安全级,使用subfunction是$11$12。
4)systemSupplierSpecificlevel
它是供应商自定义安全级。
四. DLS子模块功能
DCM模块初始化完后,安全等级设置为0x00(DCM_SEC_LEV_LOCKED,使能安全访问功能)。
如果我们通过安全校验算法后使得安全等级不为0,当发生以下任意事件后,安全等级状态将回到初始状态0x0(DCM_SEC_LEV_LOCKED)。
1)诊断会话(session)从非缺省会话(0x0, default session)切换到非缺省会话,包括从当前非缺省会话切换到本身自己。
2)诊断会话(session)从非缺省会话(0x0, default session)切换到缺省会话。由DiagnosticSessionControl(0x10) 或 S3Server 超时启动)。一次只能激活一个安全级别。
五. DcmDspSecurity容器
该容器包含安全级别配置(DSP参数)(每个安全级别)描述该容器包括DcmDspSecurityRow的行。DcmDspSecurityRow是DcmDspSecurity的子容器。具体的配置项目如下:
1)DcmDspSecurityBypassEnabled
安全访问是否支持Bypass模式。
2)DcmDspSecurityResetAttemptCounterOnTimeout
延时计时器到期时Dcm是否复位安全尝试计数器。
3)DcmDspSecuritySingleInstanceAttemptMonitor
安全访问是否使用同一个尝试计数器。若位置true,所有的DcmDspSecurityRows共用一个安全尝试计数器;反之,每个DcmDspSecurityRows都单独使用一个安全尝试计数器。
4)DcmDspSecuritySingleInstanceDelayTimer
安全访问是否使用同一个计时器。
六. DcmDspSecurityRow的配置项目
1)DcmDspSecurityAttemptCounterEnabled
安全尝试计数是否支持外部存储。若设置true,Dcm调用读写尝试计数器的API接口(
调用Xxx_GetSecurityAttemptCounter函数获得AttemptCounter)获得每个这些DcmDspSecurityRow条目的。
反之,Dcm在初始化的时候清空这个安全访问等级的尝试计数器。
2)DcmDspSecurityCompareKeyFnc
秘钥比较函数。当DcmDspSecurityUsePort设置为USE_ASYNCH_FNC时,Dcm会调用该函数。
3)DcmDspSecurityDelayTime
安全访问延迟时间。在延迟期间,Dcm不会接收任何安全访问请求。Dcm只有在失败尝试次数达到设置次数之后才会配置该时间。
4DcmDspSecurityDelayTimeOnBoot
Dcm在上电周期内的延迟时间。在延迟期间,Dcm不会接收任何安全访问请求。若设置非0,Dcm从初始化后的这段时间会拒绝任何安全访问请求。
5)DcmDspSecurityDelayTimeOnFailedGetAttemptCounter
设置获取尝试次数失败后的延迟时间。若不设置,Dcm获取失败后直接将计数清0,接收安全访问请求。
6)DcmDspSecurityGetAttemptCounterFnc
获取尝试次数的函数名。Dcm初始化时重载尝试计数器。
7)DcmDspSecurityGetSeedFnc
获取种子函数。当DcmDspSecurityUsePort设置为USE_ASYNCH_FNC时,Dcm会调用该函数。
8)DcmDspSecurityKeySize
安全访问密钥长度。
9)DcmDspSecurityLevel
安全访问等级。
10)DcmDspSecurityNumAttDelay
安全访问尝试次数。若设置大于0,尝试失败的次数超过该值时返回NRC36;若设置等于0,不限失败尝试次数。
11)DcmDspSecuritySeedSize
安全访问种子长度。
12)DcmDspSecuritySetAttemptCounterFnc
修改安全访问尝试次数的函数。当DcmDspSecurityUsePort设置为USE_ASYNCH_FNC时,Dcm会调用该函数。
13)DcmDspSecurityUsePort
它是安全访问类型。有两个选项。USE_ASYNCH_CLIENT_SERVER:Dcm使用P-port接口(SecurityAccess_{SecurityLevel}函数)访问;
USE_ASYNCH_FNC:Dcm直接调用DcmDspSecurityGetSeedFnc和DcmDspSecurityCompareKeyFnc自定义函数访问。
七. 关于AttemptCounter
SID27服务有个特殊需求,上电或者复位前安全访问失败时,上电的10s内需要启用安全延时,回复0x37。
对应两个callout 函数:
Dcm_Svc27ReadAttemptCounter
Dcm_Svc27WriteAttemptCounter
这两个函数都在Dcm_Svc27Task中被调用。
1)Dcm_Svc27WriteAttemptCounter
Dcm_Svc27WriteAttemptCounter函数对应完成的是下电前的couter存储。
当应用层的key比较失败时,传到底层后,会调用上层的SetAttmptCounter函数,将当前的值告诉应用层,如果大于1,则存储EEPROM,供上电后读取。
2)Dcm_Svc27UtiGetAttemptCntr
Dcm_Svc27UtiGetAttemptCntr函数中,通过函数指针访问应用层callout函数,获取应用层设置的安全访问错误计数器,并启用延时机制。
八. 安全访问延时机制
在一般在默认的模式下,连续3次请求安全访问失败后,需等待10s之后才能接受下一次的安全访问请求“RequestSeed”。
- 当测试工具发送一个无效的秘钥,ECU将返回NRC35“InvalidKey”。同时, 安全访问错误计数器加1。该计数器必须存储在非易失性存储单元中, 初始值为0。
- 当安全访问错误计数器达到3 (即收到3次无效密钥),ECU将返回NRC36且需要等待10s才可以接受下一次的安全访问请求“Request Seed”。期间任何安全访问请求“Request Seed”都会被ECU反馈NRC37。
当10s等待时间结束后,安全访问错误计数器将减1(或清零),并允许尝试安全访问请求“RequestSeed” , 如果此次请求失败(由于发送了一个无效的秘钥),安全访问错误计数器将加1,到了MAXAttemptCounter之后并再次开启10s等待时间。