关于社会保障卡(社保卡)内容的具体资料,请查阅“人社信息函 2012 37 号 关于印发社会保障卡文件结构和数据项(V2.0)的通知”
卡内只有EF05-发卡机构数据文件和EF06-持卡人的基本信息文件是不需要密码验证就可以读取的,以下只针对这两个文件内容的读取操作进行说明。
数据项的格式与属性
请参阅:https://www.cnblogs.com/nightnine/p/11495740.html
APDU指令格式:
CLA | INS | P1 | P2 | Lc | Data | Le |
读取数据项分三步:
1、先选择 社会保障系统环境
APDU指令:00 A4 04 00 0F 7378312E73682EC9E7BBE1B1A3D5CF
说明:
00 A4:APDU的select file指令(CLA INS)
04 00:参数(P1 P2)具体参数项及含义不详,网上资料太少
0F:后面跟随的参数的长度
7378312E73682EC9E7BBE1B1A3D5CF:转换为CHAR后=sx1.sh.社会保障
命令可理解为:按应用标识符选择应用文件
2、选择EF06文件
APDU指令:00 A4 02 00 02 EF06
00 A4:同上
02:P1参数,按文件标志符选择文件
00:P2参数
02:后面跟随的参数的长度
EF06:文件标志符
3、选择所需的数据项并返回数据,两种指令都可以使用
APDU指令1:00 B2 01 04 00
00B2:APDU的READ RECORD指令(CLA INS)
01:P1参数,数据项序号,根据第二步选择的文件按顺序排列
04:P2参数,按数据项序号读取
00:期望返回的数据长度(经测试似乎没啥卵用)
APDU指令2:00 B2 08 00 00
00B2:APDU的READ RECORD指令(CLA INS)
08:P1参数,数据项标志
00:P2参数,按数据项标志读取
00:期望返回的数据长度(经测试似乎没啥卵用)
调试经验:
使用德卡T10读卡器,在delphi7下调试
指令入参不能使用array of char或array of byte变量,需使用PChar(#$00#$A4#$02#$00#$02#$EF#$06)形式传入指令
例:
var
icdev, DataLen : Cardinal;
Data : array[0..31] of Byte;
begin
dc_cpuapduInt(icdev, 5, PChar(#$00#$B2#$08#$00#$12), @DataLen, @Data)
end;
DataLen是返回的数据Data的有效长度
返回值要注意数据类型是an或是cn
an类型的值用Chr(Data[I])转换,cn类型的用IntToHex(Data[2],2)转换
返回值中前两个字节跳过不可用,末两个字节是执行状态代码,$9000表示成功,其它代表失败,可通过查询APDU应答状态码查看失败原因