APDU


APDU


定義:APDU(ApplicationProtocolDataUnit--應用協議數據單元)。協議數據單元PDU(ProtocolDataUnit)是指對等層次之間傳遞的數據單位。協議數據單元(ProtocolDataUnit)物理層的PDU是數據位(bit),數據鏈路層的PDU是數據幀(frame),網絡層的PDU是數據包(packet),傳輸層的PDU是數據段(segment),其他更高層次的PDU是數據(data)。

APDU命令與響應格式

命令格式

  • APDU命令由命令頭和命令體組成: CLA | INS | P1 | P2 | Lc | DATA | Le
  • 命令頭: CLA | INS | P1 | P2
  • 命令體: Lc | DATA | Le

命令各字段含義

  • CLA:命令報文的類別字節
  • P1: 參數 1
  • P2:參數 2
  • Lc:Data的長度(含4字節mac)
  • Data:在命令的數據字段中發送的字節串
  • Le:在向命令響應的數據字段中期望的字節最大數

命令可分為四種情況:

  • Case1 | CLA INS P1 P2
  • Case2 | CLA INS P1 P2 Le
  • Case3 | CLA INS P1 P2 Lc Data
  • Case4 | CLA INS P1 P2 Lc Data Le

Case1

  • 這種情況時,命令中沒有數據送到卡( Lc)中,也沒有數據從卡中返回( Le)。
  • 不含安全報文的命令: CLA | INS | P1 | P2
  • 含安全報文的命令: CLA | INS | P1 | P2 | Lc | MAC
  • 注: Lc = MAC 的長度, 4 字節。

Case2

  • 這種情況時,命令中沒有數據送到卡( Lc)中,有數據從卡中返回( Le)。
  • 不含安全報文的命令: CLA | INS | P1 | P2 | Le
  • 含安全報文的命令: CLA | INS | P1 | P2 | Lc | MAC | Le
  • 注: Lc = MAC 的長度, 4 字節。

Case3

  • 這種情況時,命令中有數據送到卡( Lc)中,沒有數據從卡中返回( Le)。
  • 不含安全報文的命令: CLA | INS | P1 | P2 | Lc | Data
  • 含安全報文的命令: CLA | INS | P1 | P2 | Lc | Data+MAC
  • 注: Lc = 數據的長度 + MAC 的長度( 4 字節)。

Case4

  • 這種情況時,命令中既有數據送到卡( Lc)中,也有數據從卡中返回( Le)。
  • 不含安全報文的命令: CLA | INS | P1 | P2 | Lc | Data | Le
  • 含安全報文的命令: CLA | INS | P1 | P2 | Lc | Data+MAC | Le
  • 注: Lc = 數據的長度 + MAC 的長度( 4 字節)。

響應格式

格式1

  • | Data | SW1 SW2 |

格式2

  • | SW1 SW2 |

響應各字段含義

  • Data:在響應的數據字段中收到的字節串
  • SW1:狀態字 1
  • SW2:狀態字 2

APDU格式詳解

APDU定義了主機和卡之間交互的數據格式,絕大部分卡片遵循此數據格式,當然為了保密或其它原因是可以自定義新的數據格式。APDU分為發送命令(C-APDU)和返回命令(R-APDU)。

一、C-APDU元素說明:

發送命令(C-APDU)的格式如下,包含一個必須頭部段和一個可選數據段:

  1. CLA(1字節):用於命令類別的標示,傳輸安全控制,傳輸信道說明等。
比特值 說明
0XXXXXXX 為ISO規定的指令類別,0x00,0x04(線路保護)等
1XXXXXXX 為私有自定義指令類別,0x80,0x84(線路保護)等
>2.INS(1字節):用於指明CLA字段中標示的指令類中的一個特定指令。 ![](http://i.imgur.com/rsQtXAA.jpg)

3.P1(1字節):指令參數1,如沒有填0x00。

4.P2(1字節):指令參數2,如沒有填0x00。

5.LC(1字節):這個可選的字段是命令的數據字段的字節數。

6.LE(1字節):這個可選的字段指定在期望響應的數據字段中的極限字節數。

7.四種C-APDU結構如下:

二、R-APDU元素說明:

返回命令(R-APDU)的格式如下,包含一個可選數據段和一個必須狀態值:

數據字段(可變長度,由APDU命令中的LE確定):這個可選擇的字段包含卡片返回的數據。

SW1(1字節):這個必要的字段是狀態字1。

SW2(1字節):這個必要的字段是狀態字2。

SW1-SW2成功一般為9000,其他值為某種狀態、警告或者錯誤!

常用SW1-SW2值:

9000: 執行成功

6100: 數據被截斷

6283: 應用無效

6300: 認證失敗

6400: 原因不明

6700: 長度不對

6982: 需要PIN驗證

6983: 文件無效

6984: 數據無效

6985: 條件不滿足

6986: 不允許該命令

6982: 安全條件不滿足

6987: 安全消息丟失

6988: 安全消息不正確

6999: 應用選擇失敗

6A80: 數據錯誤

6A81: 功能不支持

6A82: 文件找不到

6A83: 記錄找不到

6A84: 沒有足夠的空間

6A86: 不正確的參數(P1,P2)

6A88: 引用數據沒找到

6B00: 錯誤的參數 (P1,P2)

6C00: 長度錯誤 (Le)

6D00: INS不支持

6E00: CLA 不支持

6F00: 未知錯誤


參考博客:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM