首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EVP_get_cipherbyname和OpenSSL 1.1.0中的“未定义结构/联合evp_cipher_st”

EVP_get_cipherbyname和OpenSSL 1.1.0中的“未定义结构/联合evp_cipher_st”
EN

Stack Overflow用户
提问于 2017-01-28 11:04:50
回答 1查看 1.9K关注 0票数 1

我试图在项目中使用openssl。

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

代码语言:javascript
复制
nmake install

文件夹结构如下:

  • bin
  • include/openssl
  • lib

在include/openssl内部有.h头文件。

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

代码语言:javascript
复制
[Project properties -> C/C++ -> General -> Additional Include Directories]

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

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

代码语言:javascript
复制
left of 'key_len' specifies undefined struct/union 'evp_cipher_st'

在我的代码中,我有以下几行

代码语言:javascript
复制
const EVP_CIPHER *cipher = EVP_get_cipherbyname("aes-256-cbc");
//some other code
return cipher->key_len;

查看ossl_typ.h文件中的evp_cipher_st定义,它声明为

代码语言:javascript
复制
typedef struct evp_cipher_st EVP_CIPHER;

没有结构体的定义!

深入了解源代码树,evp_cipher_st是在crypto\include\internal\evp_int.h中定义的,它不包括在openssl文件夹的include文件夹中。

我也试着把crypto\include\internal\evp_int.h开箱即入,但这会导致更多的问题。

知道怎么解决吗?

更新:

这是完整的功能,我的主要内容包括:

代码语言:javascript
复制
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <mswsock.h>
#include <windows.h>
#include <minwindef.h>
#include <malloc.h>
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef int socklen_t;
#include "wingetopt.h"
#include <Wincrypt.h>
#include <iphlpapi.h>
#include "Shlwapi.h"
#include <Bcrypt.h>

#define inline __inline
#define STATUS_SUCCESS 0

#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "Shlwapi.lib")

#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <stdarg.h>
#include <fcntl.h>
#include <time.h>

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 2012编译输出:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-29 01:04:34

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

代码语言:javascript
复制
*outputkey_size = EVP_CIPHER_key_length(cipher);

在代码的末尾插入下一行代码:

代码语言:javascript
复制
printf("Key-size: %d\n", aes_keylen);
printf("Key: "); for (int i = 0; i<aes_keylen; ++i) { printf("%02x", shared_secret[i]); } printf("\n");

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

代码语言:javascript
复制
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_CRL、X509_OBJECT、X509_STORE_CTX、X509_STORE、X509_OBJECT等。
  • libssl内部结构不透明

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41909017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档