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 塊的信息字段的串聯。 這些塊應該被鏈接起來。
