Par défaut

Par défaut - C++ - Programmation

Marsh Posté le 25-02-2011 à 14:45:35    

Bonjour,
je développe une brique sécurisée entre TCP et une appli.
Quand ma fonction de chargement de certificat echoue, en l'occurence la clef privée ne correspond pas au certificat, j'obtiens l'erreur :

Code :
  1. error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch


 
En effet, afin d'obtenir le résultat ci-dessus, j'ai fait :

Code :
  1. err = ERR_get_error(); // cette fonction récupère la dernière erreur arrivée sur la pile.
  2. ERR_error_string_n(ERR_get_error(), sizeof(buf));// traduit l'erreur en string pour que je puisse comprendre ce qui s'était passé.


 
Ma question :
Je ne veux pas traiter moi même ce qu'il faut faire si une telle erreur se produit. Je veux juste retransmettre l'erreur au programmeur de l'appli ( qui utilisera donc ma brique ), pour qu'il puisse faire :
 

Code :
  1. if(err = PVKEY_DOES_NOT_MATCH_WITH_CERT) {
  2.      //traiter ici ce qu'il faut faire
  3. }


 
En gros, comment faire correspondre PVKEY_DOES_NOT_MATCH_WITH_CERT à mon type d'erreur.
 
PS: je suis débutant en C/C++
 
Merci d'avance

Reply

Marsh Posté le 25-02-2011 à 14:45:35   

Reply

Marsh Posté le 25-02-2011 à 15:39:34    

En C++, tu peux utiliser les exceptions pour gérer les erreurs.
 
Dans ta brique, tu te contentes d'émettre une classe d'exception via la fonction "throw".
 
L'utilisateur de ta brique doit quant à lui intercepter l'exception dans un bloc try...catch.
 
C'est plus élégant que de gérer une variable d'erreur.

Reply

Marsh Posté le 27-02-2011 à 23:10:21    

Le problème c'est que la gars qui a commencé le dev de la stack n'utilise pas ces throw, il utilise un enum pour lister les codes d'erreurs :
 

Code :
  1. typedef enum LAB_ERRORS_ {
  2. LAB_ERROR_NOERROR   = 0,
  3.   LAB_ERROR_SUCCESS   = 0,
  4.   LAB_ERROR_BASE                = 0x0D430000,     
  5.   /* generic errors */
  6.   LAB_ERROR_BUFFERTOOSMALL,                         
  7.   LAB_ERROR_TIMEOUT,                               
  8.   LAB_ERROR_OUTOFMEMORY,                                                     
  9.   LAB_ERROR_SOCKETERROR,                           
  10.   LAB_ERROR_OS,                                     
  11.   /* network errors */
  12.   LAB_ERROR_NETWORK = (LAB_ERROR_BASE + 0x1000),
  13.   LAB_ERROR_CONNECTIONREFUSED,                     
  14.   LAB_ERROR_PACKETTOOLARGE,                         
  15.      
  16.   /*security errors */
  17.   LAB_ERROR_SEC = (LAB_ERROR_BASE + 0x2000),
  18.   LAB_ERROR_KEYSUNAVAILABLE,                       
  19.   LAB_ERROR_REVOKEDCERTIFICATE,
  20.   LAB_ERROR_CERTIFICATENOTLOADED
  21.    } LAB_ERRORS;


 

Code :
  1. err = ERR_get_error();

 
l'instruction au dessus donne : 185073780 comme résultat quand on affiche.
 

Code :
  1. ERR_error_string_n(ERR_get_error(), sizeof(buf))


L'instruction ci dessus donne

Code :
  1. error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch

quand on affiche.
 
Mon problème c'est, est ce que je devrais rajouter :
PVKEY_DOES_NOT_MATCH_WITH_CERT 185073780
ou
PVKEY_DOES_NOT_MATCH_WITH_CERT 0B080074

Reply

Marsh Posté le 28-02-2011 à 08:21:14    

rien ne t'empeche de faire une petite classe d'exceptino que tu throw avec le ERR_get_Error() en parametere et qui fait la construction du message dans son what()

Reply

Sujets relatifs:

Leave a Replay

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