ATMEL接觸式IC卡及開發(fā)實例
文章出處:http://56733.cn 作者:單片機技術(shù)網(wǎng) 人氣: 發(fā)表時間:2011年09月17日
目 錄
第一章 幾種常見的ATMEL接觸式IC卡的存儲結(jié)構(gòu)及其保密特性 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卡的接口函數(shù) 19
一、函數(shù)列表(函數(shù)名, 簡單說明) 19
1.通用函數(shù) 19
2.ATMEL AT88SC102/AT88SC1604加密卡專用函數(shù) 19
3.ATMEL AT88SC1608及AT88SC153加密卡專用函數(shù) 20
4.ATMEL AT45D041 Flash存儲卡專用函數(shù) 20
二、函數(shù)說明 21
附錄一:卡類型預(yù)定義 29
附錄二:ICFOX.PLB測試例程 30
第三章 接觸式IC卡底層軟件開發(fā)實例 31
一、IC卡操作底層函數(shù) 31
1.IC卡操作底層函數(shù)說明: 31
2.IC卡低層通訊頭文件(Base.h) 32
二、AT24C64卡應(yīng)用實例 32
1.AT24C64卡函數(shù)頭文件(AT24C64.h) 32
2.AT24C64卡函數(shù) 33
3.AT24C64卡應(yīng)用例程(App24C64.c) 35
第一章 幾種常見的ATMEL接觸式IC卡的存儲結(jié)構(gòu)及其保密特性
為了能夠使IC卡應(yīng)用到自已的系統(tǒng)中,系統(tǒng)開發(fā)公司的工程師應(yīng)了解一些卡的基本技術(shù)資料,下面就ATMEL公司生產(chǎn)的接觸式IC卡在應(yīng)用中常見的和性能比較好的型號做一簡單介紹,希望能對IC卡的選型及開發(fā)有所幫助。
??1 AT24C01A、AT24C02、AT24C04、AT24C08、AT24C16、AT24C32、AT24C64
這幾個型號的IC卡為ATMEL存儲卡,是一種不具備加密功能的EEPROM卡,AT24C為系列號,數(shù)字部分為K位容量,分別為1K、2K、4K、8K、16K、32K、64K位。它的使用方法與EEPROM完全相同,存儲結(jié)構(gòu)簡單,只有讀寫兩種操作功能,主要用于存放一些保密性要求不高的數(shù)據(jù)。
AT24C系列的工作頻率為1MHz(5V),1MHz(2.7V),400KHz(1.8V);工作電壓為5V±10%,根據(jù)要求最低可至1.8V;Icc電流讀最大為1mA,寫最大為3mA;寫/擦除次數(shù)為100萬次;數(shù)據(jù)保持100年;工作溫度為0—70℃,根據(jù)要求可超過指定工作溫度;通訊協(xié)議符合ISO/IEC 7816-3同步協(xié)議,雙線串行接口。
存儲結(jié)構(gòu):
AT24C系列型號的后兩位數(shù)字為該型號的最大K位數(shù)(1K=1024),8位為1字節(jié),最大字節(jié)存儲容量的算法為K位數(shù)×1024÷8。如:AT24C01A的最大存儲容量的1×1024÷8=128,其字節(jié)地址空間為0—127(16進制為0x00—0x7F)。
下面的偽碼程序在AT24C系列卡的ADDR地址開始寫LEN個字節(jié),并且讀出校對。
Open(AT24Cxxx)
Write(ADDR,LEN,WDATA)
RDATA = Read(ADDR,LEN)
Close()
IF WDATA = RDATA THEN 寫成功 ELSE 寫失敗
下面的偽碼程序在AT24C系列卡的ADDR地址開始讀LEN個字節(jié)。
Open(AT24Cxxx)
RDATA = Read(ADDR,LEN)
Close()
二、AT88SC102、AT88SC1604、AT88SC1608、AT88SC153
這幾個型號的IC卡為ATMEL加密卡,采用CMOS低功耗技術(shù),具有傳輸代碼、生產(chǎn)代碼,密碼及錯誤計數(shù)器、熔絲保護等安全保護功能。存儲空間分成設(shè)置區(qū)和應(yīng)用區(qū)兩大功能區(qū),應(yīng)用區(qū)又可分為不同的分區(qū),每個區(qū)具有各自獨立的保密功能。從型號上看,AT88SC為系列號,最后一位數(shù)字為應(yīng)用區(qū)分區(qū)數(shù),分別為2、4、8、3個分區(qū),中間的數(shù)字10、160、15為K位容量,分別為1K、16K、16K、1.5K位。其中不同應(yīng)用分區(qū)另有自已的分區(qū)密碼。AT88SC1604又可分為等分區(qū)卡和不等分區(qū)卡兩種。
1.AT88SC102加密卡
AT88SC102加密卡的訪問時間讀為2us/位,寫為5ms/位;工作電壓為5V±10%;寫/擦除次數(shù)為10萬次;數(shù)據(jù)保持100年;工作溫度為-25—70℃;通訊協(xié)議符合ISO/IEC 7816-3同步協(xié)議。
存儲結(jié)構(gòu):
存儲分區(qū) 位地址 位數(shù) 字節(jié)地址 字節(jié)數(shù)
FZ 廠商代碼區(qū) 0-15 16 0-1 2
IZ 發(fā)行者區(qū) 16-79 64 2-9 8
SC 主密碼區(qū) 80-95 16 10-11 2
SCAC 主密碼錯誤計數(shù)區(qū) 96-111 16 12-13 2
CPZ 代碼保護區(qū) 112-175 64 14-21 8
AZ1 應(yīng)用區(qū)一 176-687 512 22-85 64
EZ1 一區(qū)擦除密碼 688-735 48 86-91 6
AZ2 應(yīng)用區(qū)二 736-1247 512 92-155 64
EZ2 二區(qū)擦除密碼 1248-1279 32 156-159 4
EAC2 二區(qū)擦除密碼錯誤計數(shù) 1280-1407 128 160-175 16
MTZ 測試區(qū) 1408-1423 16 176-177 2
注:擦、寫是兩種不同的操作,擦是位寫1操作,寫是位寫0操作。修改數(shù)據(jù)時,只有先擦除才能再寫數(shù)據(jù)。
在熔絲熔斷(FUSE2)前與熔絲熔斷后它的保密特性是不同的。
熔絲熔斷前的保密特性:
FZ:由ATMEL公司出廠時設(shè)置(FUSE1),只讀不可更改。ATMEL公司可以為批量用戶定制此代碼,以保證卡片的唯一性。
IZ:可讀。SC核對正確,IZ可以反復(fù)擦寫。
SC:SC核對正確時,SC可讀和擦寫,SC核對不正確時,SC不能讀和擦寫。
SCAC:初始值為4,SC核對每錯1次SCAC減1,SCAC等于0時,卡自毀,如果SC核對正確SCAC恢復(fù)為初始值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公司出廠時設(shè)置(FUSE1),只讀不可更改。ATMEL公司可以為批量用戶定制此代碼,以保證卡片的唯一性。
IZ:永遠可讀。但熔絲熔斷(FUSE2)后IZ內(nèi)容被固化,IZ將永遠不能再改。
SC:不可讀,SC核對正確時,SC可擦寫,SC核對不正確時,SC不能擦寫。
SCAC:初始值為4,SC核對每錯1次SCAC減1,SCAC等于0時,卡自毀,如果SC核對正確SCAC恢復(fù)為初始值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次計數(shù)減1。
MTZ:用于測試卡的擦寫性能。任意條件下均可測試。
下面的偽碼程序在AT88SC102卡完成初始化操作和在一應(yīng)用區(qū)ADDR地址開始寫LEN個字節(jié),并讀出校對。
Open(AT88SC102)
IF CheckSC(Pwd) = OK THEN 繼續(xù) ELSE 非法卡
WriteCPZ(CPZ) ;可以寫一些系統(tǒng)標識
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卡是否是本系統(tǒng)支持的卡和對一應(yīng)用區(qū)ADDR地址開始的LEN個字節(jié)完成某種操作。
Open(AT88SC102)
ReadCPZ(CPZ) ;讀出系統(tǒng)標識
if CPZ = 系統(tǒng)標識 THEN 繼續(xù) ELSE 非法卡
IF CheckSC(Pwd) = OK THEN 繼續(xù) ELSE 非法卡
SetZone(1)
RDATA = Read(ADDR,LEN)
<一些其它操作>
IF CheckEZ(Pwd) = OK THEN 繼續(xù) 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%;寫/擦除次數(shù)為10萬次;數(shù)據(jù)保持10年;工作溫度為0—70℃;通訊協(xié)議符合ISO/IEC 7816-3同步協(xié)議。
AT88SC1604又可分為等分區(qū)卡和不等分區(qū)卡兩種,它們各區(qū)和熔絲地址不一樣。二、三、四應(yīng)用區(qū)不等分區(qū)卡沒有區(qū)密碼錯誤計數(shù),而等分區(qū)卡有,不等分區(qū)卡在性能上比較明顯地偏重第一區(qū)。在選擇AT88SC1604卡時應(yīng)注意它是不等分區(qū)卡還是等分區(qū)卡。
不等分區(qū)卡的存儲結(jié)構(gòu):(二、三、四應(yīng)用區(qū)沒有區(qū)密碼錯誤計數(shù))
存儲分區(qū) 位地址 位數(shù) 字節(jié)地址 字節(jié)數(shù)
FZ 廠商代碼區(qū) 0-15 16 0-1 2
IZ 發(fā)行者區(qū) 16-79 64 2-9 8
SC 主密碼區(qū) 80-95 16 10-11 2
SCAC 主密碼錯誤計數(shù)區(qū) 96-103 8 12 1
CPZ 代碼保護區(qū) 104-167 64 13-20 8
SC1 一區(qū)密碼 168-183 16 21-22 2
S1AC 一區(qū)密碼錯誤計數(shù) 184-191 8 23 1
EZ1 一區(qū)擦除密碼 192-207 16 24-25 2
E1AC 一區(qū)擦除密碼錯誤計數(shù) 208-215 8 26 1
AZ1 應(yīng)用區(qū)一 216-9775 9560 27-1221 1195
SC2 二區(qū)密碼 9776-9791 16 1222-1223 2
EZ2 二區(qū)擦除密碼 9792-9807 16 1224-1225 2
E2AC 二區(qū)擦除密碼錯誤計數(shù) 9808-9815 8 1226 1
AZ2 應(yīng)用區(qū)二 9816-11863 2048 1227-1482 256
SC3 三區(qū)密碼 11864-11879 16 1483-1484 2
EZ3 三區(qū)擦除密碼 11880-11895 16 1485-1486 2
E3AC 三區(qū)擦除密碼錯誤計數(shù) 11896-11903 8 1487 1
AZ3 應(yīng)用區(qū)三 11904-13951 2048 1488-1743 256
SC4 四區(qū)密碼 13952-13967 16 1744-1745 2
EZ4 四區(qū)擦除密碼 13968-13983 16 1746-1747 2
E4AC 四區(qū)擦除密碼錯誤計數(shù) 13984-13991 8 1748 1
AZ4 應(yīng)用區(qū)四 13992-16039 2048 1749-2004 256
MTZ 測試區(qū) 16040-16055 16 2005-2006 2
FUSE 熔絲 16288-16303
最后地址 16383 2047
等分區(qū)卡的存儲結(jié)構(gòu):(二、三、四應(yīng)用區(qū)有區(qū)密碼錯誤計數(shù))
存儲分區(qū) 位地址 位數(shù) 字節(jié)地址 字節(jié)數(shù)
FZ 廠商代碼區(qū) 0-15 16 0-1 2
IZ 發(fā)行者區(qū) 16-79 64 2-9 8
SC 主密碼區(qū) 80-95 16 10-11 2
SCAC 主密碼錯誤計數(shù)區(qū) 96-103 8 12 1
CPZ 代碼保護區(qū) 104-167 64 13-20 8
SC1 一區(qū)密碼 168-183 16 21-22 2
S1AC 一區(qū)密碼錯誤計數(shù) 184-191 8 23 1
EZ1 一區(qū)擦除密碼 192-207 16 24-25 2
E1AC 一區(qū)擦除密碼錯誤計數(shù) 208-215 8 26 1
AZ1 應(yīng)用區(qū)一 216-4311 4096 27-538 512
SC2 二區(qū)密碼 4312-4327 16 539-540 2
S2AC 二區(qū)密碼錯誤計數(shù) 4328-4335 8 541 1
EZ2 二區(qū)擦除密碼 4336-4351 16 542-543 2
E2AC 二區(qū)擦除密碼錯誤計數(shù) 4352-4359 8 544 1
AZ2 應(yīng)用區(qū)二 4360-8455 4096 545-1056 512
SC3 三區(qū)密碼 8456-8471 16 1057-1058 2
S3AC 三區(qū)密碼錯誤計數(shù) 8472-8479 8 1059 1
EZ3 三區(qū)擦除密碼 8480-8495 16 1060-1061 2
E3AC 三區(qū)擦除密碼錯誤計數(shù) 8496-8503 8 1062 1
AZ3 應(yīng)用區(qū)三 8504-12599 4096 1063-1574 512
SC4 四區(qū)密碼 12600-12615 16 1575-1576 2
S4AC 四區(qū)密碼錯誤計數(shù) 12616-12623 8 1577 1
EZ4 四區(qū)擦除密碼 12624-12639 16 1578-1579 2
E4AC 四區(qū)擦除密碼錯誤計數(shù) 12640-12647 8 1580 1
AZ4 應(yīng)用區(qū)四 12648-16303 3656 1581-2037 457
MTZ 測試區(qū) 16304-16319 16 2038-2039 2
FUSE 熔絲 16352-16367
最后地址 16383 2047
注:擦、寫是兩種不同的操作,擦是位寫1操作,寫是位寫0操作。修改數(shù)據(jù)時,只有先擦除才能再寫數(shù)據(jù)。
在熔絲熔斷(FUSE2)前與熔絲熔斷后它的保密特性是不同的。
熔絲熔斷前的保密特性:
FZ:由ATMEL公司出廠時設(shè)置(FUSE1),只讀不可更改,不等分卡一般為0F0F,等分卡一般為7156。ATMEL公司可以為批量用戶定制此代碼,以保證卡片的唯一性。
IZ:可讀。SC核對正確,IZ可以反復(fù)擦寫。
SC:SC核對正確時,SC可讀和擦寫,SC核對不正確時,SC不能讀和擦寫。
SCAC:初始值為8,SC核對每錯1次SCAC減1,SCAC等于0時,卡自毀,如果SC核對正確SCAC恢復(fù)為初始值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公司出廠時設(shè)置(FUSE1),只讀不可更改,不等分卡一般為0F0F,等分卡一般為7156。ATMEL公司可以為批量用戶定制此代碼,以保證卡片的唯一性。
IZ:永遠可讀。但熔絲熔斷(FUSE2)后IZ內(nèi)容被固化,IZ將永遠不能再改。
SC:不可讀,SC核對正確時,SC可擦寫,SC核對不正確時,SC不能擦寫。
SCAC:初始值為8,SC核對每錯1次SCAC減1,SCAC等于0時,卡自毀,如果SC核對正確SCAC恢復(fù)為初始值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區(qū)自毀,如果SCn核對正確SnAC恢復(fù)為初始值8。SnAC永遠可讀。
EZ1,EZ2,EZ3,EZ4:不可讀,SCn核對正確時,EZn可校對,SCn核對不正確時,EZn不能校對。EZn核對正確時,EZn可擦寫。
E1AC,E2AC,E3AC,E4AC:初始值為8,EZn核對每錯1次EnAC減1,EnAC等于0時,n區(qū)自毀,如果EZn核對正確EnAC恢復(fù)為初始值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卡完成初始化操作和在一應(yīng)用區(qū)ADDR地址開始寫LEN個字節(jié),并讀出校對。
Open(AT88SC1604)
IF CheckSC(Pwd) = OK THEN 繼續(xù) ELSE 非法卡
WriteCPZ(CPZ) ;可以寫一些系統(tǒng)標識
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卡是否是本系統(tǒng)支持的卡和對一應(yīng)用區(qū)ADDR地址開始的LEN個字節(jié)完成某種操作。
Open(AT88SC1604)
ReadCPZ(CPZ) ;讀出系統(tǒng)標識
if CPZ = 系統(tǒng)標識 THEN 繼續(xù) ELSE 非法卡
IF CheckSC(Pwd) = OK THEN 繼續(xù) ELSE 非法卡
SetZone(1)
RDATA = Read(ADDR,LEN)
<一些其它操作>
IF CheckSC(Pwd) = OK THEN 繼續(xù) ELSE 非法卡
IF CheckEZ(Pwd) = OK THEN 繼續(xù) ELSE 非法卡
Erase(ADDR,LEN)
Write(ADDR,LEN,WDATA)
RDATA = Read(ADDR,LEN)
IF WDATA = RDATA THEN 寫成功 ELSE 寫失敗
Close()
3.AT88SC1608加密卡
如果說AT88SC1064是在AT88SC102、AT24C16的基礎(chǔ)上作了一些改進的話,那么AT88SC1608則是接觸式IC卡的一次成熟穩(wěn)定的飛躍,在一卡多用上更能體現(xiàn)它的長處,它的保密性能強,讀寫速度快,無需先擦除就可以進行寫操作。
AT88SC1608加密卡時鐘頻率為1MHz,支持頁寫方式(16字節(jié)/頁),如果以頁寫方式訪問的話,訪問時間為10ms(最大)/頁;工作電壓為2.7V—5.5V;寫/擦除次數(shù)為10萬次;數(shù)據(jù)保持100年;工作溫度為0—70℃;通訊協(xié)議符合ISO/IEC 7816-3同步協(xié)議。
尤其是AT88SC1608加密卡的高保密性能十分突出,除了帶加密邏輯,還具有高保密認證及反截取跟蹤技術(shù),64位相互認證及認證錯誤計數(shù)器,錯誤計數(shù)8次。
AT88SC1608具有1個128字節(jié)設(shè)置區(qū)和8個256字節(jié)應(yīng)用分區(qū),8個區(qū)可以自由合并,分別受讀密碼、寫密碼(16套密碼、各3個字節(jié))控制,錯誤計數(shù)8次。
AT88SC1608共有17408位(2176字節(jié))存儲空間,其中前16K位(2K字節(jié))為應(yīng)用區(qū),后1K位(128字節(jié))為設(shè)置區(qū)。
存儲結(jié)構(gòu):(字節(jié)地址以16進制表示)
存儲分區(qū) $0 $1 $2 $3 $4 $5 $6 $7 地址
應(yīng)用分區(qū)0(User0) 256字節(jié) $000
應(yīng)用分區(qū)1(User1) 256字節(jié) $100
應(yīng)用分區(qū)2(User2) 256字節(jié) $200
應(yīng)用分區(qū)3(User3) 256字節(jié) $300
應(yīng)用分區(qū)4(User4) 256字節(jié) $400
應(yīng)用分區(qū)5(User5) 256字節(jié) $500
應(yīng)用分區(qū)6(User6) 256字節(jié) $600
應(yīng)用分區(qū)7(User7) 256字節(jié) $700
設(shè)置區(qū) 128字節(jié) $800
其中設(shè)置區(qū)存儲結(jié)構(gòu):(字節(jié)地址以16進制表示)
$0 $1 $2 $3 $4 $5 $6 $7 地址
廠商信息 復(fù)位應(yīng)答(ATR) 歷史代碼(HC) $00
廠商代碼(FZ) 保留 卡商代碼(CMC) $08
訪問權(quán)限 AR0 AR1 AR2 AR3 AR4 AR5 AR6 AR7 $10
保留 $18
認證區(qū) AAC 識別碼(Nc) $20
密文(Ci) $28
密鑰 密鑰(Gc) $30
測試區(qū) 測試區(qū)(MTZ) $38
密碼區(qū) 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
注:哪個區(qū)用哪套密碼或是否要認證要由訪問權(quán)限AR0-AR7 來決定。
ATR:復(fù)位應(yīng)答,由ATMEL定義,不可改。
HC:歷史代碼,由ATMEL定義,不可改。
FZ:廠商代碼,由ATMEL定義,不可改。
CMC:卡商代碼,由卡廠定義,不可改。
AR0-7:訪問權(quán)限。個人化前定義。(詳細用法參見訪問權(quán)限)
Nc:識別碼,通常用作卡的唯一標識--卡號。個人化前定義。
Ci:密文,個人化前可寫一隨機數(shù),認證卡時使用,每次認證會被自動改寫。
Gc:密鑰,64位的保密種子,由Nc通過F1公式推算出來,在個人化前,寫入卡中。個人化后不可訪問,認證時作為該卡的F2公式的參數(shù)。(詳細用法參見認證協(xié)議)
AAC:為認證錯誤計數(shù)器。初始值為8。
MTZ:用于測試卡的讀寫性能。任意條件下均可測試。
WP0-WP7,RP0-RP7:8套讀寫密碼集, 每個分區(qū)可以分別指向唯一的密碼集,也可以指向同一套密碼集,這樣就可以只核對一套密碼而進入多個分區(qū),使多個分區(qū)合成為一個大的分區(qū)。默認WP7、RP7為讀寫密碼。寫密碼7(WP7)還作為傳輸密碼(SC)。另外,如果需要修改讀寫密碼時,也必須核對同一套密碼集的寫密碼。
SC:傳輸密碼。初始值由ATMEL定認,發(fā)到每個卡廠都不同。可以修改,在個人化前一直使用SC,個人化后其它密碼才會被用到。
PAC:為分區(qū)密碼錯誤計數(shù)器。初始值為8。
熔絲標志(FUSE)
熔絲標志位于設(shè)置區(qū)的$80地址,存儲結(jié)構(gòu):(地址以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為應(yīng)用系統(tǒng)啟動前個人化時的熔斷標志。
當我們把 AT88SC1608卡交付使用之前,卡內(nèi)信息應(yīng)已作完以下的操作:
ATMEL寫完廠商信息(除卡商代碼)、傳輸密碼(SC),把其余的存儲空間都寫成“1”,做FAB熔斷操作,使FAB=0。
卡廠寫入自已的卡商代碼后,做CMA熔斷操作,使CMA=0。
系統(tǒng)商對卡做初始化,或卡在發(fā)行之前由系統(tǒng)做初始化,然后做PER熔斷操作,使CMA=0。
訪問權(quán)限
熔絲熔斷前后的訪問權(quán)限表:
區(qū) 訪問 FAB=0 CMA=0 Per=0
廠商信息 (除卡商代碼) 讀 可以 可以 可以
寫 禁止 禁止 禁止
卡商代碼 讀 可以 可以 可以
寫 傳輸密碼(SC) 禁止 禁止
訪問權(quán)限 讀 可以 可以 可以
寫 傳輸密碼(SC) 傳輸密碼(SC) 禁止
認證區(qū) 讀 可以 可以 可以
寫 傳輸密碼(SC) 傳輸密碼(SC) 禁止
密鑰 讀 傳輸密碼(SC) 傳輸密碼(SC) 禁止
寫 傳輸密碼(SC) 傳輸密碼(SC) 禁止
測試區(qū) 讀 可以 可以 可以
寫 可以 可以 可以
密碼 讀 傳輸密碼(SC) 傳輸密碼(SC) 寫密碼(WP)
寫 傳輸密碼(SC) 傳輸密碼(SC) 寫密碼(WP)
PAC(計數(shù)器) 讀 可以 可以 可以
寫 傳輸密碼(SC) 傳輸密碼(SC) 寫密碼(WP)
應(yīng)用區(qū) 讀 訪問權(quán)限(AR) 訪問權(quán)限(AR) 訪問權(quán)限(AR)
寫 訪問權(quán)限(AR) 訪問權(quán)限(AR) 訪問權(quán)限(AR)
訪問權(quán)限AR0-AR7的存儲結(jié)構(gòu):(使能為“0”,默認為“1”)
位7 位6 位5 位4 位3 位2 位1 位0
WPE RPE ATE PW2 PW1 PW0 MDF PGO
WPE:為寫密碼使能標志。值為0時,對應(yīng)用分區(qū)進行寫操作時,必須通過寫密碼。在個人化后,核對寫密碼,也決定著是否能改變讀密碼和寫密碼。
RPE:為讀密碼使能標志。值為0時,通過讀密碼或?qū)懨艽a,才能讀某應(yīng)用分區(qū)。如果密碼核對錯誤將返回熔絲狀態(tài)位。
ATE:認證使能標志。為0時,認證必須通過才能操作當前應(yīng)用分區(qū)。
PW2,PW1,PW0:這3位指定當前應(yīng)用分區(qū)使用哪一套密碼集。每個分區(qū)可以分別指向唯一的密碼集,也可以指向同一套密碼集,這樣就可以只核對一套密碼而進入多個分區(qū),使多個分區(qū)合成為一個大的分區(qū)。
MDF:為禁止修改操作標志。值為0時,當前應(yīng)用分區(qū)被寫保護,被寫保護區(qū)的內(nèi)容必須在個人化之前寫入。
PGO:只寫標志。如果為0,當前應(yīng)用分區(qū)的每一位只能從“1”寫成“0”,而不能從“0”改回為“1”。
認證協(xié)議
產(chǎn)出隨機數(shù)Nc(往往當作卡號)和Ci,計算出Gc=F1(Ks,Nc),把Nc、Ci、Gc寫入卡中
卡 Nc Gc Ci 認證協(xié)議 讀寫器 Ks Q0(隨機數(shù))
識別碼: 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算法:卡內(nèi)64BIT 算法(Des 算法的變種,提供C語言和51匯編語言程序)
該協(xié)議包括卡和讀寫器CPU的互相認證(ELVA專利),而且認證數(shù)據(jù)加密傳送,可以防止通訊數(shù)據(jù)被竊取。
下面的偽碼程序在AT88SC1608卡完成初始化操作和在一應(yīng)用區(qū)ADDR地址開始寫LEN個字節(jié),并讀出校對。
Open(AT88SC1608)
IF CheckSC(Pwd) = OK THEN 繼續(xù) 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卡是否是本系統(tǒng)支持的卡和對一應(yīng)用區(qū)ADDR地址開始的LEN個字節(jié)完成某種操作。
Open(AT88SC1608)
CheckAuth(Gc)
SetZone(1)
IF CheckRP(Pwd) = OK THEN 繼續(xù) ELSE 非法卡
RDATA = Read(ADDR,LEN)
<一些其它操作>
IF CheckWP(Pwd) = OK THEN 繼續(xù) ELSE 非法卡
Write(ADDR,LEN,WDATA)
RDATA = Read(ADDR,LEN)
IF WDATA = RDATA THEN 寫成功 ELSE 寫失敗
Close()
4.AT88SC153加密卡
AT88SC153是ATMEL繼AT88SC1068之后新推出的一種卡型,它繼承了AT88SC1608的全部優(yōu)點,只是存儲容量及分區(qū)數(shù)有所改變,基本上可以理解為小容量的AT88SC1608。
AT88SC153加密卡時鐘頻率為1MHz,支持頁寫方式(8字節(jié)/頁),如果以頁寫方式訪問的話,訪問時間為10ms(最大)/頁;工作電壓為2.7V—5.5V;寫/擦除次數(shù)為10萬次;數(shù)據(jù)保持100年;工作溫度為0—70℃;通訊協(xié)議符合ISO/IEC 7816-3同步協(xié)議。
與AT88SC1608一樣,AT88SC153加密卡的高保密性能十分突出,除了帶加密邏輯,還具有高保密認證及反截取跟蹤技術(shù),64位相互認證及認證錯誤計數(shù)器,錯誤計數(shù)8次。
AT88SC153具有1個64字節(jié)設(shè)置區(qū)和3個64字節(jié)應(yīng)用分區(qū),3個區(qū)可以自由合并,分別受讀密碼、寫密碼(4套密碼、各3個字節(jié))控制,錯誤計數(shù)4/8次。
AT88SC153共有2048位(256字節(jié))存儲空間,其中前1536位(192字節(jié))為應(yīng)用區(qū),后512位(64字節(jié))為設(shè)置區(qū)。
存儲結(jié)構(gòu):(字節(jié)地址以16進制表示)
存儲分區(qū) $0 $1 $2 $3 $4 $5 $6 $7 地址
應(yīng)用分區(qū)0(User0) 64字節(jié) $00
應(yīng)用分區(qū)1(User1) 64字節(jié) $40
應(yīng)用分區(qū)2(User2) 64字節(jié) $80
設(shè)置區(qū) 64字節(jié) $C0
其中設(shè)置區(qū)存儲結(jié)構(gòu):(字節(jié)地址以16進制表示)
$0 $1 $2 $3 $4 $5 $6 $7 地址
廠商信息 復(fù)位應(yīng)答(ATR) 歷史代碼(HC) $00
廠商代碼(FZ) 卡商碼(CMC) AR0 AR1 AR2 MTZ $08
識別區(qū) 發(fā)布號(IC) $10
DCR 識別碼(Nc) $18
AAC 密文(Ci) $20
密鑰 密鑰(Gc) $28
密碼區(qū) PAC 寫密碼0(WP0) PAC 讀密碼0(RP0) $30
PAC 寫密碼1(WP1/SC) PAC 讀密碼1(RP1) $38
注:哪個區(qū)用哪套密碼或是否要認證要由訪問權(quán)限AR0-AR2 來決定。
在采用校驗和認證方式時,地址$20也可以用作校驗和認證寄存器(CAR)。
ATR:復(fù)位應(yīng)答,由ATMEL定義,不可改。
HC:歷史代碼,由ATMEL定義,不可改。
FZ:廠商代碼,由ATMEL定義,不可改。
CMC:卡商代碼,由卡廠定義,不可改。
AR0-2:訪問權(quán)限。個人化前定義。(詳細用法參見訪問權(quán)限)
MTZ:用于測試卡的讀寫性能。任意條件下均可測試。
IC:發(fā)布號。個人化前定義。。
DCR:設(shè)備設(shè)置寄存器。
Nc:識別碼,通常用作卡的唯一標識--卡號。個人化前定義。
Ci:密文,個人化前可寫一隨機數(shù),認證卡時使用,每次認證會被自動改寫。
Gc:密鑰,64位的保密種子,由Nc通過F1公式推算出來,在個人化前,寫入卡中。個人化后不可訪問,認證時作為該卡的F2公式的參數(shù)。(詳細用法參見認證協(xié)議)
AAC:為認證錯誤計數(shù)器。初始值為8,但每次校驗出錯減2,所以共有4次連續(xù)校驗出錯的機會,可擴展為8次(見DCR的設(shè)置方法)。也用作Ci的一部分,注意如果修改了AAC,會影響下一次認證的Ci值。
CAR:校驗和認證寄存器。只有認證完成時才有用,每次寫操作都會激活校驗和方式,并把寫或連續(xù)寫的校驗和自動寫入CAR,此時可以讀出校驗和,以確定寫操作是否完成。任何讀操作都會結(jié)束校驗和方式。
WP0,WP1,RP0,RP1:2套讀寫密碼集, 每個分區(qū)可以分別指向唯一的密碼集,也可以指向同一套密碼集,這樣就可以只核對一套密碼而進入多個分區(qū),使多個分區(qū)合成為一個大的分區(qū)。默認WP1、RP1為讀寫密碼。寫密碼1(WP1)還作為傳輸密碼(SC)。另外,如果需要修改讀寫密碼時,也必須核對同一套密碼集的寫密碼。
SC:傳輸密碼。初始值由ATMEL定認,發(fā)到每個卡廠都不同??梢孕薷?,在個人化前一直使用SC,個人化后其它密碼才會被用到。
PAC:為分區(qū)密碼錯誤計數(shù)器。初始值為8,但每次校驗出錯減2,所以共有4次連續(xù)校驗出錯的機會。可擴展為8次。(見DCR的設(shè)置方法)
熔絲標志(FUSE)
熔絲標志位于設(shè)置區(qū)的$40地址,存儲結(jié)構(gòu):(地址以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為應(yīng)用系統(tǒng)啟動前個人化時的熔斷標志。
當我們把 AT88SC153卡交付使用之前,卡內(nèi)信息應(yīng)已作完以下的操作:
ATMEL寫完廠商信息(除卡商代碼、訪問權(quán)限和測試區(qū))、傳輸密碼(SC),把其余的存儲空間都寫成“1”,做FAB熔斷操作,使FAB=0。
卡廠寫入自已的卡商代碼后,做CMA熔斷操作,使CMA=0。
系統(tǒng)商對卡做初始化,或卡在發(fā)行之前由系統(tǒng)做初始化,然后做PER熔斷操作,使CMA=0。
訪問權(quán)限
熔絲熔斷前后的訪問權(quán)限表:
區(qū) 訪問 FAB=0 CMA=0 Per=0
廠商信息 (除CMC,AR,MTZ) 讀 可以 可以 可以
寫 禁止 禁止 禁止
卡商代碼 讀 可以 可以 可以
寫 傳輸密碼(SC) 禁止 禁止
訪問權(quán)限 讀 可以 可以 可以
寫 傳輸密碼(SC) 傳輸密碼(SC) 禁止
測試區(qū) 讀 可以 可以 可以
寫 可以 可以 可以
識別區(qū) 讀 可以 可以 可以
寫 傳輸密碼(SC) 傳輸密碼(SC) 禁止
密鑰 讀 傳輸密碼(SC) 傳輸密碼(SC) 禁止
寫 傳輸密碼(SC) 傳輸密碼(SC) 禁止
密碼 讀 傳輸密碼(SC) 傳輸密碼(SC) 寫密碼(WP)
寫 傳輸密碼(SC) 傳輸密碼(SC) 寫密碼(WP)
PAC(計數(shù)器) 讀 可以 可以 可以
寫 傳輸密碼(SC) 傳輸密碼(SC) 寫密碼(WP)
應(yīng)用區(qū) 讀 訪問權(quán)限(AR) 訪問權(quán)限(AR) 訪問權(quán)限(AR)
寫 訪問權(quán)限(AR) 訪問權(quán)限(AR) 訪問權(quán)限(AR)
訪問權(quán)限AR0-AR2的存儲結(jié)構(gòu):(使能為“0” ,默認為“1”)
位7 位6 位5 位4 位3 位2 位1 位0
WPE RPE ATE AOW PWS WLM MDF PGO
WPE:為寫密碼使能標志。值為0時,對應(yīng)用分區(qū)進行寫操作時,必須通過寫密碼。在個人化后,核對寫密碼,也決定著是否能改變讀密碼和寫密碼。
RPE:為讀密碼使能標志。值為0時,通過讀密碼或?qū)懨艽a,才能讀某應(yīng)用分區(qū)。如果密碼核對錯誤將返回熔絲狀態(tài)位。
ATE:認證使能標志。為0時,認證必須通過才能操作當前應(yīng)用分區(qū)。
AOW:只有寫時才需要認證標志。只有寫操作時才需要進行認證,讀不需要進行認證操作,如果ATE=0,則AOW被忽略。
PWS:指定當前應(yīng)用分區(qū)使用哪一套密碼集。每個分區(qū)可以分別指向唯一的密碼集,也可以指向同一套密碼集,這樣就可以只核對一套密碼而進入多個分區(qū),使多個分區(qū)合成為一個大的分區(qū)。
WLM:寫鎖模式使能。每個區(qū)的8個字節(jié)為一頁。如果WLM=0,使每頁的第一個字節(jié)(byte0)的每一位分別為該頁8個字節(jié)的寫鎖標志,0為寫鎖(即只能從“1”寫成“0”,而不能從“0”改回為“1”),1為解鎖。
MDF:為禁止修改操作標志。值為0時,當前應(yīng)用分區(qū)被寫保護,被寫保護區(qū)的內(nèi)容必須在個人化之前寫入。
PGO:只寫標志。如果為0,當前應(yīng)用分區(qū)的每一位只能從“1”寫成“0”,而不能從“0”改回為“1”。
設(shè)備設(shè)置寄存器(DCR)
設(shè)備設(shè)置寄存器位于設(shè)置區(qū)的$18地址,存儲結(jié)構(gòu):(使能為“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次計數(shù)使能。ETA=0,可以使AAC和PAC的計數(shù)次數(shù)為8,否則為4。
UAT:使認證錯誤計數(shù)無校標志。UAT=0,AAC無校,否則AAC有校。
UCR:不限制讀校驗和次數(shù)標志。UCR=1時,每次認證只能讀校驗和方式一次(默認),UCR=0時,沒有次數(shù)限制。
SME:超級管理方式。SME=0時,通過1WP校驗,就可以讀寫全部的讀寫密碼及密碼錯誤計數(shù)器。
認證協(xié)議
產(chǎn)出隨機數(shù)Nc(往往當作卡號)和Ci,計算出Gc=F1(Ks,Nc),把Nc、Ci、Gc寫入卡中
卡 Nc Gc Ci 認證協(xié)議 讀寫器 Ks Q0(隨機數(shù))
識別碼: 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算法:卡內(nèi)64BIT 算法(Des 算法的變種,提供C語言和51匯編語言程序)
該協(xié)議包括卡和讀寫器CPU的互相認證(ELVA專利),而且認證數(shù)據(jù)加密傳送,可以防止通訊數(shù)據(jù)被竊取。
下面的偽碼程序在AT88SC153卡完成初始化操作和在一應(yīng)用區(qū)ADDR地址開始寫LEN個字節(jié),并讀出校對。
Open(AT88SC153)
IF CheckSC(Pwd) = OK THEN 繼續(xù) ELSE 非法卡
WriteIC(IC) ;寫發(fā)布號
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卡是否是本系統(tǒng)支持的卡和對一應(yīng)用區(qū)ADDR地址開始的LEN個字節(jié)完成某種操作。
Open(AT88SC153)
ReadIC(IC) ;讀出發(fā)布號
if IC = 發(fā)布號 THEN 繼續(xù) ELSE 非法卡
CheckAuth(Gc)
SetZone(1)
IF CheckRP(Pwd) = OK THEN 繼續(xù) ELSE 非法卡
RDATA = Read(ADDR,LEN)
<一些其它操作>
IF CheckWP(Pwd) = OK THEN 繼續(xù) ELSE 非法卡
Write(ADDR,LEN,WDATA)
RDATA = Read(ADDR,LEN)
IF WDATA = RDATA THEN 寫成功 ELSE 寫失敗
Close()
三、AT45D041
這種型號的IC卡為ATMEL存儲卡,是一種不具備加密功能大容量的FLASH 存儲卡,存儲容量為4M位,主存儲區(qū)有2048頁(每頁容量為264字節(jié)),同時還提供兩個獨立雙向的數(shù)據(jù)緩存區(qū)(每個數(shù)據(jù)緩存區(qū)容量為264字節(jié)),頁寫方式為264字節(jié),頁寫入時間為7ms。存儲結(jié)構(gòu)簡單,主要用于存放一些保密性要求不高、數(shù)據(jù)量極大的數(shù)據(jù),如聲音、圖像或數(shù)據(jù)。
AT45D041的工作頻率為10MHz(最大);工作電壓為5V±10%;工作電流讀為25mA,寫為50mA;數(shù)據(jù)保持100年;工作溫度為0—70℃,根據(jù)要求可超過指定工作溫度;通訊協(xié)議為SPI串行接口方式0和方式3。
緩存區(qū)1、緩存區(qū)2和主存儲區(qū)的讀寫方式如上圖所示,分別為:
1. 直接從主存儲區(qū)的某頁讀數(shù)據(jù);
2. 把主存儲區(qū)的某頁數(shù)據(jù)寫入緩存區(qū)1或緩存區(qū)2;
3. 把主存儲區(qū)的某頁數(shù)據(jù)和緩存區(qū)1或緩存區(qū)2的數(shù)據(jù)進行比較;
4. 把緩存區(qū)1或緩存區(qū)2的數(shù)據(jù)寫入主存儲區(qū)的某頁(帶內(nèi)建式擦除);
5. 把緩存區(qū)1或緩存區(qū)2的數(shù)據(jù)寫入主存儲區(qū)的某頁(不6. 帶內(nèi)建式擦除);
7. 把數(shù)據(jù)寫入主存儲區(qū)的某頁;
8. 自動頁回寫;
9. 讀緩存區(qū)1、緩存區(qū)2;
10. 寫緩存區(qū)1、緩存區(qū)2;
11. 讀狀態(tài)位。
狀態(tài)位結(jié)構(gòu):
位7 位6 位5 位4 位3 位2 位1 位0
忙閑 比較 0 1 1 x x x
注:位7為0表示忙;為1表示閑,可以接收下一條指令。
位6為0表示主存儲區(qū)數(shù)據(jù)與緩存區(qū)比較匹配,否則為不匹配。
位5、位4、位3對于AT45D041為“011”(二進制)。
下面的偽碼程序通過AT45D041卡的緩存1更新主存儲區(qū)的頁1的某些數(shù)據(jù):
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頁寫主存儲區(qū)的頁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()
注:本章內(nèi)容可為用戶在接觸式IC卡選型時參考。
第二章 接觸式IC卡的接口函數(shù)
IC卡軟件應(yīng)用系統(tǒng)的開發(fā)是在讀寫器提供的接口函數(shù)基礎(chǔ)上進行軟件開發(fā)的。每個系統(tǒng)公司的接口函數(shù)雖有不同,但大同小異。下面以德誠系統(tǒng)有限公司的MCS-C接觸式IC卡通用讀寫器提供的FoxPro for DOS的PLB接口函數(shù)為例,用戶由此可基本上對接觸式IC卡接口函數(shù)有所了解。
在FoxPro程序執(zhí)行開始前,先執(zhí)行語句SET LIBRARY TO ICFOX.PBL。FoxPro將會自動登錄庫ICFOX.PLB中的IC卡函數(shù),您可以象使用FoxPro的內(nèi)部函數(shù)一樣的使用接口函數(shù)。編譯成EXE文件時,將ICFOX.PLB鏈入。
1、 函數(shù)列表(函數(shù)名2? , 簡單說明)
1. 通用函數(shù)
InitComm 初始化指定的串口并連接讀寫設(shè)備
ExitComm 退出串口連接
ErrorMsg 返回錯誤信息
GetInfo 獲取設(shè)備的版本號
TestCard 測試讀寫器內(nèi)是否插卡
OpenCard 打開對某種型號卡的操作
ReadChr 從卡上指定地址讀取指定長度的字符串
WriteChr 向卡內(nèi)指定地址寫入指定長度的字符串
ReadInt 從卡上指定地址讀取一個雙精度數(shù)
WriteInt 向卡內(nèi)指定地址寫入一個雙精度數(shù)
CloseCard 關(guān)閉卡操作
2? ATMEL AT88SC102/AT88SC1604加密卡專用函數(shù)
ReadFZ 讀廠商代碼
ReadIZ 讀卡商代碼
ReadCPZ 讀代碼保護區(qū)
WriteCPZ 寫代碼保護區(qū)
ReadMTZ 讀測試區(qū)
WriteMTZ 寫測試區(qū)
SetZone 選擇應(yīng)用區(qū)
CheckSC 比較密碼(或區(qū)密碼)
UpdateSC 更新密碼(或區(qū)密碼)
ReadSCAC 讀密碼(或區(qū)密碼)校驗錯誤計數(shù)
CheckEZ 比較區(qū)擦除密碼
UpdateEZ 更新區(qū)擦除密碼
ReadEAC 讀區(qū)擦除密碼校驗錯誤計數(shù)
Erase 從卡內(nèi)指定位置起擦除指定長度字節(jié)
Fuse 燒斷卡上熔絲
3? ATMEL AT88SC1608及AT88SC153加密卡專用函數(shù)
ReadFZ 讀廠商代碼
ReadIZ 讀卡商代碼
ReadIC 讀發(fā)布號(AT88SC153專用)
WriteIC 寫發(fā)布號(AT88SC153專用)
ReadDCR 讀設(shè)備設(shè)置寄存器(AT88SC153專用)
WriteDCR 寫設(shè)備設(shè)置寄存器(AT88SC153專用)
ReadMTZ 讀測試區(qū)
WriteMTZ 寫測試區(qū)
InitAuth 初始化認證狀態(tài)
CheckAuth 認證校驗
ReadAAC 讀認證錯誤計數(shù)
CheckSC 比較傳輸密碼
UpdateSC 更新傳輸密碼
ReadSCAC 讀傳輸密碼校驗錯誤計數(shù)
SetZone 選擇應(yīng)用區(qū)
ReadAR 讀應(yīng)用區(qū)的訪問權(quán)限
WriteAR 設(shè)置應(yīng)用區(qū)的訪問權(quán)限
CheckWP 比較寫密碼
UpdateWP 更新寫密碼
ReadWPAC 讀寫密碼校驗錯誤計數(shù)
CheckRP 比較讀密碼
UpdateRP 更新寫密碼
ReadRPAC 讀讀密碼校驗錯誤計數(shù)
FuseStatus 讀取卡內(nèi)熔絲狀態(tài)
Fuse 燒斷卡上熔絲
4? ATMEL AT45D041 Flash存儲卡專用函數(shù)
SetPage 選擇主存儲區(qū)的當前頁
SetBuff 選擇緩沖區(qū)
ReadPage 讀取主存儲區(qū)頁內(nèi)的字符
ReadBuff 讀取緩沖區(qū)1/緩沖區(qū)2內(nèi)的字符
WritePage 寫字符到主存儲區(qū)頁
WriteBuff 寫字符到緩沖區(qū)1/緩沖區(qū)2
CompPB 比較主存儲區(qū)頁與緩沖區(qū)1/緩沖區(qū)2的內(nèi)容
PageToBuff 從主存儲區(qū)頁提取數(shù)據(jù)到緩沖區(qū)1/緩沖區(qū)2
BuffToPage 從緩沖區(qū)1/緩沖區(qū)2寫數(shù)據(jù)到主存儲區(qū)頁
ReadStatus 讀狀態(tài)字(忙閑)
AutoRWrite 自動回寫
3、 函數(shù)說明
InitComm(Port)
說明:初始化指定的串口并連接讀寫設(shè)備。
參數(shù):Port----串口標號,整數(shù)0,1分別代表串口1,串口2。
返回值: =0,正確。
<>0,出錯。返回值代表錯誤號。
舉例:Ret = InitComm(0) 初始化串口1。
ExitComm()
說明:退出串口連接。
參數(shù):無。
返回值: =0,正確。
<>0,出錯。返回值代表錯誤號。
舉例:Ret = ExitComm() 退出串口。
ErrorMsg(ErrNo)
說明:返回錯誤信息。
參數(shù):錯誤號。
返回值: 錯誤信息。
舉例:Msg = ErrorMsg(0) 返回“成功”。
GetInfo()
說明:獲取設(shè)備的版本號。
參數(shù):無。
返回值: 設(shè)備的版本號。
舉例:Vno = GetInfo()。
TestCard()
說明:測試讀寫器內(nèi)是否插卡。
參數(shù):無。
返回值: =0,正確。
<0,讀寫器內(nèi)沒有插卡。返回值代表錯誤號。
舉例:Ret = TestCard()
OpenCard(CardType)
說明:打開對某種型號卡的操作
參數(shù):CardType----IC卡類型。具體值參見附錄一。
返回值: =0,正確。
<>0,出錯。返回值代表錯誤號。
舉例:Ret = OpenCard(AT24C01A) 選擇卡型為AT24C01A。
ReadChr(Addr,Len)
說明:從卡上指定地址讀取指定長度的字符串。
參數(shù):Addr----讀操作的卡內(nèi)起始地址。
Len----字符串長度。
返回值:從卡上讀取的字符串。
讀操作出錯。返回""。
舉例:cData = ReadChr(0, 10) 從卡上應(yīng)用區(qū)地址0讀取10個字符。
WriteChr(Addr,Len,cData)
說明:將指定長度的字符串寫入到卡片的指定起始地址上。
參數(shù):Addr----寫操作的卡內(nèi)起始地址。
Len----字符串長度。
cData----要向卡片寫入的字符串。
返回值: =0,正確。
<0,寫操作出錯。返回值代表錯誤號。
舉例:Ret = WriteChr(0, 14, "Testing MCS-C!") 將字符串寫入卡地址0處。
ReadInt(Addr)
說明:從卡上指定的起始地址讀取一個雙精度數(shù)。
參數(shù):Addr----讀操作的卡內(nèi)起始地址。
返回值:從卡上讀取的雙精度數(shù)。
舉例:iData = ReadInt(0) 從卡上應(yīng)用區(qū)地址0讀取雙精度數(shù)。
WriteInt(Addr,iData)
說明:將一個雙精度數(shù)寫入到卡內(nèi)指定起始地址處。
參數(shù):Addr----寫操作的卡內(nèi)起始地址。
iData----要向卡內(nèi)寫入的雙精度數(shù)。
返回值: =0,正確。
<0,寫操作出錯。返回值代表錯誤號。
舉例:Ret = WriteInt(0, 12345.6789) 將12345.6789寫入到卡內(nèi)地址0處。
CloseCard()
說明:關(guān)閉卡操作
參數(shù):無。
返回值: =0,正確。
<>0,出錯。返回值代表錯誤號。
舉例:Ret = CloseCard()
ReadFZ()
說明:讀廠商代碼。
參數(shù):無。
返回值:從卡上讀取廠商代碼(16進制字符串)。
讀操作出錯。返回""。
舉例:FZ = ReadFZ()
ReadIZ()
說明:讀卡商代碼。
參數(shù):無。
返回值:從卡上讀取卡商代碼(16進制字符串)。
讀操作出錯。返回""。
舉例:IZ = ReadIZ()
ReadCPZ()
說明:讀代碼保護區(qū)。
參數(shù):無。
返回值:從卡上讀取代碼保護區(qū)(16進制字符串)。
讀操作出錯。返回""。
舉例:CPZ = ReadCPZ()
WriteCPZ(CPZ)
說明:寫代碼保護區(qū)。
參數(shù):長度為為16個字節(jié)的字符串(16進制字符串)。
返回值: =0,正確。
<>0,出錯。返回值代表錯誤號。
舉例:Ret = WriteCPZ("0123456789ABCDEF")
ReadMTZ()
說明:讀測試區(qū)。
參數(shù):無。
返回值:從卡上讀取代碼保護區(qū)(16進制字符串)。
讀操作出錯。返回""。
舉例:MTZ = ReadMTZ()
WriteMTZ(MTZ)
說明:寫測試區(qū)。
參數(shù):字符串(16進制字符串)。
返回值: =0,正確。
<>0,出錯。返回值代表錯誤號。
舉例:Ret = WriteMTZ("ABCDEF")
SetZone(Zone)
說明:選擇應(yīng)用區(qū)。
參數(shù):Zone----要選擇的應(yīng)用區(qū)號。0-n代表應(yīng)用區(qū)0至應(yīng)用區(qū)n。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = SetZone(1)
CheckSC(SC)
說明:比較密碼(或區(qū)密碼)。
參數(shù):字符串(16進制字符串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = CheckSC("FFFF")
UpdateSC(SC)
說明:更新密碼(或區(qū)密碼)。
參數(shù):字符串(16進制字符串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = UpdateSC("9999")
ReadSCAC()
說明:讀密碼(或區(qū)密碼)校驗錯誤計數(shù)。
參數(shù):無。
返回值:密碼校驗錯誤計數(shù)值。
舉例:SCAC = ReadSCAC()
CheckEZ(EZ)
說明:比較擦除密碼(或區(qū)擦除密碼)。
參數(shù):字符串(16進制字符串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = CheckEZ("FFFF")
UpdateEZ(EZ)
說明:更新擦除密碼(或區(qū)擦除密碼)。
參數(shù):字符串(16進制字符串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = UpdateEZ("9999")
ReadEZAC()
說明:讀擦除密碼(或區(qū)擦除密碼)校驗錯誤計數(shù)。
參數(shù):無。
返回值:密碼校驗錯誤計數(shù)值。
舉例:EZAC = ReadEZAC()
Erase(Addr,Len)
說明:從指定位置起擦除指定長度的字節(jié)。
參數(shù):Addr----要擦除的起始地址。
Len----要擦除的長度。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = Erase(0, 10)
Fuse()
說明:燒斷卡上熔絲。
參數(shù):無。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = Fuse()
ReadIC()
說明:讀發(fā)布號(AT88SC153專用)。
參數(shù):無。
返回值:發(fā)布號(16進制字符串)。
舉例:Ret = ReadIC()
WriteIC(IC)
說明:寫發(fā)布號(AT88SC153專用)。
參數(shù):字符串(16進制字符串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = WriteIC("012456789ABCDEF")
ReadDCR()
說明:讀設(shè)備設(shè)置寄存器(AT88SC153專用)。
參數(shù):無。
返回值:設(shè)備設(shè)置寄存器的值(16進制字符串)。
舉例:Ret = ReadDCR()
WriteDCR(DCR)
說明:寫設(shè)備設(shè)置寄存器(AT88SC153專用)。
參數(shù):字符串(16進制字符串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = WriteDCR("FF")
InitAuth(Nc,Ci,Gc)
說明:初始化認證協(xié)議。
參數(shù):Nc----識別碼。
Ci----密文。
Gc----密鑰。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = InitAuth(Nc,Ci,Gc)
CheckAuth(Gc)
說明:認證協(xié)議。
參數(shù):Gc----密鑰。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = CheckAuth(Gc)
ReadAAC()
說明:讀認證錯誤計數(shù)。
參數(shù):無。
返回值:認證校驗錯誤計數(shù)值。
舉例:AAC = ReadAAC()
ReadAR()
說明:讀應(yīng)用區(qū)的訪問權(quán)限。
參數(shù):無。
返回值:當前訪問區(qū)權(quán)限字節(jié)(16進制字符串)。
舉例:AR = ReadAR()
WriteAR(AR)
說明:設(shè)置應(yīng)用區(qū)的訪問權(quán)限。
參數(shù):AR----當前訪問區(qū)權(quán)限字節(jié)(16進制字符串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = WriteAR("FF")
CheckWP(WP)
說明:比較當前區(qū)寫密碼。
參數(shù):字符串(16進制字符串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = CheckWP("FFFFFF")
UpdateWP(WP)
說明:更新當前區(qū)寫密碼。
參數(shù):字符串(16進制字符串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = UpdateWP("999999")
ReadWPAC()
說明:讀當前區(qū)寫密碼校驗錯誤計數(shù)。
參數(shù):無。
返回值:當前區(qū)寫密碼校驗錯誤計數(shù)值。
舉例:WPAC = ReadWPAC()
CheckRP(RP)
說明:比較當前區(qū)讀密碼。
參數(shù):字符串(16進制字符串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = CheckRP("FFFFFF")
UpdateRP(RP)
說明:更新當前區(qū)讀密碼。
參數(shù):字符串(16進制字符串)。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = UpdateRP("999999")
ReadRPAC()
說明:讀當前區(qū)讀密碼校驗錯誤計數(shù)。
參數(shù):無。
返回值:當前區(qū)讀密碼校驗錯誤計數(shù)值。
舉例:RPAC = ReadRPAC()
FuseStatus()
說明:讀取卡內(nèi)熔絲狀態(tài)
參數(shù):無。
返回值: =0,已熔。
=1,未熔。
舉例:PER = FuseStatus()
SetPage(Page)
說明:選擇主存儲區(qū)的當前頁。
參數(shù):Page----要選擇的頁號。1-n代表頁1至頁n。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = SetPage(1)
SetBuff(Buff)
說明:選擇緩沖區(qū)。
參數(shù):Buff----要選擇的緩沖區(qū)。1,2代表緩沖區(qū)1,緩沖區(qū)2。
返回值: =0,正確。
<0,出錯。返回值代表錯誤號。
舉例:Ret = SetBuff(1)
ReadPage(Addr,Len)
說明:讀取主存儲區(qū)頁內(nèi)的字符。
參數(shù):Addr----要讀取的起始字節(jié)地址。
Len----要讀取的長度。
返回值:返回的數(shù)據(jù)字符串。
舉例:cData = ReadPage(0,10)
ReadBuff(Addr,Len)
說明:讀取緩沖區(qū)內(nèi)的字符。
參數(shù):Addr----要讀取的起始字節(jié)地址。
Len----要讀取的長度。
返回值:返回的數(shù)據(jù)字符串。
舉例:cData = ReadBuff(0,10)
WritePage(Addr,Len,cData)
說明:寫字符到主存儲區(qū)頁。
參數(shù):Addr----要寫入的起始字節(jié)地址。
Len----要寫入的長度。
cData----用于存放寫入卡片的數(shù)據(jù)的字符串。
返回值: =0,正確。
<0,返回值代表錯誤號。
舉例:Ret = WritePage(0,10,"1234567890")
WriteBuff(Addr,Len,cData)
說明:寫字符到緩沖區(qū)。
參數(shù):Addr----要寫入的起始字節(jié)地址。
Len----要寫入的長度。
cData----用于存放寫入緩沖區(qū)的數(shù)據(jù)的字符串。
返回值: =0,正確。
<0,返回值代表錯誤號。
舉例:Ret = WriteBuff(0,10,"1234567890")
CompPB()
說明:比較主存儲區(qū)頁與緩沖區(qū)的內(nèi)容。
參數(shù):無。
返回值: =0,正確。
<0,返回值代表錯誤號。
舉例:Ret = CompPB()
PageToBuff()
說明:主存儲區(qū)內(nèi)容向緩沖區(qū)傳送。
參數(shù):無。
返回值: =0,正確。
<0,返回值代表錯誤號。
舉例:Ret = PageToBuff()
BuffToPage()
說明:從緩沖區(qū)寫數(shù)據(jù)到主存儲區(qū)頁。
參數(shù):無。
返回值: =0,正確。
<0,返回值代表錯誤號。
舉例:Ret = BuffToPage()
ReadStatus()
說明:讀狀態(tài)字(忙閑)
參數(shù):無。
返回值: =0,閑。
<0,返回值代表忙或錯誤號。
舉例:Ret = ReadStatus()
AutoRWrite()
說明:自動回寫。
參數(shù):無。
返回值: =0,正確。
<0,返回值代表錯誤號。
舉例:Ret = AutoRWrite()
附錄一:卡類型預(yù)定義
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卡底層軟件開發(fā)實例
對了更好地說明接觸式IC卡讀寫器是如果工作的,本章公布了部分德誠系統(tǒng)有限公司MCS-C讀寫器低層CPU的C51程序,包括了IC卡操作底層函數(shù),以AT24C64卡為例的實例程序。這些程序是根據(jù)德誠系統(tǒng)有限公司實際使用的函數(shù)向用戶公開的,也可供其它打算生產(chǎn)接觸式IC卡讀寫器的廠家參考,以便開發(fā)自已的IC卡驅(qū)動函數(shù)。
??2 IC卡操作底層函數(shù)
1? IC卡操作底層函數(shù)說明:
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);
功能:將數(shù)據(jù)由IC卡讀寫器IO端輸出。
輸入:IOData輸出數(shù)據(jù),值是0或1。
輸出:無
uchar _CardReadIO();
功能:讀取IC卡讀寫器IO端數(shù)據(jù)
輸入:無
輸出:IC卡輸出的數(shù)據(jù),值是0或1。
2? IC卡低層通訊頭文件(Base.h)
低層通訊函數(shù)用戶可根據(jù)自已的設(shè)備編寫。
#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卡應(yīng)用實例
1.AT24C64卡函數(shù)頭文件(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卡函數(shù)
//**********************************************************
//* 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卡應(yīng)用例程(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位微處理器。內(nèi)含可編程的FLASH、只可一次編程的內(nèi)存單元(PEROM)和電可擦寫數(shù)據(jù)存儲單元(EEPROM)。該89SC系列產(chǎn)品運用ATMEL的高密度CMOS工藝制造,同工業(yè)標準的80C51和80C52指令集相兼容。
AT90SC系列產(chǎn)品與ATMEL的AVR指令集相兼容,內(nèi)部帶有協(xié)處理器。
通過將FLASH和一個多性能的8位微處理器集成在單一片上,AT89SC/90SC系列為多種智能卡的應(yīng)用提供了高度靈活和性能完備的解決方案。
值得一提的是,AT89SC/90SC具有專為智能卡應(yīng)用而設(shè)計的特性:如符合ISO7816標準的串行接口,隨機數(shù)發(fā)生器,電源和頻率保護邏輯。
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 (協(xié)處理器) 32 K bytes 32K bytes 1K bytes
我們?yōu)橄矏塾肁TMEL CPU卡和設(shè)計COS的客戶提供了如下的解決方案:
Help customers to use DEMOCOS and design their own COS.
--幫助客戶使用DEMOCOS和設(shè)計自己的COS。
DEMOCOS ( source code ) : it is a completed COS, supports ISO-7816 command and t=0 protocol.
--DEMOCOS(提供源代碼)是一個完整的COS,支持ISO-7816 命令和T=0協(xié)議。
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數(shù)據(jù)存儲器和ISO7816通訊接口,并且引腳符合ISO7816標準。
該CPU卡的FLASH程序存儲器是可以讓用戶自行下載的,這樣就可以保證用戶的COS源代碼不會泄露出去。更為優(yōu)異的是:是否可以重新下載FLSAH完全由用戶的COS來設(shè)置,這樣可以實現(xiàn)重復(fù)可下載和一次性下載兩種模式。
AT89SC系列微處理器提供了兩種軟件控制的低電壓工作方式:
閑置模式:CPU停止工作,芯片上其他部分繼續(xù)工作。在閑置狀態(tài)下,電流大約是芯片處于完全工作狀態(tài)時電流的15%。
休眠模式: 芯片上一切活動均被掛起,RAM中還保留數(shù)據(jù)。在休眠狀態(tài)下,芯片的電流通常低于15A,最低可達到0.6A。
同時,由于芯片使用靜態(tài)邏輯設(shè)計,無須時鐘持續(xù)工作。這就是說,在等待一個內(nèi)部事件的觸發(fā)時,時鐘頻率可以減緩,甚至停止。
安全特性:
AT89SC系列微處理器提供了下述安全特性:
低電壓保護;
低頻保護,防止靜態(tài)分析;
高頻濾波,防止干擾;
傳輸代碼,保護芯片在運輸過程中不被盜用;
唯一系列代碼;
當時鐘頻率低于500KHz或電壓低于4V時,芯片會產(chǎn)生一個安全保護中斷;
當時鐘頻率高于10MHz或電壓低于3V時,芯片處于復(fù)位狀態(tài),直至電壓或時鐘頻率恢復(fù)正常;
芯片在運輸過程及初始化時受到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,即使不做任何改動,就可以利用它靈活地創(chuàng)建自己的文件和安全系統(tǒng)。DEMOCOS的代碼大小為4.5K,分為通訊模塊、文件系統(tǒng)模塊、和算法模塊,但是認證算法比較簡單,如果想改變算法(這是目前大多數(shù)客戶的想法),請將DEMOCOS讀懂(這有一定的挑戰(zhàn)性,但DEMOCOS是模塊化編程,注釋詳細)后重寫算法,也可以添加其他的功能,用戶還有很多的程序空間可用。
另外,由于ATMEL的CPU卡的不斷更新,如容量大小的改變,通訊方式的改變,以及REBOOT方式的改變,ATMEL公司會指導(dǎo)用戶對DEMOCOS做相應(yīng)的調(diào)整。
一、文件系統(tǒng)
1、文件分類
設(shè)多層目錄:MF(3F00)、DF(具體應(yīng)用目錄,最多可以建立15級目錄)
EF分為SF、KF和WF:
SF是密碼文件,各層目錄均可有一個,存放用戶密碼。
KF是密鑰文件,各層目錄均可有一個,存放發(fā)行商密鑰。
WF是工作文件,數(shù)據(jù)文件EF。
支持兩種標準EF文件結(jié)構(gòu):線性定長記錄、透明二進制。
本結(jié)構(gòu)支持一卡多用。
2、文件訪問方式
使用文件標識符(FID)進行訪問:
每一文件中有兩字節(jié)長的標識符,允許不同的文件具有相同的標識符,在直接處于給定DF下的所有EF和DF應(yīng)具有不同的文件標識符。
使用短EF文件標識符(SFI)進行訪問:
短EF文件標識符用5位二進制碼(1~30)表示。短EF文件標識符不能用在路徑中或作為文件標識符,如不能用在Select File命令中進行選擇。
3、數(shù)據(jù)訪問方式
訪問記錄:
在記錄結(jié)構(gòu)的EF中,可以用記錄編號訪問記錄數(shù)據(jù)。記錄編號是一個無符號的8位整數(shù),其可用值為01H~FEH,00H保留于專用,F(xiàn)FH保留于將來使用。
訪問數(shù)據(jù)單元:
在透明二進制結(jié)構(gòu)的EF文件中,每一個數(shù)據(jù)單元的位置由命令的偏移值給出,其下一個數(shù)據(jù)單元的位置由偏移值加數(shù)據(jù)單元長度后產(chǎn)生。
二、安全系統(tǒng)
1、密碼和密鑰管理
1)密碼類型
SF文件最多由4個密碼記錄組成,密碼編號從0到3依次排列。其中:
0號密碼默認為用戶個人密碼;
1號密碼默認為解鎖密碼(發(fā)行商用);
2號密碼默認為個人化密碼(發(fā)行商用);
3號密碼默認為重裝密碼(發(fā)行商用);
2)密鑰
KF文件最多由8個密鑰記錄組成,密碼編號從0到7依次排列
2、安全規(guī)程
①卡的確認:內(nèi)部鑒別(鑒別密鑰)。
②終端確認:外部鑒別(鑒別密鑰)。
③持卡人確認:PIN密碼提交驗證。
④發(fā)行者確認:發(fā)行密碼提交驗證。
⑤其他密碼驗證。
⑥對安全系統(tǒng)文件進行寫操作時的反插拔與自動恢復(fù)。
三、命令系統(tǒng)
1、命令報文
1)命令結(jié)構(gòu):
命令頭 命令體
CLA INS P1 P2 Lc Data Le
2)命令分類:
COS命令由具體應(yīng)用分為4種命令報文結(jié)構(gòu)如下:
①情形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、響應(yīng)報文
1)響應(yīng)結(jié)構(gòu)
響應(yīng)數(shù)據(jù) 響應(yīng)狀態(tài)碼
Data SW1 SW1
DATA: 返回給用戶的數(shù)據(jù),即命令的執(zhí)行結(jié)果。
SW1、SW2: 返回命令處理的狀態(tài)。
3、命令集
1)Read Binary
功能:
此命令用于讀取二進制文件部分或全部的內(nèi)容。
格式:
代碼 值
CLA ‘00’
INS ‘B0’
P1 見參數(shù)說明
P2 從文件中讀取的第一字節(jié)的偏移地址
Le 期望讀出數(shù)據(jù)的長度
2)Update Binary
功能:
此命令使用給定的數(shù)據(jù)來更新二進制文件部分或全部的內(nèi)容。
格式:
代碼 值
CLA ‘00’
INS ‘D6’
P1 見參數(shù)說明
P2 要修改的第一字節(jié)的偏移地址
Lc 后續(xù)數(shù)據(jù)域的長度
Data 修改用的數(shù)據(jù)
3)Read Record
功能:
此命令用于讀取記錄文件中指定記錄的內(nèi)容。
格式:
代碼 值
CLA ‘00’
INS ‘B2’
P1 記錄號
P2 見參數(shù)說明
Le 期望讀出數(shù)據(jù)的長度
4)Update record
功能:
此命令使用給定的數(shù)據(jù)來更新記錄文件中指定記錄的內(nèi)容。當所指定的文件非記錄文件時,命令將終止。
格式:
代碼 值
CLA ‘00’
INS ‘DC’
P1 P1=‘00’表示當前記錄 P1≠‘00’表示指定的記錄號
P2 見參數(shù)說明
Lc 后續(xù)數(shù)據(jù)域的長度
Data 更新原有記錄的新記錄
5)Verify PIN
功能:
此命令將校驗給定的密碼的正確性,根據(jù)比較的結(jié)果修改安全狀態(tài),若校驗失敗次數(shù)達到PIN嘗試上限,則PIN自動鎖定。
格式:
代碼 值
CLA ‘00’
INS ‘20’
P1 ‘00’
P2
Lc ’02’~‘10’
Data 外部輸入的個人密碼
6)Select File
功能:
此命令使用文件名或應(yīng)用標示符來選擇IC卡內(nèi)DF或EF。
格式:
代碼 值
CLA ‘00’
INS ‘A4’
P1 ‘00’
P2 ‘00’
Lc ‘00’(選擇MF文件)/ ‘02’
Data 無 / FID
7)Get Challenge
功能:
此命令請求IC卡返回一個用于安全相關(guān)過程的隨機數(shù)。
格式:
代碼 值
CLA ‘00’
INS ‘84’
P1 ‘00’
P2 ‘00’
Le ‘04’
8)Get Response
功能:
此命令為T=0協(xié)議情形4狀態(tài)下,用來取卡中返回的數(shù)據(jù)。
格式:
代碼 值
CLA ‘00’
INS ‘C0’
P1 ‘00’
P2 ‘00’
Le 響應(yīng)的期望數(shù)據(jù)最大長度
9)Internal Authenticate
功能:
此命令將為外部設(shè)備驗證卡中的秘密模塊的有效性提供數(shù)據(jù)。
格式:
代碼 值
CLA ‘00’
INS ‘88’
P1 ‘00’
P2 ‘00’~‘07’密鑰號
Lc ‘04’
Data 外部隨機數(shù)(4字節(jié))
10)External Authenticate
功能:
此命令將驗證外部設(shè)備中的秘密模塊的有效性。
格式:
代碼 值
CLA ‘00’
INS ‘82’
P1 ‘00’
P2 ‘00’ ~‘07’密鑰號
Lc ‘0C’
Data 發(fā)卡方認證數(shù)據(jù)
11)Change / Unlock PIN
功能:修改、解鎖、安裝卡片個人密碼。
格式:
代碼 值
CLA ‘00’
INS ‘5E’
P1 ‘00’ 修改卡片個人密碼;‘01’ 解鎖卡片個人密碼;‘02’ 安(重)裝卡片個人密碼
P2 密碼號
Lc
Data
12)Unlock Key
功能:
解鎖卡片應(yīng)用密鑰。
格式:
代碼 值
CLA ‘00’
INS ‘5C’
P1 ‘01’ 解鎖應(yīng)用密鑰 ‘02’ 安裝卡片應(yīng)用密鑰
P2 密鑰號
Lc 無 / 密鑰長度
Data 無 / 加密的密鑰
13)Create File
功能:
此命令創(chuàng)建卡片文件系統(tǒng)。
格式:
代碼 值
CLA ‘00’/ ’80’
INS ‘F2’
P1 ‘00’/ FTP 文件類型
P2 ‘00’/ FAC 文件訪問控制條件
Lc 無 / ‘07’
Data
第四章 AT90SC3232C帶有協(xié)處理器的CPU卡
AT90SC3232C是ATMEL公司最新推出的內(nèi)含協(xié)處理器的CPU卡,它以高性能、低功耗的AVR 8位CPU為核心,配合一個16位的協(xié)處理器(SC16)完成高速的保密和認證功能。
1)AT90SCC系列CPU卡的型號如下:
型號 程序空間 EEPROM空間 RAM空間 協(xié)處理器 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條指令,大多數(shù)指令為單個時鐘周期;
32K字節(jié)(16K字)的可下載一千次的程序存儲器;
32K字節(jié)的EEPROM數(shù)據(jù)存儲器;
1K字節(jié)RAM;
16位協(xié)處理器,預(yù)編程功能可用于保密和認證,一次1024位RSA的算法用220ms;
監(jiān)管模式(存儲器管理);
ISO-7816接口;
隨機數(shù)發(fā)生器;
16位定時器;
5個中斷源,兩個優(yōu)先級;
安全特征:掉電保護,低頻保護,高頻濾波,程序代碼加密;
低功耗閑置模式和掉電模式;
2.7V-5.5V的工作電壓。
一、AT90SC3232C結(jié)構(gòu)概述:
AT90SC3232C是基于AVR RISC增強型結(jié)構(gòu),有32個工作寄存器均可以單時鐘周期訪問,高性能的ALU(算術(shù)邏輯單元)可在一個時鐘周期內(nèi)完成取指、運算、和輸出結(jié)果的工作。ALU的操作分為3類:算術(shù)、邏輯和位操作功能。
在32個工作寄存器中,有6個寄存器可以被組成3對16位的間接尋址指針X、Y、Z。用以提高數(shù)據(jù)空間的訪問速度,其中一個指針還可以用于常數(shù)查表。
圖1,AT90SC3232C結(jié)構(gòu)圖
I/O空間包括64個地址,用于CPU對外設(shè)的訪問,如對控制寄存器、定時/計數(shù)器、外部中斷及ISO 7816引腳的訪問。
AVR CPU采用哈佛結(jié)構(gòu),程序區(qū)和數(shù)據(jù)區(qū)是分開的,程序存儲器使用單級管道流水線訪問,即:當一條指令被執(zhí)行時,下條指令被預(yù)先取出,這種機制使得在每個時鐘周期CPU都可以執(zhí)行指令。
AT90SCC 的程序計數(shù)器(PC)是16位,可以訪問64K字的地址空間,大多數(shù)的AVR指令都采用16位的字結(jié)構(gòu)。
二、協(xié)處理器和RAM
AT90SC3232C內(nèi)含一個16位的協(xié)處理器(SC16)和1K字節(jié)的RAM,可以方便地實現(xiàn)公共密鑰算法(如RSA),它與AVR CPU的接口采用RAM X空間而RAM Y空間被協(xié)處理器用做工作區(qū)。
公共密鑰算法(簡稱公鑰算法)簡介:算法使用2個密鑰,公共密鑰(簡稱公鑰)和私有密鑰(簡稱私鑰),他們是一對兒。當一個密鑰用于加密時,僅有另一個密鑰可用于解密,關(guān)鍵特點是在實踐中從公鑰不能推出私鑰,也不能用公鑰來完成私鑰的解密過程,這樣就可以把公鑰公開而不會泄密。
公鑰算法有兩個應(yīng)用:一是信息加密傳送,二是認證(如數(shù)字簽名)。
RSA算法是公鑰算法的一種,他基于數(shù)學(xué)上的對大數(shù)分解因子的難度。算法中私鑰包括兩個互質(zhì)的大數(shù)P、Q,和一個冪E,公鑰包含一個大數(shù)N=P*Q和冪E。設(shè)M(明文)是0至N-1之間的數(shù)。
則加密過程如下:
密文C=MEmod(N)
而解密過程相反。
AT90SC3232C的協(xié)處理器(SC16)可以實現(xiàn)公鑰和私鑰的運算,但是并不能直接生成密鑰。它有三個主要的運算功能(均可以對1024位的數(shù)據(jù)操作)。
1.“LOAD MODULUS”功能,即裝載N。
2.“LOAD PRIMES”功能,即裝載P、Q。
3.“MODULAR EXPONENTIATION”模冪運算功能。
模冪運算的操作為:DataEXPmod(Modulus),[按照符合中國剩余原理或者不符合的規(guī)則]。顯然,模冪運算功能的實現(xiàn)大大加快了RSA算法的運算過程。
三、ISO-7816接口:AT90SC3232C的引腳符合ISO-7816標準。
ISO-7816的接口包含以下引腳:
GND:地線;
VCC:電源;
I/O:串行數(shù)據(jù);
CLK:時鐘;
RST:復(fù)位;
I/O口由I/0控制寄存器的某一位來控制(置位/清除),輸入由I/O數(shù)據(jù)寄存器的某一位來獲得,I/O口也可以產(chǎn)生中斷。
四、安全保護機制
AT90SC3232C片內(nèi)含有監(jiān)管系統(tǒng),該系統(tǒng)可以管理內(nèi)存,監(jiān)督用戶程序?qū)?nèi)存的非法操作。
為了防止外部對芯片的探測,AT90SC3232C還具有如下措施:
內(nèi)部總線特殊處理,外觀沒有明顯結(jié)構(gòu),數(shù)據(jù)和地址總線均被埋入金屬層之下。
程序和數(shù)據(jù)均可以擾亂加密,在ATMEL工廠可以完成對總線的熔絲,使得同一條指令在不同的位置時代碼也不同,用戶還可以設(shè)置自己的擾亂密鑰。
五、結(jié)束語
AT90SC3232C是新一代的高速保密控制器,它具有高度的保密性和高速運算的能力,因此,它非常適用于商業(yè)銀行的金融業(yè)務(wù)、政府及軍警的機要通信業(yè)務(wù)。
ATMEL 公司還備有CPU卡的硬件開發(fā)系統(tǒng),如下圖所示: