debogage fonctions OpenSSL

debogage fonctions OpenSSL - C++ - Programmation

Marsh Posté le 28-03-2011 à 00:55:24    

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 :
  1. 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
  2. int *codes = NULL;
  3. 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 :
  1. (gdb) print dh
  2. $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 :
  1. int DH_check(const DH *dh, int *ret)
  2. {
  3. int ok=0;
  4. BN_CTX *ctx=NULL;
  5. BN_ULONG l;
  6. BIGNUM *q=NULL;
  7. *ret=0;
  8. ctx=BN_CTX_new();
  9. if (ctx == NULL) goto err;
  10. q=BN_new();
  11. if (q == NULL) goto err;
  12. if (BN_is_word(dh->g,DH_GENERATOR_2))
  13.  {
  14.  l=BN_mod_word(dh->p,24);
  15.  if (l != 11) *ret|=DH_NOT_SUITABLE_GENERATOR;
  16.  }
  17. #if 0
  18. else if (BN_is_word(dh->g,DH_GENERATOR_3))
  19.  {
  20.  l=BN_mod_word(dh->p,12);
  21.  if (l != 5) *ret|=DH_NOT_SUITABLE_GENERATOR;
  22.  }
  23. #endif
  24. else if (BN_is_word(dh->g,DH_GENERATOR_5))
  25.  {
  26.  l=BN_mod_word(dh->p,10);
  27.  if ((l != 3) && (l != 7))
  28.   *ret|=DH_NOT_SUITABLE_GENERATOR;
  29.  }
  30. else
  31.  *ret|=DH_UNABLE_TO_CHECK_GENERATOR;
  32. if (!BN_is_prime_ex(dh->p,BN_prime_checks,ctx,NULL))
  33.  *ret|=DH_CHECK_P_NOT_PRIME;
  34. else
  35.  {
  36.  if (!BN_rshift1(q,dh->p)) goto err;
  37.  if (!BN_is_prime_ex(q,BN_prime_checks,ctx,NULL))
  38.   *ret|=DH_CHECK_P_NOT_SAFE_PRIME;
  39.  }
  40. ok=1;
  41. err:
  42. if (ctx != NULL) BN_CTX_free(ctx);
  43. if (q != NULL) BN_free(q);
  44. return(ok);
  45. }
  46. Et voici le resultat quand je fais un step avant après le break point :
  47. [cpp] gdb) b BN_CTX_new
  48. Note : point d arrêt 3 also set at pc 0x7ffff6d6b030.
  49. Breakpoint 4 at 0x7ffff6d6b030
  50. (gdb) step
  51. Program received signal SIGSEGV, Segmentation fault.
  52. 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]

Reply

Marsh Posté le 28-03-2011 à 00:55:24   

Reply

Marsh Posté le 28-03-2011 à 02:54:49    

En même temps tu lui fais passer un pointeur nul, et lui essaye de le déréférencer, ce qui est moyennement cool.
 
Fais plutôt ça:
 

Code :
  1. dh = PEM_read_DHparams(fp, NULL, NULL, NULL);
  2.     int codes = 0;
  3.     dh_check_ret = DH_check(dh, &codes);


 
Je pense que ça marchera mieux


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 28-03-2011 à 11:50:49    

En faisant : dh_check_ret = DH_check(dh, codes);
je déréférence le pointeur codes ? je me perd là...  
Que veux tu dire par déréférencer ici ? pour moi déréférencer c'est accéder au contenu à l'adresse pointé par codes ...

Reply

Marsh Posté le 28-03-2011 à 12:04:11    

ligne 8 : *ret=0;
=> ret est un argument de la fonction, mais c'est un pointeur initialisé à NULL
=> il ne référence aucune zone allouée en mémoire

Reply

Marsh Posté le 28-03-2011 à 13:49:02    

D'accord. Si j'ai bien compris le principe, ceci devrais marcher alors :
 
int* codes;
codes = new int();
dh_check_ret = DH_check(dh, codes);
 

Reply

Marsh Posté le 28-03-2011 à 13:52:55    

Je l'ai compilé et j'ai lancé le test est ca marche bien. Maintenant j'aimerais savoir laquelle des deux méthodes est mieux ? est ce qu'il y a une qui est recommandée dans certaines situations ... etc  
Merci pour vos explications, je vois plus clair maintenant :)

Reply

Marsh Posté le 28-03-2011 à 14:13:59    

La solution proposée par WiiDS est meilleure car dans ce cas tu n'as pas besoin de gérer l'allocation et la destruction de ta variable "codes".

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed