EVP_get_cipherbyname et «structure non définie / union evp_cipher_st» dans OpenSSL 1.1.0

J’essaie d’utiliser OpenSL avec Visual Studio C Project.

J’ai compilé openssl à l’aide de la commande visual studio nmake, puis installé le tout dans un dossier prédéfini (C: \ openssl) à l’aide de:

nmake install 

La structure du dossier est la suivante:

  • bin

  • include/openssl

  • lib

Dans include / openssl se trouvent des fichiers d’en-tête .h.

Dans Visual Studio 2012, j’ai créé un projet c ++ général vide et inclus C: \ openssl \ include.

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

J’ai également ajouté le répertoire lib et les fichiers .lib.

Mais quand je comstack le code, je reçois

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

Dans mon code, j’ai ces lignes

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

Dans le fichier ossl_typ.h pour la définition de evp_cipher_st, il est déclaré en tant que

 typedef struct evp_cipher_st EVP_CIPHER; 

et il n’y a pas de définition pour le corps struct!

Pour creuser davantage dans l’arborescence source, evp_cipher_st est défini dans crypto \ include \ internal \ evp_int.h, qui n’est pas inclus dans le dossier include du dossier d’installation openssl.

J’ai également essayé d’inclure le crypto \ include \ internal \ evp_int.h hors de la boîte, mais cela pose d’autres problèmes.

Une idée comment résoudre ce problème?

METTRE À JOUR:

Voici la fonction complète et mon principal, y compris tous les inclus:

 #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 } 

La version Openssl est:

OpenSSL_1_1_0-pre6-1266-g487d3a726

La version ci-dessus est la dernière balise de git, je pense que c’est la plus fraîche à ce jour. La version et la date de validation les plus récentes sont les suivantes:

487d3a726a1970e84853434561d88cb4ac212d15

Auteur: EasySec Date: Mar 17 Jan 17:21:55 2017 +0100

Et enfin, voici la sortie de compilation de 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>ClComstack: 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 

    Vous pouvez obtenir la longueur de la clé en utilisant:

     *outputkey_size = EVP_CIPHER_key_length(cipher); 

    En mettant à la fin de votre code les prochaines lignes:

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

    Il imprime la sortie correcte, qui est ensuite:

     Key-size: 32 Key: 51ae3ac4721439302cc5f90313f440bd9ca714c9a80b2213d034c87c00a700a0 

    Je ne sais pas si key_len était disponible sur les versions précédentes, mais vous pouvez lire dans les notes de publication de openssl-1.10 :

    • La plupart des structures publiques libcrypto et libssl ont été rendues opaques, notamment: BIGNUM et les types associés, EC_KEY et EC_KEY_METHOD, DH et DH_METHOD, DSA et DSA_MD, HMAC_CTX, X509, X509_CRL, X509_OBJECT, X509_STORE_CTX, X509_STORE, X509_LOOKUP, X509_LOOKUP_METHOD
    • structures internes de libssl rendues opaques

    ce qui signifie que les applications ne sont plus autorisées à regarder à l'intérieur des variables des structures. C'est la raison pour laquelle _key_len (et d'autres) indique non défini.