4. HSM 中断处理机制实现

任务目标

在RH850 U2A HSM环境中,通过HSM固件提供的AES硬件加速接口,实现AES-128 ECB模式的单块(16字节)数据加密与解密,并验证加解密结果的正确性。

前置条件

本案例基于HSM固件开发环境,需要已正确配置HSM时钟与安全启动流程。AES硬件加速由HSM固件内部驱动,应用层通过HSM标准API调用,无需直接操作寄存器。依赖的头文件为HSM固件包提供的hsm_api.h。

核心实现

以下代码实现AES-128 ECB模式单块加解密。使用固定测试密钥与明文,通过HSM API完成硬件加速操作,并对比加解密结果验证正确性。

#include "hsm_api.h"
#include <string.h>
#include <stdio.h>

/* 测试密钥:16字节 = 128位 */
static const uint8_t test_key[16] = {
    0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
    0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C
};

/* 测试明文:16字节 = 1个AES块 */
static const uint8_t test_plaintext[16] = {
    0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
    0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A
};

/* 已知正确密文(用于验证) */
static const uint8_t expected_ciphertext[16] = {
    0x3A, 0xD7, 0x7B, 0xB4, 0x0D, 0x7A, 0x36, 0x60,
    0xA8, 0x9E, 0xCA, 0xF3, 0x24, 0x66, 0xEF, 0x97
};

int aes128_ecb_demo(void)
{
    hsm_err_t err;
    hsm_context_t ctx;
    hsm_key_t key;
    uint8_t ciphertext[16] = {0};
    uint8_t decrypted[16] = {0};

    /* 初始化HSM上下文 */
    err = hsm_ctx_init(&ctx);
    if (err != HSM_OK) {
        printf("HSM context init failed: %d\n", err);
        return -1;
    }

    /* 加载密钥到HSM */
    key.key_type = HSM_KEY_TYPE_AES_128;
    key.key_addr = (uint32_t)test_key;
    key.key_size = sizeof(test_key);
    err = hsm_key_load(&ctx, &key);
    if (err != HSM_OK) {
        printf("Key load failed: %d\n", err);
        hsm_ctx_deinit(&ctx);
        return -1;
    }

    /* 加密:ECB模式,单块 */
    err = hsm_aes_ecb_encrypt(&ctx, &key,
                              test_plaintext, sizeof(test_plaintext),
                              ciphertext, sizeof(ciphertext));
    if (err != HSM_OK) {
        printf("AES encrypt failed: %d\n", err);
        hsm_key_delete(&ctx, &key);
        hsm_ctx_deinit(&ctx);
        return -1;
    }

    /* 验证密文与预期一致 */
    if (memcmp(ciphertext, expected_ciphertext, 16) != 0) {
        printf("Ciphertext mismatch!\n");
        hsm_key_delete(&ctx, &key);
        hsm_ctx_deinit(&ctx);
        return -1;
    }
    printf("Encrypt OK\n");

    /* 解密:使用相同密钥 */
    err = hsm_aes_ecb_decrypt(&ctx, &key,
                              ciphertext, sizeof(ciphertext),
                              decrypted, sizeof(decrypted));
    if (err != HSM_OK) {
        printf("AES decrypt failed: %d\n", err);
        hsm_key_delete(&ctx, &key);
        hsm_ctx_deinit(&ctx);
        return -1;
    }

    /* 验证解密结果与原始明文一致 */
    if (memcmp(decrypted, test_plaintext, 16) != 0) {
        printf("Decrypted data mismatch!\n");
        hsm_key_delete(&ctx, &key);
        hsm_ctx_deinit(&ctx);
        return -1;
    }
    printf("Decrypt OK\n");

    /* 清理 */
    hsm_key_delete(&ctx, &key);
    hsm_ctx_deinit(&ctx);
    return 0;
}

编译与运行

  1. 将上述代码保存为aes128_ecb_demo.c,并链接HSM固件库(如libhsm.a)。
  2. 编译命令示例(具体路径按实际环境调整):
cc -I/path/to/hsm/include aes128_ecb_demo.c -L/path/to/hsm/lib -lhsm -o aes128_demo
  1. 在目标板或模拟器上运行:./aes128_demo

验证方法

程序运行后,串口输出以下内容即表示加解密链路正确:

Encrypt OK
Decrypt OK

若输出Ciphertext mismatch!或Decrypted data mismatch!,说明HSM硬件加速结果与预期不符,需检查密钥加载流程或HSM固件配置。

常见问题

  • HSM上下文初始化失败:确认HSM固件已正确启动,且hsm_ctx_init在安全域内被调用。
  • 密钥加载失败:检查密钥地址是否在HSM可访问的内存范围内,部分HSM要求密钥位于特定安全RAM区域。
  • API名称差异:不同HSM固件版本的API命名可能略有不同,请以实际固件头文件为准。