eSIM RSP 测试用例对比站

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

源码对照:4.2.13.2.1

ES10b 获取 eUICCInfo1 / TC_eUICC_ES10b.GetEUICCInfo1

左侧为人工切片入口(-man,来自 原料/切片 的最小可执行脚本),右侧为 Cas 盲生成入口(-cas,仅依据规范生成)。文件按原始编码(多为 GBK)解码为 UTF-8 显示,行号自 1 起;字节级原文与 sha256 见两侧脚本包。完整 unified diff 见本页底部折叠区,以及 报告原文 §4。
-man 入口
Import/TestCase_SGP_23.js
91 行 / 3560 字符 / gb18030
-cas 入口
TC_eUICC_ES10b_GetEUICCInfo1/Import/TC_eUICC_ES10b_GetEUICCInfo1.js
74 行 / 5320 字符 / gb18030
默认折行显示长行;取消勾选可横向滚动查看原始行宽
-man 人工切片Import/TestCase_SGP_23.js91 行 / 3560 字符 / gb18030入口函数 @L3
1// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10b_GetEUICCInfo1_01_Nominal + TC_eUICC_ES10b_GetEUICCInfo1_02_Nominal_GetEUICCInfo_call_after_GetEUICCChallenge (extracted verbatim)
2
3function TC_eUICC_ES10b_GetEUICCInfo1_01_Nominal()
4{
5	
6
7	tracenamestr = "测试目的:获取EUICCInfo1";
8	curDis.TraceStart(sno++,tracenamestr);
9
10	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
11	Ini_powerOn_eUICC_LPAe_not_activate();
12	
13	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
14	TS_MANAGE_CHANNEL_OPEN();
15	
16	curLogicChannel = 1;
17	
18	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
19	TS_SELECT("Select ISD",ISD_R_AID,"9000");
20	
21	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request,获取EUICCInfo1;");
22	var euiccInfo1 = new EUICCInfo1();
23	var hexData = LPAd_Transport_data_to_eUICC(GetEuiccInfo1RequestHexStr);
24	
25	euiccInfo1.checkCardResDataFormat(hexData);
26	
27	try
28	{
29		curStrHandle.CheckData(O_RSP_VERSION, euiccInfo1.svn, "svn");
30		
31		curStrHandle.CheckData(euiccCiPKIdListForVerificationArray.length, euiccInfo1.euiccCiPKIdListForVerification.arrOfElement.length, "euiccCiPKIdListForVerification个数");
32		CheckArray(euiccCiPKIdListForVerificationArray,euiccInfo1.euiccCiPKIdListForVerification.arrOfElement,"euiccCiPKIdListForVerificationArray",1);
33		
34		curStrHandle.CheckData(euiccCiPKIdListForSigningArray.length, euiccInfo1.euiccCiPKIdListForSigning.arrOfElement.length, "euiccCiPKIdListForSigning个数");
35		CheckArray(euiccCiPKIdListForSigningArray,euiccInfo1.euiccCiPKIdListForSigning.arrOfElement,"euiccCiPKIdListForSigningArray",1);
36	
37	}catch(e){
38		obj.SubLevel(ProfileInfoListResponse_Data_Error, level_of_SubLevel.error);
39	}
40	
41	RecoverCard();
42	
43}
44
45function TC_eUICC_ES10b_GetEUICCInfo1_02_Nominal_GetEUICCInfo_call_after_GetEUICCChallenge()
46{
47	tracenamestr = "测试目的:执行GetEUICCChallenge后获取EUICCInfo1";
48	curDis.TraceStart(sno++,tracenamestr);
49
50	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
51	Ini_powerOn_eUICC_LPAe_not_activate();
52	
53	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
54	TS_MANAGE_CHANNEL_OPEN();
55	
56	curLogicChannel = 1;
57	
58	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
59	TS_SELECT("Select ISD",ISD_R_AID,"9000");
60	
61	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
62
63	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
64	Profile_load_procedure.ES10b_GetEUICCChallenge();
65	
66	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request,获取EUICCInfo1;");
67	
68	var euiccInfo1 = new EUICCInfo1();
69	var hexData = LPAd_Transport_data_to_eUICC(GetEuiccInfo1RequestHexStr);
70	
71	euiccInfo1.checkCardResDataFormat(hexData);
72	
73	
74	try
75	{
76		curStrHandle.CheckData(RSP_SVN_H, euiccInfo1.svn, "svn");
77		
78		curStrHandle.CheckData(euiccCiPKIdListForVerificationArray.length, euiccInfo1.euiccCiPKIdListForVerification.arrOfElement.length, "euiccCiPKIdListForVerification个数");
79		CheckArray(euiccCiPKIdListForVerificationArray,euiccInfo1.euiccCiPKIdListForVerification.arrOfElement,"euiccCiPKIdListForVerificationArray",1);
80		
81		curStrHandle.CheckData(euiccCiPKIdListForSigningArray.length, euiccInfo1.euiccCiPKIdListForSigning.arrOfElement.length, "euiccCiPKIdListForSigning个数");
82		CheckArray(euiccCiPKIdListForSigningArray,euiccInfo1.euiccCiPKIdListForSigning.arrOfElement,"euiccCiPKIdListForSigningArray",1);
83	
84	}catch(e){
85		obj.SubLevel(ProfileInfoListResponse_Data_Error, level_of_SubLevel.error);
86	}
87	
88	RecoverCard();
89	
90}
91
-cas 盲生成TC_eUICC_ES10b_GetEUICCInfo1/Import/TC_eUICC_ES10b_GetEUICCInfo1.js74 行 / 5320 字符 / gb18030入口函数 @L12
1// Author: 卡思Cas智能体
2// Date: 20260904-235415
3// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10b.GetEUICCInfo1,Test Sequence #02 Nominal:,适用性 M。
4// Test points: S1-C1 ATR_present;S2-C1 outer tag 62;S2-C2 SW;S3-C1 SW;S4-C2 final SW;S5-C2 SW
5//   S5-C1 CHANNEL_NUMBER extracted;S6-C1 SW;S8-C1 SW;S8-C2 outer tag BF2E
6//   S8-C3 R_CHALLENGE outer tag;S8-C3 euiccChallenge tag;S8-C3 euiccChallenge length;S9-C1 SW
7//   S9-C3 EID object 82;S9-C4 EID object A9;S9-C5 EID object AA;S9-C2 outer tag BF20
8//   S9-C6 request data
9// 本函数由 CaseIR 4.2.13.2.1 编译生成(blindgen-42131-20260904_2313,SGP.23 v1.16 × SGP.22 v2.7):字节权威=CaseIR,非誊录黄金脚本。
10// Value-free template: every data byte is injected from CaseIR fields; no scaffold globals (see docs/speconly/compile-symbol-migration.md).
11// 适用性 M:编译期门,运行时由 harness 环境前置承担。
12function TC_eUICC_ES10b_GetEUICCInfo1_02_Nominal() {
13    var bind = curBind;
14    // IC1 PROC_EUICC_INITIALIZATION_SEQUENCE: declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
15    // IC2 PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR: declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
16
17    // 步骤 1:RESET(procedure_expansion)
18    var s1 = bind.resetAndAtr();
19    bind.checkData("S1-C1 ATR_present", "1", s1.atr_hex !== "" ? "1" : "0");
20
21    // 步骤 2:SELECT_MF(procedure_expansion)
22    var s2 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
23    bind.checkData("S2-C1 outer tag 62", "62", s2.resp.substring(0, 2));
24    bind.checkData("S2-C2 SW", "9000", s2.sw);
25
26    // 步骤 3:TERMINAL_CAPABILITY_LPAd(procedure_expansion)
27    var s3 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
28    bind.checkData("S3-C1 SW", "9000", s3.sw);
29
30    // 步骤 4:TERMINAL_PROFILE(procedure_expansion)
31    var steady4 = bind.runToSteadyState(function () {
32        return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
33    });
34    bind.checkData("S4-C2 final SW", "9000", steady4.final.sw);
35    // S4-C1: pattern clause 'TPidentifiesproactive_terminal_support' has no static generation face (unmapped).
36    // S4-C1: binding:tp_verbatim_emission_enables_proactive_session(TS102223-6.2;R2-job-c6c8b75) (check_attestation)
37
38    // 步骤 5:MANAGE_CHANNEL_OPEN(procedure_expansion)
39    // CHANNEL_NUMBER extraction and dynamic CLA rebinding are CasBind internal state (chaining rule; no generated-code re-implementation).
40    var s5 = bind.manageChannelOpen("9000");
41    bind.checkData("S5-C2 SW", "9000", s5.sw);
42    bind.checkData("S5-C1 CHANNEL_NUMBER extracted", "1", s5.chan !== null ? "1" : "0");
43
44    // 步骤 6:MTD_SELECT(procedure_expansion)
45    // CLA = bound channel (cla_rule) and <L> length binding are CasBind internal state (chaining rule; no generated-code re-implementation).
46    var s6 = bind.sendApdu(null, "A4", "04", "00", "A0000005591010FFFFFFFF8900000100", "00", "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("S6-C1 SW", "9000", s6.sw);
49
50    // 步骤 7:MTD_STORE_DATA(tc_step)
51    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
52    var sdCla7 = s5.chan !== null ? (s5.chan <= 3 ? 128 + s5.chan : 188 + s5.chan).toString(16).toUpperCase() : null;
53    var s7 = bind.sendApdu(sdCla7, "E2", "91", "00", "BF2E00", "00", "9000");
54    bind.checkData("S8-C1 SW", "9000", s7.sw);
55    bind.checkData("S8-C2 outer tag BF2E", "BF2E", s7.resp.substring(0, 4));
56    // geca-proc ES10b Info 响应面(R_CHALLENGE,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
57    var gw7 = BindGecaProc.parseGecaResponse(s7.resp, {outer: "BF2E", required: ["80"], optional: []});
58    bind.checkData("S8-C3 R_CHALLENGE outer tag", "BF2E", gw7.outer_tag === null ? "absent" : gw7.outer_tag);
59    var gwch7 = null; for (var gwci7 = 0; gwci7 < gw7.children.length; gwci7++) { if (gw7.children[gwci7].tag === "80") { gwch7 = gw7.children[gwci7]; } }
60    bind.checkData("S8-C3 euiccChallenge tag", "80", gwch7 === null ? "absent" : gwch7.tag);
61    bind.checkData("S8-C3 euiccChallenge length", "10", gwch7 === null ? "absent" : (gwch7.len < 16 ? ("0" + gwch7.len.toString(16).toUpperCase()) : gwch7.len.toString(16).toUpperCase()));
62
63    // 步骤 8:MTD_STORE_DATA(tc_step;REQ: RQ31_027, RQ31_028, RQ57_051, RQ57_052, RQ57_054)
64    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
65    var sdCla8 = s5.chan !== null ? (s5.chan <= 3 ? 128 + s5.chan : 188 + s5.chan).toString(16).toUpperCase() : null;
66    var s8 = bind.sendApdu(sdCla8, "E2", "91", "00", "BF2000", "00", "9000");
67    bind.checkData("S9-C1 SW", "9000", s8.sw);
68    bind.checkData("S9-C3 EID object 82", "1", s8.resp.indexOf("82") >= 0 ? "1" : "0");
69    bind.checkData("S9-C4 EID object A9", "1", s8.resp.indexOf("A9") >= 0 ? "1" : "0");
70    bind.checkData("S9-C5 EID object AA", "1", s8.resp.indexOf("AA") >= 0 ? "1" : "0");
71    bind.checkData("S9-C2 outer tag BF20", "BF20", s8.resp.substring(0, 4));
72    bind.checkData("S9-C6 request data", "BF2000", s8.cmd.substring(10, 16));
73}
74

完整 unified diff

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

展开 diff(160 行)
--- -man
+++ -cas
@@ -1,91 +1,74 @@
-// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10b_GetEUICCInfo1_01_Nominal + TC_eUICC_ES10b_GetEUICCInfo1_02_Nominal_GetEUICCInfo_call_after_GetEUICCChallenge (extracted verbatim)
+// Author: 卡思Cas智能体
+// Date: 20260904-235415
+// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10b.GetEUICCInfo1,Test Sequence #02 Nominal:,适用性 M。
+// Test points: S1-C1 ATR_present;S2-C1 outer tag 62;S2-C2 SW;S3-C1 SW;S4-C2 final SW;S5-C2 SW
+//   S5-C1 CHANNEL_NUMBER extracted;S6-C1 SW;S8-C1 SW;S8-C2 outer tag BF2E
+//   S8-C3 R_CHALLENGE outer tag;S8-C3 euiccChallenge tag;S8-C3 euiccChallenge length;S9-C1 SW
+//   S9-C3 EID object 82;S9-C4 EID object A9;S9-C5 EID object AA;S9-C2 outer tag BF20
+//   S9-C6 request data
+// 本函数由 CaseIR 4.2.13.2.1 编译生成(blindgen-42131-20260904_2313,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_GetEUICCInfo1_02_Nominal() {
+    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_ES10b_GetEUICCInfo1_01_Nominal()
-{
-	
+    // 步骤 1:RESET(procedure_expansion)
+    var s1 = bind.resetAndAtr();
+    bind.checkData("S1-C1 ATR_present", "1", s1.atr_hex !== "" ? "1" : "0");
 
-	tracenamestr = "测试目的:获取EUICCInfo1";
-	curDis.TraceStart(sno++,tracenamestr);
+    // 步骤 2:SELECT_MF(procedure_expansion)
+    var s2 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
+    bind.checkData("S2-C1 outer tag 62", "62", s2.resp.substring(0, 2));
+    bind.checkData("S2-C2 SW", "9000", s2.sw);
 
-	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,获取EUICCInfo1;");
-	var euiccInfo1 = new EUICCInfo1();
-	var hexData = LPAd_Transport_data_to_eUICC(GetEuiccInfo1RequestHexStr);
-	
-	euiccInfo1.checkCardResDataFormat(hexData);
-	
-	try
-	{
-		curStrHandle.CheckData(O_RSP_VERSION, euiccInfo1.svn, "svn");
-		
-		curStrHandle.CheckData(euiccCiPKIdListForVerificationArray.length, euiccInfo1.euiccCiPKIdListForVerification.arrOfElement.length, "euiccCiPKIdListForVerification个数");
-		CheckArray(euiccCiPKIdListForVerificationArray,euiccInfo1.euiccCiPKIdListForVerification.arrOfElement,"euiccCiPKIdListForVerificationArray",1);
-		
-		curStrHandle.CheckData(euiccCiPKIdListForSigningArray.length, euiccInfo1.euiccCiPKIdListForSigning.arrOfElement.length, "euiccCiPKIdListForSigning个数");
-		CheckArray(euiccCiPKIdListForSigningArray,euiccInfo1.euiccCiPKIdListForSigning.arrOfElement,"euiccCiPKIdListForSigningArray",1);
-	
-	}catch(e){
-		obj.SubLevel(ProfileInfoListResponse_Data_Error, level_of_SubLevel.error);
-	}
-	
-	RecoverCard();
-	
-}
+    // 步骤 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);
 
-function TC_eUICC_ES10b_GetEUICCInfo1_02_Nominal_GetEUICCInfo_call_after_GetEUICCChallenge()
-{
-	tracenamestr = "测试目的:执行GetEUICCChallenge后获取EUICCInfo1";
-	curDis.TraceStart(sno++,tracenamestr);
+    // 步骤 4:TERMINAL_PROFILE(procedure_expansion)
+    var steady4 = bind.runToSteadyState(function () {
+        return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
+    });
+    bind.checkData("S4-C2 final SW", "9000", steady4.final.sw);
+    // S4-C1: pattern clause 'TPidentifiesproactive_terminal_support' has no static generation face (unmapped).
+    // S4-C1: binding:tp_verbatim_emission_enables_proactive_session(TS102223-6.2;R2-job-c6c8b75) (check_attestation)
 
-	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");
-	
-	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
+    // 步骤 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-C2 SW", "9000", s5.sw);
+    bind.checkData("S5-C1 CHANNEL_NUMBER extracted", "1", s5.chan !== null ? "1" : "0");
 
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
-	Profile_load_procedure.ES10b_GetEUICCChallenge();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request,获取EUICCInfo1;");
-	
-	var euiccInfo1 = new EUICCInfo1();
-	var hexData = LPAd_Transport_data_to_eUICC(GetEuiccInfo1RequestHexStr);
-	
-	euiccInfo1.checkCardResDataFormat(hexData);
-	
-	
-	try
-	{
-		curStrHandle.CheckData(RSP_SVN_H, euiccInfo1.svn, "svn");
-		
-		curStrHandle.CheckData(euiccCiPKIdListForVerificationArray.length, euiccInfo1.euiccCiPKIdListForVerification.arrOfElement.length, "euiccCiPKIdListForVerification个数");
-		CheckArray(euiccCiPKIdListForVerificationArray,euiccInfo1.euiccCiPKIdListForVerification.arrOfElement,"euiccCiPKIdListForVerificationArray",1);
-		
-		curStrHandle.CheckData(euiccCiPKIdListForSigningArray.length, euiccInfo1.euiccCiPKIdListForSigning.arrOfElement.length, "euiccCiPKIdListForSigning个数");
-		CheckArray(euiccCiPKIdListForSigningArray,euiccInfo1.euiccCiPKIdListForSigning.arrOfElement,"euiccCiPKIdListForSigningArray",1);
-	
-	}catch(e){
-		obj.SubLevel(ProfileInfoListResponse_Data_Error, level_of_SubLevel.error);
-	}
-	
-	RecoverCard();
-	
+    // 步骤 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)
+    // <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("S8-C1 SW", "9000", s7.sw);
+    bind.checkData("S8-C2 outer tag BF2E", "BF2E", s7.resp.substring(0, 4));
+    // geca-proc ES10b Info 响应面(R_CHALLENGE,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
+    var gw7 = BindGecaProc.parseGecaResponse(s7.resp, {outer: "BF2E", required: ["80"], optional: []});
+    bind.checkData("S8-C3 R_CHALLENGE outer tag", "BF2E", gw7.outer_tag === null ? "absent" : gw7.outer_tag);
+    var gwch7 = null; for (var gwci7 = 0; gwci7 < gw7.children.length; gwci7++) { if (gw7.children[gwci7].tag === "80") { gwch7 = gw7.children[gwci7]; } }
+    bind.checkData("S8-C3 euiccChallenge tag", "80", gwch7 === null ? "absent" : gwch7.tag);
+    bind.checkData("S8-C3 euiccChallenge length", "10", gwch7 === null ? "absent" : (gwch7.len < 16 ? ("0" + gwch7.len.toString(16).toUpperCase()) : gwch7.len.toString(16).toUpperCase()));
+
+    // 步骤 8:MTD_STORE_DATA(tc_step;REQ: RQ31_027, RQ31_028, RQ57_051, RQ57_052, RQ57_054)
+    // <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", "BF2000", "00", "9000");
+    bind.checkData("S9-C1 SW", "9000", s8.sw);
+    bind.checkData("S9-C3 EID object 82", "1", s8.resp.indexOf("82") >= 0 ? "1" : "0");
+    bind.checkData("S9-C4 EID object A9", "1", s8.resp.indexOf("A9") >= 0 ? "1" : "0");
+    bind.checkData("S9-C5 EID object AA", "1", s8.resp.indexOf("AA") >= 0 ? "1" : "0");
+    bind.checkData("S9-C2 outer tag BF20", "BF20", s8.resp.substring(0, 4));
+    bind.checkData("S9-C6 request data", "BF2000", s8.cmd.substring(10, 16));
 }