eSIM RSP 测试用例对比站

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

源码对照:4.2.25.2.1

ES10c 获取 EID / TC_eUICC_ES10c.GetEID

左侧为人工切片入口(-man,来自 原料/切片 的最小可执行脚本),右侧为 Cas 盲生成入口(-cas,仅依据规范生成)。文件按原始编码(多为 GBK)解码为 UTF-8 显示,行号自 1 起;字节级原文与 sha256 见两侧脚本包。完整 unified diff 见本页底部折叠区,以及 报告原文 §4。
-man 入口
Import/TestCase_SGP_23.js
64 行 / 1993 字符 / gb18030
-cas 入口
TC_eUICC_ES10c_GetEID/Import/TC_eUICC_ES10c_GetEID.js
119 行 / 7952 字符 / gb18030
默认折行显示长行;取消勾选可横向滚动查看原始行宽
-man 人工切片Import/TestCase_SGP_23.js64 行 / 1993 字符 / gb18030入口函数 @L3
1// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10c_GetEID_01_Nominal + TC_eUICC_ES10c_GetEID_02_Error (extracted verbatim)
2
3function TC_eUICC_ES10c_GetEID_01_Nominal()
4{
5	tracenamestr = "测试目的:获取EID正确性测试";
6	curDis.TraceStart(sno++,tracenamestr);
7	
8	curLogicChannel = 0;
9	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
10	Ini_powerOn_eUICC_LPAe_not_activate();
11	
12	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
13	TS_MANAGE_CHANNEL_OPEN();
14	
15	curLogicChannel = 1;
16	
17	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
18	TS_SELECT("Select ISD",ISD_R_AID,"9000");
19	
20	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,GET_EID");
21	var getEuiccDataRequest = new GetEuiccDataRequest();
22	getEuiccDataRequest.tagList = "5A";
23	var getEuiccDataRequestHexStr = getEuiccDataRequest.GenHexData();
24	var hexData = LPAd_Transport_data_to_eUICC(getEuiccDataRequestHexStr);
25	
26	var getEuiccDataResponse = new GetEuiccDataResponse();
27	
28	getEuiccDataResponse.checkCardResDataFormat(hexData);
29	
30	var eidValue = getEuiccDataResponse.eidValue;
31	
32	curStrHandle.CheckData(EID1, eidValue, "eidValue");
33	
34	
35	RecoverCard();
36}
37
38function TC_eUICC_ES10c_GetEID_02_Error()
39{
40	tracenamestr = "测试目的:tagList非法,获取EID";
41	curDis.TraceStart(sno++,tracenamestr);
42	
43	curLogicChannel = 0;
44	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
45	Ini_powerOn_eUICC_LPAe_not_activate();
46	
47	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
48	TS_MANAGE_CHANNEL_OPEN();
49	
50	curLogicChannel = 1;
51	
52	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
53	TS_SELECT("Select ISD",ISD_R_AID,"9000");
54	
55	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,GET_EID,命令数据为错误的tagList");
56	var getEuiccDataRequest = new GetEuiccDataRequest();
57	getEuiccDataRequest.tagList = "6B";
58	var getEuiccDataRequestHexStr = getEuiccDataRequest.GenHexData();
59	LPAd_Transport_data_to_eUICC(getEuiccDataRequestHexStr, "91", "00", "6A80");
60	
61	
62	RecoverCard();
63}
64
-cas 盲生成TC_eUICC_ES10c_GetEID/Import/TC_eUICC_ES10c_GetEID.js119 行 / 7952 字符 / gb18030入口函数 @L13
1// Author: 卡思Cas智能体
2// Date: 20260906-184033
3// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10c.GetEID,Test Sequence #01 Nominal + #02 Error,适用性 M。
4// Test points: S1-C1 ATR_present;S2-C1 FCP_Template;S2-C2 FCP tag 62;S2-C3 SW;S3-C1 SW
5//   S4-C2 final SW;S5-C1 SW;S5-C2 CHANNEL_NUMBER extracted;S6-C1 SW;S7-C1 SW;S7-C4 eidValue
6//   S7-C4 eidValue length;S7-C3 EID object 5A10;S7-C2 outer tag BF3E;S8-C1 ATR_present
7//   S9-C1 FCP_Template;S9-C2 FCP tag 62;S9-C3 SW;S10-C1 SW;S11-C2 final SW;S12-C1 SW
8//   S12-C2 CHANNEL_NUMBER extracted;S13-C1 SW;S14-C1 SW != 9000;S14-C2 response data absent
9//   S14-C3 response data absent
10// 本函数由 CaseIR 4.2.25.2.1 编译生成(regen-421,SGP.23 v1.16 × SGP.22 v2.7):字节权威=CaseIR,非誊录黄金脚本。
11// Value-free template: every data byte is injected from CaseIR fields; no scaffold globals (see docs/speconly/compile-symbol-migration.md).
12// 适用性 M:编译期门,运行时由 harness 环境前置承担。
13function TC_eUICC_ES10c_GetEID_01_Nominal_02_Error() {
14    var bind = curBind;
15    // IC1 PROC_EUICC_INITIALIZATION_SEQUENCE: declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
16    // IC2 PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR: declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
17
18    // 步骤 1:RESET(procedure_expansion)
19    var s1 = bind.resetAndAtr();
20    bind.checkData("S1-C1 ATR_present", "1", s1.atr_hex !== "" ? "1" : "0");
21
22    // 步骤 2:SELECT_MF(procedure_expansion)
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 s2 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
25    bind.checkData("S2-C1 FCP_Template", "1", s2.resp.length > 0 ? "1" : "0");
26    bind.checkData("S2-C2 FCP tag 62", "62", s2.resp.substring(0, 2));
27    bind.checkData("S2-C3 SW", "9000", s2.sw);
28
29    // 步骤 3:TERMINAL_CAPABILITY_LPAd(procedure_expansion)
30    var s3 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
31    bind.checkData("S3-C1 SW", "9000", s3.sw);
32
33    // 步骤 4:TERMINAL_PROFILE(procedure_expansion)
34    var steady4 = bind.runToSteadyState(function () {
35        return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000/91XX");
36    });
37    bind.checkData("S4-C2 final SW", "9000", steady4.final.sw);
38    // S4-C1: 'interim_SW' structurally guaranteed by runToSteadyState (binding layer unit 4, chaining rule).
39    // S4-C1: 'fetch_issued' structurally guaranteed by runToSteadyState (binding layer unit 4, chaining rule).
40    // S4-C1: 'terminal_response' structurally guaranteed by runToSteadyState (binding layer unit 4, chaining rule).
41    // S4-C1: binding:runToSteadyState_structural(chaining-rule) (check_attestation)
42
43    // 步骤 5:MANAGE_CHANNEL_OPEN(procedure_expansion)
44    // CHANNEL_NUMBER extraction and dynamic CLA rebinding are CasBind internal state (chaining rule; no generated-code re-implementation).
45    var s5 = bind.manageChannelOpen("9000");
46    bind.checkData("S5-C1 SW", "9000", s5.sw);
47    bind.checkData("S5-C2 CHANNEL_NUMBER extracted", "1", s5.chan !== null ? "1" : "0");
48
49    // 步骤 6:MTD_SELECT(procedure_expansion)
50    // CLA = bound channel (cla_rule) and <L> length binding are CasBind internal state (chaining rule; no generated-code re-implementation).
51    var s6 = bind.sendApdu(null, "A4", "04", "00", "A0000005591010FFFFFFFF8900000100", "00", "9000");
52    // 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.
53    bind.checkData("S6-C1 SW", "9000", s6.sw);
54
55    // 步骤 7:MTD_STORE_DATA(tc_step;REQ: RQ33_002, RQ57_171, RQ57_172)
56    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
57    var sdCla7 = s5.chan !== null ? (s5.chan <= 3 ? 128 + s5.chan : 188 + s5.chan).toString(16).toUpperCase() : null;
58    var s7 = bind.sendApdu(sdCla7, "E2", "91", "00", "BF3E035C015A", "00", "9000");
59    bind.checkData("S7-C1 SW", "9000", s7.sw);
60    var eidExp7 = "89049032123451234512345678901235";
61    var eidLen7 = null, eidVal7 = "absent";
62    for (var i7 = 0; i7 + 4 <= s7.resp.length; i7 += 2) {
63        if (s7.resp.substring(i7, i7 + 2) === "5A") {
64            eidLen7 = s7.resp.substring(i7 + 2, i7 + 4);
65            eidVal7 = s7.resp.substring(i7 + 4, i7 + 4 + eidExp7.length);
66            break;
67        }
68    }
69    bind.checkData("S7-C4 eidValue", "89049032123451234512345678901235", eidVal7);
70    bind.checkData("S7-C4 eidValue length", "10", eidLen7 === null ? "absent" : eidLen7);
71    bind.checkData("S7-C3 EID object 5A10", "1", s7.resp.indexOf("5A10") >= 0 ? "1" : "0");
72    bind.checkData("S7-C2 outer tag BF3E", "BF3E", s7.resp.substring(0, 4));
73
74    // 步骤 8:RESET(procedure_expansion)
75    var s8 = bind.resetAndAtr();
76    bind.checkData("S8-C1 ATR_present", "1", s8.atr_hex !== "" ? "1" : "0");
77
78    // 步骤 9:SELECT_MF(procedure_expansion)
79    // FCP outer tag not materialized from clause: tag-face asserted only when corpus fixes the tag byte (e.g. TS 102 221 FCP '62').
80    var s9 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
81    bind.checkData("S9-C1 FCP_Template", "1", s9.resp.length > 0 ? "1" : "0");
82    bind.checkData("S9-C2 FCP tag 62", "62", s9.resp.substring(0, 2));
83    bind.checkData("S9-C3 SW", "9000", s9.sw);
84
85    // 步骤 10:TERMINAL_CAPABILITY_LPAd(procedure_expansion)
86    var s10 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
87    bind.checkData("S10-C1 SW", "9000", s10.sw);
88
89    // 步骤 11:TERMINAL_PROFILE(procedure_expansion)
90    var steady11 = bind.runToSteadyState(function () {
91        return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000/91XX");
92    });
93    bind.checkData("S11-C2 final SW", "9000", steady11.final.sw);
94    // S11-C1: 'interim_SW' structurally guaranteed by runToSteadyState (binding layer unit 4, chaining rule).
95    // S11-C1: 'fetch_issued' structurally guaranteed by runToSteadyState (binding layer unit 4, chaining rule).
96    // S11-C1: 'terminal_response' structurally guaranteed by runToSteadyState (binding layer unit 4, chaining rule).
97    // S11-C1: binding:runToSteadyState_structural(chaining-rule) (check_attestation)
98
99    // 步骤 12:MANAGE_CHANNEL_OPEN(procedure_expansion)
100    // CHANNEL_NUMBER extraction and dynamic CLA rebinding are CasBind internal state (chaining rule; no generated-code re-implementation).
101    var s12 = bind.manageChannelOpen("9000");
102    bind.checkData("S12-C1 SW", "9000", s12.sw);
103    bind.checkData("S12-C2 CHANNEL_NUMBER extracted", "1", s12.chan !== null ? "1" : "0");
104
105    // 步骤 13:MTD_SELECT(procedure_expansion)
106    // CLA = bound channel (cla_rule) and <L> length binding are CasBind internal state (chaining rule; no generated-code re-implementation).
107    var s13 = bind.sendApdu(null, "A4", "04", "00", "A0000005591010FFFFFFFF8900000100", "00", "9000");
108    // 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.
109    bind.checkData("S13-C1 SW", "9000", s13.sw);
110
111    // 步骤 14:MTD_STORE_DATA(tc_step;REQ: RQ33_002, RQ57_172_1)
112    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
113    var sdCla14 = s12.chan !== null ? (s12.chan <= 3 ? 128 + s12.chan : 188 + s12.chan).toString(16).toUpperCase() : null;
114    var s14 = bind.sendApdu(sdCla14, "E2", "91", "00", "BF3E035C016B", "00", null);
115    bind.checkData("S14-C1 SW != 9000", "1", s14.sw !== "9000" ? "1" : "0");
116    bind.checkData("S14-C2 response data absent", "1", s14.resp === "" ? "1" : "0");
117    bind.checkData("S14-C3 response data absent", "1", s14.resp === "" ? "1" : "0");
118}
119

完整 unified diff

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

展开 diff(182 行)
--- -man
+++ -cas
@@ -1,64 +1,119 @@
-// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10c_GetEID_01_Nominal + TC_eUICC_ES10c_GetEID_02_Error (extracted verbatim)
+// Author: 卡思Cas智能体
+// Date: 20260906-184033
+// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10c.GetEID,Test Sequence #01 Nominal + #02 Error,适用性 M。
+// Test points: S1-C1 ATR_present;S2-C1 FCP_Template;S2-C2 FCP tag 62;S2-C3 SW;S3-C1 SW
+//   S4-C2 final SW;S5-C1 SW;S5-C2 CHANNEL_NUMBER extracted;S6-C1 SW;S7-C1 SW;S7-C4 eidValue
+//   S7-C4 eidValue length;S7-C3 EID object 5A10;S7-C2 outer tag BF3E;S8-C1 ATR_present
+//   S9-C1 FCP_Template;S9-C2 FCP tag 62;S9-C3 SW;S10-C1 SW;S11-C2 final SW;S12-C1 SW
+//   S12-C2 CHANNEL_NUMBER extracted;S13-C1 SW;S14-C1 SW != 9000;S14-C2 response data absent
+//   S14-C3 response data absent
+// 本函数由 CaseIR 4.2.25.2.1 编译生成(regen-421,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_ES10c_GetEID_01_Nominal_02_Error() {
+    var bind = curBind;
+    // IC1 PROC_EUICC_INITIALIZATION_SEQUENCE: declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
+    // IC2 PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR: declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
 
-function TC_eUICC_ES10c_GetEID_01_Nominal()
-{
-	tracenamestr = "测试目的:获取EID正确性测试";
-	curDis.TraceStart(sno++,tracenamestr);
-	
-	curLogicChannel = 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命令,GET_EID");
-	var getEuiccDataRequest = new GetEuiccDataRequest();
-	getEuiccDataRequest.tagList = "5A";
-	var getEuiccDataRequestHexStr = getEuiccDataRequest.GenHexData();
-	var hexData = LPAd_Transport_data_to_eUICC(getEuiccDataRequestHexStr);
-	
-	var getEuiccDataResponse = new GetEuiccDataResponse();
-	
-	getEuiccDataResponse.checkCardResDataFormat(hexData);
-	
-	var eidValue = getEuiccDataResponse.eidValue;
-	
-	curStrHandle.CheckData(EID1, eidValue, "eidValue");
-	
-	
-	RecoverCard();
-}
+    // 步骤 1:RESET(procedure_expansion)
+    var s1 = bind.resetAndAtr();
+    bind.checkData("S1-C1 ATR_present", "1", s1.atr_hex !== "" ? "1" : "0");
 
-function TC_eUICC_ES10c_GetEID_02_Error()
-{
-	tracenamestr = "测试目的:tagList非法,获取EID";
-	curDis.TraceStart(sno++,tracenamestr);
-	
-	curLogicChannel = 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命令,GET_EID,命令数据为错误的tagList");
-	var getEuiccDataRequest = new GetEuiccDataRequest();
-	getEuiccDataRequest.tagList = "6B";
-	var getEuiccDataRequestHexStr = getEuiccDataRequest.GenHexData();
-	LPAd_Transport_data_to_eUICC(getEuiccDataRequestHexStr, "91", "00", "6A80");
-	
-	
-	RecoverCard();
+    // 步骤 2:SELECT_MF(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-C1 FCP_Template", "1", s2.resp.length > 0 ? "1" : "0");
+    bind.checkData("S2-C2 FCP tag 62", "62", s2.resp.substring(0, 2));
+    bind.checkData("S2-C3 SW", "9000", s2.sw);
+
+    // 步骤 3:TERMINAL_CAPABILITY_LPAd(procedure_expansion)
+    var s3 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
+    bind.checkData("S3-C1 SW", "9000", s3.sw);
+
+    // 步骤 4:TERMINAL_PROFILE(procedure_expansion)
+    var steady4 = bind.runToSteadyState(function () {
+        return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000/91XX");
+    });
+    bind.checkData("S4-C2 final SW", "9000", steady4.final.sw);
+    // S4-C1: 'interim_SW' structurally guaranteed by runToSteadyState (binding layer unit 4, chaining rule).
+    // S4-C1: 'fetch_issued' structurally guaranteed by runToSteadyState (binding layer unit 4, chaining rule).
+    // S4-C1: 'terminal_response' structurally guaranteed by runToSteadyState (binding layer unit 4, chaining rule).
+    // S4-C1: binding:runToSteadyState_structural(chaining-rule) (check_attestation)
+
+    // 步骤 5:MANAGE_CHANNEL_OPEN(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: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:MTD_STORE_DATA(tc_step;REQ: RQ33_002, RQ57_171, RQ57_172)
+    // <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", "BF3E035C015A", "00", "9000");
+    bind.checkData("S7-C1 SW", "9000", s7.sw);
+    var eidExp7 = "89049032123451234512345678901235";
+    var eidLen7 = null, eidVal7 = "absent";
+    for (var i7 = 0; i7 + 4 <= s7.resp.length; i7 += 2) {
+        if (s7.resp.substring(i7, i7 + 2) === "5A") {
+            eidLen7 = s7.resp.substring(i7 + 2, i7 + 4);
+            eidVal7 = s7.resp.substring(i7 + 4, i7 + 4 + eidExp7.length);
+            break;
+        }
+    }
+    bind.checkData("S7-C4 eidValue", "89049032123451234512345678901235", eidVal7);
+    bind.checkData("S7-C4 eidValue length", "10", eidLen7 === null ? "absent" : eidLen7);
+    bind.checkData("S7-C3 EID object 5A10", "1", s7.resp.indexOf("5A10") >= 0 ? "1" : "0");
+    bind.checkData("S7-C2 outer tag BF3E", "BF3E", s7.resp.substring(0, 4));
+
+    // 步骤 8:RESET(procedure_expansion)
+    var s8 = bind.resetAndAtr();
+    bind.checkData("S8-C1 ATR_present", "1", s8.atr_hex !== "" ? "1" : "0");
+
+    // 步骤 9:SELECT_MF(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 s9 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
+    bind.checkData("S9-C1 FCP_Template", "1", s9.resp.length > 0 ? "1" : "0");
+    bind.checkData("S9-C2 FCP tag 62", "62", s9.resp.substring(0, 2));
+    bind.checkData("S9-C3 SW", "9000", s9.sw);
+
+    // 步骤 10:TERMINAL_CAPABILITY_LPAd(procedure_expansion)
+    var s10 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
+    bind.checkData("S10-C1 SW", "9000", s10.sw);
+
+    // 步骤 11:TERMINAL_PROFILE(procedure_expansion)
+    var steady11 = bind.runToSteadyState(function () {
+        return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000/91XX");
+    });
+    bind.checkData("S11-C2 final SW", "9000", steady11.final.sw);
+    // S11-C1: 'interim_SW' structurally guaranteed by runToSteadyState (binding layer unit 4, chaining rule).
+    // S11-C1: 'fetch_issued' structurally guaranteed by runToSteadyState (binding layer unit 4, chaining rule).
+    // S11-C1: 'terminal_response' structurally guaranteed by runToSteadyState (binding layer unit 4, chaining rule).
+    // S11-C1: binding:runToSteadyState_structural(chaining-rule) (check_attestation)
+
+    // 步骤 12:MANAGE_CHANNEL_OPEN(procedure_expansion)
+    // CHANNEL_NUMBER extraction and dynamic CLA rebinding are CasBind internal state (chaining rule; no generated-code re-implementation).
+    var s12 = bind.manageChannelOpen("9000");
+    bind.checkData("S12-C1 SW", "9000", s12.sw);
+    bind.checkData("S12-C2 CHANNEL_NUMBER extracted", "1", s12.chan !== null ? "1" : "0");
+
+    // 步骤 13: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 s13 = 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("S13-C1 SW", "9000", s13.sw);
+
+    // 步骤 14:MTD_STORE_DATA(tc_step;REQ: RQ33_002, RQ57_172_1)
+    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
+    var sdCla14 = s12.chan !== null ? (s12.chan <= 3 ? 128 + s12.chan : 188 + s12.chan).toString(16).toUpperCase() : null;
+    var s14 = bind.sendApdu(sdCla14, "E2", "91", "00", "BF3E035C016B", "00", null);
+    bind.checkData("S14-C1 SW != 9000", "1", s14.sw !== "9000" ? "1" : "0");
+    bind.checkData("S14-C2 response data absent", "1", s14.resp === "" ? "1" : "0");
+    bind.checkData("S14-C3 response data absent", "1", s14.resp === "" ? "1" : "0");
 }