#points #decompression #edwards #ed25519 #give #coordinate #ec25519

libecdsautil

为 ec25519 签名提供对 libecdsautil 的安全绑定

5 个版本

0.2.1 2022年8月29日
0.2.0 2022年8月23日
0.1.2 2022年8月19日
0.1.1 2022年8月15日
0.1.0 2022年8月15日

#5#edwards

Download history 4/week @ 2024-03-09 1/week @ 2024-03-16 13/week @ 2024-03-30 4/week @ 2024-04-06 4/week @ 2024-05-18

每月51 次下载
用于 gluon-mesh-vpn-key-transl…

自定义许可

19KB
301

libecdsautil

这将包含对 libecdsautil-sys 的安全封装,但当前仅提供基于 curve25519-dalek 的 fastd 公钥表示以及 dalek-ff-group。

理论

私有 fastd: 282615cc09656f1f3dbe5fa24b640bfd48d8302f982477d38335c2ffab84c17e

派生的公共 fastd: faebc966b4b255d9383f44fb2abc1b8b4d596ced9951a421af4df97f62aa1a7b

公共 fastd 密钥(u8[32]~256位)代表旧曲线上的一个点。Edwards25519(如 Ed25519 所用)上的点应该共享相同的 y 坐标;x 坐标可以通过类似于 ecc_25519_store_xy_legacyecc_25519_load_xy_legacy 的乘法来计算。

在 Ed25519 中,公钥存储在 "Edwards y" 格式中,这意味着前 255 位表示 y 坐标,而最后一个字节的最高位给出 x 的符号。

在 libuecc 中,公钥存储在可以称为 CompressedEdwardsX 的格式中,因为 x 坐标与 y 坐标的最低位(lsb)打包在一起。

未压缩的点表示为四元组 {X,Y,Z,T},其中

$x= {X \over Z}$

$y={Y \over Z}$

$ x*y={T \over Z} $

每个元组的段是 u32[32]~1024位

-> 但最后 24 位实际上是零,而在计算中并不是这样

验证步骤

  • 使用 libuecc 解压缩 fastd 公钥
  • 使用 rusts 的 curve25519_dalek-crate 将解压缩的密钥加载为 EdwardsPoint
  • EdwardsPoint 实现 compressX,它应该再次发出 fastd 公钥
  • CompressedEdwardsX 实现 decompress,与前者相反
  • 然后 fastd 密钥可以加载为 CompressedEdwardsX 并转换为 Dalek 表示,然后输入到 libecdsautil 的验证函数中

压缩_points.rs 中待完成的工作

  • 实现 EDWARDS_D

  • 实现 sqrt_ratio_i()

  • 实现 is_negative / is_odd

  • 实现 conditional_negate

  • 上游 EDWARDS_D

  • 上游 sqrt_ratio_i() https://github.com/serai-dex/serai/pull/87

  • 上游 is_negative / is_odd

  • 上游 conditional_negate

  • 等待下一个上游版本发布并去除下游实现

依赖项

~2.7–5.5MB
~117K SLoC