3 Replies Latest reply: May 2, 2012 10:38 PM by safarmer RSS

    WRITE AND READ ON SMART CARD.....CONVERTER ERROR

    930974
      hello
      I am developing a java card application to write and read data on smart cards. I was able to simulate a virtual JCWDE and now I want to use the card online!! What should I do?? when I create the file .CAP I get an error:

      conversion completed with 1 errors and 0 warnings.
      error: line 77: dati.Write_Read_Data: unsupported int type of intermediate value, must cast intermediate value to type short or byte.


      May you help me?

      I'm using eclipse and jck2.2.2 and jcde0.1.


      The code I wrote is as follows:

      package dati;

      import javacard.framework.*;


      public class Write_Read_Data extends Applet {
           final byte AppletCLA = (byte) 0xb0; //imposta il CLA della mia applet
           /*metodi di INS*/
           final byte GET_DATA = (byte) 0x10;
           final byte WRITE = (byte) 0x20;
           
           
           /*variabile per i metodi */
           final byte[] archivio;
                
                     
           /*METODO INSTALL*/

           public static void install(byte bArray[], short bOffset, byte bLength)
           throws ISOException {
                new Write_Read_Data();//viene invocato il costruttore
                
           }
           
           /*COSTRUTTORE*/
           protected Write_Read_Data() {          //all'interno si inizzializzano le variabili di classe
                archivio = new byte[(short)5];
                register(); //serve per registrare l’applet nella JCVM e deve essere invocato in ogni classe nel costruttore.
           }
           
           /*METODO PROCESS*/

           public void process(APDU apdu) throws ISOException { //si elaborano le APDU ricevute e si gestiscono i metodi implementati
                byte buffer[] = apdu.getBuffer(); //estraggo informazioni dal buffer(l'istruzione letta nel buffer passa il controllo alla routine opportuna)
                if ((buffer[ISO7816.OFFSET_CLA] == 0) && //escludo il caso in cui il comando è SELECT
                          (buffer[ISO7816.OFFSET_INS] == (byte)0xA4))
                     return;
                     /* esiste la possibilità che venga inviata all’applet un’istruzione non supportata,
                     e ci si aspetta che ritorni un messaggio di eccezione che spieghi il tipo di errore. */          
                if (buffer[ISO7816.OFFSET_CLA] != AppletCLA){
                     ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
                }
                /*Si deve quindi effettuare un controllo del campo INS per determinare quale metodo usare
                e anche per verificare se ciò che c’è nel campo INS sia supportato.*/
                
                
                if (buffer[ISO7816.OFFSET_CLA] == AppletCLA) { 
                switch(buffer[ISO7816.OFFSET_INS]) {    
                case GET_DATA:
                getData(apdu);
                return;
                
                case WRITE:
                     write(apdu);
                     return;
                default :
                ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
                }
                }
           }
           
           
           public void write(APDU apdu){
                
                byte buffer[] = apdu.getBuffer(); //memorizzo il buffer
                short lc = buffer [ISO7816.OFFSET_LC]; //memorizzo la lunghezza dei dati specificata nel campo LC

                if(lc!=apdu.setIncomingAndReceive())                     //se la lunghezza dichiarata è diversa da quella effettiva: ERRORE
                     ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
                else{                                                            //memorizziamo il punto del buffer in cui inizia il campo DATA
                     
                     short campoData = ISO7816.OFFSET_CDATA;
                     
                     short puntatore = (short)                              //utilizziamo un puntatore per la memorizzazione inviato tramite P1 P2
                     (buffer[ISO7816.OFFSET_P1]*buffer[ISO7816.OFFSET_P2]);
                     
                     if(puntatore>=archivio.length&&puntatore+lc>=archivio.length)     //elimino la possibilità di errori di puntamento
                          ISOException.throwIt(ISO7816.SW_WRONG_P1P2);
                     else
                          Util.arrayCopy(buffer, campoData,archivio, puntatore, lc); //copio il buffer da campoData per la lunghezza lc in archivio
                     }
                
           }
           
           
           public void getData(APDU apdu){
                //imposto il CAD a ricevere
                apdu.setOutgoing();
                //invio al CAD la lunghezza dell'arrey
                apdu.setOutgoingLength((byte)archivio.length);
                //invio i dati
                apdu.sendBytesLong(archivio,(byte)0,(byte)archivio.length); //dal byte 0 fino alla lunghezza di tutto il codiceCarta
           
           }
      }


      PS: I'M VERY NEW on java card



      thanks LUCA
        • 1. Re: WRITE AND READ ON SMART CARD.....CONVERTER ERROR
          925183
          maybe this line could need some casts:
          if(puntatore>=archivio.length&&puntatore+lc>=archivio.length)
          • 2. Re: WRITE AND READ ON SMART CARD.....CONVERTER ERROR
            safarmer
            Repost with {code} tags
            927971 wrote:
            hello
            I am developing a java card application to write and read data on smart cards. I was able to simulate a virtual JCWDE and now I want to use the card online!! What should I do?? when I create the file .CAP I get an error:

            conversion completed with 1 errors and 0 warnings.
            error: line 77: dati.Write_Read_Data: unsupported int type of intermediate value, must cast intermediate value to type short or byte.


            May you help me?

            I'm using eclipse and jck2.2.2 and jcde0.1.


            The code I wrote is as follows:
            
            package dati;
            
            import javacard.framework.*;
            
            
            public class Write_Read_Data extends Applet {
                 final byte AppletCLA = (byte) 0xb0;  //imposta il CLA della mia applet
                 /*metodi di INS*/
                 final byte GET_DATA = (byte) 0x10;
                 final byte WRITE = (byte) 0x20;
                 
                 
                 /*variabile per i metodi */
                 final byte[] archivio;
                      
                           
                 /*METODO INSTALL*/
            
                 public static void install(byte bArray[], short bOffset, byte bLength)
                 throws ISOException {
                      new Write_Read_Data();//viene invocato il costruttore
                      
                 }
                 
                 /*COSTRUTTORE*/
                 protected Write_Read_Data() {          //all'interno si inizzializzano le variabili di classe
                      archivio = new byte[(short)5];
                      register();     //serve per registrare l’applet nella JCVM e deve essere invocato in ogni classe nel costruttore.
                 }
                 
                 /*METODO PROCESS*/
            
                 public void process(APDU apdu) throws ISOException { //si elaborano le APDU ricevute e si gestiscono i metodi implementati 
                      byte buffer[] = apdu.getBuffer();     //estraggo informazioni dal buffer(l'istruzione letta nel buffer passa il controllo alla routine opportuna)
                      if ((buffer[ISO7816.OFFSET_CLA] == 0) &&     //escludo il caso in cui il comando è SELECT
                                (buffer[ISO7816.OFFSET_INS] == (byte)0xA4))
                           return;
                           /*  esiste la possibilità che venga inviata all’applet un’istruzione non supportata,
                             e ci si aspetta che ritorni un messaggio di eccezione che spieghi il tipo di errore. */          
                      if (buffer[ISO7816.OFFSET_CLA] != AppletCLA){
                           ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
                      }
                      /*Si deve quindi effettuare un controllo del campo INS per determinare quale metodo usare
                                   e anche per verificare se ciò che c’è nel campo INS sia supportato.*/
                      
                      
                       if (buffer[ISO7816.OFFSET_CLA] == AppletCLA) {  
                            switch(buffer[ISO7816.OFFSET_INS]) {     
                              case GET_DATA:                         
                                getData(apdu);
                                return;
                        
                              case WRITE:
                                   write(apdu);
                                   return;
                              default :                                
                                ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
                            }
                       }  
                 }
                 
                 
                 public void write(APDU apdu){
                      
                      byte buffer[] = apdu.getBuffer();  //memorizzo il buffer
                      short lc = buffer [ISO7816.OFFSET_LC];    //memorizzo la lunghezza dei dati specificata nel campo LC
            
                      if(lc!=apdu.setIncomingAndReceive())                     //se la lunghezza dichiarata è diversa da quella effettiva: ERRORE
                           ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
                      else{                                                            //memorizziamo il punto del buffer in cui inizia il campo DATA 
                           
                           short campoData = ISO7816.OFFSET_CDATA;
                           
                           short puntatore = (short)                              //utilizziamo un puntatore per la memorizzazione inviato tramite P1 P2
                           (buffer[ISO7816.OFFSET_P1]*buffer[ISO7816.OFFSET_P2]);
                           
                           if(puntatore>=archivio.length&&puntatore+lc>=archivio.length)     //elimino la possibilità di errori di puntamento
                                ISOException.throwIt(ISO7816.SW_WRONG_P1P2);
                           else
                                Util.arrayCopy(buffer, campoData,archivio, puntatore, lc);  //copio il buffer da campoData per la lunghezza lc in archivio
                           }
                      
                 }
                 
                 
                 public void getData(APDU apdu){
                      //imposto il CAD a ricevere
                      apdu.setOutgoing();
                      //invio al CAD la lunghezza dell'arrey
                      apdu.setOutgoingLength((byte)archivio.length);
                      //invio i dati
                      apdu.sendBytesLong(archivio,(byte)0,(byte)archivio.length); //dal byte 0 fino alla lunghezza di tutto il codiceCarta
                 
                 }
            }
            PS: I'M VERY NEW on java card



            thanks LUCA
            • 3. Re: WRITE AND READ ON SMART CARD.....CONVERTER ERROR
              safarmer
              922180 wrote:
              maybe this line could need some casts:
              if(puntatore>=archivio.length&&puntatore+lc>=archivio.length)
              That is because in Java intermediate calculations result in an int and JC does not support ints. It could just as easily be the property lookup on length that returns an int as well.

              As mentioned change that line to:
              if(puntatore >= (short) archivio.length && (short)(puntatore + lc) >= (short) archivio.length)
              Shane

              Edited by: safarmer on May 2, 2012 8:38 PM