扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

i.MX93 基于 DM-Crypt+OPTEE 的磁盘加密实操:安全密钥加持的块级加密方案

3小时前
267
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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 加密架构核心逻辑

  • 三层安全防护:
    1. 硬件层:ELE 模块提供唯一设备密钥(HUK),用于加密保护用户密钥;
    2. 可信执行层:OPTEE OS 运行在安全世界,管理加密密钥与加解密运算,隔绝普通世界攻击;
    3. 应用层: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)下载与配置源码

  1. 克隆 OPTEE OS 源码:
    git clone https://github.com/nxp-imx/imx-optee-os.git
    cd imx-optee-os
    
  2. 修改配置文件,启用安全加密相关功能:
    • 编辑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

  1. 配置工具链环境变量:
    export CROSS_COMPILE64=aarch64-linux-gnu-
    
  2. 编译适配 i.MX93 EVK 的镜像:
    make PLATFORM=imx-mx93evk -j$(nproc)
    
  3. 编译产物:在out/arm-plat-imx/core/目录生成tee-raw.bin(OPTEE OS 镜像)。

步骤 2:编译 U-Boot、ATF 与镜像打包

(1)编译 U-Boot

  1. 下载 U-Boot 源码并编译:
    git clone https://github.com/nxp-imx/uboot-imx.git
    cd uboot-imx
    make imx93_11x11_evk_defconfig
    make -j$(nproc)
    
  2. 编译产物:生成u-boot.binspl/u-boot-spl.binarch/arm/dts/imx93-11x11-evk.dtb

(2)编译 ATF(BL31)

  1. 下载 ATF 源码并编译:
    git clone https://github.com/nxp-imx/imx-atf.git
    cd imx-atf
    export LDFLAGS=
    make PLAT=imx93 SPD=opteed bl31 -j$(nproc)
    
  2. 编译产物:在build/imx93/release/目录生成bl31.bin

(3)打包 Flash 镜像(flash.bin)

  1. 下载 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/
    
  2. 下载 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/
    
  3. 生成 flash.bin 镜像:
    make SOC=iMX93 flash_singleboot
    
  4. 烧录 flash.bin 到 SD 卡:
    sudo dd if=iMX93/flash.bin of=/dev/sdb bs=1K seek=32  # /dev/sdb为SD卡设备
    

步骤 3:编译带 DM-Crypt 的 Linux 内核

(1)下载与配置内核源码

  1. 克隆 NXP Linux 内核源码:
    git clone https://github.com/nxp-imx/linux-imx.git
    cd linux-imx
    
  2. 加载默认配置并启用 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
    
  3. 关键配置项(通过 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.kodrivers/md/dm-mod.kodrivers/crypto/tee_crypto.ko(加密相关模块)。

(3)替换开发板内核

  1. 将内核镜像与模块复制到开发板:
    # 开发板挂载boot分区后,替换内核
    scp arch/arm64/boot/Image root@imx93evk:/run/media/boot-mmcblk1p1/
    # 复制内核模块
    scp drivers/md/*.ko drivers/crypto/tee_crypto.ko root@imx93evk:/root/
    
  2. 开发板端重启系统:
    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. 关键避坑事项

  1. OPTEE 配置完整性:必须启用CFG_IMX_TRUSTED_ARM_CECFG_HWRNG_PTA,否则无法使用硬件加密加速与安全密钥生成;
  2. 内核模块依赖:dm-crypt.ko依赖dm-mod.kotee_crypto.ko需先加载,否则模块加载失败;
  3. 密钥 blob 备份:密钥 blob 是解密数据的唯一凭证,需妥善备份,丢失后无法恢复加密数据;
  4. 扇区大小匹配:加密映射表中sector_size:4096需与存储设备扇区大小一致,否则会出现 I/O 错误;
  5. 固件版本兼容性: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_CRYPTCONFIG_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 内核的编译与配置,关键在于确保各组件的安全配置项启用与版本兼容。

该方案适用于工业控制、车载电子、消费电子等需要数据加密的场景,通过硬件安全模块与软件加密框架的结合,有效抵御密钥泄露、设备克隆等安全威胁。

相关推荐