2
EVP_PKEY_CTX *openssl_ctx = NULL;
openssl_ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_ED25519, NULL);
if (NULL == openssl_ctx)
{
    printf("New Key fail...\n");
    goto cleanup;
}
if (EVP_PKEY_keygen_init(openssl_ctx)<=0)
{
    printf("EVP_PKEY_keygen_init fail\n");
    goto cleanup;
}
if (EVP_PKEY_keygen(openssl_ctx, ppKey)<=0)
{
    printf("EVP_PKEY_kengen fail\n");
    goto cleanup;
}

ret = ERR_OK;

unsigned char sk[2048], pk[2048];[enter image description here][1]
size_t skLen, pkLen;
if (1 != EVP_PKEY_get_raw_public_key(*ppKey, pk, &pkLen))
{
    printf("EVP_PKEY_get_raw_public_key fail");
    char *errStr;
    int line;
    unsigned long err = ERR_get_error_line((const char **)&errStr, &line);
    printf("show me the error: %lu, %s:%i\n", err, errStr, line);
}

int p = EVP_PKEY_get_raw_private_key(*ppKey, sk, &skLen);
if (p != 1)
{
    printf("EVP_PKEY_get_raw_private_key fail\n");
    char *errStr;
    int line;
    unsigned long err = ERR_get_error_line((const char **)&errStr, &line);
    printf("show me the error: %lu, %s:%i\n", err, errStr, line);
}

我想从 EVP_PKEY 导出 ed25519 的私钥和公钥,当我同时使用 EVP_PKEY_get_raw_public_key() 和 EVP_PKEY_get_raw_private_key() 时,它返回错误:EVP_PKEY_get_raw_public_key failshow me the error: 101494966, ../crypto/evp/p_lib.c: 310

但是当我只使用 EVP_PKEY_get_raw_public_key() 或 EVP_PKEY_get_raw_private_key() 时,它不会报告任何错误。EVP_PKEY_get_raw_public_key() 是否与 EVP_PKEY_get_raw_private_key() 不兼容?

4

1 回答 1

1

从手册页EVP_PKEY_get_raw_public_key()

int EVP_PKEY_get_raw_public_key(const EVP_PKEY *pkey, unsigned char *pub, size_t *len);

EVP_PKEY_get_raw_public_key() 用原始公钥数据填充 pub 提供的缓冲区。pub 缓冲区的大小应该在进入函数时以 *len 为单位,并在退出时使用实际写入的字节数更新 *len。如果缓冲区 pub 为 NULL,则 *len 将填充保存密钥所需的字节数。调用应用程序负责确保缓冲区足够大以接收公钥数据。

注意入口条件:“发布缓冲区的大小应该在函数入口时以 *len 为单位”。您正在发送一个未初始化的值,因此它可能有效,也可能无效。

手册页上的措辞与EVP_PKEY_get_raw_private_key.

在调用这些函数之前,请确保您的skLenpkLen变量已初始化为缓冲区的大小。

于 2021-05-14T08:20:42.307 回答