PDA

View Full Version : Usare librerie openssl in programmi C


guittone_bs
09-05-2007, 10:32
Ciao, pongo a voi esperti una questione che in questi giorni mi sta creando grattacapi:
devo compilare un programma che fa uso della libreria sha.h di openssl solo che in fase di compilazione gcc mi dà errore dicendo che faccio un riferimento non definito alla funzione SHA1. La stessa cosa mi succede quando provo a compilare un file di esempio preso dalla documentazione. :mbe:
In usr/include c'è la cartella openssl e nel codice includo le varie librerie, c'è forse qualche parametro extra che devo passare al gcc affinchè tutto vada a buon fine?

Il codice di esempio è questo:


#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();

if(!argv[1]) {
printf("Usage: mdtest digestname\n");
exit(1);
}

md = EVP_get_digestbyname(argv[1]);

if(!md) {
printf("Unknown message digest %s\n", argv[1]);
exit(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");
}


Guido

maulattu
09-05-2007, 21:09
Ciao, pongo a voi esperti una questione che in questi giorni mi sta creando grattacapi:
devo compilare un programma che fa uso della libreria sha.h di openssl solo che in fase di compilazione gcc mi dà errore dicendo che faccio un riferimento non definito alla funzione SHA1. La stessa cosa mi succede quando provo a compilare un file di esempio preso dalla documentazione. :mbe:
In usr/include c'è la cartella openssl e nel codice includo le varie librerie, c'è forse qualche parametro extra che devo passare al gcc affinchè tutto vada a buon fine?

Il codice di esempio è questo:


#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();

if(!argv[1]) {
printf("Usage: mdtest digestname\n");
exit(1);
}

md = EVP_get_digestbyname(argv[1]);

if(!md) {
printf("Unknown message digest %s\n", argv[1]);
exit(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");
}


Guido

:mbe: magari in compilazione devi usare il flag "-l<nome_libreria_openssl>"
esempio (nel caso di funzioni matematiche usi la libreria "m"):
gcc -lm -o prova prova.c

credo che sulla documentazione esista il nome della libreria...

guittone_bs
10-05-2007, 14:54
Sì, ho provato con l'opzione -lssl ed ha compilato.
Credevo che per includere le librerie bastasse usare l'istruzione #include<percorso libreria>, invece talvolta occorre anche l'opzione -l.
Grazie per l'aiuto!

recoil
10-05-2007, 16:06
Sì, ho provato con l'opzione -lssl ed ha compilato.
Credevo che per includere le librerie bastasse usare l'istruzione #include<percorso libreria>, invece talvolta occorre anche l'opzione -l.
Grazie per l'aiuto!

no no sono due cose completamente diverse

con #include tu dici al preprocessore di tirare dentro i file .h dove tipicamente sono definite delle macro oppure delle strutture e delle funzioni.
non c'è codice però.
significa che il compilatore sa che esiste una funzione x (definita nel .h) perché ha visto il prototipo, quindi non hai problemi di compilazione
la grana salta fuori quando arrivi al linker che mette insieme il codice già compilato. se non includi la libreria il linker non può trovare la famosa funzione x, quindi restituisce quell'errore