zoukankan      html  css  js  c++  java
  • APDU命令的结构和处理【转】

    本文转载自:http://blog.csdn.net/yonghenzhita/article/details/36402525

    简单说,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后,命令结束。

    注:本节内容翻译自 ISO/IEC 7816-4:2006 第10.3节。

  • 相关阅读:
    《白帽子讲web安全》学习笔记(第一篇)
    pytorch安装配置(VScode +miniconda+pytorch)
    tensorflow-GPU安装配置(VScode +miniconda+tensorflow-gpu)
    Win10+VScode +miniconda安装tensorflow(CPU版本)
    The TensorFlow library wasn't compiled to use SSE instructions解决方法
    python安装配置(miniconda版)(Win10+VScode +miniconda)
    Git使用方法
    PDF快速导出为word(免费方法)
    CAJ文件转PDF
    拖拽的效果 第一步 设置 可拖拽的属性 draggable="true" 绑定drag 事件 第二步 设置 放置位置 触发的事件 dragover 第三步 设置 放置之后 触发的事件 dragover 下面请看代码:
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7232578.html
Copyright © 2011-2022 走看看