Merge "Make OMAPI stricter"

This commit is contained in:
Ruchi Kandoi
2018-03-30 23:29:08 +00:00
committed by Gerrit Code Review
5 changed files with 84 additions and 27 deletions

View File

@@ -37011,17 +37011,17 @@ package android.sax {
package android.se.omapi {
public class Channel {
public final class Channel implements java.nio.channels.Channel {
method public void close();
method public byte[] getSelectResponse();
method public android.se.omapi.Session getSession();
method public boolean isBasicChannel();
method public boolean isClosed();
method public boolean isOpen();
method public boolean selectNext() throws java.io.IOException;
method public byte[] transmit(byte[]) throws java.io.IOException;
}
public class Reader {
public final class Reader {
method public void closeSessions();
method public java.lang.String getName();
method public android.se.omapi.SEService getSEService();
@@ -37029,26 +37029,28 @@ package android.se.omapi {
method public android.se.omapi.Session openSession() throws java.io.IOException;
}
public class SEService {
ctor public SEService(android.content.Context, android.se.omapi.SEService.SecureElementListener);
public final class SEService {
ctor public SEService(android.content.Context, android.se.omapi.SEService.OnConnectedListener);
method public android.se.omapi.Reader[] getReaders();
method public java.lang.String getVersion();
method public boolean isConnected();
method public void shutdown();
}
public static abstract interface SEService.SecureElementListener {
public static abstract interface SEService.OnConnectedListener {
method public abstract void onServiceConnected();
}
public class Session {
public final class Session {
method public void close();
method public void closeChannels();
method public byte[] getATR();
method public android.se.omapi.Reader getReader();
method public boolean isClosed();
method public android.se.omapi.Channel openBasicChannel(byte[], byte) throws java.io.IOException;
method public android.se.omapi.Channel openBasicChannel(byte[]) throws java.io.IOException;
method public android.se.omapi.Channel openLogicalChannel(byte[], byte) throws java.io.IOException;
method public android.se.omapi.Channel openLogicalChannel(byte[]) throws java.io.IOException;
}
}

View File

@@ -39,7 +39,7 @@ import java.io.IOException;
*
* @see <a href="http://globalplatform.org">GlobalPlatform Open Mobile API</a>
*/
public class Channel {
public final class Channel implements java.nio.channels.Channel {
private static final String TAG = "OMAPI.Channel";
private Session mSession;
@@ -64,7 +64,7 @@ public class Channel {
* before closing the channel.
*/
public void close() {
if (!isClosed()) {
if (isOpen()) {
synchronized (mLock) {
try {
mChannel.close();
@@ -76,21 +76,21 @@ public class Channel {
}
/**
* Tells if this channel is closed.
* Tells if this channel is open.
*
* @return <code>true</code> if the channel is closed or in case of an error.
* <code>false</code> otherwise.
* @return <code>false</code> if the channel is closed or in case of an error.
* <code>true</code> otherwise.
*/
public boolean isClosed() {
public boolean isOpen() {
if (!mService.isConnected()) {
Log.e(TAG, "service not connected to system");
return true;
return false;
}
try {
return mChannel.isClosed();
return !mChannel.isClosed();
} catch (RemoteException e) {
Log.e(TAG, "Exception in isClosed()");
return true;
return false;
}
}

View File

@@ -37,7 +37,7 @@ import java.io.IOException;
*
* @see <a href="http://globalplatform.org">GlobalPlatform Open Mobile API</a>
*/
public class Reader {
public final class Reader {
private static final String TAG = "OMAPI.Reader";
private final String mName;

View File

@@ -40,7 +40,7 @@ import java.util.HashMap;
*
* @see <a href="http://simalliance.org">SIMalliance Open Mobile API v3.0</a>
*/
public class SEService {
public final class SEService {
/**
* Error code used with ServiceSpecificException.
@@ -62,7 +62,7 @@ public class SEService {
/**
* Interface to send call-backs to the application when the service is connected.
*/
public interface SecureElementListener {
public interface OnConnectedListener {
/**
* Called by the framework when the service is connected.
*/
@@ -74,7 +74,7 @@ public class SEService {
* SEService could be bound to the backend.
*/
private class SEListener extends ISecureElementListener.Stub {
public SecureElementListener mListener = null;
public OnConnectedListener mListener = null;
@Override
public IBinder asBinder() {
@@ -122,9 +122,9 @@ public class SEService {
* the context of the calling application. Cannot be
* <code>null</code>.
* @param listener
* a SecureElementListener object.
* a OnConnectedListener object.
*/
public SEService(@NonNull Context context, @NonNull SecureElementListener listener) {
public SEService(@NonNull Context context, @NonNull OnConnectedListener listener) {
if (context == null) {
throw new NullPointerException("context must not be null");
@@ -171,12 +171,12 @@ public class SEService {
}
/**
* Returns the list of available Secure Element readers.
* Returns an array of available Secure Element readers.
* There must be no duplicated objects in the returned list.
* All available readers shall be listed even if no card is inserted.
*
* @return The readers list, as an array of Readers. If there are no
* readers the returned array is of length 0.
* @return An array of Readers. If there are no readers the returned array
* is of length 0.
*/
public @NonNull Reader[] getReaders() {
if (mSecureElementService == null) {
@@ -212,7 +212,8 @@ public class SEService {
* (including any binding to an underlying service).
* As a result isConnected() will return false after shutdown() was called.
* After this method call, the SEService object is not connected.
* It is recommended to call this method in the termination method of the calling application
* This method should be called when connection to the Secure Element is not needed
* or in the termination method of the calling application
* (or part of this application) which is bound to this SEService.
*/
public void shutdown() {

View File

@@ -39,7 +39,7 @@ import java.util.NoSuchElementException;
*
* @see <a href="http://simalliance.org">SIMalliance Open Mobile API v3.0</a>
*/
public class Session {
public final class Session {
private final Object mLock = new Object();
private final SEService mService;
@@ -224,6 +224,32 @@ public class Session {
}
}
/**
* This method is provided to ease the development of mobile application and for compliancy
* with existing applications.
* This method is equivalent to openBasicChannel(aid, P2=0x00)
*
* @param aid the AID of the Applet to be selected on this channel, as a
* byte array, or null if no Applet is to be selected.
* @throws IOException if there is a communication problem to the reader or
* the Secure Element.
* @throws IllegalStateException if the Secure Element session is used after
* being closed.
* @throws IllegalArgumentException if the aid's length is not within 5 to
* 16 (inclusive).
* @throws SecurityException if the calling application cannot be granted
* access to this AID or the default Applet on this
* session.
* @throws NoSuchElementException if the AID on the Secure Element is not available or cannot be
* selected.
* @throws UnsupportedOperationException if the given P2 parameter is not
* supported by the device
* @return an instance of Channel if available or null.
*/
public @Nullable Channel openBasicChannel(@Nullable byte[] aid) throws IOException {
return openBasicChannel(aid, (byte) 0x00);
}
/**
* Open a logical channel with the Secure Element, selecting the Applet represented by
* the given AID. If the AID is null, which means no Applet is to be selected on this
@@ -304,4 +330,32 @@ public class Session {
}
}
}
/**
* This method is provided to ease the development of mobile application and for compliancy
* with existing applications.
* This method is equivalent to openLogicalChannel(aid, P2=0x00)
*
* @param aid the AID of the Applet to be selected on this channel, as a
* byte array.
* @throws IOException if there is a communication problem to the reader or
* the Secure Element.
* @throws IllegalStateException if the Secure Element is used after being
* closed.
* @throws IllegalArgumentException if the aid's length is not within 5 to
* 16 (inclusive).
* @throws SecurityException if the calling application cannot be granted
* access to this AID or the default Applet on this
* session.
* @throws NoSuchElementException if the AID on the Secure Element is not
* available or cannot be selected or a logical channel is already
* open to a non-multiselectable Applet.
* @throws UnsupportedOperationException if the given P2 parameter is not
* supported by the device.
* @return an instance of Channel. Null if the Secure Element is unable to
* provide a new logical channel.
*/
public @Nullable Channel openLogicalChannel(@Nullable byte[] aid) throws IOException {
return openLogicalChannel(aid, (byte) 0x00);
}
}