PEHeader ::= SEQUENCE { |
ProfileElement 中顶层元素含义与作用
根据您提供的 ProfileElement 中的 CHOICE 定义,将这 33 种(含 5 个保留占位符)顶层元素按功能分类,逐一详细说明它们的含义和在 eUICC Profile 安装中的作用。
元数据与控制类(核心入口与终止)
| PE 类型 | 标签 | 含义与作用 |
|---|---|---|
header |
A0 |
Profile 头部。必须是第一个元素,包含 Profile 的元数据:版本号(V2/V3)、ICCID、Profile 类型名称、eUICC 必须支持的服务列表(如 USIM、Milenage、Java Card)以及必须支持的模板 ID 列表。eUICC 首先解析它来校验兼容性和初始化安装环境。 |
end |
AA |
结束标记。必须是最后一个元素,无有效载荷。eUICC 遇到此 PE 后停止解析 Profile 数据,标志着安装包的终结。 |
安全凭证类(PIN / PUK / ADM)
| PE 类型 | 标签 | 含义与作用 |
|---|---|---|
pinCodes |
A2 |
PIN 码配置。定义全局或本地的 PIN(个人识别码)和 ADM(管理员密钥)。每个配置包含密钥引用(如 pinAppl1)、PIN 值(ASCII 码,8 字节)、关联的 PUK 引用、启用状态和重试次数。用于保护文件访问、更新和删除等操作。 |
pukCodes |
A3 |
PUK 解锁码配置。定义与 PIN 对应的 PUK(PIN 解锁码)。当 PIN 连续输错被锁定时,使用 PUK 解锁。每个配置包含 PUK 引用(如 pukAppl1)和 8 字节 ASCII 值。 |
网络认证算法参数类
| PE 类型 | 标签 | 含义与作用 |
|---|---|---|
akaParameter |
A4 |
AKA 认证参数(3GPP 网络)。配置 USIM/ISIM 的鉴权算法(Milenage、TUAK 或测试算法),包含:密钥(Key)、OPc(运营商常数)、SQN 序列号管理参数(增量、老化限制、初始化向量)以及认证计数器最大值。用于 3G/4G/5G 网络接入时的双向鉴权。 |
cdmaParameter |
A5 |
CDMA 认证参数(3GPP2 网络)。配置 CSIM 的 CAVE 算法参数,包含:A-Key(8 字节)、SSD(共享秘密数据 A/B)、HRPD 接入认证数据、简单 IP CHAP 参数和移动 IP 认证参数。用于 CDMA 网络接入。 |
安全域与远程管理类(GP 核心)
| PE 类型 | 标签 | 含义与作用 |
|---|---|---|
securityDomain |
A6 |
安全域(Security Domain)。用于创建 ISD-P(Profile 专属安全域)或 SSD(补充安全域)。包含:应用实例信息(AID)、密钥列表(ENC/MAC/DEK 等多组密钥,支持 DES/AES)、个人化数据(sdPersoData)和开放参数。它是 Profile 安全通信(SCP80/SCP03)和密钥管理的核心。 |
rfm |
A7 |
远程文件管理(Remote File Management)。定义 RFM 实例,允许通过 CAT_TP 或 OTA 远程管理(创建、更新、删除)Profile 内的文件。包含:实例 AID、安全域 AID、TAR 列表、最低安全级别、访问域以及可选的默认 ADF 选择。 |
应用与扩展类
| PE 类型 | 标签 | 含义与作用 |
|---|---|---|
application |
A8 |
应用/小程序安装。用于加载 Java Card 小程序(Applet)。包含:加载包信息(CAP 文件二进制数据、AID、内存限制)、实例列表(类 AID、实例 AID、特权、生命周期状态、应用参数)。可在 Profile 中嵌入增值服务(如支付、身份认证)。 |
nonStandard |
A9 |
非标准专有扩展。承载厂商或特定组织(如 GSMA)的专有数据。包含:颁发者 ID(OID)和任意内容的八位字节串,用于实现规范未覆盖的特殊功能。 |
genericFileManagement |
A1 |
通用文件管理(替代模板方式)。允许通过显式的文件管理命令(创建 FCP、填充偏移、填充内容)来构建文件系统,而不是依赖预定义模板。用于精细控制文件创建,通常与模板方式二选一。 |
文件系统模板类(NFCC / 基础目录)
| PE 类型 | 标签 | 含义与作用 |
|---|---|---|
mf |
B0 |
主文件(MF)。创建 UICC 根目录,包含:EF_PL(优先 PLMN)、EF_ICCID、EF_DIR(应用注册目录)、EF_ARR(访问规则参考)和 EF_UMPC。是所有文件系统的根基,EF_DIR 向终端注册可用的 NAA(如 USIM)。 |
cd |
B1 |
无接触域(Contactless Domain)。创建 DF_CD,包含 EF_LAUNCHPAD 和 EF_ICON,用于支持非接触式应用(如 NFC 支付、交通卡)。 |
telecom |
B2 |
电信专用文件(TELECOM DF)。存放与电信业务相关的文件,如:短消息(SMS)、拨号号码(ADN/BDN)、功能设置(RMA/SUME)、图形文件、多媒体消息服务(MMS)等。 |
网络接入应用类(NAA,重点核心)
| PE 类型 | 标签 | 含义与作用 |
|---|---|---|
usim |
B3 |
USIM 应用(3G/4G/5G 核心网络)。创建 ADF_USIM,包含:EF_IMSI(用户标识)、EF_ARR(访问规则)、EF_KEYS(CK/IK 密钥存储)、EF_UST(服务表)、EF_SPN(运营商名称)、EF_ACC(接入控制)、EF_ECC(紧急号码)、EF_LOCI/EF_EPSLOCI(位置信息)等。是所有移动网络接入的基础。 |
opt-usim |
B4 |
可选 USIM 文件。包含 USIM 中非必须但常用的文件,如:EF_MSISDN(电话号码)、EF_GID1/GID2(组标识)、EF_PNN(PLMN 网络名称)、EF_OPL(运营商 PLMN 列表)、EF_EHPLMN(等效 HPLMN)等,用于增强网络选择和用户功能。 |
isim |
B5 |
ISIM 应用(IMS/VoLTE)。创建 ADF_ISIM,包含:EF_IMPI(私有用户标识)、EF_IMPU(公共用户标识)、EF_DOMAIN(归属域名)、EF_IST(ISIM 服务表),用于 IP 多媒体子系统的鉴权和注册。 |
opt-isim |
B6 |
可选 ISIM 文件。包含 ISIM 的额外参数,如:EF_PCSCF(代理 CSCF 地址)、EF_GBA 相关参数、EF_IMS_CONFIG_DATA 等,用于增强 IMS 配置。 |
gsm-access |
B8 |
GSM 接入文件。创建 DF_GSM_ACCESS,包含:EF_KC(GSM 加密密钥)、EF_KCGPRS(GPRS 加密密钥)、EF_CPBCCH(广播信道信息),用于 2G 网络的向后兼容接入。 |
csim |
B9 |
CSIM 应用(CDMA 网络)。创建 ADF_CSIM,包含:EF_IMSI_M/T(IMSI)、EF_AH(鉴权历史)、EF_PRL(首选漫游列表)、EF_OTAPA(空中激活参数),用于 CDMA 网络接入。 |
opt-csim |
BA |
可选 CSIM 文件。包含 CSIM 的可选参数,如:EF_FDN(固定拨号)、EF_SPN、EF_MDN(移动目录号)、EF_HRPDCAP 等,用于增强 CDMA 功能。 |
eap |
BB |
EAP 客户端(认证框架)。创建 DF_EAP,包含:EF_EAPKEYS(EAP 密钥)、EF_EAPSTATUS(状态)、EF_REID/EF_REALM(身份和域),用于支持基于 EAP 的认证(如 Wi-Fi、5G 非 3GPP 接入)。 |
5G 高级功能类(5G 特色)
| PE 类型 | 标签 | 含义与作用 |
|---|---|---|
df-5gs |
BC |
5GS 专用文件。创建 DF_5GS,包含 5G 核心网特有的文件:EF_5GS3GPPLOCI(5G 位置信息)、EF_SUCI-CALC-INFO(SUCI 计算公钥与加密参数)、EF_UAC-AIC(UAC 接入标识)、EF_OPL5G(5G PLMN 列表)、EF_NSI(网络切片指示)、EF_ROUTING-INDICATOR(路由指示器)等,是 5G SA(独立组网)接入的关键。 |
df-saip |
BD |
SAIP 专用文件(SUCI 计算)。创建 DF_SAIP,包含:EF_SUCI-CALC-INFO-USIM(USIM 侧 SUCI 计算参数)。与 df-5gs 配合,但更专注于隐私保护标识符(SUCI)的派生。 |
df-snpn |
BE |
SNPN 专用文件(独立非公共网络)。用于 5G 专网(如企业/工业 5G 网络)。包含:EF_PWS-SNPN(公共告警系统),支持不依赖公共 PLMN 的专网接入。 |
df-5gprose |
BF |
5G ProSe 专用文件(邻近服务)。用于 5G 设备直连通信(如车联网 V2X、D2D)。包含:EF_5G-PROSE-ST(服务表)、EF_5G-PROSE-DD(直接发现)、EF_5G-PROSE-U2NRU(U2N 中继)等。 |
df-5gprose(实际为 BF 之后的扩展,请注意标签 BF 本身对应此,以及后续的 iot/opt-iot 是双字节标签 BF 01/BF 02) |
见上 | 同上。 |
IoT 轻量级类(物联网特殊场景)
| PE 类型 | 标签 | 含义与作用 |
|---|---|---|
iot |
BF 01(双字节) |
IoT 最小 Profile。针对资源受限的物联网设备(如传感器、智能表计)设计的轻量级 USIM。它将 MF 和 USIM 的核心文件合并到一个 PE 中,去掉了冗余目录,包含:EF_IMSI、EF_ACC、EF_KEYS 等,并强制要求 IotOptions(PIX 值)在头部定义。 |
opt-iot |
BF 02(双字节) |
可选 IoT 文件。为 IoT Profile 提供可选增强文件,如:EF_FDN、EF_SMS、EF_SPN、EF_EPSLOCI、EF_5GS3GPPLOCI 等,允许 IoT 设备按需扩展功能(如短信、5G 位置更新)。 |
保留占位符类(版本兼容)
| PE 类型 | 标签 | 含义与作用 |
|---|---|---|
rfu1 ~ rfu5 |
AB ~ AF |
保留未来使用(Reserved for Future Use)。这些是占位符,没有实际功能(PE-Dummy 为空 SEQUENCE)。它们的存在是为了在规范未来版本中新增非文件系统 PE 时,避免重新编号导致标签混乱,确保向后兼容性。当前版本中遇到它们应被忽略或报错(取决于 eUICC 实现)。 |
总结:依赖关系与常用组合
在实际商用 Profile 中,通常至少包含:
header(头部)mf(主文件根目录)usim(USIM 应用,用于 3G/4G/5G)pinCodes和pukCodes(安全保护)securityDomain(用于安装后的远程管理和密钥更新)end(终止)
而 genericFileManagement 与模板方式(mf、usim 等)通常互斥,二选一。5G 功能(df-5gs、df-saip)是 5G SA Profile 的必备部分。
PEHeader 中字段的编码顺序
针对 PEHeader 结构,需要先明确一个关键区分:字段在 SEQUENCE 中的编码顺序 与 identification 字段的数值 是两个完全不同的概念。
PEHeader 中字段的编码顺序是绝对强制性的,不能随意改变;但 identification 字段的数值(ID编号)是可以自由分配的(只要保证唯一性)。
以下是详细的法律依据、技术原因和底层机制:
ASN.1 的硬性规定(为什么顺序不能改)
在 ASN.1 的 DER(可区分编码规则) 中,SEQUENCE 的编码顺序由 ASN.1 模块定义中的书写顺序严格决定,解析器(eUICC)是按照位置索引(第1个字段、第2个字段……)来读取数据的。
PEHeader 的定义为:PEHeader ::= SEQUENCE {
mandated NULL OPTIONAL, -- 第1个字段(隐式标签)
identification UInt15 -- 第2个字段(隐式标签)
}
强制编码顺序必须是:先 mandated(如果存在),后 identification。
- 如果违反顺序(例如把
identification放在前面):eUICC 的 ASN.1 解码器会把identification的整数值(如0x01)错误地解析为mandated字段。而mandated定义为NULL类型(不携带数据),当解码器发现数据类型不匹配(收到整数而不是空值)时,会直接抛出bad-values(错误码 3) 或invalid-parameter(错误码 6),导致 Profile 安装彻底失败。
DER 编码与签名校验的约束(为什么必须严格顺序)
eUICC Profile 安装包在传输前,通常由 SM-DP+(订阅管理器-数据准备)进行数字签名。
- 加密哈希计算:签名是对整个 Profile 包的二进制原始字节流进行哈希后计算的。
- 如果改变顺序:即使字段内容完全一样,二进制字节流也会完全不同(因为 TLV 的排列变了)。计算出的哈希值将无法通过 eUICC 的签名验签,Profile 会被判定为“篡改/无效”,安装立即中止。
关于 identification 数值的灵活性(可以“随机”的部分)
虽然编码位置固定,但 identification 字段存储的数值(UInt15) 是可以自由定义的。
- 定义:
identification是 ProfileElement 的唯一标识号(范围 0~32767)。 - 用途:主要用于
PEStatus报错时定位是哪个 PE 出了问题(例如“PE ID 5 安装失败”)。 - 规则:只要在同一个 Profile 包内,所有 PE 的
identification不重复即可(例如 MF=1,PUK=2,PIN=3,USIM=5,END=99 是常见的习惯用法,但完全可以改为 MF=100,PUK=200)。 - 注意:虽然在同一个 Profile 中可以有较大自由度,但在某些特定场景(如
PE-RFM通过identification引用)会涉及逻辑依赖,不过这种依赖属于“业务逻辑”而非“编码强制”。
总结对照表
| 项目 | 是否可以随机/改变 | 原因 |
|---|---|---|
mandated 和 identification 的编码先后顺序 |
❌ 绝对不可以 | ASN.1 DER 严格要求按定义顺序编码;改变会导致类型解析错误和签名验证失败。 |
identification 字段内部的数值(如 1、2、99) |
✅ 可以自由分配(只要唯一) | 该数值仅作为 PE 的索引/标签,由 Profile 生成者自行设定,规范仅要求不重复。 |
一句话总结:无法也不应改变 mandated 与 identification 在二进制流中的排列顺序,但可以将 identification 的值设置为任何喜欢的数字(只要不与其他 PE 冲突)。
多个 ProfileElement 中 PEHeader 里的 identification 值是否可以随机
针对“多个 ProfileElement 中 PEHeader 里的 identification 值是否可以随机”这个问题,答案是:
可以自由选择(近乎随机),但必须严格遵守唯一的强制性规则,绝不能是“完全的、无约束的随机”。
展开来讲,它受以下 3 条硬性规则 和 1 条重要建议 的约束:
硬性规则一:必须全局唯一(最重要)
- 约束:在同一个 Profile 安装包内,所有出现的
ProfileElement的identification值绝对不能重复。 - 原因:规范定义
identification的主要用途是配合PEStatus结构进行错误定位。当 eUICC 在安装某个 PE 时遇到错误(如内存不足、模板不支持),它会返回PEStatus,其中携带identification值来告诉 SM-DP+ 是“ID 为 X 的那个 PE”出了问题。 - 后果:如果两个 PE 的 ID 相同,eUICC 无法区分是哪一个报错,会导致歧义和诊断失败,安装会被中止。
硬性规则二:必须位于有效数值范围内
- 约束:
identification定义为UInt15,取值范围是0~32767。不能超出这个范围。
硬性规则三:0 值通常不建议使用
- 虽然规范允许
0,但在绝大多数 ASN.1 编码实践中,0常被视为“未初始化”或“无效 ID”。为了避免混淆,实际商用 Profile 中通常从1开始编号。
关于“是否可以随机”的技术分析
- 可以“随意选数”:规范没有规定
MF必须是1,也没有规定USIM必须是5。可以把 MF 设为100,USIM 设为200,PUK 设为50,只要不重复即可。从 ASN.1 解码器的角度看,identification只是一个整数容器,它不关心数字是否连续或是否从 1 开始。 - 但绝不能“丢骰子式随机”:
- 重复风险:如果完全随机生成(比如在 1~32767 中随机取 5 个数),存在极小的概率重复。一旦重复,该 Profile 包是非法的。
- 逻辑依赖影响:虽然
identification主要供报错使用,但在某些高级场景(如GenericFileManagement中的显式引用,或外部 RFM 脚本寻址)可能会通过 ID 来引用特定的 PE。如果 ID 是完全随机且不记录的,后续维护和远程管理将无从下手。
推荐的工程实践(非强制,但强烈建议)
为了方便人工排查和日志追踪,业界通常遵循语义化编号:
- 范围分段:
1 ~ 99:核心系统 PE(如 MF=1, PUK=2, PIN=3, USIM=5, END=99)100 ~ 199:5G 扩展 PE(如 DF-5GS=100, DF-SAIP=101)200 ~ 299:应用/小程序 PE
- 递增分配:按出现顺序递增,避免跳号过大造成视觉混乱。
总结对比表
| 维度 | 是否允许 | 约束条件 |
|---|---|---|
| 数值是否必须连续(如 1,2,3…) | ❌ 不必须 | 可以跳号(如 1, 5, 99) |
| 数值是否必须从 1 开始 | ❌ 不必须 | 可从任意有效值开始(如 100) |
| 数值是否可以重复使用 | ❌ 绝对禁止 | 全局唯一是硬性要求 |
| 是否可以完全随机生成 | ⚠️ 技术上可行但危险 | 必须保证去重;若依赖外部引用,不建议 |
| 推荐做法 | 建议按功能模块分段分配,便于日志溯源 | 确保唯一性即可 |
顶级标签的排列顺序
根据提供的示例数据,解码后的顶级标签(即 ProfileElement 的 TLV 标签)顺序为:
A0 → B0 → A3 → A2 → B2 → B3 → AA
对应关系与说明
| 顺序 | 标签 | 对应 ProfileElement | PE ID | 作用 |
|---|---|---|---|---|
| 1 | A0 |
ProfileHeader |
- | 必备开头,提供版本、ICCID、服务列表等元数据 |
| 2 | B0 |
PE-MF |
1 | 创建主文件(MF)及基础文件(EF_DIR、EF_ARR 等) |
| 3 | A3 |
PE-PUKCodes |
2 | 定义 PUK 解锁码(PUK1/PUK2/本地PUK) |
| 4 | A2 |
PE-PINCodes |
3 | 定义 PIN 和 ADM(PIN1/PIN2/ADM1) |
| 5 | B2 |
PE-TELECOM |
4 | 创建 TELECOM 目录(链接到 MF 的 ARR) |
| 6 | B3 |
PE-USIM |
5 | 创建 USIM 应用及关键文件(IMSI、UST、SPN 等) |
| 7 | AA |
PE-End |
99 | 终止标志,结束 Profile 解析 |
为什么是这个顺序(依赖关系)?
A0必须第一,因为 eUICC 需要先读取版本、ICCID 和强制模板列表,才能初始化安装环境。B0紧随其后,因为PE-USIM(B3)和PE-TELECOM(B2)中的EF_ARR都通过linkPath指向 MF 下的EF_ARR(文件ID2F06),所以 MF 必须优先创建。A3/A2(PUK/PIN)可以放在 MF 之后任意位置,它们不依赖文件系统,仅定义安全凭证,本例将它们放在 MF 之后、USIM 之前,也是合理的。B2和B3的顺序没有强制要求,但本例先 TELECOM 后 USIM,两者都依赖 MF,但互不依赖,所以可互换。AA必须最后,作为结束标记。
是否允许其他顺序?
- 除
A0必须第一、AA必须最后外,某些独立元素(如 PUK/PIN 之间,或不同应用之间)可以互换。 - 但不能违反依赖关系:例如将
B3放在B0之前会导致 USIM 中的链接文件找不到 MF 的EF_ARR,安装失败。 - 因此,一个合规的 Profile 安装包必须遵循先元数据 → 先父目录 → 先被引用文件的原则,具体顺序可由生成工具(如 SM-DP+)根据模板定义自动排列,但上述示例顺序是典型且完全正确的。
总结说明
关于示例数据中 A0、B0、A3 等标签的顺序,结论是:顺序不是绝对固定的(ASN.1 语法未强制),但绝不能随意随机,必须遵循逻辑依赖关系。
具体原因和规则如下:
ASN.1 语法层面:不强制标签升序
- 在 ASN.1 的 DER 编码中,如果顶层结构定义为
SET或SET OF,才强制要求按标签(Tag)升序排列。 - 但本规范中的 Profile 安装包是由
ProfileElement的 TLV 连续拼接构成(或等价于SEQUENCE OF ProfileElement)。SEQUENCE OF保留原始输入顺序,不会像SET那样自动排序。 - 可以验证:示例中标签顺序为
A0(160)→B0(176)→A3(163)→A2(162),并非升序(160, 176, 163, 162 是乱序的),所以它不是SET OF,因此 ASN.1 编译器不会强制排序。
安装逻辑层面:必须遵循依赖关系(不可随机)
虽然语法不强制,但 eUICC 在安装 Profile 时是顺序解析、顺序执行的,因此依赖关系决定了顺序必须满足:
ProfileHeader(A0)必须是第一个:- 它包含
major-version、iccid和eUICC-Mandatory-GFSTEList(强制模板列表)。 - eUICC 在安装开始前必须先读取这些元数据,才能正确初始化安装上下文、校验版本和模板兼容性。如果
A0不在最前面,eUICC 会因缺少关键信息而报错中止。
- 它包含
PE-MF(B0)必须先于PE-USIM(B3)和PE-TELECOM(B2):PE-USIM(B3)中的EF_ARR使用了链接路径linkPath = '2F06'H,它明确指向 MF 根目录下的EF_ARR(文件 ID2F06)。- 如果在创建
EF_ARR链接时,MF 下的EF_ARR尚未被创建(即B0还没执行),eUICC 会报告“目标文件不存在”错误,导致安装失败。 - 同理,
PE-TELECOM也会链接到 MF 的访问规则,因此也必须后置。
PE-End(AA)必须是最后一个:- 它标记了整个 ProfileElement 列表的终结。eUICC 遇到它后会停止解析,不再处理后续数据(如果还有,会被忽略或报错)。
哪些可以交换顺序?(独立性较强的 PE)
PE-PUKCodes(A3)和PE-PINCodes(A2) 之间没有依赖关系,它们的顺序可以互换。- 同样,如果存在多个互不依赖的应用(例如两个独立的 Applet),它们的顺序也可以调整。
总结对照表
| 标签 | 类型 | 允许的位置限制 | 原因 |
|---|---|---|---|
A0 |
ProfileHeader |
必须第一 | 提供全局元数据,是所有后续操作的先决条件 |
B0 |
PE-MF |
必须在 B2/B3 之前 |
USIM/TELECOM 的 ARR 链接依赖 MF 下的 EF_ARR(2F06) |
A3 / A2 |
PUK/PIN |
可在 B0 之后任意位置 |
仅定义安全凭证,不依赖文件系统路径 |
B2 |
PE-TELECOM |
必须在 B0 之后 |
依赖 MF 的访问规则(链接路径) |
B3 |
PE-USIM |
必须在 B0 之后 |
依赖 MF 的访问规则(链接路径) |
AA |
PE-End |
必须最后 | 终止标志,结束安装包解析 |
结论
不能随机排序。虽然 ASN.1 规范本身没有强制编号递增,但 eUICC 的安装器是状态机顺序执行的,文件系统的创建必须遵循“父目录先于子目录”、“被引用文件先于引用文件”的原则。一个合规的 Profile 生成工具(如 SM-DP+)必须按照上述依赖关系生成 Profile,否则会导致 eUICC 安装失败并返回错误状态(如 template-not-supported 或 bad-values)。