c - OpenSSL “error: storage size of ‘ctx’ 未知”

标签 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;

最佳答案

从 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);

关于c - OpenSSL “error: storage size of ‘ctx’ 未知”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55992010/

相关文章:

authentication - Gitlab:无法为电子邮件设置中继地址(state=SSLv2/v3 read server hello A: unknown protocol”)

c - 最后一个循环的输出不是预期的

ssl - 丢包时 DTLS 握手速度较慢

c - 将 SQL_BINARY 数组数据作为参数传递时如何避免零终止? (ODBC 驱动程序)

c - Cuda C 上任意大小的矩阵转置(具有共享内存)

ssl - 使用 OpenSSL 测试 SSL/TLS 客户端身份验证

php - SSL 错误 SSL3_GET_SERVER_CERTIFICATE :certificate verify failed

SSL_pending,使用非阻塞套接字读写?

c++ - Vazirani 等人的动态编程中的字符串算法括号。阿尔

c - 测试数字输入(否则重复)- C