/* * * * Copyright 1990-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */ package com.sun.satsa.gsmapplet; import sim.toolkit.*; import javacard.framework.*; /** * This applets is suppose to simulate the working of the main GSM applet in * (U)SIM that controls access to all other applets. No other applet is * selected directly but is invoked by this applet on basis of events. */ public class GSMApplet extends Applet implements ToolkitConstants { /** * Instruction byte for an Envelope. Only Envelopes are supported at * this time */ private static final byte ENVELOPE_INS = (byte)0xc2; /** Instruction byte value for GET RESPONSE APDU. */ private static final byte GET_RESPONSE_INS = (byte)0xc0; /** * A field to hold the instance of SATAccessor which is used by the * toolkit classes to set and get the APDU buffer. */ AccessSATImpl SATAccessor; /** * Constructor. */ private GSMApplet() { register(); SATAccessor = new AccessSATImpl(); AID aid = JCSystem.getAID(); ViewHandler.SATAccessor = (AccessSAT) JCSystem.getAppletShareableInterfaceObject(aid, (byte)0); } /** * Applet's install method. Creates an instance of GSMApplet * @param bArray parameters array * @param bOffset offset in the parameters array * @param bLength length of parameters */ public static void install(byte[] bArray, short bOffset, byte bLength) { new GSMApplet(); } /** * This method is called by JCRE before it tries to uninstall this applet. */ public void uninstall() { ViewHandler.SATAccessor = null; } /** * Returns shareable interface object to SIM Framework. * * @param clientAID - aid of SIM Framework * @param parameter * @return The current applet instance */ public Shareable getShareableInterfaceObject(AID clientAID, byte parameter) { return (Shareable)SATAccessor; } /** * Process method that processes all the APDUs received from the terminal. * @param apdu APDU that has been received from the terminal */ public void process(APDU apdu) { byte[] buffer = apdu.getBuffer(); // clear the channel information buffer[ISO7816.OFFSET_CLA] = (byte)(buffer[ISO7816.OFFSET_CLA] & (byte)0xFC); // check SELECT APDU command if ((buffer[ISO7816.OFFSET_CLA] == 0) && (buffer[ISO7816.OFFSET_INS] == (byte)(0xA4))) return; switch (buffer[ISO7816.OFFSET_INS]) { case ENVELOPE_INS: short incomingData = apdu.setIncomingAndReceive(); SATAccessor.resetBuffers(); SATAccessor.setAPDUBuffer(buffer, (short)(incomingData + 5)); for (byte i = 0; i < AccessSATImpl.MAX_LISTENERS; i++) { ToolkitInterface ti = SATAccessor.tiList[i]; if (ti == null) { continue; } ViewHandler.currentTI = ti; ti.processToolkit(EVENT_UNFORMATTED_SMS_PP_ENV); if (EnvelopeResponseHandler.status != 0) { short dataLength = SATAccessor.getOutDataLength(); short st = (short) ((EnvelopeResponseHandler.status << 8) | dataLength); ISOException.throwIt(st); } } break; case GET_RESPONSE_INS: SATAccessor.setAPDUBuffer(buffer, (short)5); short dataLength = SATAccessor.getOutDataLength(); apdu.setOutgoing(); apdu.setOutgoingLength(dataLength); SATAccessor.setOutgoingAPDU(); Util.arrayCopy(SATAccessor.getAPDUBuffer(), (short)0, buffer, (short)0, dataLength); apdu.sendBytes((short)0, dataLength); break; default: ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); } } }