AUTOSAR实战篇:基于ETAS工具链的信息安全协议栈集成指南

AUTOSAR实战: 基于ETAS工具链的信息安全协议栈集成指南

前言

小T出品,必是精品!
手把手带你集成信息安全协议栈,你值得拥有!

image-20231105115601106


正文

随着汽车信息安全的不断发展与完善,其在汽车电子领域如智能驾驶(ADAS),智能座舱等方向上不断被重视起来,越来越多的Tier1,主机厂都在全面将汽车信息安全的各类手段落实到自己的产品中。

小T相信随着整车IT技术的不断发展,特别是车载以太网的普遍应用,车联网势必会成为未来一个非常重要的方向,正因如此,也大大增加汽车遭受外部网络攻击的风险,因此非常有必要了解学习下汽车信息安全相关内容。

AUTOSAR组织对这方面早已布局,规范了在汽车电子开发领域的信息安全开发方法论以及协议栈设计,本文将重点聚焦如何通过实战落地的方式来让大家快速将信息安全协议栈落实到各自的产品中,快速完成信息安全软件开发与落地,为自身产品增加更多的竞争力。

信息安全协议栈总体介绍

如果大家想全面了解AUTOSAR中关于信息安全协议栈的主体框架内容,可以参考标准文档《AUTOSAR_EXP_UtilizationOfCryptoServices.pdf》,本文将基于此重点介绍下信息安全协议栈内容。

信息安全协议栈英文可称为Crypto BSW协议栈,如下图所示为整个协议栈的组成内容:

image-20231105120957799

图1 Crypto BSW协议栈总体框架

如上图所示,整个Crypto BSW协议栈同其他BSW基本一致,可以分为如下三个层级:

  • Cryto Driver层:该层主要提供各种加密服务的具体实现,如上图右侧显示对于该层驱动可以进一步划分三种类别:
    • 芯片内部驱动:基于芯片内部的硬件HSM或者SHE模块提供加密服务,如英飞凌的HSM硬件模块,内部自带各类驱动服务;
    • 软件驱动:有些芯片内部不支持,可以通过软件的方式来实现加密服务,即右侧的SW-Based,比如我们常用的MAC生成算法;
    • 外部芯片驱动:有些芯片内部不支持,可以通过添加外部单独的加密芯片,并通过SPI来实现芯片与外部加密硬件模块的通信;
  • Cryto Hardware Abstraction层:对于该一层级主要实现对底层驱动的抽象,保证上层服务层接口无需关注底层驱动是否在内部或者外部,比如上图右侧的Crypto Interface模块,External Crypto Driver,SW-based Crypto Driver等。
  • Crypto Service层:主要用来为上层SWC或者其他BSW模块提供各种密钥管理以及加密服务,完成针对底层细节的抽象,并提供统一的接口给到所有需要加密服务的Client,比如我们的Crypto Servie Manager就位于该一层级。

在具体某个Client(某SWC或者BSW模块)使用加密服务的过程中,通常会经历如下几个关键步骤:

  • S1:Client通过RTE调用Cypto Service Manager(简称CSM)完成加密服务的请求;
  • S2:针对加密服务请求一般通过job的方式来进行传递,job中一般会定义同步传输或者异步传输的模式以及其他参数,如果是同步传输的方式,函数返回后将能够立即得到结果,如果是异步方式则通过callback函数来通知服务层完成加密服务的最终结果;
  • S3:Cypto Service Manager将加密请求通过Cryto If模块传递至下方的Crypto Driver模块;
  • S4:在Crypto Driver模块中完成具体加密服务的过程,当然如果存在并发请求同一加密服务的场景,整个Crypto 在CSM模块或Crypto Driver都会带有缓冲空间模式,通过优先级来判断哪种类型的Job会被优先执行。

好了,小T针对上述AUTOSAR信息安全协议栈完成了总体框架的介绍,想必大家对信息安全协议栈也已经有了初步的了解,那么了解了理论知识,我们接下来就进入到实战开发环节,让大家能够理论与实际相结合,最终完成Crypto BSW协议栈的集成。

S1:开发环境介绍

首先,小T需要介绍下本次集成信息安全协议栈的开发环境,开发环境主要分为开发工具与硬件平台两大部分。

1.1 开发工具介绍

小T目前使用的是ETAS的工具链ISOLAR-AB来完成整个Crypto BSW协议栈的集成,当前工程已经是一个能够正常工作的ISOLAR-AB工程,仅需要在当前可用的工程基础上具体实操如何来完成信息安全协议栈的集成,并以配置Key Slot Service服务为例。

当然有些小伙伴可能使用的不是ETAS工具链,使用的可能是Vector工具链,但是基本方法论基本一致,可以实现一举反三,触类旁通。

1.2 硬件平台介绍

本次硬件平台采用的英飞凌经典的HSM系列完成整个软件模块的集成,不仅包含整个BSW协议栈的添加与配置,同时也包含针对HSM的驱动集成的注意事项。

S2 添加并配置Crypto BSW协议栈

2.1 配置Csm模块

在ISOLAR-AB工具中的"ECU Navigator"中,右键点击Bsw Modules然后选择Service模块并点击“Create Csm”模块。

image-20231105124506513

图2 添加Crypto Service模块

在“New AR Element Creation”中我们添加对应的名称“Csm”,然后创建新的AR Package,并命名为“Csm_EcucValues.arxml”,如下图所示:

image-20231105125116689

图3 创建CSM AR Package

经过上述步骤创建好CSM模块之后,在CsmGeneral Container中需要设置如下选项:

  • 将**CsmMainFunctionPeriod设置成0.01,**即10ms调度一次Csm的主函数;

  • 设置CsmRbAutoFillConfig为TRUE, 这样就会使得Csm模块就会自动创建默认或者缺失的参数以及与CryIf,Crypto Component的连接。

    image-20231105125608582

图4 配置Csm模块

2.2 配置CryIf模块

同样在“ECU Navigation”中右键单击Bsw Module/Other Modules然后选择创建CryIf模块,如下图所示:

image-20231105130043076

图5 创建CryIf模块

然后按照如上图3类似的方式为CryIf模块创建“New AR Element creation”。

2.3 配置Crypto Driver模块

如下图右键点击Bsw Module/Other Modules,然后选择创建Crypto模块:

image-20231105172210654

图6 创建Crypto Driver模块

如下图中所示在“New AR Element Creation” 中命名为rba_CryptoHSM, 并选择创建New AR Package, File Name则重命名为rba_CryptoHSM_EcucValues.arxml。

image-20231105172514042

图7 创建Crypto Driver AR Package

接下来,双击“rba_CryptoHSM”然后打开如下界面,在界面中的“CryptoGeneral”中设置如下默认值,当前我们仅需要配置CryptoGeneral的CryptoMainFunctionPeriod参数为0.01

image-20231105172900623

图8 设置Crypto Driver参数
S3: 配置Key Slot Service

首先,我们需要创建一个Csm Primitive,该Primitive将会链接到底层的Crypto Driver,在本文中我们使用HSM,因此我们需要设置参数CsmRbAutoConfigCryptoSelect为rba_CryptoHSM

image-20231105173618996

图9 设置Csm Primitive参数

然后右键单击新创建的CsmPrimitive,选择 New Child-> CsmRbSheLoadKeySlot, 即代表使能了HSM对应的Key Slot Service;

image-20231105173858379

图10 设置Key Slot Service

同时为CryptoHSM操作完成之后创建一个callback函数:

image-20231105174158728

图11 创建Csm Callback函数

然后创建Csm Queue以便能够满足多个客户端加密服务的并发请求,保证能够存在一定的缓存空间便于后续job的处理,参数CsmChannelRef则无需设置,在BSW生辰过程中会自动设置,同时设置参数CsmQueuesize为1

image-20231105174524475

图12 设置Csm Queue参数

然后创建Csm Job并根据如下参数进行相应的配置:

image-20231105174706782

图13 设置Csm job参数

设置参数选项如下所示:

  • 将该Csm Job命名为She_Key_Load;
  • 设置参数CsmJobInterfaceUsePort 为CRYPTO_USE_PORT_OPTIMIZED;
  • 设置参数CsmJobPrimitiveCallbackUpdateNotification为False;
  • 设置CsmJobPriority为0,优先级数字越大,优先级越高;
  • 设置参数CsmProcessingMode为CRYPTO_PROCESSING_ASYNC,即设置该Csm Primitive为异步操作;
  • 设置参数CsmRbJobRteQLength为1;
  • 最后引用之前设置的callback,primitive以及创建的queue;

image-20231105175340607

图14 设置Csm job具体参数实例

最后,我们需要针对上述的配置做最后的生成确认,即生成Csm, CryIf 与 rba_CryptoHSM三大模块的静态与配置代码,生成BSW代码时的相关配置如下图:

image-20231105175608661

图15 三大信息安全模块生成配置

如下图为最终生成成功的Crypto BSW协议栈静态代码与配置代码,可以作为检查是否整个信息安全协议栈是否配置成功。

image-20231105175935521

image-20231105180018618

image-20231105180050415

图16 Crypto BSW协议栈生成代码列表

同时在如下图中的Csm Component模块中会出现将Csm Component模块进行展开显示,可以发现存在一个P Port以及一个R Port,其中P Port则用于给到上层Client进行使用,而R Port则用于告知Csm模块相关加密操作的完成。

image-20231105180541866

图17 Csm Component的生成
S4: 基于BswM完成Crypto协议栈初始化

在BswM模块中我们需要完成Crypto BSW协议栈的初始化操作,主要包含如下几个初始化内容:

  • Csm_Init初始化操作;
  • CryIf_Init初始化操作;
  • CsaiHSM_Startup操作;
  • rba_CryptoHSM_Init()操作;

如下图为CsmInit函数的在BswM模块中的初始化操作:

image-20231105181514350

图18 Csm Init在BswM中的初始化

这些Action将会在NVM ReadAll完成之后便进行触发,Action 列表为BswM_AL_BswModules_InitListReadAll,如下图所示:

image-20231105181823529

图19 Crypto BSW协议栈在BswM中的初始化

同时因此需要在BswMGeneral/BswMUserIncludeFiles中添加对应的头文件,如Csm.h, CryIf.h以及 rba_CryptoHSM.h函数,如下图所示:

image-20231105182201600

图20 BswM模块的头文件添加

然后再次运行BSW Generator,在生成前确保BswM模块已经被选择上了。

S5: Crypto协议栈系统化配置

由于CycurHSM驱动需要一个OS counter用于自身时间的测量,因此我们需要基于OS创建一个OS Counter,在ECU Navigator中,选择BSW Modules/Rte Os/Os,然后右键创建一个新的OS Counter,该OS Counter的相关属性如下所示:

  • 将该OS Counter命名为Os_Csai_Counter;
  • 设置参数OsCounterMaxAllowedValue为65535;
  • 设置参数OsCounterMinCycle为1;
  • 设置参数OsCounterTicksPerBase为1;
  • 设置参数OsCounterType为SOFTWARE;
  • 设置参数OsSecondsPerTick为0.001;

image-20231105183219460

图21 设置CryHSM驱动所需的OS Counter

然后将Csm Prototype添加至TopLevelComposition中,如下图所示:

image-20231105183455842

image-20231105183559014

图22 添加Csm Component

然后打开SWC to ECU Mapping Editor来完成SWC到ECU两者之间的Mapping,在SWC to ECU Mapping过程中将新增的CPT_Csm模块添加至ECU中,直接拖拽至ECU下面即可。

image-20231105183741225

image-20231105183959239

图23 完成Csm SWC至ECU的Mapping

最后执行下ECU Extract来反映其变化:

image-20231105184504675

image-20231105184528129

image-20231105184550981

图24 成功完成ECU Exact操作

最后在进入到ECU Navigator中,选择 Bsw Modules → RTE OS → RTE模块,右键单击"RteBswModuleInstances"来完成Csm模块的配置:

image-20231105184828092

在参数“RteBswImplementationRef”中选择“CSM“,如下图:

image-20231105184942749

图25 在RTE中添加CSM模块

针对模块 rba_CryptoHSM需要做上述RteBswModuleInstance的同样操作。

S6: Crypto协议栈Task Mapping

在下图中双击EcucValueCollection然后选择Entity to Task Mapping

image-20231105185400872

在下图中,我们需将未被Mapping的Csm模块以及rba_CryptoHSM模块拖拽至对应的BSW周期任务中:

image-20231105185445265

图26 完成CSm相关模块的Task Mapping

在生成RTE之前,我们还需要定义一个 SwAddressing Method,

image-20231105185759363

图27 创建Sw Address Method

在如下图”New AR Element Creation“中填入 "HSM_SHARED_VAR"到"SwAddrMethods"中。

选择”Use Existing AR Packages“ ,然后选择在”rba_CUCELSwAddrMethod_BSWMD.arxml“文件中的”SwAddrMethods“,最后点击完成即可。

image-20231105190253664

图28 完成SwAddrMethods的创建

双击该新创建的元素,我们需要对齐相关属性的设置如下:

  • 修改其名称为HSM_SHARED_VAR;
  • 设置参数 MemoryAllocationKeywordPolicy为ADDR-METHOD-SHORT-NAME-AND-ALIGNMENT;
  • 设置参数 SectionInitializationPolicy为 INIT;
  • 设置参数SectionType为VAR;

image-20231105190908194

最后在RTE Code Generator中 ,在”Include AR File“中我们需要完成如下设置:

  • 选择Csm以及 rba_CryptoHSM的BSWMD 文件;
  • 选择Csm的SWCD文件;
  • 同时选择Csm,CryIf与 rba_CryptoHSM的EcucValues 文件;
  • 然后选择"Run"便开始RTE相关模块接口的生成。

image-20231105191339887

图29 关于Crypto BSW的RTE生成设置
S7:Crypto HSM集成注意事项

7.1 集成总体描述

由于我们使用的CycurHSM_TC27x_V2.7.1.r1的驱动,CycurHSM属于一个HSM固件以及一个Host Driver,其中Host Driver则用于使能AUTOSAR SW与HSM固件之间的通信,从而完成相关加密服务的信息的传递与触发。

HSM固件就是一个用于刷写进我们HSM的二进制文件,该Host Driver则被用于集成到AUTOSAR SW用于使能与HSM固件之间的通信。

7.2 HSM主体驱动

HSM主体驱动就是Host Driver,集成该固件需要注意以下几点:

  • 确保所有的文件都包含在编译环境中;

  • 包含Host Driver中的文件位于 “\Implementation\HSM_HOST_Drivers\ecy_hsm” 与\20_Implementation\HSM_HOST_Drivers\ecy_hsm_TC27x_HT"两个路径中;

  • 我们需要在 \Implementation\RTA-SK\src\bsw\Compiler\integration\Compiler_Cfg.h文件中添加宏定义"#define HIGHTEC_C_IFXHSMHIGH"来完成文件 \Implementation\HSM_HOST_Drivers\ecy_hsm_TC27x_HT\api\rba_Reg_attrb.h 的Memmap的正确设置;

7.3 HSM文件刷写

在刷写HSM固件的过程中,我们也需要注意以下几点:

  • 该HSM 二进制文件位于**\Implementation\HSM_HOST_Drivers\hsm_bin路径下的命名为HSM_sig.hex**文件。
  • 在路径 \Implementation\HSM_HOST_Drivers\hsm_t32_flash_script中存在T32刷写脚本Tc27x-hsm.cmm则用于刷写HSM刷写。

7.4 链接文件更新

  • 我们需要更新link文件将Sector” .hsm_shared“ 与”.hsm_shared_ro“ 链接至CPU0_DMI_DSPR中,这些sector将被HOST Driver用于根据其Memmap将相关的变量Map至CPU0_DMI_DSPR中。
  • 在定义一个宏定义命名为 BRIDGE, 即"BRIDGE = 0xF0040008,该宏定义在HOST Driver中又被使用到;

7.5 MCAL Stub文件更新

  • 我们需要在文件**\Implementation\MCAL\Integration\Stubs.c**中使用 Gpt_Cbk_Notification来定义生成早已创建好的 OS Counter,即"Os_Csai_Counter";
  • 该OS Counter将用于给到HSM驱动提供相应的时间测量,该测量方式可以通过调用函数Callout_GetCounterValue()与Callout_GetElapsedCounterValue(),该两个API将用于给到HOST Driver进行使用;
    用于根据其Memmap将相关的变量Map至CPU0_DMI_DSPR中。
  • 在定义一个宏定义命名为 BRIDGE, 即"BRIDGE = 0xF0040008,该宏定义在HOST Driver中又被使用到;

7.5 MCAL Stub文件更新

  • 我们需要在文件**\Implementation\MCAL\Integration\Stubs.c**中使用 Gpt_Cbk_Notification来定义生成早已创建好的 OS Counter,即"Os_Csai_Counter";
  • 该OS Counter将用于给到HSM驱动提供相应的时间测量,该测量方式可以通过调用函数Callout_GetCounterValue()与Callout_GetElapsedCounterValue(),该两个API将用于给到HOST Driver进行使用;
  • API函数CsaiHSM_Startup() 包含了用于在APP模式下检查HSM启动过程中以及运行过程中的序列,同时通过HOST Driver来完成HSM之间的通信配置。

更多精彩内容,敬请关注公号"ADAS与ECU之吾见"!!!

猜你喜欢

转载自blog.csdn.net/wto9109/article/details/134552068