The driver client application itself only changes minimally to account for the authentication and integrity needs of SecurePurseApplet
. It must also interact with the user for identification. Hence, a subclass of ApduIO_Card_Accessor
must be developed to provide these additional interactions and the transport filtering required.
The following code is the new SecurePurseClient
application:
import examples.purse.*; import javacard.framework.UserException; public class PurseClient extends java.lang.Object { public static void main(java.lang.String[] argv) { // arg[0] contains the debit amount short debitAmount = (short) Integer.parseInt(argv[0]); CustomCardAccessor cca = null; try { // open and powerup the card - using CustomCardAccessor cca = new CustomCardAccessor(); // create an RMI connector instance for the Java Card platform JCRMIConnect jcRMI = new JCRMIConnect(cca); byte[] appAID = new byte[] {0x01,0x02,0x03,0x04,0x05,0x06,0x07, 0x08}; // select the Java Card applet jcRMI.selectApplet( RMI_DEMO_AID, JCRMIConnect.REF_WITH_CLASS_NAME ); or jcRMI.selectApplet( RMI_DEMO_AID, JCRMIConnect.REF_WITH_INTERFACE_NAMES ); // give your PIN if (! cca.authenticateUser( PRINCIPAL_CARDHOLDER_ID )){ throw new RemoteException(msg.getString("msg04")); } // obtain the initial reference to the Purse interface Purse myPurse = (Purse) jcRMI.getInitialReference(); // debit the requested amount try { short balance = myPurse.debit ( debitAmount ); }catch ( UserException jce ) { short reasonCode = jce.getReason(); // process UserException reason information } // display the balance to user }catch (Exception e) { e.printStackTrace(); }finally { try { if(cca!=null){ cca.closeCard(); } }catch (Exception e) { e.printStackTrace(); } } } }
Note that the CustomCardAccessor
instance is now obtained instead of ApduIOCardAccessor
:
cca = new CustomCardAccessor(new ApduIOCardAccessor());
An extra step to authenticate with the SecurePurseApplet
after selectApplet
is added. This invokes a new method in CustomCardAccessor
to interact with the card using the user's credentials:
if (! cca.authenticateUser( PRINCIPAL_CARDHOLDER_ID )) { // handle error }
The rest of SecurePurseClient
is the same as PurseClient
.