我尝试测试https://www.openssl.org/docs/man1.1.1/man3/EVP_PKEY_CTX_set1_hkdf_salt.html中的示例代码(经过一些修改)。当我运行它时,EVP_PKEY_derive 的函数调用返回 0,但没有明确的错误代码。
#include <openssl/err.h>
#include <openssl/evp.h>
#include <openssl/kdf.h>
int main()
{
char error[1024];
if (EVP_PKEY_CTX* pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL))
{
unsigned char out[1024];
size_t outlen = sizeof(out);
if (EVP_PKEY_derive_init(pctx) <= 0 ||
EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha256()) <= 0 ||
EVP_PKEY_CTX_set1_hkdf_salt(pctx, "salt", 4) <= 0 ||
EVP_PKEY_CTX_set1_hkdf_key(pctx, "secret", 6) <= 0 ||
EVP_PKEY_CTX_add1_hkdf_info(pctx, "label", 5) <= 0 )
{
ERR_error_string(ERR_get_error(), error);
printf("%s\n", error);
}
else
{
int r = EVP_PKEY_derive(pctx, NULL, &outlen);
if (r <= 0)
{
ERR_error_string(ERR_get_error(), error);
printf("EVP_PKEY_derive: %d, %s\n", r, error);
}
else
{
printf("%d\n", outlen);
}
}
EVP_PKEY_CTX_free(pctx);
}
return 0;
}
下面是输出。
EVP_PKEY_derive: 0, error:00000000:lib(0):func(0):reason(0)
顺便说一句,我使用的 openssl 是 1.1.1k。
尽管此处的错误处理不是最好的,但您链接的文档页面解释了原因:
并且您的代码(如示例)默认为提取和扩展模式,因此它确实执行扩展。
对于这种情况,OpenSSL 3 返回 rc=1 和 outlen=-1(始终无效的长度)。(它还添加了一个新的
EVP_KDF*
API,支持的 KDF 比原来多得多EVP_PKEY_derive*
。)