对 Rust p256 包的审计

2025 年 4 月 7 日,NEAR 要求 zkSecurity 对 Rust 的p256 crate 进行安全评估,未发现重大问题,代码库经过充分测试且架构良好。

  • 范围组件:包括椭圆曲线(p256 椭圆曲线组操作等)、ECDSA(ECDSA 相关代码)、域算术(曲线的内部标量和基域实现等)。
  • 范围外组件:主要聚焦签名验证,未关注签名生成、常量时间代码、64 位特定代码、无关原语等。
  • 审查的代码库:聚焦p256crate 的最后一次提交32343a78f1522aa5bd856556f114053d4bb938e0,包含从generic-arrayhybrid-array的变更。
  • 参考集成:提供了 NEAR 使用p256crate 的 PR 示例。

p256crate 实现了 NIST P-256 椭圆曲线及相关加密方案,代码组织包括elliptic-curves仓库中的部分及依赖项,如elliptic-curvecrypto-bigint等。

P-256 曲线:定义在素域上,有特定方程和参数,在不同标准中有不同名称,其性质影响实现的性能和安全,如优化乘法和模运算、避免小群攻击等。

BigInt 实现概述crypto-bigintcrate 基于机器字大小表示整数,定义WordLimbUint类型用于表示固定大小的数组, limbs 按小端序排列,便于高效序列化和算术操作。

域实现:P-256 曲线定义在基域和标量域上,大小均为 256 位,实现基于 Montgomery 或 Barrett reduction,Montgomery reduction 适合连续乘法,Barrett reduction 更适合少量乘法,P-256 实现使用 Barrett reduction。

椭圆曲线实现细节p256模块定义曲线属性和算术,primeorder模块提供曲线特定算术,包括点编码(身份、压缩、未压缩、紧凑)、仿射坐标公式、投影坐标优化(避免除法)、混合加法优化、标量乘法(窗口法)等。

ECDSA 概述:遵循多个标准,RustCrypto 的ecdsacrate 采用特定算法和处理方式,如确定性随机数生成、签名规范化、支持公钥恢复等,存在哈希截断导致的安全隐患及确定性随机数生成避免非重用以保护私钥等。

验证算法及实现:包括验证范围、哈希截断、逆运算、双标量运算、联合乘法、最终检查等步骤,可通过哈希消息或直接提供哈希进行验证,实现中利用 Montgomery 和 Barrett reduction 优化算术操作。

评估中发现的问题分为高、中、低严重级别和信息性类别。

阅读 10
0 条评论