第12章节:命令-响应对的传输(译自ISO7816-3)
12 命令-响应对的传输
12.1 应用协议数据单元
12.1.1 命令-响应对
应用协议数据单元是命令 APDU 或响应 APDU。 应用协议中的一个步骤包括传输命令 APDU、在接收实体中处理它并返回响应 APDU。 这对 APDU 称为命令-响应对。
如图 24 所示,本文档中定义的每个命令 APDU 包括
- 一个四个字节的强制性报头,表示为 CLA INS P1 P2,
- 可变长度的条件体。
如图 25 所示,本文档中定义的每个响应 APDU 包括
- 可变长度的条件体,
- 两个字节的强制性尾部,表示为 SW1 SW2 并在处理命令后对接收实体的状态进行编码。
命令头和响应尾的值应符合 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 总结了命令-响应对的四种可能情况。
图 26 显示了根据前四种情况的命令 APDU 的四种结构。
- 情况 1 的命令 APDU 由首部组成。
- 情况 2 的命令 APDU 由首部和 Le 字段组成。
- 情况 3 的命令 APDU 由首部、Lc 字段和数据字段组成。
- 情况 4 的命令 APDU 由首部、Lc 字段、数据字段和 Le 字段组成。
因此,在任何命令-响应对中,命令 APDU 中没有 Le 字段是在响应 APDU 中不接收响应数据字段的标准方式。
12.1.3 命令 APDU 的解码约定
图 27 将命令 APDU 图示为一串 n 字节。 报头由前四个字节组成,即 CLA INS P1 P2。 主体由所有后续字节组成,即 C(5) 到 C(n)(如果有)。
-
在 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 解码。
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 块的信息字段的串联。 这些块应该被链接起来。