SIM卡APDU命令
APDU既是命令也是命令的响应。
命令APDU的常规格式: CLA INS P1 P2 P3 Data
响应APDU的常规格式: Data SW1 SW2
各字节的含义如下。 CLA:为指令型,GSM APP应用程序为0xA0。
INS )每个命令的指令代码,定义如下。
P1、P2、P3 :指令参数。0xFF为无效值,P3表示数据单元的长度。 在传输命令的情况下,当SIM流出数据时,P3=0表示数据长度为256,而当SIM流入数据时,P3=0表示没有数据。
SW1,SW2 :命令结果是否成功的状态。
命令的五种情况
情况1 :无输入/无输出1:clainsP1P2P3(lgth=0x00 ) SW1=0x90 SW2=0x00 )
情况2 :没有输入输出长度已知的CLA INS P1 P2 P3 (长度值lgth ) DATA (长度lgth ) SW1=0x90 SW2=0x00
情况3 :输入/输出长度未知的clainsP1P2P3(lgth=0) sw1=0x9fs w2=LGT h1 getresponseclainsp1P2P3) LGTH2 ) DATA )长度leth1=leth2 ) sw1
情况4 :有输入/无输出clainsp1p2p3(lgth )数据)长度lgth ) SW1=0x90 SW2=0
情况5 )输入/输出长度未知或已知的clainsP1P2P3(lgth ) DATA (长度为lgth ) sw1=0x9fs w2=LGT h1 getresponseclainsp1P2P3) lgth (数据)长度lgth=
11.11指令集如下:
)1)如何选择选择文件:
ATR (复位)后,MF将取消选择并成为当前目录。 每个文件都必须在选择功能中按以下规则选择:
在这种情况下,选择MF或选择MF目录下的DF和MF目录下的EF。 如果要选择某个DF中的EF,必须先将该DF设置为当前目录,然后再选择DF中的EF。
示例:
//选择
A0 A4 00 00 02 3F00
9F 17战斗机
//选择
A0 A4 00 00 02 7F10
9F 17战斗机
//选择
A0 A4 00 00 02 6F3A
9F 0F
cla=A0 :表示GSM APP应用程序ins=a4:selectp1p2=0000 :参数P3=02 :表示输入文件ID的长度3f00、7f10、6f3a为所选择的文件ids w1=9fs w2=110
)2)状态
此功能可返回有关当前文件目录(根目录或APP应用程序目录)的信息。 此操作不会更改当前EF的内容。
您可以随时使用此命令获取有关GSM APP应用程序的信息;
输入:无;
输出—文件标识符、可用存储总容量、CHV活动/掩码、CHV状态和其他GSM详细数据
示例:
//选择
A0 A4 00 00 02 7F10
9F 22战斗机
//STAUTS
A0 F2 00 00 22
90 00
00005 DD 07 f 10020000000015 b 10114060085838300008300008300000000000000000000
cla=A0 :表示GSM APP ins=F2 :表示STATUS P1P2=0000 :表示参数P3=22 :表示返回响应值的长度(从选择的返回值获取) ) ) ) ) ) ) SW1=90 SW2=00表示命令已成功退出000005 dd07 f 100200000000015 b 10114060085838300083000000000。 (响应的参数/数据与使用SELECT命令选择MF和DF时的响应数据相同。 )
)3)获取响应
此功能可返回有关当前文件目录(根目录或APP应用程序目录)的信息
您可以随时使用此命令获取有关GSM APP应用程序的信息;
输入:无;
输出:文件标识符、可用存储总量
空间,CHV激活/屏蔽,CHV状态和其他的GSM详细数据
STATUS与GET RESPONSE:区别在于STATUS命令不适用与EF,其中P3所需要的len为select响应的参数SW2
//SELECT
A0 A4 00 00 02 3F00
9F 17
//SELECT
A0 A4 00 00 02 7F10
9F 17
//SELECT
A0 A4 00 00 02 6F3A
9F0F
//GET RESPONSE
A0 C0 00 00 0F
0000 0AF0 6F3A 04 00 11 FF 44 01 02 01 1C
9000
0000 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
APDU= ApplicationProtocol data unit, 是智能卡与智能卡读卡器之间传送的信息单元, (给智能卡发送的命令)指令(ISO 7816-4规范有定义) CLA INS P1 P2 Lc Data Le
其中CLA为指令类别;INS为指令码;P1、P2为参数;Lc为Data的长度;Le为希望响应时回答的数据字节数,0表最大可能长度。
00A4040000:发送一个空的选择命令,获取卡和主安全域的信息。00A40400是select选择对应的CLA,INS,P1和P2,后面2位是发送的文件名的长度。此命令使用文件名或应用标示符来选择IC卡内DF(专用文件)或EF(基本文件)。
80此命令创建卡片文件系统,80CA9F7F00:获取CPLC信息。8050XXXXX: 双向认证并建立会话密钥。
非接触CPU卡应该支持以下与应用无关的常用指令命令:
编号
指令
指令类别
指令码
功能描述
APPLICATION UNBLOCK
84
18
应用解锁
APPLICATION BLOCK
84
1E
应用锁定
CARD BLOCK
84
16
卡片锁定
EXTERNAL AUTHENTICATE
00
82
外部认证
GET CHALLENGE
00
84
取随机数
INTERNAL AUTHENTICATE
00
88
内部认证
PIN UNBLOCK
84
24
个人密码解锁
READ BINARY
00
B0
读二进制文件内容
READ RECORD
00
B2
读记录文件指定内容
SELECT
00
A4
选择文件
UPDATE BINARY
00/04
D6
写二进制文件
UPDATE RECORD
00/04
DC
写记录文件
VERIFY
00
20
验证口令
编号
指令
指令类别
指令码
功能描述
CHANGE/PIN RELOAD
80
5E
重装/修改个人密码
CREDIT FOR LOAD
80
52
圈存
DEBIT FOR PURCHASE/ CASE WITHDRAW/UNLOAD
80
54
消费/取现/圈提
GET BALANCE
80
5C
读余额
GET TRANSCATION PROVE
80
5A
取交易认证
INITIALIZE FOR XXX
80
50
初始化XXX交易
UNBLOCK
80
2C
解锁被锁住的口令
UPDATE OVERDRAW LIMIT
80
58
修改透支限额