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