SURE系列全功能智能卡读写机 用户手册 【说 明】对卡操作前必须用此函数选择要操作的卡型, 卡型的划分如表4.1.2。
表4.1.2 卡型划分表 卡型代码 卡型名称 卡型代码 卡型名称 00 21 AT24C01A芯片 AT24C02卡 01 22 AT24C02芯片 AT24C04卡 02 23 AT24C04芯片 AT24C08卡 03 24 AT24C08芯片 AT24C16卡 04 25 AT24C16芯片 AT24C32卡 05 26 AT24C32芯片 AT24C65卡 06 27 AT24C65芯片 AT24C64卡 07 64 AT45D041 AT24C64芯片 10 30 AT88SC101卡 AT93C46卡 11 42 AT88SC102卡 SLE4442卡 12 43 AT88SC103卡 SLE4428卡 14 50 AT88SC1604卡 SLE4432卡 15 51 AT88SC1604A卡 SLE4418卡 16 AT88SC1608卡 20 AT24C01A卡 备注:芯片指SURE系列全功能智能卡通用读写机内部用于存放用户数据的集成电路(IC), 即数据存储芯片, 用户可以象智能卡一样操作它, 使用方法参见演示程序SUREINIC.PRG。未经说明时, 数据存储芯片为AT24C01A芯片。 【示 例】sele_card(11); 选择AT88SC102卡。 4. int power_on(void)
(LIB/DLL)
【功 能】给卡上电。 【参 数】无
【返回值】0: 正确;2: 无卡;4:串口错误;
【说 明】本读写机在卡未插入时自动下电, 确保卡插入时不带电, 对卡操作前必须用 此函数给卡上电。
【示 例】power_on() 5. int power_off(void)
(LIB/DLL)
【功 能】卡下电, 对于自弹式读写机同时退卡。 【参 数】无
【返回值】0: 正确;2: 无卡;4:串口错误; 【说 明】根据用户需要可用此函数给卡下电。
31
SURE系列全功能智能卡读写机 用户手册 【示 例】power_off()
6. int inquire(unsigned char *BUFF) (LIB) int inquire(LPSTR BUFF)
(DLL)
【功 能】取读写机对卡操作的历史状态;
【参 数】BUFF为用于存储读写机状态的字符型指针; 【返回值】0: 正确;4:串口错误;
【说 明】BUFF[0]为密码核对正确否标志, “00” 正确、“FF” 不正确; BUFF[1]为卡毁坏否标志, “00” 正常、“FF” 毁坏; BUFF[2]为应用区2毁坏否标志, “00” 正常、“FF” 毁坏; BUFF[3]为应用区2擦除密码核对正确否标志, “00” 正确、“FF” 不正确; BUFF[4]为应用区1擦除密码核对正确否标志, “00” 正确、“FF” 不正确; BUFF[5]为卡上电否标志, “00” 上电、“FF” 下电; BUFF[6]为卡插入否标志, “00”插入、“FF”未插入。
【示 例】unsigned char BUFF[10]; int i; I=inquire (BUFF ) 7. int rd_asc(int APZ, int ADDRESS, int LENGTH, unsigned char *BUFF) (LIB) int rd_str(int APZ, int ADDRESS, int LENGTH, unsigned char *BUFF) int rd_asc(int APZ, int ADDRESS, int LENGTH, LPSTR BUFF) (DLL)
int rd_str(int APZ, int ADDRESS, int LENGTH, LPSTR BUFF) 【功 能】读卡或读写机存储区中的内容; 【参 数】APZ为区域代码; ADDRESS为要读字节的起始地址; LENGTH为要读的字节长度; BUFF为用于存储数据的HEX码字符型指针;
【返回值】若有错误则返回整型数, 3: 无卡;4: 串口错误;9:长度超出错误; 正确则返回读出的HEX码字符串; 【说 明】rd_asc函数对HEX码字符串进行读操作。 rd_str函数对ASC码字符串进行读操作。
参数中的区域代码APZ, 不同的卡型有不同的定义。 对于AT88SC101、AT88SC102、AT88SC103和AT88SC1604, 其定义为: 0,
公用区;1, 应用区一; 2, 应用区二;3, 应用区三;4, 应用区四。 只是应用区的多少不同;
对于SIEMENS 智能卡, 其定义为:0, 公用区;1, 应用数据区; 对于其它非加密卡, 其定义为:0, 应用数据区。 【示 例】unsigned char BUFF[20];
32
SURE系列全功能智能卡读写机 用户手册 int i; sele_card(11); // AT88SC102 power_on(); // 卡上电 i=rd_asc(0, 0, 10, BUFF); //读AT88SC102公用区0字节开始的10字节至BUFF i=rd_str(0, 0, 10, BUFF); //读AT88SC102公用区0字节开始的10字节至BUFF
8. int wr_asc(int APZ, int ADDRESS, int LENGTH, unsigned char *BUFF) (LIB) int wr_str(int APZ, int ADDRESS, int LENGTH, unsigned char *BUFF) int wr_asc(int APZ, int ADDRESS, int LENGTH, LPSTR BUFF) (DLL)
int wr_str(int APZ, int ADDRESS, int LENGTH, LPSTR BUFF) 【功 能】把BUFF中的数据写入卡或读写机存储区中; 【参 数】APZ为区域代码; ADDRESS为要写入的字节的起始地址; LENGTH为要写入的字节长度; BUFF为用于存储写入数据的HEX码字符型指针;
【返回值】0: 正确;2: 无卡;3:未上电;4:串口错误;9:长度超出错误; 【说 明】wr_asc函数对HEX码字符串进行写操作。 wr_str函数对ASC码字符串进行写操作。
APZ的定义和长度超出错误的解释同上, 特别注意:返回0-正确, 并不表示写入
就一定正确, 故写卡操作后, 还应通过读卡校验来判断写卡正确否。
【示 例】unsigned char BUFF[ ]=“112233445566778899AA”; int I; I=wr_asc(2, 10, BUFF);// 将HEX码字符串”112233445566778899AA” //写入应用一从2字节开始的10字节 I=wr_str(2, 20, BUFF);// 将HEX码字符串“GUANKANGLIN123456789” //写入应用一从2字节开始的20字节 9. void des_str(unsigned char * BUFF, unsigned char * DES) (LIB) void des_asc(unsigned char * BUFF, unsigned char * DES) void des_str(LPSTR p_cont, LPSTR p_secr) (DLL) void des_asc(LPSTR p_cont, LPSTR p_secr)
【功 能】 用DES算法加密8字节ASCII码或16字节HEX码数据;
【参 数】 DES为存放8字节ASCII码或16字节HEX码密钥的字符型指针; BUFF为8字节ASCII码或16字节HEX码明文及8字节ASCII码或16 字节HEX码密文存贮指针; 【返回值】无;
【说 明】要加密的ASCII码数据字节BUFF长度必须为8, HEX码数据字节 BUFF长度必须为16。
33
SURE系列全功能智能卡读写机 用户手册 【示 例】 参见(9) 。
【参 数】 DES为存放密钥的字符型指针; BUFF为16字节HEX码明文及16字节HEX码密文存贮指针; 10. void undes_str(unsigned char * BUFF, unsigned char * DES) (LIB) void undes_asc(unsigned char * BUFF, unsigned char * DES) void undes_str(LPSTR p_cont, LPSTR p_secr) (DLL) void undes_asc(LPSTR p_cont, LPSTR p_secr)
【功 能】 把用DES算法加密的8字节ASCII码或16字节HEX码密文转换为8字节 ASCII码或16字节HEX码明文;
【参 数】 DES为存放8字节ASCII码或16字节HEX码密钥的字符型指针; BUFF为8字节ASCII码或16字节HEX码密文及8字节ASCII码或16 字节HEX码明文存贮指针; 【返回值】无;
【说 明】ASCII码密文BUFF长度必须为8, HEX码密文BUFF长度必须为16。 【示 例】 unsigned char DES1[ ]=“abcwdeso”, DES2[ ]=“0123456789ABCDEF”; unsigned char BUFF1[8], BUFF2[8]; int i; for(i=0 ;i<8 ;i++) BUFF1[i]=i ; des_str(BUFF1, DES1); //经过DES算法后的密文存贮于BUFF1中 undes_str(BUFF1, DES1); //密文转换为明文存贮于BUFF1中 for(i=0 ;i<16 ;i++) BUFF2[i]=i ; des_str(BUFF2, DES2); //经过DES算法后的密文存贮于BUFF2中 undes_str(BUFF2, DES2); //密文转换为明文存贮于BUFF2中
第二部分 加密卡专用接口函数
1. int chk_sc(int APZ, int LENGTH, unsigned char *BUFF)
(LIB)
int chk_sc(int APZ, int LENGTH, LPSTR BUFF) (DLL) 【功 能】核对加密卡主密码或区域密码;
【参 数】APZ为区域代码:0,主密码区;1,应用区一; 2, 应用区二; 3, 应用区三;
4, 应用区四; LENGTH为密码长度;
BUFF为用于存储密码的整型指针;
【返回值】0: 正确;2: 无卡;3:未上电;4:串口错误;9:数据长度错误;11: 密码
错误; 14: 卡已损坏;
【说 明】对加密卡进行读写前须用此函数核对密码后才能进行; 【示 例】unsigned char BUF0[ ]=“F0F0”; int I; I=chk_sc(0, 2, BUF0); //核对AT88SC102主密码长度为2字节
34
SURE系列全功能智能卡读写机 用户手册
第三部分 ATMEL加密卡专用接口函数
1. int fuse(void) (LIB/DLL) 【功 能】熔丝操作; 【参 数】无;
【返回值】0: 正确;2: 无卡;3:未上电;4:串口错误;
【说 明】熔断会造成几个不可修复的状态, 包括发行区可见但不可变、密码不可见但 可变、擦除密码不可见且不可变。 【示 例】I=fuse( )
2. int chk_erk(int APZ, int LENGTH, unsigned char *BUFF) int chk_erk(int APZ, int LENGTH, LPSTR BUFF)
(LIB)
(DLL)
【功 能】核对应用区的擦除密码;
【参 数】APZ为区域代码:1, 应用区一;2, 应用区二;3, 应用区三;4, 应用区 四; LENGTH为擦除密码长度; BUFF为用于存储擦除密码的字符型指针; 【返回值】0: 正确;2: 无卡;3:未上电;4:串口错误;12: 擦除密码错误; 13: 应用区已损;
【说 明】此函数仅对熔丝后的ATMEL加密卡:AT88SC101, AT88SC102, AT88SC103,
AT88SC103, AT88SC1604等有效, 用来擦除整个应用区。返回参数13仅在核对AT88SC102的应用区二的擦除密码时有, AT88SC102 应用区二最多只能擦128次。
【示 例】unsigned char buf1[]=“0123456789AB”; unsigned char buf2[]=“01234567”; //AT88SC102 应用区一擦除密码为6字节长度 //AT88SC102 应用区二擦除密码为4字节长度 int i, j; sele_card(11); //选择AT88SC102卡 power_on(); i=chk_erk(1, 6, buf1); //核对应用区一擦除密码长度为6字节 j=chk_erk(2, 4, buf2); //核对应用区二擦除密码长度为4字节 3. int era_at(int APZ, int ADDRESS, int LENGTH)
(LIB/DLL)
【功 能】ATMEL加密卡字节擦除, 即把指定位置的数据擦成0xff; 【参 数】APZ为区域代码; ADDRESS为要擦除的字节的起始地址; LENGTH为要擦除的字节长度;
【返回值】0: 正确;2: 无卡;3:未上电;4:串口错误;
【说 明】此函数仅在核对密码正确后有效, ATMEL加密卡不能直接用写卡函数wr_asc()
35