如何将太大而无法放入一个传输 APDU 的命令脚本分段

How to segment command script that is too big to fit into one transport APDU

SGP.02 - 嵌入式 UICC 技术规范的远程配置架构(特别是 v4.0 的第 255 页)说:

the data format provided by the function caller SHALL NOT depend of the selected OTA protocol capabilities (for example SM-DP can consider there is no limit on data length)

以后

The SM-SR has the responsibility to build the final Command script, depending on eUICC capabilities and selected protocol:

  • by adding the Command scripting template for definite or indefinite length,

  • and, if necessary, by segmenting the provided command script into several pieces

  • and, if necessary, by adding the relevant Script Chaining TLVs.

我理解 SM-DP 可以向 ES3.SendData 发送任意长的 data 参数,如果 data 太大而不适合,SM-SR 应该在多个 SMS 中发送多个 APDU合二为一。这就是 segmenting.

的意思

问题是我找不到定义如何进行分段的相关规范。这就是问题所在:分割过程在哪里定义?

我可能错了,但它似乎与 ETSI TS 123 048 第 6.3 节中描述的串联短消息不同。

似乎 ETSI TS 102 226 中简要提到的脚本链接有些相关,因此也非常欢迎指向定义其工作原理的规范的指针(TS 102 226 讨论脚本链接 TLV,但不讨论如何使用它们,至少我肯定缺少一些更广泛的上下文它是如何工作的,所以任何提示都是值得赞赏的)。

更新:

ES8.EstablishISDPKeySet函数需要发送3个APDU。而且它们很大,因为它们包含钥匙。从 SGP.02-v4.0 table 150 我了解到它们是使用扩展远程命令格式从 SM-DP 发送到 SM-SR 的。据我所知,这种格式的脚本可能相当大(假设 SM-DP 可以假设数据长度没有限制)。并且不清楚SM-SR应该如何segment它或者使用chaining。我只是缺少描述的规格。

  1. eUICC内部缓存有限,无法在内部存储10kb以上的完整profile包。消息必须分块。如果 eUICC 仅支持例如1 kb 那么你必须在最多 3 个 APDU 命令之后拆分 APDU 命令以保持在 1kb 以下。 SGP.02 规范定义至少有 1024 字节。功能齐全的 SM-SR 可能会在 EID 中存储一些基于 eUICC 供应商的属性,以便为某些 eUICC 添加特殊处理和补丁以支持更大的缓冲区大小。

  2. 将每个 APDUs 块(1..n APDUs)编码为扩展的远程命令格式(ETSI TS 102 226,第 5.2.1 节)(紧凑格式只能对最后一个有一个响应APDU,但如果它有效,你可以节省几个字节)

  3. 将每个扩展的远程命令消息编码为 SMS-DELIVER(TS 123 048 和 simalliance 互操作性垫脚石版本 6),这包括使用 OTA 密钥(KiC、KID)进行数据加密。 gsm0348 是一个很好的 Java 库。注意:对于每条消息,OTA 计数器都必须递增。 Select 一个参考号并为所有消息保留。我想这是 eUICC 知道哪些消息属于一起的标识符。

  4. 如果使用 SMS(我建议改用 CAT-TP 或 HTTPs -> 更快更可靠)将其编码为 SMS-PP 下载消息 (TS 131 111)。如果负载超过 140 字节,您将在此处使用消息串联。

  5. 您将收到 SendShortMessage (TS 131 111, 6.4.10) 作为响应。使用 TS 123 048 和 simalliance Interoperability Stepping Stones release 6 再次提取用户数据。您会收到 SMS 响应消息。查看响应数据包以获取用户数据。

  6. 将用户数据提取为扩展远程响应 (ETSI TS 102 226)

eUICC 将处理流消息。连接的短消息仅用于在传输过程中属于一起的消息块。

详细说明分段和脚本链接如何工作的最佳规范是 SGP.11 嵌入式 UICC 测试规范的远程配置架构

它本身没有要求,但它有传入 ES3.SendData 的字节级示例和 eUICC 接收到的消息的示例。这可以很容易地推断出 SM-SR 的实际行为。

这里是参考该规范的更详细的解释。

命令脚本

命令脚本是在 ES3.SendData 的数据字段中发送的命令列表。它可以是(参见 SGP.02-v4.0 的 table 150 中的 data 字段描述):

  1. C-APDUs 命令列表(在 SGP.11-v4.0 第 595 页的 EXPANDED_COMMANDS 方法中定义,并在 SGP.11-407 页的步骤 2 中使用) v4.0)

  2. 构成SCP03t脚本的TLV命令(在SGP.11-v4.0第600页SCP03T_SCRIPT方法中定义,并在SGP.11-408页第14步中使用) v4.0)

脚本链接

脚本链接是当需要执行多个传输消息中发送的多个命令但在执行第一个命令并用于下一个命令后需要保留某些执行上下文时使用的功能(例如第一个命令是 INSTALL [for personalization],第二个是 STORE DATA)。此上下文是 TS 102 226.

第 4 节中定义的命令会话

至少在这些情况下使用(SGP.02 中的附件 K 也支持):

  1. 当后续命令基于eUICC的响应时

  2. 当命令脚本过大无法一次性发送时

脚本链接由 SM-SR 执行,通过将脚本链接 TLV 添加到扩展远程格式的命令脚本来实现。请参阅 TS 102 226.

中的第 5.4.1.2 节

可以在 SGP.11-v4.0 中找到脚本链接的示例。

对于第一种情况,请参阅第 4.2.10.2.1.1 节中 EstablishISDRKeyset 过程的场景。对于第二种情况,请参阅第 4.2.18.2.1.1 节中 DownloadAndInstallation 过程的场景。脚本链接的字节级表示在第 601 页的 SCP80_PACKET 方法中进行了描述(参见选项 CHAINING_OPT)。

似乎显式链接仅适用于 SMSCAT_TP 传输。对于 HTTPS 命令会话与 通过 HTTP 远程应用程序管理的第 3.6 节中定义的管理会话一致 – Public 版本 v1.1.3 因此不需要添加显式脚本链接 TLV。

分段

当指令脚本过大无法一次性发送时,SMSR会生成多个指令脚本。 SMSR 从 SMDP CMD1, CMD2, …, CMDN 收到的命令(参见 SGP.11-v4.0 第 408 页的步骤 14)和形成命令脚本的命令被拆分成几个命令脚本。第一个包含命令 CMD1CMD2、…、CMDi 的一些初始部分。第二个命令脚本包含命令 CMDi+1CMDi+2、…、CMDj。第三个CMDj+1,…,CMDk等等

如果使用 SMSCAT_TP,则对于每个命令,链接 TLV 都会添加到开头并具有适当的值(请参阅 SGP.11-v4 中的第 4.2.18.2.1.1 节。 0).

然后每个新命令脚本都在单独的消息中发送到 eUICC。