ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CANN Crypto 架构设计揭秘:分层依赖如何让密码算子高效复用

CANN Crypto 架构设计揭秘:分层依赖如何让密码算子高效复用 CANN Crypto 架构设计揭秘分层依赖如何让密码算子高效复用【免费下载链接】cryptocrypto SIG 是密码学兴趣小组围绕昇腾 NPU 打造高性能密码软件库提供丰富的密码算子与算法实现项目地址: https://gitcode.com/cann/cryptoCANN Crypto 是 CANNCompute Architecture for Neural Networks中面向昇腾 NPU的密码学算子与算法库提供 AES、SM2/SM3/SM4、SHA-2/3、ML-KEM、ML-DSA 等丰富的密码算子与算法实现。它的核心设计思想是分层依赖按数学引擎、密码原语、算法服务三层组织代码依赖只能向下流动让下层能力被多个算法族复用——这正是密码算子高效复用的关键。本文用一次清晰的架构拆解带你快速看懂这套设计。一张图看懂 CANN Crypto 分层依赖先看整体目录与依赖方向箭头一律向下绝不回头include/cann_crypto/ 对外稳定 C ABI唯一承诺兼容性的边界 │ src/api/ ABI 校验、句柄/plan 生命周期、算法分发 │ src/core/ 运行时handle / stream / workspace / 密钥管理 │ src/algorithms/ 算法服务digest / aead / mac / kdf / signature / kem │ src/primitives/ 密码原语AES、SM4、Keccak-f、ChaCha、GHASH、EC │ src/math/ 数学引擎大数模乘、NTT/RNS、GF(2^k)、位平面转置 │ reference/ 纯 C 参考实现零 CANN 依赖正确性基准分层规则写在根 README 中非常明确分层依赖只能向下algorithms/与primitives/不实现数学运算需要时下沉到math/算法族之间不互相依赖。 —— README.md每层职责拆解从 C ABI 到数学引擎每一层都有各自的 README.md 说明职责与约束。下面逐层说明它们做什么和不做什么。1️⃣ include api唯一的兼容边界对外接口是纯 C ABI不出现 C 类型、异常、模板公共描述符带structSize/version字段保证 ABI 可平滑演进见 include/cann_crypto/README.md。src/api/ 负责边界校验空指针、版本、缓冲区重叠等、句柄与 plan 生命周期管理并按算法枚举分发到algorithms/。关键点算法特有的参数校验密钥、nonce、tag 长度不在这里重复而是下沉到各算法的op_host/避免一处改、处处漏。2️⃣ core所有算法族共用的控制面src/core/ 提供所有算法族共享的运行时能力能力说明Handle / Stream / workspace资源与计划缓存的统一管理密钥对象管理导入、device 常驻缓存、usage 限制、销毁清零资源配额与 AI 负载共存时的 stream 优先级、core 预算公共设施错误码、日志、内存清零约束只有一条但很硬不依赖任何具体算法。这样新算法接入时无需改动运行时。3️⃣ math被所有算法族共享的数学引擎src/math/ 是整个复用体系的地基大数与模运算Montgomery、BarrettNTT / INTT / RNS后量子密码的命脉GF(2^k) 域运算对称密码的土壤位平面转置、面向 Cube 单元的限位整数卷积两条铁律本目录有单一 ownerprimitives/与algorithms/不得自行实现本目录已覆盖的运算。这就是复用能发生的根本原因——数学只写一遍。4️⃣ primitives密码原语层src/primitives/ 存放算法内核AES、SM4、Keccak-f、ChaCha、GHASH、Poly1305、EC 点运算等。值得注意的设计决策这些原语单独使用并不构成完整的安全服务比如 GHASH 本身不是 MAC因此不对最终用户默认暴露。它是给上层算法用的零件而非给用户用的产品。5️⃣ algorithms只做组合与调度src/algorithms/ 提供语义完整的密码服务按digest/aead/mac/kdf/signature/kem等算法族分目录。约束是只做组合、参数校验与调度不实现数学运算算法族之间不得互相依赖需要共用能力时下沉到primitives/或math/。复用如何发生3 个真实例子分层架构的价值体现在写一次、用多处。以仓库中已有的代码为例 例 1Keccak-f 一个原语撑起两个算法Keccak-f[1600] 置换实现位于 src/primitives/keccak/而 SHAKE128 / SHAKE256 两个 XOF 算子位于 src/algorithms/hash/shake/。算法服务层只负责吸挤squeeze的调度与输出长度控制置换本体零重复——同族再加 SHA3-256 时新增的只是薄薄一层组合。 例 2NTT 引擎服务整个后量子密码族src/math/ntt/ 提供完整的 NTT/RNS 数学引擎且自带 CANN 算子适配见 ntt_adapter.h。ML-KEM、ML-DSA 这类基于多项式环的算法全部复用同一套数论变换实现而不是各自造轮子。 例 3AES 模式扩展 原语组合src/primitives/AES/ 下 CTR 与 GCM 两条模式线分别复用 AES 分组加密内核GCM 再叠加 GHASH 原语。对称密码新模式的成本被压缩到组合逻辑级别。算子内部三层协作op_api / op_host / op_kernel宏观分层解决算法间的复用每个算子内部还有一套与 CANN 算子仓一致的微观分层alg/ ├── alg_internal.h # 中性类型内部接口原生 API 与 aclnn 入口共用 ├── alg_launch.cpp # kernel 组合与变体选择 ├── op_api/ # aclnn 两段式入口 ├── op_host/ # 算子定义、infershape、tiling ├── op_kernel/ # Ascend C 实现 └── tests/以一个真实算子为例shake 算子目录 中的分工是目录职责复用要点op_host/算子注册、形状推导、tilingtiling 接口只接受中性标量类型原生 API 与 aclnn 入口共用同一份实现op_kernel/Ascend C 设备端实现Shake128/256 共用同一套 uniform u32 向量核仅参数不同tests/ut / st 分级验证与 reference 基准做差分比对这个中性接口细节很妙同一份 tiling 逻辑同时服务两种调用入口从机制上杜绝了两份实现漂移分叉。正确性如何兜底reference 独立基准高性能设备端代码最怕算错了还跑得欢。reference/ 目录放各算法的纯 C 参考实现三条约束保证它是独立 oracle只求显然正确不做任何优化零 CANN 依赖无设备机器也能单独编译不得 includesrc/下任何文件——一旦与被测实现共享代码就不再是独立基准。tests/host/的差分测试以它为基准例如 golden.pyKAT 与差分测试因此能进 PR 门禁。这是分层 独立基准组合在工程上的完整闭环。给新手的分层开发速查表 ✍️写新代码前先问自己我属于哪一层我要做的事放到哪里别做的事新增数学运算模乘、NTT 变体等src/math/在算法里顺手实现一遍新增密码原语内核src/primitives/让两个算法族互相 include新增完整算法服务src/algorithms/ 对应算法族目录在 algorithms 层写数学运算新增对外接口字段include/cann_crypto/ 带 structSize/version 演进暴露内部结构体成员补充正确性基准reference/引用src/下任何代码更多贡献规范见 CONTRIBUTING.md各层职责以目录内 README 为准。小结CANN Crypto 的分层依赖可以浓缩成三句话依赖只向下算法 → 原语 → 数学永不回头能力下沉复用数学引擎单一 owner原语跨算法族共享边界清晰可信C ABI 是唯一兼容承诺reference 是独立正确性基准。理解了这套结构你就能快速判断任何新密码算子该落在哪一层、复用什么、避免什么重复实现——这正是这套架构能持续高效扩展的底层原因。【免费下载链接】cryptocrypto SIG 是密码学兴趣小组围绕昇腾 NPU 打造高性能密码软件库提供丰富的密码算子与算法实现项目地址: https://gitcode.com/cann/crypto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表