3. HSM密钥存储与读取验证

HSM密钥存储与读取验证 学习卡片

任务目标

验证RH850 U2A的HSM模块能够将密钥安全写入非易失性存储区,并在掉电重启后正确读取该密钥,且读取结果与写入值完全一致。本案例聚焦密钥存储与读取的闭环验证,不涉及密钥使用阶段的加解密操作。

环境依赖

  • 硬件:RH850/U2A评估板(集成HSM核)
  • 软件:CS+ for CC(或E2 Studio),RH850 FCL(Flash Control Library)驱动,HSM固件已烧录至HSM核
  • 调试工具:Renesas Flash Programmer(用于确认HSM固件版本)

实现原理

HSM核拥有独立于主核的Flash区域。主核通过Mailbox向HSM发送存储/读取命令,HSM固件内部调用FCL完成Flash擦写与读取。本案例使用HSM提供的HSM_KeyStore()与HSM_KeyRead()服务原语,主核侧仅需构造请求并解析响应。

关键完整代码

/* hsm_key_storage_test.c */
#include "hsm_api.h"
#include "r_mailbox.h"
#include <string.h>

#define KEY_SLOT_ID      0x01u
#define KEY_DATA_SIZE    32u   /* AES-256密钥长度 */

/* 测试密钥:固定模式便于比对 */
static const uint8_t test_key[KEY_DATA_SIZE] = {
    0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
    0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
    0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
    0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F
};

static uint8_t read_back[KEY_DATA_SIZE];

/* 主核侧调用入口 */
void hsm_key_storage_test(void)
{
    hsm_status_t status;
    uint32_t mail_result;

    /* 1. 发送密钥存储请求 */
    status = HSM_KeyStore(KEY_SLOT_ID, test_key, KEY_DATA_SIZE);
    if (HSM_OK != status) {
        /* 存储请求发送失败处理 */
        while(1);
    }

    /* 2. 等待HSM处理完成并获取结果 */
    mail_result = R_MAILBOX_WaitResult(HSM_CHANNEL, HSM_TIMEOUT_MS);
    if (HSM_CMD_SUCCESS != mail_result) {
        /* HSM返回错误:Flash写入失败或参数非法 */
        while(1);
    }

    /* 3. 发送密钥读取请求 */
    status = HSM_KeyRead(KEY_SLOT_ID, read_back, KEY_DATA_SIZE);
    if (HSM_OK != status) {
        while(1);
    }

    mail_result = R_MAILBOX_WaitResult(HSM_CHANNEL, HSM_TIMEOUT_MS);
    if (HSM_CMD_SUCCESS != mail_result) {
        while(1);
    }

    /* 4. 比对读取值与原始密钥 */
    if (0 == memcmp(test_key, read_back, KEY_DATA_SIZE)) {
        /* 验证通过:密钥存储与读取一致 */
        test_pass_indicator = 1u;
    } else {
        /* 验证失败:数据不一致 */
        test_pass_indicator = 0u;
    }
}

运行与验证

  1. 将上述代码集成到主核工程,确保hsm_api.h路径已包含,Mailbox驱动已初始化。
  2. 编译并烧录至评估板,在main()中调用hsm_key_storage_test()。
  3. 首次运行时,HSM会将密钥写入其专用Flash区域。
  4. 观察test_pass_indicator变量:若为1,说明存储与读取一致。
  5. 掉电重启验证:重新上电后,仅调用HSM_KeyRead()读取同一槽位,比对读取值与test_key是否一致。若一致,证明密钥已持久化存储且可正确恢复。

通过判定标准

  • 首次运行时test_pass_indicator == 1,且HSM未返回任何错误码。
  • 掉电重启后,密钥读取值与写入值逐字节一致(memcmp返回0)。
  • 连续执行10次存储/读取循环,每次均比对通过,无偶发错误。

常见问题

  • HSM返回参数错误:检查KEY_SLOT_ID是否在HSM固件允许的槽位范围内(通常为0x00~0x0F)。
  • Flash写入超时:确认HSM核供电稳定,且FCL库已正确初始化;若HSM固件版本过旧,需升级。
  • 重启后读取全0xFF:说明密钥未实际写入Flash,检查HSM存储命令是否返回成功,以及HSM核的Flash写保护是否已解除。