razuki | 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 :
- 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:
Code :
- (gdb) print dh
- $7 = (DH *) 0x1768e0
|
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 :
- 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 :
- [cpp] 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. [/cpp] |