eSIM RSP 测试用例对比站

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

源码对照:4.2.27.2.1

ES10b 获取 RAT / TC_eUICC_ES10b.GetRAT

左侧为人工切片入口(-man,来自 原料/切片 的最小可执行脚本),右侧为 Cas 盲生成入口(-cas,仅依据规范生成)。文件按原始编码(多为 GBK)解码为 UTF-8 显示,行号自 1 起;字节级原文与 sha256 见两侧脚本包。完整 unified diff 见本页底部折叠区,以及 报告原文 §4。
-man 入口
Import/TestCase_SGP_23.js
63 行 / 2084 字符 / gb18030
-cas 入口
TC_eUICC_ES10b_GetRAT/Import/TC_eUICC_ES10b_GetRAT.js
97 行 / 8703 字符 / gb18030
默认折行显示长行;取消勾选可横向滚动查看原始行宽
-man 人工切片Import/TestCase_SGP_23.js63 行 / 2084 字符 / gb18030入口函数 @L3
1// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10c_GetRAT_01 + TC_eUICC_ES10c_GetRAT_02_Nominal_With_additional_PPARs (extracted verbatim)
2
3function TC_eUICC_ES10c_GetRAT_01()
4{
5	tracenamestr = "测试目的:验证eUICC可以配置SGP.21 Annex H中定义的RAT";
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_RAT");
21	
22	var respData = LPAd_Transport_data_to_eUICC(GetRatRequestHexStr);
23	curStrHandle.CheckData(R_DEFAULT_RAT, respData, "R_DEFAULT_RAT");
24	
25	
26	RecoverCard();
27}
28
29function TC_eUICC_ES10c_GetRAT_02_Nominal_With_additional_PPARs()
30{
31	tracenamestr = "测试目的:验证eUICC可以配置包含定制规则的RAT";
32	curDis.TraceStart(sno++,tracenamestr);
33	
34	curLogicChannel = 0;
35	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
36	Ini_powerOn_eUICC_LPAe_not_activate();
37	
38	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
39	TS_MANAGE_CHANNEL_OPEN();
40	
41	curLogicChannel = 1;
42	
43	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
44	TS_SELECT("Select ISD",ISD_R_AID,"9000");
45	
46	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,GET_RAT");
47	var respData = LPAd_Transport_data_to_eUICC(GetRatRequestHexStr);
48	curStrHandle.CheckData(R_RAT_WITH_OTHER_RULES, respData, "R_RAT_WITH_OTHER_RULES");
49	
50	initial_condition_Install_PROFILE_OPERATIONAL4();
51	
52	curDis.TestStepStart2(stno++,"删除PROFILE_OPERATIONAL4");
53	var deleProfileRequest = new DeleteProfileRequest();
54	deleProfileRequest.iccid = ICCID_OP_PROF4;
55	deleProfileRequest.GenHexData();
56	var respData = LPAd_Transport_data_to_eUICC(deleProfileRequest.hexData);
57	curStrHandle.CheckData("BF3303800100", respData, "DeleteProfileResponse");
58	
59	initial_condition_Install_PROFILE_OPERATIONAL3();
60	
61	RecoverCard();
62}
63
-cas 盲生成TC_eUICC_ES10b_GetRAT/Import/TC_eUICC_ES10b_GetRAT.js97 行 / 8703 字符 / gb18030入口函数 @L17
1// Author: 卡思Cas智能体
2// Date: 20260928-201725
3// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10b.GetRAT,Test Sequence #01 Nominal: Get Default RAT; #02 Nominal: With additional PPARs,适用性 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 SW;S1-C2 GetRatResponse outer tag;S1-C2 rat member count 1
7//   S1-C2 rat value-order equality;S1-C3 PPRS_ALLOWED DER
8//   S1-C4 RQ57_182 order vacuous (single PPAR);S1-C5 RQ57_181 response well-formed TLV outer BF43
9//   S1-C6 RQ57_180 command data;S2-C1 SW;S2-C2 GetRatResponse outer tag;S2-C2 rat member count 4
10//   S2-C2 rat value-order equality;S2-C3 PPR1_WITH_OWNER_GID DER;S2-C4 PPR1_WITHOUT_GID DER
11//   S2-C5 PPR2_WITHOUT_CONSENT DER;S2-C6 PPRS_ALLOWED DER
12//   S2-C7 RQ57_182 stored order (carried by rat_eq ordered equality);S2-C8 RQ57_180 command data
13//   S2-C9 RQ57_181 response well-formed TLV outer BF43
14// 本函数由 CaseIR 4.2.27.2.1 编译生成(Q3-W0-PILOT,SGP.23 v1.16 × SGP.22 v2.7):字节权威=CaseIR,非誊录黄金脚本。
15// Value-free template: every data byte is injected from CaseIR fields; no scaffold globals (see docs/speconly/compile-symbol-migration.md).
16// 适用性 M:编译期门,运行时由 harness 环境前置承担。
17function TC_eUICC_ES10b_GetRAT_01_02_merged() {
18    var bind = curBind;
19
20    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 1):RESET(K 语料机械展开)
21    var s3 = bind.resetAndAtr();
22    bind.checkData("ICH-IC1-K1-C1 ATR_present", "1", s3.atr_hex !== "" ? "1" : "0");
23
24    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 2):SELECT_MF(K 语料机械展开)
25    // FCP outer tag not materialized from clause: tag-face asserted only when corpus fixes the tag byte (e.g. TS 102 221 FCP '62').
26    var s4 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
27    bind.checkData("ICH-IC1-K2-C2 FCP_Template", "1", s4.resp.length > 0 ? "1" : "0");
28    bind.checkData("ICH-IC1-K2-C4 SW", "9000", s4.sw);
29
30    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 3):TERMINAL_CAPABILITY_LPAd(K 语料机械展开)
31    var s5 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
32    bind.checkData("ICH-IC1-K3-C4 SW", "9000", s5.sw);
33
34    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 4):TERMINAL_PROFILE(K 语料机械展开)
35    var steady6 = bind.runToSteadyState(function () {
36        return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
37    });
38    bind.checkData("ICH-IC1-K4-C4 final SW", "9000", steady6.final.sw);
39
40    // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 1):MANAGE_CHANNEL_OPEN(K 语料机械展开)
41    // CHANNEL_NUMBER extraction and dynamic CLA rebinding are CasBind internal state (chaining rule; no generated-code re-implementation).
42    var s7 = bind.manageChannelOpen("9000");
43    bind.checkData("ICH-IC2-K1-C4 SW", "9000", s7.sw);
44    bind.checkData("ICH-IC2-K1-C3 CHANNEL_NUMBER extracted", "1", s7.chan !== null ? "1" : "0");
45
46    // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 2):MTD_SELECT(K 语料机械展开)
47    // CLA = bound channel (cla_rule) and <L> length binding are CasBind internal state (chaining rule; no generated-code re-implementation).
48    var s8 = bind.sendApdu(null, "A4", "04", "00", "A0000005591010FFFFFFFF8900000100", null, "9000");
49    // 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.
50    bind.checkData("ICH-IC2-K2-C4 SW", "9000", s8.sw);
51
52    // 步骤 1:MTD_STORE_DATA(tc_step;REQ: RQ28_001, RQ29_007_1, RQ29_008, RQ29_009, RQ29_011, RQ29_016, RQ57_179, RQ57_180, RQ57_181, RQ57_182, RQ57_184, RQ57_186, RQ29_007)
53    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
54    var sdCla1 = s7.chan !== null ? (s7.chan <= 3 ? 128 + s7.chan : 188 + s7.chan).toString(16).toUpperCase() : null;
55    var s1 = bind.sendApdu(sdCla1, "E2", "91", "00", "BF4300", "00", "9000");
56    bind.checkData("S1-C1 SW", "9000", s1.sw);
57    // grat ES10b GetRAT 响应面(外层 BF43,S22_tag_table Table 66 + I_annexD3_es10x:179/249;PPAR 成员 DER 定位 = S22_5_7_22_rat + S22_2_4a_1_ppr_operator_ids 语料闭合推导,期望值编译期注入):
58    var rgw1 = BindGecaProc.parseGecaResponse(s1.resp, {outer: "BF43", required: [], optional: []});
59    var rrat1 = (rgw1.children.length === 1) ? BindEs10xSingleRequest.parseBerTlv(rgw1.children[0].value) : [];
60    bind.checkData("S1-C2 GetRatResponse outer tag", "BF43", rgw1.outer_tag === null ? "absent" : rgw1.outer_tag);
61    bind.checkData("S1-C2 rat member count 1", "1", (rgw1.children.length === 1 && rrat1.length === 1) ? "1" : "0");
62    var rratExp1 = ["301503020560300B30090403EEEEEE0400040003020780"];
63    var rratEq1 = (rrat1.length === rratExp1.length);
64    for (var rri1 = 0; rri1 < rrat1.length && rri1 < rratExp1.length; rri1++) {
65        if (BindEs10xSingleRequest.buildTlv(rrat1[rri1].tag, rrat1[rri1].value) !== rratExp1[rri1]) { rratEq1 = false; }
66    }
67    bind.checkData("S1-C2 rat value-order equality", "1", rratEq1 ? "1" : "0");
68    bind.checkData("S1-C3 PPRS_ALLOWED DER", "301503020560300B30090403EEEEEE0400040003020780", rrat1.length > 0 ? BindEs10xSingleRequest.buildTlv(rrat1[0].tag, rrat1[0].value) : "absent");
69    bind.checkData("S1-C4 RQ57_182 order vacuous (single PPAR)", "1", rrat1.length === 1 ? "1" : "0");
70    bind.checkData("S1-C5 RQ57_181 response well-formed TLV outer BF43", "1", rgw1.ok ? "1" : "0");
71    bind.checkData("S1-C6 RQ57_180 command data", "BF4300", s1.cmd.substring(10, 16));
72
73    // 步骤 2:MTD_STORE_DATA(tc_step;REQ: RQ28_001, RQ29_007_1, RQ29_008, RQ29_009, RQ29_010_1, RQ29_011, RQ29_016, RQ57_179, RQ57_180, RQ57_181, RQ57_182, RQ57_184, RQ57_186, RQ29_007, RQ29_008_1)
74    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
75    var sdCla2 = s7.chan !== null ? (s7.chan <= 3 ? 128 + s7.chan : 188 + s7.chan).toString(16).toUpperCase() : null;
76    var s2 = bind.sendApdu(sdCla2, "E2", "91", "00", "BF4300", "00", "9000");
77    bind.checkData("S2-C1 SW", "9000", s2.sw);
78    // grat ES10b GetRAT 响应面(外层 BF43,S22_tag_table Table 66 + I_annexD3_es10x:179/249;PPAR 成员 DER 定位 = S22_5_7_22_rat + S22_2_4a_1_ppr_operator_ids 语料闭合推导,期望值编译期注入):
79    var rgw2 = BindGecaProc.parseGecaResponse(s2.resp, {outer: "BF43", required: [], optional: []});
80    var rrat2 = (rgw2.children.length === 1) ? BindEs10xSingleRequest.parseBerTlv(rgw2.children[0].value) : [];
81    bind.checkData("S2-C2 GetRatResponse outer tag", "BF43", rgw2.outer_tag === null ? "absent" : rgw2.outer_tag);
82    bind.checkData("S2-C2 rat member count 4", "1", (rgw2.children.length === 1 && rrat2.length === 4) ? "1" : "0");
83    var rratExp2 = ["301D0302064030133011040392F928040447534D410404525350FF03020780", "30110302064030073005040392F94803020780", "301403020520300B3009040392EEEE04000400030100", "301503020560300B30090403EEEEEE0400040003020780"];
84    var rratEq2 = (rrat2.length === rratExp2.length);
85    for (var rri2 = 0; rri2 < rrat2.length && rri2 < rratExp2.length; rri2++) {
86        if (BindEs10xSingleRequest.buildTlv(rrat2[rri2].tag, rrat2[rri2].value) !== rratExp2[rri2]) { rratEq2 = false; }
87    }
88    bind.checkData("S2-C2 rat value-order equality", "1", rratEq2 ? "1" : "0");
89    bind.checkData("S2-C3 PPR1_WITH_OWNER_GID DER", "301D0302064030133011040392F928040447534D410404525350FF03020780", rrat2.length > 0 ? BindEs10xSingleRequest.buildTlv(rrat2[0].tag, rrat2[0].value) : "absent");
90    bind.checkData("S2-C4 PPR1_WITHOUT_GID DER", "30110302064030073005040392F94803020780", rrat2.length > 1 ? BindEs10xSingleRequest.buildTlv(rrat2[1].tag, rrat2[1].value) : "absent");
91    bind.checkData("S2-C5 PPR2_WITHOUT_CONSENT DER", "301403020520300B3009040392EEEE04000400030100", rrat2.length > 2 ? BindEs10xSingleRequest.buildTlv(rrat2[2].tag, rrat2[2].value) : "absent");
92    bind.checkData("S2-C6 PPRS_ALLOWED DER", "301503020560300B30090403EEEEEE0400040003020780", rrat2.length > 3 ? BindEs10xSingleRequest.buildTlv(rrat2[3].tag, rrat2[3].value) : "absent");
93    bind.checkData("S2-C7 RQ57_182 stored order (carried by rat_eq ordered equality)", "1", rratEq2 ? "1" : "0");
94    bind.checkData("S2-C8 RQ57_180 command data", "BF4300", s2.cmd.substring(10, 16));
95    bind.checkData("S2-C9 RQ57_181 response well-formed TLV outer BF43", "1", rgw2.ok ? "1" : "0");
96}
97

完整 unified diff

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

展开 diff(159 行)
--- -man
+++ -cas
@@ -1,63 +1,97 @@
-// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10c_GetRAT_01 + TC_eUICC_ES10c_GetRAT_02_Nominal_With_additional_PPARs (extracted verbatim)
+// Author: 卡思Cas智能体
+// Date: 20260928-201725
+// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10b.GetRAT,Test Sequence #01 Nominal: Get Default RAT; #02 Nominal: With additional PPARs,适用性 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 SW;S1-C2 GetRatResponse outer tag;S1-C2 rat member count 1
+//   S1-C2 rat value-order equality;S1-C3 PPRS_ALLOWED DER
+//   S1-C4 RQ57_182 order vacuous (single PPAR);S1-C5 RQ57_181 response well-formed TLV outer BF43
+//   S1-C6 RQ57_180 command data;S2-C1 SW;S2-C2 GetRatResponse outer tag;S2-C2 rat member count 4
+//   S2-C2 rat value-order equality;S2-C3 PPR1_WITH_OWNER_GID DER;S2-C4 PPR1_WITHOUT_GID DER
+//   S2-C5 PPR2_WITHOUT_CONSENT DER;S2-C6 PPRS_ALLOWED DER
+//   S2-C7 RQ57_182 stored order (carried by rat_eq ordered equality);S2-C8 RQ57_180 command data
+//   S2-C9 RQ57_181 response well-formed TLV outer BF43
+// 本函数由 CaseIR 4.2.27.2.1 编译生成(Q3-W0-PILOT,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_GetRAT_01_02_merged() {
+    var bind = curBind;
 
-function TC_eUICC_ES10c_GetRAT_01()
-{
-	tracenamestr = "测试目的:验证eUICC可以配置SGP.21 Annex H中定义的RAT";
-	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_RAT");
-	
-	var respData = LPAd_Transport_data_to_eUICC(GetRatRequestHexStr);
-	curStrHandle.CheckData(R_DEFAULT_RAT, respData, "R_DEFAULT_RAT");
-	
-	
-	RecoverCard();
-}
+    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 1):RESET(K 语料机械展开)
+    var s3 = bind.resetAndAtr();
+    bind.checkData("ICH-IC1-K1-C1 ATR_present", "1", s3.atr_hex !== "" ? "1" : "0");
 
-function TC_eUICC_ES10c_GetRAT_02_Nominal_With_additional_PPARs()
-{
-	tracenamestr = "测试目的:验证eUICC可以配置包含定制规则的RAT";
-	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_RAT");
-	var respData = LPAd_Transport_data_to_eUICC(GetRatRequestHexStr);
-	curStrHandle.CheckData(R_RAT_WITH_OTHER_RULES, respData, "R_RAT_WITH_OTHER_RULES");
-	
-	initial_condition_Install_PROFILE_OPERATIONAL4();
-	
-	curDis.TestStepStart2(stno++,"删除PROFILE_OPERATIONAL4");
-	var deleProfileRequest = new DeleteProfileRequest();
-	deleProfileRequest.iccid = ICCID_OP_PROF4;
-	deleProfileRequest.GenHexData();
-	var respData = LPAd_Transport_data_to_eUICC(deleProfileRequest.hexData);
-	curStrHandle.CheckData("BF3303800100", respData, "DeleteProfileResponse");
-	
-	initial_condition_Install_PROFILE_OPERATIONAL3();
-	
-	RecoverCard();
+    // 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 s4 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
+    bind.checkData("ICH-IC1-K2-C2 FCP_Template", "1", s4.resp.length > 0 ? "1" : "0");
+    bind.checkData("ICH-IC1-K2-C4 SW", "9000", s4.sw);
+
+    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 3):TERMINAL_CAPABILITY_LPAd(K 语料机械展开)
+    var s5 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
+    bind.checkData("ICH-IC1-K3-C4 SW", "9000", s5.sw);
+
+    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 4):TERMINAL_PROFILE(K 语料机械展开)
+    var steady6 = bind.runToSteadyState(function () {
+        return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
+    });
+    bind.checkData("ICH-IC1-K4-C4 final SW", "9000", steady6.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 s7 = bind.manageChannelOpen("9000");
+    bind.checkData("ICH-IC2-K1-C4 SW", "9000", s7.sw);
+    bind.checkData("ICH-IC2-K1-C3 CHANNEL_NUMBER extracted", "1", s7.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 s8 = 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", s8.sw);
+
+    // 步骤 1:MTD_STORE_DATA(tc_step;REQ: RQ28_001, RQ29_007_1, RQ29_008, RQ29_009, RQ29_011, RQ29_016, RQ57_179, RQ57_180, RQ57_181, RQ57_182, RQ57_184, RQ57_186, RQ29_007)
+    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
+    var sdCla1 = s7.chan !== null ? (s7.chan <= 3 ? 128 + s7.chan : 188 + s7.chan).toString(16).toUpperCase() : null;
+    var s1 = bind.sendApdu(sdCla1, "E2", "91", "00", "BF4300", "00", "9000");
+    bind.checkData("S1-C1 SW", "9000", s1.sw);
+    // grat ES10b GetRAT 响应面(外层 BF43,S22_tag_table Table 66 + I_annexD3_es10x:179/249;PPAR 成员 DER 定位 = S22_5_7_22_rat + S22_2_4a_1_ppr_operator_ids 语料闭合推导,期望值编译期注入):
+    var rgw1 = BindGecaProc.parseGecaResponse(s1.resp, {outer: "BF43", required: [], optional: []});
+    var rrat1 = (rgw1.children.length === 1) ? BindEs10xSingleRequest.parseBerTlv(rgw1.children[0].value) : [];
+    bind.checkData("S1-C2 GetRatResponse outer tag", "BF43", rgw1.outer_tag === null ? "absent" : rgw1.outer_tag);
+    bind.checkData("S1-C2 rat member count 1", "1", (rgw1.children.length === 1 && rrat1.length === 1) ? "1" : "0");
+    var rratExp1 = ["301503020560300B30090403EEEEEE0400040003020780"];
+    var rratEq1 = (rrat1.length === rratExp1.length);
+    for (var rri1 = 0; rri1 < rrat1.length && rri1 < rratExp1.length; rri1++) {
+        if (BindEs10xSingleRequest.buildTlv(rrat1[rri1].tag, rrat1[rri1].value) !== rratExp1[rri1]) { rratEq1 = false; }
+    }
+    bind.checkData("S1-C2 rat value-order equality", "1", rratEq1 ? "1" : "0");
+    bind.checkData("S1-C3 PPRS_ALLOWED DER", "301503020560300B30090403EEEEEE0400040003020780", rrat1.length > 0 ? BindEs10xSingleRequest.buildTlv(rrat1[0].tag, rrat1[0].value) : "absent");
+    bind.checkData("S1-C4 RQ57_182 order vacuous (single PPAR)", "1", rrat1.length === 1 ? "1" : "0");
+    bind.checkData("S1-C5 RQ57_181 response well-formed TLV outer BF43", "1", rgw1.ok ? "1" : "0");
+    bind.checkData("S1-C6 RQ57_180 command data", "BF4300", s1.cmd.substring(10, 16));
+
+    // 步骤 2:MTD_STORE_DATA(tc_step;REQ: RQ28_001, RQ29_007_1, RQ29_008, RQ29_009, RQ29_010_1, RQ29_011, RQ29_016, RQ57_179, RQ57_180, RQ57_181, RQ57_182, RQ57_184, RQ57_186, RQ29_007, RQ29_008_1)
+    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
+    var sdCla2 = s7.chan !== null ? (s7.chan <= 3 ? 128 + s7.chan : 188 + s7.chan).toString(16).toUpperCase() : null;
+    var s2 = bind.sendApdu(sdCla2, "E2", "91", "00", "BF4300", "00", "9000");
+    bind.checkData("S2-C1 SW", "9000", s2.sw);
+    // grat ES10b GetRAT 响应面(外层 BF43,S22_tag_table Table 66 + I_annexD3_es10x:179/249;PPAR 成员 DER 定位 = S22_5_7_22_rat + S22_2_4a_1_ppr_operator_ids 语料闭合推导,期望值编译期注入):
+    var rgw2 = BindGecaProc.parseGecaResponse(s2.resp, {outer: "BF43", required: [], optional: []});
+    var rrat2 = (rgw2.children.length === 1) ? BindEs10xSingleRequest.parseBerTlv(rgw2.children[0].value) : [];
+    bind.checkData("S2-C2 GetRatResponse outer tag", "BF43", rgw2.outer_tag === null ? "absent" : rgw2.outer_tag);
+    bind.checkData("S2-C2 rat member count 4", "1", (rgw2.children.length === 1 && rrat2.length === 4) ? "1" : "0");
+    var rratExp2 = ["301D0302064030133011040392F928040447534D410404525350FF03020780", "30110302064030073005040392F94803020780", "301403020520300B3009040392EEEE04000400030100", "301503020560300B30090403EEEEEE0400040003020780"];
+    var rratEq2 = (rrat2.length === rratExp2.length);
+    for (var rri2 = 0; rri2 < rrat2.length && rri2 < rratExp2.length; rri2++) {
+        if (BindEs10xSingleRequest.buildTlv(rrat2[rri2].tag, rrat2[rri2].value) !== rratExp2[rri2]) { rratEq2 = false; }
+    }
+    bind.checkData("S2-C2 rat value-order equality", "1", rratEq2 ? "1" : "0");
+    bind.checkData("S2-C3 PPR1_WITH_OWNER_GID DER", "301D0302064030133011040392F928040447534D410404525350FF03020780", rrat2.length > 0 ? BindEs10xSingleRequest.buildTlv(rrat2[0].tag, rrat2[0].value) : "absent");
+    bind.checkData("S2-C4 PPR1_WITHOUT_GID DER", "30110302064030073005040392F94803020780", rrat2.length > 1 ? BindEs10xSingleRequest.buildTlv(rrat2[1].tag, rrat2[1].value) : "absent");
+    bind.checkData("S2-C5 PPR2_WITHOUT_CONSENT DER", "301403020520300B3009040392EEEE04000400030100", rrat2.length > 2 ? BindEs10xSingleRequest.buildTlv(rrat2[2].tag, rrat2[2].value) : "absent");
+    bind.checkData("S2-C6 PPRS_ALLOWED DER", "301503020560300B30090403EEEEEE0400040003020780", rrat2.length > 3 ? BindEs10xSingleRequest.buildTlv(rrat2[3].tag, rrat2[3].value) : "absent");
+    bind.checkData("S2-C7 RQ57_182 stored order (carried by rat_eq ordered equality)", "1", rratEq2 ? "1" : "0");
+    bind.checkData("S2-C8 RQ57_180 command data", "BF4300", s2.cmd.substring(10, 16));
+    bind.checkData("S2-C9 RQ57_181 response well-formed TLV outer BF43", "1", rgw2.ok ? "1" : "0");
 }