Smart cards: A primer

Develop on the Java platform of the future

1 2 3 Page 3
Page 3 of 3

package java.commerce.MemoryCards;

import java.io.IOException; import java.commerce.smartcards.*; import java.commerce.gemplus.*;

public class CardStrings { /** * Write a String, since the card is modulo 8 and we are * not using serialized objects -- the first two bytes are the * length followed by six spare bytes. Strings longer than 4096 - 48 * bits will be truncated. */ public static void writeGFMString(String s , ISOCardReader isoreader) { ISOCommand wcmd; ISOCardinputStream winput; int upper,lower; short length = (short)s.length(); // Length of the input string System.out.println("Length is " + length ); try { // Write the control section out wcmd = new ISOCommand(0, 0xd0, 0, 0, 8,0); // Save the length wcmd.data.writeShort( length ); System.out.println("Write out the Length"); winput = wcmd.execute(isoreader, new GemplusReaderFailureHandler()); // Write the String out int wholeAmount = length/8; // Groups of 8 int remainder = length % 8; // Remainder // Write the String out groups of 8 for ( int l = 1; l <= wholeAmount; l++ ) { System.out.println("Writing 8 bytes at " + (l*8)); upper = (l * 8 ) >> 8; lower = ( l * 8 ) & 0xff; wcmd = new ISOCommand(0, 0xd0, upper, lower, 8,0); int index = ( (l-1) * 8 ); wcmd.data.writeString(s.substring(index),8); System.out.println("Write out bytes at " + index); winput = wcmd.execute(isoreader,new GemplusReaderFailureHandler()); } // Write the remainder out upper = ((wholeAmount+1) * 8 ) >> 8; lower = ((wholeAmount+1) * 8 ) & 0xff; wcmd = new ISOCommand(0, 0xd0, upper, lower, remainder,0); int index = ( wholeAmount * 8 ); wcmd.data.writeString(s.substring(index),remainder); winput = wcmd.execute(isoreader,new GemplusReaderFailureHandler()); } catch ( Exception e ) { System.out.println( "Exception " + e); e.printStackTrace(); } } /** * Read a String, since the card is modulo 8 and we are * not using serialized objects -- the first two bytes are the * length followed by six spare bytes. Strings longer than 4096 - 48 * bits will be truncated. */ public static String readGFMString(ISOCardReader isoreader ) {

ISOCommand rcmd; ISOCardinputStream rinput; int upper,lower; short length; StringBuffer sb = new StringBuffer(); try { // Read the control section rcmd = new ISOCommand(0, 0xb0, 0, 0, 0, 8); // Read the length rinput = rcmd.execute(isoreader,new GemplusReaderFailureHandler()); length = (short)rinput.readShort(); System.out.println("The length is: " + length); // Read the String int wholeAmount = length/8; // Groups of 8 int remainder = length % 8; // Remainder // Read the String in groups of 8 for ( int l = 1; l <= wholeAmount; l++ ) { System.out.println("Reading 8 bytes at " + (l*8)); upper = (l * 8 ) >> 8; lower = ( l * 8 ) & 0xff; rcmd = new ISOCommand(0, 0xb0, upper, lower, 0, 8); rinput = rcmd.execute(isoreader,new GemplusReaderFailureHandler()); sb.append ( rinput.readString(8) ); System.out.println("String to this point:" + sb.toString()); } // Read the remainder upper = ( (wholeAmount+1) * 8 ) >> 8; lower = ( (wholeAmount+1) * 8 ) & 0xff; rcmd = new ISOCommand(0, 0xb0, upper, lower, 0, 8); rinput = rcmd.execute(isoreader,new GemplusReaderFailureHandler()); sb.append ( rinput.readString(remainder) ); System.out.println("String to this point:" + sb.toString()); } catch ( Exception e ) { System.out.println( "Exception " + e); e.printStackTrace(); return ( null ); } return ( sb.toString() ); } }

Future articles

In future articles we will discuss ways in which our doctor of the future can securely sign the entry he or she has put on your card, so that the card can function as a valid prescription, even for in-triplicate prescriptions for controlled substances. The application must also support the ability to display your prescription history. This is a feature of an application that can be used by yourself, your pharmacist, emergency personnel, et al. How about storing a MedAlert-style synopsis of your medical history -- surgeries, drug sensitivities, chronic ailments, and so on? The smart card presents numerous possibilities.

Conclusion

This article has provided the foundation for the entire smart card series, which will consist of four articles in JavaWorld. I will be writing three more articles, with the hope of helping you get comfortable with the use of smart cards in your applications. I will use the Java Electronic Commerce Framework (JECF) as a foundation layer for building real solutions. The JECF provides several classes that simplify communication with smart cards. Much of the code and examples come from the JECF. Check the Resources section for a link to download the JECF, which already includes support for smart cards.

Rinaldo Di Giorgio is a staff engineer for Sun Microsystems in New York City. He currently is working on the integration of many technologies into HotJava and Java, including commerce, database connectivity, portfolio management, and analytical applications for the financial and emerging genetics market. He sees Java as the technology that will minimize two great cost factors in the computer industry: distribution and code development.

Learn more about this topic

This story, "Smart cards: A primer" was originally published by JavaWorld.

Copyright © 1997 IDG Communications, Inc.

1 2 3 Page 3
Page 3 of 3