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)的格式如下,包含一個必須頭部段和一個可選數據段:
- CLA(1字節):用於命令類別的標示,傳輸安全控制,傳輸信道說明等。
比特值 | 說明 |
0XXXXXXX | 為ISO規定的指令類別,0x00,0x04(線路保護)等 |
1XXXXXXX | 為私有自定義指令類別,0x80,0x84(線路保護)等 |
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: 未知錯誤