EVP_get_cipherbyname和"undefined struct/union evp_cipher_st";在OpenSSL 1.1.0中 [英] EVP_get_cipherbyname and "undefined struct/union evp_cipher_st" in OpenSSL 1.1.0

查看:119
本文介绍了EVP_get_cipherbyname和"undefined struct/union evp_cipher_st";在OpenSSL 1.1.0中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在Visual Studio C项目中使用openssl.

I'm trying to use openssl with visual studio c project.

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

I compiled openssl using visual studio nmake command then installed everything to a predefined folder (C:\openssl) using:

nmake install

文件夹结构如下:

  • bin

include/openssl

lib

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

Inside include/openssl there are .h header files.

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

In my Visual studio 2012, I created an empty general c++ project and included C:\openssl\include

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

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

I also added lib directory and .lib files.

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

But when I compile the code, I get

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

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

Inside my code I have these lines

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

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

Looking into ossl_typ.h file for evp_cipher_st definition, it is declared as

typedef struct evp_cipher_st EVP_CIPHER;

并且结构体没有定义!

更多地挖掘源代码树,evp_cipher_st在crypto \ include \ internal \ evp_int.h中定义,该文件未包含在openssl安装文件夹的include文件夹中.

Digging more into the source tree, evp_cipher_st is defined in crypto\include\internal\evp_int.h that is not included in the include folder of openssl install folder.

我还尝试开箱即用地包含crypto \ include \ internal \ evp_int.h,但这会导致更多问题.

I also tried to include crypto\include\internal\evp_int.h out of the box but it leads to more problems.

有什么解决办法吗?

更新:

这是完整的功能,我的主要功能包括所有包含的功能

Here is the complete function and my main including all the includes:

#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 version is:

OpenSSL_1_1_0-pre6-1266-g487d3a726

OpenSSL_1_1_0-pre6-1266-g487d3a726

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

Above version is the latest tag name from git, I think its the most fresh one till now. The latest commit version and date is as following:

487d3a726a1970e84853434561d88cb4ac212d15

487d3a726a1970e84853434561d88cb4ac212d15

作者:EasySec日期:2017年1月17日星期二17:21:55 +0100

Author: EasySec Date: Tue Jan 17 17:21:55 2017 +0100

最后是Visual Studio 2012的编译输出:

And finally here is the Visual Studio 2012 compile output:

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

推荐答案

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

You can get the key length using:

*outputkey_size = EVP_CIPHER_key_length(cipher);

在代码末尾添加以下几行:

Putting in the end of your code the next lines:

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

它会打印正确的输出,这是下一个:

It prints the correct output, which is next:

Key-size: 32
Key: 51ae3ac4721439302cc5f90313f440bd9ca714c9a80b2213d034c87c00a700a0

我不确定 key_len 是否在以前的版本中可用,但不能在

I'm not sure if key_len was available on previous versions but in the openssl-1.10 release notes you can read:

  • 大多数 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内部结构变得不透明
  • Most libcrypto and libssl public structures were made opaque, including: BIGNUM and associated types, EC_KEY and EC_KEY_METHOD, DH and DH_METHOD, DSA and DSA_METHOD, RSA and RSA_METHOD, BIO and BIO_METHOD, EVP_MD_CTX, EVP_MD, EVP_CIPHER_CTX, EVP_CIPHER, EVP_PKEY and associated types, HMAC_CTX, X509, X509_CRL, X509_OBJECT, X509_STORE_CTX, X509_STORE, X509_LOOKUP, X509_LOOKUP_METHOD
  • libssl internal structures made opaque

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

which means that the applications are no longer allowed to look inside the variables of the structures. This is the reason that _key_len (and others) shows undefined.

这篇关于EVP_get_cipherbyname和"undefined struct/union evp_cipher_st";在OpenSSL 1.1.0中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆