日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ISO7816 调试心得

發布時間:2024/1/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ISO7816 调试心得 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? ISO7816是一種接觸式的讀卡協議,PSAM、SAM、手機的SIM卡都是按照這個協議定制的。協議分為2個部分,復位和數據的傳輸。本文檔主要介紹自己的理解和在調試的過程,具體協議部分的內容需要翻看ISO7816的協議文檔。本文重點是帶著數據對協議進行分析。適合剛接觸ISO7816的人。加深對協議的理解。

一、復位

? ? ? ? 上電復位或者手動給卡復位之后,卡會發出一段數據,這段數據是代表卡本身的一些信息,如發送的格式是什么樣子的,卡支持什么樣的協議,卡片的號碼等等。復位的結構如下:

?

? ? TS…………………………………………表示正向或者反向約定,強制性在

? ? T0…………………………………………格式字符,強制性

? ? TA(i) TB(i) TC(i) TD(i)…………… 接口字符,可選的

? ? T1 T2Tk…………………………………歷史字符,可選的

? ? 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 T2Tk,我們上面說了,歷史字符的個數是由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 调试心得的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。