1、SIM卡文件结构专有名词解析:
MF(Master File)主文件
EF(Elementary File)基本文件
DF(Dedicated File)专用文件
ADF(Application Dedicated File)应用专用文件
AID(Application IDentifier)应用标识符
fcp(File Control Parameters)文件控制参数
binary二进制内容
record记录
2、文件结构
一个MF里面会包含ADF/DF/EF,ADF下面也会包含DF/EF,DF下面又会包含DF/EF,不过EF下面就不会再包含其他文件了。
所以我们可以把MF当做主文件夹,ADF/DF当做次文件夹,EF当做最后一层文件夹;
MF/ADF/DF下面只有fcp,EF下面有fcp/binary/record
MF(Master File):主文件,理解为根目录。MF文件的ID为3F00
DF(Dedicated File):专用文件,理解为文件夹。常见的DF有:
- DF-GSM:ID为7F20
- DF-TELECOM:ID为7F10
- ADF:Application DF,ID为7FFF
EF(Elementary File):基本文件,存储数据用的文件。基本文件又分为3类
-
透明EF:透明结构的 EF 由一个字节序列组成。简单理解为 只有一条记录 \color{Red}{只有一条记录} 只有一条记录的文件
-
线性固定EF:线性固定 EF 文件由一个记录长度固定的记录序列组成。第一个记录记录号是 1。 简单理解为记录多条记录的文件。
-
循环EF:循环文件用于以时间顺序存储的记录,当所有的记录空间都占用时,新的存储数据将覆盖最旧的信息。 如果线型固定EF的记录是一个数组的话,循环EF的记录就是一个循环链表。
注意:线性固定 E F 和循环 E F 最多只能存放 255 条记录 \color{Red}{注意:线性固定EF和循环EF最多只能存放255条记录} 注意:线性固定EF和循环EF最多只能存放255条记录
根据上面的描述,可以看得出来,要精确的定位到一个EF文件,完整的文件路径应该是:MFID + DFID + EFID。比方说在DF-TELECOM下面的EF-SMS(保存短消息的SIM卡文件,ID为6F3C),完整路径就是“3F007F106F3C”。
下图为SIM卡部分内容结构图:
3、文件操作指令
COMMAND | 值 | 说明 |
---|---|---|
SELECT | ‘A4’ | 选择文件 |
STATUS | ‘F2’ | 查询当前目录的信息 |
READ BINARY | ‘B0’ | 读取透明EF内容/二进制 |
UPDATE BINARY | ‘D6’ | 更新透明EF内容/二进制 |
READ RECORD | ‘B2’ | 读取线性固定EF或者循环EF的记录 |
UPDATE RECORD | ‘DC’ | 更新线性固定EF或者循环EF的记录 |
SEEK | ‘A2’ | 查找线性固定EF中与关键字相匹配的记录 |
INCREASE | ‘32’ | 向循环EF中插入最旧的记录 |
VERIFY CHV | ‘20’ | 验证PIN码 |
CHANGE CHV | ‘24’ | 修改PIN码 |
DISABLE CHV | ‘26’ | 关闭PIN码验证 |
ENABLE CHV | ‘28’ | 打开PIN码验证 |
UNBLOCK CHV | ‘2C’ | 解锁 |
INVALIDATE | ‘04’ | 功能使当前 EF 无效 |
REHABILITATE | ‘44’ | 使当前无效的 EF 恢复有效状态 |
RUN GSM ALGORITHM | ‘88’,‘89’ | 起动 SIM 卡中的 GSM 算法 A3 和 A8 |
SLEEP | ‘FA’ | 睡眠 命令只被 Phase1 的移动设备支持,对于 Phase2 或者以后的移动设备不会使用该命令。 |
GET RESPONSE | ‘C0’ | 返回指令的响应数据 |
TERMINAL PROFILE | ‘10’ | 告知SIM卡手机对STK的支持能力,初始化SIM卡的过程中发给SIM卡。 |
ENVELOPE | ‘C2’ | ‘手机发送数据或者事件给SIM卡。 |
FETCH | ‘12’ | 手机从SIM卡获取命令 |
TERMINAL RESPONSE | ‘14’ | 手机返回SIM卡执行主动式命令的结果 |
补充: \color{Red}{补充:} 补充:
COMMAND | 值 | 说明 |
---|---|---|
RETRIEVE DATA | ‘CB’ | |
SET DATA | ‘DB’ | |
GET CHALLENGE | ‘84’ | |
TERMINAL CAPABILITY | ‘AA’ | |
MANAGE CHANNEL | ‘70’ | |
MANAGE SECURE CHANNEL | ‘73’ | |
TRANSACT DATA | ‘75’ |
4、文件操作应答内容
4.1、正常过程(90xx、91xx、92xx)
SW1 SW2 | 说明 |
---|---|
9000 | 命令正常完成 |
91xx | 命令正常完成,加上来自主动UICC的额外信息,其中包含用于终端的命令。响应数据长度xx |
92xx | 命令正常完成,带有关于正在进行的数据传输会话的额外信息 |
4.2、推迟处理(9300)
SW1 SW2 | 说明 |
---|---|
9300 | SIM卡应用工具箱忙。命令暂时无法执行,允许执行下一步正常命令 |
4.3、警告(62xx、63xx)
SW1 SW2 | 说明 |
---|---|
6200 | 没有给出信息,非易失性存储器的状态不变 |
6281 | 部分返回的数据可能已损坏 |
6282 | 在读取LE字节之前到达文件/记录的结束位置 |
6283 | 选择的文件无效 |
6285 | 选择的文件处于终止状态 |
62F1 | 更多可用数据 |
62F2 | 更多可用数据和主动命令等待处理 |
62F3 | 响应数据可用 |
63F1 | 预计会有更多数据 |
63F2 | 更多的数据预期和主动命令等待 |
63Cx | 命令成功,但在使用内部更新后重试例程X次;验证失败,x重试(见注释) |
注释 | 对于VERIFY PIN命令,SW1 SW2表示命令成功,但PIN不正确,并且还有X重试。对于所有其它命令,它表示卡为完成命令而内部重试次数。 |
4.4、执行错误(6400、6500、6581)
SW1 SW2 | 说明 |
---|---|
6400 | 没有给出信息,非易失性存储器的状态不变 |
6500 | 没有给出信息,非易失性存储器的状态改变 |
6581 | 内存问题 |
4.5、检查错误
SW1 SW2 | 说明 |
---|---|
6700 | 错误的长度 |
67xx | 除了SW2=00外,这个状态字的解释与命令有关 |
6B00 | 错误参数P1-P2 |
6D00 | 指令代码不受支持或无效 |
6E00 | 不支持的类 |
6F00 | 技术问题,没有精确的诊断 |
6FXX | 除了SW2=00外,这个状态字的解释与命令有关 |
4.6、在CLA功能不受支持(68xx)
SW1 SW2 | 说明 |
---|---|
6800 | 未提供资料 |
6881 | 不支持的逻辑通道 |
6882 | 不支持安全消息传递 |
4.7、不允许的命令(69xx)
SW1 SW2 | 说明 |
---|---|
6900 | 未提供资料 |
6981 | 命令与文件结构不兼容 |
6982 | 不满足安全状态 |
6983 | 认证/PIN方法阻塞 |
6984 | 提及数据无效 |
6985 | 不符合使用条件 |
6986 | 命令不允许(没有选择EF) |
6989 | 命令不允许-安全通道-安全性不满足 |
4.8、错误参数(6Axx)
SW1 SW2 | 说明 |
---|---|
6A80 | 数据字段参数不正确 |
6A81 | 不支持此功能 |
6A82 | 未找到文件 |
6A83 | 没有找到记录 |
6A84 | 内存空间不足 |
6A86 | P1-P2参数不正确 |
6A87 | Lc与P1到P2不一致 |
6A88 | 未找到参考数据 |
4.9、应用程序错误(98xx)
SW1 SW2 | 说明 |
---|---|
9850 | 无法执行INCREASE,已达到最大值 |
9862 | 身份验证错误,特定于应用程序 |
9863 | 安全会话或关联过期 |
注释 | 应用程序可以定义自己的错误代码 |
补充: \color{Red}{补充:} 补充:
SW1 SW2 | 说明 |
---|---|
9000 | 命令正常完成 |
61XX | SW2表示仍然有效的响应字节数 |
6E00 | CLA不支持 |
6D00 | CLA支持,但INS未编程或无效 |
6B00 | CLA INS支持,但P1、P2不正确 |
6700 | CLA INS P1 P2支持,但P3不正确 |
6F00 | 命令不支持且未给出精确诊断 |
6982 | 不满足安全条件:SIM PUK时,想要读IMSI就会出现 |
6E00 | SIM卡却用USIM卡的指令 |
6A82 | 没有找到文件 |
6A86 | P1-P2参数不对 |