SIM卡APDU指令

来源:互联网 发布:如何开个淘宝店铺 编辑:程序博客网 时间:2024/05/19 01:14

一个APDU可以是一个命令,也可以是命令的响应。

命令APDU的一般格式: 
CLA INS P1 P2 P3 Data

响应APDU的一般格式: 
Data SW1 SW2

各个字节的意义如下: 
CLA: 是指令类型,GSM应用为0xA0。

INS:每个命令的指令编码,下面有定义。

P1,P2,P3:指令参数。0xFF是个无效值,P3给出了数据单元的长度。对于传送命令,当SIM 流出数据时,P3=0表示数据的长度为256,而SIM 流入数据时P3=0表 示没有数据。

SW1,SW2:命令结果是否成功的状态。

指令的5种情况

情况1:没有输入/没有输出 
CLA INS P1 P2 P3(lgth=0x00) 
SW1=0x90 SW2=0x00

情况2:没有输入/输出长度已知 
CLA INS P1 P2 P3(长度值lgth) 
DATA(长度为lgth) SW1=0x90 SW2=0x00

情况3:没有输入/输出长度未知 
CLA INS P1 P2 P3(lgth=0) 
SW1=0x9F SW2=lgth1 
GET RESPONSE 
CLA INS P1 P2 P3(lgth2) 
DATA(长度leth1<=leth2) SW1=0x90 SW2=0x00

情况4:有输入/没有输出 
CLA INS P1 P2 P3(lgth) 
DATA(长度为lgth) SW1=0x90 SW2=0

情况5:有输入/输出长度未知或已知 
CLA INS P1 P2 P3(lgth) 
DATA(长度为lgth) SW1=0x9F SW2=lgth1 
GET RESPONSE 
CLA INS P1 P2 P3(lgth2) 
DATA(长度lgth2<=lgth1) SW1=0x90 SW2=0x00

11.11中命令集如下: 
这里写图片描述

(1) SELECT 
选择一个文件的方法:

    ATR(复位)之后,MF将取消被选择,并且成为当前的目录。每个文件必须通过SELECT功能通过下面的规则来选择。    这时,你可以选择MF,也可以选择MF目录下的DF和MF目录下EF,若想要选择某一DF中的EF,必须先选择该DF成为当前目录,再选择DF中的EF。

例:

//SELECTA0 A4 00 00 02 3F009F 17//SELECTA0 A4 00 00 02 7F109F 17//SELECTA0 A4 00 00 02 6F3A9F 0F

CLA=A0:表示GSM应用 
INS=A4:表示SELECT 
P1P2=0000:表示参数 
P3=02:表示输入文件ID的长度 
3F00,7F10,6F3A表示选择的文件ID 
SW1=9F SW2=17(23)/0F(15)表示命令正确结束,其中SW2表示响应值长度

(2) STATUS

此功能返回与当前文件目录(根目录或应用目录)有关的信息,此操作不会改变当前EF内容;这条命令可在任何时候使用,以获得与GSM应用有关的信息;输入:无;输出:文件标识符,总的可用存储空间,CHV激活/屏蔽,CHV状态和其他的GSM详细数据

例:

//SELECTA0 A4 00 00 02 7F109F 22//STAUTSA0 F2 00 00 2290 0000005DD07F1002000000000015B10114060085838583000083830000000000000000

CLA=A0:表示GSM应用 
INS=F2:表示STATUS 
P1P2=0000:表示参数 
P3=22:表示返回响应值长度(从SELECT的返回值中获取) 
SW1=90 SW2=00 表示命令正确结束 
00005DD07F1002000000000015B10114060085838583000083830000000000000000表示返回的响应值(响应的参数/数据同使用SELECT命令选中MF和DF时的响应数据相同。)

(3) GET RESPONSE

此功能返回与当前文件目录(根目录或应用目录)有关的信息这条命令可在任何时候使用,以获得与GSM应用有关的信息;输入:无;输出:文件标识符,总的可用存储空间,CHV激活/屏蔽,CHV状态和其他的GSM详细数据STATUS与GET RESPONSE:区别在于STATUS命令不适用与EF,其中P3所需要的len为select响应的参数SW2//SELECTA0 A4 00 00 02 3F009F 17//SELECTA0 A4 00 00 02 7F10 9F 17//SELECTA0 A4 00 00 02 6F3A9F0F//GET RESPONSEA0 C0 00 00 0F0000 0AF0 6F3A 04 00 11 FF 44 01 02 01 1C90000000 0AF0 6F3A 04 00 11 FF 44 01 02 01 1C//--00 00 保留//--0A F0 占用的空间大小,表示7000字节//--6F 3A 选中File的ID//--04 文件类型,见11.11 9.3//----'00':保留 '01':MF '02':DF '04':EF//----此文件类型 EF//--00 见11.11 9.2.1 detail 3//----对于二进制和记录文件,该字节为保留字节。对于循环文件,除b6(0 based)外所有的bit都是保留的,b6=1表示当前所选择的循环文件可以执行INCREASE命令//--11 FF 44 访问权限//--01 文件状态,见11.11 9.3//----+--+--+--+--+--+--+--+--+//----|b7|b6|b5|b4|b3|b2|b1|b0|//----+--+--+--+--+--+--+--+--+//---- | | | | | | | +-b0=0文件无效, b0=1文件有效//---- | | | | | | +----RFU//---- | | | | | | b2=0: 当文件无效时不允许读和写//---- | | | | | +-------b2=1: 当文件无效时允许读和写//---- +--+--+--+--+----------RFU//----本字节表示文件有效,当文件无效时不允许读/写//--02 后面数据的长度,表示2//----01 文件结构,见11.11 9.3//------'00':二进制文件(透明文件) '01':记录文件(线性定长) '03':循环文件//------此文件结构记录文件//----1C 记录长度,见11.11 9.2.1 detail 4

(4)READ BINARY

此功能允许SIM卡从当前透明文件中读取字节串;如果不满足EF文件READ指令的访问准予条件,SIM卡拒绝该功能;输入:字节串的偏移地址和长度;输出:字节串;

//SELECT 
A0 A4 00 00 02 2F05 
9F 0F

//GET RESPONSE 
A0 C0 00 00 0F 
0000 0008 2F05 04 00 01FF55 01 02 0000 
90 00

//READ BINARY 
A0 B0 00 00 08 
6573656E66727074 
90 00

//READ BINARY 
A0 B0 00 01 04 
73656E66 
90 00

CLA=A0:表示GSM应用 
INS=B0:表示READ BINARY 
P1P2=0000:表示高低位偏移 
P3=08:表示返回响应值长度(从SELECT的返回值中获取) 
(当P1P2=0001,P3=04时表示向右偏移1位,返回长度为4的响应值) 
SW1=90 SW2=00 表示命令正确结束

(5)UPDATE BINARY

此功能用于更新当前透明文件的字节串;如果不满足EF文件UPDATE指令的访问准予条件,SIM卡拒绝该功能;输入:字节串的偏移地址和长度;输出:无;

//SELECT 
A0 A4 00 00 02 2F05 
9F 0F

//GET RESPONSE 
A0 C0 00 00 0F 
0000 0008 2F05 04 00 01FF55 01 02 0000 
90 00

//READ BINARY 
A0 B0 00 00 08 
6573656E66727074 
90 00

//UPDATE BINARY 
A0 D6 00 00 08 
0000000000000001 
90 00

//READ BINARY 
A0 B0 00 00 08 
0000000000000001 
90 00 
更新成功!

(6)READ RECORD 
此功能用于读取线性固定文件或循环文件的记录; 
如果不满足EF文件READ指令的访问准予条件,SIM卡拒绝该功能。若操作失败,记录指针不改变; 
读指令定义了4种模式: 
CURRENT模式(04):读当前的记录,记录指针不变; 
ABSOLUTE模式(04+记录号):读给定记录号的记录,记录指针不变; 
NEXT模式(02):功能执行前记录指针加一,然后读取指针指向的记录。 
PREVIOUS模式(03):功能执行前记录指针减一,然后读取指针指向的记录。 
输入:模式、记录号(ABSOLUTE模式)、记录长度; 
输出:记录;

//SELECT 
A0A4000002 3F00 
9F17

//SELECT 
A0A4000002 7F10 
9F17

//SELECT 
A0A4000002 6F3A 
9F0F

//GET RESPONSE 
A0C000000F 
00000AF06F3A040011FF440102011C 
9000

//READ RECORD 
A0B201041C 
80aabbccddFFFFFFFFFFFFFFFFFF07812143658709F1FFFFFFFFFFFF 
9000

(7)UPDATE RECORD

向线性定长记录的EF文件或循环记录EF文件中写入一条完整的记录;如果不满足EF文件UPDATE指令的访问准予条件,SIM卡拒绝该功能。若操作失败,记录指针不改变;

//SELECT 
A0A4000002 3F00 
9F17

//SELECT 
A0A4000002 7F10 
9F17

//SELECT 
A0A4000002 6F3A 
9F0F

//GET RESPONSE 
A0C000000F 
00000AF06F3A040011FF440102011E 
9000

//UPDATE RECORD 
A0DC01041E

输入数据: 
111110000000000000000000000000000000000000000000000000000000

90 00

0 0
原创粉丝点击