debogage fonctions OpenSSL
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 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
Code:
$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 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:
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.