ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

命令-响应对的传输(译自ISO7816-3)

2021-11-23 17:34:36  阅读:124  来源: 互联网

标签:ISO7816 case 命令 APDU TPDU 传输 字段 译自 响应


12 命令-响应对的传输

12.1 应用协议数据单元

12.1.1 命令-响应对

应用协议数据单元是命令 APDU 或响应 APDU。 应用协议中的一个步骤包括传输命令 APDU、在接收实体中处理它并返回响应 APDU。 这对 APDU 称为命令-响应对。

如图 24 所示,本文档中定义的每个命令 APDU 包括

  • 一个四个字节的强制性报头,表示为 CLA INS P1 P2,
  • 可变长度的条件体。
图 24 — 命令 APDU 结构

如图 25 所示,本文档中定义的每个响应 APDU 包括

  • 可变长度的条件体,
  • 两个字节的强制性尾部,表示为 SW1 SW2 并在处理命令后对接收实体的状态进行编码。
图 25 — 响应 APDU 结构

命令头和响应尾的值应符合 ISO/IEC 7816-4 的规定。 如果该过程中止,则卡可能会变得无响应。 然而,如果响应 APDU 发生,则响应主体将不存在并且 SW1 SW2 将指示错误。

12.1.2 命令-响应对中的数据字段

每个命令-响应对可以携带命令数据字段和/或响应数据字段。

  • Nc 表示命令数据字段中的字节数。 如果 Nc ≠ 0,则存在 Lc 字段用于编码 Nc,命令数据字段由后续 Nc 字节组成。 如果 Nc = 0,则 Lc 字段和命令数据字段都不存在。
  • Ne 表示响应数据字段中预期的最大字节数。 如果 Ne ≠ 0,则存在 Le 字段用于编码 Ne。 如果 Ne = 0,则 Le 字段不存在。
  • Nr 表示响应数据字段中的字节数。 Nr 应从零到 Ne。 如果 Nr = 0,则响应数据字段不存在。

在 case 1 中,Nc = Nr = 0。命令 APDU 由头组成; Lc 字段、命令数据字段和 Le 字段不存在。 响应 APDU 由尾部组成; 响应数据字段不存在。

在 case 2 中,Nc = 0 且 Nr ≠ 0。命令 APDU 由头部和 Le 字段组成; Lc 字段和命令数据字段不存在。 响应 APDU 由响应数据字段和尾部组成。

在 case 3 中,Nc ≠ 0且 Nr = 0。命令APDU由头部、Lc字段和命令数据字段组成; Le 字段不存在。 响应 APDU 由尾部组成; 响应数据字段不存在。

在 case 4 中,Nc ≠ 0 且 Nr ≠ 0。命令 APDU 由报头、Lc 字段、命令数据字段和 Le 字段组成。 响应 APDU 由响应数据字段和尾部组成。

表 12 总结了命令-响应对的四种可能情况。

表 12 — 命令-响应对中的数据字段

图 26 显示了根据前四种情况的命令 APDU 的四种结构。

  • 情况 1 的命令 APDU 由首部组成。
  • 情况 2 的命令 APDU 由首部和 Le 字段组成。
  • 情况 3 的命令 APDU 由首部、Lc 字段和数据字段组成。
  • 情况 4 的命令 APDU 由首部、Lc 字段、数据字段和 Le 字段组成。
图 26 - 命令 APDU 的四种结构

因此,在任何命令-响应对中,命令 APDU 中没有 Le 字段是在响应 APDU 中不接收响应数据字段的标准方式。

12.1.3 命令 APDU 的解码约定

图 27 将命令 APDU 图示为一串 n 字节。 报头由前四个字节组成,即 CLA INS P1 P2。 主体由所有后续字节组成,即 C(5) 到 C(n)(如果有)。

图 27 — 命令 APDU 作为字节串
  • 在 case 1 中,数据体不存在。 因此,n = 4。

  • 在 case 2 中,Le 字段要么是短的(case 2S)要么是扩展的(case 2E)。

    • case 2S:短 Le 字段由 C(5) 编码 Ne 组成,从 1 到 256('00' 表示最大值,256)。 因此,n = 5。
    • case 2E:扩展 Le 字段由 C(5) = '00' 和 C(6) C(7) 组成,编码 Ne 从 1 到 65 536('0000' 表示最大值,65 536)。 因此,n = 7。
  • 在 case 3 中,Lc 字段要么是短的(case 3S)要么是扩展的(case 3E)。

    • case 3S:短 Lc 字段由 C(5) ≠ '00' 组成,编码 Nc 从 1 到 255。数据字段由 C(6) 到 C(5+Nc) 组成。 因此,n = 5 + (C(5))。
    • case 3E:扩展的 Lc 字段由 C(5) = '00' 和 C(6) C(7) ≠ '0000' 组成,编码 Nc 从 1 到 65 535。数据字段由 C(8) 到 C (7+Nc)。 因此,n = 7 + (C(6) C(7))。
  • 在 case 4 中,两个长度字段要么是短的(情况 4S),要么是扩展的(情况 4E)。

    • case 4S:短 Lc 字段由 C(5) ≠ '00' 组成,编码 Nc 从 1 到 255。数据字段由 C(6) 到 C(5+Nc) 组成。 短 Le 字段由 C(6+Nc) 编码 Ne 组成,从 1 到 256('00' 表示最大值,256)。 因此,n = 6 + (C(5))。
    • case 4E:扩展的 Lc 字段由 C(5) = '00' 和 C(6) C(7) ≠ '0000' 组成,编码 Nc 从 1 到 65 535。数据字段由 C(8) 到 C (7+Nc)。 扩展的 Le 字段由 C(8+Nc) C(9+Nc) 组成,编码 Ne 从 1 到 65 536('0000' 表示最大值,65 536)。 因此,n = 9 + (C(6) C(7))。

表 13 根据七种情况总结了命令 APDU 解码。

表 13 — 命令 APDU 解码

case 1、2S、3S 和 4S 适用于所有卡。 case 2E、3E 和 4E 也适用于明确说明其处理扩展长度字段能力的卡(卡能力应按照 ISO/IEC 7816-4 中的规定)。

12.2 T=0命令响应对传输

12.2.1 总则

本节根据需要使用 GET RESPONSE 和 ENVELOPE 命令(参见 ISO/IEC 7816-4)通过 T=0 定义应用协议数据单元(APDU)到传输协议数据单元(TPDU)的映射。 例如,case 4S 的命令-响应对被处理为两个连续的命令和响应 TPDU 对:第二个命令 TPDU 是 GET RESPONSE 命令。 表 14 总结了此后用于映射的某些响应尾值(参见 ISO/IEC 7816-4)。

表 14 — 下文中用于通过协议 T=0 进行映射的响应尾值

SW1 SW2
意义
‘9000’ 过程正常完成。 在 case 1、2 和 3 下,无需进一步操作。在 case 4 中,在收到 Nc 命令数据字节后,卡应准备好接收至少一个 GET RESPONSE 命令,用于传输最多 Ne 响应数据字节。
‘61XY’ 过程正常完成(SW2 编码 Nx,即仍然可用的额外数据字节数)。 在 case 1 和 3 中,卡片不应使用这样的值。 在 case 2 和 4 中,为了传输响应数据字节,卡应准备好接收 GET RESPONSE 命令,并将 P3 设置为 Nx 和 Ne 的最小值。
‘62XY’ 过程已完成,但有警告。 在 case 1 下,没有进一步的操作。 在 case 2、3 和 4 中,如果在传输所有命令和/或响应数据字节之前出现警告指示,则过程继续(例如,用于传输响应数据字节的 GET RESPONSE 命令),或者警告指示引发另一个命令 (例如,'6202' 到 '6280',用于传输卡源字节串的 GET DATA 命令,参见 ISO/IEC 7816-4)。 因此,卡不应该使用这样的值,直到最后一个响应 TPDU(见下文)。
‘63XY’
‘6700’ 由于长度错误,进程中止。 没有进一步的行动。
‘6CXY’ 由于 Le 字段错误(SW2 编码 Na,即可用数据字节的确切数量),进程中止。 在 case 1 和 3 中,卡片不应使用这样的值。 在 case 2 和 4 中,卡应准备好接收与 P3 = SW2 相同的命令。
‘6D00’ 由于无效或不受支持的指令代码,进程中止。 没有进一步的行动。

可以链接连续的行业间命令-响应对:第一个命令 APDU 中的 CLA = 0xx1 xxxx 到倒数第二个命令中的 CLA = 0xx1 xxxx,最后一个命令中的 CLA = 0xx0 xxxx; 其他六位在链中保持不变(链接应按照 ISO/IEC 7816-4 中的规定)。

  • 当链中的行业间命令-响应对(CLA = 0xx1 xxxx)被处理为两个或多个连续的命令和响应 TPDU 对时,则在命令 TPDU 中,所有 CLA 都应设置为相同的值,即 0xx1 xxx。
  • 当一条链的最后一个行业间命令-响应对(CLA 的第 5 位从 1 切换到 0,即 CLA = 0xx0 xxxx)被处理为两对或更多连续的命令和响应 TPDU 对时,那么该链真正结束于 最后一对命令和响应 TPDU。 因此,为了在命令 TPDU 中提供正确的指示,倒数第二个之前的第一个 CLA 应设置为 0xx1 xxxx,最后一个 CLA 设置为 0xx0 xxxx。

在 case 4S、2E、3E 和 4E 下,如果卡支持命令链(参见 ISO/IEC 7816-4),那么对于任何具有 CLA = 0xx0 xxxx 的行业间命令-响应对,无论第 5 位在前一个 CLA 中, 上述规则应在适当的情况下适用。 因此,命令链允许卡知道命令 TPDU 是否是最后一个,以便在最后一个响应 TPDU 之前不使用警告指示。

12.2.2 Case 1

命令 APDU 被映射到命令 TPDU 上,P3 = '00'。

响应 TPDU 被映射到响应 APDU 上,没有任何变化。

12.2.3 Case 2S

短 Le 字段由一个字节组成:C(5) 具有用于编码 Ne 的任何值,从 1 到 256('00' 表示最大值,256)。 命令 APDU 被映射到命令 TPDU 上,没有任何变化。

根据Ne的接受和根据命令的处理,响应TPDU被映射到响应APDU。

case 2S.1 — 流程完成; 接收 Ne

响应 TPDU 被映射到响应 APDU 上,没有任何变化。

case 2S.2 — 流程中止; Ne肯定不接收

该卡不接受Ne,不支持长度错误提供数据的服务。 来自卡的响应 TPDU 表明由于长度错误,该过程中止:SW1 SW2 = '6700'。 响应 TPDU 被映射到响应 APDU 上,没有任何变化。

case 2S.3 — 流程中止; Ne 不接受,Na 表示

卡不接受 Ne,卡的响应 TPDU 表示该过程被中止:SW1 = '6C'(长度错误)和 SW2 为编码 Na 从 1 到 256 的任何值('00' 表示 256),即 ,可用数据字节的确切数量。

卡应准备好接收与 P3 = SW2 相同的命令 TPDU。

响应 TPDU 由 Na 个数据字节和 SW1 SW2 组成。

  • 如果 Na ≤ Ne,则响应 TPDU 被映射到响应 APDU 上,没有任何变化。
  • 如果 Na > Ne,则通过仅保留响应 APDU 的前 Ne 个字节和两个状态字节 SW1 SW2 将响应 TPDU 映射到响应 APDU。

case 2S.4 — SW1 SW2 = '9XYZ'(不包含 '9000')

响应 TPDU 被映射到响应 APDU 上,没有任何变化。

12.2.4 Case 3S

短 Lc 字段由一个字节组成:C(5) ≠ '00' 用于编码 Nc 从 1 到 255。短 Le 字段由一个字节组成:C(n) 具有任何值,用于编码从 1 到 256 的 Ne (' 00' 表示最大值,256)。 通过切断 Le 字段,即 C(n),命令 APDU 被映射到命令 TPDU。

响应 TPDU 被映射到响应 APDU 上,没有任何变化。

12.2.5 Case 4S

短 Lc 字段由一个字节组成:C(5) ≠ '00' 用于编码 Nc 从 1 到 255。短 Le 字段由一个字节组成:C(n) 具有任何值,用于编码从 1 到 256 的 Ne (' 00' 表示最大值,256)。 通过切断 Le 字段,即 C(n),命令 APDU 被映射到命令 TPDU。

case 4S.1 — 流程中止

来自卡的第一个响应 TPDU 指示过程中止:SW1 = '6X',除了 '61'、'62' 和 '63'。 响应 TPDU 被映射到响应 APDU 上,没有任何变化。

case 4S.2 — 流程完成

来自卡的第一个响应 TPDU 表明该过程已完成:SW1 SW2 = '9000'。 卡应准备好接收 P3 = C(n) 的 GET RESPONSE 命令 TPDU。

根据来自卡的第二个响应 TPDU,该过程将根据上述 case 2S.1、2S.2、2S.3 和 2S.4 继续进行。

case 4S.3 — 流程完成并添加信息

来自卡的第一个响应 TPDU 表示过程完成,卡给出信息:SW1 = '61' 和 SW2 为编码 Nx 从 1 到 256 的任何值('00' 表示 256),即额外的数量 数据字节仍然可用。 卡应准备好接收 GET RESPONSE 命令 TPDU,其中 P3 设置为 Nx 和 Ne 的最小值。

第二个响应 TPDU 被映射到响应 APDU 上,没有任何变化。

case 4S.4 — SW1 SW2 = '62XY' 或 '63XY' 或 '9XYZ'(不包含 '9000')

响应 TPDU 被映射到响应 APDU 上,没有任何变化。

注:在 case 4S 中,不建议在第一响应 TPDU 中使用 “62XY” 和 “63XY”。

12.2.6 Case 2E

扩展的 Le 字段由三个字节组成: C(5) C(6) C(7); C(5) = '00' 并且 C(6) C(7) 具有用于编码 Ne 的任何值,从 1 到 65 536('0000' 表示最大值,65 536)。

case 2E.1 — Ne ≤ 256, C(5) = '00', C(6) C(7) 从 '0001' 到 '0100'

由于 Ne 是从 1 到 256,命令 APDU 应映射到命令 TPDU 上,P3 = C(7)。 该过程应根据 case 2S 继续。

case 2E.2 — Ne > 256,C(5) = '00',C(6) C(7) = '0000' 或从 '0101' 到 'FFFF'

当 Ne > 256 时,命令 APDU 应映射到命令 TPDU 上,P3 = '00'。

a) 如果来自卡的第一个响应 TPDU 指示由于长度错误(SW1 SW2 = '6700')而终止该过程,则响应 TPDU 应映射到响应 APDU 上而不作任何更改。

b) 如果来自卡的第一个响应 TPDU 指示由于长度错误而导致进程中止,并且卡给出信息:SW1 = '6C' 和 SW2 具有用于编码 Na 从 1 到 256 的任何值('00' 表示 256 ),即可用数据字节的确切数量,则该过程应按照 case 2S.3 的描述完成。

c) 如果第一个响应 TPDU 是 256 个数据字节后跟 SW1 SW2 = '9000',这意味着该卡不超过 256 个数据字节,和/或不支持 GET RESPONSE 命令。 然后响应 TPDU 将被映射到响应 APDU 上而不做任何更改。

d) 如果来自卡的第一个或后续响应 TPDU 是 SW1 = '61',则具有任何值的 SW2 将 Nx 编码为从 1 到 256('00' 表示 256),即仍然可用的额外数据字节数。 要从卡中检索的剩余数据字节数是 Nm = Ne 减去在先前响应 TPDU 中接收到的数据字节数。

  • 如果 Nm = 0,则响应 APDU 应是所有接收到的响应 TPDU 的数据字节与最后接收到的响应 TPDU 的尾部的串联。
  • 如果 Nm > 0,则卡应准备好接收 GET RESPONSE 命令 TPDU,其中 P3 设置为 Nx 和 Nm 的最小值。 应处理来自卡的相应响应 TPDU
    • 根据情况 d),如果 SW1 = '61',
    • 如上所述,当 Nm 为零时,如果 SW1 SW2 = '9000'。

12.2.7 Case 3E

扩展的 Lc 字段由三个字节组成: C(5) C(6) C(7); C(5) = '00' 并且 C(6) C(7) ≠ '0000' 用于将 Nc 从 1 编码到 65 535。

case 3E.1 — Nc 从 1 到 255,C(5) C(6) = '0000',C(7) ≠ '00'

由于 Nc 是从 1 到 255,命令 APDU 被映射到命令 TPDU 上,P3 = C(7)。

响应 TPDU 被映射到响应 APDU 上,没有任何变化。

case 3E.2 — Nc > 255,C(5) = '00',C(6) ≠ '00',C(7) 任何值

命令 APDU 应分成小于 256 字节的连续段,传送到连续 ENVELOPE 命令 TPDU 的数据字节中。 缺少数据字节意味着“数据串结束”。

  • 如果来自卡的第一个响应 TPDU 指示卡不支持 ENVELOPE 命令(SW1 SW2 = '6D00'),TPDU 将被映射到响应 APDU 上而不做任何更改。
  • 如果来自卡的第一个响应 TPDU 表明该卡支持 ENVELOPE 命令(SW1 SW2 = '9000'),那么该卡应准备好根据需要接收进一步的 ENVELOPE 命令。
  • 对应于最后一个 ENVELOPE 命令的响应 TPDU 被映射到响应 APDU 上,没有任何变化。

12.2.8 Case 4E

扩展的 Lc 字段由三个字节组成: C(5) C(6) C(7); C(5) = '00' and C(6) C(7) ≠ '0000' 用于将 Nc 从 1 编码到 65 535。扩展 Le 字段由两个字节组成: C(n–1) C(n) 与 用于编码 Ne 的任何值,从 1 到 65 536('0000' 表示最大值,65 536)。

case 4E.1 — Nc < 256,C(5) C(6) = '0000',C(7) ≠ '00'

由于 Nc 是从 1 到 255,命令 APDU 被映射到命令 TPDU 上,P3 = C(7) 并附加 Nc 数据字节。 Le 字段,即 C(n-1) C(n),被截断。

a) 如果除了来自卡的第一个响应 TPDU 中的 '61'、'62' 或 '63' 之外的 SW1 = '6X',则响应 TPDU 被映射到响应 APDU 上而没有任何变化。

b) 如果来自卡的第一个响应 TPDU 中的 SW1 SW2 = '9000',则

  • 如果 Ne ≤ 256,即 C(n–1) C(n) 从 '0001' 到 '0100',那么卡应准备好接收 P3 = C(n) 的 GET RESPONSE 命令 TPDU。 后续处理按上述 case 2S.1、2S.2、2S.3、2S.4 处理。
  • 如果 Ne > 256,即 C(n–1) C(n) = '0000' 或 > '0100',则卡应准备好接收 P3 = '00' 的 GET RESPONSE 命令 TPDU。 后续流程按上述 case 2E.2 执行。

c) 如果来自卡的第一个响应 TPDU 中的 SW1 = '61',则过程应根据上述 case 2E.2 d) 继续。

d) 如果 SW1 SW2 = '62XY' 或 '63XY' 或 '9XYZ',除了 '9000',在来自卡的第一个响应 TPDU 中,则响应 TPDU 被映射到响应 APDU 上而没有任何变化。

注:在 case 4E 中,在最后一个响应 TPDU 之前不推荐使用 “62XY” 和 “63XY”。

case 4E.2 — Nc > 255,C(5) = '00',C(6) ≠ '00',C(7) 任何值

当 Nc ≥ 256 时,过程将根据上述 case 3E.2 继续,直到命令 APDU 已完全传输到卡。 然后应按上述 case 4E.1 a)、b)、c) 和 d) 继续进行。

12.3 T=1的命令响应对传输

12.3.1 总则

本节定义了应用协议数据单元(APDU)到传输协议数据单元(TPDU)信息字段的映射,T=1。

12.3.2 Case 1

命令 APDU 被映射到 I-block 的信息字段上,没有任何变化。

响应的 I-block 的信息字段被映射到响应 APDU 上,没有任何变化。

12.3.3 Cases 2S and 2E

命令 APDU 被映射到 I-block 的信息字段上,没有任何变化。

响应 APDU 包括

  • 响应的 I 块的信息字段,或
  • 响应的连续 I 块的信息字段的串联。 这些块应该被链接起来。

12.3.4 Cases 3S and 3E

命令 APDU 被映射到任一

  • 一个 I-block 的信息字段,或
  • 连续 I 块的信息字段的串联。 这些块应该被链接起来。

响应的 I-block 的信息字段被映射到响应 APDU 上,没有任何变化。

12.3.5 Cases 4S and 4E

命令 APDU 被映射到任一

  • 一个 I-block 的信息字段,或
  • 连续 I 块的信息字段的串联。 这些块应该被链接起来。

响应 APDU 包括

  • 响应的 I 块的信息字段,或
  • 响应的连续 I 块的信息字段的串联。 这些块应该被链接起来。

标签:ISO7816,case,命令,APDU,TPDU,传输,字段,译自,响应
来源: https://www.cnblogs.com/sunchukun/p/15594241.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有