2017-06-15 3 views
2

J'ai implémenté une application Andoid - application côté serveur. Le serveur communique avec le lecteur de carte à puce. Lorsque l'utilisateur touche le bouton dans l'application Android, une connexion est créée sur le serveur pour obtenir l'authentification de l'utilisateur. Les messages échangés entre l'application et le serveur ont le format suivant:Comment faire la différence entre une erreur de lecteur de carte à puce et une erreur de carte à puce

<type> 0x00 0x00 0x00 <length> 0x00 0x00 0x00 <[data]> 
  • Si le message a la valeur de type 06 qui indique une erreur dans le lecteur de carte à puce.
  • Si le message a la valeur de type 07 qui indique une erreur dans la carte à puce.

J'utilise le code comme ci-dessous pour la communication avec le lecteur de carte à puce:

// show the list of available terminals 
TerminalFactory factory = TerminalFactory.getDefault(); 
List<CardTerminal> terminals = factory.terminals().list(); 
System.out.println("Terminals: " + terminals); 
// get the first terminal 
CardTerminal terminal = terminals.get(0); 
// establish a connection with the card 
Card card = terminal.connect("T=0"); 
System.out.println("card: " + card); 
CardChannel channel = card.getBasicChannel(); 
ResponseAPDU r = channel.transmit(new CommandAPDU(c1)); 
System.out.println("response: " + toString(r.getBytes())); 
// disconnect 
card.disconnect(false); 

L'API Smart Card IO a la classe CardException des exceptions. Mon problème est que je ne sais pas quand envoyer le message de type 06 ou 07 parce que je ne peux pas différencier entre les erreurs qui sont générées par la carte et les erreurs qui sont générées par le lecteur lorsque le CardException est levé. Comment puis-je gérer cela?

Répondre

1

La méthode transmit(), utilisé dans

ResponseAPDU r = channel.transmit(new CommandAPDU(c1)); 

ne fera que lancer des exceptions dans des situations liées à des erreurs de lecteur de cartes à puce et des problèmes avec la communication entre le lecteur et la carte à puce. Il ne lancera pas d'exceptions lorsque la carte elle-même indique une erreur.

Ainsi, vous pouvez attraper tous les lecteurs erreurs liées par des exceptions capture:

try { 
    ResponseAPDU r = channel.transmit(new CommandAPDU(c1)); 
} catch (IllegalStateException e) { 
    // channel has been closed or if the corresponding card has been disconnected 
} catch (CardException e) { 
    // errors occured during communication with the smartcard stack or the card itself (e.g. no card present) 
} 

Les erreurs générées par la carte sont, au contraire, indiqué que les codes d'erreur codés dans le mot d'état de réponse. Ces erreurs ne génèrent pas d'exceptions Java. Vous pouvez tester ces erreurs en examinant le mot d'état (méthodede ResponseAPDU):

if (r.getSW() == 0x09000) { 
    // success indicated by the card 
} else { 
    // error or warning condition generated by the card 
}