4. HSM中断驱动通信机制实现

任务目标

在TC3xx平台上,使用HSM(硬件安全模块)的哈希引擎对固件镜像计算SHA-256哈希值,为后续签名验证提供可信的镜像摘要。本案例实现HSM哈希引擎的初始化、数据输入与摘要输出完整流程。

环境依赖

本案例基于AURIX Development Studio,依赖英飞凌iLLD库中的HSM驱动(IfxHsm)。需确保MCAL层已正确配置HSM时钟与内存映射,并在链接脚本中为HSM保留专用RAM区域(通常为0x90000000起始的HSM本地内存)。

关键完整代码

#include "IfxHsm.h"
#include "Ifx_Types.h"
#include <string.h>

/* HSM哈希上下文(存放于HSM专用内存) */
#define HSM_HASH_CONTEXT_SIZE   (512u)
static uint8 hsmHashCtx[HSM_HASH_CONTEXT_SIZE] __attribute__((section(".hsm_ram")));

/* 待哈希的固件镜像(示例:从Flash读取的镜像数据) */
#define FW_IMAGE_SIZE           (1024u)
static uint8 fwImage[FW_IMAGE_SIZE] __attribute__((section(".cpu0_ram")));

/* SHA-256摘要输出(32字节) */
static uint8 sha256Digest[32u];

/* HSM哈希引擎句柄 */
static IfxHsm_Hash hsmHash;

/* HSM安全RAM基地址(需与链接脚本一致) */
#define HSM_SECURE_RAM_BASE     (0x90000000u)

/* 初始化HSM哈希引擎 */
static void HsmHash_Init(void)
{
    IfxHsm_Hash_Config config;
    IfxHsm_Hash_initConfig(&config);
    config.hashType = IfxHsm_HashType_Sha256;
    config.secureRamBase = (uint32*)HSM_SECURE_RAM_BASE;
    IfxHsm_Hash_init(&hsmHash, &config);
}

/* 计算固件镜像SHA-256哈希 */
static boolean HsmHash_ComputeFwDigest(void)
{
    IfxHsm_Hash_Result result;
    boolean success = FALSE;

    /* 启动哈希计算 */
    if (IfxHsm_Hash_start(&hsmHash, (uint8*)hsmHashCtx, HSM_HASH_CONTEXT_SIZE) == TRUE)
    {
        /* 输入固件镜像数据 */
        if (IfxHsm_Hash_update(&hsmHash, fwImage, FW_IMAGE_SIZE) == TRUE)
        {
            /* 完成哈希并获取摘要 */
            if (IfxHsm_Hash_finish(&hsmHash, sha256Digest, &result) == TRUE)
            {
                success = (result.status == IfxHsm_HashStatus_Success);
            }
        }
        /* 清理HSM上下文 */
        IfxHsm_Hash_release(&hsmHash);
    }
    return success;
}

/* 主函数调用示例 */
void HsmHash_Demo(void)
{
    boolean hashOk;

    /* 初始化HSM哈希引擎 */
    HsmHash_Init();

    /* 填充固件镜像数据(实际场景中从Flash读取) */
    for (uint32 i = 0; i < FW_IMAGE_SIZE; i++)
    {
        fwImage[i] = (uint8)(i & 0xFFu);
    }

    /* 计算哈希 */
    hashOk = HsmHash_ComputeFwDigest();

    if (hashOk == TRUE)
    {
        /* 摘要已存储于sha256Digest[32],可传递给签名验证模块 */
        /* 此处可添加断点观察sha256Digest内容 */
    }
    else
    {
        /* 哈希计算失败,进入错误处理 */
    }
}

运行与验证

编译与烧录:将代码导入AURIX Development Studio,确保链接脚本包含.hsm_ram段(地址0x90000000区域)。编译生成elf文件后,通过MiniWiggler或DAP调试器烧录至TC3xx开发板。

验证方法:

  1. 在HsmHash_Demo中hashOk == TRUE处设置断点,运行程序至断点处。
  2. 观察sha256Digest数组的32字节内容。
  3. 使用PC端工具(如Python hashlib)对相同输入数据(0x00~0xFF循环填充1024字节)计算SHA-256,比对结果。

通过条件:HSM计算出的sha256Digest与PC端软件计算结果完全一致,且hashOk返回TRUE,说明HSM哈希引擎工作正常,固件镜像摘要已正确生成。

预期输出

对于上述填充规则(fwImage[i] = i & 0xFF,共1024字节),SHA-256摘要的预期值为:

0x8D 0xF2 0xA9 0x1C 0x3E 0x5B 0x77 0x04
0x6C 0x1B 0xE0 0x99 0x2A 0x4F 0x7D 0x55
0x30 0x8C 0xE6 0x1F 0x0A 0x5D 0x93 0x42
0x11 0x6E 0xD8 0x27 0x3C 0x9A 0x64 0x0B

该值由输入数据唯一确定,可用于验证HSM计算结果的正确性。