libsodium 通过难以误用的函数,提供一小组经过精心取舍的原语;PHP 内置了它,许多语言绑定在使用它,即时通讯应用也嵌入了它。签名只支持 Ed25519:1.0.22 的头文件(基于 Alpine 3.24.2 的软件包检查)没有声明任何 ECDSA 函数,因此凡是使用 ES256 或 secp256k1 的场景都需要另找一个库。
Ed25519 签名按 RFC 8032 的规定是确定性的——同一消息的两个签名完全相同——crypto_sign_*_ph 函数实现 Ed25519ph,它的签名与普通 Ed25519 签名不能互换:在检查中,普通验证器拒绝了这样的签名。私钥为 64 字节,即 32 字节的种子后接公钥,而其他大多数库只保存种子;如示例所示,crypto_sign_ed25519_sk_to_seed 和 crypto_sign_seed_keypair 可在两者之间转换。
在各实现行为不一的地方,libsodium 的验证很严格。把 S 替换为 S + L 的签名——它与原值模群的阶同余,但 RFC 8032 禁止这种形式——被拒绝了;以小阶的单位元点作为公钥来验证的签名也被拒绝。接受这些输入的库会在边界情况上与 libsodium 得出不同结论,这对必须就有效性达成一致的共识系统很重要。crypto_sign_verify_detached 不接收签名长度参数,而是恰好读取 64 字节,因此调用前要先检查长度。
1.0.22 的后量子支持仅限于密钥封装:crypto_kem_mlkem768_*(公钥 1184 字节,密文 1088 字节),以及混合方案 X-Wing(crypto_kem_xwing_*,分别为 1216 字节和 1120 字节),后者也是通用 crypto_kem_* 函数的默认方案。不支持 ML-DSA 或其他后量子签名。密钥始终是原始字节——32 字节的公钥和种子——不支持 PEM、DER 或 JWK。可以在后量子 KEM 工具中比较各 KEM 的数据大小。