IC卡的應用越來越廣泛,,從存儲卡到邏輯加密卡,目前CPU卡已經(jīng)逐漸在應用中占據(jù)主導地位,。CPU卡根據(jù)通訊協(xié)議可分為兩種:接觸式和非接觸式,。接觸式CPU卡主要采用兩種通訊協(xié)議:T=0和T=1通訊協(xié)議。T=0是異步半雙工字符傳輸協(xié)議,,T=1是異步半雙工塊傳輸協(xié)議,。目前T=0通訊協(xié)議的應用較為廣泛,國內外大多數(shù)CPU卡都支持該協(xié)議,,在金融交易中也采用這種通訊協(xié)議,。為了便于說明問題,本文從T=0協(xié)議的功能出發(fā),,將該協(xié)議分為四個層次:物理層,、數(shù)據(jù)鏈路層、終端傳輸層和應用層,,見圖1,。
由于該協(xié)議的特殊性,終端傳輸層與應用層聯(lián)系非常緊密,,實現(xiàn)起來比較繁瑣,,在CPU卡中,,這些任務通過卡片操作系統(tǒng)(COS)來實現(xiàn)。終端在與卡的信息交換中,,始終處于主動地位,,終端向卡發(fā)送符合T=0協(xié)議的命令字節(jié),卡中的COS完成對數(shù)據(jù)的處理并將處理結果返回給終端,。下面對T=0協(xié)議的四個層次進行詳述,。
1 T=0協(xié)議的物理層描述
終端與智能卡之間通過改變I/O傳輸線上的電平來交換信息。由于T=0協(xié)議是面向字符的傳輸協(xié)議,,這里先定義字符幀的結構,,并對組成字符幀位的信息表示作了具體描述。字符幀的結構如圖2所示,。
字符幀由1個起始位S,、8個數(shù)據(jù)位和1個偶校驗位P共10位組成。在數(shù)據(jù)傳輸中每一位的持續(xù)時間稱為基本時間單元etu(elementary time unit),,etu的值由時鐘頻率決定,,etu與時鐘頻率呈現(xiàn)性關系:
1etu=(F/D) ×(1/f) (1)
其中F稱為時鐘頻率轉換因子,D稱為波特率調整因子,。時鐘頻率的范圍為1MHz~5MHz,,正常的工作頻率為3.57MHz,數(shù)據(jù)傳輸?shù)牟ㄌ芈什捎?600bps,,根據(jù)國際標準的取值范圍,,取F=372,D=1,,代入式(1),,可得:
1etu=372/f=372 (2)
即一個基本時間單元為372個時鐘周期。將工作頻率定為3.57MHz,,可以保證數(shù)據(jù)傳輸?shù)牟ㄌ芈蕿?600bps,。如果要提高數(shù)據(jù)的傳輸率,可以調整參數(shù)F來確定傳輸率,。對每一位電平采用三次采樣來確定,,在位持續(xù)時間的中間和左右15%的間隔各取樣一次,取樣點如圖3所示,。當有兩次以上電平為低,,則判斷該位為0;否則該位為1,,這樣確保了取樣值的可靠性,。由于數(shù)據(jù)位的持續(xù)時間是用匯編語句來控制的,可以通過延時語句調整采樣的時間間隔,。但實現(xiàn)采樣的最基本匯編語句的執(zhí)行時間不能再縮短,,因此數(shù)據(jù)傳輸率有一上限,。當每一位取樣三次時,數(shù)據(jù)傳輸率最高可達到57600bps,。如果再提高速率,,取樣時序將無法保證。字符幀的起始位為低電平,,起始位的檢測是通過周期性地對I/O傳輸線進行采樣來得到,。國際標準中規(guī)定采樣時間間隔不得大于0.2etu,實際上起始位的采樣時間間隔只有幾個時鐘周期,,完全滿足要求,。
2 T=0協(xié)議的數(shù)據(jù)鏈路層實現(xiàn)
數(shù)據(jù)鏈路層描述了字符交換的時序要求和差錯控制以及終端對面向傳輸?shù)腻e誤的處理,在邏輯上保證終端和卡片之間能夠正確可靠地通訊,。
采用上述的字符幀,終端與卡之間進行數(shù)據(jù)將交換,,字符之間有嚴格的時序,,時序是通過匯編程序語句的執(zhí)行時間來控制的。從終端到卡發(fā)送的連續(xù)字符的起始位下降沿之間的最小時間間隔由復位應答信息通知終端,,其值在12etu~266etu之間,。從卡發(fā)送到終端的連續(xù)字符的起始位下降沿之間的最小時間間隔應為12etu。
如果字符接收不正確或字符接收正確但校驗位不正確,,接收端需要在字符起始位下降沿后的(10.5±0.2個etu時刻將I/O線置為低電平約1~2個etu,,見圖4,用于向發(fā)送端指明錯誤,;發(fā)送端在(11±0.2)個etu時刻檢測I/O線,。如為高電平則表示字符已經(jīng)正確接收;如果發(fā)送端檢測到錯誤,,則在檢測到錯誤那一刻起,,2個etu后重發(fā)該字符,但重復發(fā)送同一字符的次數(shù)不得超過3次,。如果最后一次發(fā)送失敗,,當終端是接收端時,則終端應該在無效字符的起始位下降沿后的960個etu時間范圍內啟動釋放序列,;當終端是發(fā)送端時,,在卡片檢測到字符的偶校驗錯誤后960個etu時間范圍內,終端啟動釋放序列,。
命令的執(zhí)行總是由終端應用層(TAL)啟動,,通過終端傳輸層(TTL)送給卡片。TTL與卡片進行命令字節(jié)和數(shù)據(jù)字節(jié)交換時,,要保證能夠有序正確地進行,。因此,,在數(shù)據(jù)交換過程中,在任何時刻TTL和卡片都應該隱含地知道哪一方是發(fā)送者,,哪一方是接收者,。當卡片接收到5個字節(jié)的命令字節(jié)后,需要向TTL返回一個過程字節(jié)或兩個字節(jié)的狀態(tài)字節(jié),,具體含義如表1,、表2所示。
表1 終端對過程字節(jié)的處理
過程字節(jié) | TTL執(zhí)行的操作 |
與INS字節(jié)相同 | TTL向卡片發(fā)送或從卡片接收所有數(shù)據(jù) |
INS字節(jié)的補碼 | TTL向卡片發(fā)送或從卡片接收下一個字節(jié) |
'60' | TTL延長等待時間 |
'61' |
TTL等待第二個過程字節(jié)'xx'并根據(jù)'xx'發(fā) GET RESPONSE命令取回數(shù)據(jù) |
'6C' | TTL等待第二個過程字節(jié)'xx'并根據(jù)'xx'重發(fā)上一條命令 |
表2 卡返回的狀態(tài)字節(jié)編碼
第一個狀態(tài)字節(jié)值 | TTL執(zhí)行的操作 |
'6'或'9x'(除表1中的值外) | TTL等待第二個過程字節(jié)SW2 |
當返回的過程字節(jié)或狀態(tài)字節(jié)均不是表中規(guī)定的值時,,終端在接收到的無效字符的起始位降沿開始的9600個etu時間范圍內啟動釋放序列,。
3 T=0協(xié)議的終端傳輸層和應用層的實現(xiàn)
數(shù)據(jù)鏈路層保證了TTL與卡片正常的數(shù)據(jù)交換。在此基礎上,,TTL定義了命令和響應APDU(Application Protocol Data Unit)通過TTL和卡片之間的數(shù)據(jù)傳輸機制,,因此該層協(xié)議定義了APDU到TPDU(Transport Protocol Data Unit)的映射機制以及TPDU和卡片之間如何來完成數(shù)據(jù)的交換。根據(jù)命令和響應APDU包含的數(shù)據(jù)情況,,共有四種不同的APDU,,TTL應能夠對四種情況進行處理,完成終端和卡之間的數(shù)據(jù)交換,。由于T=0協(xié)議的特殊性,,終端傳輸層和應用層并沒有完全隔離開。為了便于說明問題,,先簡要描述一下應用層,,然后將終端傳輸層和應用層結合起來進行說明。
應用層協(xié)議定義了C-APDU和R-APDU的具體結構,。應用層之間的數(shù)據(jù)交換都是由一個命令-響應對完成的,,TAL通過TTL將C-APDU送給集成電路卡(ICC),ICC處理完后將處理結果組成R-APDU通過TTL送給TAL,。APDU由命令報文和響應報文共同組成,,根據(jù)C-APDU和R-APDU是否包含數(shù)據(jù)域,APDU有四種情況,,見表3,。
表3 APDU包含數(shù)據(jù)的情況
命令APDU數(shù)據(jù)域 | 響應APDU數(shù)據(jù)域 | |
1 | 無 | 無 |
2 | 無 | 有 |
3 | 有 | 無 |
4 | 有 | 有 |
C-APDU由一個強制性的四字節(jié)命令頭CLA、INS,、P1,、P2和一個可變長度的條件體組成。CLA為命令類型字節(jié),;INS為命令代碼字節(jié),;P1和P2為命令參數(shù);條件體包括命令數(shù)據(jù)域長度字節(jié)Lc,命令數(shù)據(jù)域和響應返回的最大長度字節(jié)Le,。根據(jù)不同的命令,,條件體的組成也不相同,C-APDU有四種情況,,見表4,。
表4 C-APDU的結構
情 況 | C-APDU結構 |
1 | CLA INS P1 P2 |
2 | CLA INS P1 P2 Le |
3 | CLA INS P1 P2 Lc Data |
4 | CLA INS P1 P2 Lc Data Le |
R-APDU由一個最大長度為Le的數(shù)據(jù)域和一個強制性的兩字節(jié)狀態(tài)代碼組成,狀態(tài)代碼給出了IC卡對當前命令的處理結果,。
對于C-APDU,,終端先將其映射成T=0傳輸層的格式,然后通過TTL傳送給卡片,,卡片返回的數(shù)據(jù)和狀態(tài)先返回給TTL,,再映射成R-APDU返回給TAL。這里根據(jù)四種不同的情況,,分析了C-APDU到C-TPDU以及R-APDU到R-TPDU的映射方法,,并對情況2和情況4時,如何使用GET RESPONSE命令進行了說明,。C-APDU到C-TPDU的映射根據(jù)命令的情況決定,,卡片返回的數(shù)據(jù)和狀態(tài)到R-APDU的映射要根據(jù)返回數(shù)據(jù)的長度來判斷。對于卡片返回的過程字節(jié)“61xx”和“6Cxx”,,將用于TTL和卡片之間進行數(shù)據(jù)交換,,當卡片返回“61xx”時,,表示命令沒有結束,,TTL不將過程字節(jié)返回給TAL,而是從TTL直接向卡片發(fā)出GET RESPONSE命令,,取回上一條命令應該返回的數(shù)據(jù),。并返回給TAL。當卡片返回“6Cxx”時,,TTL將根據(jù)“xx”的值調整并重發(fā)上一條命令,。下面分別對四種命令情況進行分析。
(1)當C-APDU和R-APDU均不含有數(shù)據(jù)時,,將C-APDU的CLA,、INS、P1,、P2映射為C-TPDU的CLA,、INS、P1,、P2,、C-TPDU的P3置為“00”,卡片接收到C-TPDU后,根據(jù)命令頭決定該命令所含數(shù)據(jù)的情況,。TTL接收到卡片返回的狀態(tài)后,,該命令完成,TTL將狀態(tài)字節(jié)強制性地加到R-APDU的尾部,。
(2)當C-APDU不含有數(shù)據(jù)而R-APDU含有數(shù)據(jù)時,,將C-APDU的CLA、INS,、P1,、P2、Le映射為C-TPDU的CLA,、INS,、P1、P2,、P3,,其中P3可以置為“00”,也可以置為需要返回的數(shù)據(jù)字節(jié)數(shù),,卡片接收到C-TPDU后,,如果命令處理失敗,卡片直接將狀態(tài)代碼通過TTL返回給TAL,;當命令能夠正常處理時,,如果P3指定的字節(jié)數(shù)能夠正確返回,待卡片內部應用數(shù)據(jù)處理完成后,,這時卡片首先返回給TTL該命令的過程字節(jié),,通知TTL準備接收卡片數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù),然后卡片直接將P3字節(jié)的數(shù)據(jù)和狀態(tài)字節(jié)通過TTL返回給TAL,,否則,,卡片只將過程字節(jié)“6Cxx”或“61xx”返回給TTL這一層。當過程字節(jié)為“6Cxx”時,,TTL根據(jù)xx重發(fā)命令取回數(shù)據(jù),,當過程字節(jié)為“61xx”時,TTL發(fā)GET RESPONSE命令取回數(shù)據(jù),。
(3)當C-APDU含有數(shù)據(jù)而R-APDU不含數(shù)據(jù)時,,將C-APDU的CLA、INS,、P1,、PS、Lc映射為C-TPDU的CLA,、INS,、P1、P2、P3,,待卡片對C-TPDU檢查通過后,,卡片直接將過程字節(jié)返回給TTL,TTL根據(jù)返回的過程字節(jié)繼續(xù)向卡片發(fā)送P3字節(jié)的后續(xù)數(shù)據(jù),。待數(shù)據(jù)接收完后,,卡片對應用數(shù)據(jù)進行處理,然后將處理結果以狀態(tài)字節(jié)的方式通過TTL返回給TAL,。
(4)當C-APDU和R-APDU均含有數(shù)據(jù)時,,將C-APDU的CLA、P1,、P2,、Lc映射為C-TPDU的CLA、INS,,P1,、P2、P3,,待卡片對C-TPDU檢查通過后,,卡片直接將過程字節(jié)返回給TTL,TTL根據(jù)返回的過程字節(jié)繼續(xù)向卡片發(fā)送P3字節(jié)的后續(xù)數(shù)據(jù),。待數(shù)據(jù)接收完后,,卡片對應用數(shù)據(jù)進行處理,如果命令處理失敗,,卡片直接將狀態(tài)代碼返回給TTL,。當命令正常處理時,卡片返回給TTL過程字節(jié)“6Cxx”或“61xx”,,當為“6Cxx”時,,TTL根據(jù)xx重發(fā)命令取回數(shù)據(jù),。當過程字節(jié)為“61xx”時,,TTL發(fā)GET RESPONSE命令取回數(shù)據(jù)。
(1)由于T=0協(xié)議字符級檢錯重發(fā),,與面向塊的傳輸協(xié)議T=1相比,,在出現(xiàn)傳輸錯誤時,T=0協(xié)議可以不必整個數(shù)據(jù)報文全部重發(fā),,節(jié)省了時間,。
(2)在編程過程中,對位幀進行采樣時,,采用了三次采樣判決的方式,,避免了由于采樣時的偶然誤差而造成誤碼。
(3)T=0協(xié)議是應用于智能卡中的第一個接觸式通訊協(xié)議,但該協(xié)議并沒有考慮傳輸中斷和檢測到傳輸錯誤碼后卡和讀寫器的再同步問題,。唯一的檢錯機制就是奇偶位校驗,。對錯誤的處理就是對出錯的字節(jié)重新發(fā)送一次,這樣極有可能導致無限次的循環(huán)狀態(tài),。
(4)T=0協(xié)議并沒有與應用層完全分割開,,應用層的命令解釋器必須告訴傳輸層當前命令是接收還是發(fā)送數(shù)據(jù)。由于這個原因,,這兩個模塊在命令處理過程中需要交互操作,,在程序中能夠提取出一個通用的傳輸層,供應用層調用來負責完成數(shù)據(jù)的傳輸,。這種情況給編程和調試帶來了不便,。同時造成模塊的可重用性較差。
(5)對于命令報文中包含數(shù)據(jù)域,,同時又需要卡片返回數(shù)據(jù)的命令,,T=0協(xié)議不能用一條命令來實現(xiàn),必須分為兩步實現(xiàn):第一條命令為卡片提供數(shù)據(jù),,然后用另外一條相關的命令來取回數(shù)據(jù),。這樣給卡片的編程帶來很大麻煩,同時卡片內存中必須保留上一次操作需要返回的數(shù)據(jù),。這時如果不及時發(fā)送取數(shù)據(jù)命令而發(fā)送其它命令,,可能會將敏感數(shù)據(jù)泄漏,并產生其它問題,。這些都是T=0協(xié)議考慮不周的地方,。
(6)終端傳輸層需要根據(jù)卡片返回的子程字節(jié)和狀態(tài)字節(jié)執(zhí)行相應的操作,使終端對數(shù)據(jù)的處理復雜化,。
(7)由于目前大多數(shù)接觸式終端只支持T=0通訊協(xié)議,,因此該協(xié)議仍將得到廣泛的應用。隨著智能卡芯片功能的增強,,對于數(shù)據(jù)傳輸量較大的應用,,該協(xié)議將不再適用,面向塊的異步半雙工接觸式傳輸協(xié)議T=1將體現(xiàn)出優(yōu)勢.