eSIM RSP 测试用例对比站

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

源码对照:4.2.18.2.1

ES10b 服务器认证(SM-DP+,NIST) / TC_eUICC_ES10b.AuthenticateServer_SM-DP+_NIST

左侧为人工切片入口(-man,来自 原料/切片 的最小可执行脚本),右侧为 Cas 盲生成入口(-cas,仅依据规范生成)。文件按原始编码(多为 GBK)解码为 UTF-8 显示,行号自 1 起;字节级原文与 sha256 见两侧脚本包。完整 unified diff 见本页底部折叠区,以及 报告原文 §4。
-man 入口
Import/TestCase_SGP_23.js
210 行 / 8378 字符 / gb18030
-cas 入口
TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST/Import/TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST.js
515 行 / 48178 字符 / gb18030
默认折行显示长行;取消勾选可横向滚动查看原始行宽
-man 人工切片Import/TestCase_SGP_23.js210 行 / 8378 字符 / gb18030入口函数 @L3
1// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST_01_Nominal_Without_MatchingID_in_CtxParams1 + TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST_02_Nominal_With_MatchingID_in_CtxParams1 + TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST_03_Nominal_With_IMEI_in_Device_Capabilities (extracted verbatim)
2
3function TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST_01_Nominal_Without_MatchingID_in_CtxParams1()
4{
5	
6	//测试入口条件
7	if(!check_Applicability_of_tests_RSP_SGP23_test("C001"))
8		return;
9	
10	tracenamestr = "测试目的:执行AuthenticateServer指令,CtxParams1中没有MatchingID";
11	curDis.TraceStart(sno++,tracenamestr);
12
13	curDis.TestStepStart2(stno++,"复位;");
14	ResetCard();
15	
16	curDis.TestStepStart2(stno++,"读卡器向卡片发送Terminal Capability命令;");
17	TS_TERMINAL_CAPABILITY_cmd();
18	
19	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
20	TS_MANAGE_CHANNEL_OPEN();
21	
22	curLogicChannel = 1;
23	
24	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
25	TS_SELECT("Select ISD",ISD_R_AID,"9000");
26	
27	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
28	pkId_CI_ForVerification = pkId_CI_ECDSA_NIST;
29	pkId_CI_ForSigning = pkId_CI_ECDSA_NIST;	
30
31	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
32	
33	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
34	Profile_load_procedure.ES10b_GetEUICCInfo1();
35
36	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
37	Profile_load_procedure.ES10b_GetEUICCChallenge();
38
39	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
40	var DeviceCapabilities1 = new DeviceCapabilities();
41	DeviceCapabilities1.gsmSupportedRelease = "050000";
42	DeviceCapabilities1.utranSupportedRelease = "080000";
43	DeviceCapabilities1.cdma2000onexSupportedRelease = "010000";	
44	DeviceCapabilities1.cdma2000hrpdSupportedRelease = "010000";
45	DeviceCapabilities1.cdma2000ehrpdSupportedRelease = "020000";
46	DeviceCapabilities1.eutranSupportedRelease = "020000";
47	DeviceCapabilities1.contactlessSupportedRelease = "090000";
48	DeviceCapabilities1.rspCrlSupportedVersion = "020100";
49	
50	var DeviceInfo1 = new DeviceInfo();
51	DeviceInfo1.tac = "00000000";
52	DeviceInfo1.deviceCapabilities = DeviceCapabilities1.GenHexData();
53	
54	var CtxParamsForCommonAuthentication1 =new CtxParamsForCommonAuthentication();
55	CtxParamsForCommonAuthentication1.deviceInfo = DeviceInfo1.GenHexData();
56	
57	ctxParamsForCommonAuthentication=CtxParamsForCommonAuthentication1.GenHexData();
58	
59	Profile_load_procedure.ES10b_AuthenticateServer();
60	
61	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest;");
62	Profile_load_procedure.ES10b_PrepareDownload();
63	
64	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccDataRequest(GetEID);");
65	Profile_load_procedure.ES10b_GetEID();
66	
67	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行BoundProfilePackage;--空Proprietary 数据");
68	Profile_load_procedure.ES10b_LoadBoundProfilePackage();
69	
70	RecoverCard();
71	
72}
73
74function TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST_02_Nominal_With_MatchingID_in_CtxParams1()
75{
76	
77	//测试入口条件
78	if(!check_Applicability_of_tests_RSP_SGP23_test("C001"))
79		return;
80	
81	tracenamestr = "测试目的:执行AuthenticateServer指令,CtxParams1中有MatchingID";
82	curDis.TraceStart(sno++,tracenamestr);
83
84	curDis.TestStepStart2(stno++,"复位;");
85	ResetCard();
86	
87	curDis.TestStepStart2(stno++,"读卡器向卡片发送Terminal Capability命令;");
88	TS_TERMINAL_CAPABILITY_cmd();
89	
90	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
91	TS_MANAGE_CHANNEL_OPEN();
92	
93	curLogicChannel = 1;
94	
95	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
96	TS_SELECT("Select ISD",ISD_R_AID,"9000");
97	
98	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
99	pkId_CI_ForVerification = pkId_CI_ECDSA_NIST;
100	pkId_CI_ForSigning = pkId_CI_ECDSA_NIST;
101	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
102		
103	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
104	Profile_load_procedure.ES10b_GetEUICCInfo1();
105	
106
107	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
108	Profile_load_procedure.ES10b_GetEUICCChallenge();
109
110	
111	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
112	var DeviceCapabilities1 = new DeviceCapabilities();
113	DeviceCapabilities1.gsmSupportedRelease = "050000";
114	DeviceCapabilities1.utranSupportedRelease = "080000";
115	DeviceCapabilities1.cdma2000onexSupportedRelease = "010000";	
116	DeviceCapabilities1.cdma2000hrpdSupportedRelease = "010000";
117	DeviceCapabilities1.cdma2000ehrpdSupportedRelease = "020000";
118	DeviceCapabilities1.eutranSupportedRelease = "020000";
119	DeviceCapabilities1.contactlessSupportedRelease = "090000";
120	DeviceCapabilities1.rspCrlSupportedVersion = "020100";
121	
122	var DeviceInfo1 = new DeviceInfo();
123	DeviceInfo1.tac = "00000000";
124	DeviceInfo1.deviceCapabilities = DeviceCapabilities1.GenHexData();
125	
126	var CtxParamsForCommonAuthentication1 =new CtxParamsForCommonAuthentication();
127	CtxParamsForCommonAuthentication1.matchingId = "30343338362D41475946542D41373459382D3346383135";	
128	CtxParamsForCommonAuthentication1.deviceInfo = DeviceInfo1.GenHexData();
129	ctxParamsForCommonAuthentication = CtxParamsForCommonAuthentication1.GenHexData();
130	
131	Profile_load_procedure.ES10b_AuthenticateServer();
132	
133	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest;");
134	Profile_load_procedure.ES10b_PrepareDownload();
135	
136	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccDataRequest(GetEID);");
137	Profile_load_procedure.ES10b_GetEID();
138	
139	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行BoundProfilePackage;--空Proprietary 数据");
140	Profile_load_procedure.ES10b_LoadBoundProfilePackage();
141	
142	RecoverCard();
143}
144
145function TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST_03_Nominal_With_IMEI_in_Device_Capabilities()
146{
147
148	//测试入口条件
149	if(!check_Applicability_of_tests_RSP_SGP23_test("C001"))
150		return;
151	
152	tracenamestr = "测试目的:执行AuthenticateServer指令,Device Capabilities中带有IMEI";
153	curDis.TraceStart(sno++,tracenamestr);
154
155	curDis.TestStepStart2(stno++,"复位;");
156	ResetCard();
157	
158	curDis.TestStepStart2(stno++,"读卡器向卡片发送Terminal Capability命令;");
159	TS_TERMINAL_CAPABILITY_cmd();
160	
161	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
162	TS_MANAGE_CHANNEL_OPEN();
163	
164	curLogicChannel = 1;
165	
166	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
167	TS_SELECT("Select ISD",ISD_R_AID,"9000");
168	
169	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
170	pkId_CI_ForVerification = pkId_CI_ECDSA_NIST;
171	pkId_CI_ForSigning = pkId_CI_ECDSA_NIST;
172
173	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
174	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
175	Profile_load_procedure.ES10b_GetEUICCInfo1();
176	
177	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
178	Profile_load_procedure.ES10b_GetEUICCChallenge();
179
180	
181	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
182	var DeviceCapabilities1 = new DeviceCapabilities();
183	DeviceCapabilities1.gsmSupportedRelease = "050000";
184	DeviceCapabilities1.utranSupportedRelease = "080000";
185	DeviceCapabilities1.cdma2000onexSupportedRelease = "010000";	
186	DeviceCapabilities1.eutranSupportedRelease = "020000";
187	
188	var DeviceInfo1 = new DeviceInfo();
189	DeviceInfo1.tac = "00000000";
190	DeviceInfo1.deviceCapabilities = DeviceCapabilities1.GenHexData();
191	DeviceInfo1.imei = "0000000011111111";
192	
193	var CtxParamsForCommonAuthentication1 =new CtxParamsForCommonAuthentication();
194	CtxParamsForCommonAuthentication1.deviceInfo = DeviceInfo1.GenHexData();
195	ctxParamsForCommonAuthentication=CtxParamsForCommonAuthentication1.GenHexData();
196	
197	Profile_load_procedure.ES10b_AuthenticateServer();
198	
199	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest;");
200	Profile_load_procedure.ES10b_PrepareDownload();
201	
202	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccDataRequest(GetEID);");
203	Profile_load_procedure.ES10b_GetEID();
204	
205	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行BoundProfilePackage;--空Proprietary 数据");
206	Profile_load_procedure.ES10b_LoadBoundProfilePackage();
207	
208	RecoverCard();
209}
210
-cas 盲生成TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST/Import/TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST.js515 行 / 48178 字符 / gb18030
1// Author: 卡思Cas智能体
2// Date: 20261004-022633
3// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10b.AuthenticateServer_SM-DP+_NIST,Test Sequence #01-#03 Nominal(本 TC 全部 3 条 Test Sequence 合并展开),适用性 C001。
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 R_EUICC_INFO1 outer tag
7//   S1-C2 R_EUICC_INFO1 required members present;S1-C3 CI PK lists share at least one key id
8//   S2-C1 SW;S2-C2 R_CHALLENGE outer tag;S2-C2 R_CHALLENGE required members present
9//   S2-C2 tagOfeuiccChallenge;S2-C2 lengthOfeuiccChallenge;S4-C1 SW;S4-C2 structure_ok
10//   S4-C3 transactionId echo;S4-C4 serverChallenge echo;S4-C5 sig_verify;S4-C6 ctxParams1 echo
11//   S4-C2 R_AUTHENTICATE_SMDP authenticateResponseOk structure;S4-C5 euiccSignature1 verify
12//   S5-C1 SW;S5-C2 R_EUICC_INFO1 outer tag;S5-C2 R_EUICC_INFO1 required members present
13//   S5-C3 CI PK lists share at least one key id;S6-C1 SW;S6-C2 R_CHALLENGE outer tag
14//   S6-C2 R_CHALLENGE required members present;S6-C2 tagOfeuiccChallenge
15//   S6-C2 lengthOfeuiccChallenge;S8-C1 SW;S8-C2 structure_ok;S8-C3 transactionId echo
16//   S8-C4 serverChallenge echo;S8-C5 sig_verify;S8-C6 ctxParams1 echo
17//   S8-C2 R_AUTH_SMDP_MATCH_ID authenticateResponseOk structure;S8-C5 euiccSignature1 verify
18//   S9-C1 SW;S9-C2 R_EUICC_INFO1 outer tag;S9-C2 R_EUICC_INFO1 required members present
19//   S9-C3 CI PK lists share at least one key id;S10-C1 SW;S10-C2 R_CHALLENGE outer tag
20//   S10-C2 R_CHALLENGE required members present;S10-C2 tagOfeuiccChallenge
21//   S10-C2 lengthOfeuiccChallenge;S12-C1 SW;S12-C2 structure_ok;S12-C3 transactionId echo
22//   S12-C4 serverChallenge echo;S12-C5 sig_verify;S12-C6 ctxParams1 echo
23//   S12-C2 R_AUTH_SMDP_IMEI authenticateResponseOk structure;S12-C5 euiccSignature1 verify
24// 本函数由 CaseIR 4.2.18.2.1 编译生成(4.2.18.2.1-TC_eUICC_ES10b.AuthenticateServer_SM-DP+_NIST-20261004_022633,SGP.23 v1.16 × SGP.22 v2.7):字节权威=CaseIR,非誊录黄金脚本。
25// Value-free template: every data byte is injected from CaseIR fields; no scaffold globals (see docs/speconly/compile-symbol-migration.md).
26// 适用性 C001:编译期门,运行时由 harness 环境前置承担。
27function TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST_01_03_Nominal_TC_3_Test_Sequence() {
28    var bind = curBind;
29
30    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 1):RESET(K 语料机械展开)
31    var s13 = bind.resetAndAtr();
32    bind.checkData("ICH-IC1-K1-C1 ATR_present", "1", s13.atr_hex !== "" ? "1" : "0");
33
34    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 2):SELECT_MF(K 语料机械展开)
35    // FCP outer tag not materialized from clause: tag-face asserted only when corpus fixes the tag byte (e.g. TS 102 221 FCP '62').
36    var s14 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
37    bind.checkData("ICH-IC1-K2-C2 FCP_Template", "1", s14.resp.length > 0 ? "1" : "0");
38    bind.checkData("ICH-IC1-K2-C4 SW", "9000", s14.sw);
39
40    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 3):TERMINAL_CAPABILITY_LPAd(K 语料机械展开)
41    var s15 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
42    bind.checkData("ICH-IC1-K3-C4 SW", "9000", s15.sw);
43
44    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 4):TERMINAL_PROFILE(K 语料机械展开)
45    var steady16 = bind.runToSteadyState(function () {
46        return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
47    });
48    bind.checkData("ICH-IC1-K4-C4 final SW", "9000", steady16.final.sw);
49
50    // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 1):MANAGE_CHANNEL_OPEN(K 语料机械展开)
51    // CHANNEL_NUMBER extraction and dynamic CLA rebinding are CasBind internal state (chaining rule; no generated-code re-implementation).
52    var s17 = bind.manageChannelOpen("9000");
53    bind.checkData("ICH-IC2-K1-C4 SW", "9000", s17.sw);
54    bind.checkData("ICH-IC2-K1-C3 CHANNEL_NUMBER extracted", "1", s17.chan !== null ? "1" : "0");
55
56    // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 2):MTD_SELECT(K 语料机械展开)
57    // CLA = bound channel (cla_rule) and <L> length binding are CasBind internal state (chaining rule; no generated-code re-implementation).
58    var s18 = bind.sendApdu(null, "A4", "04", "00", "A0000005591010FFFFFFFF8900000100", null, "9000");
59    // 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.
60    bind.checkData("ICH-IC2-K2-C4 SW", "9000", s18.sw);
61
62    // 步骤 1:Seq#01] MTD_STORE_DATA(tc_step)
63    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
64    var sdCla1 = s17.chan !== null ? (s17.chan <= 3 ? 128 + s17.chan : 188 + s17.chan).toString(16).toUpperCase() : null;
65    var s1 = bind.sendApdu(sdCla1, "E2", "91", "00", "BF2000", "00", "9000");
66    bind.checkData("S1-C1 SW", "9000", s1.sw);
67    // geca-proc ES10b Info 响应面(R_EUICC_INFO1,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
68    var gw1 = BindGecaProc.parseGecaResponse(s1.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
69    bind.checkData("S1-C2 R_EUICC_INFO1 outer tag", "BF20", gw1.outer_tag === null ? "absent" : gw1.outer_tag);
70    bind.checkData("S1-C2 R_EUICC_INFO1 required members present", "1", gw1.ok ? "1" : "0");
71    var pkV1 = BindEs10xSingleRequest.parseBerTlv(gw1.fields["A9"] || "");
72    var pkS1 = BindEs10xSingleRequest.parseBerTlv(gw1.fields["AA"] || "");
73    var samePk1 = false;
74    for (var pvi1 = 0; pvi1 < pkV1.length; pvi1++) {
75        for (var psi1 = 0; psi1 < pkS1.length; psi1++) {
76            if (pkV1[pvi1].value !== "" && pkV1[pvi1].value === pkS1[psi1].value) { samePk1 = true; }
77        }
78    }
79    bind.checkData("S1-C3 CI PK lists share at least one key id", "1", samePk1 ? "1" : "0");
80
81    // 步骤 2:Seq#01] MTD_STORE_DATA(tc_step)
82    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
83    var sdCla2 = s17.chan !== null ? (s17.chan <= 3 ? 128 + s17.chan : 188 + s17.chan).toString(16).toUpperCase() : null;
84    var s2 = bind.sendApdu(sdCla2, "E2", "91", "00", "BF2E00", "00", "9000");
85    bind.checkData("S2-C1 SW", "9000", s2.sw);
86    // geca-proc ES10b Info 响应面(R_CHALLENGE,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
87    var gw2 = BindGecaProc.parseGecaResponse(s2.resp, {outer: "BF2E", required: ["80"], optional: []});
88    bind.checkData("S2-C2 R_CHALLENGE outer tag", "BF2E", gw2.outer_tag === null ? "absent" : gw2.outer_tag);
89    bind.checkData("S2-C2 R_CHALLENGE required members present", "1", gw2.ok ? "1" : "0");
90    var r2w2 = BindGecaProc.parseGecaResponse(s2.resp, {outer: "BF2E", required: ["80"]});
91    bind.checkData("S2-C2 R_CHALLENGE outer tag", "BF2E", r2w2.outer_tag === null ? "absent" : r2w2.outer_tag);
92    var r2ch2 = null; for (var r2ci2 = 0; r2ci2 < r2w2.children.length; r2ci2++) { if (r2w2.children[r2ci2].tag === "80") { r2ch2 = r2w2.children[r2ci2]; } }
93    var r2chal2 = r2ch2 === null ? "" : r2ch2.value;
94    bind.checkData("S2-C2 tagOfeuiccChallenge", "80", r2ch2 === null ? "absent" : r2ch2.tag);
95    bind.checkData("S2-C2 lengthOfeuiccChallenge", "10", r2ch2 === null ? "absent" : (r2ch2.len < 16 ? ("0" + r2ch2.len.toString(16).toUpperCase()) : r2ch2.len.toString(16).toUpperCase()));
96
97    // 步骤 3:Seq#01] Step4 输入准备(InitiateAuthentication):<S_TRANSACTION_ID>、<EUICC_CHALLENGE>、<S_SMDP_CHALLENGE>、<S_SMDP_SIGNATURE1>;设 <EUICC_CI_PK_ID_TO_BE_USED> 为基于 NIST P-256 的 CI Key ID;选取导向同一 Root CI 的 #CERT_S_SM_DPauth_ECDSA(tc_step;non_wire)
98    // test-tool internal preparation (no APDU face): runtime-domain
99    // values per CaseIR unresolved (G Annex B generation rules);
100    // no fabricated bytes emitted here.
101
102    // 步骤 4:Seq#01] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ26_029, RQ26_005, RQ26_006, RQ26_007, RQ26_008, RQ26_034, RQ26_035, RQ31_025, RQ31_046, RQ31_047, RQ31_048, RQ31_049, RQ31_050, RQ31_051, RQ31_053, RQ31_054, RQ31_055, RQ31_076, RQ31_079, RQ42_001, RQ43_001, RQ43_002, RQ45_002, RQ55_004, RQ55_005, RQ57_094, RQ57_095, RQ57_096, RQ57_097, RQ57_098, RQ57_099, RQ57_101, RQ57_102, RQ57_103, RQ57_104, RQ57_105, RQ57_106, RQ57_107, RQ57_108)
103    // dynamic-template 多占位运行时绑定(B-5;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;模板 tag 权威 = SGP.22 §5.7.13 + AUTOMATIC TAGS + 黄金切片线缆三源对账)
104    var dt4Tid = "";
105    var dt4Sc = "";
106    for (var dt4Ri = 0; dt4Ri < 16; dt4Ri++) {
107        dt4Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
108        dt4Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
109    }
110    var dt4PkList = BindEs10xSingleRequest.parseBerTlv(gw1.fields["AA"] || "");
111    var dt4CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
112    var dt4Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
113    var dt4Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
114    var dt4Sel = -1;
115    for (var dt4Pi = 0; dt4Pi < dt4PkList.length && dt4Sel < 0; dt4Pi++) {
116        for (var dt4Mi = 0; dt4Mi < dt4CiIds.length; dt4Mi++) {
117            if (dt4PkList[dt4Pi].value === dt4CiIds[dt4Mi]) { dt4Sel = dt4Mi; break; }
118        }
119    }
120    var dt4SkiSel = dt4Sel;
121    var dt4Sks = ["0A7CC1C244E60C52CD5B7807AB8C360C26524601507DCABC5DD598B5A616D5D5", "93FB33D0584F349B07F8B5D2AF93D7C3E354B349A3B913502E6ABC070E4D4929"];
122    var dt4Ctx = "A130800400000000A12880030500008103080000820301000083030100008403020000850302000086030900008703020100";
123    if (dt4Sel < 0 || dt4SkiSel < 0) {
124        bind.checkData("S4-C1 SW", "9000", "dt4_not_executed:no_usable_material_set");
125        bind.checkData("S4-C2 structure_ok", "1", "0");
126        bind.checkData("S4-C3 transactionId echo", dt4Tid, "dt4_not_executed:no_usable_material_set");
127        bind.checkData("S4-C4 serverChallenge echo", dt4Sc, "dt4_not_executed:no_usable_material_set");
128        bind.checkData("S4-C5 sig_verify", "1", "0");
129        bind.checkData("S4-C6 ctxParams1 echo", dt4Ctx, "dt4_not_executed:no_usable_material_set");
130    } else {
131        bind.engine.InitEccDomainParams(dt4Dps[dt4Sel][0], dt4Dps[dt4Sel][1], dt4Dps[dt4Sel][2], dt4Dps[dt4Sel][3], dt4Dps[dt4Sel][4], 1);
132        var dt4S1 = BindEs10xSingleRequest.buildTlv("30",
133            BindEs10xSingleRequest.buildTlv("80", dt4Tid)
134            + BindEs10xSingleRequest.buildTlv("81", gw2.fields["80"] || "")
135            + BindEs10xSingleRequest.buildTlv("83", "1674657374736D6470706C7573312E6578616D706C652E636F6D")
136            + BindEs10xSingleRequest.buildTlv("84", dt4Sc));
137        var dt4Sgn = "";
138        while (dt4Sgn.length != 2 * dt4Sks[dt4Sel].length) {
139            bind.engine.SleepTime(2000);
140            dt4Sgn = bind.engine.EccSignData(dt4Sks[dt4Sel], dt4S1, 33);
141        }
142        var dt4Asm = BindEs10bAuthServer.assembleAuthenticateServer(
143            {outer: "BF38",
144             signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
145             serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
146            {transactionId: dt4Tid, euiccChallenge: gw2.fields["80"] || "",
147             serverAddress: "1674657374736D6470706C7573312E6578616D706C652E636F6D", serverChallenge: dt4Sc,
148             serverSignature1: dt4Sgn, euiccCiPKIdToBeUsed: dt4CiIds[dt4SkiSel],
149             serverCertificate: dt4Certs[dt4Sel], ctxParams1: dt4Ctx});
150        if (dt4Asm.error) {
151        bind.checkData("S4-C1 SW", "9000", "dt4_assemble_error");
152        bind.checkData("S4-C2 structure_ok", "1", "0");
153        bind.checkData("S4-C3 transactionId echo", dt4Tid, "dt4_assemble_error");
154        bind.checkData("S4-C4 serverChallenge echo", dt4Sc, "dt4_assemble_error");
155        bind.checkData("S4-C5 sig_verify", "1", "0");
156        bind.checkData("S4-C6 ctxParams1 echo", dt4Ctx, "dt4_assemble_error");
157        } else {
158            var dt4Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
159                {cla: "", ins: "E2", p1: "91", p2: "00", data: dt4Asm.request_hex,
160                 le: "00", blockSize: 255, blockSw: "9000", finalSw: "9000"});
161            var dt4Sw = (dt4Run.final && dt4Run.final.sw) ? dt4Run.final.sw : "transport_error";
162            bind.checkData("S4-C1 SW", "9000", dt4Sw);
163            var dt4Ex = BindEs10bAuthServer.extractAuthenticateServer(
164                {outer: "BF38",
165                 ok: {tag: "A0", children: [
166                     {name: "euiccSigned1", tag: "30", children: [
167                         {name: "transactionId", tag: "80"},
168                         {name: "serverAddress", tag: "83"},
169                         {name: "serverChallenge", tag: "84"},
170                         {name: "euiccInfo2", tag: "BF22"},
171                         {name: "ctxParams1", tag: "A0"}]},
172                     {name: "euiccSignature1", tag: "5F37"},
173                     {name: "euiccCertificate", tag: "30"},
174                     {name: "eumCertificate", tag: "30"}]},
175                 error: {tag: "A1", children: [{name: "transactionId", tag: "80"}, {name: "authenticateErrorCode", tag: "81"}]}},
176                dt4Run.final ? dt4Run.final.resp : "");
177            var dt4OkBr = dt4Ex.branch === "ok" && dt4Ex.ok && dt4Ex.ok.missing.length === 0 && dt4Ex.ok.fields.euiccSigned1.children.missing.length === 0;
178            var dt4ErrBr = dt4Ex.branch === "error" && dt4Ex.error && dt4Ex.error.missing.length === 0;
179            bind.checkData("S4-C2 R_AUTHENTICATE_SMDP authenticateResponseOk structure", "1", dt4OkBr ? "1" : "0");
180            bind.checkData("S4-C3 transactionId echo", dt4Tid,
181                dt4OkBr ? dt4Ex.ok.fields.euiccSigned1.children.fields.transactionId.value
182                : (dt4ErrBr ? dt4Ex.error.fields.transactionId.value : "branch_absent"));
183            bind.checkData("S4-C4 serverChallenge echo", dt4Sc,
184                dt4OkBr ? dt4Ex.ok.fields.euiccSigned1.children.fields.serverChallenge.value : "branch_absent");
185            // S4-C5: euiccSignature1 验签(engine EccVerifySign,vendor CommonArith Ecc_Verify ABI 同机制):PK 自响应 euiccCertificate subjectPublicKey BIT STRING 机械提取(X.509:03 42 00 04 || x||y,SEC1 非压缩点——自 04 前缀起取 65B/130hex,对齐 vendor X_509.js subjectPublicKey.substr(2)),签名明文 = euiccSigned1 完整 TLV(RQ26_035 编码后数据对象)。
186            var dt4Pk = "";
187            if (dt4OkBr) {
188                var dt4CertH = dt4Ex.ok.fields.euiccCertificate.value;
189                var dt4Ki = dt4CertH.indexOf("03420004");
190                if (dt4Ki >= 0 && dt4Ki + 6 + 130 <= dt4CertH.length) {
191                    dt4Pk = dt4CertH.substring(dt4Ki + 6, dt4Ki + 6 + 130);
192                }
193            }
194            var dt4ES1 = "";
195            if (dt4OkBr) {
196                var dt4ESc = dt4Ex.ok.fields.euiccSigned1.children.fields;
197                dt4ES1 = BindEs10xSingleRequest.buildTlv("30",
198                    BindEs10xSingleRequest.buildTlv("80", dt4ESc.transactionId.value)
199                    + BindEs10xSingleRequest.buildTlv("83", dt4ESc.serverAddress.value)
200                    + BindEs10xSingleRequest.buildTlv("84", dt4ESc.serverChallenge.value)
201                    + BindEs10xSingleRequest.buildTlv("BF22", dt4ESc.euiccInfo2.value)
202                    + BindEs10xSingleRequest.buildTlv("A0", dt4ESc.ctxParams1.value));
203            }
204            bind.checkData("S4-C5 euiccSignature1 verify", "1",
205                (dt4OkBr && dt4Pk !== "" && dt4ES1 !== ""
206                 && bind.engine.EccVerifySign(dt4Pk, dt4ES1,
207 dt4Ex.ok.fields.euiccSignature1.value, 33) != 0) ? "1" : "0");
208            bind.checkData("S4-C6 ctxParams1 echo", dt4Ctx,
209                dt4OkBr ? dt4Ex.ok.fields.euiccSigned1.children.fields.ctxParams1.value : "branch_absent");
210        }
211    }
212
213    // 步骤 5:Seq#02] MTD_STORE_DATA(tc_step)
214    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
215    var sdCla5 = s17.chan !== null ? (s17.chan <= 3 ? 128 + s17.chan : 188 + s17.chan).toString(16).toUpperCase() : null;
216    var s5 = bind.sendApdu(sdCla5, "E2", "91", "00", "BF2000", "00", "9000");
217    bind.checkData("S5-C1 SW", "9000", s5.sw);
218    // geca-proc ES10b Info 响应面(R_EUICC_INFO1,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
219    var gw5 = BindGecaProc.parseGecaResponse(s5.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
220    bind.checkData("S5-C2 R_EUICC_INFO1 outer tag", "BF20", gw5.outer_tag === null ? "absent" : gw5.outer_tag);
221    bind.checkData("S5-C2 R_EUICC_INFO1 required members present", "1", gw5.ok ? "1" : "0");
222    var pkV5 = BindEs10xSingleRequest.parseBerTlv(gw5.fields["A9"] || "");
223    var pkS5 = BindEs10xSingleRequest.parseBerTlv(gw5.fields["AA"] || "");
224    var samePk5 = false;
225    for (var pvi5 = 0; pvi5 < pkV5.length; pvi5++) {
226        for (var psi5 = 0; psi5 < pkS5.length; psi5++) {
227            if (pkV5[pvi5].value !== "" && pkV5[pvi5].value === pkS5[psi5].value) { samePk5 = true; }
228        }
229    }
230    bind.checkData("S5-C3 CI PK lists share at least one key id", "1", samePk5 ? "1" : "0");
231
232    // 步骤 6:Seq#02] MTD_STORE_DATA(tc_step)
233    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
234    var sdCla6 = s17.chan !== null ? (s17.chan <= 3 ? 128 + s17.chan : 188 + s17.chan).toString(16).toUpperCase() : null;
235    var s6 = bind.sendApdu(sdCla6, "E2", "91", "00", "BF2E00", "00", "9000");
236    bind.checkData("S6-C1 SW", "9000", s6.sw);
237    // geca-proc ES10b Info 响应面(R_CHALLENGE,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
238    var gw6 = BindGecaProc.parseGecaResponse(s6.resp, {outer: "BF2E", required: ["80"], optional: []});
239    bind.checkData("S6-C2 R_CHALLENGE outer tag", "BF2E", gw6.outer_tag === null ? "absent" : gw6.outer_tag);
240    bind.checkData("S6-C2 R_CHALLENGE required members present", "1", gw6.ok ? "1" : "0");
241    var r2w6 = BindGecaProc.parseGecaResponse(s6.resp, {outer: "BF2E", required: ["80"]});
242    bind.checkData("S6-C2 R_CHALLENGE outer tag", "BF2E", r2w6.outer_tag === null ? "absent" : r2w6.outer_tag);
243    var r2ch6 = null; for (var r2ci6 = 0; r2ci6 < r2w6.children.length; r2ci6++) { if (r2w6.children[r2ci6].tag === "80") { r2ch6 = r2w6.children[r2ci6]; } }
244    var r2chal6 = r2ch6 === null ? "" : r2ch6.value;
245    bind.checkData("S6-C2 tagOfeuiccChallenge", "80", r2ch6 === null ? "absent" : r2ch6.tag);
246    bind.checkData("S6-C2 lengthOfeuiccChallenge", "10", r2ch6 === null ? "absent" : (r2ch6.len < 16 ? ("0" + r2ch6.len.toString(16).toUpperCase()) : r2ch6.len.toString(16).toUpperCase()));
247
248    // 步骤 7:Seq#02] Step4 输入准备:同 Seq#01 Step3(<S_TRANSACTION_ID>、<EUICC_CHALLENGE>、<S_SMDP_CHALLENGE>、<S_SMDP_SIGNATURE1>、NIST CI Key ID、#CERT_S_SM_DPauth_ECDSA)(tc_step;non_wire)
249    // test-tool internal preparation (no APDU face): runtime-domain
250    // values per CaseIR unresolved (G Annex B generation rules);
251    // no fabricated bytes emitted here.
252
253    // 步骤 8:Seq#02] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ26_029, RQ26_005, RQ26_006, RQ26_007, RQ26_008, RQ26_034, RQ26_035, RQ31_025, RQ31_046, RQ31_047, RQ31_048, RQ31_049, RQ31_050, RQ31_051, RQ31_053, RQ31_054, RQ31_055, RQ31_076, RQ31_077, RQ42_001, RQ43_001, RQ43_002, RQ45_002, RQ55_004, RQ55_005, RQ57_094, RQ57_095, RQ57_096, RQ57_097, RQ57_098, RQ57_099, RQ57_101, RQ57_102, RQ57_103, RQ57_104, RQ57_105, RQ57_106, RQ57_107, RQ57_108)
254    // dynamic-template 多占位运行时绑定(B-5;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;模板 tag 权威 = SGP.22 §5.7.13 + AUTOMATIC TAGS + 黄金切片线缆三源对账)
255    var dt8Tid = "";
256    var dt8Sc = "";
257    for (var dt8Ri = 0; dt8Ri < 16; dt8Ri++) {
258        dt8Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
259        dt8Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
260    }
261    var dt8PkList = BindEs10xSingleRequest.parseBerTlv(gw5.fields["AA"] || "");
262    var dt8CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
263    var dt8Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
264    var dt8Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
265    var dt8Sel = -1;
266    for (var dt8Pi = 0; dt8Pi < dt8PkList.length && dt8Sel < 0; dt8Pi++) {
267        for (var dt8Mi = 0; dt8Mi < dt8CiIds.length; dt8Mi++) {
268            if (dt8PkList[dt8Pi].value === dt8CiIds[dt8Mi]) { dt8Sel = dt8Mi; break; }
269        }
270    }
271    var dt8SkiSel = dt8Sel;
272    var dt8Sks = ["0A7CC1C244E60C52CD5B7807AB8C360C26524601507DCABC5DD598B5A616D5D5", "93FB33D0584F349B07F8B5D2AF93D7C3E354B349A3B913502E6ABC070E4D4929"];
273    var dt8Ctx = "801730343338362D41475946542D41373459382D3346383135A130800400000000A12880030500008103080000820301000083030100008403020000850302000086030900008703020100";
274    if (dt8Sel < 0 || dt8SkiSel < 0) {
275        bind.checkData("S8-C1 SW", "9000", "dt8_not_executed:no_usable_material_set");
276        bind.checkData("S8-C2 structure_ok", "1", "0");
277        bind.checkData("S8-C3 transactionId echo", dt8Tid, "dt8_not_executed:no_usable_material_set");
278        bind.checkData("S8-C4 serverChallenge echo", dt8Sc, "dt8_not_executed:no_usable_material_set");
279        bind.checkData("S8-C5 sig_verify", "1", "0");
280        bind.checkData("S8-C6 ctxParams1 echo", dt8Ctx, "dt8_not_executed:no_usable_material_set");
281    } else {
282        bind.engine.InitEccDomainParams(dt8Dps[dt8Sel][0], dt8Dps[dt8Sel][1], dt8Dps[dt8Sel][2], dt8Dps[dt8Sel][3], dt8Dps[dt8Sel][4], 1);
283        var dt8S1 = BindEs10xSingleRequest.buildTlv("30",
284            BindEs10xSingleRequest.buildTlv("80", dt8Tid)
285            + BindEs10xSingleRequest.buildTlv("81", gw6.fields["80"] || "")
286            + BindEs10xSingleRequest.buildTlv("83", "1674657374736D6470706C7573312E6578616D706C652E636F6D")
287            + BindEs10xSingleRequest.buildTlv("84", dt8Sc));
288        var dt8Sgn = "";
289        while (dt8Sgn.length != 2 * dt8Sks[dt8Sel].length) {
290            bind.engine.SleepTime(2000);
291            dt8Sgn = bind.engine.EccSignData(dt8Sks[dt8Sel], dt8S1, 33);
292        }
293        var dt8Asm = BindEs10bAuthServer.assembleAuthenticateServer(
294            {outer: "BF38",
295             signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
296             serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
297            {transactionId: dt8Tid, euiccChallenge: gw6.fields["80"] || "",
298             serverAddress: "1674657374736D6470706C7573312E6578616D706C652E636F6D", serverChallenge: dt8Sc,
299             serverSignature1: dt8Sgn, euiccCiPKIdToBeUsed: dt8CiIds[dt8SkiSel],
300             serverCertificate: dt8Certs[dt8Sel], ctxParams1: dt8Ctx});
301        if (dt8Asm.error) {
302        bind.checkData("S8-C1 SW", "9000", "dt8_assemble_error");
303        bind.checkData("S8-C2 structure_ok", "1", "0");
304        bind.checkData("S8-C3 transactionId echo", dt8Tid, "dt8_assemble_error");
305        bind.checkData("S8-C4 serverChallenge echo", dt8Sc, "dt8_assemble_error");
306        bind.checkData("S8-C5 sig_verify", "1", "0");
307        bind.checkData("S8-C6 ctxParams1 echo", dt8Ctx, "dt8_assemble_error");
308        } else {
309            var dt8Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
310                {cla: "", ins: "E2", p1: "91", p2: "00", data: dt8Asm.request_hex,
311                 le: "00", blockSize: 255, blockSw: "9000", finalSw: "9000"});
312            var dt8Sw = (dt8Run.final && dt8Run.final.sw) ? dt8Run.final.sw : "transport_error";
313            bind.checkData("S8-C1 SW", "9000", dt8Sw);
314            var dt8Ex = BindEs10bAuthServer.extractAuthenticateServer(
315                {outer: "BF38",
316                 ok: {tag: "A0", children: [
317                     {name: "euiccSigned1", tag: "30", children: [
318                         {name: "transactionId", tag: "80"},
319                         {name: "serverAddress", tag: "83"},
320                         {name: "serverChallenge", tag: "84"},
321                         {name: "euiccInfo2", tag: "BF22"},
322                         {name: "ctxParams1", tag: "A0"}]},
323                     {name: "euiccSignature1", tag: "5F37"},
324                     {name: "euiccCertificate", tag: "30"},
325                     {name: "eumCertificate", tag: "30"}]},
326                 error: {tag: "A1", children: [{name: "transactionId", tag: "80"}, {name: "authenticateErrorCode", tag: "81"}]}},
327                dt8Run.final ? dt8Run.final.resp : "");
328            var dt8OkBr = dt8Ex.branch === "ok" && dt8Ex.ok && dt8Ex.ok.missing.length === 0 && dt8Ex.ok.fields.euiccSigned1.children.missing.length === 0;
329            var dt8ErrBr = dt8Ex.branch === "error" && dt8Ex.error && dt8Ex.error.missing.length === 0;
330            bind.checkData("S8-C2 R_AUTH_SMDP_MATCH_ID authenticateResponseOk structure", "1", dt8OkBr ? "1" : "0");
331            bind.checkData("S8-C3 transactionId echo", dt8Tid,
332                dt8OkBr ? dt8Ex.ok.fields.euiccSigned1.children.fields.transactionId.value
333                : (dt8ErrBr ? dt8Ex.error.fields.transactionId.value : "branch_absent"));
334            bind.checkData("S8-C4 serverChallenge echo", dt8Sc,
335                dt8OkBr ? dt8Ex.ok.fields.euiccSigned1.children.fields.serverChallenge.value : "branch_absent");
336            // S8-C5: euiccSignature1 验签(engine EccVerifySign,vendor CommonArith Ecc_Verify ABI 同机制):PK 自响应 euiccCertificate subjectPublicKey BIT STRING 机械提取(X.509:03 42 00 04 || x||y,SEC1 非压缩点——自 04 前缀起取 65B/130hex,对齐 vendor X_509.js subjectPublicKey.substr(2)),签名明文 = euiccSigned1 完整 TLV(RQ26_035 编码后数据对象)。
337            var dt8Pk = "";
338            if (dt8OkBr) {
339                var dt8CertH = dt8Ex.ok.fields.euiccCertificate.value;
340                var dt8Ki = dt8CertH.indexOf("03420004");
341                if (dt8Ki >= 0 && dt8Ki + 6 + 130 <= dt8CertH.length) {
342                    dt8Pk = dt8CertH.substring(dt8Ki + 6, dt8Ki + 6 + 130);
343                }
344            }
345            var dt8ES1 = "";
346            if (dt8OkBr) {
347                var dt8ESc = dt8Ex.ok.fields.euiccSigned1.children.fields;
348                dt8ES1 = BindEs10xSingleRequest.buildTlv("30",
349                    BindEs10xSingleRequest.buildTlv("80", dt8ESc.transactionId.value)
350                    + BindEs10xSingleRequest.buildTlv("83", dt8ESc.serverAddress.value)
351                    + BindEs10xSingleRequest.buildTlv("84", dt8ESc.serverChallenge.value)
352                    + BindEs10xSingleRequest.buildTlv("BF22", dt8ESc.euiccInfo2.value)
353                    + BindEs10xSingleRequest.buildTlv("A0", dt8ESc.ctxParams1.value));
354            }
355            bind.checkData("S8-C5 euiccSignature1 verify", "1",
356                (dt8OkBr && dt8Pk !== "" && dt8ES1 !== ""
357                 && bind.engine.EccVerifySign(dt8Pk, dt8ES1,
358 dt8Ex.ok.fields.euiccSignature1.value, 33) != 0) ? "1" : "0");
359            bind.checkData("S8-C6 ctxParams1 echo", dt8Ctx,
360                dt8OkBr ? dt8Ex.ok.fields.euiccSigned1.children.fields.ctxParams1.value : "branch_absent");
361        }
362    }
363
364    // 步骤 9:Seq#03] MTD_STORE_DATA(tc_step)
365    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
366    var sdCla9 = s17.chan !== null ? (s17.chan <= 3 ? 128 + s17.chan : 188 + s17.chan).toString(16).toUpperCase() : null;
367    var s9 = bind.sendApdu(sdCla9, "E2", "91", "00", "BF2000", "00", "9000");
368    bind.checkData("S9-C1 SW", "9000", s9.sw);
369    // geca-proc ES10b Info 响应面(R_EUICC_INFO1,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
370    var gw9 = BindGecaProc.parseGecaResponse(s9.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
371    bind.checkData("S9-C2 R_EUICC_INFO1 outer tag", "BF20", gw9.outer_tag === null ? "absent" : gw9.outer_tag);
372    bind.checkData("S9-C2 R_EUICC_INFO1 required members present", "1", gw9.ok ? "1" : "0");
373    var pkV9 = BindEs10xSingleRequest.parseBerTlv(gw9.fields["A9"] || "");
374    var pkS9 = BindEs10xSingleRequest.parseBerTlv(gw9.fields["AA"] || "");
375    var samePk9 = false;
376    for (var pvi9 = 0; pvi9 < pkV9.length; pvi9++) {
377        for (var psi9 = 0; psi9 < pkS9.length; psi9++) {
378            if (pkV9[pvi9].value !== "" && pkV9[pvi9].value === pkS9[psi9].value) { samePk9 = true; }
379        }
380    }
381    bind.checkData("S9-C3 CI PK lists share at least one key id", "1", samePk9 ? "1" : "0");
382
383    // 步骤 10:Seq#03] MTD_STORE_DATA(tc_step)
384    // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
385    var sdCla10 = s17.chan !== null ? (s17.chan <= 3 ? 128 + s17.chan : 188 + s17.chan).toString(16).toUpperCase() : null;
386    var s10 = bind.sendApdu(sdCla10, "E2", "91", "00", "BF2E00", "00", "9000");
387    bind.checkData("S10-C1 SW", "9000", s10.sw);
388    // geca-proc ES10b Info 响应面(R_CHALLENGE,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
389    var gw10 = BindGecaProc.parseGecaResponse(s10.resp, {outer: "BF2E", required: ["80"], optional: []});
390    bind.checkData("S10-C2 R_CHALLENGE outer tag", "BF2E", gw10.outer_tag === null ? "absent" : gw10.outer_tag);
391    bind.checkData("S10-C2 R_CHALLENGE required members present", "1", gw10.ok ? "1" : "0");
392    var r2w10 = BindGecaProc.parseGecaResponse(s10.resp, {outer: "BF2E", required: ["80"]});
393    bind.checkData("S10-C2 R_CHALLENGE outer tag", "BF2E", r2w10.outer_tag === null ? "absent" : r2w10.outer_tag);
394    var r2ch10 = null; for (var r2ci10 = 0; r2ci10 < r2w10.children.length; r2ci10++) { if (r2w10.children[r2ci10].tag === "80") { r2ch10 = r2w10.children[r2ci10]; } }
395    var r2chal10 = r2ch10 === null ? "" : r2ch10.value;
396    bind.checkData("S10-C2 tagOfeuiccChallenge", "80", r2ch10 === null ? "absent" : r2ch10.tag);
397    bind.checkData("S10-C2 lengthOfeuiccChallenge", "10", r2ch10 === null ? "absent" : (r2ch10.len < 16 ? ("0" + r2ch10.len.toString(16).toUpperCase()) : r2ch10.len.toString(16).toUpperCase()));
398
399    // 步骤 11:Seq#03] Step4 输入准备:同 Seq#01 Step3(含 IMEI 场景设备信息 #S_DEVICE_INFO_IMEI 经 #CTX_PARAMS1_IMEI 引入请求)(tc_step;non_wire)
400    // test-tool internal preparation (no APDU face): runtime-domain
401    // values per CaseIR unresolved (G Annex B generation rules);
402    // no fabricated bytes emitted here.
403
404    // 步骤 12:Seq#03] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ26_029, RQ26_005, RQ26_006, RQ26_007, RQ26_008, RQ26_034, RQ26_035, RQ31_025, RQ31_046, RQ31_047, RQ31_048, RQ31_049, RQ31_050, RQ31_051, RQ31_053, RQ31_054, RQ31_055, RQ31_076, RQ42_001, RQ43_001, RQ43_002, RQ45_002, RQ55_004, RQ55_005, RQ57_094, RQ57_095, RQ57_096, RQ57_097, RQ57_098, RQ57_099, RQ57_101, RQ57_102, RQ57_103, RQ57_104, RQ57_105, RQ57_106, RQ57_107, RQ57_108)
405    // dynamic-template 多占位运行时绑定(B-5;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;模板 tag 权威 = SGP.22 §5.7.13 + AUTOMATIC TAGS + 黄金切片线缆三源对账)
406    var dt12Tid = "";
407    var dt12Sc = "";
408    for (var dt12Ri = 0; dt12Ri < 16; dt12Ri++) {
409        dt12Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
410        dt12Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
411    }
412    var dt12PkList = BindEs10xSingleRequest.parseBerTlv(gw9.fields["AA"] || "");
413    var dt12CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
414    var dt12Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
415    var dt12Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
416    var dt12Sel = -1;
417    for (var dt12Pi = 0; dt12Pi < dt12PkList.length && dt12Sel < 0; dt12Pi++) {
418        for (var dt12Mi = 0; dt12Mi < dt12CiIds.length; dt12Mi++) {
419            if (dt12PkList[dt12Pi].value === dt12CiIds[dt12Mi]) { dt12Sel = dt12Mi; break; }
420        }
421    }
422    var dt12SkiSel = dt12Sel;
423    var dt12Sks = ["0A7CC1C244E60C52CD5B7807AB8C360C26524601507DCABC5DD598B5A616D5D5", "93FB33D0584F349B07F8B5D2AF93D7C3E354B349A3B913502E6ABC070E4D4929"];
424    var dt12Ctx = "A13A800400000000A1288003050000810308000082030100008303010000840302000085030200008603090000870302010082080000000011111111";
425    if (dt12Sel < 0 || dt12SkiSel < 0) {
426        bind.checkData("S12-C1 SW", "9000", "dt12_not_executed:no_usable_material_set");
427        bind.checkData("S12-C2 structure_ok", "1", "0");
428        bind.checkData("S12-C3 transactionId echo", dt12Tid, "dt12_not_executed:no_usable_material_set");
429        bind.checkData("S12-C4 serverChallenge echo", dt12Sc, "dt12_not_executed:no_usable_material_set");
430        bind.checkData("S12-C5 sig_verify", "1", "0");
431        bind.checkData("S12-C6 ctxParams1 echo", dt12Ctx, "dt12_not_executed:no_usable_material_set");
432    } else {
433        bind.engine.InitEccDomainParams(dt12Dps[dt12Sel][0], dt12Dps[dt12Sel][1], dt12Dps[dt12Sel][2], dt12Dps[dt12Sel][3], dt12Dps[dt12Sel][4], 1);
434        var dt12S1 = BindEs10xSingleRequest.buildTlv("30",
435            BindEs10xSingleRequest.buildTlv("80", dt12Tid)
436            + BindEs10xSingleRequest.buildTlv("81", gw10.fields["80"] || "")
437            + BindEs10xSingleRequest.buildTlv("83", "1674657374736D6470706C7573312E6578616D706C652E636F6D")
438            + BindEs10xSingleRequest.buildTlv("84", dt12Sc));
439        var dt12Sgn = "";
440        while (dt12Sgn.length != 2 * dt12Sks[dt12Sel].length) {
441            bind.engine.SleepTime(2000);
442            dt12Sgn = bind.engine.EccSignData(dt12Sks[dt12Sel], dt12S1, 33);
443        }
444        var dt12Asm = BindEs10bAuthServer.assembleAuthenticateServer(
445            {outer: "BF38",
446             signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
447             serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
448            {transactionId: dt12Tid, euiccChallenge: gw10.fields["80"] || "",
449             serverAddress: "1674657374736D6470706C7573312E6578616D706C652E636F6D", serverChallenge: dt12Sc,
450             serverSignature1: dt12Sgn, euiccCiPKIdToBeUsed: dt12CiIds[dt12SkiSel],
451             serverCertificate: dt12Certs[dt12Sel], ctxParams1: dt12Ctx});
452        if (dt12Asm.error) {
453        bind.checkData("S12-C1 SW", "9000", "dt12_assemble_error");
454        bind.checkData("S12-C2 structure_ok", "1", "0");
455        bind.checkData("S12-C3 transactionId echo", dt12Tid, "dt12_assemble_error");
456        bind.checkData("S12-C4 serverChallenge echo", dt12Sc, "dt12_assemble_error");
457        bind.checkData("S12-C5 sig_verify", "1", "0");
458        bind.checkData("S12-C6 ctxParams1 echo", dt12Ctx, "dt12_assemble_error");
459        } else {
460            var dt12Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
461                {cla: "", ins: "E2", p1: "91", p2: "00", data: dt12Asm.request_hex,
462                 le: "00", blockSize: 255, blockSw: "9000", finalSw: "9000"});
463            var dt12Sw = (dt12Run.final && dt12Run.final.sw) ? dt12Run.final.sw : "transport_error";
464            bind.checkData("S12-C1 SW", "9000", dt12Sw);
465            var dt12Ex = BindEs10bAuthServer.extractAuthenticateServer(
466                {outer: "BF38",
467                 ok: {tag: "A0", children: [
468                     {name: "euiccSigned1", tag: "30", children: [
469                         {name: "transactionId", tag: "80"},
470                         {name: "serverAddress", tag: "83"},
471                         {name: "serverChallenge", tag: "84"},
472                         {name: "euiccInfo2", tag: "BF22"},
473                         {name: "ctxParams1", tag: "A0"}]},
474                     {name: "euiccSignature1", tag: "5F37"},
475                     {name: "euiccCertificate", tag: "30"},
476                     {name: "eumCertificate", tag: "30"}]},
477                 error: {tag: "A1", children: [{name: "transactionId", tag: "80"}, {name: "authenticateErrorCode", tag: "81"}]}},
478                dt12Run.final ? dt12Run.final.resp : "");
479            var dt12OkBr = dt12Ex.branch === "ok" && dt12Ex.ok && dt12Ex.ok.missing.length === 0 && dt12Ex.ok.fields.euiccSigned1.children.missing.length === 0;
480            var dt12ErrBr = dt12Ex.branch === "error" && dt12Ex.error && dt12Ex.error.missing.length === 0;
481            bind.checkData("S12-C2 R_AUTH_SMDP_IMEI authenticateResponseOk structure", "1", dt12OkBr ? "1" : "0");
482            bind.checkData("S12-C3 transactionId echo", dt12Tid,
483                dt12OkBr ? dt12Ex.ok.fields.euiccSigned1.children.fields.transactionId.value
484                : (dt12ErrBr ? dt12Ex.error.fields.transactionId.value : "branch_absent"));
485            bind.checkData("S12-C4 serverChallenge echo", dt12Sc,
486                dt12OkBr ? dt12Ex.ok.fields.euiccSigned1.children.fields.serverChallenge.value : "branch_absent");
487            // S12-C5: euiccSignature1 验签(engine EccVerifySign,vendor CommonArith Ecc_Verify ABI 同机制):PK 自响应 euiccCertificate subjectPublicKey BIT STRING 机械提取(X.509:03 42 00 04 || x||y,SEC1 非压缩点——自 04 前缀起取 65B/130hex,对齐 vendor X_509.js subjectPublicKey.substr(2)),签名明文 = euiccSigned1 完整 TLV(RQ26_035 编码后数据对象)。
488            var dt12Pk = "";
489            if (dt12OkBr) {
490                var dt12CertH = dt12Ex.ok.fields.euiccCertificate.value;
491                var dt12Ki = dt12CertH.indexOf("03420004");
492                if (dt12Ki >= 0 && dt12Ki + 6 + 130 <= dt12CertH.length) {
493                    dt12Pk = dt12CertH.substring(dt12Ki + 6, dt12Ki + 6 + 130);
494                }
495            }
496            var dt12ES1 = "";
497            if (dt12OkBr) {
498                var dt12ESc = dt12Ex.ok.fields.euiccSigned1.children.fields;
499                dt12ES1 = BindEs10xSingleRequest.buildTlv("30",
500                    BindEs10xSingleRequest.buildTlv("80", dt12ESc.transactionId.value)
501                    + BindEs10xSingleRequest.buildTlv("83", dt12ESc.serverAddress.value)
502                    + BindEs10xSingleRequest.buildTlv("84", dt12ESc.serverChallenge.value)
503                    + BindEs10xSingleRequest.buildTlv("BF22", dt12ESc.euiccInfo2.value)
504                    + BindEs10xSingleRequest.buildTlv("A0", dt12ESc.ctxParams1.value));
505            }
506            bind.checkData("S12-C5 euiccSignature1 verify", "1",
507                (dt12OkBr && dt12Pk !== "" && dt12ES1 !== ""
508                 && bind.engine.EccVerifySign(dt12Pk, dt12ES1,
509 dt12Ex.ok.fields.euiccSignature1.value, 33) != 0) ? "1" : "0");
510            bind.checkData("S12-C6 ctxParams1 echo", dt12Ctx,
511                dt12OkBr ? dt12Ex.ok.fields.euiccSigned1.children.fields.ctxParams1.value : "branch_absent");
512        }
513    }
514}
515

完整 unified diff

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

展开 diff(726 行)
--- -man
+++ -cas
@@ -1,210 +1,515 @@
-// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST_01_Nominal_Without_MatchingID_in_CtxParams1 + TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST_02_Nominal_With_MatchingID_in_CtxParams1 + TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST_03_Nominal_With_IMEI_in_Device_Capabilities (extracted verbatim)
-
-function TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST_01_Nominal_Without_MatchingID_in_CtxParams1()
-{
-	
-	//测试入口条件
-	if(!check_Applicability_of_tests_RSP_SGP23_test("C001"))
-		return;
-	
-	tracenamestr = "测试目的:执行AuthenticateServer指令,CtxParams1中没有MatchingID";
-	curDis.TraceStart(sno++,tracenamestr);
-
-	curDis.TestStepStart2(stno++,"复位;");
-	ResetCard();
-	
-	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;");
-	TS_SELECT("Select ISD",ISD_R_AID,"9000");
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
-	pkId_CI_ForVerification = pkId_CI_ECDSA_NIST;
-	pkId_CI_ForSigning = pkId_CI_ECDSA_NIST;	
-
-	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();
-
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
-	Profile_load_procedure.ES10b_GetEUICCChallenge();
-
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
-	var DeviceCapabilities1 = new DeviceCapabilities();
-	DeviceCapabilities1.gsmSupportedRelease = "050000";
-	DeviceCapabilities1.utranSupportedRelease = "080000";
-	DeviceCapabilities1.cdma2000onexSupportedRelease = "010000";	
-	DeviceCapabilities1.cdma2000hrpdSupportedRelease = "010000";
-	DeviceCapabilities1.cdma2000ehrpdSupportedRelease = "020000";
-	DeviceCapabilities1.eutranSupportedRelease = "020000";
-	DeviceCapabilities1.contactlessSupportedRelease = "090000";
-	DeviceCapabilities1.rspCrlSupportedVersion = "020100";
-	
-	var DeviceInfo1 = new DeviceInfo();
-	DeviceInfo1.tac = "00000000";
-	DeviceInfo1.deviceCapabilities = DeviceCapabilities1.GenHexData();
-	
-	var CtxParamsForCommonAuthentication1 =new CtxParamsForCommonAuthentication();
-	CtxParamsForCommonAuthentication1.deviceInfo = DeviceInfo1.GenHexData();
-	
-	ctxParamsForCommonAuthentication=CtxParamsForCommonAuthentication1.GenHexData();
-	
-	Profile_load_procedure.ES10b_AuthenticateServer();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest;");
-	Profile_load_procedure.ES10b_PrepareDownload();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccDataRequest(GetEID);");
-	Profile_load_procedure.ES10b_GetEID();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行BoundProfilePackage;--空Proprietary 数据");
-	Profile_load_procedure.ES10b_LoadBoundProfilePackage();
-	
-	RecoverCard();
-	
-}
-
-function TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST_02_Nominal_With_MatchingID_in_CtxParams1()
-{
-	
-	//测试入口条件
-	if(!check_Applicability_of_tests_RSP_SGP23_test("C001"))
-		return;
-	
-	tracenamestr = "测试目的:执行AuthenticateServer指令,CtxParams1中有MatchingID";
-	curDis.TraceStart(sno++,tracenamestr);
-
-	curDis.TestStepStart2(stno++,"复位;");
-	ResetCard();
-	
-	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;");
-	TS_SELECT("Select ISD",ISD_R_AID,"9000");
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
-	pkId_CI_ForVerification = pkId_CI_ECDSA_NIST;
-	pkId_CI_ForSigning = pkId_CI_ECDSA_NIST;
-	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();
-	
-
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
-	Profile_load_procedure.ES10b_GetEUICCChallenge();
-
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
-	var DeviceCapabilities1 = new DeviceCapabilities();
-	DeviceCapabilities1.gsmSupportedRelease = "050000";
-	DeviceCapabilities1.utranSupportedRelease = "080000";
-	DeviceCapabilities1.cdma2000onexSupportedRelease = "010000";	
-	DeviceCapabilities1.cdma2000hrpdSupportedRelease = "010000";
-	DeviceCapabilities1.cdma2000ehrpdSupportedRelease = "020000";
-	DeviceCapabilities1.eutranSupportedRelease = "020000";
-	DeviceCapabilities1.contactlessSupportedRelease = "090000";
-	DeviceCapabilities1.rspCrlSupportedVersion = "020100";
-	
-	var DeviceInfo1 = new DeviceInfo();
-	DeviceInfo1.tac = "00000000";
-	DeviceInfo1.deviceCapabilities = DeviceCapabilities1.GenHexData();
-	
-	var CtxParamsForCommonAuthentication1 =new CtxParamsForCommonAuthentication();
-	CtxParamsForCommonAuthentication1.matchingId = "30343338362D41475946542D41373459382D3346383135";	
-	CtxParamsForCommonAuthentication1.deviceInfo = DeviceInfo1.GenHexData();
-	ctxParamsForCommonAuthentication = CtxParamsForCommonAuthentication1.GenHexData();
-	
-	Profile_load_procedure.ES10b_AuthenticateServer();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest;");
-	Profile_load_procedure.ES10b_PrepareDownload();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccDataRequest(GetEID);");
-	Profile_load_procedure.ES10b_GetEID();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行BoundProfilePackage;--空Proprietary 数据");
-	Profile_load_procedure.ES10b_LoadBoundProfilePackage();
-	
-	RecoverCard();
-}
-
-function TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST_03_Nominal_With_IMEI_in_Device_Capabilities()
-{
-
-	//测试入口条件
-	if(!check_Applicability_of_tests_RSP_SGP23_test("C001"))
-		return;
-	
-	tracenamestr = "测试目的:执行AuthenticateServer指令,Device Capabilities中带有IMEI";
-	curDis.TraceStart(sno++,tracenamestr);
-
-	curDis.TestStepStart2(stno++,"复位;");
-	ResetCard();
-	
-	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;");
-	TS_SELECT("Select ISD",ISD_R_AID,"9000");
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
-	pkId_CI_ForVerification = pkId_CI_ECDSA_NIST;
-	pkId_CI_ForSigning = pkId_CI_ECDSA_NIST;
-
-	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();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
-	Profile_load_procedure.ES10b_GetEUICCChallenge();
-
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
-	var DeviceCapabilities1 = new DeviceCapabilities();
-	DeviceCapabilities1.gsmSupportedRelease = "050000";
-	DeviceCapabilities1.utranSupportedRelease = "080000";
-	DeviceCapabilities1.cdma2000onexSupportedRelease = "010000";	
-	DeviceCapabilities1.eutranSupportedRelease = "020000";
-	
-	var DeviceInfo1 = new DeviceInfo();
-	DeviceInfo1.tac = "00000000";
-	DeviceInfo1.deviceCapabilities = DeviceCapabilities1.GenHexData();
-	DeviceInfo1.imei = "0000000011111111";
-	
-	var CtxParamsForCommonAuthentication1 =new CtxParamsForCommonAuthentication();
-	CtxParamsForCommonAuthentication1.deviceInfo = DeviceInfo1.GenHexData();
-	ctxParamsForCommonAuthentication=CtxParamsForCommonAuthentication1.GenHexData();
-	
-	Profile_load_procedure.ES10b_AuthenticateServer();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest;");
-	Profile_load_procedure.ES10b_PrepareDownload();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccDataRequest(GetEID);");
-	Profile_load_procedure.ES10b_GetEID();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行BoundProfilePackage;--空Proprietary 数据");
-	Profile_load_procedure.ES10b_LoadBoundProfilePackage();
-	
-	RecoverCard();
+// Author: 卡思Cas智能体
+// Date: 20261004-022633
+// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10b.AuthenticateServer_SM-DP+_NIST,Test Sequence #01-#03 Nominal(本 TC 全部 3 条 Test Sequence 合并展开),适用性 C001。
+// 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 R_EUICC_INFO1 outer tag
+//   S1-C2 R_EUICC_INFO1 required members present;S1-C3 CI PK lists share at least one key id
+//   S2-C1 SW;S2-C2 R_CHALLENGE outer tag;S2-C2 R_CHALLENGE required members present
+//   S2-C2 tagOfeuiccChallenge;S2-C2 lengthOfeuiccChallenge;S4-C1 SW;S4-C2 structure_ok
+//   S4-C3 transactionId echo;S4-C4 serverChallenge echo;S4-C5 sig_verify;S4-C6 ctxParams1 echo
+//   S4-C2 R_AUTHENTICATE_SMDP authenticateResponseOk structure;S4-C5 euiccSignature1 verify
+//   S5-C1 SW;S5-C2 R_EUICC_INFO1 outer tag;S5-C2 R_EUICC_INFO1 required members present
+//   S5-C3 CI PK lists share at least one key id;S6-C1 SW;S6-C2 R_CHALLENGE outer tag
+//   S6-C2 R_CHALLENGE required members present;S6-C2 tagOfeuiccChallenge
+//   S6-C2 lengthOfeuiccChallenge;S8-C1 SW;S8-C2 structure_ok;S8-C3 transactionId echo
+//   S8-C4 serverChallenge echo;S8-C5 sig_verify;S8-C6 ctxParams1 echo
+//   S8-C2 R_AUTH_SMDP_MATCH_ID authenticateResponseOk structure;S8-C5 euiccSignature1 verify
+//   S9-C1 SW;S9-C2 R_EUICC_INFO1 outer tag;S9-C2 R_EUICC_INFO1 required members present
+//   S9-C3 CI PK lists share at least one key id;S10-C1 SW;S10-C2 R_CHALLENGE outer tag
+//   S10-C2 R_CHALLENGE required members present;S10-C2 tagOfeuiccChallenge
+//   S10-C2 lengthOfeuiccChallenge;S12-C1 SW;S12-C2 structure_ok;S12-C3 transactionId echo
+//   S12-C4 serverChallenge echo;S12-C5 sig_verify;S12-C6 ctxParams1 echo
+//   S12-C2 R_AUTH_SMDP_IMEI authenticateResponseOk structure;S12-C5 euiccSignature1 verify
+// 本函数由 CaseIR 4.2.18.2.1 编译生成(4.2.18.2.1-TC_eUICC_ES10b.AuthenticateServer_SM-DP+_NIST-20261004_022633,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).
+// 适用性 C001:编译期门,运行时由 harness 环境前置承担。
+function TC_eUICC_ES10b_AuthenticateServer_SM_DP_NIST_01_03_Nominal_TC_3_Test_Sequence() {
+    var bind = curBind;
+
+    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 1):RESET(K 语料机械展开)
+    var s13 = bind.resetAndAtr();
+    bind.checkData("ICH-IC1-K1-C1 ATR_present", "1", s13.atr_hex !== "" ? "1" : "0");
+
+    // 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 s14 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
+    bind.checkData("ICH-IC1-K2-C2 FCP_Template", "1", s14.resp.length > 0 ? "1" : "0");
+    bind.checkData("ICH-IC1-K2-C4 SW", "9000", s14.sw);
+
+    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 3):TERMINAL_CAPABILITY_LPAd(K 语料机械展开)
+    var s15 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
+    bind.checkData("ICH-IC1-K3-C4 SW", "9000", s15.sw);
+
+    // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 4):TERMINAL_PROFILE(K 语料机械展开)
+    var steady16 = bind.runToSteadyState(function () {
+        return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
+    });
+    bind.checkData("ICH-IC1-K4-C4 final SW", "9000", steady16.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 s17 = bind.manageChannelOpen("9000");
+    bind.checkData("ICH-IC2-K1-C4 SW", "9000", s17.sw);
+    bind.checkData("ICH-IC2-K1-C3 CHANNEL_NUMBER extracted", "1", s17.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 s18 = 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", s18.sw);
+
+    // 步骤 1:Seq#01] 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 sdCla1 = s17.chan !== null ? (s17.chan <= 3 ? 128 + s17.chan : 188 + s17.chan).toString(16).toUpperCase() : null;
+    var s1 = bind.sendApdu(sdCla1, "E2", "91", "00", "BF2000", "00", "9000");
+    bind.checkData("S1-C1 SW", "9000", s1.sw);
+    // geca-proc ES10b Info 响应面(R_EUICC_INFO1,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
+    var gw1 = BindGecaProc.parseGecaResponse(s1.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
+    bind.checkData("S1-C2 R_EUICC_INFO1 outer tag", "BF20", gw1.outer_tag === null ? "absent" : gw1.outer_tag);
+    bind.checkData("S1-C2 R_EUICC_INFO1 required members present", "1", gw1.ok ? "1" : "0");
+    var pkV1 = BindEs10xSingleRequest.parseBerTlv(gw1.fields["A9"] || "");
+    var pkS1 = BindEs10xSingleRequest.parseBerTlv(gw1.fields["AA"] || "");
+    var samePk1 = false;
+    for (var pvi1 = 0; pvi1 < pkV1.length; pvi1++) {
+        for (var psi1 = 0; psi1 < pkS1.length; psi1++) {
+            if (pkV1[pvi1].value !== "" && pkV1[pvi1].value === pkS1[psi1].value) { samePk1 = true; }
+        }
+    }
+    bind.checkData("S1-C3 CI PK lists share at least one key id", "1", samePk1 ? "1" : "0");
+
+    // 步骤 2:Seq#01] 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 sdCla2 = s17.chan !== null ? (s17.chan <= 3 ? 128 + s17.chan : 188 + s17.chan).toString(16).toUpperCase() : null;
+    var s2 = bind.sendApdu(sdCla2, "E2", "91", "00", "BF2E00", "00", "9000");
+    bind.checkData("S2-C1 SW", "9000", s2.sw);
+    // geca-proc ES10b Info 响应面(R_CHALLENGE,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
+    var gw2 = BindGecaProc.parseGecaResponse(s2.resp, {outer: "BF2E", required: ["80"], optional: []});
+    bind.checkData("S2-C2 R_CHALLENGE outer tag", "BF2E", gw2.outer_tag === null ? "absent" : gw2.outer_tag);
+    bind.checkData("S2-C2 R_CHALLENGE required members present", "1", gw2.ok ? "1" : "0");
+    var r2w2 = BindGecaProc.parseGecaResponse(s2.resp, {outer: "BF2E", required: ["80"]});
+    bind.checkData("S2-C2 R_CHALLENGE outer tag", "BF2E", r2w2.outer_tag === null ? "absent" : r2w2.outer_tag);
+    var r2ch2 = null; for (var r2ci2 = 0; r2ci2 < r2w2.children.length; r2ci2++) { if (r2w2.children[r2ci2].tag === "80") { r2ch2 = r2w2.children[r2ci2]; } }
+    var r2chal2 = r2ch2 === null ? "" : r2ch2.value;
+    bind.checkData("S2-C2 tagOfeuiccChallenge", "80", r2ch2 === null ? "absent" : r2ch2.tag);
+    bind.checkData("S2-C2 lengthOfeuiccChallenge", "10", r2ch2 === null ? "absent" : (r2ch2.len < 16 ? ("0" + r2ch2.len.toString(16).toUpperCase()) : r2ch2.len.toString(16).toUpperCase()));
+
+    // 步骤 3:Seq#01] Step4 输入准备(InitiateAuthentication):<S_TRANSACTION_ID>、<EUICC_CHALLENGE>、<S_SMDP_CHALLENGE>、<S_SMDP_SIGNATURE1>;设 <EUICC_CI_PK_ID_TO_BE_USED> 为基于 NIST P-256 的 CI Key ID;选取导向同一 Root CI 的 #CERT_S_SM_DPauth_ECDSA(tc_step;non_wire)
+    // test-tool internal preparation (no APDU face): runtime-domain
+    // values per CaseIR unresolved (G Annex B generation rules);
+    // no fabricated bytes emitted here.
+
+    // 步骤 4:Seq#01] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ26_029, RQ26_005, RQ26_006, RQ26_007, RQ26_008, RQ26_034, RQ26_035, RQ31_025, RQ31_046, RQ31_047, RQ31_048, RQ31_049, RQ31_050, RQ31_051, RQ31_053, RQ31_054, RQ31_055, RQ31_076, RQ31_079, RQ42_001, RQ43_001, RQ43_002, RQ45_002, RQ55_004, RQ55_005, RQ57_094, RQ57_095, RQ57_096, RQ57_097, RQ57_098, RQ57_099, RQ57_101, RQ57_102, RQ57_103, RQ57_104, RQ57_105, RQ57_106, RQ57_107, RQ57_108)
+    // dynamic-template 多占位运行时绑定(B-5;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;模板 tag 权威 = SGP.22 §5.7.13 + AUTOMATIC TAGS + 黄金切片线缆三源对账)
+    var dt4Tid = "";
+    var dt4Sc = "";
+    for (var dt4Ri = 0; dt4Ri < 16; dt4Ri++) {
+        dt4Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+        dt4Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+    }
+    var dt4PkList = BindEs10xSingleRequest.parseBerTlv(gw1.fields["AA"] || "");
+    var dt4CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
+    var dt4Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
+    var dt4Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+    var dt4Sel = -1;
+    for (var dt4Pi = 0; dt4Pi < dt4PkList.length && dt4Sel < 0; dt4Pi++) {
+        for (var dt4Mi = 0; dt4Mi < dt4CiIds.length; dt4Mi++) {
+            if (dt4PkList[dt4Pi].value === dt4CiIds[dt4Mi]) { dt4Sel = dt4Mi; break; }
+        }
+    }
+    var dt4SkiSel = dt4Sel;
+    var dt4Sks = ["0A7CC1C244E60C52CD5B7807AB8C360C26524601507DCABC5DD598B5A616D5D5", "93FB33D0584F349B07F8B5D2AF93D7C3E354B349A3B913502E6ABC070E4D4929"];
+    var dt4Ctx = "A130800400000000A12880030500008103080000820301000083030100008403020000850302000086030900008703020100";
+    if (dt4Sel < 0 || dt4SkiSel < 0) {
+        bind.checkData("S4-C1 SW", "9000", "dt4_not_executed:no_usable_material_set");
+        bind.checkData("S4-C2 structure_ok", "1", "0");
+        bind.checkData("S4-C3 transactionId echo", dt4Tid, "dt4_not_executed:no_usable_material_set");
+        bind.checkData("S4-C4 serverChallenge echo", dt4Sc, "dt4_not_executed:no_usable_material_set");
+        bind.checkData("S4-C5 sig_verify", "1", "0");
+        bind.checkData("S4-C6 ctxParams1 echo", dt4Ctx, "dt4_not_executed:no_usable_material_set");
+    } else {
+        bind.engine.InitEccDomainParams(dt4Dps[dt4Sel][0], dt4Dps[dt4Sel][1], dt4Dps[dt4Sel][2], dt4Dps[dt4Sel][3], dt4Dps[dt4Sel][4], 1);
+        var dt4S1 = BindEs10xSingleRequest.buildTlv("30",
+            BindEs10xSingleRequest.buildTlv("80", dt4Tid)
+            + BindEs10xSingleRequest.buildTlv("81", gw2.fields["80"] || "")
+            + BindEs10xSingleRequest.buildTlv("83", "1674657374736D6470706C7573312E6578616D706C652E636F6D")
+            + BindEs10xSingleRequest.buildTlv("84", dt4Sc));
+        var dt4Sgn = "";
+        while (dt4Sgn.length != 2 * dt4Sks[dt4Sel].length) {
+            bind.engine.SleepTime(2000);
+            dt4Sgn = bind.engine.EccSignData(dt4Sks[dt4Sel], dt4S1, 33);
+        }
+        var dt4Asm = BindEs10bAuthServer.assembleAuthenticateServer(
+            {outer: "BF38",
+             signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
+             serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
+            {transactionId: dt4Tid, euiccChallenge: gw2.fields["80"] || "",
+             serverAddress: "1674657374736D6470706C7573312E6578616D706C652E636F6D", serverChallenge: dt4Sc,
+             serverSignature1: dt4Sgn, euiccCiPKIdToBeUsed: dt4CiIds[dt4SkiSel],
+             serverCertificate: dt4Certs[dt4Sel], ctxParams1: dt4Ctx});
+        if (dt4Asm.error) {
+        bind.checkData("S4-C1 SW", "9000", "dt4_assemble_error");
+        bind.checkData("S4-C2 structure_ok", "1", "0");
+        bind.checkData("S4-C3 transactionId echo", dt4Tid, "dt4_assemble_error");
+        bind.checkData("S4-C4 serverChallenge echo", dt4Sc, "dt4_assemble_error");
+        bind.checkData("S4-C5 sig_verify", "1", "0");
+        bind.checkData("S4-C6 ctxParams1 echo", dt4Ctx, "dt4_assemble_error");
+        } else {
+            var dt4Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+                {cla: "", ins: "E2", p1: "91", p2: "00", data: dt4Asm.request_hex,
+                 le: "00", blockSize: 255, blockSw: "9000", finalSw: "9000"});
+            var dt4Sw = (dt4Run.final && dt4Run.final.sw) ? dt4Run.final.sw : "transport_error";
+            bind.checkData("S4-C1 SW", "9000", dt4Sw);
+            var dt4Ex = BindEs10bAuthServer.extractAuthenticateServer(
+                {outer: "BF38",
+                 ok: {tag: "A0", children: [
+                     {name: "euiccSigned1", tag: "30", children: [
+                         {name: "transactionId", tag: "80"},
+                         {name: "serverAddress", tag: "83"},
+                         {name: "serverChallenge", tag: "84"},
+                         {name: "euiccInfo2", tag: "BF22"},
+                         {name: "ctxParams1", tag: "A0"}]},
+                     {name: "euiccSignature1", tag: "5F37"},
+                     {name: "euiccCertificate", tag: "30"},
+                     {name: "eumCertificate", tag: "30"}]},
+                 error: {tag: "A1", children: [{name: "transactionId", tag: "80"}, {name: "authenticateErrorCode", tag: "81"}]}},
+                dt4Run.final ? dt4Run.final.resp : "");
+            var dt4OkBr = dt4Ex.branch === "ok" && dt4Ex.ok && dt4Ex.ok.missing.length === 0 && dt4Ex.ok.fields.euiccSigned1.children.missing.length === 0;
+            var dt4ErrBr = dt4Ex.branch === "error" && dt4Ex.error && dt4Ex.error.missing.length === 0;
+            bind.checkData("S4-C2 R_AUTHENTICATE_SMDP authenticateResponseOk structure", "1", dt4OkBr ? "1" : "0");
+            bind.checkData("S4-C3 transactionId echo", dt4Tid,
+                dt4OkBr ? dt4Ex.ok.fields.euiccSigned1.children.fields.transactionId.value
+                : (dt4ErrBr ? dt4Ex.error.fields.transactionId.value : "branch_absent"));
+            bind.checkData("S4-C4 serverChallenge echo", dt4Sc,
+                dt4OkBr ? dt4Ex.ok.fields.euiccSigned1.children.fields.serverChallenge.value : "branch_absent");
+            // S4-C5: euiccSignature1 验签(engine EccVerifySign,vendor CommonArith Ecc_Verify ABI 同机制):PK 自响应 euiccCertificate subjectPublicKey BIT STRING 机械提取(X.509:03 42 00 04 || x||y,SEC1 非压缩点——自 04 前缀起取 65B/130hex,对齐 vendor X_509.js subjectPublicKey.substr(2)),签名明文 = euiccSigned1 完整 TLV(RQ26_035 编码后数据对象)。
+            var dt4Pk = "";
+            if (dt4OkBr) {
+                var dt4CertH = dt4Ex.ok.fields.euiccCertificate.value;
+                var dt4Ki = dt4CertH.indexOf("03420004");
+                if (dt4Ki >= 0 && dt4Ki + 6 + 130 <= dt4CertH.length) {
+                    dt4Pk = dt4CertH.substring(dt4Ki + 6, dt4Ki + 6 + 130);
+                }
+            }
+            var dt4ES1 = "";
+            if (dt4OkBr) {
+                var dt4ESc = dt4Ex.ok.fields.euiccSigned1.children.fields;
+                dt4ES1 = BindEs10xSingleRequest.buildTlv("30",
+                    BindEs10xSingleRequest.buildTlv("80", dt4ESc.transactionId.value)
+                    + BindEs10xSingleRequest.buildTlv("83", dt4ESc.serverAddress.value)
+                    + BindEs10xSingleRequest.buildTlv("84", dt4ESc.serverChallenge.value)
+                    + BindEs10xSingleRequest.buildTlv("BF22", dt4ESc.euiccInfo2.value)
+                    + BindEs10xSingleRequest.buildTlv("A0", dt4ESc.ctxParams1.value));
+            }
+            bind.checkData("S4-C5 euiccSignature1 verify", "1",
+                (dt4OkBr && dt4Pk !== "" && dt4ES1 !== ""
+                 && bind.engine.EccVerifySign(dt4Pk, dt4ES1,
+ dt4Ex.ok.fields.euiccSignature1.value, 33) != 0) ? "1" : "0");
+            bind.checkData("S4-C6 ctxParams1 echo", dt4Ctx,
+                dt4OkBr ? dt4Ex.ok.fields.euiccSigned1.children.fields.ctxParams1.value : "branch_absent");
+        }
+    }
+
+    // 步骤 5:Seq#02] 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 sdCla5 = s17.chan !== null ? (s17.chan <= 3 ? 128 + s17.chan : 188 + s17.chan).toString(16).toUpperCase() : null;
+    var s5 = bind.sendApdu(sdCla5, "E2", "91", "00", "BF2000", "00", "9000");
+    bind.checkData("S5-C1 SW", "9000", s5.sw);
+    // geca-proc ES10b Info 响应面(R_EUICC_INFO1,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
+    var gw5 = BindGecaProc.parseGecaResponse(s5.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
+    bind.checkData("S5-C2 R_EUICC_INFO1 outer tag", "BF20", gw5.outer_tag === null ? "absent" : gw5.outer_tag);
+    bind.checkData("S5-C2 R_EUICC_INFO1 required members present", "1", gw5.ok ? "1" : "0");
+    var pkV5 = BindEs10xSingleRequest.parseBerTlv(gw5.fields["A9"] || "");
+    var pkS5 = BindEs10xSingleRequest.parseBerTlv(gw5.fields["AA"] || "");
+    var samePk5 = false;
+    for (var pvi5 = 0; pvi5 < pkV5.length; pvi5++) {
+        for (var psi5 = 0; psi5 < pkS5.length; psi5++) {
+            if (pkV5[pvi5].value !== "" && pkV5[pvi5].value === pkS5[psi5].value) { samePk5 = true; }
+        }
+    }
+    bind.checkData("S5-C3 CI PK lists share at least one key id", "1", samePk5 ? "1" : "0");
+
+    // 步骤 6:Seq#02] 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 sdCla6 = s17.chan !== null ? (s17.chan <= 3 ? 128 + s17.chan : 188 + s17.chan).toString(16).toUpperCase() : null;
+    var s6 = bind.sendApdu(sdCla6, "E2", "91", "00", "BF2E00", "00", "9000");
+    bind.checkData("S6-C1 SW", "9000", s6.sw);
+    // geca-proc ES10b Info 响应面(R_CHALLENGE,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
+    var gw6 = BindGecaProc.parseGecaResponse(s6.resp, {outer: "BF2E", required: ["80"], optional: []});
+    bind.checkData("S6-C2 R_CHALLENGE outer tag", "BF2E", gw6.outer_tag === null ? "absent" : gw6.outer_tag);
+    bind.checkData("S6-C2 R_CHALLENGE required members present", "1", gw6.ok ? "1" : "0");
+    var r2w6 = BindGecaProc.parseGecaResponse(s6.resp, {outer: "BF2E", required: ["80"]});
+    bind.checkData("S6-C2 R_CHALLENGE outer tag", "BF2E", r2w6.outer_tag === null ? "absent" : r2w6.outer_tag);
+    var r2ch6 = null; for (var r2ci6 = 0; r2ci6 < r2w6.children.length; r2ci6++) { if (r2w6.children[r2ci6].tag === "80") { r2ch6 = r2w6.children[r2ci6]; } }
+    var r2chal6 = r2ch6 === null ? "" : r2ch6.value;
+    bind.checkData("S6-C2 tagOfeuiccChallenge", "80", r2ch6 === null ? "absent" : r2ch6.tag);
+    bind.checkData("S6-C2 lengthOfeuiccChallenge", "10", r2ch6 === null ? "absent" : (r2ch6.len < 16 ? ("0" + r2ch6.len.toString(16).toUpperCase()) : r2ch6.len.toString(16).toUpperCase()));
+
+    // 步骤 7:Seq#02] Step4 输入准备:同 Seq#01 Step3(<S_TRANSACTION_ID>、<EUICC_CHALLENGE>、<S_SMDP_CHALLENGE>、<S_SMDP_SIGNATURE1>、NIST CI Key ID、#CERT_S_SM_DPauth_ECDSA)(tc_step;non_wire)
+    // test-tool internal preparation (no APDU face): runtime-domain
+    // values per CaseIR unresolved (G Annex B generation rules);
+    // no fabricated bytes emitted here.
+
+    // 步骤 8:Seq#02] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ26_029, RQ26_005, RQ26_006, RQ26_007, RQ26_008, RQ26_034, RQ26_035, RQ31_025, RQ31_046, RQ31_047, RQ31_048, RQ31_049, RQ31_050, RQ31_051, RQ31_053, RQ31_054, RQ31_055, RQ31_076, RQ31_077, RQ42_001, RQ43_001, RQ43_002, RQ45_002, RQ55_004, RQ55_005, RQ57_094, RQ57_095, RQ57_096, RQ57_097, RQ57_098, RQ57_099, RQ57_101, RQ57_102, RQ57_103, RQ57_104, RQ57_105, RQ57_106, RQ57_107, RQ57_108)
+    // dynamic-template 多占位运行时绑定(B-5;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;模板 tag 权威 = SGP.22 §5.7.13 + AUTOMATIC TAGS + 黄金切片线缆三源对账)
+    var dt8Tid = "";
+    var dt8Sc = "";
+    for (var dt8Ri = 0; dt8Ri < 16; dt8Ri++) {
+        dt8Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+        dt8Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+    }
+    var dt8PkList = BindEs10xSingleRequest.parseBerTlv(gw5.fields["AA"] || "");
+    var dt8CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
+    var dt8Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
+    var dt8Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+    var dt8Sel = -1;
+    for (var dt8Pi = 0; dt8Pi < dt8PkList.length && dt8Sel < 0; dt8Pi++) {
+        for (var dt8Mi = 0; dt8Mi < dt8CiIds.length; dt8Mi++) {
+            if (dt8PkList[dt8Pi].value === dt8CiIds[dt8Mi]) { dt8Sel = dt8Mi; break; }
+        }
+    }
+    var dt8SkiSel = dt8Sel;
+    var dt8Sks = ["0A7CC1C244E60C52CD5B7807AB8C360C26524601507DCABC5DD598B5A616D5D5", "93FB33D0584F349B07F8B5D2AF93D7C3E354B349A3B913502E6ABC070E4D4929"];
+    var dt8Ctx = "801730343338362D41475946542D41373459382D3346383135A130800400000000A12880030500008103080000820301000083030100008403020000850302000086030900008703020100";
+    if (dt8Sel < 0 || dt8SkiSel < 0) {
+        bind.checkData("S8-C1 SW", "9000", "dt8_not_executed:no_usable_material_set");
+        bind.checkData("S8-C2 structure_ok", "1", "0");
+        bind.checkData("S8-C3 transactionId echo", dt8Tid, "dt8_not_executed:no_usable_material_set");
+        bind.checkData("S8-C4 serverChallenge echo", dt8Sc, "dt8_not_executed:no_usable_material_set");
+        bind.checkData("S8-C5 sig_verify", "1", "0");
+        bind.checkData("S8-C6 ctxParams1 echo", dt8Ctx, "dt8_not_executed:no_usable_material_set");
+    } else {
+        bind.engine.InitEccDomainParams(dt8Dps[dt8Sel][0], dt8Dps[dt8Sel][1], dt8Dps[dt8Sel][2], dt8Dps[dt8Sel][3], dt8Dps[dt8Sel][4], 1);
+        var dt8S1 = BindEs10xSingleRequest.buildTlv("30",
+            BindEs10xSingleRequest.buildTlv("80", dt8Tid)
+            + BindEs10xSingleRequest.buildTlv("81", gw6.fields["80"] || "")
+            + BindEs10xSingleRequest.buildTlv("83", "1674657374736D6470706C7573312E6578616D706C652E636F6D")
+            + BindEs10xSingleRequest.buildTlv("84", dt8Sc));
+        var dt8Sgn = "";
+        while (dt8Sgn.length != 2 * dt8Sks[dt8Sel].length) {
+            bind.engine.SleepTime(2000);
+            dt8Sgn = bind.engine.EccSignData(dt8Sks[dt8Sel], dt8S1, 33);
+        }
+        var dt8Asm = BindEs10bAuthServer.assembleAuthenticateServer(
+            {outer: "BF38",
+             signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
+             serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
+            {transactionId: dt8Tid, euiccChallenge: gw6.fields["80"] || "",
+             serverAddress: "1674657374736D6470706C7573312E6578616D706C652E636F6D", serverChallenge: dt8Sc,
+             serverSignature1: dt8Sgn, euiccCiPKIdToBeUsed: dt8CiIds[dt8SkiSel],
+             serverCertificate: dt8Certs[dt8Sel], ctxParams1: dt8Ctx});
+        if (dt8Asm.error) {
+        bind.checkData("S8-C1 SW", "9000", "dt8_assemble_error");
+        bind.checkData("S8-C2 structure_ok", "1", "0");
+        bind.checkData("S8-C3 transactionId echo", dt8Tid, "dt8_assemble_error");
+        bind.checkData("S8-C4 serverChallenge echo", dt8Sc, "dt8_assemble_error");
+        bind.checkData("S8-C5 sig_verify", "1", "0");
+        bind.checkData("S8-C6 ctxParams1 echo", dt8Ctx, "dt8_assemble_error");
+        } else {
+            var dt8Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+                {cla: "", ins: "E2", p1: "91", p2: "00", data: dt8Asm.request_hex,
+                 le: "00", blockSize: 255, blockSw: "9000", finalSw: "9000"});
+            var dt8Sw = (dt8Run.final && dt8Run.final.sw) ? dt8Run.final.sw : "transport_error";
+            bind.checkData("S8-C1 SW", "9000", dt8Sw);
+            var dt8Ex = BindEs10bAuthServer.extractAuthenticateServer(
+                {outer: "BF38",
+                 ok: {tag: "A0", children: [
+                     {name: "euiccSigned1", tag: "30", children: [
+                         {name: "transactionId", tag: "80"},
+                         {name: "serverAddress", tag: "83"},
+                         {name: "serverChallenge", tag: "84"},
+                         {name: "euiccInfo2", tag: "BF22"},
+                         {name: "ctxParams1", tag: "A0"}]},
+                     {name: "euiccSignature1", tag: "5F37"},
+                     {name: "euiccCertificate", tag: "30"},
+                     {name: "eumCertificate", tag: "30"}]},
+                 error: {tag: "A1", children: [{name: "transactionId", tag: "80"}, {name: "authenticateErrorCode", tag: "81"}]}},
+                dt8Run.final ? dt8Run.final.resp : "");
+            var dt8OkBr = dt8Ex.branch === "ok" && dt8Ex.ok && dt8Ex.ok.missing.length === 0 && dt8Ex.ok.fields.euiccSigned1.children.missing.length === 0;
+            var dt8ErrBr = dt8Ex.branch === "error" && dt8Ex.error && dt8Ex.error.missing.length === 0;
+            bind.checkData("S8-C2 R_AUTH_SMDP_MATCH_ID authenticateResponseOk structure", "1", dt8OkBr ? "1" : "0");
+            bind.checkData("S8-C3 transactionId echo", dt8Tid,
+                dt8OkBr ? dt8Ex.ok.fields.euiccSigned1.children.fields.transactionId.value
+                : (dt8ErrBr ? dt8Ex.error.fields.transactionId.value : "branch_absent"));
+            bind.checkData("S8-C4 serverChallenge echo", dt8Sc,
+                dt8OkBr ? dt8Ex.ok.fields.euiccSigned1.children.fields.serverChallenge.value : "branch_absent");
+            // S8-C5: euiccSignature1 验签(engine EccVerifySign,vendor CommonArith Ecc_Verify ABI 同机制):PK 自响应 euiccCertificate subjectPublicKey BIT STRING 机械提取(X.509:03 42 00 04 || x||y,SEC1 非压缩点——自 04 前缀起取 65B/130hex,对齐 vendor X_509.js subjectPublicKey.substr(2)),签名明文 = euiccSigned1 完整 TLV(RQ26_035 编码后数据对象)。
+            var dt8Pk = "";
+            if (dt8OkBr) {
+                var dt8CertH = dt8Ex.ok.fields.euiccCertificate.value;
+                var dt8Ki = dt8CertH.indexOf("03420004");
+                if (dt8Ki >= 0 && dt8Ki + 6 + 130 <= dt8CertH.length) {
+                    dt8Pk = dt8CertH.substring(dt8Ki + 6, dt8Ki + 6 + 130);
+                }
+            }
+            var dt8ES1 = "";
+            if (dt8OkBr) {
+                var dt8ESc = dt8Ex.ok.fields.euiccSigned1.children.fields;
+                dt8ES1 = BindEs10xSingleRequest.buildTlv("30",
+                    BindEs10xSingleRequest.buildTlv("80", dt8ESc.transactionId.value)
+                    + BindEs10xSingleRequest.buildTlv("83", dt8ESc.serverAddress.value)
+                    + BindEs10xSingleRequest.buildTlv("84", dt8ESc.serverChallenge.value)
+                    + BindEs10xSingleRequest.buildTlv("BF22", dt8ESc.euiccInfo2.value)
+                    + BindEs10xSingleRequest.buildTlv("A0", dt8ESc.ctxParams1.value));
+            }
+            bind.checkData("S8-C5 euiccSignature1 verify", "1",
+                (dt8OkBr && dt8Pk !== "" && dt8ES1 !== ""
+                 && bind.engine.EccVerifySign(dt8Pk, dt8ES1,
+ dt8Ex.ok.fields.euiccSignature1.value, 33) != 0) ? "1" : "0");
+            bind.checkData("S8-C6 ctxParams1 echo", dt8Ctx,
+                dt8OkBr ? dt8Ex.ok.fields.euiccSigned1.children.fields.ctxParams1.value : "branch_absent");
+        }
+    }
+
+    // 步骤 9:Seq#03] 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 sdCla9 = s17.chan !== null ? (s17.chan <= 3 ? 128 + s17.chan : 188 + s17.chan).toString(16).toUpperCase() : null;
+    var s9 = bind.sendApdu(sdCla9, "E2", "91", "00", "BF2000", "00", "9000");
+    bind.checkData("S9-C1 SW", "9000", s9.sw);
+    // geca-proc ES10b Info 响应面(R_EUICC_INFO1,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
+    var gw9 = BindGecaProc.parseGecaResponse(s9.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
+    bind.checkData("S9-C2 R_EUICC_INFO1 outer tag", "BF20", gw9.outer_tag === null ? "absent" : gw9.outer_tag);
+    bind.checkData("S9-C2 R_EUICC_INFO1 required members present", "1", gw9.ok ? "1" : "0");
+    var pkV9 = BindEs10xSingleRequest.parseBerTlv(gw9.fields["A9"] || "");
+    var pkS9 = BindEs10xSingleRequest.parseBerTlv(gw9.fields["AA"] || "");
+    var samePk9 = false;
+    for (var pvi9 = 0; pvi9 < pkV9.length; pvi9++) {
+        for (var psi9 = 0; psi9 < pkS9.length; psi9++) {
+            if (pkV9[pvi9].value !== "" && pkV9[pvi9].value === pkS9[psi9].value) { samePk9 = true; }
+        }
+    }
+    bind.checkData("S9-C3 CI PK lists share at least one key id", "1", samePk9 ? "1" : "0");
+
+    // 步骤 10:Seq#03] 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 sdCla10 = s17.chan !== null ? (s17.chan <= 3 ? 128 + s17.chan : 188 + s17.chan).toString(16).toUpperCase() : null;
+    var s10 = bind.sendApdu(sdCla10, "E2", "91", "00", "BF2E00", "00", "9000");
+    bind.checkData("S10-C1 SW", "9000", s10.sw);
+    // geca-proc ES10b Info 响应面(R_CHALLENGE,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
+    var gw10 = BindGecaProc.parseGecaResponse(s10.resp, {outer: "BF2E", required: ["80"], optional: []});
+    bind.checkData("S10-C2 R_CHALLENGE outer tag", "BF2E", gw10.outer_tag === null ? "absent" : gw10.outer_tag);
+    bind.checkData("S10-C2 R_CHALLENGE required members present", "1", gw10.ok ? "1" : "0");
+    var r2w10 = BindGecaProc.parseGecaResponse(s10.resp, {outer: "BF2E", required: ["80"]});
+    bind.checkData("S10-C2 R_CHALLENGE outer tag", "BF2E", r2w10.outer_tag === null ? "absent" : r2w10.outer_tag);
+    var r2ch10 = null; for (var r2ci10 = 0; r2ci10 < r2w10.children.length; r2ci10++) { if (r2w10.children[r2ci10].tag === "80") { r2ch10 = r2w10.children[r2ci10]; } }
+    var r2chal10 = r2ch10 === null ? "" : r2ch10.value;
+    bind.checkData("S10-C2 tagOfeuiccChallenge", "80", r2ch10 === null ? "absent" : r2ch10.tag);
+    bind.checkData("S10-C2 lengthOfeuiccChallenge", "10", r2ch10 === null ? "absent" : (r2ch10.len < 16 ? ("0" + r2ch10.len.toString(16).toUpperCase()) : r2ch10.len.toString(16).toUpperCase()));
+
+    // 步骤 11:Seq#03] Step4 输入准备:同 Seq#01 Step3(含 IMEI 场景设备信息 #S_DEVICE_INFO_IMEI 经 #CTX_PARAMS1_IMEI 引入请求)(tc_step;non_wire)
+    // test-tool internal preparation (no APDU face): runtime-domain
+    // values per CaseIR unresolved (G Annex B generation rules);
+    // no fabricated bytes emitted here.
+
+    // 步骤 12:Seq#03] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ26_029, RQ26_005, RQ26_006, RQ26_007, RQ26_008, RQ26_034, RQ26_035, RQ31_025, RQ31_046, RQ31_047, RQ31_048, RQ31_049, RQ31_050, RQ31_051, RQ31_053, RQ31_054, RQ31_055, RQ31_076, RQ42_001, RQ43_001, RQ43_002, RQ45_002, RQ55_004, RQ55_005, RQ57_094, RQ57_095, RQ57_096, RQ57_097, RQ57_098, RQ57_099, RQ57_101, RQ57_102, RQ57_103, RQ57_104, RQ57_105, RQ57_106, RQ57_107, RQ57_108)
+    // dynamic-template 多占位运行时绑定(B-5;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;模板 tag 权威 = SGP.22 §5.7.13 + AUTOMATIC TAGS + 黄金切片线缆三源对账)
+    var dt12Tid = "";
+    var dt12Sc = "";
+    for (var dt12Ri = 0; dt12Ri < 16; dt12Ri++) {
+        dt12Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+        dt12Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+    }
+    var dt12PkList = BindEs10xSingleRequest.parseBerTlv(gw9.fields["AA"] || "");
+    var dt12CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
+    var dt12Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
+    var dt12Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+    var dt12Sel = -1;
+    for (var dt12Pi = 0; dt12Pi < dt12PkList.length && dt12Sel < 0; dt12Pi++) {
+        for (var dt12Mi = 0; dt12Mi < dt12CiIds.length; dt12Mi++) {
+            if (dt12PkList[dt12Pi].value === dt12CiIds[dt12Mi]) { dt12Sel = dt12Mi; break; }
+        }
+    }
+    var dt12SkiSel = dt12Sel;
+    var dt12Sks = ["0A7CC1C244E60C52CD5B7807AB8C360C26524601507DCABC5DD598B5A616D5D5", "93FB33D0584F349B07F8B5D2AF93D7C3E354B349A3B913502E6ABC070E4D4929"];
+    var dt12Ctx = "A13A800400000000A1288003050000810308000082030100008303010000840302000085030200008603090000870302010082080000000011111111";
+    if (dt12Sel < 0 || dt12SkiSel < 0) {
+        bind.checkData("S12-C1 SW", "9000", "dt12_not_executed:no_usable_material_set");
+        bind.checkData("S12-C2 structure_ok", "1", "0");
+        bind.checkData("S12-C3 transactionId echo", dt12Tid, "dt12_not_executed:no_usable_material_set");
+        bind.checkData("S12-C4 serverChallenge echo", dt12Sc, "dt12_not_executed:no_usable_material_set");
+        bind.checkData("S12-C5 sig_verify", "1", "0");
+        bind.checkData("S12-C6 ctxParams1 echo", dt12Ctx, "dt12_not_executed:no_usable_material_set");
+    } else {
+        bind.engine.InitEccDomainParams(dt12Dps[dt12Sel][0], dt12Dps[dt12Sel][1], dt12Dps[dt12Sel][2], dt12Dps[dt12Sel][3], dt12Dps[dt12Sel][4], 1);
+        var dt12S1 = BindEs10xSingleRequest.buildTlv("30",
+            BindEs10xSingleRequest.buildTlv("80", dt12Tid)
+            + BindEs10xSingleRequest.buildTlv("81", gw10.fields["80"] || "")
+            + BindEs10xSingleRequest.buildTlv("83", "1674657374736D6470706C7573312E6578616D706C652E636F6D")
+            + BindEs10xSingleRequest.buildTlv("84", dt12Sc));
+        var dt12Sgn = "";
+        while (dt12Sgn.length != 2 * dt12Sks[dt12Sel].length) {
+            bind.engine.SleepTime(2000);
+            dt12Sgn = bind.engine.EccSignData(dt12Sks[dt12Sel], dt12S1, 33);
+        }
+        var dt12Asm = BindEs10bAuthServer.assembleAuthenticateServer(
+            {outer: "BF38",
+             signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
+             serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
+            {transactionId: dt12Tid, euiccChallenge: gw10.fields["80"] || "",
+             serverAddress: "1674657374736D6470706C7573312E6578616D706C652E636F6D", serverChallenge: dt12Sc,
+             serverSignature1: dt12Sgn, euiccCiPKIdToBeUsed: dt12CiIds[dt12SkiSel],
+             serverCertificate: dt12Certs[dt12Sel], ctxParams1: dt12Ctx});
+        if (dt12Asm.error) {
+        bind.checkData("S12-C1 SW", "9000", "dt12_assemble_error");
+        bind.checkData("S12-C2 structure_ok", "1", "0");
+        bind.checkData("S12-C3 transactionId echo", dt12Tid, "dt12_assemble_error");
+        bind.checkData("S12-C4 serverChallenge echo", dt12Sc, "dt12_assemble_error");
+        bind.checkData("S12-C5 sig_verify", "1", "0");
+        bind.checkData("S12-C6 ctxParams1 echo", dt12Ctx, "dt12_assemble_error");
+        } else {
+            var dt12Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+                {cla: "", ins: "E2", p1: "91", p2: "00", data: dt12Asm.request_hex,
+                 le: "00", blockSize: 255, blockSw: "9000", finalSw: "9000"});
+            var dt12Sw = (dt12Run.final && dt12Run.final.sw) ? dt12Run.final.sw : "transport_error";
+            bind.checkData("S12-C1 SW", "9000", dt12Sw);
+            var dt12Ex = BindEs10bAuthServer.extractAuthenticateServer(
+                {outer: "BF38",
+                 ok: {tag: "A0", children: [
+                     {name: "euiccSigned1", tag: "30", children: [
+                         {name: "transactionId", tag: "80"},
+                         {name: "serverAddress", tag: "83"},
+                         {name: "serverChallenge", tag: "84"},
+                         {name: "euiccInfo2", tag: "BF22"},
+                         {name: "ctxParams1", tag: "A0"}]},
+                     {name: "euiccSignature1", tag: "5F37"},
+                     {name: "euiccCertificate", tag: "30"},
+                     {name: "eumCertificate", tag: "30"}]},
+                 error: {tag: "A1", children: [{name: "transactionId", tag: "80"}, {name: "authenticateErrorCode", tag: "81"}]}},
+                dt12Run.final ? dt12Run.final.resp : "");
+            var dt12OkBr = dt12Ex.branch === "ok" && dt12Ex.ok && dt12Ex.ok.missing.length === 0 && dt12Ex.ok.fields.euiccSigned1.children.missing.length === 0;
+            var dt12ErrBr = dt12Ex.branch === "error" && dt12Ex.error && dt12Ex.error.missing.length === 0;
+            bind.checkData("S12-C2 R_AUTH_SMDP_IMEI authenticateResponseOk structure", "1", dt12OkBr ? "1" : "0");
+            bind.checkData("S12-C3 transactionId echo", dt12Tid,
+                dt12OkBr ? dt12Ex.ok.fields.euiccSigned1.children.fields.transactionId.value
+                : (dt12ErrBr ? dt12Ex.error.fields.transactionId.value : "branch_absent"));
+            bind.checkData("S12-C4 serverChallenge echo", dt12Sc,
+                dt12OkBr ? dt12Ex.ok.fields.euiccSigned1.children.fields.serverChallenge.value : "branch_absent");
+            // S12-C5: euiccSignature1 验签(engine EccVerifySign,vendor CommonArith Ecc_Verify ABI 同机制):PK 自响应 euiccCertificate subjectPublicKey BIT STRING 机械提取(X.509:03 42 00 04 || x||y,SEC1 非压缩点——自 04 前缀起取 65B/130hex,对齐 vendor X_509.js subjectPublicKey.substr(2)),签名明文 = euiccSigned1 完整 TLV(RQ26_035 编码后数据对象)。
+            var dt12Pk = "";
+            if (dt12OkBr) {
+                var dt12CertH = dt12Ex.ok.fields.euiccCertificate.value;
+                var dt12Ki = dt12CertH.indexOf("03420004");
+                if (dt12Ki >= 0 && dt12Ki + 6 + 130 <= dt12CertH.length) {
+                    dt12Pk = dt12CertH.substring(dt12Ki + 6, dt12Ki + 6 + 130);
+                }
+            }
+            var dt12ES1 = "";
+            if (dt12OkBr) {
+                var dt12ESc = dt12Ex.ok.fields.euiccSigned1.children.fields;
+                dt12ES1 = BindEs10xSingleRequest.buildTlv("30",
+                    BindEs10xSingleRequest.buildTlv("80", dt12ESc.transactionId.value)
+                    + BindEs10xSingleRequest.buildTlv("83", dt12ESc.serverAddress.value)
+                    + BindEs10xSingleRequest.buildTlv("84", dt12ESc.serverChallenge.value)
+                    + BindEs10xSingleRequest.buildTlv("BF22", dt12ESc.euiccInfo2.value)
+                    + BindEs10xSingleRequest.buildTlv("A0", dt12ESc.ctxParams1.value));
+            }
+            bind.checkData("S12-C5 euiccSignature1 verify", "1",
+                (dt12OkBr && dt12Pk !== "" && dt12ES1 !== ""
+                 && bind.engine.EccVerifySign(dt12Pk, dt12ES1,
+ dt12Ex.ok.fields.euiccSignature1.value, 33) != 0) ? "1" : "0");
+            bind.checkData("S12-C6 ctxParams1 echo", dt12Ctx,
+                dt12OkBr ? dt12Ex.ok.fields.euiccSigned1.children.fields.ctxParams1.value : "branch_absent");
+        }
+    }
 }