BPP数据生成过程
生成 BPP 是 SM-DP+ 的核心功能,其过程是将一个通用的 Profile 与一个特定的 eUICC 进行安全绑定,形成一个 Bound Profile Package。这个过程涉及数据准备、安全协议和加密绑定等多个步骤。
从生成到下载,Profile包不同的形式。
- · Unprotected Profile Package (UPP):未加密Profile包,Raw SIMalliance TLV sequence。
- · Protected Profile Package (PPP): 加密的Profile包,使用SCP03t TLVs分割和加密
- · Bound Profile Package (BPP):已经有会话密钥协商、密钥替换包、ISD-P创建和配置信息
- · Segmented Bound Profile Package (SBPP): BPP划分为STORE DATA APDU脚本加载到eUICC上。这一步由LPD执行,当LPD在设备上。
BPP 生成的核心目标
将一个 Protected Profile Package 与一个特定的 eUICC 绑定,确保:
- 专属性:该 BPP 只能被目标 eUICC 安装。
- 机密性:Profile 数据在传输和安装过程中不被泄露。
- 完整性:Profile 数据在传输和安装过程中不被篡改。
- 真实性:确保 BPP 来自合法的 SM-DP+。
BPP 的生成流程(详细步骤)
整个流程可以概括为下图所示的几个关键阶段:
下面我们对每个阶段进行详细说明:
阶段 1:密钥协商(建立安全通道基础)
输入:从 eUICC 的
PrepareDownload响应中获取其 一次性公钥。动作:SM-DP+ 使用自己的 私钥 和 eUICC 的 公钥,通过 ECDH 密钥协商算法 计算出一个共享密钥。
输出:派生出两个 SCP03t 会话密钥:
- S-ENC:用于后续数据加密。
- S-MAC:用于后续计算消息认证码。
阶段 2:构建 BPP 框架
动作:SM-DP+ 开始组装 BPP 的 TLV 结构。BPP 是一个由多个 TLV 块顺序组成的序列。
第一个块:添加
InitialiseSecureChannel命令块。- 内容:包含 SM-DP+ 的证书、签名以及用于密钥协商的参数。
- 保护方式:此块不加密,也不计算 MAC。其真实性和完整性由附带的 数字签名 保证。它用于在 eUICC 端触发相同的密钥协商过程,从而确保双方拥有相同的会话密钥。
阶段 3:保护并嵌入 PPP
这是最核心的步骤,SM-DP+ 使用阶段1生成的会话密钥,对 PPP 及其相关命令进行保护。
- (可选)密钥替换:
- 目的:为了增强安全性,SM-DP+ 可以生成一组新的、随机的 Profile 保护密钥,并用这组新密钥来保护 PPP,而不是直接使用最初的会话密钥。
- 动作:添加
ProfileProtectionKeys命令块。该命令块的内容(即新密钥)使用最初的 S-ENC/S-MAC 密钥进行加密和计算 MAC。
- 配置 ISD-P:
- 动作:添加
ConfigureISDP命令块。该命令用于在 eUICC 上创建和配置即将安装 Profile 的安全域。 - 保护方式:该命令块使用当前的会话密钥(或替换后的新密钥)进行加密和计算 MAC。
- 动作:添加
- 存储元数据:
- 动作:添加
StoreMetadata命令块。该命令包含 Profile 的元数据信息。 - 保护方式:该命令块仅使用当前的会话密钥计算 MAC,但不加密。因为元数据需要被 LPA 读取并展示给用户。
- 动作:添加
- 嵌入受保护的 PPP:
- 动作:将 PPP 数据分割成多个段(每段最大 1020 字节),并为每个段添加 PPP 数据段 命令块。
- 保护方式:每个 PPP 数据段块都使用当前的会话密钥(或替换后的新密钥)进行加密和计算 MAC。
阶段 4:签名与完成
- 动作:在组装完所有 TLV 块后,SM-DP+ 计算整个 BPP 的 数字签名。
- 输出:将签名附加在 BPP 的末尾,形成最终的、完整的 Bound Profile Package。
关键技术与安全机制
- 双重绑定:
- 密码学绑定:通过 eUICC 的一次性公钥进行密钥协商,确保会话密钥唯一,从而加密绑定。
- 结构绑定:
ConfigureISDP命令中包含了目标 eUICC 的 EID,确保 Profile 被安装到正确的设备上。
- 分层加密:
- 使用会话密钥保护命令。
- 可选的密钥替换机制为 PPP 提供了额外的加密层。
- 完整性保证:
- 每个关键命令块都带有 C-MAC。
- 整个 BPP 带有最终签名。
- 防重放:
- SCP03t 协议中使用的加密计数器确保了每个加密块都是唯一的。
使用 SCP03t 加密
在生成 BPP 时使用 SCP03t 加密,是指 SM-DP+ 在构建 Bound Profile Package 的过程中,使用 SCP03t 安全协议 对 BPP 内的关键数据块进行加密和完整性保护。
BPP包含一系列的TLV命令(按照这种顺序)
- · 秘钥协商的TLV命令,明文。
- · 使用SCP03t加密TLVs(标签‘87’)包含配置ISDP的命令。
- · 使用SCP03t加密TLVs(标签‘88’)包含存储元数据的命令。
- · 使用SCP03t加密TLVs(标签‘87’)(可选)包含’Profile Protection keys’(PPK)的命令。
- · 接着是使用SCP03t加密的TLVs(标签‘86’)的PPP。
每次收到带有’86’, ‘87’或者’88’标签的TLV,使用ICV计算的加密计数器就会增加。
BPP的数据结构如下:
BoundProfilePackage ::= [54] SEQUENCE { -- Tag 'BF36' |
不同序列的’86’, ‘87’和’88’标签TLV,下表进行了描述:
| 标签 | 长度 | 值描述 | MOC | ||
|---|---|---|---|---|---|
| ‘A0’ | Var. | 87第一序列(firstSequenceOf87) | M | ||
| ‘87’ | Var. | SCP03t段包含配置ISDP(ConfigureISDP),使用秘钥协商的结果—会话秘钥保护(S-ENC, S-CMAC)(见2.6.4节)。内容:TLV的”ES8+.ConfigureISDP”函数(见5.5.2节)在生成会话密钥期间的收条计算是作为第一个MAC链值。 | M | ||
| ‘A1’ | Var | 88序列(sequenceOf88) | M | ||
| ‘88’ | Var. | SCP03t段包含存储元数据(StoreMetadata),MAC使用秘钥协商的结果—会话秘钥保护(S-CMAC) (见2.6.4节) (例如不加密)。内容:TLV的”ES8+.StoreMetadata”函数(见5.5.3节)。 | M | ||
| ‘88’ | Var. | 如果一个’88’ TLV不能包含全部的数据结构,SCP03t段包含其余部分的元数据。 | C | ||
| ‘A2’ | Var. | 87第二序列(secondSequenceOf87)如果没有内容将不存在 | C | ||
| ‘87’ | Var. | SCP03t段包含Profile Protection Keys(PPK),使用秘钥协商的结果—会话秘钥保护(S-ENC,S-CMAC) (见2.6.4节)。内容:TLV的”ES8+.ReplaceSessionKeys”函数 (见5.5.4节)。 | O | ||
| ‘A3’ | Var. | 86序列(sequenceOf86) | M | ||
| ‘86’ | Var. | SCP03t加密的,b1段使用PPK保护 (PPK-ENC,PPK-MAC) 或者使用秘钥协商的会话秘钥(S-ENC,S-CMAC)。(见2.6.4节) | M | ||
| ‘86’ | Var. | 随后SCP03t加密的b2…bn段 | O |
加密的对象:BPP 中的数据块
BPP 是一个结构化的数据包,包含多个 TLV 命令块。SCP03t 加密并非加密整个 BPP,而是加密其中特定的部分:
ConfigureISDP块:用于创建和配置 ISD-P 的命令。此块需要被加密并计算 MAC。StoreMetadata块:包含 Profile 元数据的命令。此块仅计算 MAC,不加密。Profile Protection Keys块(可选):用于替换会话密钥的命令。此块需要被加密并计算 MAC。PPP块:即被保护的 Profile 包本身。此块需要被加密并计算 MAC。InitialiseSecureChannel块:用于密钥协商的初始命令。此块不加密,也不计算 MAC,其完整性和真实性由数字签名保证。
加密的目的:端到端安全
SCP03t 加密在 SM-DP+ 和 eUICC 的 ISD-P 之间建立了一个端到端的安全通道,即使数据需要通过 SM-SR 或 LPA 转发,也能确保:
- 机密性:Profile 数据、密钥等敏感信息在传输过程中不会被窃听。
- 完整性:数据在传输过程中不会被篡改。
- 真实性:数据确实来自经过认证的 SM-DP+。
加密的流程:基于会话密钥
SCP03t 加密是一个基于对称密钥(会话密钥)的过程:
- 密钥协商:在 BPP 的
InitialiseSecureChannel阶段,SM-DP+ 和 eUICC 通过 ECC 密钥协商,生成一对共享的 SCP03t 会话密钥:S-ENC(用于加密)和 S-MAC(用于计算 MAC)。 - 数据保护:SM-DP+ 使用上述会话密钥,按照 SCP03t 协议规定的格式(AES-CBC 加密,AES-CMAC 计算 MAC),对需要保护的 TLV 块(标签为
‘86’,‘87’,‘88’)进行加密和 MAC 计算。 - 密钥替换(可选):SM-DP+ 可以选择使用随机生成的 Profile 保护密钥 来替换最初的会话密钥,以保护 PPP。这个过程本身也由最初的会话密钥保护。
- eUICC 验证:eUICC 收到 BPP 后,使用协商出的相同会话密钥(或替换后的密钥)进行解密和 MAC 验证,只有验证通过才会执行安装。
技术细节
- 算法:AES-CBC-128 加密,AES-CMAC 签名。
- 数据格式:面向 TLV 格式数据。
- 数据分块:PPP 等大数据块会被分割成最大 1020 字节的段进行保护。
- 计数器:一个加密计数器用于 ICV 计算,每收到一个受保护的 TLV 都会递增,确保每次加密的初始向量不同,防止重放攻击。
生成 BPP 时的 SCP03t 加密,是 SM-DP+ 将 Profile 数据与特定 eUICC 绑定并安全传输的核心技术手段。 它利用一次性的会话密钥,为 Profile 下载安装流程中的关键指令和数据提供了高强度、端到端的保护,确保了整个远程配置过程的安全可靠。
加密和计算 MAC
SCP03t 协议进行加密和计算 MAC 的具体流程如下。这个过程主要应用于保护 Protected Profile Package 和 Bound Profile Package 中的命令数据块。
核心流程概述
SCP03t 对数据的保护分为两种模式:
- 加密并计算 MAC:用于
ConfigureISDP、Profile Protection Keys和PPP数据块。 - 仅计算 MAC:用于
StoreMetadata数据块。
以下以最常见的 加密并计算 MAC 模式为例,详细说明流程。
详细步骤(以加密并计算MAC为例)
假设要保护一段原始的 命令数据。
第 1 步:数据填充
目的:使数据长度成为加密算法块长度(AES为16字节)的整数倍。
方法:
- 在原始数据右侧追加一个字节
‘80’。 - 然后追加
0到15个值为‘00’的字节,直到填充后的数据总长度是 16字节的整数倍。
- 在原始数据右侧追加一个字节
文档依据:“Append a byte with value ‘80’ to the right of the data block. Append 0 to 15 bytes with value ‘00’ so that the length of the padded data block is a multiple of 16 bytes.”
第 2 步:生成初始向量
目的:为 CBC 加密模式生成唯一的初始向量,防止重放攻击。
方法:
- 维护一个 数据块计数器,从
1开始,每处理一个数据块递增。 - 将该计数器的二进制值左填充零,形成一个完整的 16 字节块。
- 使用 S-ENC 密钥 对这个 16 字节的计数器块进行 AES 加密。
- 加密后的结果即为用于本次数据块加密的 初始向量。
- 维护一个 数据块计数器,从
文档依据:“The data blocks SHALL be numbered starting from 1. The binary value of this number SHALL be left padded with zeroes to form a full block. This block SHALL be encrypted with S-ENC to produce the ICV for command encryption.”
第 3 步:加密数据
- 目的:对填充后的数据进行加密,实现机密性。
- 方法:使用 S-ENC 密钥 和上一步生成的 初始向量,以 AES-CBC 模式对填充后的数据块进行加密。
- 输出:得到 加密后的数据。
第 4 步:计算 MAC
目的:为整个受保护的数据单元计算消息认证码,确保完整性和真实性。
输入数据(串联组成):
MAC 链值:
- 对于第一个数据块:使用密钥协商产生的 初始 MAC 链值。
- 对于后续数据块:使用上一个数据块最终计算出的完整 MAC 值作为本次的链值。
标签:标识数据块类型的字节(如
‘86’代表 PPP 数据段)。最终长度:加密后数据加上 MAC 长度后的总长度(Lcc)。
加密后的数据:第 3 步的输出结果。
计算方法:将上述输入数据串联起来,使用 S-MAC 密钥 和 AES-CMAC 算法进行计算。
输出:生成一个 MAC 值,并取其中最左边的 8 个字节 作为最终的 C-MAC。
文档依据:“The input data used for C-MAC computation comprises the MAC Chaining value, the tag, the final length and the result of step 2. … If the algorithm is AES-CMAC-128 …, the C-MAC value is the 8 most significant bytes of the result…”
第 5 步:组装最终报文
目的:形成可传输的、受保护的 TLV 数据块。
组装顺序:将以下部分按顺序拼接:
- 标签:1字节。
- 长度:3字节,表示后续“加密数据 + C-MAC”的总长度。
- 加密后的数据:第 3 步的输出。
- C-MAC:第 4 步输出的 8 字节。
- 最终结构:
[Tag][Length][Encrypted Data][C-MAC]
仅计算 MAC 的模式
对于 StoreMetadata 等仅需完整性的数据,流程更简单:
- MAC 输入数据:由 MAC 链值、标签、长度 和 原始数据本身 串联而成。
- 计算 MAC:使用 S-MAC 密钥 和 AES-CMAC 算法计算,同样取 8 字节作为 C-MAC。
- 组装报文:
[Tag][Length][Original Data][C-MAC]
SCP03t 的加密和 MAC 计算是一个结构化的、基于计数器和链式 MAC 的强安全过程。它通过 AES-CBC 加密 保证数据机密性,通过 AES-CMAC 和链式值 保证数据完整性和顺序性,并通过 每块递增的计数器 防止重放攻击,共同为 Profile 下载提供了端到端的安全保障。
