APDU

本文主要介绍APDU的定义、作用和数据结构。

什么是APDU

APDU(Application Protocol Data Unit),全称应用协议数据单元,是用于在智能卡和设备之间传输命令和响应的基本信息单元。

APDU最初是由ISO 7816标准协议定义的,后续又被ETSI的SIM卡技术规范以及3GPP协议引用并进行了扩展。

APDU的作用

APDU主要起到信息传递的作用。它为设备和SIM卡之间的交互提供了一种标准化的通信方式。通过APDU,设备可以向SIM卡发送命令,SIM卡也可以将执行结果返回给设备。

APDU的格式

在ISO7816协议中,APDU主要分为两种:

  • 命令APDU(Command APDU,简称C-APDU)

  • 响应APDU(Response APDU,简称 R-APDU)

它们分别有不同的数据结构。

命令APDU

命令APDU由标头(command header)和主体(command body)两个部分组成。

命令的标头是必须的字段,包含下面几个字段:

  • CLA:占1个字节,用于指示APDU的类别或者组,通常表明命令的一些基本属性。

  • INS:占1个字节,用于指示具体的指令或者操作,例如读取数据或者更新数据。

  • P1和P2:P1和P2各占1个字节,用于给指令提供更具体的参数,例如要操作对象的地址或者其他特定信息。如果没有需要携带的参数,则P1和P2设置为00

命令的主体是可选字段,包含下面3个部分:

  • Lc:占1个字节,如果命令APDU包含数据字段,那么这个字段用于指示数据字段的长度。

  • 数据字段:这个字段的长度由Lc决定,包含了命令所需的具体数据。

  • Le:占1个字节,这个字段用于指示预期响应数据的长度,如果没有这个字段,那么响应APDU的数据字段可以是任意长度。

在ETSI协议文档中,描述如下:

由于命令主体部分的字段都是可选的,所以按照ETSI协议文档的规定,命令APDU可以有如下4种结构:

在ETSI协议文档中,命令APDU的字节编码规定如下:

COMMAND CLA INS
SELECT FILE '0X' or '4X' or '6X' 'A4'
STATUS '8X' or 'CX' or 'EX' 'F2'
READ BINARY '0X' or '4X' or '6X' 'B0'
UPDATE BINARY '0X' or '4X' or '6X' 'D6'
READ RECORD '0X' or '4X' or '6X' 'B2'
UPDATE RECORD '0X' or '4X' or '6X' 'DC'
SEARCH RECORD '0X' or '4X' or '6X' 'A2'
INCREASE '8X' or 'CX' or 'EX' '32'
RETRIEVE DATA '8X' or 'CX' or 'EX' 'CB'
SET DATA '8X' or 'CX' or 'EX' 'DB'
VERIFY PIN '0X' or '4X' or '6X' '20'
CHANGE PIN '0X' or '4X' or '6X' '24'
DISABLE PIN '0X' or '4X' or '6X' '26'
ENABLE PIN '0X' or '4X' or '6X' '28'
UNBLOCK PIN '0X' or '4X' or '6X' '2C'
DEACTIVATE FILE '0X' or '4X' or '6X' '04'
ACTIVATE FILE '0X' or '4X' or '6X' '44'
AUTHENTICATE '0X' or '4X' or '6X' '88', '89'
GET CHALLENGE '0X' or '4X' or '6X' '84'
TERMINAL CAPABILITY '8X' or 'CX' or 'EX' 'AA'
TERMINAL PROFILE '80' '10'
ENVELOPE '80' 'C2'
FETCH '80' '12'
TERMINAL RESPONSE '80' '14'
MANAGE CHANNEL '0X' or '4X' or '6X' '70'
MANAGE SECURE CHANNEL '0X' or '4X' or '6X' '73'
TRANSACT DATA '0X' or '4X' or '6X' '75'
SUSPEND UICC '80' '76'
GET IDENTITY '8X' or 'CX' or 'EX' '78'
EXCHANGE CAPABILITIES '80' '7A'
MANAGE LSI '80' '7C'
GET RESPONSE '0X' or '4X' or '6X' 'C0'

响应APDU

响应APDU是智能卡在接收并处理完命令APDU(C-APDU)后,返回给接口设备(如读卡器或手机)的数据结构。响应APDU由数据字段和状态字段两个部分组成,其数据结构如下所示:

数据字段是可选的,这部分包含了命令执行的结果数据,例如读取文件操作,那么该字段包含的就是读取的文件内容。数据字段的长度是可变的。在C-APDU中,有一个可选的字段叫做Le,用来指定预期的响应数据长度。如果C-APDU没有包含Le字段,那么R-APDU的数据字段可以是任意长度。当然,实际的数据长度还取决于命令的类型和执行结果。比如,如果C-APDU是一个读文件的命令,那么R-APDU的数据字段会包含读取到的文件数据,长度取决于文件的大小以及Le字段的值。如果文件的大小超过了Le字段的值,那么只返回前Le字节的数据。如果文件的大小小于Le字段的值,那么返回整个文件的数据。

状态字段是必须有的部分。它包含了两个字节,分别为SW1和SW2,表示C-APDU执行的结果状态。

在ETSI协议文档中,关于响应APDU的描述如下:

下面仅列出一些常见的响应APDU状态值说明,如用户希望了解更多,请参考ISO 7816标准协议和ETSI TS 102 221协议文档:

SW1 SW2 说明
'90' '00' 命令执行成功
'93' '00' SIM 应用程序工具包正忙。
'62' '00' 操作失败,未给出进一步信息
'62' '81' 部分返回数据可能已损坏
'62' '82' 文件长度小于Le
'62' '83' 选中的文件无效
'62' '85' 文件标识已经失效
'63' '00' 验证失败,密码无效或禁止值
'65' '81' 存储器故障,无法执行命令
'67' '00' 长度错误
'68' '81' 不支持的逻辑通道
'68' '82' 不支持安全消息传递
'69' '81' 命令与文件结构不兼容(文件类型不匹配)
'69' '82' 安全状态不满足
'69' '83' 认证/PIN方法被锁定
'69' '84' 引用数据无效
'69' '85' 不满足使用条件
'6A' '80' 数据段参数错误
'6A' '81' 不支持的功能
'6A' '82' 找不到文件
'6A' '83' 找不到记录
'6A' '84' 内存空间不足
'6A' '86' P1-P2参数错误
'6A' '88' 未找到引用的数据

应用示例

以下用例请参考ETSI TS 102 221,ETSI TS 151 011,ISO/IEC 7816-4文档。

用户直接通过APDU读取SIM卡内的ICCID,IMSI,以下操作适用于eSIM和普通SIM。不建议用户直接操作SIM卡,如操作不当容易引发SIM或eSIM卡异常,进而引起网络异常。

一、读取ICCID
# 组包可以参考ISO/IEC 7816文档,3GPP文档。
# 1、选定文件读取ICCID
# CLA		:00 
# SELECT 	:A4
# P1		:08 
# P2		:04
# Lc		:02
# data		:2FE2
# Le		:0A (期望返回的长度)

APDU串:00A40804022FE20A 

# 2、读取文件内容
# CLA		:00 
# READ BINARY 	:B0
# P1		:00 
# P2		:00
# Le		:0A (ICCID 长度) 

APDU串:00B000000A

二、读取IMSI
# 1、选定DF(GSM)文件
# CLA		:00 
# SELECT 	:A4
# P1		:00 
# P2		:00
# Lc		:02
# data		:7F20 (文件标识id)
APDU串:00A4000C027F20

# 2、选定IMSI文件
# 1、选定DF(GSM)文件
# CLA		:00 
# SELECT 	:A4
# P1		:00 
# P2		:04
# Lc		:02
# data		:6F07  (文件标识id)
APDU串:00A40004026F07

# 3、读取IMSI文件
# CLA		:00 
# READ BINARY 	:B0
# P1		:00 
# P2		:00
# Le		:09 (IMSI 长度) 
APDU串:00B0000009

对于eSIM卡的数据交互,如profile的安装需要首先打开逻辑通道,才能进行profile安装的操作。以下以打开逻辑通道指令为例,不建议用户直接通过APDU串和eSIM卡交互。

# 1、打开逻辑通道
# CLA		:00 
# MANAGE CHANNEL 	:70
# P1		:00 
# P2		:00
# Le		:01 (期望返回数据长度)
APDU串:0070000001

# 发起上述指令后,会收到逻辑通道id以及返回的处理结果
# 2、关闭逻辑通道
# 当业务处理完毕,需要关闭逻辑通道
# CLA		:00 
# MANAGE CHANNEL 	:70
# P1		:08
# P2		:01 (第一步返回的逻辑通道ID)
# Le		:00 
APDU串:0070800100