| 文档编号 | 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)为例:
4.3 关闭不需要的算子
不用的算子应该关闭,减小固件体积、减小攻击面:
固件区大小有限(见 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. 免责声明
免责声明:本文档内容大部分自动生成,请根据实际情况验证。操作不当容易锁死芯片,请勿随意尝试。
网硕互联帮助中心




评论前必须登录!
注册