Newsgroup: it.comp.lang.c
Titolo: Segmentation Fault con RSA_sign

Ciao a tutti,
sto provando ad usare le librerie openssl. Il mio scopo e' quello di
creare una stringa che contiene un timestamp per poi firmarla con la
funzione RSA_sign. La cosa curiosa è che se inserisco nel main tutto il
codice che si occupa della firma del timestamp non ho problemi.
Se invece il codice della firma lo metto in una funzione esterna (sign()
)che poi richiamo nel main, allora quando l'esecuzione arriva a RSA_sign
va in segmentation fault.
Altra cosa curiosa, se commento nel main la chiamata a gen_timestamp()
allora la funzione sign() non va piu in seg.fault. 
Qualcuno sa dirmi dove sbaglio?
Metto qui sotto il codice :
#include <stdio.h>
#include<time.h> 
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#define SECFILE "METTI QUI IL PERCORSO DEL FILE DELLA CHIAVE PRIVATA"
#define SIZE_OF_TIME_STR 100
static char timestamp[SIZE_OF_TIME_STR];
void sign(void)
{
	RSA *key=NULL;
	FILE *fp ;
	int  len=0, k , ch;
	unsigned int  *siglen ;
	unsigned char *plain=NULL, *sign=NULL , *cipher=NULL  ;
 
	fp=fopen(SECFILE,"r");
	key = PEM_read_RSAPrivateKey(fp,NULL,NULL,NULL) ;
	fclose(fp);		
	plain = (unsigned char *)malloc(1024 * sizeof(unsigned char));
	sign = (unsigned char*)malloc(1024 * sizeof(unsigned char));
 
	strcpy( (char*)plain , timestamp );
 
	printf("\nTIMESTAMP: %s\n",plain);
 
	len = strlen((char*)plain);	
	k = RSA_sign(NID_md5, plain , len, sign , siglen, key);
 
	if(k==1) printf("Sign!\n");
	else printf("Not Sign!\n");
	free(plain);	
	free(sign);
}
void gen_timestamp(void)
{
	time_t tempo;
	struct tm ora_locale;
 
	time(&tempo);
	ora_locale = *(localtime(&tempo));
	strftime(timestamp, SIZE_OF_TIME_STR, "%m-%d-%Y %H:%M:%S", &ora_locale);
}
int main(int argc,char *argv[])
{	
	gen_timestamp();	
	sign();
 
	printf("\nDone!\n");
	return 0;
}
-- 
Metti la @ al posto di  _chiocciol@_  per rispondermi in email

 Ciao a tutti,
[cut]
Mi sono dimenticato di dire che compilo con questo comando:
gcc -lssl file.c -o file
ciao
F.


 k = RSA_sign(NID_md5, plain , len, sign , siglen, key);
Il terzo argomento (siglen) deve puntare qualcosa di usabile. Che ci 
potrebbe mai fare una funzione con un puntatore non inizializzato?
  unsigned int siglen ;
   [...]
  k = RSA_sign(NID_md5, plain , len, sign , &siglen, key);
Max

   k = RSA_sign(NID_md5, plain , len, sign , &siglen, key);
Ciao, grazie per la risposta,
Ti riporto un estratto del man di rsa_sign(...) :
USAGE: int RSA_sign(int type, const unsigned char *m, unsigned int m_len,
           unsigned char *sigret, unsigned int *siglen, RSA *rsa);
RSA_sign() signs the message digest m of size m_len using the private key rsa as specified in PKCS #1
v2.0. It stores the signature in sigret and the signature size in siglen. sigret must point to
RSA_size(rsa) bytes of memory.
Anche se inizializzo siglen a null comunque va in seg.fault :(
ciao
F.


 Anche se inizializzo siglen a null comunque va in seg.fault :(
...null ???
Ma hai cambiato le linee come ti ha indicato Max?
In ogni caso il programma va in segfault per qualunque inconveniente 
trovi, anche per un semplice "file non trovato". Non hai fatto alcun 
controllo d'errore... oltre ad altre pecche meno gravi.
PS: Ok, e' un semplice pezzettino di codice di esempio mi dirai... :-)
Pero', per tornare ad una discussione abbastanza calda su un altro 
thread :), la
static char timestamp[SIZE_OF_TIME_STR];
e' un esempio di variabile che non ha alcun senso dichiararla globale 
(anche se 'static'). Cosi' la gen_timestamp() ha anche perso una buona 
occasione per diventare una "funzione" :) . Cosi', di conseguenza anche 
la sign() ... vincolata alla var. timestamp da inizializzare oltre che 
alla define SECFILE... ecc...
Sono solo due funzioni. Immaginati quando il programma cresce... quanto 
cresce anche il mal di testa per ritrovare tutti gli intrecci :)
Ciao
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

 confermo anch'io
Chiedo scusa, l'errore era questo, veramente banale.
Si, il codice era strutturato anche malino, sono d'accordo con voi.
grazie per l'aiuto.
