KickJava   Java API By Example, From Geeks To Geeks.

Java > Java SE, EE, ME > javacard > framework > Applet

javacard.framework
Class Applet

java.lang.Object
  |
  +--javacard.framework.Applet
See Also:
SystemException, JCSystem

protected Applet()
Geek's Notes:
Description  Add your codes or notes  Search More Java Examples  


[1442]Javacard Applet for reading data with APDU
By Anonymous on 2005/05/26 12:50:01  Rate
package bank.purse; 
 import javacard.framework.*; 
 import javacardx.framework.*; 
  
  
 public class Wallet extends Applet 
  
  
  {  
  
  
   /* constants declaration */  
   
 // code of CLA byte in the command APDU header  
   
 final static byte Wallet_CLA = ( byte ) 0xB0; 
  
  
 // codes of INS byte in the command APDU header  
   
 final static byte VERIFY =  ( byte )  0x20;   
 final static byte CREDIT =  ( byte )  0x30;   
 final static byte DEBIT =  ( byte )  0x40;   
 final static byte GET_BALANCE =  ( byte )  0x50; 
  
  
 // maximum balance     
  
  
 final static short MAX_BALANCE = 0x7FFF;   
    
 // maximum transaction amount  
     
 final static byte MAX_TRANSACTION_AMOUNT = 127; 
  
  
 // maximum number of incorrect tries before the   
 // PIN is blocked   
  
  
 final static byte PIN_TRY_LIMIT = ( byte ) 0x03; 
      
 // maximum size PIN  
   
 final static byte MAX_PIN_SIZE = ( byte ) 0x08; 
  
  
 // signal that the PIN verification failed   
  
  
 final static short SW_VERIFICATION_FAILED = 0x6300; 
       
 // signal the PIN validation is required   
 // for a credit or a debit transaction   
  
  
 final static short SW_PIN_VERIFICATION_REQUIRED =0x6301; 
  
  
 // signal invalid transaction amount   
 // amount  >  MAX_TRANSACTION_MAOUNT or amount  <  0   
  
  
 final static short SW_INVALID_TRANSACTION_AMOUNT = 0x6A83; 
       
 // signal that the balance exceed the maximum   
  
  
 final static short SW_EXCEED_MAXIMUM_BALANCE = 0x6A84;    
    
 // signal the balance becomes negative   
  
  
 final static short SW_NEGATIVE_BALANCE = 0x6A85;  
  
  
 /* instance variables declaration */  
  
  
 OwnerPIN pin;   
 short balance; 
 private Wallet  ( byte [  ]  bArray,  
 short bOffset, byte bLength )  
  
  
  {  
  
  
 // It is good programming practice to allocate     
 // all the memory that an applet needs during     
 // its lifetime inside the constructor   
    
 pin = new OwnerPIN ( PIN_TRY_LIMIT, MAX_PIN_SIZE ) ; 
         
 // The installation parameters contain the PIN     
 // initialization  
     
 value pin.update ( bArray, bOffset, bLength ) ;     
 register (  ) ;  
  
  
   }   
  
  
 // end of the constructor 
  
  
 public static void install ( byte [  ]  bArray, short bOffset, byte bLength )  
  
  
   {      
  
  
 // create a Wallet applet instance   
    
 new Wallet ( bArray, bOffset, bLength ) ;  
  
  
   }   
  
  
 // end of install method 
  
  
 public boolean select (  )  
  
  
   {      
  
  
 // The applet declines to be selected     
 // if the pin is blocked. 
      
 if  (  pin.getTriesRemaining (  )  == 0  )   
  
  
 return false;     
 return true;  
   
  }  
  
  
 // end of select method 
  
  
 public void deselect (  )   
  
  
  {      
  
  
 // reset the pin value  
     
 pin.reset (  ) ; 
  
  
  }  
  
  
 public void process ( APDU apdu )  
  
  
   {      
  
  
 // APDU object carries a byte array  ( buffer )  to     
 // transfer incoming and outgoing APDU header     
 // and data bytes between card and CAD     
 // At this point, only the first header bytes     
 //  [ CLA, INS, P1, P2, P3 ]  are available in     
 // the APDU buffer.     
 // The interface javacard.framework.ISO7816     
 // declares constants to denote the offset of     
 // these bytes in the APDU buffer 
      
 byte [  ]  buffer = apdu.getBuffer (  ) ; 
  
  
 // check SELECT APDU command    
   
 if  (  ( buffer [ ISO7816.OFFSET_CLA ]  == 0 )  &&         
  ( buffer [ ISO7816.OFFSET_INS ]  ==  ( byte )  ( 0xA4 )  )  )   
  
  
 return; 
  
  
 // verify the reset of commands have the     
 // correct CLA byte, which specifies the     
 // command structure   
    
 if  ( buffer [ ISO7816.OFFSET_CLA ]  != Wallet_CLA )        
 ISOException.throwIt ( ISO7816.SW_CLA_NOT_SUPPORTED ) ; 
 switch  ( buffer [ ISO7816.OFFSET_INS ]  )  
  
  
   {        
  
  
 case GET_BALANCE: getBalance ( apdu ) ;   
        
 return;       
  
  
 case DEBIT: debit ( apdu ) ;   
        
 return;  
       
 case CREDIT: credit ( apdu ) ;  
         
 return;   
      
 case VERIFY: verify ( apdu ) ;   
        
 return;     
    
 default: ISOException.throwIt  
  
  
  ( ISO7816.SW_INS_NOT_SUPPORTED ) ;  
     
  }    
  
  
  }   
  
  
 // end of process method 
  
  
 private void credit ( APDU apdu )   
  
  
  {      
  
  
 // access authentication  
     
 if  (  ! pin.isValidated (  )  )  
   
 ISOException.throwIt ( SW_PIN_VERIFICATION_REQUIRED ) ;     
 byte [  ]  buffer = apdu.getBuffer (  ) ; 
      
 // Lc byte denotes the number of bytes in the     
 // data field of the command APDU   
    
 byte numBytes = buffer [ ISO7816.OFFSET_LC ] ;  
        
 // indicate that this APDU has incoming data     
 // and receive data starting at the offset 
 // ISO7816.OFFSET_CDATA following the 5 header     
 // bytes.  
     
 byte byteRead =  ( byte )  ( apdu.setIncomingAndReceive (  )  ) ;  
        
 // it is an error if the number of data bytes     
 // read does not match the number in Lc byte   
    
 if  ( byteRead != 1 )  ISOException.throwIt ( ISO7816.SW_WRONG_LENGTH ) ;  
        
 // get the credit amount     
  
  
 byte creditAmount = buffer [ ISO7816.OFFSET_CDATA ] ;  
        
 // check the credit amount  
     
 if  (   (  creditAmount  >  MAX_TRANSACTION_AMOUNT )  ||  (  creditAmount  <  0  )   )        
 ISOException.throwIt ( SW_INVALID_TRANSACTION_AMOUNT ) ; 
         
 // check the new balance  
     
 if  (   (  balance + creditAmount )   >  MAX_BALANCE  )   
 ISOException.throwIt ( SW_EXCEED_MAXIMUM_BALANCE ) ;  
        
 // credit the amount balance =  ( short )  ( balance + creditAmount ) ;    
   
  }   
  
  
 // end of deposit method 
  
  
 private void debit ( APDU apdu )   
  
  
  {     
      
 // access authentication   
    
 if  (  ! pin.isValidated (  )  )  
   
 ISOException.throwIt ( SW_PIN_VERIFICATION_REQUIRED ) ;        
 byte [  ]  buffer = apdu.getBuffer (  ) ;     
 byte numBytes =  ( byte )  ( buffer [ ISO7816.OFFSET_LC ]  ) ;     
 byte byteRead =  ( byte )  ( apdu.setIncomingAndReceive (  )  ) ;        
 if  ( byteRead != 1 )  ISOException.throwIt ( ISO7816.SW_WRONG_LENGTH ) ;   
       
 // get debit amount  
     
 byte debitAmount = buffer [ ISO7816.OFFSET_CDATA ] ;  
        
 // check debit amount   
    
 if  (   (  debitAmount  >  MAX_TRANSACTION_AMOUNT )  ||  ( debitAmount  <  0  )   )        
 ISOException.throwIt ( SW_INVALID_TRANSACTION_AMOUNT ) ;  
       
 // check the new balance 
      
 if  (   (  balance-- debitAmount )   <  0  )   
 ISOException.throwIt ( SW_NEGATIVE_BALANCE ) ;        
 balance =  ( short )   ( balance -- debitAmount ) ;  
  
  
   }   
  
  
 // end of debit method 
  
  
 private void getBalance ( APDU apdu )   
  
  
  {   
     
 byte [  ]  buffer = apdu.getBuffer (  ) ; 
      
 // inform system that the applet has finished     
 // processing the command and the system should     
 // now prepare to construct a response APDU     
 // which contains data field     
 short le = apdu.setOutgoing (  ) ;        
 if  (  le  <  2  )  ISOException.throwItISO7816.SW_WRONG_LENGTH ) ;  
        
 //informs the CAD the actual number of bytes     
 //returned   
    
 apdu.setOutgoingLength (  ( byte ) 2 ) ;  
        
 // move the balance data into the APDU buffer     
 // starting at the offset 0 
      
 buffer [ 0 ]  =  ( byte )  ( balance  >  >  8 ) ;     
 buffer [ 1 ]  =  ( byte )  ( balance & 0xFF ) ; 
         
 // send the 2-balance byte at the offset     
 // 0 in the apdu buffer 
      
 apdu.sendBytes (  ( short ) 0,  ( short ) 2 ) ;    
      
  }   
  
  
 // end of getBalance method 
  
  
 private void verify ( APDU apdu )  
   
  {    
    
 byte [  ]  buffer = apdu.getBuffer (  ) ;  
     
 // retrieve the PIN data for validation.  
     
 byte byteRead =  ( byte )  ( apdu.setIncomingAndReceive (  )  ) ; 
         
 // check pin     
 // the PIN data is read into the APDU buffer     
 // at the offset ISO7816.OFFSET_CDATA     
 // the PIN data length = byteRead  
     
 if  (  pin.check ( buffer, ISO7816.OFFSET_CDATA,byteRead )  == false  )        
 ISOException.throwIt ( SW_VERIFICATION_FAILED ) ;   
  
  
  }   
  
  
 // end of validate method }   
 // end of class Wallet 
  
  
  
  
  
  
 


public void deselect()
Geek's Notes:
Description  Add your codes or notes  Search More Java Examples  


public Shareable getShareableInterfaceObject(AID clientAID,
                                             byte parameter)
See Also:
JCSystem.getAppletShareableInterfaceObject(AID, byte)
Geek's Notes:
Description  Add your codes or notes  Search More Java Examples  


public static void install(byte[] bArray,
                           short bOffset,
                           byte bLength)
                    throws ISOException
Geek's Notes:
Description  Add your codes or notes  Search More Java Examples  


public abstract void process(APDU apdu)
                      throws ISOException
Geek's Notes:
Description  Add your codes or notes  Search More Java Examples  


protected final void register()
                       throws SystemException
Geek's Notes:
Description  Add your codes or notes  Search More Java Examples  


protected final void register(byte[] bArray,
                              short bOffset,
                              byte bLength)
                       throws SystemException
See Also:
install(byte[],short,byte)
Geek's Notes:
Description  Add your codes or notes  Search More Java Examples  


public boolean select()
Geek's Notes:
Description  Add your codes or notes  Search More Java Examples  


protected final boolean selectingApplet()
Geek's Notes:
Description  Add your codes or notes  Search More Java Examples  

Popular Tags