云计算百科
云计算领域专业知识百科平台

HSM-18 密码算法与算子参考

项内容
文档编号 HSM-18
适用平台 Infineon AURIX TC387(HSM:ARM Cortex-M3)

1. 目的与适用范围

本篇回答三个问题:HSM 能提供哪些密码算法,每类算法(算子)是做什么的,本工程现在启用了哪些。

“算子”在本系列里指 AUTOSAR 的密码原语(Primitive),也就是“服务类型 + 算法族 + 模式”的一种组合,例如“MAC 生成 + AES + CMAC”。HSM-08 讲怎么新增一个作业,本篇是它的算法字典,用来查“有没有、谁来做、要开什么开关”。

前置阅读:HSM-01、HSM-02、HSM-08。


2. 原理

2.1 算子的四个层次

一个算子从应用到硬件,要经过四层,每一层各有一份“清单”:

层次清单是什么决定什么
硬件外设 TC3xx HSM 的 AES、HASH、PKC、TRNG 哪些算法有硬件加速
软件密码库 vSecPrim 的算法开关 哪些算法的软件实现会被编译进固件
密码驱动 Crypto_30_Hwa、Crypto_30_LibCv 的驱动对象原语列表 一个驱动对象能做哪些算子
Csm Csm 原语和作业 上层(Host 或 HSM 内部)真正能调用哪些算子

某个算子要能被调用,四层都要到位:硬件或软件库有实现,vSecPrim 里开了,驱动对象里映射了,Csm 里配了原语和作业。缺一层都不可用。

2.2 Csm 服务类型

Csm 按“服务类型”组织算子,每种服务类型对应一类输入输出:

服务类型做什么输入输出
哈希(Hash) 把任意长度数据压缩成固定长度摘要 数据 摘要
对称加密 / 解密(Encrypt / Decrypt) 用同一把密钥加密、解密 明文或密文,可带初始向量 密文或明文
认证加密(AEAD) 加密的同时生成认证标签,并可校验附加数据 明文、附加数据、初始向量 密文和标签
消息认证码生成 / 校验(MAC Generate / Verify) 用密钥生成或校验数据的认证码 数据,校验时还有认证码 认证码或校验结果
签名生成 / 校验(Signature Generate / Verify) 用私钥签名,用公钥校验 数据,校验时还有签名 签名或校验结果
随机数(Random Generate) 产生随机字节 无 随机数
密钥生成(Key Generate) 产生新密钥或密钥对 无 写入密钥元素
密钥派生(Key Derive) 从已有密钥材料派生新密钥 密钥和参数 写入密钥元素
密钥交换(Key Exchange) 双方协商出共享秘密 对方公钥 共享秘密

2.3 硬件外设的能力

下表来自 TC3xx 的 HSM 硬件(详见 HSM-01):

外设算法能力说明
AES AES-128,ECB、CBC 等模式 只有 128 位密钥
HASH MD5、SHA-1、SHA-224、SHA-256 SHA-384、SHA-512 没有硬件,要用软件
PKC 最长 256 位的椭圆曲线,覆盖 NIST、Brainpool、Curve25519、Ed25519 用于 ECDSA、EdDSA、ECDH 加速
TRNG 真随机数 按 AIS-31 PTG.2 设计,约 360 kbit/s

2.4 Crypto_30_Hwa 的算子

Crypto_30_Hwa 是硬件驱动。下表是技术参考中它的功能范围;具体平台只支持其中一部分,实际子集以配置里的“已发布信息”为准:

类别驱动支持的算子备注
认证加密 AES-128 GCM、AES-128 GCM-SIV GCM-SIV 取决于平台
对称加密 AES-128 的 ECB、CBC(带或不带 PKCS7 填充)、CTR(不带填充) AES-192、AES-256 取决于平台,TC3xx 的 AES 硬件只有 128 位
随机数 TRNG 支持预取随机数
MAC AES-CMAC,SHA2-224/256/384/512 的 HMAC HMAC 取决于平台是否有对应哈希硬件
哈希 SHA2-224/256/384/512、SHA3-256 取决于平台,TC3xx 只有到 SHA-256 的硬件
签名 NIST P-256、P-384(带预哈希),Ed25519(纯模式、上下文模式、预哈希模式) 取决于平台的 PKC
密钥派生 以 CMAC-AES128 为伪随机函数的计数器模式(NIST SP800-108)

另外,驱动只实现密钥元素的设置、读取、置有效和密钥派生四个密钥接口,其余密钥管理由其他驱动承担。

2.5 Crypto_30_LibCv 的算子

Crypto_30_LibCv 是软件驱动,算法实现在 vSecPrim 里。技术参考列出的功能范围远大于硬件:

类别驱动支持的算子
认证加密 AES-GCM、AES-CCM、ChaCha20-Poly1305
对称加密 AES-128 和 AES-256 的 ECB、CBC、CTR(带 PKCS7、ISO 9797-1 补零或不带填充);RSA PKCS1-V1.5;RSA OAEP(SHA-1、SHA2-256)
哈希 SHA-1、SHA2-256、SHA2-384、SHA2-512、SHA3-256、RIPEMD160、MD5
MAC CMAC AES-128、AES-256;GMAC(AES-128、192、256);SipHash;HMAC-SHA-1、HMAC-SHA2-256、HMAC-SHA2-384、HMAC-RIPEMD-160
随机数 FIPS 186-2;DRBG-AES128、DRBG-AES256(带或不带派生函数);DRBG-SHA2-512
签名 Ed25519 和 Ed25519PH;RSA PKCS1-V1.5 与 PSS(SHA-1、SHA2-256);NIST P-256 与 P-384(不预哈希,或 SHA-1、SHA2-256、SHA2-384、SHA2-512 预哈希);SECp160r1(不预哈希)
密钥派生 计数器模式 KDF;带附录的计数器模式 KDF;NIST 800-56A 串联 KDF;X9.63(SHA2-256、SHA2-512);PBKDF2(HMAC-SHA-1、HMAC-SHA2-256);HKDF(SHA-256,一步和两步);ISO 15118 证书安装与更新;Spake2+
密钥交换 ECDHE(Prime256v1、SECp256r1、SECp384r1);X25519;Spake2+;椭圆曲线 Burmester-Desmedt
密钥生成 全部对称密钥;NIST P-256、P-384 的 ECC 密钥对;Ed25519 密钥对

LibCv 的几个限制:不解析证书(证书由 KeyM 处理,见 HSM-10);密钥长度上限 65535 字节;AES-CCM 和 SHE 的获取 ID 命令只支持单次调用,不支持流式。

2.6 vHsm_Core、Crypto_30_KeyM、vHsm_Custom 的专用算子

这三个驱动提供的不是通用密码算法,而是 HSM 自己的功能:

驱动算子用途
vHsm_Core 安全启动、安全软件下载、安全启动确认、固件更新、安全启动更新、持久化 对应 HSM-12、HSM-13
vHsm_Core 的密钥管理驱动对象 密钥管理 关联 KeyM
Crypto_30_KeyM 远程处理、证书服务、证书元素读取、禁止使用标记 对应 HSM-10
vHsm_Custom 项目自定义 对应 HSM-11

2.7 各类算子介绍

2.7.1 哈希

哈希把任意长度的数据变成固定长度的摘要,同样的输入一定得到同样的摘要,反向很难还原。

算法摘要长度说明
SHA-1 20 字节 已不安全,只用于兼容旧协议(例如 TLS 旧版本)
SHA-256 32 字节 最常用,安全启动、固件更新、证书都用它
SHA-384 48 字节 配合 P-384 使用
SHA-512 64 字节 Ed25519 内部也用它
SHA3-256 32 字节 新一代哈希,少数场合使用
MD5、RIPEMD160 16、20 字节 仅为兼容,不建议新设计使用

哈希的作业可以分块输入(开始、更新、结束),数据很长时不需要一次放进内存。

2.7.2 对称加密与解密

用同一把密钥加密和解密,速度快,适合大量数据。

模式特点注意
ECB 每个 16 字节块独立加密 相同明文得到相同密文,会泄露模式,通常只用于密钥封装等特殊场合
CBC 每个块与前一个密文块异或后再加密,需要初始向量 初始向量必须不可预测;数据长度必须是 16 的倍数,否则要填充
CTR 把计数器加密后与明文异或,相当于流密码 同一把密钥下计数器不能重复;不需要填充,也没有认证

填充方式:不填充(调用者自己保证长度)、PKCS7(补的字节值等于补的个数)、补零(ISO 9797-1,先补一个 0x80 再补零)。

加密本身不保证数据没被篡改。需要防篡改时,要么再加 MAC,要么直接用 AEAD。

2.7.3 认证加密(AEAD)

AEAD 把加密和认证合在一次操作里,输出密文和认证标签;解密时先校验标签,不通过就不返回明文。还可以带“附加数据”:不加密,但参与认证,例如报文头。

算法特点
AES-GCM 最常用,TLS 里使用;初始向量不能在同一把密钥下重复,否则会泄露密钥相关信息
AES-CCM 只支持单次调用
ChaCha20-Poly1305 纯软件友好,没有 AES 硬件时更快

TC3xx 上同一时刻只能处理一个 GCM 作业,所以驱动对象的数量有限制,见 HSM-08 的 2.3 节。

2.7.4 消息认证码(MAC)

MAC 用密钥给数据生成一个短的认证码,接收方用同一把密钥重新计算并比较,能确认数据来源和完整性。

算法认证码长度典型用途
AES-CMAC 16 字节(可截短) SecOC 报文认证、固件更新的 MAC;有 AES 硬件,速度快
HMAC-SHA-256 32 字节 TLS 的 PRF 和记录层认证
HMAC-SHA-1 20 字节 兼容旧版 TLS
GMAC 16 字节 AES-GCM 不加密只认证的用法
SipHash 常见为 8 字节 短输入的哈希表保护,不是通用 MAC

校验 MAC 要用“MAC 校验”服务,不要自己生成再比较,因为常数时间比较和长度处理已经在服务里做好。

2.7.5 随机数
算法类型说明
TRNG 真随机数 来自硬件噪声,约 45 KB/s,慢,适合做种子
DRBG(CTR-DRBG 基于 AES) 确定性随机数 用 TRNG 做种子,速度快,可大量产生
FIPS 186-2 确定性随机数 旧标准,兼容用

DRBG 的重播种间隔、安全强度在 vSecPrim 里设置。

2.7.6 签名

签名用私钥生成,任何人用公钥都能校验。HSM 里最常用在校验:证书链、固件更新、安全启动。

算法密钥长度说明
ECDSA P-256 私钥 32 字节 使用 SHA-256 预哈希,固件更新的签名就是它
ECDSA P-384 私钥 48 字节 更高强度,LibCv 支持,当前未启用
Ed25519 私钥 32 字节,签名 64 字节 内部用 SHA-512,确定性签名,不依赖每次签名的随机数,实现简单安全
RSA 本工程配置的上限为 2048 位 LibCv 支持,当前未启用;运算慢,占 RAM

签名生成用到私钥,量产时私钥通常不放在 HSM 里,只放公钥做校验。

2.7.7 密钥交换

两方各自产生密钥对,交换公钥后各自算出相同的共享秘密,再用密钥派生得到会话密钥。

算法说明
X25519 基于 Curve25519,快,不易出错;本工程已启用
ECDHE P-256、P-384 NIST 曲线上的临时 ECDH,TLS 常用;LibCv 支持,本工程未启用通用 ECDH
Spake2+ 基于口令的认证密钥交换,LibCv 支持,本工程未启用
2.7.8 密钥派生与密钥生成
类别算子用途
密钥派生 计数器模式 KDF、HKDF、X9.63、PBKDF2、串联 KDF 从主密钥派生出多把子密钥,避免一把密钥用于多个目的
密钥生成 对称密钥、ECC 密钥对、Ed25519 密钥对 产生新的密钥,对称密钥的随机性来自 DRBG 或 TRNG

3. 本工程中的配置

3.1 Csm 原语(18 个)

服务类型原语算法与模式处理方式驱动
随机数 CsmPrimitive_RandomTRNG TRNG,结果长度 16 字节 同步 硬件
MAC 生成 Primitive_Hwa_CmacGenerate AES-CMAC,128 位密钥,结果 16 字节 同步 硬件
MAC 生成 CsmPrimitive_CmacGenerateSync AES-CMAC,128 位密钥,结果 16 字节 同步 LibCv
MAC 生成 Tls_HMac_Sha256_Generate HMAC-SHA-256,结果 32 字节 同步 LibCv
MAC 校验 Primitive_Hwa_CmacVerify AES-CMAC,比较长度 128 位 同步 硬件
哈希 Primitive_Hwa_Sha256 SHA-256,结果 32 字节 同步 硬件
哈希 CsmPrimitive_Sha256Sync SHA-256,结果 32 字节 同步 LibCv
加密 Primitive_Hwa_Aes128EcbEncrypt AES-128 ECB,数据最长 80 字节 同步 硬件
解密 Primitive_Hwa_Aes128EcbDecrypt AES-128 ECB,数据最长 80 字节 同步 硬件
加密 Primitive_Hwa_Aes128CbcEncrypt AES-128 CBC,数据最长 80 字节 同步 硬件
解密 Primitive_Hwa_Aes128CbcDecrypt AES-128 CBC,数据最长 80 字节 同步 硬件
加密 Primitive_Hwa_Aes128CtrEncrypt AES-128 CTR,数据最长 80 字节 同步 硬件
解密 Primitive_Hwa_Aes128CtrDecrypt AES-128 CTR,数据最长 80 字节 同步 硬件
签名校验 CsmPrimitive_EcdsaP256Sha256VerifySync ECDSA P-256,SHA-256 同步 LibCv
签名校验 SigVerifyEd25519 Ed25519,内部 SHA-512 异步 LibCv
签名校验 Demo_SigVerifyEd25519Sync Ed25519,数据最长 1024 字节 同步 LibCv
签名生成 Demo_SigGenEd25519Sync Ed25519,签名 64 字节,数据最长 1024 字节 同步 LibCv
密钥生成 密钥生成配置(未单独命名) Ed25519 作业为异步 LibCv

上表按 ECUC 配置里的原语整理,随机数、哈希、MAC 的个别演示作业共用同一个原语,所以作业数(21)比原语数(18)多。自定义驱动的演示作业(Demo_CustomSha256)在 vHsm_Custom 里实现,不属于上表。

3.2 驱动对象与原语的映射

驱动对象原语列表
Hwa:vHSMChannel_vHsm_Hal AES-CMAC 生成与校验、AES 加密与解密(ECB、CBC、CTR 共用)、AES-GCM 加密与解密、SHA-256、TRNG
Hwa:SecOC、SecurityBroadcast AES-CMAC 生成与校验
LibCv:耗时(vHsm_TimeConsuming) AES-CMAC 生成、AES 加解密、AES-GCM 加解密、SHA-256、SHA-512、Ed25519 签名与校验、ECDSA P-256 校验(SHA-1、SHA-256 预哈希)、SECp256r1 签名与校验、SipHash 校验、X25519 共享秘密与公钥计算、DRBG-AES128 与 DRBG-AES256、Ed25519 密钥对生成
LibCv:耗时后台 与“耗时”相同,但没有 Ed25519 密钥对生成
LibCv:TLS 连接 0 AES 加解密、AES-GCM 加解密、HMAC-SHA-1 与 HMAC-SHA-256、SHA-1、SHA-256、FIPS 186-2 随机数、Ed25519 签名与校验、P-256 签名与校验
LibCv:TLS 连接 0 的两个握手哈希 SHA-256
LibCv:TLS 连接 0 高优先级 HMAC-SHA-1 与 HMAC-SHA-256
LibCv:TLS 全局哈希 SHA-1
LibCv:内部专用 Ed25519 密钥对生成
vHsm_Core 安全启动、安全软件下载、安全启动确认、固件更新、安全启动更新、持久化
vHsm_KeyManagement 密钥管理
Crypto_30_KeyM 远程处理、证书服务、证书元素读取、禁止使用标记
vHsm_Custom 占位原语

3.3 vSecPrim 的算法开关

类别已启用未启用
哈希 SHA-1、SHA2-256、SHA2-512 SHA-3、MD5、RIPEMD160
随机数 FIPS 186-2、CTR-DRBG Hash-DRBG
对称加密 AES-128、GCM AES-192、AES-256、CCM、DES、3DES、RC2、ChaCha20
MAC SipHash、CMAC、HMAC-SHA-1、HMAC-SHA2-256 HMAC-SHA2-384、HMAC-RIPEMD160、GMAC、Poly1305
签名 Ed25519(ECDSA 25519)、通用 ECDSA RSA(PSS、V1.5 各种哈希)
密钥交换 X25519(ECDH 25519) 通用 ECDH、ECBD、Spake2+
密钥派生 无 PKCS5、X9.63、PBKDF2、HKDF 全部关闭
RSA 加密 无 OAEP、V1.5
密钥生成 无(ECC 密钥生成关闭) ECC 密钥生成

几个上限参数:ECC 最大密钥长度 256 位;RSA 最大密钥长度 2048 位(RSA 本身未启用);CTR-DRBG 安全强度 128 位。

3.4 当前启用情况的总览

能力当前状态实现
SHA-256 可用 硬件和软件各一份
SHA-1、SHA-512 可用 软件
AES-128 ECB、CBC、CTR 可用 硬件
AES-128 GCM 驱动里已映射 硬件和软件,Csm 没有配置 AEAD 作业,由 TLS 密钥使用
AES-192、AES-256 不可用 软件开关关闭,硬件也只有 128 位
AES-CMAC 可用 硬件和软件
HMAC-SHA-1、HMAC-SHA-256 可用 软件
TRNG 可用 硬件
CTR-DRBG 可用 软件,AES-128
ECDSA P-256 校验 可用 软件
Ed25519 签名、校验、密钥对生成 可用 软件
X25519 驱动里已映射 软件
RSA、ECDH 通用曲线、Spake2+ 不可用 开关关闭
密钥派生(KDF) 不可用 开关关闭
PKC 硬件加速 未使用 椭圆曲线运算全部由软件完成

4. 操作步骤

4.1 选择算法的决策

需求建议算子理由
报文认证(SecOC、车内通信) AES-CMAC,硬件驱动 快,占 CPU 少,与 AUTOSAR 标准一致
数据完整性摘要 SHA-256 通用,有硬件
保密 + 防篡改 AES-GCM 一次完成,且有硬件
只保密 AES-CTR 或 CBC,另外加 MAC 加密本身不防篡改
固件、证书的验签 ECDSA P-256 或 Ed25519 公钥校验,HSM 内不放私钥
建立会话密钥 X25519 加 HKDF 小、快;HKDF 需要在 vSecPrim 启用
大量随机数 CTR-DRBG TRNG 慢,只做种子
兼容旧协议 SHA-1、HMAC-SHA-1 仅在必须兼容时使用

4.2 启用一个当前关闭的算子

以启用 AES-256 CBC(走 LibCv,因为硬件没有 AES-256)为例:

  • 在 vSecPrim 里启用 AES-256。
  • 在 Crypto_30_LibCv 的驱动对象里,把 AES 加密和解密原语加入列表(已映射则略过)。
  • 在 LibCv 里创建 AES-256 的密钥类型和密钥,注意密钥长度为 32 字节。
  • 在 Csm 里新增原语:服务类型选加密,算法族 AES,模式 CBC,密钥长度 32。
  • 按 HSM-08 的 4 节继续:Csm 密钥、作业、队列、通道、CryIf 密钥。
  • 校验、生成、编译,Host 同步预配置。
  • 用标准测试向量验证(见第 5 节)。
  • 4.3 关闭不需要的算子

    不用的算子应该关闭,减小固件体积、减小攻击面:

  • 把原语从驱动对象的原语列表里移除。
  • 在 vSecPrim 里关闭对应算法。
  • 校验、生成、编译,确认固件大小下降。
  • 固件区大小有限(见 HSM-06),新增算法前先看剩余空间。


    5. 验证方法

    下面是公开标准里的测试向量,可以直接用来验证作业的输出:

    算子输入期望输出
    SHA-256 字符串 abc ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
    AES-128(FIPS-197) 密钥 000102030405060708090a0b0c0d0e0f,明文 00112233445566778899aabbccddeeff,ECB 加密 69c4e0d86a7b0430d8cdb78070b4c55a
    AES-CMAC(RFC 4493) 密钥 2b7e151628aed2a6abf7158809cf4f3c,空消息 bb1d6929e95937287fa37d129b756746
    HMAC-SHA-256(RFC 4231 用例 2) 密钥 Jefe,消息 what do ya want for nothing? 5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843
    Ed25519(RFC 8032 测试 1) 空消息,公钥 d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a 签名为 e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b

    通用的验证方法:

    方法操作通过条件
    正向 用标准向量调用作业 输出与标准值一致
    反例 篡改一个字节后做 MAC 校验或签名校验 返回校验失败
    硬件软件对照 同一个输入分别走硬件和软件作业(例如 SHA-256、AES-CMAC) 两者结果相同
    演示命令 命令 1(硬件)、命令 2(软件非对称) PassMask 与预期一致,见 HSM-16

    6. 常见问题

    现象原因处理
    想用的算法在 Csm 原语的下拉里选不到 驱动或 vSecPrim 没有启用,或驱动的已发布信息里平台不支持 先看 2.4、2.5 节的清单,再用求解助手启用
    驱动支持 AES-256,但硬件做不了 TC3xx 的 AES 硬件只有 128 位 走 LibCv 软件实现,并在 vSecPrim 启用 AES-256
    签名校验很慢 椭圆曲线运算由软件完成,没用 PKC 硬件 放到低优先级队列;对速度有要求时评估基于 PKC 的驱动
    RngDrbgAes256Df 已映射但 vSecPrim 里 AES-256 关闭 当前配置里两者不一致 需要 AES-256 的 DRBG 时一并启用,否则把它从原语列表里去掉,具体以生成结果和校验为准
    AES-GCM 同时跑多个作业出错 TC3xx 同一时刻只能处理一个 GCM 作业 控制并发,或限制驱动对象数,见 HSM-08 的 2.3 节
    CBC 加密报数据长度错误 数据长度不是 16 的倍数且没有配置填充 调用方补齐,或选 PKCS7 填充
    同一个 CTR 计数器用了两次 计数器重复使用,安全性丧失 计数器必须在同一把密钥下唯一
    密钥派生作业不存在 vSecPrim 中的 KDF 全部关闭 启用需要的 KDF,并在驱动对象里映射密钥派生原语
    固件变大放不下 启用的算法太多 关闭不用的算法,见 4.3 节

    7. 参考资料

    资料章节用途
    Vector Technical Reference Crypto_30_LibCv 2.1 功能 软件驱动支持的算法清单
    Vector Technical Reference Crypto_30_Hwa 2.1 功能 硬件驱动支持的算法清单
    Vector Technical Reference vSecPrim 配置章节 各算法开关
    Vector User Manual MICROSAR veHsm 4.2 密码原语和驱动对象 原语映射
    AP32489 HSM changes in TC3xx compared to TC2xx 3 PKC;4 HASH 硬件外设能力
    AP32574 HSM Performance Figures Summary 2–6 节 性能数据
    FIPS 197、RFC 4493、RFC 4231、RFC 8032 测试向量 验证用向量
    AUTOSAR SWS Crypto Service Manager 算法族与模式定义 服务类型和算法族命名

    8. 免责声明

    免责声明:本文档内容大部分自动生成,请根据实际情况验证。操作不当容易锁死芯片,请勿随意尝试。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » HSM-18 密码算法与算子参考
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!