LPC5500 MCU系列中利用Arm TrustZone增强安全性
了解Arm TrustZone如何增强NXP LPC5500单片机的安全性,以及如何实现安全与非安全应用。
随着联网设备激增,复杂威胁也随之而来。NXP在LPC5500 MCU系列中嵌入了强大的安全原语,包括符合FIPS标准的随机数生成器、用于执行加密代码的"Prince"加密引擎,以及基于PUF技术生成的4096位片上密钥。结合片上加密加速器"CASPER",这些MCU成为要求端到端密钥配置和弹性网络安全的边缘物联网部署的理想选择。
这一能力的核心是面向Cortex-M的Arm TrustZone。以下章节将带您了解其基本原理及在项目中的应用。
面向Cortex-M的Arm TrustZone
TrustZone创建两个隔离的执行上下文:托管专有或敏感代码的安全世界,以及运行用户应用的非安全世界。厂商的专有库可驻留在ROM中,防止逆向工程,同时仍可通过受控接口供应用代码调用。
图1展示了安全ROM与非安全用户代码在同一芯片上共存的情况。
两个世界间的切换由TrustZone的安全扩展管理,确保非安全应用只能调用暴露的安全函数,无法直接访问安全内存。
带TrustZone的处理器模式
Cortex-M3和M4内核提供线程模式和处理程序模式及其特权/非特权级别,而Cortex-M33增加了TrustZone,产生四种模式:非安全线程、安全线程、非安全处理程序、安全处理程序。这种分离也为每个域引入了独立的SysTick定时器。
内存分区
TrustZone为地址范围分配安全属性:安全(S)、非安全(NS)和非安全可调用(NSC)。对各区域的访问取决于内核的当前状态。例如LPC55S69将第28位为低的地址视为非安全,其余为安全,程序存储器除外,可通过安全属性单元(SAU)配置。
构建安全应用
安全代码不直接暴露内部实现,而是发布veneer表——一层薄薄的非安全可调用函数,将调用转发到安全世界。veneer表驻留在NSC内存中,真实实现位于安全内存。
典型安全项目编译为目标库和声明veneer函数的头文件。非安全应用仅包含头文件;运行时veneer表中介对安全服务的调用。
世界间切换
两条特殊指令管理状态切换:
SG—— 将内核切换到安全模式。BXNS—— 返回非安全模式控制权。
非安全调用序列如下:
// 非安全代码
SG(); // 进入安全世界
SecureFunc(); // 通过veneer调用安全服务
BXNS(); // 返回非安全
任何非法访问都会触发安全故障异常,保障系统完整性。
安全Hello World示例
LPCXpresso55S69 SDK包含TrustZone演示,将构建拆分为安全和非安全项目。安全项目以早期初始化调用开始:
__attribute__((cmse_nonsecure_entry)) void BOARD_InitTrustZone(void);
该函数配置SAU、IDAU和内存分区。非安全主函数保持简洁,因为所有设置在安全域处理:
int main(void) {
// 最小非安全代码
return 0;
}
当非安全侧需要安全服务时,调用veneer函数,如PRINTF_NSE():
void PRINTF_NSE(const char *format, ...) __attribute__((cmse_nonsecure_entry));
对应的安全实现驻留在安全项目中并导出到veneer表。
内存分区工具
在MCUXpresso中,TEE视角提供SAU和IDAU配置的可视化编辑器:
使用左侧表格设置各区域安全级别,右侧地图将反映分区结果。
TrustZone对LPC5500的重要性
TrustZone为LPC5500提供清晰的关注点分离:安全世界保护专有代码和加密密钥,非安全世界承载用户应用。硬件保证非法内存访问被阻断,软件基础设施(veneer表、SG/BXNS指令、TEE工具)简化安全应用开发。
深入了解可观看NXP网络研讨会《TrustZone:调用安全世界》或查阅官方文档。
行业文章是合作伙伴与All About Circuits读者分享有用新闻、信息和技术的内容形式,编辑内容不太适合此用途。所有行业文章均遵循严格编辑指南,旨在为读者提供有用新闻、技术专长或故事。行业文章观点为合作伙伴所有,不一定代表All About Circuits或其作者观点。
云计算