openssl:EVP_PKEY_derive 失败

问题描述 投票:0回答:1

我尝试测试来自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 kdf hkdf
1个回答
0
投票

虽然这里的错误处理不是最好的,但您链接的文档页面对此进行了解释:

HKDF 扩展操作的输出长度通过 EVP_PKEY_derive(3) 函数的 length 参数指定。由于 HKDF 输出长度是可变的,因此传递 NULL 缓冲区作为获取所需长度的方法对于执行扩展操作的任何模式下的 HKDF 来说都是没有意义的。相反,调用者必须分配所需长度的缓冲区,并将该缓冲区与所需长度(初始化为的指针)一起传递给 EVP_PKEY_derive(3)。使用 EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY 时允许传递 NULL 缓冲区来获取长度。

并且您的代码(如示例)默认为提取和扩展模式,并且执行扩展。

对于这种情况,OpenSSL 3 返回 status=1,outlen=-1(始终无效的长度)。 (它还添加了一个新的

EVP_KDF*
API,它比
EVP_PKEY_derive*
支持更多的 KDF。)

© www.soinside.com 2019 - 2024. All rights reserved.