標籤:
本文記錄 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 ...
USB CCID "複雜"命令拾零?