C0-GET RESPONSE
C0即获取fcp(File Control Parameters 文件控制参数)里面的值,该指令一般在A4之后执行,执行A4选择文件夹时,SIM卡会返回该文件下fcp的长度,如:61 29,该值即为C0需要读的字节长度
C0指令比较固定,00 C0 00 00 XX(XX代表要读取的长度)
1.正常读取
SIM卡返回的数据以C0开始,以9000结束,长度为传入的XX(fcp文件的内容长度)。
=>00 A4 00 04 02
<=A4
=>3F 00
<=61 29 //返回长度0x29
=>00 C0 00 00 29 //读取0x29的fcp数据
<=C0 62278202782183023F00A507800171C00200018A01058B032F0602C60C90016083010183018183010A 9000 //90 00正常结束
2.读取少于/00原有数据
当读C0时,如果A4选择时,返回61 29,但是没有读取完全,如0x00 0xc0 0x00 0x00 0x20,则只会返回0x16个字节回来,并且返回剩余的字节数61开始(要读取00字节时,则以6C开始)这时你需要再次读取。
=>00 A4 00 04 02
<=A4
=>3F 00
<=61 29 //返回长度0x29
=>00 C0 00 00 20 //只读取0x20的fcp数据
<=C0 62278202782183023F00A507800171C00200018A01058B032F0602C60C900160 6109 //返回结束符为61 09,告诉你还有0x09个字节需要读取
=>00 C0 00 00 20 //这时候必须去读取0x09个字节,不然还是会报错
<=61 09 //返回剩余字节数,61开始
=>00 C0 00 00 00 //这时候必须去读取0x09个字节,不然还是会报错
<=6C 09 //返回剩余字节数,6C开始
=>00 C0 00 00 09
<=83010183018183010A 9000 //当用0x09读取时,则返回剩余的fcp数据,并90 00结束
3.读取多于原有数据
当读C0时,如果A4选择时,返回61 29,但是却想读取更多的内容,如0x00 0xc0 0x00 0x00 0x30,则会返回该文件的剩余大小6C开始,需要以实际大小来读取
=>00 A4 00 04 02
<=A4
=>3F 00
<=61 29 //返回长度0x29
=>00 C0 00 00 30 //读取0x30的fcp数据,超过0x29
<=6C 29 //返回剩余字节数
=>00 C0 00 00 29 //读取0x29的fcp数据
<=C0 62278202782183023F00A507800171C00200018A01058B032F0602C60C90016083010183018183010A 9000 //90 00正常结束
4.已经读取完C0,却要再读C0
当C0的数据已经被读取完成,此时再发C0指令进行内容的读取,则会返回6F00。如果想再次读取数据,只能用A4再选择一次该文件才可以。
=>00 A4 00 04 02
<=A4
=>3F 00
<=61 29 //返回长度0x29
=>00 C0 00 00 30 //读取0x30的fcp数据,超过0x29
<=6C 29 //返回剩余字节数
=>00 C0 00 00 29 //读取0x29的fcp数据
<=C0 62278202782183023F00A507800171C00200018A01058B032F0602C60C90016083010183018183010A 9000 //90 00正常结束
=>00 C0 00 00 29 //再次读取0x29的fcp数据
<=6F 00 //6F 00数据已经读取完成
5.未读取完C0,却要读B0/B2
无论上面的读少或读多C0的数据,只要没有正常结束则无法再执行文件对于的属性内容,
=>00 A4 00 04 02
<=A4
=>2F E2
<=61 19 //返回长度0x19
=>00 C0 00 00 19 //读取0x19的fcp数据
<=C0 62178202412183022FE28A01058B032F06018002000A880110 9000
=>00 B0 00 00 0A
<=B0 9868200B326101550494 9000 //90 00正常结束
=>00 A4 00 04 02
<=A4
=>2F E2
<=61 19 //返回长度0x19
=>00 C0 00 00 11 //读取0x19的fcp数据
<=C0 62178202412183022FE28A01058B032F06 6108
=>00 B0 00 00 0A
<=B0 9868200B326101550494 9000 //90 00正常结束
其实是可以正常读取B0/B2的,这时你是不是就觉得可以不用正确读取C0了,反正读到B0/B2。
这种想法就是错的,C0执行的指令比较单一,但是其指令返回的数据确实非常关键,里面的内容决定了该文件的特性,下一步能执行什么操作
6.fcp内容分析
示例1:B0
2FE2:62178202412183022FE28A01058B032F06018002000A880110
所属字节 | 原始内容 | 内容分析 |
---|---|---|
1 | 62 | FCP模块标签 |
2 | 17 | FCP模块的长度(十进制:23) |
3 | 82 | 文件描述符标签 |
4 | 02 | 文件描述符长度(十进制:2) |
5 | 41 | 文件描述符(工作EF 透明文件 共享文件) |
6 | 21 | 文件描述符数据编码 |
7 | 83 | 文件标识符标签 |
8 | 02 | 文件标识符长度(十进制:2) |
9-10 | 2FE2 | 文件标识符 |
11 | 8A | 生命周期标签 |
12 | 01 | 生命周期长度(十进制:1) |
13 | 05 | 生命周期(操作状态-激活) |
14 | 8B | 安全特性标签 |
15 | 03 | 安全特性长度(十进制:3) |
16-17 | 2F06 | EF_ARR的文件标识符 |
18 | 04 | EF_ARR中对应的记录数(十进制:4) |
19 | 80 | 文件大小标签 |
20 | 02 | 文件大小长度(十进制:2) |
21-22 | 000A | 文件大小(十进制:10) |
23 | 88 | 短文件标识符标签 |
24 | 01 | 短文件标识符长度(十进制:1) |
25 | 10 | 短文件标识符 |
示例2:B2
2F06:621A82054221002C0783022F068A01058B032F060480020134880130
所属字节 | 原始内容 | 内容分析 |
---|---|---|
1 | 62 | FCP模块标签 |
2 | 1A | FCP模块的长度(十进制:26) |
3 | 82 | 文件描述符标签 |
4 | 05 | 文件描述符长度(十进制:5) |
5 | 42 | 文件描述符(工作EF 线性固定文件 共享文件) |
6 | 21 | 文件描述符数据编码 |
7-8 | 002C | 记录长度(十进制:44) |
9 | 07 | 记录个数(十进制:7) |
10 | 83 | 文件标识符标签 |
11 | 02 | 文件标识符长度(十进制:2) |
12-13 | 2F06 | 文件标识符 |
14 | 8A | 生命周期标签 |
15 | 01 | 生命周期长度(十进制:1) |
16 | 05 | 生命周期(操作状态-激活) |
17 | 8B | 安全特性标签 |
18 | 03 | 安全特性长度(十进制:3) |
16-17 | 2F06 | EF_ARR的文件标识符 |
18 | 04 | EF_ARR中对应的记录数(十进制:4) |
19 | 80 | 文件大小标签 |
20 | 02 | 文件大小长度(十进制:2) |
21-22 | 0134 | 文件大小(十进制:10) |
23 | 88 | 短文件标识符标签 |
24 | 01 | 短文件标识符长度(十进制:1) |
25 | 30 | 短文件标识符 |
第五个字节即文件描述符
始内容 | 内容分析 |
---|---|
41 | 透明文件 B0 |
42 | 线性固定文件 B2 |
46 | 循环文件 B2 |
78 | MF/DF C0/F2 |