RSP中BPP数据的生成

人越长大,就越习惯压抑内心的真实感受,不再放声大哭放声大笑,什么都只是淡淡的点到为止。好像越来越没有什么事,可以伤心到落泪,再也找不出,释放伤感的出口

Posted by yishuifengxiao on 2025-12-15

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 绑定,确保:

  1. 专属性:该 BPP 只能被目标 eUICC 安装。
  2. 机密性:Profile 数据在传输和安装过程中不被泄露。
  3. 完整性:Profile 数据在传输和安装过程中不被篡改。
  4. 真实性:确保 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 及其相关命令进行保护。

  1. (可选)密钥替换
    • 目的:为了增强安全性,SM-DP+ 可以生成一组新的、随机的 Profile 保护密钥,并用这组新密钥来保护 PPP,而不是直接使用最初的会话密钥。
    • 动作:添加 ProfileProtectionKeys 命令块。该命令块的内容(即新密钥)使用最初的 S-ENC/S-MAC 密钥进行加密和计算 MAC
  2. 配置 ISD-P
    • 动作:添加 ConfigureISDP 命令块。该命令用于在 eUICC 上创建和配置即将安装 Profile 的安全域。
    • 保护方式:该命令块使用当前的会话密钥(或替换后的新密钥)进行加密和计算 MAC
  3. 存储元数据
    • 动作:添加 StoreMetadata 命令块。该命令包含 Profile 的元数据信息。
    • 保护方式:该命令块仅使用当前的会话密钥计算 MAC,但不加密。因为元数据需要被 LPA 读取并展示给用户。
  4. 嵌入受保护的 PPP
    • 动作:将 PPP 数据分割成多个段(每段最大 1020 字节),并为每个段添加 PPP 数据段 命令块。
    • 保护方式:每个 PPP 数据段块都使用当前的会话密钥(或替换后的新密钥)进行加密和计算 MAC

阶段 4:签名与完成

  • 动作:在组装完所有 TLV 块后,SM-DP+ 计算整个 BPP 的 数字签名
  • 输出:将签名附加在 BPP 的末尾,形成最终的、完整的 Bound Profile Package

关键技术与安全机制

  1. 双重绑定
    • 密码学绑定:通过 eUICC 的一次性公钥进行密钥协商,确保会话密钥唯一,从而加密绑定。
    • 结构绑定ConfigureISDP 命令中包含了目标 eUICC 的 EID,确保 Profile 被安装到正确的设备上。
  2. 分层加密
    • 使用会话密钥保护命令。
    • 可选的密钥替换机制为 PPP 提供了额外的加密层。
  3. 完整性保证
    • 每个关键命令块都带有 C-MAC。
    • 整个 BPP 带有最终签名。
  4. 防重放
    • 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'
initialiseSecureChannelRequest [35] InitialiseSecureChannelRequest, -- Tag 'BF23'
firstSequenceOf87 [0] SEQUENCE OF [7] OCTET STRING, -- sequence of '87' TLVs
sequenceOf88 [1] SEQUENCE OF [8] OCTET STRING, -- sequence of '88' TLVs
secondSequenceOf87 [2] SEQUENCE OF [7] OCTET STRING OPTIONAL, -- sequence of '87' TLVs
sequenceOf86 [3] SEQUENCE OF [6] OCTET STRING -- sequence of '86' TLVs
}

不同序列的’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 加密是一个基于对称密钥(会话密钥)的过程:

  1. 密钥协商:在 BPP 的 InitialiseSecureChannel 阶段,SM-DP+ 和 eUICC 通过 ECC 密钥协商,生成一对共享的 SCP03t 会话密钥S-ENC(用于加密)和 S-MAC(用于计算 MAC)。
  2. 数据保护:SM-DP+ 使用上述会话密钥,按照 SCP03t 协议规定的格式(AES-CBC 加密,AES-CMAC 计算 MAC),对需要保护的 TLV 块(标签为 ‘86’, ‘87’, ‘88’)进行加密和 MAC 计算。
  3. 密钥替换(可选):SM-DP+ 可以选择使用随机生成的 Profile 保护密钥 来替换最初的会话密钥,以保护 PPP。这个过程本身也由最初的会话密钥保护。
  4. 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 PackageBound Profile Package 中的命令数据块。

核心流程概述

SCP03t 对数据的保护分为两种模式:

  1. 加密并计算 MAC:用于 ConfigureISDPProfile Protection KeysPPP 数据块。
  2. 仅计算 MAC:用于 StoreMetadata 数据块。

以下以最常见的 加密并计算 MAC 模式为例,详细说明流程。

详细步骤(以加密并计算MAC为例)

假设要保护一段原始的 命令数据

第 1 步:数据填充

  • 目的:使数据长度成为加密算法块长度(AES为16字节)的整数倍。

  • 方法:

    1. 在原始数据右侧追加一个字节 ‘80’
    2. 然后追加 015 个值为 ‘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. 维护一个 数据块计数器,从 1 开始,每处理一个数据块递增。
    2. 将该计数器的二进制值左填充零,形成一个完整的 16 字节块
    3. 使用 S-ENC 密钥 对这个 16 字节的计数器块进行 AES 加密
    4. 加密后的结果即为用于本次数据块加密的 初始向量
  • 文档依据:“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

  • 目的:为整个受保护的数据单元计算消息认证码,确保完整性和真实性。

  • 输入数据(串联组成):

    1. MAC 链值:

      • 对于第一个数据块:使用密钥协商产生的 初始 MAC 链值
      • 对于后续数据块:使用上一个数据块最终计算出的完整 MAC 值作为本次的链值。
    2. 标签:标识数据块类型的字节(如 ‘86’ 代表 PPP 数据段)。

    3. 最终长度:加密后数据加上 MAC 长度后的总长度(Lcc)。

    4. 加密后的数据:第 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. 标签:1字节。
  1. 长度:3字节,表示后续“加密数据 + C-MAC”的总长度。
    1. 加密后的数据:第 3 步的输出。
    2. C-MAC:第 4 步输出的 8 字节。
  • 最终结构[Tag][Length][Encrypted Data][C-MAC]

仅计算 MAC 的模式

对于 StoreMetadata 等仅需完整性的数据,流程更简单:

  1. MAC 输入数据:由 MAC 链值标签长度原始数据本身 串联而成。
  2. 计算 MAC:使用 S-MAC 密钥 和 AES-CMAC 算法计算,同样取 8 字节作为 C-MAC。
  3. 组装报文[Tag][Length][Original Data][C-MAC]

SCP03t 的加密和 MAC 计算是一个结构化的、基于计数器和链式 MAC 的强安全过程。它通过 AES-CBC 加密 保证数据机密性,通过 AES-CMAC 和链式值 保证数据完整性和顺序性,并通过 每块递增的计数器 防止重放攻击,共同为 Profile 下载提供了端到端的安全保障。

img