SIM(Subscriber Identity Module)是一种移动运营商用于提供给用户验证身份、接入网络等服务的UICC卡。一张SIM卡里存储了很多移动网络接入相关的数据,比如ICCID(UICC卡的ID),IMSI(International Mobile Subscriber Identity),验证秘钥(ki, Authentication key),LAI(Local Area Identity)以及跟运营商相关的紧急号码列表、用户可接入的服务列表。SIM卡同时也提供了PIN(Personal Identification Number)码用于加密SIM卡以及PUK(Personal Unblocking Code)码用于解锁PIN码,以确保用户数据的安全。
在2G网络时代,SIM卡包含了硬件跟软件。随着3G移动技术的发展,SIM只是包含了软件,而已经部分则被统一称为UICC(Universal Intergrated Circuit Card),同时为3G网络增加了新的应用USIM(Universal Subscriber Identity Module)。
这篇文章我们就来看看SIM卡的逻辑结构,存储的数据以及读取SIM卡数据的协议APDU。
UICC是指一种用于移动终端的智能卡(smart card),在各种移动网络中如GSM,UMTS,CDMA中得到了广泛的应用。UICC确保用户数据的安全性与完整性,为用户提供网络接入验证等服务。在GSM网络中,通常使用SIM卡;UMTS网络中UICC卡则使用USIM卡,对于支持IMS(IP multimedia Services)的服务则需要包括ISIM应用。对于CDMA网络,UICC卡需要包含CSIM应用。包含了SIM, USIM, CSIM三个应用的UICC卡称为RUIM(Removable User Identity Card),RUIM卡可插入支持CDMA,GSM以及UMTS的移动设备。随着新技术的发展,一种被称为嵌入式SIM(embedded SIM,eSIM)的卡开始被各大运营商使用,eSIM将SIM卡做成一个内置的芯片嵌入到集成电路板上,为用户提供相应的网络服务。
SIM的逻辑结构
SIM卡中的文件是以层次化的结构存储的(见下图),主要有三种:MF(Master File), DF(Dedicated File), EF(Elementary File),SIM卡中的软件系统负责处理存储在文件数据上的访问与写入。
SIM文件由header以及body两个部分组成,header由SIM卡自己来管理,主要包含了跟文件结构与属性相关的信息,可以使用GET RESPONSE或者STATUS来访问(这些信息在SIM卡生成时被固定下来); body部分则包含了相应文件所包含的数据。
File Identifiers(文件标识符)
文件标识符(file id)用于识别或者寻址特定的文件,由两个字节的16进制数字构成。对GSM SIM卡来说,第一个字节用于识别文件类型:
- ‘3F’: Master File(MF,主文件);
- ‘7F’: Dedicated File(DF,专用文件);
- ‘2F’: Elementary File under the Master File(EF,位于MF下的基本文件);
- ‘6F’: Elementary File under a Dedicated File(位于DF下的基本文件).
文件标识符需要满足如下条件以确保每个文件都可以被唯一标识访问:
-
the file ID shall be assigned at the time of creation of the file concerned(文件标识符应该在相关文件建立的时候被指定);
-
no two files under the same parent shall have the same ID(有共同父亲的两个文件不能有相同的ID);
-
a child and any parent, either immediate or remote in the hierarchy, e.g. grandparent, shall never have the same file ID(一个子文件和它的任何一个父辈文件,不管是处于层次结构中直接或者间接的关系,都不能有相同的文件ID).
Master File(MF)
SIM卡中只有唯一的一个主文件MF,用于控制其他专有文件(DF)以及基本文件(EF)的访问。
Dedicated Files(DF)
专有文件是一个功能性的文件组,包括自身以及所有子文件。一个DF文件仅由header部分组成:
-
DFGSM which contains the application for both GSM and/or DCS1800;
-
DFTELECOM which contains telecom service features.
上述两个文件都是MF的直系子孙文件,可以在支持多个应用的SIM卡中共存。
Elementary File(EF)
An Elementary File (EF) is composed of a header and a body part. The following three structures of an EF are used by GSM.
基本文件(EF)由header和body两个部分组成。在GSM中,EF有如下三种结构类型:
Transparent EF
透明结构的EF文件由一个字节序列组成。当读取或者写入数据时,这个字节序列通过一个相对地址(偏移量)来访问,这个偏移量用于表示访问的起始位置以及访问的字节数。透明EF文件的第一个字节的相对地址为00 00
,而EF文件数据长度则包含在header部分。
Linear Fixed EF
线性固定结构EF由固定长度的记录序列组成,第一个记录的序列号是1。一个记录的长度以及以及长度与记录的数量都保存在EF的header部分。
注意:
It is not possible, at present, to have more than 255 records in a file of this type, and each record cannot be greater than 255 bytes(目前EF文件最多只能包含255个记录;每个记录的长度不能超过255个字节).
This structure was previously referred to as “formatted” in GSM(在GSM中,这个文件之前被称为格式化文件).
Cyclic EF
循环文件用于存储按时序排列的记录。当所有记录用于存储时,新的数据会覆盖最早的数据。
循环结构的EF文件具有是由固定长度的记录组成,每个记录只能包含固定长度的数据。对于这类型的EF,最后一个记录与第一个记录存在着一个连接:当记录存储的位置指向最后一个记录n时,下一个记录就是1;或者说,当下一个记录指针指向1时,它的上一个记录就是n。在记录1中包含了最新的数据,而在记录n中则包含了最老的数据(记录的时间最早)。
注意: It is not possible, at present, to have more than 255 records in a file of this type, and each record cannot be greater than 255 bytes.
文件选择的方法
在ATR命令之后,MF默认被选择并且成为当前目录。每个文件的选择使用SELECT函数,并遵循以下原则:
ATR是接触式Smart Card可用的一个指令信息,卡启动完成后,告诉读卡器卡已经准备好,可以使用了。 参考:https://en.wikipedia.org/wiki/Answer_to_reset
-
选择一个DF或者MF,设置其为当前目录;选择好后,并不存在当前的EF文件;
-
选择一个EF,设置当前EF,文件目录为当前EF的父辈DF或者EF。当前EF总是当前目录的一个子文件。
-
任何一个应用相关的指令应该是可操作的如果该指令跟当前目录相关
-
所有的选择都是基于文件ID
下列文件可以从上一个选择的文件中被获取到:
-
当前目录的任意一个直系子文件;
-
任何是当前DF父亲的直系子DF文件;
-
当前目录的父亲;
-
当前的;
-
MF.
下表是上图SIM逻辑结构模型对应的有效的文件选择路径:
保留文件ID
以下文件ID作为GSM中的保留项:
专有文件DF:
-
administrative use(授权者使用):
'7F 4X'
; -
operational use(操作使用):
'7F 10'
(DFTELECOM),'7F 20'
(DFGSM),'7F 21'
(DFDCS1800);'7F 2X'
(’2’<= x <=’F’).
基本文件EF:
-
administrative use:
'6F XX'
in the DFs'7F 4X'
;'6F 1X'
in the DFs'7F 10'
,'7F 20'
,'7F 21'
;'2F 01'
,'2F EX'
in the MF'3F 00'
; -
operational use:
'6F 2X'
,'6F 3X'
,'6F 4X'
in'7F 10'
and'7F 2X'
;'2F 1X'
in the MF'3F 00'
.
上述所有X,除非特别说明,其范围均在
['0','F']
基本文件EF数据
-
EF-ICCID (
2FE2
): ICC Identification,SIM卡的身份ID -
EF-LP(
6F05
) : Language Preference,语言首选项 -
EF-IMSI(
6F07
): International Mobile Subscriber Identity, 接入运营商网络的认证ID -
EF-KC(
6F20
) : Ciphering Key kc,网络注册时的加密密钥 -
EF-SST(
6F38
): SIM Service Table,运营商提供的服务列表,如ADN,FDN,SMS等 -
EF-ACM(
6F39
) : Accumulated Call Meter - total number of units for both the current call and the preceding calls -
EF-GID1(
6F3E
) : Group Identifier Level 1 - identifiers for particular SIM-ME associations -
EF-GID2(
6F3F
) : Group Identifier Level 2 -
EF-SPN(
6F46
) : Service Provider Name,运营商名字 -
EF-MSISDN(
6F40
): Mobile Station International ISDN number -
(O)EF-CBMI : Cell Broadcast Message Identifier Selection - Message format accepted by MS
-
EF-BCCH(
6F74
) : Broadcast Control Channels -
EF-ACC(
6F78
) : Access Control Class - The access control class is a parameter to control the RACH utilisation. -
EF-FPMLN(
6F7B
) : Forbidden PMLNs -
EF-LOCI(
6F7E
) : Location Infomation,位置信息-
Temporary Mobile Subscriber Identity (TMSI)
-
Location Area Information (LAI)
-
TMSI TIME
-
Location update status
-
-
EF-AD(
6FAD
) : Administrative Data - This EF contains information concerning the mode of operation according to the type of SIM, such as normal (to be used by PLMN subscribers for GSM operations), type approval (to allow specific use of the ME during type approval procedures of e.g. the radio equipment), cell testing (to allow testing of a cell before commercial use of this cell), manufacturer specific (to allow the ME manufacturer to perform specific proprietary auto-test in its ME during e.g. maintenance phases). -
EF-Phase(
6FAE
) : Phase Identification -
(O)EF-ADN(
6F3A
) : Abbreviative Dialing Number -
(O)EF-FDN(
6F3B
) : Fixed Dialing Number -
(O)SF-SMS(
6F3C
) : Short Message -
(O)EF-CCP(
6F3D
) : Capability Configuration Parameters - parameters of required network and bearer capabilities and ME configurations associated with a call established using an abbreviated dialling number, a fixed dialling number, MSISDN or a last number dialled. -
(O)EF-LND(
6F44
) : Last number dialled
APDU
插入手机(Mobile Equipment)的SIM卡与手机本身存在主从关系。ME通过数据交换协议APDU(Application Protocol Data Unit)与SIM卡进行数据的交换。两者之间的通信模型如下图所示:
ME可通过如下几个功能性的指令(这里只列举了部分指令)来访问SIM来读取、更新或者删除SIM卡中的数据:
- SELECT: 选择某一个文件;
- STATUS: 查看当前目录的信息
- READ BINARY: 从透明EF文件中读取字节序列
- UPDATE BINARY: 更新当前透明EF文件的数据
- READ RECORD: 读取线性定长EF文件或者循环EF文件的记录
- UPDATE RECORD: 更新线性定长EF或循环EF文件的记录
如何将上述功能映射到数据交换协议APDU了?就是说要确定了APDU的指令格式。ME与SIM之间的通信模式是半双工的(half-duplex),就是说存在两个通信通道,一个是请求命令通道,另一个是数据返回通道,但两者不能同时发送数据。与此相对应,APDU有两种命令:
- Command APDU: ME向SIM卡请求某个数据时需要发送的命令;
- Response APDU: SIM响应ME的命令请求,返回给ME时的APDU.
请求APDU命令由两个部分组成:命令头(必须)和命令主体(可选):
- CLA(1byte): 指令类别,用于应用的识别,对GSM应用来说使用
A0
- INS(1byte): 请求指令码,比如SELECT使用
A4
;STATUS使用F2
- P1(1byte)/P2(1byte): 指令的参数
- Lc: 数据长度
- Le = 0(length of the expected response), 若是一个写指令,则没有数据;若是读指令,则需要返回256个字节的数据
- Data Field: 数据长度由Lc指定,字节序列
请求响应的APDU由两部分组成:一部分是数据,另个一个部分包含了请求指令的状态码(请求返回结果):
- Data Field(可变成长度): 字节序列
- SW1(1byte)/SW2(1byte):状态码,表示请求指令返回的结果
上述SW1/SW2状态码主要有以下几种:
| SW1 | SW2 | 含义 |
| 0x90 | 0x00 | Success |
| 0x6E | 0x00 | CLA error |
| 0x6D | 0x00 | INS error |
| 0x6B | 0x00 | P1,P2 error |
| 0x67 | 0x00 | LEN error |
| 0x98 | 0x04 | Bad PIN |
| 0x98 | 0x40 | Card Blocked |
| 0x98 | 0x02 | no CHV initialized |
| 0x94 | 0x00 | no EF selected |