ISO7816 调试心得
? ? ? ? ISO7816是一種接觸式的讀卡協議,PSAM、SAM、手機的SIM卡都是按照這個協議定制的。協議分為2個部分,復位和數據的傳輸。本文檔主要介紹自己的理解和在調試的過程,具體協議部分的內容需要翻看ISO7816的協議文檔。本文重點是帶著數據對協議進行分析。適合剛接觸ISO7816的人。加深對協議的理解。
一、復位
? ? ? ? 上電復位或者手動給卡復位之后,卡會發出一段數據,這段數據是代表卡本身的一些信息,如發送的格式是什么樣子的,卡支持什么樣的協議,卡片的號碼等等。復位的結構如下:
?
? ? TS…………………………………………表示正向或者反向約定,強制性在
? ? T0…………………………………………格式字符,強制性
? ? TA(i) TB(i) TC(i) TD(i)…………… 接口字符,可選的
? ? T1 T2…Tk…………………………………歷史字符,可選的
? ? Tck……………………………………… 檢測字符,有條件的
?
? ? ? ? 第一個數據是TS,我個人理解是大端和小端的問題,第一個數據永遠是“0X3B”或者是“0X3F”,其中“0X3B”代表正向約定,“0X3F”代表反向約定,在我見到的卡片里面,只見過“0X3B”,還沒有見過“0X3F”。如果第一個數據不是這兩個值,那么代表接收的時序有問題,需要查看驅動或者硬件是否有問題。
?
? ? ? ? 第二個數據是T0,這個數據比較重要,他決定了下面的數據代表什么意思。也就是說,從第三個數據開始,每個數據代表什么意思是不確定的。T0的結構如下。
b8 msb | b7 | b6 | b5 | b4 | b3 | b2 | b1 lsb |
Y(1) | K | ||||||
圖1 — T0編碼
Y(1)……接口字節存在的標記
b5=1時TA(1)存在
b6=1時TB(1)存在
b7=1時TC(1)存在
b8=1時TD(1)存在
K……歷史字節的數目,從0到15
? ? ? ? 由圖1 可知,第三個數據代表什么意思,是由T0的高4位決定的。T0的低4位代表是歷史字節的數目,這個后面在介紹。
?
? ? ? ? 第三個數據是有T0決定的,下面我就舉一段例子,來說明。下面是我讀取到的一張卡的數據。
1 | 0x3b |
2 | 0x69 |
3 | 0x00 |
4 | 0x00 |
5 | 0x45 |
6 | 0x53 |
7 | 0x41 |
8 | 0x4d |
9 | 0x10 |
10 | 0xd3 |
11 | 0x4c |
12 | 0x8a |
13 | 0xe6 |
? ? ? ? 上面這段數據是我抓取的一張T=0協議卡的復位數據。第一個數據是“0x3B”,代表TS,是正向約定,就是小端的意思。第二個數據是0X69,代表T0,二進制“01101001”,則帶表下面第三個數據是TB1,因為其b6位是1,那么順下去,b7位也是1,則第四個數據就代表TC1,所以說TA(i) TB(i) TC(i) TD(i)是可選字符(i代表1,2,3,4、、、由于可能存在好多組TA、TB、TC、TD,所以用i來表示),也就是說他們不一定都存在,會根據T0和TD(i)來決定。至于TA(i) TB(i) TC(i) TD(i)是干什么用的,我們下面會介紹。這組數據由于T0的b8位由于沒有TD1,所以就沒有TA2、TB2、TC2、TD2、、、、、以及以后的數據,那么,剩下的數據代表什么意思的,剩下的從第5個開始到第13個,代表的是歷史字符,也就是T1 T2…Tk,我們上面說了,歷史字符的個數是由T0的低4位決定的,我們這組數據中,T0為0X69,低4位是9,則說明有9個歷史數據,而剩下的數據正好是9個,由于最后一個字符Tck是有條件的,也就是說不一定存在,在T=0的卡中,一般是不存在Tck的。分析到這里,這組數據和我們的復位協議也都對上了。簡單的總結一下,這組數據代表了這張卡是正向約定的卡,存在TB1和TC1,有9個歷史字符。那么這張卡到底是T=0的卡還是T=1的卡,根據現在的情報還沒辦法分析出來。下面開始介紹TA(i) TB(i) TC(i) TD(i)。
?
TA(1)
—?FI,位b8到b5 上的時鐘率轉換因子的引用。
—?DI,位b4到b7上波特率校正因子的引用。
這位和etu有關系,總之是和兩個數據的傳輸間隔時間相關。這位確定了卡支持的傳輸速率。
?
TB(1)? b8=0代碼處
—?II,位b7 b6上最大編程電流的引用。
—?PI1,位b5到b1上編程電壓的值。
注:接口設備可以忽略TB(1)的位b8。
這一位我也沒用到過。所以這里也就不介紹了。
?
TC(1)代碼(見8.5.3)
—?N,計算八位額外保護時間的引用。
—? 這一位我也沒用到過。所以這里也就不介紹了。
?
下面是重點TD1
字節TD1由兩部分組成。
—?位b8到b5構成Y2);每個等于1的位指明接口字節的存在。
—?位b4到b1構成8.2中定義的參數T的值。
?
b8 msb | b7 | b6 | b5 | b4 | b3 | b2 | b1 lsb |
Y(2) | T | ||||||
圖2 — TD(1)編碼
Y(2)……接口字節存在的標記
b5=1時TA(2)存在
b6=1時TB(2)存在
b7=1時TC(2)存在
b8=1時TD(2)存在
T……協議參考和/或接口字節限制符
? ? ? ? TD1和T0差不多,高4為代表了TA(2)TB(2) TC(2) TD(2)是否存在,低4為代表了這張卡支出什么協議,參數T的定義如下:
? ? ? ??——T=0????????異步半雙工字符傳輸協議 在第8章中說明。
? ? ? ??——T=1????????異步半雙工塊傳輸協議 在第9章中說明。
? ? ? ??——T=2和T=3??? 保留用于將來的全雙工操作。
? ? ? ??——T=4????????保留用于增強的異步半雙工字符傳輸協議。
? ? ? ??——T=5到T=13?? 保留待未來使用。
? ? ? ??——T=14???????未由ISO/IEC JTC1 SC17標準化的傳輸協議
? ? ? ??——T=15???????不屬于傳輸協議,僅指明了全程接口字節的類型(見8.4.3.2)
? ? ? ? TD2、TD3的高四位定義和TD1差不多,類推一下就好了,低4位目前我沒用過,反正我判斷是什么協議的卡只判斷TD1的低4位,TD2、TD3的低4位我直接忽略了。如果TD1不存在,則代表了該卡支持的是T=0的卡。
? ? ? ? TA2、TB2、TC2我也沒有用到,所以沒有仔細研究過,如果想要了解就需要看協議的相關文檔。
? ? ? ? TA3 也是比較重要的一個值,他確定了IFSC的大小,IFSC后面會介紹,這里只要記住有這個東西,并且比較重要就好了。
? ? ? ??TB3的值和CWT和BWT,這兩個值關系到了數據傳輸的時間,具體看協議,我也沒有了解過。
? ? ? ??TC3的值也比較重要,他決定T=1的檢驗位采用什么方式,第1位是0,則采用LRC校驗,第1位是1,則采用CRC校驗。如果沒有TC3,則代表采用LRC校驗。
? ? ? ??接下來的數據是歷史字符,具體代表什么意思需要看卡片。我也沒研究過。
? ? ? ??還有最后一個數據,Tck—校驗字符
? ? ? ??TCK具有一個檢驗復位應答期間所發送數據完整性的值。TCK的值應使從T0到包括TCK在內的所有字
? ? ? ??由于T=0的卡沒有校驗,所以沒有該值,在T=1的卡中,會正常返回該值。
?
? ? ? ??下面我給出一組T=1卡的復位數據,進行分析。
序號 | 值 | 分析 |
1 | 0x3b | TS,正向約定 |
2 | 0xff | T0,有TA1、TB1、TC1、TD1,歷史數據為15個 |
3 | 0x18 | TA1控制了傳輸的速率,詳細看下面的介紹 |
4 | 0x00 | TB1 我也不知道具體什么意思 |
5 | 0xff | TC1 我也不知道具體什么意思 |
6 | 0x81 | TD1,有TD2,卡支持T=1協議 |
7 | 0x31 | TD2,有TA3和TB3,后四位好像不是代表支持的協議 |
8 | 0xfe | TA3,代表IFSC的值為254 |
9 | 0x45 | TB3 我也不知道具體什么意思 |
10 | 0x65 | T1 |
11 | 0x63 | T2 |
12 | 0x0d | T3 |
13 | 0xoc | T4 |
14 | 0x76 | T5 |
15 | 0x01 | T6 |
16 | 0x56 | T7 |
17 | 0x00 | T8 |
18 | 0x0d | T9 |
19 | 0x92 | T10 |
20 | 0x94 | T11 |
21 | 0x03 | T12 |
22 | 0x00 | T13 |
23 | 0x07 | T14 |
24 | 0x30 | T15 |
25 | 0x0a | Tck,最后的校驗位 |
?
二、數據傳輸
1、 傳輸速度
? ? ? 卡的傳輸速度除了有卡本身的決定外,還由CLK的時鐘決定。在ISO7816協議中規定,CLK的時鐘必須1Mhz-5Mhz,CLK的時鐘是由讀卡器決定的,而DATA的位持續時間是由CLK和卡本身決定的,所以說,卡的傳輸速度是由讀卡器和卡共同決定。這里有一個叫做etu的東西,我把他理解成為每一位的持續時間。在復位期間,etu的計算如下:
etu =372 / f
? ? ? 其中F即為CLK的時鐘,假如CLK的時鐘為3.6M,則
etu =372 / 3600000 = 103us
? ? ? 那么,在CLK為3.6M的情況下,波特率為
1 / (372 / 3600000)= 9677
? ? ? “STM32 ISO7816 智能卡”的DEMO中,其CLK的時鐘輸出就是3.6M,所以其波特率為9677。而我在調試過程中,將STM32的主頻修改為8M,那么,CLK無論怎么分頻都無法輸出3.6M,所以我只能將CLK設置為2M,那么相應的波特率也改為了5376。
? ? ? 而復位的信息中包含了時鐘率轉換因子(FI)和波特率矯正因子(DI),那么etu的計算就變成了:
etu =FI / (DI * f)
? ? ? FI和DI由TA決定,一般情況下,FI=372,DI=1,所以,一般情況下,復位完成后無需重新設置波特率,如果有遇到特殊的卡,在復位完成之后還需要對波特率進行重新設置。
2、 傳輸協議
? ? ? ??卡支持不同的協議,傳輸方式也不同,目前最常見的就是T=0的卡和T=1的卡,他們的傳輸都是通過APDU格式進行傳輸,協議的內容我就不介紹了。
? ? ? ??其中T=0叫字符傳輸,T=1叫塊傳輸。說白了就是T=0的卡沒有校驗,你不知道還剩下多少個數據。也不知道傳輸過來的數據對不對。T=1的卡就不一樣了,分為頭域、信息域、尾域。其中,頭域代表了傳輸的地址、命令以及信息域的長度,信息域代表的意思和頭域有關,如果發送的是I塊,那么信息域就是APUD數據,如果發送的S塊,那么信息域代表了控制信息,R塊的信息域為0,我們上面說的IFSC指的就是信息域的大小,剛剛那組數據中,IFSC的值為254,那么代表傳輸過程中,信息域最大的長度就是254。尾域的作用就是校驗接收的數據是否正確。
? ? ? ??T=0的卡百度也有很多現成的代碼,直接搜“STM32 ISO7816 智能卡 代碼”應該就能找得到。可以做一些參考。T=1的卡百度代碼較少。可以在美信的官網上找一下智能卡相關的內容,應該可以找得到源碼,或者在下面的連接下載也可以。
?
https://www.maximintegrated.com/cn/design/tools/appnotes/4200/an4200_sw.zip
?
? ? ? ??這個代碼支持T=0和T=1的卡,可以用作參考。
?
? ? ? ??另外需要注意的就是,T=1的卡復位完成之后,必須先發一個S塊,應該是規定好的。
?
?
?
? ? ? ??下面給出一組T=0的卡傳輸過程中的數據分析。
序號 | 值 | 收發 | 分析 |
1 | 0x00 | 發 | CLA 指令類別 根據卡的文檔決定 |
2 | 0x84 | 發 | INS 指令類別 0x84代表獲取隨機數 |
3 | 0x00 | 發 | P1 |
4 | 0x00 | 發 | P2 |
5 | 0x04 | 發 | LE(沒有LC,則沒有DATA),希望得到4個數據 |
6 | 0x84 | 收 | INS,卡回應INS,則代表相應了這個命令 |
7 | 0x86 | 收 | DATA1 |
8 | 0x91 | 收 | DATA2 |
9 | 0xd3 | 收 | DATA3 |
10 | 0x48 | 收 | DATA4 |
11 | 0x90 | 收 | SW1 和SW2一起表示正常結束 |
12 | 0x00 | 收 | ? |
?
? ? ? ??這支持一個簡單的測試卡是否可以正常通信的命令。該支持的意思是獲取4個隨機數。其實每個代表什么意思,還需要看卡的文檔。
?
? ? ? ??下面給出一組T=1的卡傳輸過程中的數據分析,舉一個I塊的例子。
序號 | 值 | 收發 | 分析 | |
1 | 0x00 | 發 | NAD 節點地址,一般都是0 | |
2 | 0x00 | 發 | PCB 協議控制字節 b0=1代表是I塊,b7=0代表是第1組數據,b6=0代表是最后一個塊,剩下的字節保留 | |
3 | 0x05 | 發 | LEN 長度,代表信息域的長度為5 | |
4 | 0x00 | 發 | 信息域,其實內容和T=0一樣的 | CLA 指令類別 根據卡的文檔決定 |
5 | 0x84 | 發 | INS 指令類別 0x84代表獲取隨機數 | |
6 | 0x00 | 發 | P1 | |
7 | 0x00 | 發 | P2 | |
8 | 0x04 | 發 | LE(沒有LC,則沒有DATA),希望得到4個數據 | |
9 | 0x85 | 發 | EDC 校驗位,前面所有數據的異或值 | |
10 | 0x00 | 收 | NAD 節點地址,和發送的一樣 | |
11 | 0x00 | 收 | PCB 協議控制字節 b0=1代表是I塊,b7=0代表是第1組數據,b6=0代表是最后一個塊,剩下的字節保留 | |
12 | 0x20 | 收 | LEN 長度,代表信息域的長度為2 | |
13 | 0x67 | 收 | SW1 0x67代表長度錯誤 | |
14 | 0x00 | 收 | ? | |
15 | 0x1e | 收 | EDC 校驗位,前面所有數據的異或值 | |
?
? ? ? ??我特意選了一組帶有錯誤值,發送的數據和T=0的卡一樣,是一個希望得到4個隨機數的指令,而返回的只有SW1和SW2,沒有DATA的值,SW1為0X67代表數據的長度錯誤,后來才發現,我手里的這張T=1的卡只支持獲取8個隨機數的指令,所以,把LE改成8之后,接收的數據就正確了。
總結
以上是生活随笔為你收集整理的ISO7816 调试心得的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【uniapp】 判断浏览器环境
- 下一篇: 鼠标绘制工具加是否超出范围判断