如何使用 RustCrypto (ECDSA) 签署文件?

How can I sign a document using RustCrypto (ECDSA)?

我对 Rust 还很陌生,但我正在尝试构建一个类似于用 Rust 编写的 OpenSSL 的命令行工具。

我正在尝试使用 Rust Crypto 和 ecdsa crate 实现数字签名。我已经有了一个散列文件,接下来的步骤如下:

现在我不确定如何使用 ecdsa crate。如何生成私钥?

可以在文档中找到生成私钥的示例 here。它有点隐藏,因为密钥 pair 生成特定于所使用的曲线:

use p256::{
    ecdsa::{SigningKey, Signature, signature::Signer},
};
use rand_core::OsRng; // requires 'getrandom' feature

// Signing
let signing_key = SigningKey::random(&mut OsRng); // Serialize with `::to_bytes()`

请注意,ECDSA 的工作方式与 RSA 略有不同,因此您不要使用私钥“加密”散列(实际上,这对 RSA 也是一个错误的描述).您将改用签名者,消息的散列通常被视为其中的一部分。该示例还展示了如何执行此操作。

文档非常糟糕,下面似乎使用了 SHA-256 作为哈希算法,但这不在本页上。在源代码中我发现:

impl ecdsa_core::hazmat::DigestPrimitive for NistP256 {
    type Digest = sha2::Sha256;
}

所以我希望 Rust 用户确实了解如何设置/取消设置散列。