i.MX93 作为 NXP 新一代安全型 SoC,集成 ELE(Embedded Security Element)硬件安全模块,可结合 DM-Crypt(Linux 设备映射加密框架)与 OPTEE(开放可信执行环境)实现块级磁盘加密。该方案通过 OPTEE 提供安全密钥管理,DM-Crypt 实现透明数据加解密,确保存储在 SD 卡、eMMC 等设备上的数据不被非授权访问。本文详解从底层固件编译到加密验证的完整流程,适用于对数据安全要求较高的嵌入式 Linux 场景。
资料获取:使用dm-crypt实现磁盘加密 - i.MX93
1. 核心原理与环境准备
1.1 加密架构核心逻辑
- 三层安全防护:
- 硬件层:ELE 模块提供唯一设备密钥(HUK),用于加密保护用户密钥;
- 可信执行层:OPTEE OS 运行在安全世界,管理加密密钥与加解密运算,隔绝普通世界攻击;
- 应用层:DM-Crypt 作为 Linux 内核模块,通过设备映射(device mapper)将加密逻辑透明嵌入块设备 I/O 流程,上层应用无需修改即可使用加密存储。
- 密钥流转:用户密钥通过 OPTEE 加密生成密钥 blob,存储在普通世界;使用时需通过 OPTEE 解密,确保密钥全程不暴露在普通世界内存中。
1.2 软硬件与工具环境
- 硬件:i.MX93 11x11 EVK 开发板、SD 卡(用于烧录系统与存储加密数据)、USB 调试线;
- 软件:Ubuntu 20.04 主机、NXP Linux 内核源码(linux-imx)、OPTEE OS 源码(imx-optee-os)、U-Boot 源码(uboot-imx)、ATF 源码(imx-atf)、Yocto 预生成镜像(imx93evk-LF6.6.3_1.0.0);
- 工具链:linaro aarch64-linux-gnu-(交叉编译工具链)、imx-mkimage(镜像构建工具)、dd/loSETUP/dmsetup(Linux 磁盘工具)。
1.3 关键依赖组件
| 组件 | 作用 | 核心配置项 |
|---|---|---|
| OPTEE OS | 安全密钥管理与加解密运算 | CFG_IMX_TRUSTED_ARM_CE=y、CFG_HWRNG_PTA=y |
| Linux 内核 | 提供 DM-Crypt 加密框架 | CONFIG_DM_CRYPT=m、CONFIG_TRUSTED_KEYS_TEE=y |
| ATF(BL31) | 引导 OPTEE OS 启动 | SPD=opteed |
| U-Boot | 引导内核与传递 OPTEE 参数 | 适配 i.MX93 EVK 配置 |
2. 分步实现流程
步骤 1:编译 OPTEE OS(安全世界核心)
(1)下载与配置源码
- 克隆 OPTEE OS 源码:
git clone https://github.com/nxp-imx/imx-optee-os.git cd imx-optee-os - 修改配置文件,启用安全加密相关功能:
- 编辑
core/arch/arm/plat-imx/conf.mk,添加以下配置:CFG_IMX_TRUSTED_ARM_CE ?= y CFG_HWRNG_QUALITY ?= 1024 CFG_WITH_SOFTWARE_PRNG ?= n - 编辑
mk/config.mk,启用硬件 RNG 伪 TA:CFG_HWRNG_PTA ?= y
- 编辑
(2)交叉编译 OPTEE OS
- 配置工具链环境变量:
export CROSS_COMPILE64=aarch64-linux-gnu- - 编译适配 i.MX93 EVK 的镜像:
make PLATFORM=imx-mx93evk -j$(nproc) - 编译产物:在
out/arm-plat-imx/core/目录生成tee-raw.bin(OPTEE OS 镜像)。
步骤 2:编译 U-Boot、ATF 与镜像打包
(1)编译 U-Boot
- 下载 U-Boot 源码并编译:
git clone https://github.com/nxp-imx/uboot-imx.git cd uboot-imx make imx93_11x11_evk_defconfig make -j$(nproc) - 编译产物:生成
u-boot.bin、spl/u-boot-spl.bin、arch/arm/dts/imx93-11x11-evk.dtb。
(2)编译 ATF(BL31)
- 下载 ATF 源码并编译:
git clone https://github.com/nxp-imx/imx-atf.git cd imx-atf export LDFLAGS= make PLAT=imx93 SPD=opteed bl31 -j$(nproc) - 编译产物:在
build/imx93/release/目录生成bl31.bin。
(3)打包 Flash 镜像(flash.bin)
- 下载 imx-mkimage 工具并复制依赖文件:
git clone https://github.com/nxp-imx/imx-mkimage.git cd imx-mkimage # 复制OPTEE镜像 cp ../imx-optee-os/out/arm-plat-imx/core/tee-raw.bin iMX93/tee.bin # 复制U-Boot相关文件 cp ../uboot-imx/u-boot.bin iMX93/ cp ../uboot-imx/spl/u-boot-spl.bin iMX93/ cp ../uboot-imx/arch/arm/dts/imx93-11x11-evk.dtb iMX93/ cp ../uboot-imx/tools/mkimage iMX93/mkimage_uboot # 复制ATF镜像 cp ../imx-atf/build/imx93/release/bl31.bin iMX93/ - 下载 DDR 固件与 ELE 固件:
# 下载DDR固件(示例链接,需从NXP官网获取) wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.23.bin chmod +x firmware-imx-8.23.bin ./firmware-imx-8.23.bin --auto-accept cp firmware-imx-8.23/lpddr4_* iMX93/ # 下载ELE固件 wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-ele-imx-0.1.1.bin chmod +x firmware-ele-imx-0.1.1.bin ./firmware-ele-imx-0.1.1.bin --auto-accept cp mx93a1-ahab-container.img iMX93/ - 生成 flash.bin 镜像:
make SOC=iMX93 flash_singleboot - 烧录 flash.bin 到 SD 卡:
sudo dd if=iMX93/flash.bin of=/dev/sdb bs=1K seek=32 # /dev/sdb为SD卡设备
步骤 3:编译带 DM-Crypt 的 Linux 内核
(1)下载与配置内核源码
- 克隆 NXP Linux 内核源码:
git clone https://github.com/nxp-imx/linux-imx.git cd linux-imx - 加载默认配置并启用 DM-Crypt 相关功能:
source /opt/fsl-imx-internal-xwayland/6.1-mickledore/environment-setup-armv8a-poky-linux make ARCH=arm64 imx_v8_defconfig make ARCH=arm64 menuconfig - 关键配置项(通过 menuconfig 勾选):
- Device Drivers → Multiple devices driver support (RAID and LVM) → Device mapper support → Crypt target support(CONFIG_DM_CRYPT=m);
- Security → Trusted keys → TEE based trusted key support(CONFIG_TRUSTED_KEYS_TEE=y);
- 保存配置并退出。
(2)编译内核与模块
make ARCH=arm64 -j$(nproc)
- 编译产物:生成
arch/arm64/boot/Image(内核镜像)、drivers/md/dm-crypt.ko、drivers/md/dm-mod.ko、drivers/crypto/tee_crypto.ko(加密相关模块)。
(3)替换开发板内核
- 将内核镜像与模块复制到开发板:
# 开发板挂载boot分区后,替换内核 scp arch/arm64/boot/Image root@imx93evk:/run/media/boot-mmcblk1p1/ # 复制内核模块 scp drivers/md/*.ko drivers/crypto/tee_crypto.ko root@imx93evk:/root/ - 开发板端重启系统:
reboot
步骤 4:开发板端配置 DM-Crypt 加密
(1)加载加密内核模块
# 加载设备映射与加密模块
insmod dm-mod.ko
insmod dm-crypt.ko
insmod tee_crypto.ko
# 验证模块加载成功
lsmod | grep -E "dm_mod|dm_crypt|tee_crypto"
(2)生成安全密钥 blob
通过 OPTEE 生成加密密钥,并存储为密钥 blob(避免明文存储):
# 定义密钥名称
export KEYNAME=dm_trust_plainkey
# 生成32字节可信密钥(存储在密钥环)
export KEY="$(keyctl add trusted $KEYNAME 'new 32' @s)"
# 导出密钥blob到文件(用于后续加载)
keyctl pipe $KEY > ~/$KEYNAME.blob
# 验证密钥存在
keyctl list @s
- 预期输出:密钥环中出现
trusted: dm_trust_plainkey。
(3)创建加密镜像文件与循环设备
# 创建32MB的空镜像文件
dd if=/dev/zero of=encrypted.img bs=1M count=32
# 将镜像文件映射为循环设备
losetup /dev/loop0 encrypted.img
(4)配置 device mapper 加密映射
# 定义加密算法(AES-CBC模式,基于OPTEE)
export ALGO="capi:cbc-aes-tee-plain"
# 获取循环设备扇区数
export BLOCKS=$(blockdev --getsz /dev/loop0)
# 定义加密映射表:起始扇区 总扇区数 crypt 算法 密钥参数 设备 偏移 标志 扇区大小
export TABLE="0 $BLOCKS crypt $ALGO :32:trusted:$KEYNAME 0 /dev/loop0 0 1 sector_size:4096"
# 创建加密映射设备(名称为encrypted)
dmsetup -v create encrypted --table "$TABLE"
# 验证映射设备创建成功
dmsetup info encrypted
- 预期输出:映射设备状态为
ACTIVE,主设备号 253,从设备号 0。
(5)格式化与挂载加密设备
# 格式化为ext4文件系统
mkfs.ext4 /dev/mapper/encrypted
# 创建挂载点并挂载
mkdir /mnt/encrypted
mount /dev/mapper/encrypted /mnt/encrypted
(6)测试加密存储
# 写入测试文件
echo "This is a test for full disk encryption on i.MX" > /mnt/encrypted/readme.txt
# 卸载加密设备与循环设备
umount /mnt/encrypted
dmsetup remove encrypted
losetup -d /dev/loop0
步骤 5:加密验证(重启后测试)
(1)重新加载密钥与映射设备
# 加载加密模块
insmod tee_crypto.ko
insmod dm-mod.ko
insmod dm-crypt.ko
# 导入密钥blob到密钥环
export KEY_BLOB_NAME=dm_trust_plainkey
export KEYNAME=dm_trust_key_load
keyctl add trusted $KEYNAME "load $(cat ~/$KEY_BLOB_NAME.blob)" @s
# 重新映射循环设备与加密映射
losetup /dev/loop0 encrypted.img
export ALGO="capi:cbc-aes-tee-plain"
export BLOCKS=$(blockdev --getsz /dev/loop0)
export TABLE="0 $BLOCKS crypt $ALGO :32:trusted:$KEYNAME 0 /dev/loop0 0 1 sector_size:4096"
dmsetup -v create encrypted --table "$TABLE"
(2)挂载并验证数据
mount /dev/mapper/encrypted /mnt/encrypted
cat /mnt/encrypted/readme.txt
- 预期输出:成功读取测试文件内容
This is a test for full disk encryption on i.MX,说明加密与解密正常。
3. 关键避坑事项
- OPTEE 配置完整性:必须启用
CFG_IMX_TRUSTED_ARM_CE与CFG_HWRNG_PTA,否则无法使用硬件加密加速与安全密钥生成; - 内核模块依赖:
dm-crypt.ko依赖dm-mod.ko,tee_crypto.ko需先加载,否则模块加载失败; - 密钥 blob 备份:密钥 blob 是解密数据的唯一凭证,需妥善备份,丢失后无法恢复加密数据;
- 扇区大小匹配:加密映射表中
sector_size:4096需与存储设备扇区大小一致,否则会出现 I/O 错误; - 固件版本兼容性:OPTEE OS、ATF、U-Boot 需适配 i.MX93 EVK 与 Linux 内核版本,避免引导失败。
4. 常见问题排查
4.1 OPTEE 编译失败,提示 “CFG_IMX_TRUSTED_ARM_CE 未定义”
- 排查:配置文件修改位置错误,未添加到
core/arch/arm/plat-imx/conf.mk; - 解决:重新检查配置文件路径,确保配置项添加到正确位置。
4.2 内核模块加载失败,提示 “未知符号”
- 排查:内核配置未启用相关依赖,或模块与内核版本不匹配;
- 解决:重新配置内核,确保
CONFIG_DM_CRYPT与CONFIG_TRUSTED_KEYS_TEE启用,重新编译内核与模块。
4.3 dmsetup 创建映射失败,提示 “密钥不存在”
- 排查:密钥名称与
TABLE中指定的$KEYNAME不一致,或密钥未成功导入密钥环; - 解决:通过
keyctl list @s验证密钥存在,确保TABLE中的密钥名称与实际一致。
i.MX93 基于 DM-Crypt+OPTEE 的磁盘加密方案,核心是利用 OPTEE 的安全环境保护加密密钥,DM-Crypt 实现透明块级加密,无需修改上层应用即可实现数据安全存储。整个流程需依次完成 OPTEE OS、ATF、U-Boot、Linux 内核的编译与配置,关键在于确保各组件的安全配置项启用与版本兼容。
该方案适用于工业控制、车载电子、消费电子等需要数据加密的场景,通过硬件安全模块与软件加密框架的结合,有效抵御密钥泄露、设备克隆等安全威胁。
阅读全文
267