Erreur de selection applet

Résolu/Fermé
fala - Modifié par KX le 8/04/2015 à 19:03
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 8 avril 2015 à 18:40
Bonjour,
voici le code pour le client:

package terminal.jc;

import java.awt.event.MouseEvent;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;

import com.sun.javacard.apduio.Apdu;
import com.sun.javacard.apduio.CadT1Client;
import com.sun.javacard.apduio.CadTransportException;

public class Jf_Admin {

 final static byte Admin = (byte) 0xB0;
 public final static byte VERIFIE = (byte) 0x20;
 public final static byte GET_PATIENT_INFORMATION = (byte) 0x21;
 public static final byte GET_PATIENT_ADRESSE=0x32;
 public static final byte GET_PATIENT_NOM=0x33;
 public static final byte CHANGER_PIN=(byte)0x34;
 public final static byte LOCK_CARD = (byte) 0x22;
 public static final byte INS_SELECT= (byte) 0xA4;
 final static short SW_NO_ERROR = (short) 0x9000;
 public static final byte LFC_PRE_PERSO = (byte) 0x50;
 public static final byte LFC_USE = (byte) 0x51;
 public static final byte LFC_INVALID = (byte) 0x52;
 public static final byte LFC_DEAD = (byte) 0x53;
 private static final byte INS_GET_STATE = 0x05;
 private static final byte INS_CONFIGURE = 0x06;
 
  // LifeCycleState
  

  /**
* @param args
* @throws IOException
* @throws CadTransportException
*/
  
  // connection
  private CadT1Client cad;
  private Socket sckCarte;
  Apdu apdu;
  
  
  /**
* Méthode permettant d'envoyer une commande APDU
* 
* @param ins le type d'instruction
* @param P1 parametre 1
* @param P2 parametre 2
* @param lc taille donnees
* @param data donnees
* @param le taille retour
* @throws IOException
* @throws CadTransportException

*/
  private void send(byte ins, byte P1, byte P2, byte lc, byte[] data, byte le)
  throws IOException, CadTransportException {
   apdu = new Apdu();
   apdu.command[Apdu.CLA] = Admin;
   apdu.command[Apdu.INS] = ins;
   apdu.command[Apdu.P1] = P1;
   apdu.command[Apdu.P2] = P2;
   apdu.setLc(lc);
   apdu.setLe(le);
   apdu.setDataIn(data);
   cad.exchangeApdu(apdu);
  }
  
  /**
* Une fois connecté à la carte, que la commande powerUP a été envoyée et
* que la carte est selectionnée, on peut passer au traitement.
* 
* C'est le menu principal.
* @throws CadTransportException
* @throws IOException
*/
  public void exec() throws CadTransportException, IOException {
   Scanner sc = new Scanner(System.in);
   String get;
   byte[] val;
   
   /* On verifie l'etat actuel de la carte */
   send(Jf_Admin.INS_GET_STATE,(byte)0x00,(byte)0x00,(byte)0x00,new byte[]{},(byte)0x00);
   
   if (apdu.getStatus() != 0x9000) {
    System.err.println("Erreur Fatale");
    return;
   }
   
   /* Personnalisation Carte */
   if (apdu.dataOut[0] == Jf_Admin.LFC_PRE_PERSO) {
    System.out.println();
    System.out.println("Application cliente Javacard");
    System.out.println("-------- CONFIG ------------");
    System.out.println();
    System.out.print("Code Pin User : ");
    get = sc.next();
    byte[] recpin = new byte[8];
    for(int i = 0 ; i<4 ; i++) {
     recpin[i] = (byte) (get.getBytes()[i] - 48);
    }
    System.out.print("Code Pin  : ");
    get = sc.next();
    for(int i = 4 ; i<8 ; i++) {
     recpin[i] = (byte) (get.getBytes()[i-4] - 48);
    }
    send(Jf_Admin.INS_CONFIGURE,(byte)0x00,(byte)0x00,(byte)0x08,recpin,(byte)0x00);
   }
   
   if (apdu.getStatus() == 0x6700) {
    System.err.println("Les mots de passe doivent être de taille 4.");
   } else if (apdu.getStatus() != 0x9000) {
    System.err.println("Erreur Dans la configuration ->"+apdu.getStatus());
    return;
   } else {
    System.out.println("CONFIG OK");
   }

   
   if (apdu.getStatus() != 0x9000) {
    System.err.println("Erreur Fatale");
    return;
   }
   /* Menu principal */
   boolean fin = false;
   while (!fin) {
    send(Jf_Admin.INS_GET_STATE,(byte)0x00,(byte)0x00,(byte)0x00,new byte[]{},(byte)0x00);
    
    if (apdu.dataOut[0] == Jf_Admin.LFC_DEAD) {
     System.err.println("CARTE MORTE");
     return;
    }
    
    if (apdu.dataOut[0] == Jf_Admin.LFC_INVALID){
     System.err.println("CARTE BLOQUEE - Contacter votre Amin.");
     return;
    }
    
    if (apdu.dataOut[0] == Jf_Admin.LFC_USE) {
     System.out.println();
     System.out.println("Application cliente Javacard");
     System.out.println("----------------------------");
     System.out.println();
     System.out.println("1 - Interroger la Carte");
     System.out.println("2 - ");
     System.out.println("3 - ");
     System.out.println("4 - ");
     System.out.println();
     System.out.println("Votre choix ?");
     
     int choix = System.in.read();
     while (!(choix >= '1' && choix <= '4')) {
      choix = System.in.read();
     }
     
     apdu = new Apdu();
     apdu.command[Apdu.CLA] = Jf_Admin.Admin;
     apdu.command[Apdu.P1] = 0x00;
     apdu.command[Apdu.P2] = 0x00;
     
     switch (choix) {
       case '1':
       /* Le client verifie le nom */
       send(Jf_Admin.GET_PATIENT_NOM,(byte)0x00,(byte)0x00,(byte)0x00,new byte[]{},(byte)0x00);
       if (apdu.getStatus() != 0x9000) {
        System.err.println("Une erreur est survenue");
       } else {
        System.out.println("NOM: " + apdu.dataOut[1]);
       }
       break;
       
      case '2':
       /* Le client veut créditer la carte :
* D'abord, on vérifie s'il a déjà renseigné son code pin (si ce n'est pas le cas, il devra le donner)
* ensuite on crédite l'argent
*/
       System.out.print("Valeur : ");
       val = new byte[]{sc.nextByte()};
       send(Jf_Admin.GET_PATIENT_ADRESSE,(byte)0x00,(byte)0x00,(byte)0x01,val,(byte)0x00);
       
       if (apdu.getStatus() == 0x6301) {
        // Code pin pas renseigné 
        System.out.print("Code Pin : ");
        get = sc.next();
        if (get.length() != 4) {
         System.err.println("Code Pin invalide");
         break;
        }
        byte[] recpin = new byte[4];
        for(int i = 0 ; i<recpin.length ; i++) {
         recpin[i] = (byte) (get.getBytes()[i] - 48);
        }
        send(Jf_Admin.VERIFIE,(byte)0x00,(byte)0x00,(byte)0x04,recpin,(byte)0x00);
        
        if (apdu.getStatus() == 0x9000) {
         send(Jf_Admin.GET_PATIENT_INFORMATION,(byte)0x00,(byte)0x00,(byte)0x01,val,(byte)0x00);
         
         if (apdu.getStatus() == 0x9000) {
          System.out.println("OK");
         } else {
          System.err.println("ERROR -> "+apdu.getStatus());
         }
         
        } else {
         System.err.println(apdu.getStatus()+" --> BAD PIN");
        }
       } else if (apdu.getStatus() == 0x9000) {
        System.out.println("OK");
       } else {
        System.err.println("DONNEES INVALIDE");
       }
       
       break;
       
      case '3':
       apdu.command[Apdu.INS] = Jf_Admin.CHANGER_PIN;
       System.out.print("Valeur : ");
       apdu.setLc(1);
       apdu.setDataIn(new byte[]{sc.nextByte()});
       cad.exchangeApdu(apdu);
       if (apdu.getStatus() != SW_NO_ERROR) {
        System.out.println("Erreur : status word different de 0x9000 -> "+apdu.getStatus());
       } else {
        System.out.println("OK");
       }
       break;
       
      case '4':
       fin = true;
       break;
     }
     
    } 
   }
   
  } 
  
  private void connect() {
   try {
    sckCarte = new Socket("localhost", 9025);
    sckCarte.setTcpNoDelay(true);
    BufferedInputStream input = new BufferedInputStream(sckCarte.getInputStream());
    BufferedOutputStream output = new BufferedOutputStream(sckCarte.getOutputStream());
    cad = new CadT1Client(input, output);
   } catch (Exception e) {
    System.out.println("Erreur : impossible de se connecter a la Javacard");
    return;
   }
  }
  
  private void select() {
   apdu = new Apdu();
   apdu.command[Apdu.CLA] = 0x00;
   apdu.command[Apdu.INS] = (byte) 0xA4;
   apdu.command[Apdu.P1] = 0x04;
   apdu.command[Apdu.P2] = 0x00;
   byte[] adminAID = {(byte) 0xF2, (byte) 0x34, (byte) 0x12, (byte) 0x34,
     (byte) 0x56, (byte) 0x00, (byte) 0x30, (byte) 0x00,
     (byte) 0x01};
   apdu.setDataIn(adminAID);
   try {
    cad.exchangeApdu(apdu);
   } catch (IOException e) {
    e.printStackTrace();
   } catch (CadTransportException e) {
    e.printStackTrace();
   }
   if (apdu.getStatus() != SW_NO_ERROR) {
    System.out.println("Erreur lors de la sélection de l'applet -> "+apdu.getStatus());
    System.exit(1);
   }
  }
  
  
  private void powerDown() {
   /* Mise hors tension de la carte */
   try {
    cad.powerDown();
   } catch (Exception e) {
    System.out.println("Erreur lors de l'envoi de la commande Powerdown");
    return;
   }
  }
  
  private void powerUp() {
   /* Mise en tension de la carte */
   try {
    cad.powerUp();
   } catch (Exception e) {
    System.out.println("Erreur lors de l'envoi de la commande PowerUp");
    return;
   }
  }
   public static void main(String[] args) throws IOException, CadTransportException {
   Jf_Admin pc = new Jf_Admin();
   pc.connect();
   pc.powerUp();
   pc.select();
   pc.exec();
   pc.powerDown();
  
  }

 
 private void InitComponents(){
 }
 private void jbChangerPINMouseClicked(MouseEvent event){
  
 }
private void jbDeconnecterMouseClicked(MouseEvent event){
 }
private void jbViewDataMouseClicked(MouseEvent event){
}
public Jf_Admin(){
}
}

et celui est pour la classe applet
package tine.admin;

import tine.medecin.CodeConstant;
import tine.medecin.MedecinInterface;
import tine.patient.PatientInterface;
import tine.patient.information.PatientInformationInterface;
import javacard.framework.AID;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
import javacard.framework.OwnerPIN;


 public class Admin extends Applet {
  private final AID medecinAID= null;
  private final AID patientAID = null;
  private MedecinInterface medecinInterface;
  private final AID patientInformationAID = null;
  private PatientInformationInterface patientInformationInterface;
  private PatientInterface patientInterface;
  OwnerPIN pin;
  static byte[] workarray;
 
public Admin(byte[] bArray, short bOffset, byte bLength) {
 
}
 
private void changer_pin(APDU apdu) {

 
}

private void get_patient_adresse(APDU apdu) {
 
 
}

private void get_patient_nom(APDU apdu) {
 
 
}

private void get_patient_information(APDU apdu) {
 
 
}

private void DebloquerPatient(APDU apdu) {
 
 
}


 public static void install(byte bArray[], short bOffset, byte bLength)
   throws ISOException {
  new Admin(bArray,bOffset,bLength).register(bArray,(short) (bOffset + 1),bArray[bOffset]); 
  }
 public boolean select() {
   return true; 
  }

 public void process(APDU apdu) throws ISOException {
  if(selectingApplet()){
   return;
  }
  byte[] buf=apdu.getBuffer();
  
        if((buf[ISO7816.OFFSET_CLA]==0) && (buf[ISO7816.OFFSET_INS]== (byte)(0x04)))
         return;
        
        if(buf[ISO7816.OFFSET_CLA]!= CodeConstant.CLA.GetionPatient_CLA)
         ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
        
        switch (buf[ISO7816.OFFSET_INS]) {
           case CodeConstant.INS.VERIFIE:
            this.verifie(apdu);
            break;
            case CodeConstant.INS.LOCK_CARD:
            break;
            case CodeConstant.INS.UNLOCK_CARD:
            this.DebloquerPatient(apdu);
            case CodeConstant.INS.GET_PATIENT_INFORMATION:
            this.get_patient_information(apdu);
            break;
            case CodeConstant.INS.GET_PATIENT_NOM :
            this.get_patient_nom(apdu);
            break;
            case CodeConstant.INS.GET_PATIENT_ADRESSE :
            this.get_patient_adresse(apdu);
            break;
            case CodeConstant.INS.CHANGER_PIN:
            this.changer_pin(apdu);
            break;
            default:
             ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
 }
        
        
 }
 public void receiveAPDUBody(APDU apdu) throws ISOException {
  
 }
 public void resetPin(){
  
 }
 private void verifie(APDU apdu) {
  
  
 }
} 

1 réponse

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
8 avril 2015 à 16:56
'lut, et quelle est la question?
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
8 avril 2015 à 18:40
0