OpenSSL“错误:“ ctx”的存储大小未知”

时间:2019-05-05 12:37:17

标签: c openssl

我正在使用Ubuntu 19.04和(据说)OpenSSL 1.1.1b,但是在使用EVP_MD_CTX时,在编译本应可以正常工作的代码时遇到了这个问题。我玩弄了OpenSSL(尝试在18.04上进行手动更新),但是据我所知,确实卸载/重新安装成功,因为它现在显示了提到的版本。

#include <stdio.h>
#include <openssl/evp.h>

main(int argc, char *argv[])
{
EVP_MD_CTX mdctx;
const EVP_MD *md;
char mess1[] = "Test Message\n";
char mess2[] = "Hello World\n";
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len, i;

OpenSSL_add_all_digests();

md = EVP_get_digestbyname(argv[1]);

EVP_MD_CTX_init(&mdctx);
EVP_DigestInit_ex(&mdctx, md, NULL);
EVP_DigestUpdate(&mdctx, mess1, strlen(mess1));
EVP_DigestUpdate(&mdctx, mess2, strlen(mess2));
EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
EVP_MD_CTX_cleanup(&mdctx);

printf("Digest is: ");
for(i = 0; i < md_len; i++) printf("%02x", md_value[i]);
printf("\n");
}

我知道有人问过类似的问题,但是尝试以答案的方式提出的修复措施后,我仍无法补救。

确切的错误是:

test2.c:6:12: error: storage size of ‘mdctx’ isn’t known
 EVP_MD_CTX mdctx;

1 个答案:

答案 0 :(得分:1)

从OpenSSL 1.1开始,EVP_MD_CTX类型是不透明的类型,因此您无法创建它的实例。

您需要调用EVP_MD_CTX_create()来返回EVP_MD_CTX *,您可以在对其他函数的调用中使用它。使用完后,请致电EVP_MD_CTX_destroy清理资源。

EVP_MD_CTX *mdctx;

mdctx = EVP_MD_CTX_create();
EVP_DigestInit_ex(mdctx, md, NULL);
EVP_DigestUpdate(mdctx, mess1, strlen(mess1));
EVP_DigestUpdate(mdctx, mess2, strlen(mess2));
EVP_DigestFinal_ex(mdctx, md_value, &md_len);
EVP_MD_CTX_destroy(mdctx);