【简介】
S32K3 的 HSE 即硬件安全引擎(Hardware Security Engine),是 NXP S32K3 系列微控制器中的一个关键安全模块,旨在增强汽车电子系统的信息安全,符合 ISO26262 标准,达到 ASIL D 安全等级。以下是对它的详细描述:主要功能
加密算法支持:HSE 支持多种加密算法,包括 AES-128/192/256、RSA 和 ECC 等,可确保数据传输和存储的安全性。
安全启动:HSE 提供安全启动功能,确保系统启动时的代码是经过验证的,未被篡改。它有基础安全启动(BSB)、高级安全启动(ASB)、SHE 安全启动(SSB)三种安全启动方案。
密钥存储:HSE 能够安全地存储密钥,这对于执行加密操作和确保通信安全至关重要。
侧通道攻击保护:HSE 具备侧通道攻击保护功能,增强了抵抗物理攻击的能力。
固件更新:HSE 支持无线固件更新(FOTA),允许 MCU 接收和安装新的固件,而不影响系统的正常运行。
网络协议支持:HSE 通过硬件加速特性和完善的加解密算法库,能够对网络协议进行全面可靠的支持,例如 TLS offload 和 IP offload,减少通信时延。
固件安装方式
Full Mem:将整个 HSE 固件安装到 MCU 的闪存中,适用于不需要固件更新或者可以接受通过其他方式进行更新的应用场景。
A/B Swap:支持双分区功能,允许在不同的闪存区域中存储两个固件版本,这样可以在更新过程中切换到新的固件版本,而不影响当前运行的固件,对于需要进行无线固件更新(FOTA)的应用来说非常有用。
【HSE 服务的使用】
HSE 服务的使用需要先进行安装,安装的过程本地不做详细赘述。使用HSE 的服务需要使用MU 来和HSE CORE 进行交互。使用RTD的驱动我们只需要在S32DS中添加HSE即可将对应的驱动加载到工程中。
配置本地使用默认配置,更新代码
更细代码后HSE 相关的RTD 驱动和配置文件已经更新到工程中
代码编译后会有如下的编译错误,我们还需要将HSE 的interface 加入到工程配置中。
将hse interface 添加到工程即可解决上述编译问题
代码编译通过后我们就可以使用HSE的服务功能了,我们先使用基本的获取HSE 固件版本信息的服务来读取固件信息,对应的接口说明如下:
添加如下的代码获取HSE 固件版本信息
/******************************************************************************************************** * Private Variable Definitions * *******************************************************************************************************/ hseSrvDescriptor_t hseSrvDescriptor __attribute__((__section__(".mcal_bss_no_cacheable"))); hseAttrFwVersion_t hseFwVersion __attribute__((__section__(".mcal_bss_no_cacheable"))); /************************************************************************************************** * Function: GetAttr * * Description: Request to get a HSE attribute * **************************************************************************************************/ hseSrvResponse_t GetAttr(hseAttrId_t attrId, uint32_t attrLen, void *pAttr) { Hse_Ip_ReqType HseIp_Request; hseSrvDescriptor_t* pHseSrvDesc = &hseSrvDescriptor; hseSrvResponse_t hseSrvResponse = HSE_SRV_RSP_GENERAL_ERROR; memset(pHseSrvDesc, 0, sizeof(hseSrvDescriptor_t)); pHseSrvDesc->srvId = HSE_SRV_ID_GET_ATTR; pHseSrvDesc->hseSrv.getAttrReq.attrId = attrId; pHseSrvDesc->hseSrv.getAttrReq.attrLen = attrLen; pHseSrvDesc->hseSrv.getAttrReq.pAttr = (HOST_ADDR)pAttr; HseIp_Request.eReqType = HSE_IP_REQTYPE_SYNC; HseIp_Request.u32Timeout = 0xFFFFFFFFUL; HseIp_Request.pCallbackParam = NULL; HseIp_Request.pfCallback = NULL; hseSrvResponse = Hse_Ip_ServiceRequest(0, 0 , &HseIp_Request, pHseSrvDesc); return hseSrvResponse; } /************************************************************************************************** * Function: GetHseVersion * * Description: Get HSE FW version information * **************************************************************************************************/ hseSrvResponse_t GetHseVersion(hseAttrFwVersion_t *pHseFwVersion) { hseSrvResponse_t srvResponse = HSE_SRV_RSP_GENERAL_ERROR;; srvResponse = GetAttr( HSE_FW_VERSION_ATTR_ID, sizeof(hseAttrFwVersion_t), pHseFwVersion ); DevAssert(HSE_SRV_RSP_OK == srvResponse); return srvResponse; } void Hse_Fw_Information(void) { GetHseVersion(&hseFwVersion); printf("The HSE Firmware Version is %d.%d.%d\n", hseFwVersion.majorVersion, hseFwVersion.minorVersion, hseFwVersion.patchVersion); }
运行后获取版本信息和实际的为一致