• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /*
18  *  Communicate with secure elements that are attached to the NFC
19  *  controller.
20  */
21 #pragma once
22 #include "SyncEvent.h"
23 #include "DataQueue.h"
24 #include "NfcJniUtil.h"
25 #include "RouteDataSet.h"
26 extern "C"
27 {
28     #include "nfa_ee_api.h"
29     #include "nfa_hci_api.h"
30     #include "nfa_hci_defs.h"
31     #include "nfa_ce_api.h"
32 }
33 
34 
35 class SecureElement
36 {
37 public:
38     tNFA_HANDLE  mActiveEeHandle;
39 
40 
41     /*******************************************************************************
42     **
43     ** Function:        getInstance
44     **
45     ** Description:     Get the SecureElement singleton object.
46     **
47     ** Returns:         SecureElement object.
48     **
49     *******************************************************************************/
50     static SecureElement& getInstance ();
51 
52 
53     /*******************************************************************************
54     **
55     ** Function:        initialize
56     **
57     ** Description:     Initialize all member variables.
58     **                  native: Native data.
59     **
60     ** Returns:         True if ok.
61     **
62     *******************************************************************************/
63     bool initialize (nfc_jni_native_data* native);
64 
65 
66     /*******************************************************************************
67     **
68     ** Function:        finalize
69     **
70     ** Description:     Release all resources.
71     **
72     ** Returns:         None
73     **
74     *******************************************************************************/
75     void finalize ();
76 
77 
78     /*******************************************************************************
79     **
80     ** Function:        getSecureElementIdList
81     **
82     ** Description:     Get a list of ID's of all secure elements.
83     **                  e: Java Virtual Machine.
84     **
85     ** Returns:         List of ID's.
86     **
87     *******************************************************************************/
88     jintArray getSecureElementIdList (JNIEnv* e);
89 
90 
91     /*******************************************************************************
92     **
93     ** Function:        activate
94     **
95     ** Description:     Turn on the secure element.
96     **                  seID: ID of secure element.
97     **
98     ** Returns:         True if ok.
99     **
100     *******************************************************************************/
101     bool activate (jint seID);
102 
103 
104     /*******************************************************************************
105     **
106     ** Function:        deactivate
107     **
108     ** Description:     Turn off the secure element.
109     **                  seID: ID of secure element.
110     **
111     ** Returns:         True if ok.
112     **
113     *******************************************************************************/
114     bool deactivate (jint seID);
115 
116 
117     /*******************************************************************************
118     **
119     ** Function:        connectEE
120     **
121     ** Description:     Connect to the execution environment.
122     **
123     ** Returns:         True if ok.
124     **
125     *******************************************************************************/
126     bool connectEE ();
127 
128 
129     /*******************************************************************************
130     **
131     ** Function:        disconnectEE
132     **
133     ** Description:     Disconnect from the execution environment.
134     **                  seID: ID of secure element.
135     **
136     ** Returns:         True if ok.
137     **
138     *******************************************************************************/
139     bool disconnectEE (jint seID);
140 
141 
142     /*******************************************************************************
143     **
144     ** Function:        transceive
145     **
146     ** Description:     Send data to the secure element; read it's response.
147     **                  xmitBuffer: Data to transmit.
148     **                  xmitBufferSize: Length of data.
149     **                  recvBuffer: Buffer to receive response.
150     **                  recvBufferMaxSize: Maximum size of buffer.
151     **                  recvBufferActualSize: Actual length of response.
152     **                  timeoutMillisec: timeout in millisecond
153     **
154     ** Returns:         True if ok.
155     **
156     *******************************************************************************/
157     bool transceive (UINT8* xmitBuffer, INT32 xmitBufferSize, UINT8* recvBuffer,
158                      INT32 recvBufferMaxSize, INT32& recvBufferActualSize, INT32 timeoutMillisec);
159 
160     void notifyModeSet (tNFA_HANDLE eeHandle, bool success);
161 
162     /*******************************************************************************
163     **
164     ** Function:        notifyListenModeState
165     **
166     ** Description:     Notify the NFC service about whether the SE was activated
167     **                  in listen mode.
168     **                  isActive: Whether the secure element is activated.
169     **
170     ** Returns:         None
171     **
172     *******************************************************************************/
173     void notifyListenModeState (bool isActivated);
174 
175     /*******************************************************************************
176     **
177     ** Function:        notifyRfFieldEvent
178     **
179     ** Description:     Notify the NFC service about RF field events from the stack.
180     **                  isActive: Whether any secure element is activated.
181     **
182     ** Returns:         None
183     **
184     *******************************************************************************/
185     void notifyRfFieldEvent (bool isActive);
186 
187 
188     /*******************************************************************************
189     **
190     ** Function:        resetRfFieldStatus ();
191     **
192     ** Description:     Resets the field status.
193     **
194     ** Returns:         None
195     **
196     *******************************************************************************/
197     void resetRfFieldStatus ();
198 
199     /*******************************************************************************
200     **
201     ** Function:        storeUiccInfo
202     **
203     ** Description:     Store a copy of the execution environment information from the stack.
204     **                  info: execution environment information.
205     **
206     ** Returns:         None
207     **
208     *******************************************************************************/
209     void storeUiccInfo (tNFA_EE_DISCOVER_REQ& info);
210 
211 
212     /*******************************************************************************
213     **
214     ** Function:        getUiccId
215     **
216     ** Description:     Get the ID of the secure element.
217     **                  eeHandle: Handle to the secure element.
218     **                  uid: Array to receive the ID.
219     **
220     ** Returns:         True if ok.
221     **
222     *******************************************************************************/
223     bool getUiccId (tNFA_HANDLE eeHandle, jbyteArray& uid);
224 
225 
226     /*******************************************************************************
227     **
228     ** Function:        getTechnologyList
229     **
230     ** Description:     Get all the technologies supported by a secure element.
231     **                  eeHandle: Handle of secure element.
232     **                  techList: List to receive the technologies.
233     **
234     ** Returns:         True if ok.
235     **
236     *******************************************************************************/
237     bool getTechnologyList (tNFA_HANDLE eeHandle, jintArray& techList);
238 
239 
240     /*******************************************************************************
241     **
242     ** Function:        notifyTransactionListenersOfAid
243     **
244     ** Description:     Notify the NFC service about a transaction event from secure element.
245     **                  aid: Buffer contains application ID.
246     **                  aidLen: Length of application ID.
247     **
248     ** Returns:         None
249     **
250     *******************************************************************************/
251     void notifyTransactionListenersOfAid (const UINT8* aid, UINT8 aidLen);
252 
253 
254     /*******************************************************************************
255     **
256     ** Function:        notifyTransactionListenersOfTlv
257     **
258     ** Description:     Notify the NFC service about a transaction event from secure element.
259     **                  The type-length-value contains AID and parameter.
260     **                  tlv: type-length-value encoded in Basic Encoding Rule.
261     **                  tlvLen: Length tlv.
262     **
263     ** Returns:         None
264     **
265     *******************************************************************************/
266     void notifyTransactionListenersOfTlv (const UINT8* tlv, UINT8 tlvLen);
267 
268 
269     /*******************************************************************************
270     **
271     ** Function:        connectionEventHandler
272     **
273     ** Description:     Receive card-emulation related events from stack.
274     **                  event: Event code.
275     **                  eventData: Event data.
276     **
277     ** Returns:         None
278     **
279     *******************************************************************************/
280     void connectionEventHandler (UINT8 event, tNFA_CONN_EVT_DATA* eventData);
281 
282 
283     /*******************************************************************************
284     **
285     ** Function:        applyRoutes
286     **
287     ** Description:     Read route data from XML and apply them again
288     **                  to every secure element.
289     **
290     ** Returns:         None
291     **
292     *******************************************************************************/
293     void applyRoutes ();
294 
295 
296     /*******************************************************************************
297     **
298     ** Function:        setActiveSeOverride
299     **
300     ** Description:     Specify which secure element to turn on.
301     **                  activeSeOverride: ID of secure element
302     **
303     ** Returns:         None
304     **
305     *******************************************************************************/
306     void setActiveSeOverride (UINT8 activeSeOverride);
307 
308 
309     /*******************************************************************************
310     **
311     ** Function:        isBusy
312     **
313     ** Description:     Whether NFC controller is routing listen-mode events or a pipe is connected.
314     **
315     ** Returns:         True if either case is true.
316     **
317     *******************************************************************************/
318     bool isBusy ();
319 
320 
321     /*******************************************************************************
322     **
323     ** Function         getActualNumEe
324     **
325     ** Description      Returns number of secure elements we know about.
326     **
327     ** Returns          Number of secure elements we know about.
328     **
329     *******************************************************************************/
330     UINT8 getActualNumEe();
331 
332 
333     /*******************************************************************************
334     **
335     ** Function         getSeVerInfo
336     **
337     ** Description      Gets version information and id for a secure element.  The
338     **                  seIndex parmeter is the zero based index of the secure
339     **                  element to get verion info for.  The version infommation
340     **                  is returned as a string int the verInfo parameter.
341     **
342     ** Returns          ture on success, false on failure
343     **
344     *******************************************************************************/
345     bool getSeVerInfo(int seIndex, char * verInfo, int verInfoSz, UINT8 * seid);
346 
347 
348     /*******************************************************************************
349     **
350     ** Function:        isActivatedInListenMode
351     **
352     ** Description:     Can be used to determine if the SE is activated in listen mode
353     **
354     ** Returns:         True if the SE is activated in listen mode
355     **
356     *******************************************************************************/
357     bool isActivatedInListenMode();
358 
359     /*******************************************************************************
360     **
361     ** Function:        isRfFieldOn
362     **
363     ** Description:     Can be used to determine if the SE is in an RF field
364     **
365     ** Returns:         True if the SE is activated in an RF field
366     **
367     *******************************************************************************/
368     bool isRfFieldOn();
369 
370 private:
371     static const unsigned int MAX_RESPONSE_SIZE = 1024;
372     enum RouteSelection {NoRoute, DefaultRoute, SecElemRoute};
373     static const int MAX_NUM_EE = 5;    //max number of EE's
374     static const UINT8 STATIC_PIPE_0x70 = 0x70; //Broadcom's proprietary static pipe
375     static const UINT8 STATIC_PIPE_0x71 = 0x71; //Broadcom's proprietary static pipe
376     static const UINT8 EVT_SEND_DATA = 0x10;    //see specification ETSI TS 102 622 v9.0.0 (Host Controller Interface); section 9.3.3.3
377     static const tNFA_HANDLE EE_HANDLE_0xF3 = 0x4F3; //handle to secure element in slot 0
378     static const tNFA_HANDLE EE_HANDLE_0xF4 = 0x4F4; //handle to secure element in slot 1
379     static SecureElement sSecElem;
380     static const char* APP_NAME;
381 
382     UINT8           mDestinationGate;       //destination gate of the UICC
383     tNFA_HANDLE     mNfaHciHandle;          //NFA handle to NFA's HCI component
384     nfc_jni_native_data* mNativeData;
385     bool    mIsInit;                // whether EE is initialized
386     UINT8   mActualNumEe;           // actual number of EE's reported by the stack
387     UINT8   mNumEePresent;          // actual number of usable EE's
388     bool    mbNewEE;
389     UINT8   mNewPipeId;
390     UINT8   mNewSourceGate;
391     UINT16  mActiveSeOverride;      // active "enable" seid, 0 means activate all SEs
392     tNFA_STATUS mCommandStatus;     //completion status of the last command
393     bool    mIsPiping;              //is a pipe connected to the controller?
394     RouteSelection mCurrentRouteSelection;
395     int     mActualResponseSize;         //number of bytes in the response received from secure element
396     bool    mUseOberthurWarmReset;  //whether to use warm-reset command
397     bool    mActivatedInListenMode; // whether we're activated in listen mode
398     UINT8   mOberthurWarmResetCommand; //warm-reset command byte
399     tNFA_EE_INFO mEeInfo [MAX_NUM_EE];  //actual size stored in mActualNumEe
400     tNFA_EE_DISCOVER_REQ mUiccInfo;
401     tNFA_HCI_GET_GATE_PIPE_LIST mHciCfg;
402     SyncEvent       mEeRegisterEvent;
403     SyncEvent       mHciRegisterEvent;
404     SyncEvent       mEeSetModeEvent;
405     SyncEvent       mPipeListEvent;
406     SyncEvent       mCreatePipeEvent;
407     SyncEvent       mPipeOpenedEvent;
408     SyncEvent       mAllocateGateEvent;
409     SyncEvent       mDeallocateGateEvent;
410     SyncEvent       mRoutingEvent;
411     SyncEvent       mUiccInfoEvent;
412     SyncEvent       mUiccListenEvent;
413     SyncEvent       mAidAddRemoveEvent;
414     SyncEvent       mTransceiveEvent;
415     SyncEvent       mVerInfoEvent;
416     SyncEvent       mRegistryEvent;
417     UINT8           mVerInfo [3];
418     UINT8           mResponseData [MAX_RESPONSE_SIZE];
419     RouteDataSet    mRouteDataSet; //routing data
420     std::vector<std::string> mUsedAids; //AID's that are used in current routes
421     UINT8           mAidForEmptySelect[NCI_MAX_AID_LEN+1];
422     Mutex           mMutex; // protects fields below
423     bool            mRfFieldIsOn; // last known RF field state
424     struct timespec mLastRfFieldToggle; // last time RF field went off
425     /*******************************************************************************
426     **
427     ** Function:        SecureElement
428     **
429     ** Description:     Initialize member variables.
430     **
431     ** Returns:         None
432     **
433     *******************************************************************************/
434     SecureElement ();
435 
436 
437     /*******************************************************************************
438     **
439     ** Function:        ~SecureElement
440     **
441     ** Description:     Release all resources.
442     **
443     ** Returns:         None
444     **
445     *******************************************************************************/
446     ~SecureElement ();
447 
448 
449     /*******************************************************************************
450     **
451     ** Function:        nfaEeCallback
452     **
453     ** Description:     Receive execution environment-related events from stack.
454     **                  event: Event code.
455     **                  eventData: Event data.
456     **
457     ** Returns:         None
458     **
459     *******************************************************************************/
460     static void nfaEeCallback (tNFA_EE_EVT event, tNFA_EE_CBACK_DATA* eventData);
461 
462 
463     /*******************************************************************************
464     **
465     ** Function:        nfaHciCallback
466     **
467     ** Description:     Receive Host Controller Interface-related events from stack.
468     **                  event: Event code.
469     **                  eventData: Event data.
470     **
471     ** Returns:         None
472     **
473     *******************************************************************************/
474     static void nfaHciCallback (tNFA_HCI_EVT event, tNFA_HCI_EVT_DATA* eventData);
475 
476 
477     /*******************************************************************************
478     **
479     ** Function:        findEeByHandle
480     **
481     ** Description:     Find information about an execution environment.
482     **                  eeHandle: Handle to execution environment.
483     **
484     ** Returns:         Information about an execution environment.
485     **
486     *******************************************************************************/
487     tNFA_EE_INFO *findEeByHandle (tNFA_HANDLE eeHandle);
488 
489 
490     /*******************************************************************************
491     **
492     ** Function:        findUiccByHandle
493     **
494     ** Description:     Find information about an execution environment.
495     **                  eeHandle: Handle of the execution environment.
496     **
497     ** Returns:         Information about the execution environment.
498     **
499     *******************************************************************************/
500     tNFA_EE_DISCOVER_INFO *findUiccByHandle (tNFA_HANDLE eeHandle);
501 
502 
503     /*******************************************************************************
504     **
505     ** Function:        getDefaultEeHandle
506     **
507     ** Description:     Get the handle to the execution environment.
508     **
509     ** Returns:         Handle to the execution environment.
510     **
511     *******************************************************************************/
512     tNFA_HANDLE getDefaultEeHandle ();
513 
514 
515     /*******************************************************************************
516     **
517     ** Function:        adjustRoutes
518     **
519     ** Description:     Adjust routes in the controller's listen-mode routing table.
520     **                  selection: which set of routes to configure the controller.
521     **
522     ** Returns:         None
523     **
524     *******************************************************************************/
525     void adjustRoutes (RouteSelection selection);
526 
527 
528     /*******************************************************************************
529     **
530     ** Function:        adjustProtocolRoutes
531     **
532     ** Description:     Adjust default routing based on protocol in NFC listen mode.
533     **                  isRouteToEe: Whether routing to EE (true) or host (false).
534     **
535     ** Returns:         None
536     **
537     *******************************************************************************/
538     void adjustProtocolRoutes (RouteDataSet::Database* db, RouteSelection routeSelection);
539 
540 
541     /*******************************************************************************
542     **
543     ** Function:        adjustTechnologyRoutes
544     **
545     ** Description:     Adjust default routing based on technology in NFC listen mode.
546     **                  isRouteToEe: Whether routing to EE (true) or host (false).
547     **
548     ** Returns:         None
549     **
550     *******************************************************************************/
551     void adjustTechnologyRoutes (RouteDataSet::Database* db, RouteSelection routeSelection);
552 
553 
554     /*******************************************************************************
555     **
556     ** Function:        getEeInfo
557     **
558     ** Description:     Get latest information about execution environments from stack.
559     **
560     ** Returns:         True if at least 1 EE is available.
561     **
562     *******************************************************************************/
563     bool getEeInfo ();
564 
565     /*******************************************************************************
566     **
567     ** Function:        eeStatusToString
568     **
569     ** Description:     Convert status code to status text.
570     **                  status: Status code
571     **
572     ** Returns:         None
573     **
574     *******************************************************************************/
575     static const char* eeStatusToString (UINT8 status);
576 
577 
578     /*******************************************************************************
579     **
580     ** Function:        encodeAid
581     **
582     ** Description:     Encode AID in type-length-value using Basic Encoding Rule.
583     **                  tlv: Buffer to store TLV.
584     **                  tlvMaxLen: TLV buffer's maximum length.
585     **                  tlvActualLen: TLV buffer's actual length.
586     **                  aid: Buffer of Application ID.
587     **                  aidLen: Aid buffer's actual length.
588     **
589     ** Returns:         True if ok.
590     **
591     *******************************************************************************/
592     bool encodeAid (UINT8* tlv, UINT16 tlvMaxLen, UINT16& tlvActualLen, const UINT8* aid, UINT8 aidLen);
593 };
594 
595