eSIM RSP 测试用例对比站

人工切片(-man) ↔ Cas 盲生成(-cas)· 真机真卡执行证据对照

源码对照:4.2.12.2.1

ES10b 获取 eUICC 挑战码 / TC_eUICC_ES10b.GetEUICCChallenge

左侧为人工切片入口(-man,来自 原料/切片 的最小可执行脚本),右侧为 Cas 盲生成入口(-cas,仅依据规范生成)。文件按原始编码(多为 GBK)解码为 UTF-8 显示,行号自 1 起;字节级原文与 sha256 见两侧脚本包。完整 unified diff 见本页底部折叠区,以及 报告原文 §4。
-man 入口
Import/TestCase_SGP_23.js
40 行 / 1420 字符 / gb18030
-cas 入口
TC_eUICC_ES10b_GetEUICCChallenge/Import/TC_eUICC_ES10b_GetEUICCChallenge.js
110 行 / 8591 字符 / gb18030
默认折行显示长行;取消勾选可横向滚动查看原始行宽
-man 人工切片Import/TestCase_SGP_23.js40 行 / 1420 字符 / gb18030入口函数 @L3
1// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10b_GetEUICCChallenge_01_Nominal (extracted verbatim)
2
3function TC_eUICC_ES10b_GetEUICCChallenge_01_Nominal()
4{
5	tracenamestr = "测试目的:连续获取两次eUICC随机数,返回的随机数应不同";
6	curDis.TraceStart(sno++,tracenamestr);
7
8	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
9	Ini_powerOn_eUICC_LPAe_not_activate();
10	
11	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
12	TS_MANAGE_CHANNEL_OPEN();
13	
14	curLogicChannel = 1;
15	
16	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
17	TS_SELECT("Select ISD",ISD_R_AID,"9000");
18	
19	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
20	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
21	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
22	Profile_load_procedure.ES10b_GetEUICCInfo1();
23
24	
25	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
26	Profile_load_procedure.ES10b_GetEUICCChallenge();
27	
28	var ChanllengeData1 = Profile_load_procedure.euiccChallenge;
29	
30	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,重复执行GetEuiccChallengeRequest;");
31	Profile_load_procedure.ES10b_GetEUICCChallenge();
32	
33	var ChanllengeData2 = Profile_load_procedure.euiccChallenge;
34	
35	if (ChanllengeData1 == ChanllengeData2)
36		obj.SubLevelError("每次获取的EUICCChallenge 应当不相同,实际获取的EUICCChallenge相同");
37	
38	RecoverCard();
39}
40
-cas 盲生成TC_eUICC_ES10b_GetEUICCChallenge/Import/TC_eUICC_ES10b_GetEUICCChallenge.js110 行 / 8591 字符 / gb18030入口函数 @L15
1// Author: 卡思Cas智能体
2// Date: 20261004-021945
3// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10b.GetEUICCChallenge,Test Sequence #01 Nominal,适用性 M。
4// Test points: ICH-IC1-K1-C1 ATR_present;ICH-IC1-K2-C2 FCP_Template;ICH-IC1-K2-C4 SW
5//   ICH-IC1-K3-C4 SW;ICH-IC1-K4-C4 final SW;ICH-IC2-K1-C4 SW;ICH-IC2-K1-C3 CHANNEL_NUMBER extracted
6//   ICH-IC2-K2-C4 SW;S1-C1 ATR_present;S2-C2 FCP_Template;S2-C1 SW;S3-C1 SW;S4-C1 final SW;S5-C1 SW
7//   S5-C2 CHANNEL_NUMBER extracted;S6-C1 SW;S7-C1 SW;S7-C2 R_CHALLENGE outer tag
8//   S7-C2 tagOfeuiccChallenge;S7-C2 lengthOfeuiccChallenge;S7-C3 R_CHALLENGE outer tag
9//   S7-C3 tagOfeuiccChallenge;S7-C3 lengthOfeuiccChallenge;S8-C1 SW;S8-C2 R_CHALLENGE outer tag
10//   S8-C2 tagOfeuiccChallenge;S8-C2 lengthOfeuiccChallenge
11//   S8-C3 euiccChallenge differs between step 7 and step 8
12// 本函数由 CaseIR 4.2.12.2.1 编译生成(fullwave-blindgen-live-70,SGP.23 v1.16 × SGP.22 v2.7):字节权威=CaseIR,非誊录黄金脚本。
13// Value-free template: every data byte is injected from CaseIR fields; no scaffold globals (see docs/speconly/compile-symbol-migration.md).
14// 适用性 M:编译期门,运行时由 harness 环境前置承担。
15function TC_eUICC_ES10b_GetEUICCChallenge_01_Nominal() {
16    var bind = curBind;
17
18    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 1):RESET(K 语料机械展开)
19    var s9 = bind.resetAndAtr();
20    bind.checkData("ICH-IC1-K1-C1 ATR_present", "1", s9.atr_hex !== "" ? "1" : "0");
21
22    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 2):SELECT_MF(K 语料机械展开)
23    // FCP outer tag not materialized from clause: tag-face asserted only when corpus fixes the tag byte (e.g. TS 102 221 FCP '62').
24    var s10 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
25    bind.checkData("ICH-IC1-K2-C2 FCP_Template", "1", s10.resp.length > 0 ? "1" : "0");
26    bind.checkData("ICH-IC1-K2-C4 SW", "9000", s10.sw);
27
28    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 3):TERMINAL_CAPABILITY_LPAd(K 语料机械展开)
29    var s11 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
30    bind.checkData("ICH-IC1-K3-C4 SW", "9000", s11.sw);
31
32    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 4):TERMINAL_PROFILE(K 语料机械展开)
33    var steady12 = bind.runToSteadyState(function () {
34        return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
35    });
36    bind.checkData("ICH-IC1-K4-C4 final SW", "9000", steady12.final.sw);
37
38    // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 1):MANAGE_CHANNEL_OPEN(K 语料机械展开)
39    // CHANNEL_NUMBER extraction and dynamic CLA rebinding are CasBind internal state (chaining rule; no generated-code re-implementation).
40    var s13 = bind.manageChannelOpen("9000");
41    bind.checkData("ICH-IC2-K1-C4 SW", "9000", s13.sw);
42    bind.checkData("ICH-IC2-K1-C3 CHANNEL_NUMBER extracted", "1", s13.chan !== null ? "1" : "0");
43
44    // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 2):MTD_SELECT(K 语料机械展开)
45    // CLA = bound channel (cla_rule) and <L> length binding are CasBind internal state (chaining rule; no generated-code re-implementation).
46    var s14 = bind.sendApdu(null, "A4", "04", "00", "A0000005591010FFFFFFFF8900000100", null, "9000");
47    // MTD_SELECT expected face is SW-only (K Annex C.2 open-channel procedure step 2: no FCI content assertion in corpus); no fabricated template parse.
48    bind.checkData("ICH-IC2-K2-C4 SW", "9000", s14.sw);
49
50    // 步骤 1:IC1/1: RESET(PROC_EUICC_INITIALIZATION_SEQUENCE 展开1/4,K_annexC2_procs 表1256)(procedure_expansion)
51    var s1 = bind.resetAndAtr();
52    bind.checkData("S1-C1 ATR_present", "1", s1.atr_hex !== "" ? "1" : "0");
53
54    // 步骤 2:IC1/2: [SELECT_MF](展开2/4)(procedure_expansion)
55    // FCP outer tag not materialized from clause: tag-face asserted only when corpus fixes the tag byte (e.g. TS 102 221 FCP '62').
56    var s2 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
57    bind.checkData("S2-C2 FCP_Template", "1", s2.resp.length > 0 ? "1" : "0");
58    bind.checkData("S2-C1 SW", "9000", s2.sw);
59
60    // 步骤 3:IC1/3: [TERMINAL_CAPABILITY_LPAd](展开3/4)(procedure_expansion)
61    var s3 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
62    bind.checkData("S3-C1 SW", "9000", s3.sw);
63
64    // 步骤 4:IC1/4: [TERMINAL_PROFILE](展开4/4)(procedure_expansion)
65    var steady4 = bind.runToSteadyState(function () {
66        return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
67    });
68    bind.checkData("S4-C1 final SW", "9000", steady4.final.sw);
69
70    // 步骤 5:IC2/1: [MANAGE_CHANNEL_OPEN](PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR 展开1/2,K_annexC2_procs 表1258)(procedure_expansion)
71    // CHANNEL_NUMBER extraction and dynamic CLA rebinding are CasBind internal state (chaining rule; no generated-code re-implementation).
72    var s5 = bind.manageChannelOpen("9000");
73    bind.checkData("S5-C1 SW", "9000", s5.sw);
74    bind.checkData("S5-C2 CHANNEL_NUMBER extracted", "1", s5.chan !== null ? "1" : "0");
75
76    // 步骤 6:IC2/2: MTD_SELECT(procedure_expansion)
77    // CLA = bound channel (cla_rule) and <L> length binding are CasBind internal state (chaining rule; no generated-code re-implementation).
78    var s6 = bind.sendApdu(null, "A4", "04", "00", "A0000005591010FFFFFFFF8900000100", "00", "9000");
79    // MTD_SELECT expected face is SW-only (K Annex C.2 open-channel procedure step 2: no FCI content assertion in corpus); no fabricated template parse.
80    bind.checkData("S6-C1 SW", "9000", s6.sw);
81
82    // 步骤 7:1: MTD_STORE_DATA(tc_step;REQ: RQ31_029, RQ31_030, RQ31_031, RQ57_049, RQ57_050)
83    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
84    var sdCla7 = s5.chan !== null ? (s5.chan <= 3 ? 128 + s5.chan : 188 + s5.chan).toString(16).toUpperCase() : null;
85    var s7 = bind.sendApdu(sdCla7, "E2", "91", "00", "BF2E00", "00", "9000");
86    bind.checkData("S7-C1 SW", "9000", s7.sw);
87    var r2w7 = BindGecaProc.parseGecaResponse(s7.resp, {outer: "BF2E", required: ["80"]});
88    bind.checkData("S7-C2 R_CHALLENGE outer tag", "BF2E", r2w7.outer_tag === null ? "absent" : r2w7.outer_tag);
89    var r2ch7 = null; for (var r2ci7 = 0; r2ci7 < r2w7.children.length; r2ci7++) { if (r2w7.children[r2ci7].tag === "80") { r2ch7 = r2w7.children[r2ci7]; } }
90    var r2chal7 = r2ch7 === null ? "" : r2ch7.value;
91    bind.checkData("S7-C2 tagOfeuiccChallenge", "80", r2ch7 === null ? "absent" : r2ch7.tag);
92    bind.checkData("S7-C2 lengthOfeuiccChallenge", "10", r2ch7 === null ? "absent" : (r2ch7.len < 16 ? ("0" + r2ch7.len.toString(16).toUpperCase()) : r2ch7.len.toString(16).toUpperCase()));
93    bind.checkData("S7-C3 R_CHALLENGE outer tag", "BF2E", r2w7.outer_tag === null ? "absent" : r2w7.outer_tag);
94    bind.checkData("S7-C3 tagOfeuiccChallenge", "80", r2ch7 === null ? "absent" : r2ch7.tag);
95    bind.checkData("S7-C3 lengthOfeuiccChallenge", "10", r2ch7 === null ? "absent" : (r2ch7.len < 16 ? ("0" + r2ch7.len.toString(16).toUpperCase()) : r2ch7.len.toString(16).toUpperCase()));
96
97    // 步骤 8:2: MTD_STORE_DATA(tc_step;REQ: RQ57_048)
98    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
99    var sdCla8 = s5.chan !== null ? (s5.chan <= 3 ? 128 + s5.chan : 188 + s5.chan).toString(16).toUpperCase() : null;
100    var s8 = bind.sendApdu(sdCla8, "E2", "91", "00", "BF2E00", "00", "9000");
101    bind.checkData("S8-C1 SW", "9000", s8.sw);
102    var r2w8 = BindGecaProc.parseGecaResponse(s8.resp, {outer: "BF2E", required: ["80"]});
103    bind.checkData("S8-C2 R_CHALLENGE outer tag", "BF2E", r2w8.outer_tag === null ? "absent" : r2w8.outer_tag);
104    var r2ch8 = null; for (var r2ci8 = 0; r2ci8 < r2w8.children.length; r2ci8++) { if (r2w8.children[r2ci8].tag === "80") { r2ch8 = r2w8.children[r2ci8]; } }
105    var r2chal8 = r2ch8 === null ? "" : r2ch8.value;
106    bind.checkData("S8-C2 tagOfeuiccChallenge", "80", r2ch8 === null ? "absent" : r2ch8.tag);
107    bind.checkData("S8-C2 lengthOfeuiccChallenge", "10", r2ch8 === null ? "absent" : (r2ch8.len < 16 ? ("0" + r2ch8.len.toString(16).toUpperCase()) : r2ch8.len.toString(16).toUpperCase()));
108    bind.checkData("S8-C3 euiccChallenge differs between step 7 and step 8", "1", (r2chal7 !== "" && r2chal8 !== "" && r2chal7 !== r2chal8) ? "1" : "0");
109}
110

完整 unified diff

行级差异:新增 105 行 / 删除 35 行(以 -man 为基准,unified 上下文 3 行)。

展开 diff(148 行)
--- -man
+++ -cas
@@ -1,40 +1,110 @@
-// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10b_GetEUICCChallenge_01_Nominal (extracted verbatim)
+// Author: 卡思Cas智能体
+// Date: 20261004-021945
+// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10b.GetEUICCChallenge,Test Sequence #01 Nominal,适用性 M。
+// Test points: ICH-IC1-K1-C1 ATR_present;ICH-IC1-K2-C2 FCP_Template;ICH-IC1-K2-C4 SW
+//   ICH-IC1-K3-C4 SW;ICH-IC1-K4-C4 final SW;ICH-IC2-K1-C4 SW;ICH-IC2-K1-C3 CHANNEL_NUMBER extracted
+//   ICH-IC2-K2-C4 SW;S1-C1 ATR_present;S2-C2 FCP_Template;S2-C1 SW;S3-C1 SW;S4-C1 final SW;S5-C1 SW
+//   S5-C2 CHANNEL_NUMBER extracted;S6-C1 SW;S7-C1 SW;S7-C2 R_CHALLENGE outer tag
+//   S7-C2 tagOfeuiccChallenge;S7-C2 lengthOfeuiccChallenge;S7-C3 R_CHALLENGE outer tag
+//   S7-C3 tagOfeuiccChallenge;S7-C3 lengthOfeuiccChallenge;S8-C1 SW;S8-C2 R_CHALLENGE outer tag
+//   S8-C2 tagOfeuiccChallenge;S8-C2 lengthOfeuiccChallenge
+//   S8-C3 euiccChallenge differs between step 7 and step 8
+// 本函数由 CaseIR 4.2.12.2.1 编译生成(fullwave-blindgen-live-70,SGP.23 v1.16 × SGP.22 v2.7):字节权威=CaseIR,非誊录黄金脚本。
+// Value-free template: every data byte is injected from CaseIR fields; no scaffold globals (see docs/speconly/compile-symbol-migration.md).
+// 适用性 M:编译期门,运行时由 harness 环境前置承担。
+function TC_eUICC_ES10b_GetEUICCChallenge_01_Nominal() {
+    var bind = curBind;
 
-function TC_eUICC_ES10b_GetEUICCChallenge_01_Nominal()
-{
-	tracenamestr = "测试目的:连续获取两次eUICC随机数,返回的随机数应不同";
-	curDis.TraceStart(sno++,tracenamestr);
+    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 1):RESET(K 语料机械展开)
+    var s9 = bind.resetAndAtr();
+    bind.checkData("ICH-IC1-K1-C1 ATR_present", "1", s9.atr_hex !== "" ? "1" : "0");
 
-	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
-	Ini_powerOn_eUICC_LPAe_not_activate();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
-	TS_MANAGE_CHANNEL_OPEN();
-	
-	curLogicChannel = 1;
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
-	TS_SELECT("Select ISD",ISD_R_AID,"9000");
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
-	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
-	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
-	Profile_load_procedure.ES10b_GetEUICCInfo1();
+    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 2):SELECT_MF(K 语料机械展开)
+    // FCP outer tag not materialized from clause: tag-face asserted only when corpus fixes the tag byte (e.g. TS 102 221 FCP '62').
+    var s10 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
+    bind.checkData("ICH-IC1-K2-C2 FCP_Template", "1", s10.resp.length > 0 ? "1" : "0");
+    bind.checkData("ICH-IC1-K2-C4 SW", "9000", s10.sw);
 
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
-	Profile_load_procedure.ES10b_GetEUICCChallenge();
-	
-	var ChanllengeData1 = Profile_load_procedure.euiccChallenge;
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,重复执行GetEuiccChallengeRequest;");
-	Profile_load_procedure.ES10b_GetEUICCChallenge();
-	
-	var ChanllengeData2 = Profile_load_procedure.euiccChallenge;
-	
-	if (ChanllengeData1 == ChanllengeData2)
-		obj.SubLevelError("每次获取的EUICCChallenge 应当不相同,实际获取的EUICCChallenge相同");
-	
-	RecoverCard();
+    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 3):TERMINAL_CAPABILITY_LPAd(K 语料机械展开)
+    var s11 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
+    bind.checkData("ICH-IC1-K3-C4 SW", "9000", s11.sw);
+
+    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 4):TERMINAL_PROFILE(K 语料机械展开)
+    var steady12 = bind.runToSteadyState(function () {
+        return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
+    });
+    bind.checkData("ICH-IC1-K4-C4 final SW", "9000", steady12.final.sw);
+
+    // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 1):MANAGE_CHANNEL_OPEN(K 语料机械展开)
+    // CHANNEL_NUMBER extraction and dynamic CLA rebinding are CasBind internal state (chaining rule; no generated-code re-implementation).
+    var s13 = bind.manageChannelOpen("9000");
+    bind.checkData("ICH-IC2-K1-C4 SW", "9000", s13.sw);
+    bind.checkData("ICH-IC2-K1-C3 CHANNEL_NUMBER extracted", "1", s13.chan !== null ? "1" : "0");
+
+    // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 2):MTD_SELECT(K 语料机械展开)
+    // CLA = bound channel (cla_rule) and <L> length binding are CasBind internal state (chaining rule; no generated-code re-implementation).
+    var s14 = bind.sendApdu(null, "A4", "04", "00", "A0000005591010FFFFFFFF8900000100", null, "9000");
+    // MTD_SELECT expected face is SW-only (K Annex C.2 open-channel procedure step 2: no FCI content assertion in corpus); no fabricated template parse.
+    bind.checkData("ICH-IC2-K2-C4 SW", "9000", s14.sw);
+
+    // 步骤 1:IC1/1: RESET(PROC_EUICC_INITIALIZATION_SEQUENCE 展开1/4,K_annexC2_procs 表1256)(procedure_expansion)
+    var s1 = bind.resetAndAtr();
+    bind.checkData("S1-C1 ATR_present", "1", s1.atr_hex !== "" ? "1" : "0");
+
+    // 步骤 2:IC1/2: [SELECT_MF](展开2/4)(procedure_expansion)
+    // FCP outer tag not materialized from clause: tag-face asserted only when corpus fixes the tag byte (e.g. TS 102 221 FCP '62').
+    var s2 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
+    bind.checkData("S2-C2 FCP_Template", "1", s2.resp.length > 0 ? "1" : "0");
+    bind.checkData("S2-C1 SW", "9000", s2.sw);
+
+    // 步骤 3:IC1/3: [TERMINAL_CAPABILITY_LPAd](展开3/4)(procedure_expansion)
+    var s3 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
+    bind.checkData("S3-C1 SW", "9000", s3.sw);
+
+    // 步骤 4:IC1/4: [TERMINAL_PROFILE](展开4/4)(procedure_expansion)
+    var steady4 = bind.runToSteadyState(function () {
+        return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
+    });
+    bind.checkData("S4-C1 final SW", "9000", steady4.final.sw);
+
+    // 步骤 5:IC2/1: [MANAGE_CHANNEL_OPEN](PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR 展开1/2,K_annexC2_procs 表1258)(procedure_expansion)
+    // CHANNEL_NUMBER extraction and dynamic CLA rebinding are CasBind internal state (chaining rule; no generated-code re-implementation).
+    var s5 = bind.manageChannelOpen("9000");
+    bind.checkData("S5-C1 SW", "9000", s5.sw);
+    bind.checkData("S5-C2 CHANNEL_NUMBER extracted", "1", s5.chan !== null ? "1" : "0");
+
+    // 步骤 6:IC2/2: MTD_SELECT(procedure_expansion)
+    // CLA = bound channel (cla_rule) and <L> length binding are CasBind internal state (chaining rule; no generated-code re-implementation).
+    var s6 = bind.sendApdu(null, "A4", "04", "00", "A0000005591010FFFFFFFF8900000100", "00", "9000");
+    // MTD_SELECT expected face is SW-only (K Annex C.2 open-channel procedure step 2: no FCI content assertion in corpus); no fabricated template parse.
+    bind.checkData("S6-C1 SW", "9000", s6.sw);
+
+    // 步骤 7:1: MTD_STORE_DATA(tc_step;REQ: RQ31_029, RQ31_030, RQ31_031, RQ57_049, RQ57_050)
+    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
+    var sdCla7 = s5.chan !== null ? (s5.chan <= 3 ? 128 + s5.chan : 188 + s5.chan).toString(16).toUpperCase() : null;
+    var s7 = bind.sendApdu(sdCla7, "E2", "91", "00", "BF2E00", "00", "9000");
+    bind.checkData("S7-C1 SW", "9000", s7.sw);
+    var r2w7 = BindGecaProc.parseGecaResponse(s7.resp, {outer: "BF2E", required: ["80"]});
+    bind.checkData("S7-C2 R_CHALLENGE outer tag", "BF2E", r2w7.outer_tag === null ? "absent" : r2w7.outer_tag);
+    var r2ch7 = null; for (var r2ci7 = 0; r2ci7 < r2w7.children.length; r2ci7++) { if (r2w7.children[r2ci7].tag === "80") { r2ch7 = r2w7.children[r2ci7]; } }
+    var r2chal7 = r2ch7 === null ? "" : r2ch7.value;
+    bind.checkData("S7-C2 tagOfeuiccChallenge", "80", r2ch7 === null ? "absent" : r2ch7.tag);
+    bind.checkData("S7-C2 lengthOfeuiccChallenge", "10", r2ch7 === null ? "absent" : (r2ch7.len < 16 ? ("0" + r2ch7.len.toString(16).toUpperCase()) : r2ch7.len.toString(16).toUpperCase()));
+    bind.checkData("S7-C3 R_CHALLENGE outer tag", "BF2E", r2w7.outer_tag === null ? "absent" : r2w7.outer_tag);
+    bind.checkData("S7-C3 tagOfeuiccChallenge", "80", r2ch7 === null ? "absent" : r2ch7.tag);
+    bind.checkData("S7-C3 lengthOfeuiccChallenge", "10", r2ch7 === null ? "absent" : (r2ch7.len < 16 ? ("0" + r2ch7.len.toString(16).toUpperCase()) : r2ch7.len.toString(16).toUpperCase()));
+
+    // 步骤 8:2: MTD_STORE_DATA(tc_step;REQ: RQ57_048)
+    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
+    var sdCla8 = s5.chan !== null ? (s5.chan <= 3 ? 128 + s5.chan : 188 + s5.chan).toString(16).toUpperCase() : null;
+    var s8 = bind.sendApdu(sdCla8, "E2", "91", "00", "BF2E00", "00", "9000");
+    bind.checkData("S8-C1 SW", "9000", s8.sw);
+    var r2w8 = BindGecaProc.parseGecaResponse(s8.resp, {outer: "BF2E", required: ["80"]});
+    bind.checkData("S8-C2 R_CHALLENGE outer tag", "BF2E", r2w8.outer_tag === null ? "absent" : r2w8.outer_tag);
+    var r2ch8 = null; for (var r2ci8 = 0; r2ci8 < r2w8.children.length; r2ci8++) { if (r2w8.children[r2ci8].tag === "80") { r2ch8 = r2w8.children[r2ci8]; } }
+    var r2chal8 = r2ch8 === null ? "" : r2ch8.value;
+    bind.checkData("S8-C2 tagOfeuiccChallenge", "80", r2ch8 === null ? "absent" : r2ch8.tag);
+    bind.checkData("S8-C2 lengthOfeuiccChallenge", "10", r2ch8 === null ? "absent" : (r2ch8.len < 16 ? ("0" + r2ch8.len.toString(16).toUpperCase()) : r2ch8.len.toString(16).toUpperCase()));
+    bind.checkData("S8-C3 euiccChallenge differs between step 7 and step 8", "1", (r2chal7 !== "" && r2chal8 !== "" && r2chal7 !== r2chal8) ? "1" : "0");
 }