2014-11-08 49 views
1

功能方法如Java卡API的2.2文件here提到的,selectingApplet()是用於由小應用程序process()方法區分選擇哪個選擇此applet APDU命令的方法,從所有其他SELECT APDU命令可能與文件或內部小程序狀態選擇有關,並且如果正在選擇此小程序,則返回true。什麼是selectingApplet的()中JAVACARD2.2

我的問題是爲什麼我們需要這種方法?甚至更​​一般:爲什麼選定的applet需要接收SELECT-applet命令?我認爲唯一需要知道的實體SELECT -applet APDU是JCRE

我建議下面的情形:

  1. JCRECAD
  2. 收到APDU命令來檢查,看它是否是一個SELECT APDU命令與否。
  3. 如果它不是SELECT APDU命令,它將接收到的APDU發送到所選Applet的process()方法。並且所選擇的小程序解釋並執行它(使用開關,如果表達式並且不需要使用selectingApplet()方法)
  4. 如果它是SELECT APDU命令,檢查命令的數據字段的長度以查看它是否爲一個選擇文件或它是一個選擇小程序
  5. 如果是SELECT文件命令,JCRE再次發送至被選的applet的process()方法。但是如果它是SELECT applet coomand,JCRE invoke deselet()當前選擇的小程序的方法,然後調用select()方法的新請求的小程序。和接收True後,使其選擇並等待下一個APDU命令(甚至不需要發送先前SELECT-Applet APDU命令到這個新選的applet的process()法)

有什麼不對上述實施?什麼是JC 2.2當前實現的優勢(發送所有接收到的APDU當前選定的小程序的process()方法和selectingApplet()區分不同選擇命令)

我認爲目前的實施提供一個漏洞!如果程序員以其方法將其所有接收到的APDU寫入EEPROM中的方式實施他/她的小應用程序,則他/她可以檢索卡上某些其他安裝的小應用程序的AID。這是正確的嗎?

回答

2

您可以使用SELECT區分默認選擇在ATR(全球平臺選項)之後,通過SELECT進行正常選擇。換句話說,區分是MF還是應用DF。兩種情況下都會調用方法select()

此外,其中P104不同的SELECT可以將(FCI/FCP)數據返回給終端。運行時將不知道該返回什麼,因爲這是特定於應用程序的。

selectingApplet()是非常有用的,因爲您可以立即看到該Applet實際上通過此方法獲得(重新)選擇。如果applet被重新選擇,你可能需要做一些內部的管理,但是你肯定不想返回一個表示錯誤的狀態字。一個錯誤將表明APDU失敗,這與applet被運行時選中的事實不一致。

3

關於你的最後一點:不。
由於APDU是另一個小程序的有效AID,JCRE將識別該事實並且不會將其指向當前小程序,而是取消選擇當前小程序並選擇由AID引用的另一個小程序,並調用selectingApplet()
方法是小程序知道它在中被選中的唯一方法,就是這個當前的 APDU。
例如,它可用於重置某些文件指針或重置Securemessaging和其他身份驗證狀態。

編輯:我指的是默認的小程序模板,即是這樣的:

process(){ 
if(selectingApplet()){ 
return; 
} 

因此,實際上該方法只返回一個布爾值,實際上正常處理的方法調用,但immidiatly終止/成品管他呢。

另一方面,select()方法可以被applet覆蓋,該applet將在第一次被選中時被調用。它們之間沒有什麼重大區別(我知道),除了select之前被調用,並且可以拒絕選擇小應用程序,因此功能更強大(可能對Interapplet通信有用)

+0

你的意思是''chooseApplet()'會調用一次嗎?或者每次_JCRE_收到一個_APDU_時都會調用它? – TheGoodUser 2014-11-09 13:21:06

+0

請參閱上面的編輯 – 2014-11-10 14:25:45