Tento testar o código de exemplo em https://www.openssl.org/docs/man1.1.1/man3/EVP_PKEY_CTX_set1_hkdf_salt.html (com algumas modificações). Quando eu o executo, a chamada de função EVP_PKEY_derive retorna 0, mas nenhum código de erro claro.
#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;
}
Abaixo está a saída.
EVP_PKEY_derive: 0, error:00000000:lib(0):func(0):reason(0)
Aliás, o openssl que estou usando é 1.1.1k.
Embora o tratamento de erros aqui não seja o melhor, a página do documento vinculada explica a causa:
e seu código (como o exemplo) padroniza o modo para extrair e expandir, portanto, ele executa a expansão.
OpenSSL 3 retorna rc=1 com outlen=-1 (um comprimento que é sempre inválido) para este caso. (Ele também adiciona uma nova
EVP_KDF*
API que suporta muito mais KDFs doEVP_PKEY_derive*
que.)