zoukankan      html  css  js  c++  java
  • ADPU 大全

    APDU协议

    APDU协议,即是智能卡与读写器间的应用层协议,在ISO7816-4[7]中定义了该协议的结构格式。APDU数据有两种结构,读写器使用的APDU结构为命令APDU,C-APDU(Command APDU),智能卡方面使用的APDU结构为响应APDU,R-APDU(Reponse APDU)。

    命令APDU

    必选部分:CLA, INS, P1, P2

    可选部分:LC, 数据段, LE

    CLA确定APDU的类别,INS确定要执行的指令,P1和P2是参数。

    LC确定数据段的长度,数据段是发送到智能卡上的数据,LE确定读写器期待智能卡响应的字节数。

    响应APDU

    可选部分:数据段

    必选部分:SW1, SW2

    数据段的长度由命令APDU的LE确定。

    SW1和SW2是状态字。

    ADPU常用命令

    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

    修改透支限额

    SIM卡APDU指令

    一个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。

    例:

    //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
    9F 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详细数据

    例:

    //SELECT
    A0 A4 00 00 02 7F10
    9F 22
    //STAUTS
    A0 F2 00 00 22
    90 00
    00005DD07F1002000000000015B10114060085838583000083830000000000000000

    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
    
    //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命令的结构和处理

    简单说,IFD(接口设备)与IC卡之间的通讯是这样的:

    a、首先,IFD(接口设备)发送5个字节的命令头给IC卡,这5个字节的内容告诉了IC卡要做什么操作;

    b、然后,IC卡回传一个过程字节给IFD,告诉IFD(接口设备)IC卡是否支持该操作;

    c、如果返回的过程字节告诉IFD——IC卡支持该操作,则接下来就进行数据的传输(如果有的话),数据从IFD输入到IC卡或数据从IC卡输出到IFD;

    d、如果返回的过程字节告诉IFD——IC卡不支持该操作,则IC卡回传给IFD两个状态字节SW1 SW2,IFD根据SW1 SW2两字节判断IC卡不支持该操作的原因;

    下面介绍ISO/IEC 7816-4 中规定的标准操作流程(以下内容由本人翻译原英文版ISO/IEC 7816-4而来,如有错漏之处请不吝指教):

     

    10.3  命令的结构和处理

    10.3.1  概述

            首先,每一条命令均由IFD(接口设备)发起,它通过5字节的命令头告诉卡设备做什么。

            然后,在卡发送的过程字节的控制下,该命令继续在某一个方向上传输一串数据字节。

            为了区分用于输入数据的命令(其中处理过程中,数据字节进入卡)和用于输出数据的命令(其中处理数据字节时该数据离开卡),假设卡和接口设备预先知道数据运送方向。

    10.3.2 命令头

            命令头由5个字节组成,分别为CLA,INS,P1,P2和P3。其中CLA,INS,P1和P2这些参数的值由ISO/IEC7816-4部分定义。

    —— CLA        表示指令类别(class)。其中值‘FF’被保留用于PPS(见6.3.1和9.2)。

                             注意        ISO/IEC 7816-4 强制‘FF’对于CLA为无效值。

    —— INS         表示指令代码(instruction)。其中值‘6X’和‘9X’为无效值。

                             注意        ISO/IEC 7816-4 强制‘6X’和‘9X’对于INS为无效值。

    —— P1 P2     表示命令参数。对于不同的指令(INS)P1 P2有不同的含义。

    —— P3           表示数据字节的长度。对命令期间待传送的字节D1~Dn的数目n进行编码。

                                l   在输出数据的传送命令中,P3=0表示从卡传输256字节。

                                l   在输入数据的传送命令中,P3=0表示不从卡传输数据。

    10.3.3  过程字节

    IFD(接口设备)发送完5字节的命令头后,应该等待卡设备传入一个过程字节。有三种类型的过程字节,见表11。

    过程字节不同的值表示不同含义:

    ——如果值为‘60’,表示为一个NULL字节。它要求不进行数据字节的传送。IFD应该等待卡设备传入下一个过程字节。

    ——如果值为‘6X(≠60)’或‘9X’,表示为SW1字节。字要求不进行数据字节的传送。IFD(接口设备)应等待卡设备传入一个SW2字节。这里对SW2的值无限制。

    注意      ISO/IEC7816-4 强制‘60’为无效的SW1值,以及其它任不同于‘9X’和‘6X’的值。

    ——如果值与INS相等,除‘6X’和‘9X’以外,它是一个ACK字节。则表示运送所有剩余字节(如果存在)Di~Dn。然后IFD(接口设备)应等待卡设备传入一个过程字节。

    ——如果值与INS⊕FF(异或)相等,除‘6X’和‘9X’以外,它是一个ACK字节。则表示运送下一个数据字节(如果存在)Di。然后IFD(接口设备)应等待卡设备传入一个过程字节。

    ——如果为其它值,则属无效。

    表11 ——过程字节

    字节

    数据的传送操作

    然后接收

    NULL

    ‘60’

    无动作

    一个过程字节

    ACK

    INS

    所有剩余数据字节

    一个过程字节

    INS⊕FF(异或)

    下一个数据字节

    一个过程字节

    SW1

    ‘6X(≠60)’或‘9X’

    无动作

    SW2字节

    当过程字节为NULL和ACK时,卡设备能继续处理命令;或者当过程字节为SW1 SW2时,卡设备结束命令的处理;或者不响应表示不赞成。

    10.3.4  状态字节

    状态字节SW1 SW2表示命令结束时卡设备的状态。它们的值由ISO/IEC 7816-4 指定。

    注   ISO/IEC7816-4 强制6个状态字节值的定义。

    ‘9000’    命令正常结束;

    ‘6E00’     CLA不支持;

    ‘6D00’     CLA支持,但INS不支持;

    ‘6B00’     CLA  INS 均支持,但是P1 P2错误;

    ‘6700’     CLA  INS  P1  P2均支持,但是P3错误;

    ‘6F00’     命令不支持,但是没有找出精确的诊断;

    根据定义,在传入的SW2字节的前沿12etu后,命令结束。


  • 相关阅读:
    Linux0.11之初识Makefile/build.c
    主机(windows10)虚拟机(ubuntu18)arm板(linux3.4)相互ping通
    windows上利用dhcpsrv搭建DHCP服务器
    《剑指offer》面试题27 二叉搜索树与双向链表 Java版
    《剑指offer》面试题26 复杂链表的复制 Java版
    《剑指offer》面试题25 二叉树中和为某一值的路径 Java版
    《剑指offer》面试题24 二叉搜索树的后序遍历序列 Java版
    异常处理
    三元表达式、列表推导式、生成器表达式、匿名函数、内置函数、递归调用与二分法的简单认识
    迭代器与生成器
  • 原文地址:https://www.cnblogs.com/xiaobailook/p/8214375.html
Copyright © 2011-2022 走看看