eSIM RSP 测试用例对比站

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

源码对照:4.2.1.2.1

ATR 与 ISD-R 选择 / TC_eUICC_ATR_And_ISDR_Selection

左侧为人工切片入口(-man,来自 原料/切片 的最小可执行脚本),右侧为 Cas 盲生成入口(-cas,仅依据规范生成)。文件按原始编码(多为 GBK)解码为 UTF-8 显示,行号自 1 起;字节级原文与 sha256 见两侧脚本包。完整 unified diff 见本页底部折叠区,以及 报告原文 §4。
-man 入口
Import/TestCase_SGP_23.js
44 行 / 1323 字符 / gb18030
-cas 入口
TC_eUICC_ATR_And_ISDR_Selection/Import/TC_eUICC_ATR_And_ISDR_Selection.js
72 行 / 5538 字符 / gb18030
默认折行显示长行;取消勾选可横向滚动查看原始行宽
-man 人工切片Import/TestCase_SGP_23.js44 行 / 1323 字符 / gb18030入口函数 @L3
1// slice of Import\TestCase_SGP_23.js — single case: TC_eUICC_ATR_And_ISDR_Selection_01_Nominal_ATR_and_Select_ISD_R
2
3function TC_eUICC_ATR_And_ISDR_Selection_01_Nominal_ATR_and_Select_ISD_R()
4{
5
6	
7	//测试入口条件
8	if(!check_Applicability_of_tests_RSP_SGP23_test("C006"))
9		return;
10	
11	tracenamestr = "正常测试:检查ATR 并选择ISD-R";
12	curDis.TraceStart(sno++,tracenamestr);
13
14	curDis.TestStepStart2(stno++,"复位;");
15	var curRST = ResetCard();
16	
17	obj.SubLevel("curRST = " + curRST,1);
18	var atrObj = new ATR_Obj(curRST);
19	if (atrObj.supportEUICC)
20		obj.SubLevel("ATR指示卡片支持EUICC!",1);
21	else
22		obj.SubLevel("ATR指示卡片不支持EUICC!",0);
23	
24	curDis.TestStepStart2(stno++,"选择MF;");
25	var para1 = new SelectFileMFPara_3G();
26	SendAPDU(para1.apdu);
27	
28	curDis.TestStepStart2(stno++,"读卡器向卡片发送Terminal Capability命令;");
29	TS_TERMINAL_CAPABILITY_cmd();
30	
31	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
32	TS_MANAGE_CHANNEL_OPEN();
33	
34	curLogicChannel = 1;
35	
36	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
37	var sres = TS_SELECT("Select ISD",ISD_R_AID,"9000");
38	var ResponseDataPar = new check_ISDRResponseData(sres);
39	curStrHandle.CheckData(ISD_R_AID,ResponseDataPar.ISD_R_AID,"ISD_R_AID");
40	curStrHandle.CheckData(RSP_SVN_H,ResponseDataPar.ISDRProprietaryApplicationTemplate.svn,"svn");
41	
42}
43
44
-cas 盲生成TC_eUICC_ATR_And_ISDR_Selection/Import/TC_eUICC_ATR_And_ISDR_Selection.js72 行 / 5538 字符 / gb18030入口函数 @L14
1// Author: 卡思Cas智能体
2// Date: 20260902-172111
3// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ATR_And_ISDR_Selection,Test Sequence #01 Nominal: ATR and Select ISD-R,适用性 C006。
4// Test points: S1-C1 ATR_present;S1-C1 T15_present;S1-C1 first_tB_after_T15
5//   S1-C2 first_tB_after_T15;S1-C2 tB_b2;S2-C1 FCP_Template;S2-C2 SW;S3-C1 SW;S3-C2 request data
6//   S3-C3 eUICC_TLV_tag 83;S4-C1 final SW;S5-C1 FETCH Le;S6-C1 TERMINAL RESPONSE
7//   S4-C3 ongoing_proactive_commands;S7-C1 SW;S7-C2 CHANNEL_NUMBER extracted
8//   S7-C3 CHANNEL_NUMBER extracted;S8-C1 outer tag 6F;S8-C2 tag 84 value;S8-C3 A5 present
9//   S8-C4 ISDR E0 present;S8-C4 ISDR svn member (82 03);S8-C5 SW
10//   S8-C6 ISDR svn-only (lpaeSupport absent)
11// 本函数由 CaseIR 4.2.1.2.1 编译生成(SPECONLY-421-R1,SGP.23 v1.16 × SGP.22 v2.7):字节权威=CaseIR,非誊录黄金脚本。
12// Value-free template: every data byte is injected from CaseIR fields; no scaffold globals (see docs/speconly/compile-symbol-migration.md).
13// 适用性 C006:编译期门,运行时由 harness 环境前置承担。
14function TC_eUICC_ATR_And_ISDR_Selection_01_Nominal_ATR_and_Select_ISD_R() {
15    var bind = curBind;
16
17    // 步骤 1:RESET(tc_step;REQ: RQ34_001)
18    var s1 = bind.resetAndAtr();
19    bind.checkData("S1-C1 ATR_present", "1", s1.atr_hex !== "" ? "1" : "0");
20    bind.checkData("S1-C1 T15_present", "present", s1.atr_parse.t15_round !== null ? "present" : "absent");
21    bind.checkData("S1-C1 first_tB_after_T15", "present", s1.atr_parse.first_tbi_after_t15 !== null ? "present" : "absent");
22    bind.checkData("S1-C2 first_tB_after_T15", "present", s1.atr_parse.first_tbi_after_t15 !== null ? "present" : "absent");
23    bind.checkData("S1-C2 tB_b2", "1", s1.atr_parse.euicc_b2.present ? String(s1.atr_parse.euicc_b2.b2) : "absent:" + s1.atr_parse.euicc_b2.reason);
24
25    // 步骤 2:SELECT_MF(tc_step)
26    // FCP outer tag not materialized from clause: tag-face asserted only when corpus fixes the tag byte (e.g. TS 102 221 FCP '62').
27    var s2 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
28    bind.checkData("S2-C1 FCP_Template", "1", s2.resp.length > 0 ? "1" : "0");
29    bind.checkData("S2-C2 SW", "9000", s2.sw);
30
31    // 步骤 3:TERMINAL_CAPABILITY_LPAd(tc_step)
32    var s3 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
33    bind.checkData("S3-C1 SW", "9000", s3.sw);
34    bind.checkData("S3-C2 request data", "A9058100830107", s3.cmd.substring(10));
35    bind.checkData("S3-C3 eUICC_TLV_tag 83", "present", s3.cmd.indexOf("83") >= 0 ? "present" : "absent");
36
37    // 步骤 4:TERMINAL_PROFILE(tc_step);折叠 procedure_expansion 步骤 5, 6(经 runToSteadyState)
38    var steady4 = bind.runToSteadyState(function () {
39        return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000/91XX");
40    });
41    bind.checkData("S4-C1 final SW", "9000", steady4.final.sw);
42    for (var i4 = 0; i4 < steady4.iterations.length; i4++) {
43        bind.checkData("S5-C1 FETCH Le", steady4.iterations[i4].trigger_sw.substring(2, 4), steady4.iterations[i4].fetch_le);
44        bind.checkData("S6-C1 TERMINAL RESPONSE", "sent", steady4.iterations[i4].tr_sw ? "sent" : "absent");
45    }
46    bind.checkData("S4-C3 ongoing_proactive_commands", "0/1", String(steady4.max_in_flight));
47    // S4-C2: 'interim_SW' structurally guaranteed by runToSteadyState (binding layer unit 4, chaining rule).
48    // S4-C2: 'fetch_issued' structurally guaranteed by runToSteadyState (binding layer unit 4, chaining rule).
49    // S4-C2: binding:runToSteadyState_structural(chaining-rule) (check_attestation)
50    // S6-C2: binding:buildTrData_result_830100(golden-line) (check_attestation)
51
52    // 步骤 7:MANAGE_CHANNEL_OPEN(tc_step;REQ: RQ57_001)
53    // CHANNEL_NUMBER extraction and dynamic CLA rebinding are CasBind internal state (chaining rule; no generated-code re-implementation).
54    var s7 = bind.manageChannelOpen("9000");
55    bind.checkData("S7-C1 SW", "9000", s7.sw);
56    bind.checkData("S7-C2 CHANNEL_NUMBER extracted", "1", s7.chan !== null ? "1" : "0");
57    bind.checkData("S7-C3 CHANNEL_NUMBER extracted", "1", s7.chan !== null ? "1" : "0");
58
59    // 步骤 8:MTD_SELECT(tc_step;REQ: RQ57_003, RQ57_005, RQD0_001)
60    // CLA = bound channel (cla_rule) and <L> length binding are CasBind internal state (chaining rule; no generated-code re-implementation).
61    var s8 = bind.sendApdu(null, "A4", "04", "00", "A0000005591010FFFFFFFF8900000100", "00", "9000");
62    var fci8 = CasBind.parseSelectResponse(s8.resp, { outer: "6F", required: ["84", "A5"] });
63    bind.checkData("S8-C1 outer tag 6F", "present", fci8.tags["6F"] ? "present" : "absent");
64    bind.checkData("S8-C2 tag 84 value", "A0000005591010FFFFFFFF8900000100", (fci8.inner_tags && fci8.inner_tags["84"]) ? fci8.inner_tags["84"].value : "absent");
65    bind.checkData("S8-C3 A5 present", "present", (fci8.inner_tags && fci8.inner_tags["A5"]) ? "present" : "absent");
66    var isdrE08 = (fci8.inner_tags && fci8.inner_tags["E0"]) ? fci8.inner_tags["E0"].value : "";
67    bind.checkData("S8-C4 ISDR E0 present", "present", isdrE08 !== "" ? "present" : "absent");
68    bind.checkData("S8-C4 ISDR svn member (82 03)", "present", (isdrE08.length >= 10 && isdrE08.substring(0, 2) === "82" && isdrE08.substring(2, 4) === "03") ? "present" : "absent");
69    bind.checkData("S8-C5 SW", "9000", s8.sw);
70    bind.checkData("S8-C6 ISDR svn-only (lpaeSupport absent)", "1", (isdrE08.length === 10 && isdrE08.substring(0, 2) === "82" && isdrE08.substring(2, 4) === "03") ? "1" : "0");
71}
72

完整 unified diff

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

展开 diff(114 行)
--- -man
+++ -cas
@@ -1,44 +1,72 @@
-// slice of Import\TestCase_SGP_23.js — single case: TC_eUICC_ATR_And_ISDR_Selection_01_Nominal_ATR_and_Select_ISD_R
+// Author: 卡思Cas智能体
+// Date: 20260902-172111
+// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ATR_And_ISDR_Selection,Test Sequence #01 Nominal: ATR and Select ISD-R,适用性 C006。
+// Test points: S1-C1 ATR_present;S1-C1 T15_present;S1-C1 first_tB_after_T15
+//   S1-C2 first_tB_after_T15;S1-C2 tB_b2;S2-C1 FCP_Template;S2-C2 SW;S3-C1 SW;S3-C2 request data
+//   S3-C3 eUICC_TLV_tag 83;S4-C1 final SW;S5-C1 FETCH Le;S6-C1 TERMINAL RESPONSE
+//   S4-C3 ongoing_proactive_commands;S7-C1 SW;S7-C2 CHANNEL_NUMBER extracted
+//   S7-C3 CHANNEL_NUMBER extracted;S8-C1 outer tag 6F;S8-C2 tag 84 value;S8-C3 A5 present
+//   S8-C4 ISDR E0 present;S8-C4 ISDR svn member (82 03);S8-C5 SW
+//   S8-C6 ISDR svn-only (lpaeSupport absent)
+// 本函数由 CaseIR 4.2.1.2.1 编译生成(SPECONLY-421-R1,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).
+// 适用性 C006:编译期门,运行时由 harness 环境前置承担。
+function TC_eUICC_ATR_And_ISDR_Selection_01_Nominal_ATR_and_Select_ISD_R() {
+    var bind = curBind;
 
-function TC_eUICC_ATR_And_ISDR_Selection_01_Nominal_ATR_and_Select_ISD_R()
-{
+    // 步骤 1:RESET(tc_step;REQ: RQ34_001)
+    var s1 = bind.resetAndAtr();
+    bind.checkData("S1-C1 ATR_present", "1", s1.atr_hex !== "" ? "1" : "0");
+    bind.checkData("S1-C1 T15_present", "present", s1.atr_parse.t15_round !== null ? "present" : "absent");
+    bind.checkData("S1-C1 first_tB_after_T15", "present", s1.atr_parse.first_tbi_after_t15 !== null ? "present" : "absent");
+    bind.checkData("S1-C2 first_tB_after_T15", "present", s1.atr_parse.first_tbi_after_t15 !== null ? "present" : "absent");
+    bind.checkData("S1-C2 tB_b2", "1", s1.atr_parse.euicc_b2.present ? String(s1.atr_parse.euicc_b2.b2) : "absent:" + s1.atr_parse.euicc_b2.reason);
 
-	
-	//测试入口条件
-	if(!check_Applicability_of_tests_RSP_SGP23_test("C006"))
-		return;
-	
-	tracenamestr = "正常测试:检查ATR 并选择ISD-R";
-	curDis.TraceStart(sno++,tracenamestr);
+    // 步骤 2:SELECT_MF(tc_step)
+    // 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 SW", "9000", s2.sw);
 
-	curDis.TestStepStart2(stno++,"复位;");
-	var curRST = ResetCard();
-	
-	obj.SubLevel("curRST = " + curRST,1);
-	var atrObj = new ATR_Obj(curRST);
-	if (atrObj.supportEUICC)
-		obj.SubLevel("ATR指示卡片支持EUICC!",1);
-	else
-		obj.SubLevel("ATR指示卡片不支持EUICC!",0);
-	
-	curDis.TestStepStart2(stno++,"选择MF;");
-	var para1 = new SelectFileMFPara_3G();
-	SendAPDU(para1.apdu);
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送Terminal Capability命令;");
-	TS_TERMINAL_CAPABILITY_cmd();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
-	TS_MANAGE_CHANNEL_OPEN();
-	
-	curLogicChannel = 1;
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
-	var sres = TS_SELECT("Select ISD",ISD_R_AID,"9000");
-	var ResponseDataPar = new check_ISDRResponseData(sres);
-	curStrHandle.CheckData(ISD_R_AID,ResponseDataPar.ISD_R_AID,"ISD_R_AID");
-	curStrHandle.CheckData(RSP_SVN_H,ResponseDataPar.ISDRProprietaryApplicationTemplate.svn,"svn");
-	
+    // 步骤 3:TERMINAL_CAPABILITY_LPAd(tc_step)
+    var s3 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
+    bind.checkData("S3-C1 SW", "9000", s3.sw);
+    bind.checkData("S3-C2 request data", "A9058100830107", s3.cmd.substring(10));
+    bind.checkData("S3-C3 eUICC_TLV_tag 83", "present", s3.cmd.indexOf("83") >= 0 ? "present" : "absent");
+
+    // 步骤 4:TERMINAL_PROFILE(tc_step);折叠 procedure_expansion 步骤 5, 6(经 runToSteadyState)
+    var steady4 = bind.runToSteadyState(function () {
+        return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000/91XX");
+    });
+    bind.checkData("S4-C1 final SW", "9000", steady4.final.sw);
+    for (var i4 = 0; i4 < steady4.iterations.length; i4++) {
+        bind.checkData("S5-C1 FETCH Le", steady4.iterations[i4].trigger_sw.substring(2, 4), steady4.iterations[i4].fetch_le);
+        bind.checkData("S6-C1 TERMINAL RESPONSE", "sent", steady4.iterations[i4].tr_sw ? "sent" : "absent");
+    }
+    bind.checkData("S4-C3 ongoing_proactive_commands", "0/1", String(steady4.max_in_flight));
+    // S4-C2: 'interim_SW' structurally guaranteed by runToSteadyState (binding layer unit 4, chaining rule).
+    // S4-C2: 'fetch_issued' structurally guaranteed by runToSteadyState (binding layer unit 4, chaining rule).
+    // S4-C2: binding:runToSteadyState_structural(chaining-rule) (check_attestation)
+    // S6-C2: binding:buildTrData_result_830100(golden-line) (check_attestation)
+
+    // 步骤 7:MANAGE_CHANNEL_OPEN(tc_step;REQ: RQ57_001)
+    // 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("S7-C1 SW", "9000", s7.sw);
+    bind.checkData("S7-C2 CHANNEL_NUMBER extracted", "1", s7.chan !== null ? "1" : "0");
+    bind.checkData("S7-C3 CHANNEL_NUMBER extracted", "1", s7.chan !== null ? "1" : "0");
+
+    // 步骤 8:MTD_SELECT(tc_step;REQ: RQ57_003, RQ57_005, RQD0_001)
+    // 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", "00", "9000");
+    var fci8 = CasBind.parseSelectResponse(s8.resp, { outer: "6F", required: ["84", "A5"] });
+    bind.checkData("S8-C1 outer tag 6F", "present", fci8.tags["6F"] ? "present" : "absent");
+    bind.checkData("S8-C2 tag 84 value", "A0000005591010FFFFFFFF8900000100", (fci8.inner_tags && fci8.inner_tags["84"]) ? fci8.inner_tags["84"].value : "absent");
+    bind.checkData("S8-C3 A5 present", "present", (fci8.inner_tags && fci8.inner_tags["A5"]) ? "present" : "absent");
+    var isdrE08 = (fci8.inner_tags && fci8.inner_tags["E0"]) ? fci8.inner_tags["E0"].value : "";
+    bind.checkData("S8-C4 ISDR E0 present", "present", isdrE08 !== "" ? "present" : "absent");
+    bind.checkData("S8-C4 ISDR svn member (82 03)", "present", (isdrE08.length >= 10 && isdrE08.substring(0, 2) === "82" && isdrE08.substring(2, 4) === "03") ? "present" : "absent");
+    bind.checkData("S8-C5 SW", "9000", s8.sw);
+    bind.checkData("S8-C6 ISDR svn-only (lpaeSupport absent)", "1", (isdrE08.length === 10 && isdrE08.substring(0, 2) === "82" && isdrE08.substring(2, 4) === "03") ? "1" : "0");
 }
-