Bonjour,
j'ai un programme client / serveur qui s'echangent des clefs Diffie Hellman.
La fonction DH_check(dh, codes) vérifie si les paramètres dh->p et dh->g sont correctes.
le programme fait un segmentation fault au moment de l'appel à DH_check
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 dh = PEM_read_DHparams(fp, NULL, NULL, NULL); // je lis les param p et g se trouvant dans le_fichier.pem pointé par fp. Cette fonction renvoie bien ce qu'il faut=> OK
 
int *codes = NULL;
dh_check_ret = DH_check(dh, codes); // ici le programme fait un segmentation fault ...
quand je debug ( print dh juste avant l'appel de DH_check ) , j'obtiens:
(gdb) print dh
j'essaie alors d'aller plus loin pour voir ou est ce que ca plante.
J'ai fait un break point sur une fonction qui est dans la bibliothèque. ( j'ai le code source correspondant ). Cette fonction est ctx=BN_CTX_new(); Voici le code de dh_check.c d'openssl :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
int DH_check(const DH *dh, int *ret)
	{
	int ok=0;
	BN_CTX *ctx=NULL;
	BN_ULONG l;
	BIGNUM *q=NULL;
 
	*ret=0;
	ctx=BN_CTX_new();
	if (ctx == NULL) goto err;
	q=BN_new();
	if (q == NULL) goto err;
 
	if (BN_is_word(dh->g,DH_GENERATOR_2))
		{
		l=BN_mod_word(dh->p,24);
		if (l != 11) *ret|=DH_NOT_SUITABLE_GENERATOR;
		}
#if 0
	else if (BN_is_word(dh->g,DH_GENERATOR_3))
		{
		l=BN_mod_word(dh->p,12);
		if (l != 5) *ret|=DH_NOT_SUITABLE_GENERATOR;
		}
#endif
	else if (BN_is_word(dh->g,DH_GENERATOR_5))
		{
		l=BN_mod_word(dh->p,10);
		if ((l != 3) && (l != 7))
			*ret|=DH_NOT_SUITABLE_GENERATOR;
		}
	else
		*ret|=DH_UNABLE_TO_CHECK_GENERATOR;
 
	if (!BN_is_prime_ex(dh->p,BN_prime_checks,ctx,NULL))
		*ret|=DH_CHECK_P_NOT_PRIME;
	else
		{
		if (!BN_rshift1(q,dh->p)) goto err;
		if (!BN_is_prime_ex(q,BN_prime_checks,ctx,NULL))
			*ret|=DH_CHECK_P_NOT_SAFE_PRIME;
		}
	ok=1;
err:
	if (ctx != NULL) BN_CTX_free(ctx);
	if (q != NULL) BN_free(q);
	return(ok);
	}
Et voici le resultat quand je fais un step avant après le break point :
(
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
gdb) b BN_CTX_new
Note : point d arrêt 3 also set at pc 0x7ffff6d6b030.
Breakpoint 4 at 0x7ffff6d6b030
(gdb) step
 
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff6d91853 in DH_check () from /lib/libcrypto.so.0.9.8
Est ce que quelqu'un aurait une idée de ce que je dois faire ? Je ne sais pas comment faire pour repérer la fonction qui génère une segmentation fault.

Merci d'avance pour votre aide.