Ed448
名称
EVP_SIGNATURE-ED25519,EVP_SIGNATURE-ED448,Ed25519,Ed448 - EVP_PKEY Ed25519和Ed448支持
描述
Ed25519和Ed448 EVP_PKEY实现支持密钥生成,使用RFC 8032中描述的EdDSA签名方案进行一次性摘要签名和摘要验证。它具有与RFC 8410兼容的关联私钥和公钥格式。
EdDSA实例
RFC 8032描述了五个EdDSA实例:Ed25519、Ed25519ctx、Ed25519ph、Ed448、Ed448ph。
实例Ed25519、Ed25519ctx、Ed448被称为纯EdDSA方案。对于这三个实例,签名和验证过程需要访问完整的消息(而不是消息的摘要)。
实例Ed25519ph、Ed448ph被称为哈希EdDSA方案。对于这两个实例,签名和验证过程不需要访问完整的消息;它们对消息的哈希进行操作。对于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”。
如果未指定上下文字符串,则使用空上下文字符串。
请注意,在签名或验证时不得指定消息摘要名称。
有关X25519和X448密钥的信息,请参见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)中进行了描述。
备注
纯EdDSA实例不支持其他签名算法(例如使用EVP_DigestUpdate())的流机制。要签名或验证的消息必须使用一次性EVP_DigestSign()和EVP_DigestVerify()函数传递。
哈希EdDSA实例尚不支持流机制(因此也必须将一次性函数与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。有效的算法名称为ed25519、ed448和eddsa。如果指定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中获取副本。