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
quand je debug ( print dh juste avant l'appel de DH_check ) , j'obtiens:
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 ...
(gdb) print dh
j'essaie alors d'aller plus loin pour voir ou est ce que ca plante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part $7 = (DH *) 0x1768e0
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 :
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
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); }
(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.
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
Merci d'avance pour votre aide.
Partager