歡迎您光臨本站 登入註冊首頁

ATMEL接觸式IC卡及開發實例

admin @ 2014-03-26 , reply:0

概述

 目錄第一章幾種常見的ATMEL接觸式IC卡的存儲結構及其保密特性2一、AT24C01A、AT24C02、AT24C04、AT24C08、AT24C16、AT24C32、AT24C642二、……

  目 錄
第一章 幾種常見的ATMEL接觸式IC卡的存儲結構及其保密特性 2
一、AT24C01A、AT24C02、AT24C04、AT24C08、AT24C16、AT24C32、AT24C64 2
二、AT88SC102、AT88SC1604、AT88SC1608、AT88SC153 3
1.AT88SC102加密卡 3
2.AT88SC1604加密卡 5
3.AT88SC1608加密卡 8
4.AT88SC153加密卡 12
三、AT45D041 16
第二章 接觸式IC卡的介面函數 19
一、函數列表(函數名, 簡單說明) 19
1.通用函數 19
2.ATMEL AT88SC102/AT88SC1604加密卡專用函數 19
3.ATMEL AT88SC1608及AT88SC153加密卡專用函數 20
4.ATMEL AT45D041 Flash存儲卡專用函數 20
二、函數說明 21
附錄一:卡類型預定義 29
附錄二:ICFOX.PLB測試常式 30
第三章 接觸式IC卡底層軟體開發實例 31
一、IC卡操作底層函數 31
1.IC卡操作底層函數說明: 31
2.IC卡低層通訊頭文件(Base.h) 32
二、AT24C64卡應用實例 32
1.AT24C64卡函數頭文件(AT24C64.h) 32
2.AT24C64卡函數 33
3.AT24C64卡應用常式(App24C64.c) 35

第一章 幾種常見的ATMEL接觸式IC卡的存儲結構及其保密特性
為了能夠使IC卡應用到自已的系統中,系統開發公司的工程師應了解一些卡的基本技術資料,下面就ATMEL公司生產的接觸式IC卡在應用中常見的和性能比較好的型號做一簡單介紹,希望能對IC卡的選型及開發有所幫助。
??1 AT24C01A、AT24C02、AT24C04、AT24C08、AT24C16、AT24C32、AT24C64
這幾個型號的IC卡為ATMEL存儲卡,是一種不具備加密功能的EEPROM卡,AT24C為系列號,數字部分為K位容量,分別為1K、2K、4K、8K、16K、32K、64K位。它的使用方法與EEPROM完全相同,存儲結構簡單,只有讀寫兩種操作功能,主要用於存放一些保密性要求不高的數據。
AT24C系列的工作頻率為1MHz(5V),1MHz(2.7V),400KHz(1.8V);工作電壓為5V±10%,根據要求最低可至1.8V;Icc電流讀最大為1mA,寫最大為3mA;寫/擦除次數為100萬次;數據保持100年;工作溫度為0—70℃,根據要求可超過指定工作溫度;通訊協議符合ISO/IEC 7816-3同步協議,雙線串列介面。

存儲結構:

AT24C系列型號的后兩位數字為該型號的最大K位數(1K=1024),8位為1位元組,最大位元組存儲容量的演算法為K位數×1024÷8。如:AT24C01A的最大存儲容量的1×1024÷8=128,其位元組地址空間為0—127(16進位為0x00—0x7F)。

下面的偽碼程序在AT24C系列卡的ADDR地址開始寫LEN個位元組,並且讀出校對。
Open(AT24Cxxx)
Write(ADDR,LEN,WDATA)
RDATA = Read(ADDR,LEN)
Close()
IF WDATA = RDATA THEN 寫成功 ELSE 寫失敗

下面的偽碼程序在AT24C系列卡的ADDR地址開始讀LEN個位元組。
Open(AT24Cxxx)
RDATA = Read(ADDR,LEN)
Close()
二、AT88SC102、AT88SC1604、AT88SC1608、AT88SC153
這幾個型號的IC卡為ATMEL加密卡,採用CMOS低功耗技術,具有傳輸代碼、生產代碼,密碼及錯誤計數器、熔絲保護等安全保護功能。存儲空間分成設置區和應用區兩大功能區,應用區又可分為不同的分區,每個區具有各自獨立的保密功能。從型號上看,AT88SC為系列號,最後一位數字為應用區分區數,分別為2、4、8、3個分區,中間的數字10、160、15為K位容量,分別為1K、16K、16K、1.5K位。其中不同應用分區另有自已的分區密碼。AT88SC1604又可分為等分區卡和不等分區卡兩種。
1.AT88SC102加密卡
AT88SC102加密卡的訪問時間讀為2us/位,寫為5ms/位;工作電壓為5V±10%;寫/擦除次數為10萬次;數據保持100年;工作溫度為-25—70℃;通訊協議符合ISO/IEC 7816-3同步協議。

存儲結構:
存儲分區 位地址 位數 位元組地址 位元組數
FZ 廠商代碼區 0-15 16 0-1 2
IZ 發行者區 16-79 64 2-9 8
SC 主密碼區 80-95 16 10-11 2
SCAC 主密碼錯誤計數區 96-111 16 12-13 2
CPZ 代碼保護區 112-175 64 14-21 8
AZ1 應用區一 176-687 512 22-85 64
EZ1 一區擦除密碼 688-735 48 86-91 6
AZ2 應用區二 736-1247 512 92-155 64
EZ2 二區擦除密碼 1248-1279 32 156-159 4
EAC2 二區擦除密碼錯誤計數 1280-1407 128 160-175 16
MTZ 測試區 1408-1423 16 176-177 2
註:擦、寫是兩種不同的操作,擦是位寫1操作,寫是位寫0操作。修改數據時,只有先擦除才能再寫數據。
在熔絲熔斷(FUSE2)前與熔絲熔斷後它的保密特性是不同的。

熔絲熔斷前的保密特性:
FZ:由ATMEL公司出廠時設置(FUSE1),只讀不可更改。ATMEL公司可以為批量用戶定製此代碼,以保證卡片的唯一性。
IZ:可讀。SC核對正確,IZ可以反覆擦寫。
SC:SC核對正確時,SC可讀和擦寫,SC核對不正確時,SC不能讀和擦寫。
SCAC:初始值為4,SC核對每錯1次SCAC減1,SCAC等於0時,卡自毀,如果SC核對正確SCAC恢復為初始值4。SCAC永遠可讀。
CPZ:為用戶標註,用於對卡中信息操作過程的標註,永遠可讀,SC核對正確后可擦寫。
AZ1,AZ2;前2位為寫讀保護位,即176位為AZ1防寫位(1PR),177位為AZ1讀保護位(1RD),736位為AZ2防寫位(2PR),737位為AZ2讀保護位(2RD)。 SC核對正確時,AZn可讀(n代表1或者2,下同),如果SC核對不正確時,nRD控制著AZn的可讀性,即如果nRD=1時,AZn可讀;如果nRD=0時,AZn不可讀。
在熔絲熔斷(FUSE2)前,nPR不起作用,只要SC核對正確,AZn就可擦寫,
EZ1,EZ2:SC核對不正確時,EZn不能讀和擦寫。SC核對正確時,EZn可讀和擦寫。在熔絲熔斷(FUSE2)前,EZn不起什麼作用。
EAC2:熔絲熔斷(FUSE2)前,EAC2不起什麼作用。
MTZ:用於測試卡的擦寫性能。任意條件下均可測試。

熔絲熔斷後的保密特性:
FZ:由ATMEL公司出廠時設置(FUSE1),只讀不可更改。ATMEL公司可以為批量用戶定製此代碼,以保證卡片的唯一性。
IZ:永遠可讀。但熔絲熔斷(FUSE2)后IZ內容被固化,IZ將永遠不能再改。
SC:不可讀,SC核對正確時,SC可擦寫,SC核對不正確時,SC不能擦寫。
SCAC:初始值為4,SC核對每錯1次SCAC減1,SCAC等於0時,卡自毀,如果SC核對正確SCAC恢復為初始值4。SCAC永遠可讀。
CPZ:為用戶標註,用於對卡中信息操作過程的標註,永遠可讀,SC核對正確后可擦寫。
AZ1,AZ2;前2位為寫讀保護位,即176位為AZ1防寫位(1PR),177位為AZ1讀保護位(1RD),736位為AZ2防寫位(2PR),737位為AZ2讀保護位(2RD)。 SC核對正確時, AZn可讀(n代表1或者2,下同),如果SC核對不正確時,nRD保護著AZn的可讀性,即如果nRD=1時,AZn可讀;如果nRD=0時,AZn不可讀。
在熔絲熔斷(FUSE2)后,即使SC核對正確,也要看nPR是否為1,如果是0,AZn被防寫永遠不能寫。
EZ1,EZ2:SC核對不正確時,EZn不能讀和擦寫。SC核對正確時,EZn可讀和擦寫。在熔絲熔絲熔斷(FUSE2)后,只有EZn核對正確,才能對AZn進行擦除操作,同時不可能再對EZn進行讀和擦寫操作。
EAC2:熔絲熔斷(FUSE2)后,AZ2隻有128次擦除機會,每擦1次計數減1。
MTZ:用於測試卡的擦寫性能。任意條件下均可測試。

下面的偽碼程序在AT88SC102卡完成初始化操作和在一應用區ADDR地址開始寫LEN個位元組,並讀出校對。
Open(AT88SC102)
IF CheckSC(Pwd) = OK THEN 繼續 ELSE 非法卡
WriteCPZ(CPZ) ;可以寫一些系統標識
UpdateSC(NewPwd)
SetZone(1)
UpdateEZ(NewEZ)
Erase(ADDR,LEN)
Write(ADDR,LEN,WDATA)
RDATA = Read(ADDR,LEN)
IF WDATA = RDATA THEN 寫成功 ELSE 寫失敗
Fuse()
Close()

下面的偽碼程序判斷AT88SC102卡是否是本系統支持的卡和對一應用區ADDR地址開始的LEN個位元組完成某種操作。
Open(AT88SC102)
ReadCPZ(CPZ) ;讀出系統標識
if CPZ = 系統標識 THEN 繼續 ELSE 非法卡
IF CheckSC(Pwd) = OK THEN 繼續 ELSE 非法卡
SetZone(1)
RDATA = Read(ADDR,LEN)
<一些其它操作>
IF CheckEZ(Pwd) = OK THEN 繼續 ELSE 非法卡
Erase(ADDR,LEN)
Write(ADDR,LEN,WDATA)
RDATA = Read(ADDR,LEN)
IF WDATA = RDATA THEN 寫成功 ELSE 寫失敗
Close()
2.AT88SC1604加密卡
AT88SC1604加密卡的訪問時間讀為2us/位,寫為5ms/位;工作電壓為5V±10%;寫/擦除次數為10萬次;數據保持10年;工作溫度為0—70℃;通訊協議符合ISO/IEC 7816-3同步協議。
AT88SC1604又可分為等分區卡和不等分區卡兩種,它們各區和熔絲地址不一樣。二、三、四應用區不等分區卡沒有區密碼錯誤計數,而等分區卡有,不等分區卡在性能上比較明顯地偏重第一區。在選擇AT88SC1604卡時應注意它是不等分區卡還是等分區卡。

不等分區卡的存儲結構:(二、三、四應用區沒有區密碼錯誤計數)
存儲分區 位地址 位數 位元組地址 位元組數
FZ 廠商代碼區 0-15 16 0-1 2
IZ 發行者區 16-79 64 2-9 8
SC 主密碼區 80-95 16 10-11 2
SCAC 主密碼錯誤計數區 96-103 8 12 1
CPZ 代碼保護區 104-167 64 13-20 8
SC1 一區密碼 168-183 16 21-22 2
S1AC 一區密碼錯誤計數 184-191 8 23 1
EZ1 一區擦除密碼 192-207 16 24-25 2
E1AC 一區擦除密碼錯誤計數 208-215 8 26 1
AZ1 應用區一 216-9775 9560 27-1221 1195
SC2 二區密碼 9776-9791 16 1222-1223 2
EZ2 二區擦除密碼 9792-9807 16 1224-1225 2
E2AC 二區擦除密碼錯誤計數 9808-9815 8 1226 1
AZ2 應用區二 9816-11863 2048 1227-1482 256
SC3 三區密碼 11864-11879 16 1483-1484 2
EZ3 三區擦除密碼 11880-11895 16 1485-1486 2
E3AC 三區擦除密碼錯誤計數 11896-11903 8 1487 1
AZ3 應用區三 11904-13951 2048 1488-1743 256
SC4 四區密碼 13952-13967 16 1744-1745 2
EZ4 四區擦除密碼 13968-13983 16 1746-1747 2
E4AC 四區擦除密碼錯誤計數 13984-13991 8 1748 1
AZ4 應用區四 13992-16039 2048 1749-2004 256
MTZ 測試區 16040-16055 16 2005-2006 2
FUSE 熔絲 16288-16303
最後地址 16383 2047
等分區卡的存儲結構:(二、三、四應用區有區密碼錯誤計數)
存儲分區 位地址 位數 位元組地址 位元組數
FZ 廠商代碼區 0-15 16 0-1 2
IZ 發行者區 16-79 64 2-9 8
SC 主密碼區 80-95 16 10-11 2
SCAC 主密碼錯誤計數區 96-103 8 12 1
CPZ 代碼保護區 104-167 64 13-20 8
SC1 一區密碼 168-183 16 21-22 2
S1AC 一區密碼錯誤計數 184-191 8 23 1
EZ1 一區擦除密碼 192-207 16 24-25 2
E1AC 一區擦除密碼錯誤計數 208-215 8 26 1
AZ1 應用區一 216-4311 4096 27-538 512
SC2 二區密碼 4312-4327 16 539-540 2
S2AC 二區密碼錯誤計數 4328-4335 8 541 1
EZ2 二區擦除密碼 4336-4351 16 542-543 2
E2AC 二區擦除密碼錯誤計數 4352-4359 8 544 1
AZ2 應用區二 4360-8455 4096 545-1056 512
SC3 三區密碼 8456-8471 16 1057-1058 2
S3AC 三區密碼錯誤計數 8472-8479 8 1059 1
EZ3 三區擦除密碼 8480-8495 16 1060-1061 2
E3AC 三區擦除密碼錯誤計數 8496-8503 8 1062 1
AZ3 應用區三 8504-12599 4096 1063-1574 512
SC4 四區密碼 12600-12615 16 1575-1576 2
S4AC 四區密碼錯誤計數 12616-12623 8 1577 1
EZ4 四區擦除密碼 12624-12639 16 1578-1579 2
E4AC 四區擦除密碼錯誤計數 12640-12647 8 1580 1
AZ4 應用區四 12648-16303 3656 1581-2037 457
MTZ 測試區 16304-16319 16 2038-2039 2
FUSE 熔絲 16352-16367
最後地址 16383 2047
註:擦、寫是兩種不同的操作,擦是位寫1操作,寫是位寫0操作。修改數據時,只有先擦除才能再寫數據。
在熔絲熔斷(FUSE2)前與熔絲熔斷後它的保密特性是不同的。

熔絲熔斷前的保密特性:
FZ:由ATMEL公司出廠時設置(FUSE1),只讀不可更改,不等分卡一般為0F0F,等分卡一般為7156。ATMEL公司可以為批量用戶定製此代碼,以保證卡片的唯一性。
IZ:可讀。SC核對正確,IZ可以反覆擦寫。
SC:SC核對正確時,SC可讀和擦寫,SC核對不正確時,SC不能讀和擦寫。
SCAC:初始值為8,SC核對每錯1次SCAC減1,SCAC等於0時,卡自毀,如果SC核對正確SCAC恢復為初始值8。SCAC永遠可讀。
CPZ:為用戶標註,用於對卡中信息操作過程的標註,永遠可讀,SC核對正確后可擦寫。
SC1,SC2,SC3,SC4,EZ1,EZ2,EZ3,EZ4:熔絲熔斷(FUSE2)前,不起什麼作用。SC核對正確時,SCn、EZn可讀和擦寫(n代表1或2或3或4,下同),
S1AC,S2AC,S3AC,S4AC,E1AC,E2AC,E3AC,E4AC:永遠可讀,熔絲熔斷(FUSE2)前,不起什麼作用。SC核對正確時,SnAC、EnAC可擦寫,
AZ1,AZ2,AZ3,AZ4;前2位為AZn的寫讀保護位,即防寫位(nPR),讀保護位(nRD)。 SC核對正確時,AZn可讀,如果SC核對不正確時,nRD控制著AZn的可讀性,即如果nRD=1時,AZn可讀;如果nRD=0時,AZn不可讀。
在熔絲熔斷(FUSE2)前,nPR不起作用,只要SC核對正確,AZn就可擦寫,
MTZ:用於測試卡的擦寫性能。任意條件下均可測試。 熔絲熔斷後的保密特性:
FZ:由ATMEL公司出廠時設置(FUSE1),只讀不可更改,不等分卡一般為0F0F,等分卡一般為7156。ATMEL公司可以為批量用戶定製此代碼,以保證卡片的唯一性。
IZ:永遠可讀。但熔絲熔斷(FUSE2)后IZ內容被固化,IZ將永遠不能再改。
SC:不可讀,SC核對正確時,SC可擦寫,SC核對不正確時,SC不能擦寫。
SCAC:初始值為8,SC核對每錯1次SCAC減1,SCAC等於0時,卡自毀,如果SC核對正確SCAC恢復為初始值8。SCAC永遠可讀。
CPZ:為用戶標註,用於對卡中信息操作過程的標註,永遠可讀,SC核對正確后可擦寫。
SC1,SC2,SC3,SC4:不可讀,SC核對正確時,SCn可校對,SC核對不正確時,SCn不能校對。SCn核對正確時,SCn可擦寫。
S1AC,S2AC,S3AC,S4AC:初始值為8,SCn核對每錯1次SnAC減1,SnAC等於0時,n區自毀,如果SCn核對正確SnAC恢復為初始值8。SnAC永遠可讀。
EZ1,EZ2,EZ3,EZ4:不可讀,SCn核對正確時,EZn可校對,SCn核對不正確時,EZn不能校對。EZn核對正確時,EZn可擦寫。
E1AC,E2AC,E3AC,E4AC:初始值為8,EZn核對每錯1次EnAC減1,EnAC等於0時,n區自毀,如果EZn核對正確EnAC恢復為初始值8。EnAC永遠可讀。
AZ1,AZ2,AZ3,AZ4;前2位為AZn的寫讀保護位,即防寫位(nPR),讀保護位(nRD)。 SCn核對正確時,AZn可讀,如果SCn核對不正確時,nRD控制著AZn的可讀性,即如果nRD=1時,AZn可讀;如果nRD=0時,AZn不可讀。
EZn核對正確時,AZn可擦, EZn核對不正確時,Azn不可擦。
在熔絲熔斷(FUSE2)后,即使SCn核對正確,也要看nPR是否為1,如果是0,AZ被防寫永遠不能寫。同時不可能再對EZ1進行讀和擦寫操作。
MTZ:用於測試卡的擦寫性能。任意條件下均可測試。

下面的偽碼程序在AT88SC1604卡完成初始化操作和在一應用區ADDR地址開始寫LEN個位元組,並讀出校對。
Open(AT88SC1604)
IF CheckSC(Pwd) = OK THEN 繼續 ELSE 非法卡
WriteCPZ(CPZ) ;可以寫一些系統標識
UpdateSC(NewPwd)
SetZone(1)
UpdateSC(NewPwd)
UpdateEZ(NewEZ)
Erase(ADDR,LEN)
Write(ADDR,LEN,WDATA)
RDATA = Read(ADDR,LEN)
IF WDATA = RDATA THEN 寫成功 ELSE 寫失敗
Fuse()
Close()
下面的偽碼程序判斷AT88SC1604卡是否是本系統支持的卡和對一應用區ADDR地址開始的LEN個位元組完成某種操作。
Open(AT88SC1604)
ReadCPZ(CPZ) ;讀出系統標識
if CPZ = 系統標識 THEN 繼續 ELSE 非法卡
IF CheckSC(Pwd) = OK THEN 繼續 ELSE 非法卡
SetZone(1)
RDATA = Read(ADDR,LEN)
<一些其它操作>
IF CheckSC(Pwd) = OK THEN 繼續 ELSE 非法卡
IF CheckEZ(Pwd) = OK THEN 繼續 ELSE 非法卡
Erase(ADDR,LEN)
Write(ADDR,LEN,WDATA)
RDATA = Read(ADDR,LEN)
IF WDATA = RDATA THEN 寫成功 ELSE 寫失敗
Close()
3.AT88SC1608加密卡
如果說AT88SC1064是在AT88SC102、AT24C16的基礎上作了一些改進的話,那麼AT88SC1608則是接觸式IC卡的一次成熟穩定的飛躍,在一卡多用上更能體現它的長處,它的保密性能強,讀寫速度快,無需先擦除就可以進行寫操作。
AT88SC1608加密卡時鐘頻率為1MHz,支持頁寫方式(16位元組/頁),如果以頁寫方式訪問的話,訪問時間為10ms(最大)/頁;工作電壓為2.7V—5.5V;寫/擦除次數為10萬次;數據保持100年;工作溫度為0—70℃;通訊協議符合ISO/IEC 7816-3同步協議。
尤其是AT88SC1608加密卡的高保密性能十分突出,除了帶加密邏輯,還具有高保密認證及反截取跟蹤技術,64位相互認證及認證錯誤計數器,錯誤計數8次。
AT88SC1608具有1個128位元組設置區和8個256位元組應用分區,8個區可以自由合併,分別受讀密碼、寫密碼(16套密碼、各3個位元組)控制,錯誤計數8次。
AT88SC1608共有17408位(2176位元組)存儲空間,其中前16K位(2K位元組)為應用區,后1K位(128位元組)為設置區。

存儲結構:(位元組地址以16進位表示)
存儲分區 $0 $1 $2 $3 $4 $5 $6 $7 地址
應用分區0(User0) 256位元組 $000
應用分區1(User1) 256位元組 $100
應用分區2(User2) 256位元組 $200
應用分區3(User3) 256位元組 $300
應用分區4(User4) 256位元組 $400
應用分區5(User5) 256位元組 $500
應用分區6(User6) 256位元組 $600
應用分區7(User7) 256位元組 $700
設置區 128位元組 $800


其中設置區存儲結構:(位元組地址以16進位表示)
$0 $1 $2 $3 $4 $5 $6 $7 地址
廠商信息 複位應答(ATR) 歷史代碼(HC) $00
廠商代碼(FZ) 保留 卡商代碼(CMC) $08
訪問許可權 AR0 AR1 AR2 AR3 AR4 AR5 AR6 AR7 $10
保留 $18
認證區 AAC 識別碼(Nc) $20
密文(Ci) $28
密鑰 密鑰(Gc) $30
測試區 測試區(MTZ) $38
密碼區 PAC 寫密碼0(WP0) PAC 讀密碼0(RP0) $40
PAC 寫密碼1(WP1) PAC 讀密碼1(RP1) $48
PAC 寫密碼2(WP2) PAC 讀密碼2(RP2) $50
PAC 寫密碼3(WP3) PAC 讀密碼3(RP3) $58
PAC 寫密碼4(WP4) PAC 讀密碼4(RP4) $60
PAC 寫密碼5(WP5) PAC 讀密碼5(RP5) $68
PAC 寫密碼6(WP6) PAC 讀密碼6(RP6) $70
PAC 寫密碼7(WP7/SC) PAC 讀密碼7(RP7) $78
註:哪個區用哪套密碼或是否要認證要由訪問許可權AR0-AR7 來決定。

ATR:複位應答,由ATMEL定義,不可改。
HC:歷史代碼,由ATMEL定義,不可改。
FZ:廠商代碼,由ATMEL定義,不可改。
CMC:卡商代碼,由卡廠定義,不可改。
AR0-7:訪問許可權。個人化前定義。(詳細用法參見訪問許可權)
Nc:識別碼,通常用作卡的唯一標識--卡號。個人化前定義。
Ci:密文,個人化前可寫一隨機數,認證卡時使用,每次認證會被自動改寫。
Gc:密鑰,64位的保密種子,由Nc通過F1公式推算出來,在個人化前,寫入卡中。個人化后不可訪問,認證時作為該卡的F2公式的參數。(詳細用法參見認證協議)
AAC:為認證錯誤計數器。初始值為8。
MTZ:用於測試卡的讀寫性能。任意條件下均可測試。
WP0-WP7,RP0-RP7:8套讀寫密碼集, 每個分區可以分別指向唯一的密碼集,也可以指向同一套密碼集,這樣就可以只核對一套密碼而進入多個分區,使多個分區合成為一個大的分區。默認WP7、RP7為讀寫密碼。寫密碼7(WP7)還作為傳輸密碼(SC)。另外,如果需要修改讀寫密碼時,也必須核對同一套密碼集的寫密碼。
SC:傳輸密碼。初始值由ATMEL定認,發到每個卡廠都不同。可以修改,在個人化前一直使用SC,個人化后其它密碼才會被用到。
PAC:為分區密碼錯誤計數器。初始值為8。

熔絲標誌(FUSE)
熔絲標誌位於設置區的$80地址,存儲結構:(地址以16進位表示)
位7 位6 位5 位4 位3 位2 位1 位0 地址
0 0 0 0 0 PER CMA FAB $80
註:FAB、CMA、FAB為AT88SC1608的EEPROM的三級熔絲保護標誌,“0”表示已熔斷。在熔絲標誌全為“1”時,所有的存儲空間都可讀。每一步熔斷操作都不能返回。
FAB為ATMEL的晶元出廠時的熔斷標誌。
CMA為卡廠的卡片出廠時的熔斷標誌。
PER為應用系統啟動前個人化時的熔斷標誌。

當我們把 AT88SC1608卡交付使用之前,卡內信息應已作完以下的操作:
ATMEL寫完廠商信息(除卡商代碼)、傳輸密碼(SC),把其餘的存儲空間都寫成“1”,做FAB熔斷操作,使FAB=0。
卡廠寫入自已的卡商代碼后,做CMA熔斷操作,使CMA=0。
系統商對卡做初始化,或卡在發行之前由系統做初始化,然後做PER熔斷操作,使CMA=0。

訪問許可權
熔絲熔斷前後的訪問許可權表:
區 訪問 FAB=0 CMA=0 Per=0
廠商信息 (除卡商代碼) 讀 可以 可以 可以
寫 禁止 禁止 禁止
卡商代碼 讀 可以 可以 可以
寫 傳輸密碼(SC) 禁止 禁止
訪問許可權 讀 可以 可以 可以
寫 傳輸密碼(SC) 傳輸密碼(SC) 禁止
認證區 讀 可以 可以 可以
寫 傳輸密碼(SC) 傳輸密碼(SC) 禁止
密鑰 讀 傳輸密碼(SC) 傳輸密碼(SC) 禁止
寫 傳輸密碼(SC) 傳輸密碼(SC) 禁止
測試區 讀 可以 可以 可以
寫 可以 可以 可以
密碼 讀 傳輸密碼(SC) 傳輸密碼(SC) 寫密碼(WP)
寫 傳輸密碼(SC) 傳輸密碼(SC) 寫密碼(WP)
PAC(計數器) 讀 可以 可以 可以
寫 傳輸密碼(SC) 傳輸密碼(SC) 寫密碼(WP)
應用區 讀 訪問許可權(AR) 訪問許可權(AR) 訪問許可權(AR)
寫 訪問許可權(AR) 訪問許可權(AR) 訪問許可權(AR)

訪問許可權AR0-AR7的存儲結構:(使能為“0”,默認為“1”)
位7 位6 位5 位4 位3 位2 位1 位0
WPE RPE ATE PW2 PW1 PW0 MDF PGO
WPE:為寫密碼使能標誌。值為0時,對應用分區進行寫操作時,必須通過寫密碼。在個人化后,核對寫密碼,也決定著是否能改變讀密碼和寫密碼。
RPE:為讀密碼使能標誌。值為0時,通過讀密碼或寫密碼,才能讀某應用分區。如果密碼核對錯誤將返回熔絲狀態位。
ATE:認證使能標誌。為0時,認證必須通過才能操作當前應用分區。
PW2,PW1,PW0:這3位指定當前應用分區使用哪一套密碼集。每個分區可以分別指向唯一的密碼集,也可以指向同一套密碼集,這樣就可以只核對一套密碼而進入多個分區,使多個分區合成為一個大的分區。
MDF:為禁止修改操作標誌。值為0時,當前應用分區被防寫,被防寫區的內容必須在個人化之前寫入。
PGO:只寫標誌。如果為0,當前應用分區的每一位只能從“1”寫成“0”,而不能從“0”改回為“1”。

認證協議
產出隨機數Nc(往往當作卡號)和Ci,計算出Gc=F1(Ks,Nc),把Nc、Ci、Gc寫入卡中
卡 Nc Gc Ci 認證協議 讀寫器 Ks Q0(隨機數)
識別碼: Nc Ci Ci+1=F2(Gc,Ci,Q0); if(Ci+1==Q1) Ci+2=F2(Gc,C1+1); Ci=Ci+2; //修改Ci 認證正確; else Ci=Ci; 認證錯誤; Ci (使用讀命令) (初始化認證命令) (校驗認證命令) (讀命令) Gc=F1(Ks,Nc); Q0 Q1=F2(Gc,Ci,Q0); Q1 Q2=F2(Gc,Q1); if(Q2=Ci) 認證正確; else 認證錯誤;
F1演算法:64BIT 用戶自定義演算法。
F2演算法:卡內64BIT 演算法(Des 演算法的變種,提供C語言和51彙編語言程序)
該協議包括卡和讀寫器CPU的互相認證(ELVA專利),而且認證數據加密傳送,可以防止通訊數據被竊取。

下面的偽碼程序在AT88SC1608卡完成初始化操作和在一應用區ADDR地址開始寫LEN個位元組,並讀出校對。
Open(AT88SC1608)
IF CheckSC(Pwd) = OK THEN 繼續 ELSE 非法卡
InitAuth(Nc,Ci,Gc)
SetZone(1)
SetAR(AR)
UpdateWP(NewWP)
UpdateRP(NewRP)
Write(ADDR,LEN,WDATA)
RDATA = Read(ADDR,LEN)
IF WDATA = RDATA THEN 寫成功 ELSE 寫失敗
Fuse()
Close()
下面的偽碼程序判斷AT88SC1608卡是否是本系統支持的卡和對一應用區ADDR地址開始的LEN個位元組完成某種操作。
Open(AT88SC1608)
CheckAuth(Gc)
SetZone(1)
IF CheckRP(Pwd) = OK THEN 繼續 ELSE 非法卡
RDATA = Read(ADDR,LEN)
<一些其它操作>
IF CheckWP(Pwd) = OK THEN 繼續 ELSE 非法卡
Write(ADDR,LEN,WDATA)
RDATA = Read(ADDR,LEN)
IF WDATA = RDATA THEN 寫成功 ELSE 寫失敗
Close()
4.AT88SC153加密卡
AT88SC153是ATMEL繼AT88SC1068之後新推出的一種卡型,它繼承了AT88SC1608的全部優點,只是存儲容量及分區數有所改變,基本上可以理解為小容量的AT88SC1608。
AT88SC153加密卡時鐘頻率為1MHz,支持頁寫方式(8位元組/頁),如果以頁寫方式訪問的話,訪問時間為10ms(最大)/頁;工作電壓為2.7V—5.5V;寫/擦除次數為10萬次;數據保持100年;工作溫度為0—70℃;通訊協議符合ISO/IEC 7816-3同步協議。
與AT88SC1608一樣,AT88SC153加密卡的高保密性能十分突出,除了帶加密邏輯,還具有高保密認證及反截取跟蹤技術,64位相互認證及認證錯誤計數器,錯誤計數8次。
AT88SC153具有1個64位元組設置區和3個64位元組應用分區,3個區可以自由合併,分別受讀密碼、寫密碼(4套密碼、各3個位元組)控制,錯誤計數4/8次。
AT88SC153共有2048位(256位元組)存儲空間,其中前1536位(192位元組)為應用區,后512位(64位元組)為設置區。

存儲結構:(位元組地址以16進位表示)
存儲分區 $0 $1 $2 $3 $4 $5 $6 $7 地址
應用分區0(User0) 64位元組 $00
應用分區1(User1) 64位元組 $40
應用分區2(User2) 64位元組 $80
設置區 64位元組 $C0

其中設置區存儲結構:(位元組地址以16進位表示)
$0 $1 $2 $3 $4 $5 $6 $7 地址
廠商信息 複位應答(ATR) 歷史代碼(HC) $00
廠商代碼(FZ) 卡商碼(CMC) AR0 AR1 AR2 MTZ $08
識別區 發布號(IC) $10
DCR 識別碼(Nc) $18
AAC 密文(Ci) $20
密鑰 密鑰(Gc) $28
密碼區 PAC 寫密碼0(WP0) PAC 讀密碼0(RP0) $30
PAC 寫密碼1(WP1/SC) PAC 讀密碼1(RP1) $38
註:哪個區用哪套密碼或是否要認證要由訪問許可權AR0-AR2 來決定。
在採用校驗和認證方式時,地址$20也可以用作校驗和認證寄存器(CAR)。

ATR:複位應答,由ATMEL定義,不可改。
HC:歷史代碼,由ATMEL定義,不可改。
FZ:廠商代碼,由ATMEL定義,不可改。
CMC:卡商代碼,由卡廠定義,不可改。
AR0-2:訪問許可權。個人化前定義。(詳細用法參見訪問許可權)
MTZ:用於測試卡的讀寫性能。任意條件下均可測試。
IC:發布號。個人化前定義。。
DCR:設備設置寄存器。
Nc:識別碼,通常用作卡的唯一標識--卡號。個人化前定義。
Ci:密文,個人化前可寫一隨機數,認證卡時使用,每次認證會被自動改寫。
Gc:密鑰,64位的保密種子,由Nc通過F1公式推算出來,在個人化前,寫入卡中。個人化后不可訪問,認證時作為該卡的F2公式的參數。(詳細用法參見認證協議)
AAC:為認證錯誤計數器。初始值為8,但每次校驗出錯減2,所以共有4次連續校驗出錯的機會,可擴展為8次(見DCR的設置方法)。也用作Ci的一部分,注意如果修改了AAC,會影響下一次認證的Ci值。
CAR:校驗和認證寄存器。只有認證完成時才有用,每次寫操作都會激活校驗和方式,並把寫或連續寫的校驗和自動寫入CAR,此時可以讀出校驗和,以確定寫操作是否完成。任何讀操作都會結束校驗和方式。
WP0,WP1,RP0,RP1:2套讀寫密碼集, 每個分區可以分別指向唯一的密碼集,也可以指向同一套密碼集,這樣就可以只核對一套密碼而進入多個分區,使多個分區合成為一個大的分區。默認WP1、RP1為讀寫密碼。寫密碼1(WP1)還作為傳輸密碼(SC)。另外,如果需要修改讀寫密碼時,也必須核對同一套密碼集的寫密碼。
SC:傳輸密碼。初始值由ATMEL定認,發到每個卡廠都不同。可以修改,在個人化前一直使用SC,個人化后其它密碼才會被用到。
PAC:為分區密碼錯誤計數器。初始值為8,但每次校驗出錯減2,所以共有4次連續校驗出錯的機會。可擴展為8次。(見DCR的設置方法)

熔絲標誌(FUSE)
熔絲標誌位於設置區的$40地址,存儲結構:(地址以16進位表示)
位7 位6 位5 位4 位3 位2 位1 位0 地址
0 0 0 0 0 PER CMA FAB $40
註:FAB、CMA、FAB為AT88SC153的EEPROM的三級熔絲保護標誌,“0”表示已熔斷。在熔絲標誌全為“1”時,所有的存儲空間都可讀。每一步熔斷操作都不能返回。
FAB為ATMEL的晶元出廠時的熔斷標誌。
CMA為卡廠的卡片出廠時的熔斷標誌。
PER為應用系統啟動前個人化時的熔斷標誌。

當我們把 AT88SC153卡交付使用之前,卡內信息應已作完以下的操作:
ATMEL寫完廠商信息(除卡商代碼、訪問許可權和測試區)、傳輸密碼(SC),把其餘的存儲空間都寫成“1”,做FAB熔斷操作,使FAB=0。
卡廠寫入自已的卡商代碼后,做CMA熔斷操作,使CMA=0。
系統商對卡做初始化,或卡在發行之前由系統做初始化,然後做PER熔斷操作,使CMA=0。

訪問許可權
熔絲熔斷前後的訪問許可權表:
區 訪問 FAB=0 CMA=0 Per=0
廠商信息 (除CMC,AR,MTZ) 讀 可以 可以 可以
寫 禁止 禁止 禁止
卡商代碼 讀 可以 可以 可以
寫 傳輸密碼(SC) 禁止 禁止
訪問許可權 讀 可以 可以 可以
寫 傳輸密碼(SC) 傳輸密碼(SC) 禁止
測試區 讀 可以 可以 可以
寫 可以 可以 可以
識別區 讀 可以 可以 可以
寫 傳輸密碼(SC) 傳輸密碼(SC) 禁止
密鑰 讀 傳輸密碼(SC) 傳輸密碼(SC) 禁止
寫 傳輸密碼(SC) 傳輸密碼(SC) 禁止
密碼 讀 傳輸密碼(SC) 傳輸密碼(SC) 寫密碼(WP)
寫 傳輸密碼(SC) 傳輸密碼(SC) 寫密碼(WP)
PAC(計數器) 讀 可以 可以 可以
寫 傳輸密碼(SC) 傳輸密碼(SC) 寫密碼(WP)
應用區 讀 訪問許可權(AR) 訪問許可權(AR) 訪問許可權(AR)
寫 訪問許可權(AR) 訪問許可權(AR) 訪問許可權(AR)

訪問許可權AR0-AR2的存儲結構:(使能為“0” ,默認為“1”)
位7 位6 位5 位4 位3 位2 位1 位0
WPE RPE ATE AOW PWS WLM MDF PGO
WPE:為寫密碼使能標誌。值為0時,對應用分區進行寫操作時,必須通過寫密碼。在個人化后,核對寫密碼,也決定著是否能改變讀密碼和寫密碼。
RPE:為讀密碼使能標誌。值為0時,通過讀密碼或寫密碼,才能讀某應用分區。如果密碼核對錯誤將返回熔絲狀態位。
ATE:認證使能標誌。為0時,認證必須通過才能操作當前應用分區。
AOW:只有寫時才需要認證標誌。只有寫操作時才需要進行認證,讀不需要進行認證操作,如果ATE=0,則AOW被忽略。
PWS:指定當前應用分區使用哪一套密碼集。每個分區可以分別指向唯一的密碼集,也可以指向同一套密碼集,這樣就可以只核對一套密碼而進入多個分區,使多個分區合成為一個大的分區。
WLM:寫鎖模式使能。每個區的8個位元組為一頁。如果WLM=0,使每頁的第一個位元組(byte0)的每一位分別為該頁8個位元組的寫鎖標誌,0為寫鎖(即只能從“1”寫成“0”,而不能從“0”改回為“1”),1為解鎖。
MDF:為禁止修改操作標誌。值為0時,當前應用分區被防寫,被防寫區的內容必須在個人化之前寫入。
PGO:只寫標誌。如果為0,當前應用分區的每一位只能從“1”寫成“0”,而不能從“0”改回為“1”。


設備設置寄存器(DCR)
設備設置寄存器位於設置區的$18地址,存儲結構:(使能為“0”,默認為“1”)
位7 位6 位5 位4 位3 位2 位1 位0
SME UCR UAT ETA CS3 CS2 CS1 CS0
CS0-CS3:可編程片選。ATMEL出廠時寫為$B(即1011)。它為訪問卡的所有命令字的高4位。
ETA:8次計數使能。ETA=0,可以使AAC和PAC的計數次數為8,否則為4。
UAT:使認證錯誤計數無校標誌。UAT=0,AAC無校,否則AAC有校。
UCR:不限制讀校驗和次數標誌。UCR=1時,每次認證只能讀校驗和方式一次(默認),UCR=0時,沒有次數限制。
SME:超級管理方式。SME=0時,通過1WP校驗,就可以讀寫全部的讀寫密碼及密碼錯誤計數器。

認證協議
產出隨機數Nc(往往當作卡號)和Ci,計算出Gc=F1(Ks,Nc),把Nc、Ci、Gc寫入卡中
卡 Nc Gc Ci 認證協議 讀寫器 Ks Q0(隨機數)
識別碼: Nc Ci Ci+1=F2(Gc,Ci,Q0); if(Ci+1==Q1) Ci+2=F2(Gc,C1+1); Ci=Ci+2; //修改Ci 認證正確; else Ci=Ci; 認證錯誤; Ci (使用讀命令) (初始化認證命令) (校驗認證命令) (讀命令) Gc=F1(Ks,Nc); Q0 Q1=F2(Gc,Ci,Q0); Q1 Q2=F2(Gc,Q1); if(Q2=Ci) 認證正確; else 認證錯誤;
F1演算法:64BIT 用戶自定義演算法。
F2演算法:卡內64BIT 演算法(Des 演算法的變種,提供C語言和51彙編語言程序)
該協議包括卡和讀寫器CPU的互相認證(ELVA專利),而且認證數據加密傳送,可以防止通訊數據被竊取。

下面的偽碼程序在AT88SC153卡完成初始化操作和在一應用區ADDR地址開始寫LEN個位元組,並讀出校對。
Open(AT88SC153)
IF CheckSC(Pwd) = OK THEN 繼續 ELSE 非法卡
WriteIC(IC) ;寫發布號
WriteDCR(DCR)
InitAuth(Nc,Ci,Gc)
SetZone(1)
SetAR(AR)
UpdateWP(NewWP)
UpdateRP(NewRP)
Write(ADDR,LEN,WDATA)
RDATA = Read(ADDR,LEN)
IF WDATA = RDATA THEN 寫成功 ELSE 寫失敗
Fuse()
Close()

下面的偽碼程序判斷AT88SC153卡是否是本系統支持的卡和對一應用區ADDR地址開始的LEN個位元組完成某種操作。
Open(AT88SC153)
ReadIC(IC) ;讀出發布號
if IC = 發布號 THEN 繼續 ELSE 非法卡
CheckAuth(Gc)
SetZone(1)
IF CheckRP(Pwd) = OK THEN 繼續 ELSE 非法卡
RDATA = Read(ADDR,LEN)
<一些其它操作>
IF CheckWP(Pwd) = OK THEN 繼續 ELSE 非法卡
Write(ADDR,LEN,WDATA)
RDATA = Read(ADDR,LEN)
IF WDATA = RDATA THEN 寫成功 ELSE 寫失敗
Close()
三、AT45D041
這種型號的IC卡為ATMEL存儲卡,是一種不具備加密功能大容量的FLASH 存儲卡,存儲容量為4M位,主存儲區有2048頁(每頁容量為264位元組),同時還提供兩個獨立雙向的數據緩存區(每個數據緩存區容量為264位元組),頁寫方式為264位元組,頁寫入時間為7ms。存儲結構簡單,主要用於存放一些保密性要求不高、數據量極大的數據,如聲音、圖像或數據。
AT45D041的工作頻率為10MHz(最大);工作電壓為5V±10%;工作電流讀為25mA,寫為50mA;數據保持100年;工作溫度為0—70℃,根據要求可超過指定工作溫度;通訊協議為SPI串列介面方式0和方式3。

緩存區1、緩存區2和主存儲區的讀寫方式如上圖所示,分別為:
1. 直接從主存儲區的某頁讀數據;
2. 把主存儲區的某頁數據寫入緩存區1或緩存區2;
3. 把主存儲區的某頁數據和緩存區1或緩存區2的數據進行比較;
4. 把緩存區1或緩存區2的數據寫入主存儲區的某頁(帶內建式擦除);
5. 把緩存區1或緩存區2的數據寫入主存儲區的某頁(不6. 帶內建式擦除);
7. 把數據寫入主存儲區的某頁;
8. 自動頁回寫;
9. 讀緩存區1、緩存區2;
10. 寫緩存區1、緩存區2;
11. 讀狀態位。

狀態位結構:
位7 位6 位5 位4 位3 位2 位1 位0
忙閑 比較 0 1 1 x x x
註:位7為0表示忙;為1表示閑,可以接收下一條指令。
位6為0表示主存儲區數據與緩存區比較匹配,否則為不匹配。
位5、位4、位3對於AT45D041為“011”(二進位)。

下面的偽碼程序通過AT45D041卡的緩存1更新主存儲區的頁1的某些數據:
OpenCard(AT45D041)
SetPage(1)
SetBuff(1)
PageToBuff()
WHILE ReadStatus() = Busy LOOP
WriteBuff(Addr,Len,cData)
BuffToPage()
WHILE ReadStatus() = Busy LOOP
AutoRWrite()
WHILE ReadStatus() = Busy LOOP
Close()

OpenCard(AT45D041)
SetPage(1)
SetBuff(1)
WritePage(Addr,Len.cData)
WHILE ReadStatus() = Busy LOOP
AutoRWrite()
WHILE ReadStatus() = Busy LOOP
Close()

下面的偽碼程序通過AT45D041卡的緩存1頁寫主存儲區的頁1:
OpenCard(AT45D041)
SetPage(1)
SetBuff(1)
WriteBuff(0,264,cData)
BuffToPage()
WHILE ReadStatus() = Busy LOOP
Close()

OpenCard(AT45D041)
SetPage(1)
SetBuff(1)
WritePage(0,264.cData)
WHILE ReadStatus() = Busy LOOP
Close()

註:本章內容可為用戶在接觸式IC卡選型時參考。


第二章 接觸式IC卡的介面函數
IC卡軟體應用系統的開發是在讀寫器提供的介面函數基礎上進行軟體開發的。每個系統公司的介面函數雖有不同,但大同小異。下面以德誠系統有限公司的MCS-C接觸式IC卡通用讀寫器提供的FoxPro for DOS的PLB介面函數為例,用戶由此可基本上對接觸式IC卡介面函數有所了解。
在FoxPro程序執行開始前,先執行語句SET LIBRARY TO ICFOX.PBL。FoxPro將會自動登錄庫ICFOX.PLB中的IC卡函數,您可以象使用FoxPro的內部函數一樣的使用介面函數。編譯成EXE文件時,將ICFOX.PLB鏈入。
1、 函數列表(函數名2? , 簡單說明)
1. 通用函數
InitComm 初始化指定的串口並連接讀寫設備
ExitComm 退出串口連接
ErrorMsg 返回錯誤信息
GetInfo 獲取設備的版本號

TestCard 測試讀寫器內是否插卡
OpenCard 打開對某種型號卡的操作
ReadChr 從卡上指定地址讀取指定長度的字元串
WriteChr 向卡內指定地址寫入指定長度的字元串
ReadInt 從卡上指定地址讀取一個雙精度數
WriteInt 向卡內指定地址寫入一個雙精度數
CloseCard 關閉卡操作
2? ATMEL AT88SC102/AT88SC1604加密卡專用函數
ReadFZ 讀廠商代碼
ReadIZ 讀卡商代碼
ReadCPZ 讀代碼保護區
WriteCPZ 寫代碼保護區
ReadMTZ 讀測試區
WriteMTZ 寫測試區

SetZone 選擇應用區
CheckSC 比較密碼(或區密碼)
UpdateSC 更新密碼(或區密碼)
ReadSCAC 讀密碼(或區密碼)校驗錯誤計數
CheckEZ 比較區擦除密碼
UpdateEZ 更新區擦除密碼
ReadEAC 讀區擦除密碼校驗錯誤計數
Erase 從卡內指定位置起擦除指定長度位元組

Fuse 燒斷卡上熔絲
3? ATMEL AT88SC1608及AT88SC153加密卡專用函數
ReadFZ 讀廠商代碼
ReadIZ 讀卡商代碼
ReadIC 讀發布號(AT88SC153專用)
WriteIC 寫發布號(AT88SC153專用)
ReadDCR 讀設備設置寄存器(AT88SC153專用)
WriteDCR 寫設備設置寄存器(AT88SC153專用)
ReadMTZ 讀測試區
WriteMTZ 寫測試區

InitAuth 初始化認證狀態
CheckAuth 認證校驗
ReadAAC 讀認證錯誤計數

CheckSC 比較傳輸密碼
UpdateSC 更新傳輸密碼
ReadSCAC 讀傳輸密碼校驗錯誤計數

SetZone 選擇應用區
ReadAR 讀應用區的訪問許可權
WriteAR 設置應用區的訪問許可權

CheckWP 比較寫密碼
UpdateWP 更新寫密碼
ReadWPAC 讀寫密碼校驗錯誤計數
CheckRP 比較讀密碼
UpdateRP 更新寫密碼
ReadRPAC 讀讀密碼校驗錯誤計數

FuseStatus 讀取卡內熔絲狀態
Fuse 燒斷卡上熔絲
4? ATMEL AT45D041 Flash存儲卡專用函數
SetPage 選擇主存儲區的當前頁
SetBuff 選擇緩衝區
ReadPage 讀取主存儲區頁內的字元
ReadBuff 讀取緩衝區1/緩衝區2內的字元
WritePage 寫字元到主存儲區頁
WriteBuff 寫字元到緩衝區1/緩衝區2
CompPB 比較主存儲區頁與緩衝區1/緩衝區2的內容
PageToBuff 從主存儲區頁提取數據到緩衝區1/緩衝區2
BuffToPage 從緩衝區1/緩衝區2寫數據到主存儲區頁
ReadStatus 讀狀態字(忙閑)
AutoRWrite 自動回寫
3、 函數說明
InitComm(Port)
說明:初始化指定的串口並連接讀寫設備。
參數:Port----串口標號,整數0,1分別代表串口1,串口2。
返回值: =0,正確。
<>0,出錯。返回值代表錯誤號。
舉例:Ret = InitComm(0) 初始化串口1。

ExitComm()
說明:退出串口連接。
參數:無。
返回值: =0,正確。
<>0,出錯。返回值代表錯誤號。
舉例:Ret = ExitComm() 退出串口。

ErrorMsg(ErrNo)
說明:返回錯誤信息。
參數:錯誤號。
返回值: 錯誤信息。
舉例:Msg = ErrorMsg(0) 返回“成功”。

GetInfo()
說明:獲取設備的版本號。
參數:無。
返回值: 設備的版本號。
舉例:Vno = GetInfo()。

TestCard()
說明:測試讀寫器內是否插卡。
參數:無。
返回值: =0,正確。
<0,讀寫器內沒有插卡。返回值代表錯誤號。
舉例:Ret = TestCard()

OpenCard(CardType)
說明:打開對某種型號卡的操作
參數:CardType----IC卡類型。具體值參見附錄一。
返回值: =0,正確。
<>0,出錯。返回值代表錯誤號。
舉例:Ret = OpenCard(AT24C01A) 選擇卡型為AT24C01A。

ReadChr(Addr,Len)
說明:從卡上指定地址讀取指定長度的字元串。
參數:Addr----讀操作的卡內起始地址。
Len----字元串長度。
返回值:從卡上讀取的字元串。
讀操作出錯。返回""。
舉例:cData = ReadChr(0, 10) 從卡上應用區地址0讀取10個字元。

WriteChr(Addr,Len,cData)
說明:將指定長度的字元串寫入到卡片的指定起始地址上。
參數:Addr----寫操作的卡內起始地址。
Len----字元串長度。
cData----要向卡片寫入的字元串。
返回值: =0,正確。
<0,寫操作出錯。返回值代表錯誤號。
舉例:Ret = WriteChr(0, 14, "Testing MCS-C!") 將字元串寫入卡地址0處。

ReadInt(Addr)
說明:從卡上指定的起始地址讀取一個雙精度數。
參數:Addr----讀操作的卡內起始地址。
返回值:從卡上讀取的雙精度數。
舉例:iData = ReadInt(0) 從卡上應用區地址0讀取雙精度數。

WriteInt(Addr,iData)
說明:將一個雙精度數寫入到卡內指定起始地址處。
參數:Addr----寫操作的卡內起始地址。
iData----要向卡內寫入的雙精度數。
返回值: =0,正確。
<0,寫操作出錯。返回值代表錯誤號。
舉例:Ret = WriteInt(0, 12345.6789) 將12345.6789寫入到卡內地址0處。

CloseCard()
說明:關閉卡操作
參數:無。
返回值: =0,正確。
<>0,出錯。返回值代表錯誤號。
舉例:Ret = CloseCard()

ReadFZ()
說明:讀廠商代碼。
參數:無。
返回值:從卡上讀取廠商代碼(16進位字元串)。
讀操作出錯。返回""。
舉例:FZ = ReadFZ()

ReadIZ()
說明:讀卡商代碼。
參數:無。
返回值:從卡上讀取卡商代碼(16進位字元串)。
讀操作出錯。返回""。
舉例:IZ = ReadIZ()

ReadCPZ()
說明:讀代碼保護區。
參數:無。
返回值:從卡上讀取代碼保護區(16進位字元串)。
讀操作出錯。返回""。
舉例:CPZ = ReadCPZ()

WriteCPZ(CPZ)
說明:寫代碼保護區。
參數:長度為為16個位元組的字元串(16進位字元串)。
返回值: =0,正確。
<>0,出錯。返回值代表錯誤號。
舉例:Ret = WriteCPZ("0123456789ABCDEF")

ReadMTZ()
說明:讀測試區。
參數:無。
返回值:從卡上讀取代碼保護區(16進位字元串)。
讀操作出錯。返回""。
舉例:MTZ = ReadMTZ()

WriteMTZ(MTZ)
說明:寫測試區。
參數:字元串(16進位字元串)。
返回值: =0,正確。
<>0,出錯。返回值代表錯誤號。
舉例:Ret = WriteMTZ("ABCDEF")

SetZone(Zone)
說明:選擇應用區。
參數:Zone----要選擇的應用區號。0-n代表應用區0至應用區n。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = SetZone(1)

CheckSC(SC)
說明:比較密碼(或區密碼)。
參數:字元串(16進位字元串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = CheckSC("FFFF")

UpdateSC(SC)
說明:更新密碼(或區密碼)。
參數:字元串(16進位字元串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = UpdateSC("9999")

ReadSCAC()
說明:讀密碼(或區密碼)校驗錯誤計數。
參數:無。
返回值:密碼校驗錯誤計數值。
舉例:SCAC = ReadSCAC()

CheckEZ(EZ)
說明:比較擦除密碼(或區擦除密碼)。
參數:字元串(16進位字元串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = CheckEZ("FFFF")

UpdateEZ(EZ)
說明:更新擦除密碼(或區擦除密碼)。
參數:字元串(16進位字元串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = UpdateEZ("9999")

ReadEZAC()
說明:讀擦除密碼(或區擦除密碼)校驗錯誤計數。
參數:無。
返回值:密碼校驗錯誤計數值。
舉例:EZAC = ReadEZAC()

Erase(Addr,Len)
說明:從指定位置起擦除指定長度的位元組。
參數:Addr----要擦除的起始地址。
Len----要擦除的長度。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = Erase(0, 10)

Fuse()
說明:燒斷卡上熔絲。
參數:無。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = Fuse()

ReadIC()
說明:讀發布號(AT88SC153專用)。
參數:無。
返回值:發布號(16進位字元串)。
舉例:Ret = ReadIC()

WriteIC(IC)
說明:寫發布號(AT88SC153專用)。
參數:字元串(16進位字元串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = WriteIC("012456789ABCDEF")

ReadDCR()
說明:讀設備設置寄存器(AT88SC153專用)。
參數:無。
返回值:設備設置寄存器的值(16進位字元串)。
舉例:Ret = ReadDCR()

WriteDCR(DCR)
說明:寫設備設置寄存器(AT88SC153專用)。
參數:字元串(16進位字元串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = WriteDCR("FF")

InitAuth(Nc,Ci,Gc)
說明:初始化認證協議。
參數:Nc----識別碼。
Ci----密文。
Gc----密鑰。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = InitAuth(Nc,Ci,Gc)

CheckAuth(Gc)
說明:認證協議。
參數:Gc----密鑰。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = CheckAuth(Gc)

ReadAAC()
說明:讀認證錯誤計數。
參數:無。
返回值:認證校驗錯誤計數值。
舉例:AAC = ReadAAC()

ReadAR()
說明:讀應用區的訪問許可權。
參數:無。
返回值:當前訪問區許可權位元組(16進位字元串)。
舉例:AR = ReadAR()

WriteAR(AR)
說明:設置應用區的訪問許可權。
參數:AR----當前訪問區許可權位元組(16進位字元串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = WriteAR("FF")

CheckWP(WP)
說明:比較當前區寫密碼。
參數:字元串(16進位字元串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = CheckWP("FFFFFF")

UpdateWP(WP)
說明:更新當前區寫密碼。
參數:字元串(16進位字元串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = UpdateWP("999999")

ReadWPAC()
說明:讀當前區寫密碼校驗錯誤計數。
參數:無。
返回值:當前區寫密碼校驗錯誤計數值。
舉例:WPAC = ReadWPAC()

CheckRP(RP)
說明:比較當前區讀密碼。
參數:字元串(16進位字元串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = CheckRP("FFFFFF")

UpdateRP(RP)
說明:更新當前區讀密碼。
參數:字元串(16進位字元串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = UpdateRP("999999")

ReadRPAC()
說明:讀當前區讀密碼校驗錯誤計數。
參數:無。
返回值:當前區讀密碼校驗錯誤計數值。
舉例:RPAC = ReadRPAC()

FuseStatus()
說明:讀取卡內熔絲狀態
參數:無。
返回值: =0,已熔。
=1,未熔。
舉例:PER = FuseStatus()

SetPage(Page)
說明:選擇主存儲區的當前頁。
參數:Page----要選擇的頁號。1-n代表頁1至頁n。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = SetPage(1)

SetBuff(Buff)
說明:選擇緩衝區。
參數:Buff----要選擇的緩衝區。1,2代表緩衝區1,緩衝區2。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = SetBuff(1)

ReadPage(Addr,Len)
說明:讀取主存儲區頁內的字元。
參數:Addr----要讀取的起始位元組地址。
Len----要讀取的長度。
返回值:返回的數據字元串。
舉例:cData = ReadPage(0,10)

ReadBuff(Addr,Len)
說明:讀取緩衝區內的字元。
參數:Addr----要讀取的起始位元組地址。
Len----要讀取的長度。
返回值:返回的數據字元串。
舉例:cData = ReadBuff(0,10)

WritePage(Addr,Len,cData)
說明:寫字元到主存儲區頁。
參數:Addr----要寫入的起始位元組地址。
Len----要寫入的長度。
cData----用於存放寫入卡片的數據的字元串。
返回值: =0,正確。
<0,返回值代表錯誤號。
舉例:Ret = WritePage(0,10,"1234567890")

WriteBuff(Addr,Len,cData)
說明:寫字元到緩衝區。
參數:Addr----要寫入的起始位元組地址。
Len----要寫入的長度。
cData----用於存放寫入緩衝區的數據的字元串。
返回值: =0,正確。
<0,返回值代表錯誤號。
舉例:Ret = WriteBuff(0,10,"1234567890")

CompPB()
說明:比較主存儲區頁與緩衝區的內容。
參數:無。
返回值: =0,正確。
<0,返回值代表錯誤號。
舉例:Ret = CompPB()

PageToBuff()
說明:主存儲區內容向緩衝區傳送。
參數:無。
返回值: =0,正確。
<0,返回值代表錯誤號。
舉例:Ret = PageToBuff()

BuffToPage()
說明:從緩衝區寫數據到主存儲區頁。
參數:無。
返回值: =0,正確。
<0,返回值代表錯誤號。
舉例:Ret = BuffToPage()

ReadStatus()
說明:讀狀態字(忙閑)
參數:無。
返回值: =0,閑。
<0,返回值代表忙或錯誤號。
舉例:Ret = ReadStatus()

AutoRWrite()
說明:自動回寫。
參數:無。
返回值: =0,正確。
<0,返回值代表錯誤號。
舉例:Ret = AutoRWrite()
附錄一:卡類型預定義
AT24C01 = 0
AT24C01A = 1
AT24C02 = 2
AT24C04 = 3
AT24C08 = 4
AT24C16 = 5
AT24C32 = 6
AT24C64 = 7
AT24C128 = 8
AT24C256 = 9

AT88SC102 = 12
AT88SC1604_E = 15
AT88SC6603 = 15
AT88SC1604_N = 16
AT88SC6601 = 16
AT88SC1608 = 17
AT88SC153 = 18

AT45D041 = 23
附錄二:ICFOX.PLB測試常式
SET TALK OFF
SET LIBR TO ICFOX
? ErrorMsg(InitComm(0))
? ErrorMsg(TestCard(0))
? ErrorMsg(OpenCard(1))
? ErrorMsg(WriteChr(0,10,”0123456789”))
rData=ReadChr(0,10)
=Close()
IF rData <> “0123456789”
? “讀卡錯誤”
ELSE
? “測試正常”
ENDIF
RETURN
第三章 接觸式IC卡底層軟體開發實例
對了更好地說明接觸式IC卡讀寫器是如果工作的,本章公布了部分德誠系統有限公司MCS-C讀寫器低層CPU的C51程序,包括了IC卡操作底層函數,以AT24C64卡為例的實常式序。這些程序是根據德誠系統有限公司實際使用的函數向用戶公開的,也可供其它打算生產接觸式IC卡讀寫器的廠家參考,以便開發自已的IC卡驅動函數。
??2 IC卡操作底層函數
1? IC卡操作底層函數說明:
IC卡座的引腳定義示意圖如下:

VCC [C1] [C5] GND
RESET [C2] [C6] No Use
CLK [C3] [C7] I / O
FUS [C4] [C8] PGM

void _CardSetPower(uchar Level);
功能:將IC卡讀寫器Vcc段上電或下電。
輸入:Level
當Level=1,給IC卡讀寫器上電。
當Level=0,給IC卡讀寫器下電。
輸出:無

void _CardSetReset(uchar Level);
功能:置IC卡讀寫器Reset高或低。
輸入:Level
當Level=1,給IC卡讀寫器Reset端置高。
當Level=0,給IC卡讀寫器Reset端置低。
輸出:無

void _CardSetClock(uchar Level);
功能:置IC卡讀寫器Clock高或低。
輸入:Level
當Level=1,給IC卡讀寫器Clock置高。
當Level=0,給IC卡讀寫器Clock置低。
輸出:無

void _CardSetPGM(uchar Level);
功能:置IC卡讀寫器PGM高或低。
輸入:Level
當Level=1,給IC卡讀寫器PGM置高。
當Level=0,給IC卡讀寫器PGM置低。
輸出:無

void _CardSetFUS(uchar Level);
功能:置IC卡讀寫器FUS高或低。
輸入:Level
當Level=1,給IC卡讀寫器FUS置高。
當Level=0,給IC卡讀寫器FUS置低。
輸出:無

void _CardPutIO(uchar IOData);
功能:將數據由IC卡讀寫器IO端輸出。
輸入:IOData輸出數據,值是0或1。
輸出:無

uchar _CardReadIO();
功能:讀取IC卡讀寫器IO端數據
輸入:無
輸出:IC卡輸出的數據,值是0或1。
2? IC卡低層通訊頭文件(Base.h)
低層通訊函數用戶可根據自已的設備編寫。
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/****************************************************
IC卡低層通訊頭文件:
****************************************************/
void _CardSetPower(uchar Level);
void _CardSetReset(uchar Level);
void _CardSetClock(uchar Level);
void _CardSetPGM(uchar Level);
void _CardSetFUS(uchar Level);
void _CardPutIO(uchar IOData);
uchar _CardReadIO();
2? AT24C64卡應用實例
1.AT24C64卡函數頭文件(AT24C64.h)
/****************************************************
the AT24C64 Card Declare:
****************************************************/
uchar AT24C64_Open();
uchar AT24C64_Read(uint Addr,uint DataLen,uchar *DataBuff);
uchar AT24C64_Write(uint Addr,uint DataLen,uchar* DataBuff);
uchar AT24C64_Close();
2.AT24C64卡函數
//**********************************************************
//* This is source of 24C64.LIB *
//* This program demo how to program 24C64.LIB *
//**********************************************************
#include <Base.h>
#include <AT24C64.h>

void AT24C64_Pulse();
void AT24C64_Start();
void AT24C64_Stop();
void AT24C64_OutB(uchar OutData);
uchar AT24C64_InB();

/*******************************
This function used by the
external user's function
*******************************/
void AT24C64_Pulse()
{
_CardSetClock(1);
_CardSetClock(0);
}
void AT24C64_Start()
{
_CardPutIO(1); _CardSetClock(1);
_CardPutIO(0); _CardSetClock(0);
}
void AT24C64_Stop()
{
_CardPutIO(0); _CardSetClock(1);
_CardPutIO(1); _CardSetClock(0);
}

void AT24C64_OutB(uchar OutData)
{
uchar i;
for (i = 0;i < 8;i++)
{
if ( (OutData & 0x80) == 0x80 ) _CardPutIO(1); else _CardPutIO(0);
AT24C64_Pulse(); OutData = OutData << 1;
}
_CardPutIO(1); AT24C64_Pulse();
}

uchar AT24C64_InB()
{
uchar i,InData = 0;
for (i = 0;i < 8;i++)
{
InData = InData << 1; _CardSetClock(1);
InData = InData + _CardReadIO(); _CardSetClock(0);
}
return InData;
}

/***************************************
This function used by user
****************************************/
// open card
uchar AT24C64_Open()
{
uchar i,InData,TmpSt[10];
_CardSetPower(1);
_CardSetClock(0);
_CardSetReset(0);
_CardSetReset(1);
_CardPutIO(1);
AT24C64_Pulse();
_CardSetReset(0);
for(i = 0;i < 4;i++) TmpSt[i] = AT24C64_InB();
if (TmpSt[0] == 0xFF) return 1;
if (TmpSt[1] == 0xFF) return 1;
if (TmpSt[2] == 0xFF) return 1;
if (TmpSt[3] == 0xFF) return 1;
return 0;
}

uchar AT24C64_Read(uint Addr,uint DataLen,uchar *DataBuff)
{
uint i;

_CardSetReset(1); _CardSetReset(0);
AT24C64_Start();
AT24C64_OutB(0xA0);
AT24C64_OutB((uchar)(Addr >> 8));
AT24C64_OutB((uchar)Addr);
AT24C64_Start();
_CardPutIO(1);
AT24C64_OutB(0xA1);
for (i = 0;i < DataLen;i++) {
*(DataBuff + i) = AT24C64_InB();
_CardPutIO(0); AT24C64_Pulse(); _CardPutIO(1);
}
AT24C64_Stop();
for (i = 0;i < 32; i++) AT24C64_Pulse();
return 0;
}

uchar AT24C64_Write(uint Addr,uint DataLen,uchar* DataBuff)
{
uint i;

for (i = 0;i < DataLen;i++) {
AT24C64_Start();
AT24C64_OutB(0xA0);
AT24C64_OutB((uchar)((Addr + i) >> 8));
AT24C64_OutB((uchar)(Addr + i));
AT24C64_OutB(*(DataBuff + i));
AT24C64_Stop();
_Delay(20);
}
return 0;
}

uchar AT24C64_Close()
{
// set power pin low
_CardPutIO(0);
_CardSetClock(0);
_CardSetReset(0);
_CardSetPower(0);
return 0;
}
3? AT24C64卡應用常式(App24C64.c)
#include<AT24C64.h>

uchar _App24C64(uchar *cData)
{
AT24C64_Open();
AT24C64_Write(0x0050, 16,cData);
AT24C64_Close();

AT24C64_Open();
AT24C64_Read(0x0050, 16,cData);
AT24C64_Close();

return 0x00;
}

第一章 ATMEL CPU卡簡介
AT89SC系列是低電壓、高性能的8位微處理器。內含可編程的FLASH、只可一次編程的內存單元(PEROM)和電可擦寫數據存儲單元(EEPROM)。該89SC系列產品運用ATMEL的高密度CMOS工藝製造,同工業標準的80C51和80C52指令集相兼容。
AT90SC系列產品與ATMEL的AVR指令集相兼容,內部帶有協處理器。
通過將FLASH和一個多性能的8位微處理器集成在單一片上,AT89SC/90SC系列為多種智能卡的應用提供了高度靈活和性能完備的解決方案。
值得一提的是,AT89SC/90SC具有專為智能卡應用而設計的特性:如符合ISO7816標準的串列介面,隨機數發生器,電源和頻率保護邏輯。

Device Name Flash EEPROM RAM
AT89SC168 16 K bytes 8 K bytes 256 bytes
AT89SC168A 16 K bytes 8 K bytes 512 bytes
AT89SC1616A 16 K bytes 16 K bytes 512 bytes
AT90SC3232 32 K bytes 32K bytes 1.5Kbytes
AT90SC3232C (協處理器) 32 K bytes 32K bytes 1K bytes

我們為喜愛用ATMEL CPU卡和設計COS的客戶提供了如下的解決方案:
Help customers to use DEMOCOS and design their own COS.
--幫助客戶使用DEMOCOS和設計自己的COS。
DEMOCOS ( source code ) : it is a completed COS, supports ISO-7816 command and t=0 protocol.
--DEMOCOS(提供源代碼)是一個完整的COS,支持ISO-7816 命令和T=0協議。
51 ASSEMBLER COMPILER: --51彙編語言編譯器
COS (for AT89SC168 ) SOFTWARE SIMULATOR:
--COS 軟體模擬器(支持AT89SC168)。
READER SOFTWARE SIMULATOR:
--讀卡器軟體模擬器。
READER(support T=0) for upload COS:
--可以下載COS的讀卡器。
第二章 ATMEL AT89SC系列CPU卡介紹
ATMEL公司的AT89SC系列CPU卡微處理器集成了FLASH程序存儲器、EEPROM數據存儲器和ISO7816通訊介面,並且引腳符合ISO7816標準。
該CPU卡的FLASH程序存儲器是可以讓用戶自行下載的,這樣就可以保證用戶的COS源代碼不會泄露出去。更為優異的是:是否可以重新下載FLSAH完全由用戶的COS來設置,這樣可以實現重複可下載和一次性下載兩種模式。
AT89SC系列微處理器提供了兩種軟體控制的低電壓工作方式:
閑置模式:CPU停止工作,晶元上其他部分繼續工作。在閑置狀態下,電流大約是晶元處於完全工作狀態時電流的15%。
休眠模式: 晶元上一切活動均被掛起,RAM中還保留數據。在休眠狀態下,晶元的電流通常低於15A,最低可達到0.6A。
同時,由於晶元使用靜態邏輯設計,無須時鐘持續工作。這就是說,在等待一個內部事件的觸發時,時鐘頻率可以減緩,甚至停止。
安全特性:
AT89SC系列微處理器提供了下述安全特性:
低電壓保護;
低頻保護,防止靜態分析;
高頻濾波,防止干擾;
傳輸代碼,保護晶元在運輸過程中不被盜用;
唯一系列代碼;
當時鐘頻率低於500KHz或電壓低於4V時,晶元會產生一個安全保護中斷;
當時鐘頻率高於10MHz或電壓低於3V時,晶元處於複位狀態,直至電壓或時鐘頻率恢復正常;
晶元在運輸過程及初始化時受到64位的傳輸代碼的保護。
Device Name Flash EEPROM RAM
AT89SC168 16 K bytes 8 K bytes 256 bytes
AT89SC168A 16 K bytes 8 K bytes 512 bytes
AT89SC1616A 16 K bytes 16 K bytes 512 bytes


第三章 ATMEL 89SC168卡 DemoCos 簡介
如果用戶獲得了一套ATMEL 168 DEMOCOS,即使不做任何改動,就可以利用它靈活地創建自己的文件和安全系統。DEMOCOS的代碼大小為4.5K,分為通訊模塊、文件系統模塊、和演算法模塊,但是認證演算法比較簡單,如果想改變演算法(這是目前大多數客戶的想法),請將DEMOCOS讀懂(這有一定的挑戰性,但DEMOCOS是模塊化編程,註釋詳細)后重寫演算法,也可以添加其他的功能,用戶還有很多的程序空間可用。
另外,由於ATMEL的CPU卡的不斷更新,如容量大小的改變,通訊方式的改變,以及REBOOT方式的改變,ATMEL公司會指導用戶對DEMOCOS做相應的調整。

一、文件系統

1、文件分類
設多層目錄:MF(3F00)、DF(具體應用目錄,最多可以建立15級目錄)
EF分為SF、KF和WF:
SF是密碼文件,各層目錄均可有一個,存放用戶密碼。
KF是密鑰文件,各層目錄均可有一個,存放發行商密鑰。
WF是工作文件,數據文件EF。
支持兩種標準EF文件結構:線性定長記錄、透明二進位。
本結構支持一卡多用。

2、文件訪問方式
使用文件標識符(FID)進行訪問:
每一文件中有兩位元組長的標識符,允許不同的文件具有相同的標識符,在直接處於給定DF下的所有EF和DF應具有不同的文件標識符。
使用短EF文件標識符(SFI)進行訪問:
短EF文件標識符用5位二進位碼(1~30)表示。短EF文件標識符不能用在路徑中或作為文件標識符,如不能用在Select File命令中進行選擇。

3、數據訪問方式
訪問記錄:
在記錄結構的EF中,可以用記錄編號訪問記錄數據。記錄編號是一個無符號的8位整數,其可用值為01H~FEH,00H保留於專用,FFH保留於將來使用。
訪問數據單元:
在透明二進位結構的EF文件中,每一個數據單元的位置由命令的偏移值給出,其下一個數據單元的位置由偏移值加數據單元長度后產生。

二、安全系統

1、密碼和密鑰管理
1)密碼類型
SF文件最多由4個密碼記錄組成,密碼編號從0到3依次排列。其中:
0號密碼默認為用戶個人密碼;
1號密碼默認為解鎖密碼(發行商用);
2號密碼默認為個人化密碼(發行商用);
3號密碼默認為重裝密碼(發行商用);

2)密鑰
KF文件最多由8個密鑰記錄組成,密碼編號從0到7依次排列

2、安全規程
①卡的確認:內部鑒別(鑒別密鑰)。
②終端確認:外部鑒別(鑒別密鑰)。
③持卡人確認:PIN密碼提交驗證。
④發行者確認:發行密碼提交驗證。
⑤其他密碼驗證。
⑥對安全系統文件進行寫操作時的反插拔與自動恢復。

三、命令系統

1、命令報文
1)命令結構:

命令頭 命令體
CLA INS P1 P2 Lc Data Le

 

 

2)命令分類:
COS命令由具體應用分為4種命令報文結構如下:
①情形1
CLA INS P1 P2 ‘00’
②情形2
CLA INS P1 P2 Le
?情形3
CLA INS P1 P2 Lc Data
?情形4
CLA INS P1 P2 Lc Data Le

2、響應報文
1)響應結構

響應數據 響應狀態碼
Data SW1 SW1

DATA: 返回給用戶的數據,即命令的執行結果。
SW1、SW2: 返回命令處理的狀態。

3、命令集

1)Read Binary
功能:
此命令用於讀取二進位文件部分或全部的內容。
格式:
代碼 值
CLA ‘00’
INS ‘B0’
P1 見參數說明
P2 從文件中讀取的第一位元組的偏移地址
Le 期望讀出數據的長度

2)Update Binary
功能:
此命令使用給定的數據來更新二進位文件部分或全部的內容。
格式:
代碼 值
CLA ‘00’
INS ‘D6’
P1 見參數說明
P2 要修改的第一位元組的偏移地址
Lc 後續數據域的長度
Data 修改用的數據

3)Read Record
功能:
此命令用於讀取記錄文件中指定記錄的內容。
格式:
代碼 值
CLA ‘00’
INS ‘B2’
P1 記錄號
P2 見參數說明
Le 期望讀出數據的長度

4)Update record
功能:
此命令使用給定的數據來更新記錄文件中指定記錄的內容。當所指定的文件非記錄文件時,命令將終止。
格式:
代碼 值
CLA ‘00’
INS ‘DC’
P1 P1=‘00’表示當前記錄 P1≠‘00’表示指定的記錄號
P2 見參數說明
Lc 後續數據域的長度
Data 更新原有記錄的新記錄

5)Verify PIN
功能:
此命令將校驗給定的密碼的正確性,根據比較的結果修改安全狀態,若校驗失敗次數達到PIN嘗試上限,則PIN自動鎖定。
格式:
代碼 值
CLA ‘00’
INS ‘20’
P1 ‘00’
P2
Lc ’02’~‘10’
Data 外部輸入的個人密碼

6)Select File
功能:
此命令使用文件名或應用標示符來選擇IC卡內DF或EF。
格式:
代碼 值
CLA ‘00’
INS ‘A4’
P1 ‘00’
P2 ‘00’
Lc ‘00’(選擇MF文件)/ ‘02’
Data 無 / FID

7)Get Challenge
功能:
此命令請求IC卡返回一個用於安全相關過程的隨機數。
格式:
代碼 值
CLA ‘00’
INS ‘84’
P1 ‘00’
P2 ‘00’
Le ‘04’

8)Get Response
功能:
此命令為T=0協議情形4狀態下,用來取卡中返回的數據。
格式:
代碼 值
CLA ‘00’
INS ‘C0’
P1 ‘00’
P2 ‘00’
Le 響應的期望數據最大長度

9)Internal Authenticate
功能:
此命令將為外部設備驗證卡中的秘密模塊的有效性提供數據。
格式:
代碼 值
CLA ‘00’
INS ‘88’
P1 ‘00’
P2 ‘00’~‘07’密鑰號
Lc ‘04’
Data 外部隨機數(4位元組)

10)External Authenticate
功能:
此命令將驗證外部設備中的秘密模塊的有效性。
格式:
代碼 值
CLA ‘00’
INS ‘82’
P1 ‘00’
P2 ‘00’ ~‘07’密鑰號
Lc ‘0C’
Data 發卡方認證數據

11)Change / Unlock PIN
功能:修改、解鎖、安裝卡片個人密碼。
格式:
代碼 值
CLA ‘00’
INS ‘5E’
P1 ‘00’ 修改卡片個人密碼;‘01’ 解鎖卡片個人密碼;‘02’ 安(重)裝卡片個人密碼
P2 密碼號
Lc
Data
12)Unlock Key
功能:
解鎖卡片應用密鑰。
格式:
代碼 值
CLA ‘00’
INS ‘5C’
P1 ‘01’ 解鎖應用密鑰 ‘02’ 安裝卡片應用密鑰
P2 密鑰號
Lc 無 / 密鑰長度
Data 無 / 加密的密鑰

13)Create File
功能:
此命令創建卡片文件系統。
格式:
代碼 值
CLA ‘00’/ ’80’
INS ‘F2’
P1 ‘00’/ FTP 文件類型
P2 ‘00’/ FAC 文件訪問控制條件
Lc 無 / ‘07’
Data
第四章 AT90SC3232C帶有協處理器的CPU卡
AT90SC3232C是ATMEL公司最新推出的內含協處理器的CPU卡,它以高性能、低功耗的AVR 8位CPU為核心,配合一個16位的協處理器(SC16)完成高速的保密和認證功能。

1)AT90SCC系列CPU卡的型號如下:
型號 程序空間 EEPROM空間 RAM空間 協處理器 RF介面
AT90SC1616C 16K Flash 16K 1K YES NO
AT90SC3232 32K Flash 32K 1K NO NO
AT90SC3232C 32K Flash 32K 1K YES NO
AT90SC3232CRF 32K ROM 32K 1K YES YES

2)AT90SC3232C的特徵如下:
高效、低功耗的AVR RISC CPU:含有120條指令,大多數指令為單個時鐘周期;
32K位元組(16K字)的可下載一千次的程序存儲器;
32K位元組的EEPROM數據存儲器;
1K位元組RAM;
16位協處理器,預編程功能可用於保密和認證,一次1024位RSA的演算法用220ms;
監管模式(存儲器管理);
ISO-7816介面;
隨機數發生器;
16位定時器;
5個中斷源,兩個優先順序;
安全特徵:掉電保護,低頻保護,高頻濾波,程序代碼加密;
低功耗閑置模式和掉電模式;
2.7V-5.5V的工作電壓。

一、AT90SC3232C結構概述:
AT90SC3232C是基於AVR RISC增強型結構,有32個工作寄存器均可以單時鐘周期訪問,高性能的ALU(算術邏輯單元)可在一個時鐘周期內完成取指、運算、和輸出結果的工作。ALU的操作分為3類:算術、邏輯和位操作功能。
在32個工作寄存器中,有6個寄存器可以被組成3對16位的間接定址指針X、Y、Z。用以提高數據空間的訪問速度,其中一個指針還可以用於常數查表。

圖1,AT90SC3232C結構圖

I/O空間包括64個地址,用於CPU對外設的訪問,如對控制寄存器、定時/計數器、外部中斷及ISO 7816引腳的訪問。
AVR CPU採用哈佛結構,程序區和數據區是分開的,程序存儲器使用單級管道流水線訪問,即:當一條指令被執行時,下條指令被預先取出,這種機制使得在每個時鐘周期CPU都可以執行指令。
AT90SCC 的程序計數器(PC)是16位,可以訪問64K字的地址空間,大多數的AVR指令都採用16位的字結構。

二、協處理器和RAM
AT90SC3232C內含一個16位的協處理器(SC16)和1K位元組的RAM,可以方便地實現公共密鑰演算法(如RSA),它與AVR CPU的介面採用RAM X空間而RAM Y空間被協處理器用做工作區。
公共密鑰演算法(簡稱公鑰演算法)簡介:演算法使用2個密鑰,公共密鑰(簡稱公鑰)和私有密鑰(簡稱私鑰),他們是一對兒。當一個密鑰用於加密時,僅有另一個密鑰可用於解密,關鍵特點是在實踐中從公鑰不能推出私鑰,也不能用公鑰來完成私鑰的解密過程,這樣就可以把公鑰公開而不會泄密。
公鑰演算法有兩個應用:一是信息加密傳送,二是認證(如數字簽名)。
RSA演算法是公鑰演算法的一種,他基於數學上的對大數分解因子的難度。演算法中私鑰包括兩個互質的大數P、Q,和一個冪E,公鑰包含一個大數N=P*Q和冪E。設M(明文)是0至N-1之間的數。
則加密過程如下:
密文C=MEmod(N)
而解密過程相反。
AT90SC3232C的協處理器(SC16)可以實現公鑰和私鑰的運算,但是並不能直接生成密鑰。它有三個主要的運算功能(均可以對1024位的數據操作)。
1.“LOAD MODULUS”功能,即裝載N。
2.“LOAD PRIMES”功能,即裝載P、Q。
3.“MODULAR EXPONENTIATION”模冪運算功能。
模冪運算的操作為:DataEXPmod(Modulus),[按照符合中國剩餘原理或者不符合的規則]。顯然,模冪運算功能的實現大大加快了RSA演算法的運算過程。

三、ISO-7816介面:AT90SC3232C的引腳符合ISO-7816標準。
ISO-7816的介面包含以下引腳:
GND:地線;
VCC:電源;
I/O:串列數據;
CLK:時鐘;
RST:複位;
I/O口由I/0控制寄存器的某一位來控制(置位/清除),輸入由I/O數據寄存器的某一位來獲得,I/O口也可以產生中斷。

四、安全保護機制
AT90SC3232C片內含有監管系統,該系統可以管理內存,監督用戶程序對內存的非法操作。
為了防止外部對晶元的探測,AT90SC3232C還具有如下措施:
內部匯流排特殊處理,外觀沒有明顯結構,數據和地址匯流排均被埋入金屬層之下。
程序和數據均可以擾亂加密,在ATMEL工廠可以完成對匯流排的熔絲,使得同一條指令在不同的位置時代碼也不同,用戶還可以設置自己的擾亂密鑰。

五、結束語
AT90SC3232C是新一代的高速保密控制器,它具有高度的保密性和高速運算的能力,因此,它非常適用於商業銀行的金融業務、政府及軍警的機要通信業務。
 


[admin via 研發互助社區 ] ATMEL接觸式IC卡及開發實例已經有8430次圍觀

http://cocdig.com/docs/show-post-45090.html