OpenSSL 1.1.0中的EVP_get_cipherbyname和“undefined struct / union evp_cipher_st”

我正在尝试将openssl与visual studio c项目一起使用。

我使用visual studio nmake命令编译openssl,然后使用以下命令将所有内容安装到预定义文件夹(C:\ openssl):

nmake install 

文件夹结构如下:

  • bin

  • include/openssl

  • lib

在include / openssl里面有.h头文件。

在我的Visual Studio 2012中,我创建了一个空的通用c ++项目,并包含C:\ openssl \ include

 [Project properties -> C/C++ -> General -> Additional Include Directories] 

我还添加了lib目录和.lib文件。

但是当我编译代码时,我得到了

 left of 'key_len' specifies undefined struct/union 'evp_cipher_st' 

在我的代码中,我有这些行

 const EVP_CIPHER *cipher = EVP_get_cipherbyname("aes-256-cbc"); //some other code return cipher->key_len; 

查看ossl_typ.h文件以获取evp_cipher_st定义,它被声明为

 typedef struct evp_cipher_st EVP_CIPHER; 

并且没有结构体的定义!

进一步深入到源树中,evp_cipher_st在crypto \ include \ internal \ evp_int.h中定义,该文件未包含在openssl安装文件夹的include文件夹中。

我还尝试将crypto \ include \ internal \ _ evp_int.h包括在内,但它会导致更多问题。

知道怎么解决这个问题吗?

更新:

这是完整的function,我的主要包括所有包括:

 #include  #include  #include  #include  #include  #include  typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef int socklen_t; #include "wingetopt.h" #include  #include  #include "Shlwapi.h" #include  #define inline __inline #define STATUS_SUCCESS 0 #pragma comment(lib, "iphlpapi.lib") #pragma comment(lib, "Ws2_32.lib") #pragma comment(lib, "Shlwapi.lib") #include  #include  #include  #include  #include  #include  #include  #include  #include  int generate_aes_key(const unsigned char *input_key, uint16_t input_key_size, unsigned char *output_key, uint16_t *outputkey_size) { const EVP_MD *dgst = NULL; unsigned char iv[EVP_MAX_IV_LENGTH]; const EVP_CIPHER *cipher = EVP_get_cipherbyname("aes-256-cbc"); if(!cipher) { return -1; } dgst = EVP_get_digestbyname("sha256"); if(!dgst) { fprintf(stderr, "no such digest\n"); return -2; } if(!EVP_BytesToKey(cipher, dgst, NULL, input_key, input_key_size, 1, output_key, iv)) { return -3; } *outputkey_size = (uint16_t)cipher->key_len; return 0; } int main(int argc, char *argv[]) { char secret[] = "MIIFBTCCAu2gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwTjELMAkGA1UEBhMCR0Ix"; unsigned char shared_secret[500]; uint16_t aes_keylen = 0; //bunch of codes if(generate_aes_key((unsigned char *)secret, strlen(secret), shared_secret, &aes_keylen) < 0) { fprintf(stderr, "Could not get initial shared secret\n"); return 0; } //other codes } 

Openssl版本是:

OpenSSL_1_1_0-pre6-1266-g487d3a726

以上版本是git的最新标签名称,我认为它是迄今为止最新鲜的标签。 最新的提交版本和日期如下:

487d3a726a1970e84853434561d88cb4ac212d15

作者:EasySec日期:Tue Jan 17 17:21:55 2017 +0100

最后这里是Visual Studio 2012编译输出:

 Build started 1/28/2017 8:23:02 PM. 1>Project "C:\CODE\mycode.vcxproj" on node 2 (Build target(s)). 1>ClCompile: C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\CL.exe /c /I"c:\openssl\include" /ZI /nologo /W3 /WX- /Od /Oy- /D _MBCS /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo"Debug\\" /Fd"Debug\vc110.pdb" /Gd /TC /analyze- /errorReport:prompt src\main.c ... wingetopt.c 1>c:\openssl\include\openssl\lhash.h(198): warning C4090: 'function' : different 'const' qualifiers client.c 1>c:\openssl\include\openssl\lhash.h(198): warning C4090: 'function' : different 'const' qualifiers client.c 1>c:\openssl\include\openssl\lhash.h(198): warning C4090: 'function' : different 'const' qualifiers client.c 1>c:\openssl\include\openssl\lhash.h(198): warning C4090: 'function' : different 'const' qualifiers client.c 1>c:\openssl\include\openssl\lhash.h(198): warning C4090: 'function' : different 'const' qualifiers client.c 1>c:\openssl\include\openssl\lhash.h(198): warning C4090: 'function' : different 'const' qualifiers client.c 1>c:\openssl\include\openssl\lhash.h(198): warning C4090: 'function' : different 'const' qualifiers client.c 1>c:\openssl\include\openssl\lhash.h(198): warning C4090: 'function' : different 'const' qualifiers client.c 1>c:\openssl\include\openssl\lhash.h(198): warning C4090: 'function' : different 'const' qualifiers client.c 1>c:\openssl\include\openssl\lhash.h(198): warning C4090: 'function' : different 'const' qualifiers client.c 1>c:\openssl\include\openssl\lhash.h(198): warning C4090: 'function' : different 'const' qualifiers client.c 1>c:\openssl\include\openssl\lhash.h(198): warning C4090: 'function' : different 'const' qualifiers client.c 1>c:\openssl\include\openssl\lhash.h(198): warning C4090: 'function' : different 'const' qualifiers client.c 1>c:\openssl\include\openssl\lhash.h(198): warning C4090: 'function' : different 'const' qualifiers crypto.c 1>c:\openssl\include\openssl\lhash.h(198): warning C4090: 'function' : different 'const' qualifiers 1>c:\CODE\src\crypto.c(517): error C2037: left of 'key_len' specifies undefined struct/union 'evp_cipher_st' client.c 1>c:\openssl\include\openssl\lhash.h(198): warning C4090: 'function' : different 'const' qualifiers client.c 1>c:\openssl\include\openssl\lhash.h(198): warning C4090: 'function' : different 'const' qualifiers Generating Code... 1>Done Building Project "C:\CODE\mycode.vcxproj" (Build target(s)) -- FAILED. Build FAILED. Time Elapsed 00:00:08.55 

您可以使用以下方法获取密钥长度

 *outputkey_size = EVP_CIPHER_key_length(cipher); 

将代码放在下一行:

 printf("Key-size: %d\n", aes_keylen); printf("Key: "); for (int i = 0; i 

它打印正确的输出,接下来是:

 Key-size: 32 Key: 51ae3ac4721439302cc5f90313f440bd9ca714c9a80b2213d034c87c00a700a0 

我不确定key_len是否在以前的版本中可用,但在openssl-1.10发行说明中你可以阅读:

  • 大多数 libcrypto和libssl公共结构都是不透明的,包括:BIGNUM和相关类型,EC_KEY和EC_KEY_METHOD,DH和DH_METHOD,DSA和DSA_METHOD,RSA和RSA_METHOD,BIO和BIO_METHOD,EVP_MD_CTX,EVP_MD,EVP_CIPHER_CTX,EVP_CIPHER,EVP_PKEY及相关类型, HMAC_CTX,X509,X509_CRL,X509_OBJECT,X509_STORE_CTX,X509_STORE,X509_LOOKUP,X509_LOOKUP_METHOD
  • libssl内部结构变得不透明

这意味着不再允许应用程序查看结构的变量。 这就是_key_len(和其他)显示未定义的原因。