智能卡7816协议
?版權聲明:原創文章轉載請注明出處。?? ?https://blog.csdn.net/wwt18811707971/article/details/77732183
1.硬件接口
1.1端跨解釋:
連接接口?? ?解釋
VCC?? ?電源輸入(A類:5V, B類:3V)
RST?? ?復位信號輸入
CLK?? ?時鐘信號輸入
GND?? ?地,基準電壓
VPP?? ?編程電壓輸入,由卡選用
I/O?? ?串行數據的輸入、輸出
1.2IC卡的操作信息交互流程:
當卡的觸點物理的連接到接口設備的觸點時,電路才能運行。
(1) 接口設備能夠控制IC卡各IO引腳使其激活。
(2) 接口設備給卡發送復位信號使卡復位啟動。
(3) 卡要向接口設備發送復位應答信號,將通信中必要的相關信息告知接口設備。
(4) 接口設備對卡進行一次熱復位,卡進行復位應答。
(5) 接口設備發起一個PPS交互指令,選擇要與卡通信的協議和相關參數。
(6) 根據選擇的協議(T=0或T=1)進行數據的通信。
1.3卡激活
為了與一個已經物理的連接的卡發起交互,接口設備需要通過下面的操作激活卡。
(1)RST置成 L
(2)VCC上電
(3)接口設備上I/O置成接收模式
(4)在A類操作條件下,VPP應該置為停止狀態;在B類操作條件下,不接VPP
(5)CLK將要被給一個時鐘信號。
1.4冷復位
激活結束后(RST在L狀態,VCC上電,接口設備I/O在接收模式,CLK有一個適合的并且穩定的時鐘信號),卡已經準備好冷復位。在冷啟動之前,卡的內部狀態沒有定義。接口設備將發出一個冷復位信號,并從IC卡得到一個復位應答,過程如下:
(1)從Ta時刻起,接口設備施加CLK。
(2)在Ta后不超過200個時鐘周期內,IC卡必須將其I/O線置為接收方式。由于接口設備也必須在這段期限內置其I/O線驅動器為接收方式,所以I/O線在Ta后最遲不超過200個時鐘周期的時間內置為高電平。為此,接口設備的I/O觸點應經過一個上拉電阻接到V CC。
(3)接口設備應從Ta開始保持RST端為低電平狀態至少400個時鐘周期,并在T b 將其置為高電平;
(4)IC卡上I/O的復位應答將在T b時刻后的400至40,000個時鐘周期內開始;
(5)如果IC卡在RST被拉高后的40000個時鐘周期內沒有應答,則RST將被拉低并且卡將被去激活。
注:1.假定卡的內部狀態在冷復位前不定,這樣卡的設計必須避免不適當的操作
2.卡的復位可以由接口設備在任意時間隨意啟動
1.5熱復位
IC卡對終端的復位應答有著規定的規格和內容,如果終端收到的復位應答不符合規定要求時,終端將啟動一個熱復位并從IC卡獲得復位信號。過程如下:
(1)在VCC和CLK信號保持穩定后,接口設備通過拉低RST發起熱復位,RST低電平至少要持續400個時鐘周期;
(2)在Tc之后的最多200周期內,IC卡和接口設備都必須置I/O為接收方式,即I/O線在Tc后最遲不超過200個時鐘周期內置為高電平;
(3)接口設備在RST保持低電平大于400個時鐘周期后,將其拉高;
(4)IC卡上I/O的復位應答將在T后的400至40,000個時鐘周期內開始;
(5)如果IC卡在RST被拉高后的40000個時鐘周期內沒有應答,RST將被拉低并且卡將被去激活;
1.6時鐘停止
對于支持時鐘停止的卡,當接口設備認為沒有來自卡的傳輸并當I/O已經保持在H至少1860時鐘周期(延時tg),在VCC上電并且RST在H時,接口設備可以對于CLK(Te)進行時鐘停止。
當時鐘停止時(在Te~Tf),根據已被確定好的時鐘指示器X ,CLK將要繼續保持在在H或是在L。時鐘指示器X的值應在復位應答序列TA(i)當中設置。
在Tf,接口設備重啟時鐘,在至少700時鐘延時后(th),在I/O的信息交換可以繼續。
1.7去激活
當信息交換被完成或者被終止(例如卡沒有應答,或檢測到卡的移動),接口設備將按照下面的序列停用IC卡:
(1)將RST 置L
(2)將CLK置L(除非時鐘停止在L狀態)
(3)將VPP去激活
(4)將I/O置L
(5)將VCC去激活
1.8參數選擇
接口設備可以發送協議和參數選擇指令(PPS),選擇要和IC卡進行通信的協議和相關的參數。
(1) PPS協議
——>IFD發送一個PPS請求給ICC
——>如果ICC收到一個錯誤的請求,則不響應。
——>如果ICC受到一個正確的請求,則返回一個PPS響應,否則將超過初始等待時間
——>如果ICC超出初始等待時間,則IFD復位或者拒絕ICC
——>如果IFD收到一個錯誤的應答,則復位或者拒絕ICC
——>如果PPS交換失敗,則IFD復位或者拒絕ICC
(2) PPS請求的結構和內容
PPS 請求和響應分別包括一個初始字節 PPSS 后隨格式字節 PPS0 三個可選參數字節 PPS1 PPS2 和 PPS3 以及一個檢測字節 PCK。
PPS 識別 PPS 請求或響應并等于 FF。
PPS0 通過位 b5 b6 b7 分別指明可選字節 PPS1 PPS2 PPS3 的存在 位 b4 到b1 傳輸參數 T 的值以提出協議 位 b8 留作未來使用并設定為 0。
PPS1 允許 IFD 對卡提出 F 和 D 的值 。
PPS請求和應答的結構如下:
如果IFD不發送PPS1,它應該繼續使用Fd和Dd。ICC通過響應PPS1確認這兩個值(此時使用的Fn和Dn),或者不響應PPS1而繼續使用默認值Fd和Dd。 PPS2和PPS3保留將來使用。 PCK的值應使從PPSS至PCK(包括PCK)的所有字節的異或操作結果為0。
2.通訊協議說明
2.1字符傳輸:
Smart Card的字符傳輸采用的是異步半雙工模式,這種異步的模式很像個人電腦上的RS232通信。傳輸一個字符時,除了8Bits的數據外,還加了以下幾個Bits:
起始位:用于字符幀的同步
校驗位: 用于校驗檢測
在字符傳輸之前,I/O應該處于高電平。智能卡與CPU之間按照異步方式傳送字節,其具有統一的字符傳輸格式,一個字由連續的10個ETU完成發送,期間傳送1個起始位,8個數據位和1個奇偶檢驗位。其數據幀傳輸格式:10bit。
7816-3定義的通訊協議,基本上可以說是RS232的翻版并在此基礎上進行的改進,7816中只有一個IO同時兼具數據收發的功能,這點和RS232用RxD和TxD進行數據收發是不同的。在RS232中我們有9600波特率、起始位、奇偶校驗位、停止位這些概念,而在7816-3中都完整地保留了下來,只不過7816-3中引入了etu,沒有使用bps,但是基本原理是一致的。etu的定義可以更加精確地描述每個數據位在傳輸過程中收發雙方的職責和角色轉換。
根據定義在智能卡上電復位的時候 1 etu = 372 / f ,其中f = 讀寫設備通過CLK管腳提供給智能卡的時鐘頻率,通常在1–5 MHz之間。
etu的單位是時間單位秒(毫秒、微秒),等同于傳輸每個數據位所需的時間。對其取倒數得出來的就是每秒傳輸的數據位,也就是bps。我們取f = 3.579545 MHz,用3579545除以372結果等于9622.4約為9600 bps。
2.2復位應答——ATR
智能卡始終處于被動的狀態,所以終端設備在和智能卡進行數據交互的時候,需要首先給智能卡發指令,智能卡才會對應地給出應答。而智能卡告訴終端的第一句話就是ATR,亦即“復位應答”。
ATR內容:
各字符解釋:
字符?? ?說明
TS?? ?初始化字符
TO?? ?格式化字符
TAi, TBi, TCi, TDi (i=0/1)?? ?接口字符
T1, T2, T3 … TK?? ?歷史字符(指明了一些通用的信息,如卡的制造商,卡中被嵌入的芯片,卡的文件狀態等)
TCK?? ?校驗字符
TS:初始字符,定義隨后字符的邏輯電平和位序。
T0:兩部分組成
高四位(b5-b8)稱之為Y1,用來指示后繼字符TA1至TD1是否存在,b5-b8位被置為邏輯“1“狀態者,相應地表明TA1至TD1的存在。
低四位組(b1-b4)稱之為K,則表明歷史字節存在的數量
2.3T=0 協議
T=0是按照單個字符的方式實現智能卡和終端數據傳輸。
卡片和終端之間的數據傳輸是通過命令響應的方式進行的,卡片只能被動地接收命令,并且給出響應。所有的命令都是以命令頭開始,而該命令被完整地執行后(無論結果對錯),必須以包含狀態字(SW1 SW2)的響應結束。卡片和終端之間如何具體進行數據傳輸的,就依靠不同的通訊協議來實現,其中主要有T=0、T=1、T=CL。其中T=0和T=1適用于接觸式卡片(7816),而T=CL適用于非接觸式卡片(14443)。
數據傳輸時,終端向卡片發送命令,包含5個字節(分別是CLA + INS + P1 + P2 + P3,其中INS表示指令,說明該命令的作用)的命令頭,也就是說卡片必須要收到來自終端的5個字節的命令頭,才能決定下一步該干什么,然后根據做出的決定給終端一個反饋意見。同樣終端在發送完5個字節的命令頭后,也需要等待來自卡片的反饋后,再決定下一步該干什么。
反饋信息一共有三種:(1)空操作的過程字節NULL(0x60);(2)響應字節ACK;(3)狀態字的第一個字節SW1。
NULL字節相當于網絡通信中的“心跳包”,就是告訴終端不要進行超時處理,繼續等待,而且NULL字節不見得是在卡片接收5個字節的命令頭后反饋,通常在卡片需要進行大量數據更新或者復雜的加解密運算時,來不及返回狀態字(SW)時先發一個0x60。
ACK是用來決定后續的數據傳輸的,不僅能決定傳輸的方向,還能決定后續傳輸字節的多少。如果ACK = INS,則傳輸剩余的全部字節,如果ACK = INS ^ FF,則傳輸后續的一個字節。
SW1只能是“0x9X”以及“0x6X”(不能是空操作字節“0x60”),如果卡片返回的是SW1,那么接下來必須緊跟著另一個狀態字節SW2,標志著卡片對于該命令處理的結束,如果不斷電,卡片在發送完SW2之后會等待下一個命令的到來。另外,因為SW1只能是“0x6X”和“0x9X”,所以INS一定不能取值0x6X和0x9X。
ACK里面為什么會有僅傳輸后續一個字節的情形,而不是一次傳完后續的所有字節?主要是因為如果智能卡芯片沒有那么多可以用于臨時緩存命令數據的RAM空間的話,就需要接收一個字節先處理一個字節,直到剩余的字節能被一次性地處理了,再反饋一個INS作為過程字節,把剩余的字節全部收進來。
2.4T=1協議
T=1,最小的數據傳輸單元是“數據塊”,這個數據塊由若干個字節組成,其中有些字節是必須的,有些字節是可選的。每個數據塊最多可以包含多少個字節(也就是數據塊的大小)可以通過三種途徑確定:
(1)ATR中對應協議T=1的專有接口字節指出;
(2)使用默認的值;
(3)在數據傳輸過程中協商。
一個數據塊其實就是一個“數據包”,其中包頭的3個字節(NAD 1字節 + PCB 1字節 + LEN 1字節)和包尾1個或者2個字節(如果采用LRC校驗就是 1字節,采用CRC校驗就是 2字節)是必須的,中間的信息數據域INF則是可選的。其中NAD代表節點地址,基本不用,可以設置為“00”;PCB代表協議控制字節,用來指明數據塊的類型(分為:傳遞信息域數據的I-塊,應答響應的R-塊,負責通訊參數協商的S-塊)、序列號、是否存在后續的鏈接塊、是否有校驗錯誤、額外超時等待請求、信息數據域大小的協商等。
T=0、1的區別:協議最明顯的不同是T=1協議按照OSI的參考模型進行了分層,分別是:物理層、數據鏈路層和應用層。物理層主要是數據字符的傳輸,數據鏈路層主要是數據塊的傳輸,而應用層主要是APDU的交互傳輸。APDU的交互與數據字符的傳輸,這些和T=0協議里面描述的大體相同,關鍵的就是數據鏈路層定義的數據塊傳輸。因為這個數據鏈路層的定義,使得T=1協議基本具備了可以實現復雜網絡數據傳輸的全部特征,相比而言T=0協議簡直就等同于“裸傳”了。
2.5APDU報文結構
APDU(ApplicationProtocolDataUnit–應用協議數據單元)。協議數據單元PDU(ProtocolDataUnit)是指對等層次之間傳遞的數據單位。協議數據單元(ProtocolDataUnit)物理層的PDU是數據位(bit),數據鏈路層的PDU是數據幀(frame),網絡層的PDU是數據包(packet),傳輸層的PDU是數據段(segment),其他更高層次的PDU是數據(data)。
智能卡數據的操作,包括選擇、讀取、寫入/更新都是通過特定的文件操作APDU命令來完成的。
命令APDU由一個四個字節長的命令頭和可變長度的命令體構成。
命令APDU傳輸的數據長度由Lc表示(命令數據域的長度)。
命令響應APDU數據域的最大長度由期望數據長度(Le)表示。當 Le 值為零時,應答數據域最大長度為256。如果命令報文中需要,則Le總是‘00’。
命令各字段含義:
字段?? ?含義
CLA?? ?命令報文的類別字節
P1?? ?參數 1
P2?? ?參數 2
Lc?? ?Data的長度(含4字節mac)
Data?? ?在命令的數據字段中發送的字節串
Le?? ?在向命令響應的數據字段中期望的字節最大數
四種命令:
類別?? ?組成
Case1?? ?CLA INS P1 P2
Case2?? ?CLA INS P1 P2 Le
Case3?? ?CLA INS P1 P2 Lc Data
Case4?? ?CLA INS P1 P2 Lc Data Le
Case1:
4字節命令頭,這種情況時,命令中沒有數據送到卡( Lc)中,也沒有數據從卡中返回( Le)。
不含安全報文的命令: CLA | INS | P1 | P2
含安全報文的命令: CLA | INS | P1 | P2 | Lc | MAC
注: Lc = MAC 的長度, 4 字節。
Case2:
5字節命令頭,這種情況時,命令中沒有數據送到卡( Lc)中,有數據從卡中返回( Le)。
不含安全報文的命令: CLA | INS | P1 | P2 | Le
含安全報文的命令: CLA | INS | P1 | P2 | Lc | MAC | Le
注: Lc = MAC 的長度, 4 字節。
Case3:
5字節命令頭,這種情況時,命令中有數據送到卡( Lc)中,沒有數據從卡中返回( Le)。
不含安全報文的命令: CLA | INS | P1 | P2 | Lc | Data
含安全報文的命令: CLA | INS | P1 | P2 | Lc | Data+MAC
注: Lc = 數據的長度 + MAC 的長度( 4 字節)。
Case4:
5字節命令頭,這種情況時,命令中既有數據送到卡( Lc)中,也有數據從卡中返回( Le)。
不含安全報文的命令: CLA | INS | P1 | P2 | Lc | Data | Le
含安全報文的命令: CLA | INS | P1 | P2 | Lc | Data+MAC | Le
注: Lc = 數據的長度 + MAC 的長度( 4 字節)。
響應APDU包括一個可變長度的報文體和一個長度為2個字節的報文尾。
字段解釋:
字段?? ?解釋
Data?? ?在響應的數據字段中收到的字節串
SW1?? ?狀態字 1
SW2?? ?狀態字 2
參考:
1.深入理解7816(1)—- 關于F/D和etu
2.深入理解7816(2)—關于ATR
3.深入理解7816(3)—–關于T=0
4.深入理解7816(4)—關于T=1
5.ISO 7816協議及智能卡驅動介紹
6.IC卡標準 中文版 第三冊
7.智能卡 7816協議
8.智能卡 APTU命令
9.IC卡復位應答ATR的數據元和它們的意義
10.ISO7816 傳輸協議 T0 T1
11.APDU
12.IC卡通信協議詳解(7816-3)
---------------------?
作者:wwt18811707971?
來源:CSDN?
原文:https://blog.csdn.net/wwt18811707971/article/details/77732183?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
總結
- 上一篇: 单片机IO口模拟SPI四种模式的程序
- 下一篇: ST-Link VCP Ctrl驱动安装