如何保证 NPU 密码算子算得对?拆解 CANN Crypto 的 KAT 与差分测试机制
如何保证 NPU 密码算子算得对拆解 CANN Crypto 的 KAT 与差分测试机制【免费下载链接】cryptocrypto SIG 是密码学兴趣小组围绕昇腾 NPU 打造高性能密码软件库提供丰富的密码算子与算法实现项目地址: https://gitcode.com/cann/cryptoCANN Crypto 是 crypto SIG 围绕昇腾 NPU 打造的高性能密码软件库提供 SHAKE、Keccak、AES 等丰富的密码算子实现。NPU 密码算子从代码提交到芯片执行要经过多层编译任何一个环节出错都会让密文差一毫、谬以千里。这篇文章拆解 CANN Crypto 的测试体系讲清楚它是如何用KAT 已知答案测试与差分测试层层设卡保证 NPU 密码算子算得对。为什么 NPU 密码算子容易算错一个昇腾密码算子的完整链路大致是op_host 层InferShape 推断输出形状Tiling 计算分核、workspace 等配置op_kernel 层Ascend C 代码被设备编译器编译成指令设备执行在 NPU 上跑真实的向量/矩阵指令。每一层都可能出问题Tiling 边界算错、置换轮常量写错、微块尾部处理漏字节……所以 CANN Crypto 的策略是每一层都有独立的参考实现兜底——参考实现仅参与测试不链接到生产算子包天然杜绝用被测代码自证清白。相关测试说明可直接查看 tests/README.md。第一道防线KAT 已知答案测试KATKnown Answer Test已知答案测试的朴素原理是给定一组固定输入答案在算法标准里是确定的跑一遍对不上就是错。空消息黄金向量以 SHAKE 为例空消息的 SHAKE128/SHAKE256 前 16 字节在标准中是固定值。golden.py 用 Python 标准库hashlib独立计算参考结果并把黄金向量硬编码进用例——7f9c2ba4e88f827d616045507605853eSHAKE128和46b9dd2b0ba88d13233b3feb743eeb24SHAKE256。这种答案写死在测试里的用例一旦回归问题肉眼可见。全零初态置换 KATKeccak-f[1600] 的核心是 24 轮置换。golden.py 用独立的 Python 置换实现含完整的轮常量表与 RHO 旋转偏移对全零初态做 KAT24 轮后第 0 道必须等于f1258f7940e1dde7。这是 Keccak 规范中最经典的自检向量等价于给置换引擎做一次出厂标定。第二道防线差分测试Differential TestingKAT 只能覆盖有限用例而密码算法要面对任意长度的消息。差分测试的思路是两套完全独立的实现喂同样的输入输出必须逐字节一致。纯 C 参考 vs OpenSSL 差分test_reference_diff.cpp 是典型的差分测试仓库内置的纯 C 参考实现CannCryptoRefShake与 OpenSSL 的EVP_shake128/EVP_shake256分别计算同一输入逐字节比较。它的用例设计值得新手学习——长度专门踩边界输入长度0、1、63、64、rate-1、rate、rate1、2*rate-1、2*rate、2*rate1SHAKE128 的 rate 是 168SHAKE256 是 136输出长度1、31、32、64、rate-1、rate、rate1、2*rate3。这些±1长度正是吸收/挤出跨块、微块尾部出错的重灾区。任意一组不一致即打印differential mismatch并失败。NPU 设备结果 vs 独立参考差分真正跑在昇腾 NPU 上的结果也要做差分。test_aclnn_sha3.cpp 包含 5 个 Keccak 用例和 36 个 SHAKE 用例Keccak 对比纯 C 参考SHAKE 对比 OpenSSL EVP 独立参考在真机上逐字节比较覆盖空消息、rate 前后边界、多块吸收、多块输出及尾组。Keccak 的设备测试则把 batch 压到 64、256、1024、4096、8192 批量级见 tests/README.md。第三道防线Kernel UT不用 NPU 也能验证设备测试需要真机而日常开发迭代等不起。CANN Crypto 提供了基于tikicpulib的 CPU 调试模式test_shake_tensor.cpp 用 GTest 在 CPU 上执行真实 SHAKE Kernel覆盖空消息、微块尾部、跨 rate 吸收和多块输出期望结果由独立纯 C 参考生成Keccak 侧的 test_keccak_f1600_tensor.cpp 通过ICPU_RUN_KF调用实际 Kernel 与纯 C 参考比较test_permutation.cpp 则对生产置换头做 Host 算术模型校验928 个状态甚至细化到 XorSlot 在输出与输入槽位重合时的边界行为。这套 Kernel UT 默认关闭-DCANN_BUILD_CPU_DEBUG_TESTSON启用不需要 NPU每个程序默认限时 1800 秒——让开发者在 CI 排队跑真机之前先在本地把 90% 的错误拦下来。⚡第四道防线压力测试与 CI 门禁百次重复跑压力测试正确性问题有时是概率性的竞争、脏数据。stress.py 连续启动 100 次独立进程每次运行两个算法的 4 个代表形状任一进程失败或超时立即终止全部日志落盘到results/stress/便于复盘。CI 分层门禁CI 按算子层级分门禁见 scripts/ci/ut.shophost、opapi、opgraph、opkernel四层 UT 各管一段——op_host 层检查算法选择、尺寸校验、Tiling 结构与 workspaceopkernel 层在 smoke.sh 中于带昇腾 NPU 的容器里编译全部组件并实跑设备用例。PR 只改文档时自动跳过避免无谓消耗算力。NTT 基线回归后量子密码相关的 NTT 模块还有一层数据回归acceptance_baselines.tsv 记录了 ML-KEM、ML-DSA 的验收基线含来源版本指纹compare_data.py 和 compare_pqc_data.py 负责与基线及外部参考数据逐组比对防止内核改动悄悄改变结果。小结四层防线一张图层级手段特点KAT 已知答案空消息黄金向量、全零初态置换答案硬编码回归一目了然差分测试纯 C 参考 vs OpenSSL vs NPU 设备结果双独立实现逐字节比较专打边界长度Kernel UTtikicpulib CPU 实跑 Kernel无需 NPU本地快速拦截压力 CI100 次独立进程、四层 UT 门禁、NTT 基线概率性缺陷与持续回归双保险核心思想一句话永远用独立实现验证生产实现把边界长度当作用例设计的起点。这套 KAT 差分 真机 压测的组合拳就是 CANN Crypto 让 NPU 密码算子算得对、敢发布的底气。✅更多细节可查阅 SHAKE 测试说明 与 Keccak 测试说明。【免费下载链接】cryptocrypto SIG 是密码学兴趣小组围绕昇腾 NPU 打造高性能密码软件库提供丰富的密码算子与算法实现项目地址: https://gitcode.com/cann/crypto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考