开放SSL

密码学和 SSL/TLS 工具包

EVP_SIGNATURE-ED25519

名称

EVP_SIGNATURE-ED25519, EVP_SIGNATURE-ED448, Ed25519, Ed448 - EVP_PKEY Ed25519 和 Ed448 支持

描述

Ed25519Ed448 EVP_PKEY 实现支持使用 RFC 8032 中描述的 EdDSA 签名方案进行密钥生成、一次性摘要签名和摘要验证。它具有与 RFC 8410 兼容的关联私钥和公钥格式。

EdDSA 实例

RFC 8032 描述了五个 EdDSA 实例:Ed25519、Ed25519ctx、Ed25519ph、Ed448、Ed448ph。

实例 Ed25519、Ed25519ctx、Ed448 被称为 PureEdDSA 方案。对于这三个实例,签名和验证过程需要访问完整的消息(而不是消息的摘要)。

实例 Ed25519ph、Ed448ph 被称为 HashEdDSA 方案。对于这两个实例,签名和验证过程不需要访问完整的消息;它们对消息的哈希进行操作。对于 Ed25519ph,哈希函数是 SHA512。对于 Ed448ph,哈希函数是 SHAKE256,输出长度为 512 位。

实例 Ed25519ctx、Ed25519ph、Ed448、Ed448ph 接受一个可选的 上下文字符串 作为输入,用于签名和验证操作(对于 Ed25519ctx,上下文字符串必须是非空的)。对于 Ed25519 实例,不允许使用非空的上下文字符串。

ED25519 和 ED448 签名参数

在签名或验证期间可以设置两个参数:EdDSA 实例名称上下文字符串值。可以通过将 OSSL_PARAM 数组传递给 EVP_DigestSignInit_ex() 来设置它们。

  • "instance" (OSSL_SIGNATURE_PARAM_INSTANCE) <utf8 字符串>

    五个字符串 "Ed25519"、"Ed25519ctx"、"Ed25519ph"、"Ed448"、"Ed448ph" 中的一个。

    "Ed25519"、"Ed25519ctx"、"Ed25519ph" 仅对 Ed25519 EVP_PKEY 有效。

    "Ed448"、"Ed448ph" 仅对 Ed448 EVP_PKEY 有效。

  • "context-string" (OSSL_SIGNATURE_PARAM_CONTEXT_STRING) <八位字节串>

    一个长度不超过 255 的八位字节串。

这两个参数都是可选的。

如果未指定实例名称,则使用默认的 "Ed25519" 或 "Ed448"。

如果未指定上下文字符串,则使用空上下文字符串。

请注意,在签名或验证时,不得指定消息摘要名称。

有关 X25519X448 密钥的信息,请参阅 EVP_PKEY-X25519(7)

可以使用 EVP_PKEY_CTX_get_params() 获取以下签名参数。

  • "algorithm-id" (OSSL_SIGNATURE_PARAM_ALGORITHM_ID) <八位字节串>

  • "instance" (OSSL_SIGNATURE_PARAM_INSTANCE) <utf8 字符串>

  • "context-string" (OSSL_SIGNATURE_PARAM_CONTEXT_STRING) <八位字节串>

参数在 provider-signature(7) 中有描述。

备注

PureEdDSA 实例不支持其他签名算法使用的流机制,例如,EVP_DigestUpdate()。要签名的消息或要验证的消息必须使用一次性 EVP_DigestSign() 和 EVP_DigestVerify() 函数传递。

HashEdDSA 实例尚不支持流机制(因此,一次性函数也必须与 HashEdDSA 一起使用)。

调用 EVP_DigestSignInit() 或 EVP_DigestVerifyInit() 时,摘要类型参数必须设置为 NULL。

希望使用 Ed25519 或 Ed448 签署证书(或其他结构,如 CRL 或证书请求)的应用程序可以使用 X509_sign() 或 X509_sign_ctx() 以通常的方式进行操作。

可以使用 EVP_PKEY_new_raw_private_key(3) 直接设置 Ed25519 或 Ed448 私钥,或者使用 PEM_read_bio_PrivateKey(3)(或类似函数)从 PKCS#8 私钥文件中加载私钥。也可以生成全新的密钥(请参见下面的示例)。设置私钥也会设置关联的公钥。

可以使用 EVP_PKEY_new_raw_public_key(3) 直接设置 Ed25519 或 Ed448 公钥,或者使用 PEM_read_bio_PUBKEY(3)(或类似函数)从 PEM 文件中的 SubjectPublicKeyInfo 结构中加载公钥。

从版本 1.1.1 开始,可以使用 openssl-speed(1) 应用程序测试 Ed25519 和 Ed448。有效的算法名称为 ed25519ed448eddsa。如果指定 eddsa,则对 Ed25519 和 Ed448 都进行基准测试。

示例

使用 ED25519 EVP_PKEY 结构签署消息

void do_sign(EVP_PKEY *ed_key, unsigned char *msg, size_t msg_len)
{
    size_t sig_len;
    unsigned char *sig = NULL;
    EVP_MD_CTX *md_ctx = EVP_MD_CTX_new();

    const OSSL_PARAM params[] = {
        OSSL_PARAM_utf8_string ("instance", "Ed25519ctx", 10),
        OSSL_PARAM_octet_string("context-string", (unsigned char *)"A protocol defined context string", 33),
        OSSL_PARAM_END
    };

    /* The input "params" is not needed if default options are acceptable.
       Use NULL in place of "params" in that case. */
    EVP_DigestSignInit_ex(md_ctx, NULL, NULL, NULL, NULL, ed_key, params);
    /* Calculate the required size for the signature by passing a NULL buffer. */
    EVP_DigestSign(md_ctx, NULL, &sig_len, msg, msg_len);
    sig = OPENSSL_zalloc(sig_len);

    EVP_DigestSign(md_ctx, sig, &sig_len, msg, msg_len);
    ...
    OPENSSL_free(sig);
    EVP_MD_CTX_free(md_ctx);
}

另请参阅

EVP_PKEY-X25519(7) provider-signature(7)EVP_DigestSignInit(3)EVP_DigestVerifyInit(3)

版权所有 2017-2023 OpenSSL 项目作者。保留所有权利。

根据 Apache 许可证 2.0 版(“许可证”)授权。除遵守许可证外,您不得使用此文件。您可以在源代码发行版中的 LICENSE 文件或 https://www.openssl.org/source/license.html 中获取许可证副本。