/* * * * 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 javax.microedition.jcrmi; import javax.microedition.io.*; /** * This interface defines the Java Card RMI connection which can be used * by J2ME applications to communicate with applications on a smart card * using Java Card RMI protocol. * <h4> * Creating a Java Card RMI Connection * </h4> <p> * Java Card RMI connection is created by passing a generic connection URI * string with a card * application identifier (AID) and optionally the slot in which the * card is inserted, * to the {@link javax.microedition.io.Connector#open Connector.open} method. * For example, the * connection string: * <pre> * jcrmi:0;AID=A0.0.0.67.4.7.1F.3.2C.3 * </pre> * indicates that the connection is to be established with * an application having the * AID A0.0.0.67.4.7.1F.3.2C.3 and which resides in * the smart card * inserted in the default slot; that is, slot number 0. If the slot number * is not specified, then the * default slot is assumed. * </p> * <p> * Each Java Card RMI connection has a logical channel reserved * exclusively for it. That is, the channel * is dedicated to the J2ME application and the selected smart card * application until the * connection is closed. * A smart card supporting logical channels allows the host device * to open multiple logical channels to communicate with on-card applications. * Logical channel other than the basic channel must be closed when * corresponding connection is closed. Basic channel or channel 0 must remain * open while the card is powered on. * <p> * Since the basic channel or channel 0 cannot be closed, the * implementation should maintain its availability status. * When a J2ME application asks for a new connection, the implementation * would find out if channel 0 is in use by any application * (native or J2ME application). If channel 0 is not in use, the * implementation would acquire the channel 0 for communicating with the * card application by setting the state of channel 0 to "IN USE". It would * then select the desired application on channel 0. If the selection is * successful, the newly created connection object would be returned to the * J2ME application which can then use it to communicate with the card * application. * If the card application selection fails or the J2ME application calls * <code>close</code> on the connection object, the availability state of * the basic channel will be set back to "AVAILABLE" meaning that the basic * channel is available for use. * </p> * <p> * When a J2ME application requests a connection to the card and channel 0 * is in use by some other application (native or J2ME application), the * implementation sends a <code>MANAGE CHANNEL</code> command to the * card requesting a logical channel for the * new connection. If there is a logical channel available, the card * returns with the logical channel number which will be used by the new * connection. The implementation would select the desired application on * the newly allocated logical channel. If the selection is successful, * the implementation returns the newly created connection object to * the J2ME application which can then use it for communicating with the card * application. If application selection fails or the J2ME application calls * <code>close()</code> method to close the connection with * the card application, the implementation will send a * <code>MANAGE CHANNEL</code> command to * the card to close the channel. The channel will then be available for use by * other applications. * </p> * <p> * In the case when there are no logical channels available or the * card does not * support logical channels, the card will return an error. An * <code>IOException</code> will be thrown and no connection object will be * returned to the J2ME application. * </p> * <h4> * Invoking Methods on Remote Objects in Java Card * </h4> * <p>Once the Java Card RMI connection is created, the J2ME application * can obtain an initial remote reference object using * {@link #getInitialReference() getInitialReference}. Using this reference, * the application can invoke * methods of an initial remote object on the card and obtain other * references to remote objects.</p> * * <h4> * Communicating With Multiple Smart Card Applications * </h4> * <p> * A J2ME application may connect and communicate with multiple smart card * applications interchangeably. To achieve this the * J2ME application can repeat the procedure mentioned above to create * corresponding connection objects. * </p> * <h4> * Closing a JavaCardRMIConnection * </h4> * <p>A J2ME application can call * <code>javax.microedition.io.Connection.close()</code> on the * connection object to terminate the connection and release the * logical channel. The logical channel is free to be * used by other applications. If an application terminates without * closing an open connection, the implementation SHOULD perform the * close operation automatically.</p> * * <h4> * Exceptions that can be Thrown During Connection Establishment * </h4> * <p>If the card slot does not exist, or if the card * is not inserted or powered on, or if application selection is failed * a <code>ConnectionNotFoundException</code> * must be thrown.</p> * <p>If the J2ME application is not allowed to access the application * with the specified application identifier a * <code>SecurityException</code> is thrown.</p> * <p>If there is no logical channel available to * establish a connection, an <code>IOException</code> * must be thrown.</p> * <p>If initial remote reference object can not be created * a <code>RemoteException</code> must be thrown.</p> * <p>If a card is removed after the connection is established and then * re-inserted, * the J2ME application must re-establish the connection and get a new * connection object. Any attempts to invoke remote method using the * connection object created before removal of the card will result in * <code>RemoteException</code> being thrown. * </p> * <h3> * BNF Format for Connector.open() string * </h3> * <p> * The URI MUST conform to the BNF syntax specified below. If the URI * does not conform to this syntax, an <code>IllegalArgumentException</code> * is thrown. * </p> * <table BORDER="1"> * <tr> * <td><<em>JCRMI_connection_string</em>> </td> * <td>::= "<strong>jcrmi:</strong>"< * <em>cardApplicationAddress</em>> </td> * </tr> * * <tr> * <td><<em>cardApplicationAddress</em>> </td> * <td>::= <i>[slot];<<em>AID_string</em>> </i> </td> * </tr> * * <tr> * <td><<em>slot</em>> </td> * <td>::= <i>smart card slot.</i> (optional. Hexadecimal number * identifying the smart card slot. Default slot assumed if left empty) * </td> * </tr> * * <tr> * <td><<em>AID_string</em>> </td> * <td>::= "AID="<i><AID></i> </td> * </tr> * * <tr> * <td><<em>AID</em>> </td> * <td>::= <i><5 - 16 bytes> </i> * <br> An AID (Application Identifier) uniquely identifies a smart card * application. It is represented by 5 to 16 hexadecimal bytes where each * byte value is seperated by a ".".</td> * </tr> * </table> * * <h3>Smart Card Slot Discovery Mechanism</h3> * <p> J2ME devices may support a variable number of security elements * (usually smart card slots). Some security elements are permanently * attached to the device (e.g. a soldered chip), others are removable. * The removable security elements may be cold-swappable, requiring * the battery to be removed before the security element can be exchanged * (e.g. a MiniSIM slot hidden behind the battery). Other removable * security elements can be inserted and removed while the system is * running. (e.g. a hot-swappable smart card reader). </p> * <p> * A system property is defined to indicate the names of the * smart card slots. The property can be queried through the * <code>System.getProperty()</code> method using the key * <em>microedition.smartcardslots</em>. The value returned * is a comma-separated list of the smart card slots which can * be used in the <code>Connector.open()</code> string to identify the * specific smart card slot. * </p> * <p> * If the platform includes a (U)SIM card, it MUST be in slot 0. * </p> * <p> * The logical slot names include the slot number and a descriptor * indicating the type of the slot. For cold-swappable slots the * letter 'C' is appended to the slot number. For hot-swappable slots * the letter 'H' is appended to the slot number. The slot descriptors (the * letter 'C' and 'H' appended to the slot number) cannot be passed as part * of the URI to open a connection to the smart card application. The J2ME * application MUST remove the descriptor from the logical slot name and * only use the slot number in URI to identify the specific smart card * slot. * </p> * <p> A typical configuration for a cold-swappable SIM card and * a hot-swappable removable card would be: </p> * <pre><code> <br> microedition.smartcardslots: 0C,1H<br></code></pre> * * * * <h3> * Example * </h3> * * <p> * The following example shows how a <code>JavaCardRMIConnection</code> * can be used to access a smart card application. * </p> * <pre> * try { * JavaCardRMIConnection connection = (JavaCardRMIConnection) * Connector.open("jcrmi:0;AID=A0.0.0.67.4.7.1F.3.2C.3"); * * Counter counter = (Counter) connection.getInitialReference(); * ... * currentValue = counter.add(50); * ... * connection.close(); * } catch (Exception e) { * ... * } * </pre> * <h3> * Note regarding PIN-related methods * </h3> * <p> * A platform should implement the PIN entry UI in such a way that: * <ul> * <li> * the UI is distinguishable from a UI generated by external sources * (for example J2ME applications) * </li> * <li> * external sources are not able to retrieve or insert PIN data * </li> * <li> * If the static access control mechanism is implemented, the PIN * related methods MUST be implemented as specified in the static access * control mechanism. For further details see Appendix A (Recommended * Security Element Access Control). * </li> * </ul> * </p> */ public interface JavaCardRMIConnection extends Connection { /** * This status is returned to the calling J2ME application * if the operation for PIN verification/change/disable/ * enable/unblock was not successful because the user * cancelled the PIN entry request. */ public static final short PINENTRY_CANCELLED = -1; /** * Returns the stub object for an initial remote reference. * @return the initial remote reference */ java.rmi.Remote getInitialReference(); /** * A call to <code>enterPin</code> method pops up a UI that requests * the PIN * from the user. The pinID field indicates which PIN must be * requested from the user. The user can either cancel the request * or continue. If the user enters the PIN and chooses to continue, * The implementation is responsible for * presenting the PIN entered by the user to the card for verification. * If padding is required for the PIN, the implementation is responsible * for providing appropriate padding. * @param pinID the type of PIN the implementation is suppose to prompt * the user to enter. * @return PINENTRY_CANCELLED if the user cancelled the PIN entry * request or the value returned by the remote method. * @exception java.rmi.RemoteException is thrown if the PIN could * not be communicated to the card or an exception is thrown * by the card in response to the PIN entry. * @exception SecurityException is thrown if the J2ME application does * not have appropriate rights to ask for PIN verification. * @exception UnsupportedOperationException is thrown if the * implementation does not support this method. */ short enterPin(int pinID) throws java.rmi.RemoteException; /** * A call to <code>changePin</code> method pops up a UI that requests * the user for an old or existing PIN value and the new PIN value to * change the value of the PIN. The pinID field indicates which PIN is * to be changed. The user can either cancel the request * or continue. If the user enters the PIN values and chooses to continue * the implementation is responsible for presenting * the old and new values of the PIN to the card. * If padding is required for the PIN, the implementation is responsible * for providing appropriate padding. * @param pinID the type of PIN the implementation is suppose to prompt * the user to change. * @return PINENTRY_CANCELLED if the user cancelled the PIN entry * request or the value returned by the remote method. * @exception java.rmi.RemoteException is thrown if the PIN could * not be communicated to the card or an exception is thrown * by the card in response to the PIN entry. * @exception SecurityException is thrown if the J2ME application does * not have appropriate rights to ask for changing the PIN value. * @exception UnsupportedOperationException is thrown if the * implementation does not support this method. */ short changePin(int pinID) throws java.rmi.RemoteException; /** * A call to <code>disablePin</code> method pops up a UI that requests * the user to enter the value for the PIN that is to be disabled. * The pinID field * indicates which PIN is to be disabled. The user can * either cancel the request * or continue. If the user enters the PIN and chooses to continue the * implementation is responsible * for presenting the PIN value to the card to disable PIN. * If padding is required for the PIN, the implementation is responsible * for providing appropriate padding. * @param pinID the type of PIN the implementation is required to prompt * the user to enter. * @return PINENTRY_CANCELLED if the user cancelled the PIN entry * request or the value returned by the remote method. * @exception java.rmi.RemoteException is thrown if the PIN could * not be communicated to the card or an exception is thrown * by the card in response to the PIN entry. * @exception SecurityException is thrown if the J2ME application does * not have appropriate rights to ask for disabling the PIN. * @exception UnsupportedOperationException is thrown if the * implementation does not support this method. */ short disablePin(int pinID) throws java.rmi.RemoteException; /** * A call to <code>enablePin</code> method pops up a UI that requests * the user to enter the value for the PIN that is to be enabled. * The pinID field * indicates which PIN is to be enabled. The user can * either cancel the request * or continue. If the user enters the PIN and chooses to continue the * implementation is responsible * for presenting the PIN value to the card for enabling the PIN. * If padding is required for the PIN, the implementation is responsible * for providing appropriate padding. * @param pinID the type of PIN the implementation is required to prompt * the user to enter. * @return PINENTRY_CANCELLED if the user cancelled the PIN entry * request or the value returned by the remote method. * @exception java.rmi.RemoteException is thrown if the PIN could * not be communicated to the card or an exception is thrown * by the card in response to the PIN entry. * @exception SecurityException is thrown if the J2ME application does * not have appropriate rights to ask for enabling the PIN. * @exception UnsupportedOperationException is thrown if the * implementation does not support this method. */ short enablePin(int pinID) throws java.rmi.RemoteException; /** * This is a high-level method that lets the J2ME application * ask the user to enter the value for an unblocking PIN, * and the new value for the blocked PIN and send * these to the card. * A call to <code>unblockPin</code> method pops up a UI that requests * the user to enter the value for the unblocking PIN and the * new value for the blocked PIN. * The <code>unblockingPinID</code> field indicates which unblocking * PIN is to be * used to unblock the blocked PIN which is indicated by the field * <code>blockedPinID</code>. * The user can either cancel the request * or continue. If the user enters the PIN values and chooses to continue, * the implementation is responsible * for presenting the PIN values to the card for unblocking the * blocked PIN. * If padding is required for either of the PIN values, the * implementation is responsible for providing appropriate padding. * @param blockedPinID the ID of PIN that is to be unblocked. * @param unblockingPinID the ID of unblocking PIN. * @return PINENTRY_CANCELLED if the user cancelled the PIN entry * request or the value returned by the remote method. * @exception java.rmi.RemoteException is thrown if the PIN could * not be communicated to the card or an exception is thrown * by the card in response to the PIN entry. * @exception SecurityException is thrown if the J2ME application does * not have appropriate rights to ask for unblocking the PIN. * @exception UnsupportedOperationException is thrown if the * implementation does not support this method. */ short unblockPin(int blockedPinID, int unblockingPinID) throws java.rmi.RemoteException; }