USB CCID "複雜"命令拾零

本文記錄 USB CCID 標準中幾個"複雜"的命令,複雜在於在這些命令身上花的時間較之簡單的命令多許多或者是理解的時間比較晚,可能就是剛纔。
主要有以下幾條:
ccid_T0APDU();
ccid_Secure();
ccid_Escape();
ccid_Abort();
ccid_Mechanical();
ccid_SetDataRateAndClockFrequency();

ccid_T0APDU(): 我們知道,當讀卡器是APDU level時,並且卡片使用T=0協議進行通信,那麼構造TPDU的任務就落在了讀卡器身上。根據ISO7816規定,該角色需要將APDU構造成一組命令,其中包括GET_RESPONSE()和ENVELOPE()命令,同時,由於每張卡片的CLA字段可以不同,這時,讀卡器就需要一個規則來確定發送這2條命令時,選擇的CLA是什麼了。主機可以用ccid_T0APDU()來設置該值,以後讀卡器就知道該怎麼做了。

ccid_Secure(): 該命令用於 PIN_VERIFY 和 PIN_MODIFY 時,也就是校驗PIN和修改PIN,該命令複雜在於命令後面的參數,需要根據卡片特性來填充並且構造合適的APDU命令,比較麻煩。

ccid_Escape(): 該命令用於傳輸廠家定義的特殊命令,可以理解爲擴展命令,比如有的卡片PIN_VERIFY和PIN_MODIFY就是通過這個命令來做的,是因爲M$ ccid驅動不支持 ccid_Secure()命令吧,我不確定?!

ccid_Abort(): 該命令是最難理解的一個,首先要明確 abort 什麼東西?根據CCID,能夠被 abort 的命令有以下幾個:
      PowerOn()、XfrBlock()、Escape()、Secure()、Mechanical() 和 Abort()本身。 從這些命令似乎很難看出 abort 到底有什麼用處(個人原來一直認爲沒用,現在有所轉變了),不過,根據標準和實際場景分析得出,這條詭異的命令主要有以下2個功能:
      1)幫助 CCID 讀卡器同步狀態:
             如何同步呢?這個太細節了,其實就是因爲讀卡器因爲某些原因已經堵死了或者將要堵死,主機發送一對 abort 命令來救活讀卡器;
      2)幫助 HOST 端同步狀態:
            根據個人的理解,在主機端,靠狀態機驅動時,增加這個 abort 狀態和處理,能夠達到同步狀態,把狀態機跑順的作用。
      我們可以假設一些使用該命令的場景:
      1)讀卡器執行一條需要等待對方應答或用戶輸入才能結束的命令,但應答或輸入遲遲不到,這就堵死了?是的,標準沒爲它加超時機制(不絕對),所以它就只能死等,後續再來的命令當然也就無能爲力了,不過我們可以用 abort 拯救它 -- 讀卡器。
      2)主機某個應用程序啓動,準備操作讀卡器讀卡片,可能此時卡片狀態或讀卡器狀態比較混沌,也許是上一個使用讀卡器的應用沒有安全退出,爛攤子留下來了,但我們不能被這種小事給弄死吧,我們可以發送2對 abort 命令來把之前的命令取消掉(如果有的話),至於爲什麼是2對,分析分析就知道了。不過後來發現,PowerOff 命令好像也可以做到,暈!
      3)還是主機應用,可能需要讀取很多數據,讀到幾片數據時,發現不爽了,不想讀了(可能是超時了),自己來個 abort, 標記下,以後到的數據我都不當成是正常的數據,爲什麼還有數據到呢? 不是給 abort 了嗎? 因爲我還不知道如何 abort 卡片正在進行的操作,如果卡片有數據傳回來,我們沒有辦法打斷,只能都收回來,結果就要看接收者如何利用這些數據,如果被 abort 了的話,可認爲是無效數據而簡單丟棄。

     To be continued ...

發佈了43 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章