| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * Communicate with secure elements that are attached to the NFC |
| * controller. |
| */ |
| #pragma once |
| #include "SyncEvent.h" |
| #include "DataQueue.h" |
| #include "NfcJniUtil.h" |
| #include "RouteDataSet.h" |
| extern "C" |
| { |
| #include "nfa_ee_api.h" |
| #include "nfa_hci_api.h" |
| #include "nfa_hci_defs.h" |
| #include "nfa_ce_api.h" |
| } |
| |
| |
| class SecureElement |
| { |
| public: |
| tNFA_HANDLE mActiveEeHandle; |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: getInstance |
| ** |
| ** Description: Get the SecureElement singleton object. |
| ** |
| ** Returns: SecureElement object. |
| ** |
| *******************************************************************************/ |
| static SecureElement& getInstance (); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: initialize |
| ** |
| ** Description: Initialize all member variables. |
| ** native: Native data. |
| ** |
| ** Returns: True if ok. |
| ** |
| *******************************************************************************/ |
| bool initialize (nfc_jni_native_data* native); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: finalize |
| ** |
| ** Description: Release all resources. |
| ** |
| ** Returns: None |
| ** |
| *******************************************************************************/ |
| void finalize (); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: getListOfEeHandles |
| ** |
| ** Description: Get the list of handles of all execution environments. |
| ** e: Java Virtual Machine. |
| ** |
| ** Returns: List of handles of all execution environments. |
| ** |
| *******************************************************************************/ |
| jintArray getListOfEeHandles (JNIEnv* e); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: activate |
| ** |
| ** Description: Turn on the secure element. |
| ** seID: ID of secure element. |
| ** |
| ** Returns: True if ok. |
| ** |
| *******************************************************************************/ |
| bool activate (jint seID); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: deactivate |
| ** |
| ** Description: Turn off the secure element. |
| ** seID: ID of secure element. |
| ** |
| ** Returns: True if ok. |
| ** |
| *******************************************************************************/ |
| bool deactivate (jint seID); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: connectEE |
| ** |
| ** Description: Connect to the execution environment. |
| ** |
| ** Returns: True if ok. |
| ** |
| *******************************************************************************/ |
| bool connectEE (); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: disconnectEE |
| ** |
| ** Description: Disconnect from the execution environment. |
| ** seID: ID of secure element. |
| ** |
| ** Returns: True if ok. |
| ** |
| *******************************************************************************/ |
| bool disconnectEE (jint seID); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: transceive |
| ** |
| ** Description: Send data to the secure element; read it's response. |
| ** xmitBuffer: Data to transmit. |
| ** xmitBufferSize: Length of data. |
| ** recvBuffer: Buffer to receive response. |
| ** recvBufferMaxSize: Maximum size of buffer. |
| ** recvBufferActualSize: Actual length of response. |
| ** timeoutMillisec: timeout in millisecond |
| ** |
| ** Returns: True if ok. |
| ** |
| *******************************************************************************/ |
| bool transceive (UINT8* xmitBuffer, INT32 xmitBufferSize, UINT8* recvBuffer, |
| INT32 recvBufferMaxSize, INT32& recvBufferActualSize, INT32 timeoutMillisec); |
| |
| /******************************************************************************* |
| ** |
| ** Function: notifyListenModeState |
| ** |
| ** Description: Notify the NFC service about whether the SE was activated |
| ** in listen mode. |
| ** isActive: Whether the secure element is activated. |
| ** |
| ** Returns: None |
| ** |
| *******************************************************************************/ |
| void notifyListenModeState (bool isActivated); |
| |
| /******************************************************************************* |
| ** |
| ** Function: notifyRfFieldEvent |
| ** |
| ** Description: Notify the NFC service about RF field events from the stack. |
| ** isActive: Whether any secure element is activated. |
| ** |
| ** Returns: None |
| ** |
| *******************************************************************************/ |
| void notifyRfFieldEvent (bool isActive); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: storeUiccInfo |
| ** |
| ** Description: Store a copy of the execution environment information from the stack. |
| ** info: execution environment information. |
| ** |
| ** Returns: None |
| ** |
| *******************************************************************************/ |
| void storeUiccInfo (tNFA_EE_DISCOVER_REQ& info); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: getUiccId |
| ** |
| ** Description: Get the ID of the secure element. |
| ** eeHandle: Handle to the secure element. |
| ** uid: Array to receive the ID. |
| ** |
| ** Returns: True if ok. |
| ** |
| *******************************************************************************/ |
| bool getUiccId (tNFA_HANDLE eeHandle, jbyteArray& uid); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: getTechnologyList |
| ** |
| ** Description: Get all the technologies supported by a secure element. |
| ** eeHandle: Handle of secure element. |
| ** techList: List to receive the technologies. |
| ** |
| ** Returns: True if ok. |
| ** |
| *******************************************************************************/ |
| bool getTechnologyList (tNFA_HANDLE eeHandle, jintArray& techList); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: notifyTransactionListenersOfAid |
| ** |
| ** Description: Notify the NFC service about a transaction event from secure element. |
| ** aid: Buffer contains application ID. |
| ** aidLen: Length of application ID. |
| ** |
| ** Returns: None |
| ** |
| *******************************************************************************/ |
| void notifyTransactionListenersOfAid (const UINT8* aid, UINT8 aidLen); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: notifyTransactionListenersOfTlv |
| ** |
| ** Description: Notify the NFC service about a transaction event from secure element. |
| ** The type-length-value contains AID and parameter. |
| ** tlv: type-length-value encoded in Basic Encoding Rule. |
| ** tlvLen: Length tlv. |
| ** |
| ** Returns: None |
| ** |
| *******************************************************************************/ |
| void notifyTransactionListenersOfTlv (const UINT8* tlv, UINT8 tlvLen); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: connectionEventHandler |
| ** |
| ** Description: Receive card-emulation related events from stack. |
| ** event: Event code. |
| ** eventData: Event data. |
| ** |
| ** Returns: None |
| ** |
| *******************************************************************************/ |
| void connectionEventHandler (UINT8 event, tNFA_CONN_EVT_DATA* eventData); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: applyRoutes |
| ** |
| ** Description: Read route data from XML and apply them again |
| ** to every secure element. |
| ** |
| ** Returns: None |
| ** |
| *******************************************************************************/ |
| void applyRoutes (); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: setActiveSeOverride |
| ** |
| ** Description: Specify which secure element to turn on. |
| ** activeSeOverride: ID of secure element |
| ** |
| ** Returns: None |
| ** |
| *******************************************************************************/ |
| void setActiveSeOverride (UINT8 activeSeOverride); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: routeToSecureElement |
| ** |
| ** Description: Adjust controller's listen-mode routing table so transactions |
| ** are routed to the secure elements as specified in route.xml. |
| ** |
| ** Returns: True if ok. |
| ** |
| *******************************************************************************/ |
| bool routeToSecureElement (); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: routeToDefault |
| ** |
| ** Description: Adjust controller's listen-mode routing table so transactions |
| ** are routed to the default destination specified in route.xml. |
| ** |
| ** Returns: True if ok. |
| ** |
| *******************************************************************************/ |
| bool routeToDefault (); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: isBusy |
| ** |
| ** Description: Whether NFC controller is routing listen-mode events or a pipe is connected. |
| ** |
| ** Returns: True if either case is true. |
| ** |
| *******************************************************************************/ |
| bool isBusy (); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function getActualNumEe |
| ** |
| ** Description Returns number of secure elements we know about. |
| ** |
| ** Returns Number of secure elements we know about. |
| ** |
| *******************************************************************************/ |
| UINT8 getActualNumEe(); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function getSeVerInfo |
| ** |
| ** Description Gets version information and id for a secure element. The |
| ** seIndex parmeter is the zero based index of the secure |
| ** element to get verion info for. The version infommation |
| ** is returned as a string int the verInfo parameter. |
| ** |
| ** Returns ture on success, false on failure |
| ** |
| *******************************************************************************/ |
| bool getSeVerInfo(int seIndex, char * verInfo, int verInfoSz, UINT8 * seid); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: isActivatedInListenMode |
| ** |
| ** Description: Can be used to determine if the SE is activated in listen mode |
| ** |
| ** Returns: True if the SE is activated in listen mode |
| ** |
| *******************************************************************************/ |
| bool isActivatedInListenMode(); |
| |
| /******************************************************************************* |
| ** |
| ** Function: isRfFieldOn |
| ** |
| ** Description: Can be used to determine if the SE is in an RF field |
| ** |
| ** Returns: True if the SE is activated in an RF field |
| ** |
| *******************************************************************************/ |
| bool isRfFieldOn(); |
| |
| private: |
| static const unsigned int MAX_RESPONSE_SIZE = 1024; |
| enum RouteSelection {NoRoute, DefaultRoute, SecElemRoute}; |
| static const int MAX_NUM_EE = 5; //max number of EE's |
| static const UINT8 STATIC_PIPE_0x70 = 0x70; //Broadcom's proprietary static pipe |
| static const UINT8 STATIC_PIPE_0x71 = 0x71; //Broadcom's proprietary static pipe |
| static const UINT8 EVT_SEND_DATA = 0x10; //see specification ETSI TS 102 622 v9.0.0 (Host Controller Interface); section 9.3.3.3 |
| static const tNFA_HANDLE EE_HANDLE_0xF3 = 0x4F3; //handle to secure element in slot 0 |
| static const tNFA_HANDLE EE_HANDLE_0xF4 = 0x4F4; //handle to secure element in slot 1 |
| static SecureElement sSecElem; |
| static const char* APP_NAME; |
| |
| UINT8 mDestinationGate; //destination gate of the UICC |
| tNFA_HANDLE mNfaHciHandle; //NFA handle to NFA's HCI component |
| nfc_jni_native_data* mNativeData; |
| bool mIsInit; // whether EE is initialized |
| UINT8 mActualNumEe; // actual number of EE's reported by the stack |
| UINT8 mNumEePresent; // actual number of usable EE's |
| bool mbNewEE; |
| UINT8 mNewPipeId; |
| UINT8 mNewSourceGate; |
| UINT16 mActiveSeOverride; // active "enable" seid, 0 means activate all SEs |
| tNFA_STATUS mCommandStatus; //completion status of the last command |
| bool mIsPiping; //is a pipe connected to the controller? |
| RouteSelection mCurrentRouteSelection; |
| int mActualResponseSize; //number of bytes in the response received from secure element |
| bool mUseOberthurWarmReset; //whether to use warm-reset command |
| bool mActivatedInListenMode; // whether we're activated in listen mode |
| UINT8 mOberthurWarmResetCommand; //warm-reset command byte |
| tNFA_EE_INFO mEeInfo [MAX_NUM_EE]; //actual size stored in mActualNumEe |
| tNFA_EE_DISCOVER_REQ mUiccInfo; |
| tNFA_HCI_GET_GATE_PIPE_LIST mHciCfg; |
| SyncEvent mEeRegisterEvent; |
| SyncEvent mHciRegisterEvent; |
| SyncEvent mEeSetModeEvent; |
| SyncEvent mPipeListEvent; |
| SyncEvent mCreatePipeEvent; |
| SyncEvent mPipeOpenedEvent; |
| SyncEvent mAllocateGateEvent; |
| SyncEvent mDeallocateGateEvent; |
| SyncEvent mRoutingEvent; |
| SyncEvent mUiccInfoEvent; |
| SyncEvent mUiccListenEvent; |
| SyncEvent mAidAddRemoveEvent; |
| SyncEvent mTransceiveEvent; |
| SyncEvent mVerInfoEvent; |
| SyncEvent mRegistryEvent; |
| UINT8 mVerInfo [3]; |
| UINT8 mResponseData [MAX_RESPONSE_SIZE]; |
| RouteDataSet mRouteDataSet; //routing data |
| std::vector<std::string> mUsedAids; //AID's that are used in current routes |
| UINT8 mAidForEmptySelect[NCI_MAX_AID_LEN+1]; |
| Mutex mMutex; // protects fields below |
| bool mRfFieldIsOn; // last known RF field state |
| struct timespec mLastRfFieldToggle; // last time RF field went off |
| /******************************************************************************* |
| ** |
| ** Function: SecureElement |
| ** |
| ** Description: Initialize member variables. |
| ** |
| ** Returns: None |
| ** |
| *******************************************************************************/ |
| SecureElement (); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: ~SecureElement |
| ** |
| ** Description: Release all resources. |
| ** |
| ** Returns: None |
| ** |
| *******************************************************************************/ |
| ~SecureElement (); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: nfaEeCallback |
| ** |
| ** Description: Receive execution environment-related events from stack. |
| ** event: Event code. |
| ** eventData: Event data. |
| ** |
| ** Returns: None |
| ** |
| *******************************************************************************/ |
| static void nfaEeCallback (tNFA_EE_EVT event, tNFA_EE_CBACK_DATA* eventData); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: nfaHciCallback |
| ** |
| ** Description: Receive Host Controller Interface-related events from stack. |
| ** event: Event code. |
| ** eventData: Event data. |
| ** |
| ** Returns: None |
| ** |
| *******************************************************************************/ |
| static void nfaHciCallback (tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA* eventData); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: findEeByHandle |
| ** |
| ** Description: Find information about an execution environment. |
| ** eeHandle: Handle to execution environment. |
| ** |
| ** Returns: Information about an execution environment. |
| ** |
| *******************************************************************************/ |
| tNFA_EE_INFO *findEeByHandle (tNFA_HANDLE eeHandle); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: findUiccByHandle |
| ** |
| ** Description: Find information about an execution environment. |
| ** eeHandle: Handle of the execution environment. |
| ** |
| ** Returns: Information about the execution environment. |
| ** |
| *******************************************************************************/ |
| tNFA_EE_DISCOVER_INFO *findUiccByHandle (tNFA_HANDLE eeHandle); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: getDefaultEeHandle |
| ** |
| ** Description: Get the handle to the execution environment. |
| ** |
| ** Returns: Handle to the execution environment. |
| ** |
| *******************************************************************************/ |
| tNFA_HANDLE getDefaultEeHandle (); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: adjustRoutes |
| ** |
| ** Description: Adjust routes in the controller's listen-mode routing table. |
| ** selection: which set of routes to configure the controller. |
| ** |
| ** Returns: None |
| ** |
| *******************************************************************************/ |
| void adjustRoutes (RouteSelection selection); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: adjustProtocolRoutes |
| ** |
| ** Description: Adjust default routing based on protocol in NFC listen mode. |
| ** isRouteToEe: Whether routing to EE (true) or host (false). |
| ** |
| ** Returns: None |
| ** |
| *******************************************************************************/ |
| void adjustProtocolRoutes (RouteDataSet::Database* db, RouteSelection routeSelection); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: adjustTechnologyRoutes |
| ** |
| ** Description: Adjust default routing based on technology in NFC listen mode. |
| ** isRouteToEe: Whether routing to EE (true) or host (false). |
| ** |
| ** Returns: None |
| ** |
| *******************************************************************************/ |
| void adjustTechnologyRoutes (RouteDataSet::Database* db, RouteSelection routeSelection); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: getEeInfo |
| ** |
| ** Description: Get latest information about execution environments from stack. |
| ** |
| ** Returns: True if at least 1 EE is available. |
| ** |
| *******************************************************************************/ |
| bool getEeInfo (); |
| |
| /******************************************************************************* |
| ** |
| ** Function: eeStatusToString |
| ** |
| ** Description: Convert status code to status text. |
| ** status: Status code |
| ** |
| ** Returns: None |
| ** |
| *******************************************************************************/ |
| static const char* eeStatusToString (UINT8 status); |
| |
| |
| /******************************************************************************* |
| ** |
| ** Function: encodeAid |
| ** |
| ** Description: Encode AID in type-length-value using Basic Encoding Rule. |
| ** tlv: Buffer to store TLV. |
| ** tlvMaxLen: TLV buffer's maximum length. |
| ** tlvActualLen: TLV buffer's actual length. |
| ** aid: Buffer of Application ID. |
| ** aidLen: Aid buffer's actual length. |
| ** |
| ** Returns: True if ok. |
| ** |
| *******************************************************************************/ |
| bool encodeAid (UINT8* tlv, UINT16 tlvMaxLen, UINT16& tlvActualLen, const UINT8* aid, UINT8 aidLen); |
| }; |
| |