密钥派生过程

为确保应用层密钥、凭证和其他机密或敏感数据在特定状态下仅能被特定设备唯一访问,Realtek Ameba 系列 SoC 支持通过 KDF 实现唯一绑定。 为防止重新派生出先前使用的密钥,仅受信任代码可访问所有源数据。

../../_images/huk_derivation_device_binding.svg

HUK 的派生经过两个阶段:

  • Boot ROM 阶段(上图左侧蓝色部分)由 Realtek 实现。

  • Bootloader 阶段(上图右侧灰色部分)由客户根据应用需求自己实现。

在 Boot ROM 阶段的密钥派生过程中,HUK 将受到以下保护措施以避免泄露:

  • 在 RMA 状态下读取 HUK 会返回全 FF ,软件无法读取客户预设的 HUK。有效保护派生密钥在 RMA 状态下不被泄露。

  • 当客户的派生密钥泄露时,意味着与这些密钥关联的数据存在暴露风险。客户可更新 manifest.json5 中的 huk_epoch 以重新派生新密钥,并使用新密钥迁移数据。

  • 仅 Secure CPU Boot ROM 阶段可获取 HUK,后续阶段无法读取。

除 HUK 外,其他所有 KDF 输入均为已知。 若在某个阶段获取 HUK,整个密钥派生过程可被复制,所有临时密钥都将暴露。因此需要防止后续阶段获取 HUK。 软件在 Secure CPU Boot ROM 的密钥派生结束时,会将 Sticky 寄存器位写 1 来设置 HUK 为不可读状态,防止后续阶段读取 HUK。 该 Sticky 寄存器位仅可写入 1 不可写 0 ,当且仅当系统复位或从深度睡眠唤醒时清零。

HUK OTP

Secure CPU Boot ROM 通过物理 OTP 中的 HUK_DERIV_EN (物理地址 0x369[2])位决定是否启用 HUK 派生。

  • 默认状态下 SoC 禁用 HUK 派生,启动时不会写入 Sticky 寄存器位,因此量产时烧录密钥后可立即回读密钥来确认烧录是否正确。

    建议在确认 HUK 正确烧录后,再将 HUK_DERIV_EN OTP 位写 0

  • 重新上电后检测到 HUK 派生已启用,软件会在 Boot ROM 阶段写入 Sticky 寄存器位,使得 Secure CPU Boot ROM 阶段退出后无法读取原始 HUK。

名称

物理 OTP 地址

比特数

描述

HUK

0x310~0x31F

128

设备生产时写入的一次性烧录的随机数种子, 用于在启动阶段派生所有其他密钥和标识符

HUK_W_Forbidden_EN

0x364[7]

1

烧写后HUK将不可修改

HUK_DERIV_EN

0x369[2]

1

HUK派生使能

HUK 派生方法

  1. {SDK}\component\soc\amebaxxx\project\manifest.json5 中设置 huk_epoch

    img_id: 0,
    img_ver_major: 1,
    img_ver_minor: 1,
    huk_epoch: 1,
    

    huk_epoch 最大长度为 4 字节,用户可根据需要更新 huk_epoch 以重新派生新密钥。

  2. 烧录 HUK 相关 OTP 位:

    备注

    使用 AT+SEC 命令前需在 menuconfig 中使能 CONFIG_ATCMD_SECURE ,路径: CONFIG SHELL Enable ATCMD SECURE (默认关闭)。

    1. 生成随机种子并烧录:

      AT+SEC=HUK_KEY,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      

      写入后命令会自动回读 OTP 并校验,若校验失败会返回错误信息。 若 HUK 已正确烧录,锁定 HUK 写保护,禁止 HUK 被篡改:

      AT+SEC=HUK_LOCK
      
    2. 使能 HUK 派生:

      AT+SEC=HUK_EN
      

      注意,HUK 派生使能后,任何应用软件都将无法读取 HUK。

  3. 复位设备。

  4. 获取 Boot ROM 阶段派生密钥:

    Boot ROM 阶段通过 Realtek KDF 派生的密钥仅能通过读取 DerivedKey 数组在受信任代码中访问。 基于安全考虑,KDF 所需的所有数据均不可被非受信代码访问。用户只需要在 secure 代码(Secure CPU 的 Bootloader 或 Image3)中声明一个 16 字节的外部数组即可使用:

    extern uint_8 DerivedKey[16];
    
  5. 实现 Bootloader 阶段的密钥派生流程:

    客户基于自有 KDF 或 Realtek 提供的 BOOT_ROM_KeyDeriveFunc 函数在 Secure CPU 的 Bootloader 中为应用派生密钥。需要将上一步中获得的 DerivedKey 作为 secret 进行输入。 比如客户可以在生成密钥的过程中,添加 label 或者 context ,再调用哈希算法生成应用所需密钥。SHA2 等哈希算法不会暴露 secret 较为安全。