eSIM RSP 测试用例对比站

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

源码对照:5.2.1.2.1

下载准备重试(复用 OT 密钥) / TC_eUICC_PrepareDownload_Retry_ReuseOTKeys

左侧为人工切片入口(-man,来自 原料/切片 的最小可执行脚本),右侧为 Cas 盲生成入口(-cas,仅依据规范生成)。文件按原始编码(多为 GBK)解码为 UTF-8 显示,行号自 1 起;字节级原文与 sha256 见两侧脚本包。完整 unified diff 见本页底部折叠区,以及 报告原文 §4。
-man 入口
Import/TestCase_SGP_23.js
192 行 / 8253 字符 / gb18030
-cas 入口
TC_eUICC_PrepareDownload_Retry_ReuseOTKeys/Import/TC_eUICC_PrepareDownload_Retry_ReuseOTKeys.js
884 行 / 87123 字符 / gb18030
默认折行显示长行;取消勾选可横向滚动查看原始行宽
-man 人工切片Import/TestCase_SGP_23.js192 行 / 8253 字符 / gb18030入口函数 @L3
1// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_PrepareDownload_Retry_ReuseOTKeys_01_Nominal_Confirmation_Code_retry_mechanism_by_reusing_previous_One_Time_key_pair + TC_eUICC_PrepareDownload_Retry_ReuseOTKeys_02_Nominal_Retry_after_a_CancelSession_Reason_Postponed + TC_eUICC_PrepareDownload_Retry_ReuseOTKeys_03_Nominal_Retry_after_a_CancelSession_Reason_Timeout (extracted verbatim)
2
3function TC_eUICC_PrepareDownload_Retry_ReuseOTKeys_01_Nominal_Confirmation_Code_retry_mechanism_by_reusing_previous_One_Time_key_pair()
4{
5	if (!O_E_REUSE_OTPK)
6		return;
7	
8	tracenamestr = "Confirmation Code重发,使用上一个会话中的otpk";
9	curDis.TraceStart(sno++,tracenamestr);
10	
11	curLogicChannel = 0;
12	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
13	Ini_powerOn_eUICC_LPAe_not_activate();
14	
15	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
16	TS_MANAGE_CHANNEL_OPEN();
17	
18	curLogicChannel = 1;
19	
20	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
21	TS_SELECT("Select ISD",ISD_R_AID,"9000");
22	
23	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
24	
25	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
26	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
27	Profile_load_procedure.ES10b_GetEUICCInfo1();
28	
29	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
30	Profile_load_procedure.ES10b_GetEUICCChallenge();
31
32	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
33	Profile_load_procedure.ES10b_AuthenticateServer();
34	
35	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_WITH_CC;");
36	var chash1 = curStrHandle.RandHexStr(32);
37	Profile_load_procedure.ccRequiredFlag = "FF";
38	Profile_load_procedure.hashcc = chash1;
39	Profile_load_procedure.ES10b_PrepareDownload();
40	
41	var cureuiccOtpk = Profile_load_procedure.euiccOtpk;
42	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
43	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
44	Profile_load_procedure.ES10b_GetEUICCInfo1();
45
46	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
47	Profile_load_procedure.ES10b_GetEUICCChallenge();
48
49	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
50	Profile_load_procedure.ES10b_AuthenticateServer();
51	
52	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_RETRY_CC,Confirmation Code重发,使用上一个会话中的otpk;");
53	var chash1 = curStrHandle.RandHexStr(32);
54	Profile_load_procedure.ccRequiredFlag = "FF";
55	Profile_load_procedure.hashcc = chash1;
56	Profile_load_procedure.euiccOtpk = cureuiccOtpk;
57	Profile_load_procedure.ES10b_PrepareDownload();
58	
59	var cureuiccOtpk2 = Profile_load_procedure.euiccOtpk;	
60	curStrHandle.CheckData(cureuiccOtpk, cureuiccOtpk2, "otpk");
61	
62	RecoverCard();
63}
64
65function TC_eUICC_PrepareDownload_Retry_ReuseOTKeys_02_Nominal_Retry_after_a_CancelSession_Reason_Postponed()
66{
67	if (!O_E_REUSE_OTPK)
68		return;
69	
70	tracenamestr = "S_LPAd模拟终端用户推迟下载Profile,检查eUICC可以重复使用在之前的尝试中生成的一次性密钥对";
71	curDis.TraceStart(sno++,tracenamestr);
72	
73	curLogicChannel = 0;
74	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
75	Ini_powerOn_eUICC_LPAe_not_activate();
76	
77	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
78	TS_MANAGE_CHANNEL_OPEN();
79	
80	curLogicChannel = 1;
81	
82	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
83	TS_SELECT("Select ISD",ISD_R_AID,"9000");
84	
85	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
86	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
87	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
88	Profile_load_procedure.ES10b_GetEUICCInfo1();
89	
90	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
91	Profile_load_procedure.ES10b_GetEUICCChallenge();
92
93	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
94	Profile_load_procedure.ES10b_AuthenticateServer();
95	
96	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_WITH_CC;");
97	var chash1 = curStrHandle.RandHexStr(32);
98	Profile_load_procedure.ccRequiredFlag = "FF";
99	Profile_load_procedure.hashcc = chash1;
100	Profile_load_procedure.ES10b_PrepareDownload();
101	
102	var cureuiccOtpk = Profile_load_procedure.euiccOtpk;
103	
104	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行CancelSession,Reason “Postponed”;");
105	Profile_load_procedure.ES10b_CancelSession(CancelSessionReason.postponed);
106	
107	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
108	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
109	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
110	Profile_load_procedure.ES10b_GetEUICCInfo1();
111
112	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
113	Profile_load_procedure.ES10b_GetEUICCChallenge();
114
115	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
116	Profile_load_procedure.ES10b_AuthenticateServer();
117	
118	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_RETRY_CC,延期导致的CancelSession,使用上一个会话中的otpk;");
119	Profile_load_procedure.ccRequiredFlag = "FF";
120	Profile_load_procedure.hashcc = chash1;
121	Profile_load_procedure.euiccOtpk = cureuiccOtpk;
122	Profile_load_procedure.ES10b_PrepareDownload();
123	
124	var cureuiccOtpk2 = Profile_load_procedure.euiccOtpk;
125	curStrHandle.CheckData(cureuiccOtpk, cureuiccOtpk2, "otpk");
126	
127	RecoverCard();
128}
129
130function TC_eUICC_PrepareDownload_Retry_ReuseOTKeys_03_Nominal_Retry_after_a_CancelSession_Reason_Timeout()
131{
132	if (!O_E_REUSE_OTPK)
133		return;
134	
135	tracenamestr = "S_LPAd模拟终端用户在超时间隔内没有确认下载Profile,检查eUICC可以重复使用在之前的尝试中生成的一次性密钥对";
136	curDis.TraceStart(sno++,tracenamestr);
137	
138	curLogicChannel = 0;
139	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
140	Ini_powerOn_eUICC_LPAe_not_activate();
141	
142	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
143	TS_MANAGE_CHANNEL_OPEN();
144	
145	curLogicChannel = 1;
146	
147	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
148	TS_SELECT("Select ISD",ISD_R_AID,"9000");
149	
150	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
151	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
152	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
153	Profile_load_procedure.ES10b_GetEUICCInfo1();
154	
155	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
156	Profile_load_procedure.ES10b_GetEUICCChallenge();
157	
158	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
159	Profile_load_procedure.ES10b_AuthenticateServer();
160	
161	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_WITH_CC;");
162	var chash1 = curStrHandle.RandHexStr(32);
163	Profile_load_procedure.ccRequiredFlag = "FF";
164	Profile_load_procedure.hashcc = chash1;
165	Profile_load_procedure.ES10b_PrepareDownload();
166	
167	var cureuiccOtpk = Profile_load_procedure.euiccOtpk;
168	
169	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行CancelSession,Reason “Timeout”;");
170	Profile_load_procedure.ES10b_CancelSession(CancelSessionReason.timeout);
171	
172	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
173	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
174	Profile_load_procedure.ES10b_GetEUICCInfo1();
175
176	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
177	Profile_load_procedure.ES10b_GetEUICCChallenge();
178
179	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
180	Profile_load_procedure.ES10b_AuthenticateServer();
181	
182	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_RETRY_CC,超时导致的CancelSession,使用上一个会话中的otpk;");
183	Profile_load_procedure.ccRequiredFlag = "FF";
184	Profile_load_procedure.hashcc = chash1;
185	Profile_load_procedure.euiccOtpk = cureuiccOtpk;
186	Profile_load_procedure.ES10b_PrepareDownload();
187	
188	var cureuiccOtpk2 = Profile_load_procedure.euiccOtpk;
189	curStrHandle.CheckData(cureuiccOtpk, cureuiccOtpk2, "otpk");	
190	RecoverCard();
191}
192
-cas 盲生成TC_eUICC_PrepareDownload_Retry_ReuseOTKeys/Import/TC_eUICC_PrepareDownload_Retry_ReuseOTKeys.js884 行 / 87123 字符 / gb18030入口函数 @L27
1// Author: 卡思Cas智能体
2// Date: 20261004-022945
3// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_PrepareDownload_Retry_ReuseOTKeys,Test Sequence #01-#03 Nominal(本 TC 全部 3 条 Test Sequence 合并展开:CC 重试复用 OT/Postponed 后重试/Timeout 后重试),适用性 C019。
4// Test points: S2-C1 SW;S2-C2 R_PREP_DOWNLOAD response structure;S2-C2 R_PREP_DOWNLOAD outer tag
5//   S2-C2 R_PREP_DOWNLOAD required members present;S3-C1 cma_ok
6//   S3-C1 Common Mutual Authentication re-execution ok;S5-C1 SW
7//   S5-C2 R_PREP_DOWNLOAD response structure;S5-C2 R_PREP_DOWNLOAD outer tag
8//   S5-C2 R_PREP_DOWNLOAD required members present;S7-C1 SW
9//   S7-C2 R_PREP_DOWNLOAD response structure;S7-C2 R_PREP_DOWNLOAD outer tag
10//   S7-C2 R_PREP_DOWNLOAD required members present;S8-C1 assemble;S8-C2 assemble;S8-C1 SW
11//   S8-C2 cancelSessionResponseOk structure;S9-C1 cma_ok
12//   S9-C1 Common Mutual Authentication re-execution ok;S10-C1 SW
13//   S10-C2 R_PREP_DOWNLOAD response structure;S10-C2 R_PREP_DOWNLOAD outer tag
14//   S10-C2 R_PREP_DOWNLOAD required members present;S12-C1 SW
15//   S12-C2 R_PREP_DOWNLOAD response structure;S12-C2 R_PREP_DOWNLOAD outer tag
16//   S12-C2 R_PREP_DOWNLOAD required members present;S13-C1 assemble;S13-C2 assemble;S13-C1 SW
17//   S13-C2 cancelSessionResponseOk structure;S14-C1 cma_ok
18//   S14-C1 Common Mutual Authentication re-execution ok;S15-C1 SW
19//   S15-C2 R_PREP_DOWNLOAD response structure;S15-C2 R_PREP_DOWNLOAD outer tag
20//   S15-C2 R_PREP_DOWNLOAD required members present
21// 本函数由 CaseIR 5.2.1.2.1 编译生成(experiments/5.2.1.2.1-TC_eUICC_PrepareDownload_Retry_ReuseOTKeys-20261004_022945,SGP.23 v1.16 × SGP.22 v2.7):字节权威=CaseIR,非誊录黄金脚本。
22// Value-free template: every data byte is injected from CaseIR fields; no scaffold globals (see docs/speconly/compile-symbol-migration.md).
23// 适用性 C019:编译期门,运行时由 harness 环境前置承担。
24// PRECONDITION (declared, NOT compiled): initial_conditions 缺语料过程体(Annex C.2 absent from input package, corpus vacuum): IC 序列属测试工具/卡态编排责任,本脚本不虚构初始化步骤;语义影响见 CaseIR open_items。
25// GEN-IC-1 卡态声明(E 段 General Initial Conditions,编排责任):The PROFILE_OPERATIONAL1 is not loaded on the eUICC: declared unexpanded (no fabricated bytes; provenance = expansion_source).
26// GEN-IC-2 卡态声明:通信已初始化且 S_LPAd 已选 ISD-R;Common Mutual Authentication 已成功执行(#GET_EUICC_INFO1、#GET_EUICC_CHALLENGE、#AUTHENTICATE_SMDP 已发送;签名与验证选用同一 GSMA CI): declared unexpanded (no fabricated bytes; provenance = expansion_source).
27function TC_eUICC_PrepareDownload_Retry_ReuseOTKeys_01_03_merged() {
28    var bind = curBind;
29    var profileAidSession = BindEs10xProcProfileDynamic.beginSession(bind, "TC_eUICC_PrepareDownload_Retry_ReuseOTKeys_01_03_merged");
30
31    // 步骤 1:<S_HASHED_CC> = MTD_GENERATE_HASHED_CC(tc_step;non_wire)
32    // test-tool internal preparation (no APDU face): runtime-domain
33    // values per CaseIR unresolved (G Annex B generation rules);
34    // no fabricated bytes emitted here.
35
36    // 步骤 2:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030)
37    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_WITH_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
38    //   无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
39    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
40    var pd2Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
41    var pd2Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
42    var pd2Tid = "";
43    for (var pd2Ri = 0; pd2Ri < 16; pd2Ri++) {
44        pd2Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
45    }
46    var pd2Sel = 0;
47    var pd2Sig1 = "";
48    var pd2Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
49    var pd2CcH = bind.engine.Sha256("30313032303330343035", 20);
50    var pd2HashCc = bind.engine.Sha256(pd2CcH + pd2Tid, (pd2CcH + pd2Tid).length);
51    if (pd2Sel < 0 || pd2Sig1 === "") {
52        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
53        bind.checkData("S2-C1 SW", "9000", "pd2_not_executed:cma_operands_absent");
54        bind.checkData("S2-C2 R_PREP_DOWNLOAD response structure", "1", "pd2_not_executed:cma_operands_absent");
55    } else {
56        bind.engine.InitEccDomainParams(pd2Dps[pd2Sel][0], pd2Dps[pd2Sel][1], pd2Dps[pd2Sel][2], pd2Dps[pd2Sel][3], pd2Dps[pd2Sel][4], 1);
57        var pd2S2 = BindEs10xSingleRequest.buildTlv("30",
58            BindEs10xSingleRequest.buildTlv("80", pd2Tid)
59            + BindEs10xSingleRequest.buildTlv("01", "FF"));
60        var pd2Sgn = "";
61        while (pd2Sgn.length != 2 * pd2Sks[pd2Sel].length) {
62            bind.engine.SleepTime(2000);
63            pd2Sgn = bind.engine.EccSignData(pd2Sks[pd2Sel], pd2S2 + BindEs10xSingleRequest.buildTlv("5F37", pd2Sig1), 33);
64        }
65        var pd2Req = BindEs10xSingleRequest.buildTlv("BF21",
66            pd2S2
67            + BindEs10xSingleRequest.buildTlv("5F37", pd2Sgn)
68            + BindEs10xSingleRequest.buildTlv("04", pd2HashCc)
69            + BindEs10xSingleRequest.buildTlv("30", pd2Certs[pd2Sel]));
70        var pd2Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
71            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd2Req,
72             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
73        var pd2Sw = (pd2Run.final && pd2Run.final.sw) ? pd2Run.final.sw : "transport_error";
74        bind.checkData("S2-C1 SW", "9000", pd2Sw);
75        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
76        var pd2Otpk = "";
77        if (pd2Run.final && pd2Run.final.resp) {
78            var pd2L1 = BindEs10xSingleRequest.parseBerTlv(pd2Run.final.resp);
79            for (var pd2I1 = 0; pd2I1 < pd2L1.length && pd2Otpk === ""; pd2I1++) {
80                if (pd2L1[pd2I1].tag !== "BF21") continue;
81                var pd2L2 = BindEs10xSingleRequest.parseBerTlv(pd2L1[pd2I1].value);
82                for (var pd2I2 = 0; pd2I2 < pd2L2.length && pd2Otpk === ""; pd2I2++) {
83                    if (pd2L2[pd2I2].tag !== "A0") continue;
84                    var pd2L3 = BindEs10xSingleRequest.parseBerTlv(pd2L2[pd2I2].value);
85                    for (var pd2I3 = 0; pd2I3 < pd2L3.length && pd2Otpk === ""; pd2I3++) {
86                        if (pd2L3[pd2I3].tag !== "30") continue;
87                        var pd2L4 = BindEs10xSingleRequest.parseBerTlv(pd2L3[pd2I3].value);
88                        for (var pd2I4 = 0; pd2I4 < pd2L4.length; pd2I4++) {
89                            if (pd2L4[pd2I4].tag === "5F49") pd2Otpk = pd2L4[pd2I4].value;
90                        }
91                    }
92                }
93            }
94        }
95    }
96    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
97    var pd2RSR = (pd2Run.final && pd2Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd2Run.final.resp) : [];
98    var pd2RSOuter = pd2RSR.length === 1 ? pd2RSR[0].tag : "absent";
99    var pd2RSBr = pd2RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd2RSR[0].value) : [];
100    var pd2RSA0 = false, pd2RSA1 = false, pd2RSCk = [];
101    for (var pd2RSi = 0; pd2RSi < pd2RSBr.length; pd2RSi++) {
102        if (pd2RSBr[pd2RSi].tag === "A0") { pd2RSA0 = true; pd2RSCk = BindEs10xSingleRequest.parseBerTlv(pd2RSBr[pd2RSi].value); }
103        if (pd2RSBr[pd2RSi].tag === "A1") { pd2RSA1 = true; pd2RSCk = BindEs10xSingleRequest.parseBerTlv(pd2RSBr[pd2RSi].value); }
104    }
105    var pd2RS30 = false, pd2RS5F37 = false, pd2RS80 = false, pd2RS02 = false;
106    for (var pd2RSj = 0; pd2RSj < pd2RSCk.length; pd2RSj++) {
107        if (pd2RSCk[pd2RSj].tag === "30") pd2RS30 = true;
108        if (pd2RSCk[pd2RSj].tag === "5F37") pd2RS5F37 = true;
109        if (pd2RSCk[pd2RSj].tag === "80") pd2RS80 = true;
110        if (pd2RSCk[pd2RSj].tag === "02") pd2RS02 = true;
111    }
112    var pd2RS5F49 = false;
113    if (pd2RS30) {
114        for (var pd2RSk = 0; pd2RSk < pd2RSCk.length; pd2RSk++) {
115            if (pd2RSCk[pd2RSk].tag !== "30") continue;
116            var pd2RSU = BindEs10xSingleRequest.parseBerTlv(pd2RSCk[pd2RSk].value);
117            for (var pd2RSm = 0; pd2RSm < pd2RSU.length; pd2RSm++) {
118                if (pd2RSU[pd2RSm].tag === "5F49") pd2RS5F49 = true;
119                if (pd2RSU[pd2RSm].tag === "80") pd2RS80 = true;
120            }
121        }
122    }
123    bind.checkData("S2-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd2RSOuter);
124    bind.checkData("S2-C2 R_PREP_DOWNLOAD required members present", "1", (pd2RSA0 && pd2RS30 && pd2RS80 && pd2RS5F49 && pd2RS5F37) ? "1" : "0");
125    // S2-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
126    // S2-C4: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
127    // S2-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
128    // S2-C6: binding:prep_download_response_otpk_extract_cross_step(5F49;S22_prep_dl) (check_attestation)
129
130    // 步骤 3:Seq#01] Execute the Common Mutual Authentication procedure between the eUICC and the S_SM-DP+ #GET_EUICC_INFO1, #GET_EUICC_CHALLENGE and #AUTHENTICATE_SMDP are sent to the eUICC the same GSMA CI as for the first attempt has been chosen for signing and for verification(tc_step;REQ: RQ57_047)
131    // W3D CMA 过程声明行内联动态绑定(三命令链;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;421324 IC6 dynamic-bound 先例机制面)
132    // CMA 链命令 1/3 GetEuiccInfo1(BF20 空结构,S22_info §5.7.8):
133    var cma3I1 = bind.sendApdu(null, "E2", "91", "00", "BF2000", null, "9000");
134    var cma3Gw1 = BindGecaProc.parseGecaResponse(cma3I1.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
135    // CMA 链命令 2/3 GetEuiccChallenge(BF2E 空结构,S22_challenge §5.7.7;响应 euiccChallenge 成员运行时提取):
136    var cma3C2 = bind.sendApdu(null, "E2", "91", "00", "BF2E00", null, "9000");
137    var cma3Ch = BindGecaProc.parseGecaResponse(cma3C2.resp, {outer: "BF2E", required: ["80"], optional: []});
138    // CMA 链命令 3/3 AuthenticateServer(BF38 引擎组装;槽位值=声明面分级注入):
139    var cma3Tid = "";
140    var cma3Sc = "";
141    for (var cma3Ri = 0; cma3Ri < 16; cma3Ri++) {
142        cma3Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
143        cma3Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
144    }
145    var cma3PkList = BindEs10xSingleRequest.parseBerTlv(cma3Gw1.fields["AA"] || "");
146    var cma3CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
147    var cma3Sks = ["0A7CC1C244E60C52CD5B7807AB8C360C26524601507DCABC5DD598B5A616D5D5", "93FB33D0584F349B07F8B5D2AF93D7C3E354B349A3B913502E6ABC070E4D4929"];
148    var cma3Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
149    var cma3Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
150    var cma3Sel = -1;
151    for (var cma3Pi = 0; cma3Pi < cma3PkList.length && cma3Sel < 0; cma3Pi++) {
152        for (var cma3Mi = 0; cma3Mi < cma3CiIds.length; cma3Mi++) {
153            if (cma3PkList[cma3Pi].value === cma3CiIds[cma3Mi]) { cma3Sel = cma3Mi; break; }
154        }
155    }
156    var cma3Ech = "";
157    for (var cma3Ei = 0; cma3Ei < cma3Ch.children.length; cma3Ei++) {
158        if (cma3Ch.children[cma3Ei].tag === "80") { cma3Ech = cma3Ch.children[cma3Ei].value; }
159    }
160    if (cma3Sel < 0 || cma3Ech === "") {
161        // fail-closed 诚实面:CI PK ID 零命中物料套或 euiccChallenge 缺席 → BF38 不发送,后续过程面如实失败。
162        bind.checkData("S3-C1 cma_ok", "1", "0");
163    } else {
164        bind.engine.InitEccDomainParams(cma3Dps[cma3Sel][0], cma3Dps[cma3Sel][1], cma3Dps[cma3Sel][2], cma3Dps[cma3Sel][3], cma3Dps[cma3Sel][4], 1);
165        var cma3S1 = BindEs10xSingleRequest.buildTlv("30",
166            BindEs10xSingleRequest.buildTlv("80", cma3Tid)
167            + BindEs10xSingleRequest.buildTlv("81", cma3Ech)
168            + BindEs10xSingleRequest.buildTlv("83", "1674657374736D6470706C7573312E6578616D706C652E636F6D")
169            + BindEs10xSingleRequest.buildTlv("84", cma3Sc));
170        var cma3Sgn = "";
171        while (cma3Sgn.length != 2 * cma3Sks[cma3Sel].length) {
172            bind.engine.SleepTime(2000);
173            cma3Sgn = bind.engine.EccSignData(cma3Sks[cma3Sel], cma3S1, 33);
174        }
175        var cma3Asm = BindEs10bAuthServer.assembleAuthenticateServer(
176            {outer: "BF38",
177             signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
178             serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
179            {transactionId: cma3Tid, euiccChallenge: cma3Ech,
180             serverAddress: "1674657374736D6470706C7573312E6578616D706C652E636F6D", serverChallenge: cma3Sc,
181             serverSignature1: cma3Sgn, euiccCiPKIdToBeUsed: cma3CiIds[cma3Sel],
182             serverCertificate: cma3Certs[cma3Sel], ctxParams1: "A10D800400000110A1058003000010"});
183        if (cma3Asm.error) {
184        bind.checkData("S3-C1 cma_ok", "1", "0");
185        } else {
186            var cma3Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
187                {cla: "", ins: "E2", p1: "91", p2: "00", data: cma3Asm.request_hex,
188                 le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
189            var cma3Sw = (cma3Run.final && cma3Run.final.sw) ? cma3Run.final.sw : "transport_error";
190            var cma3Ex = BindEs10bAuthServer.extractAuthenticateServer(
191                {outer: "BF38",
192                 ok: {tag: "A0", children: [
193                     {name: "euiccSigned1", tag: "30", children: [
194                         {name: "transactionId", tag: "80"},
195                         {name: "serverAddress", tag: "83"},
196                         {name: "serverChallenge", tag: "84"},
197                         {name: "euiccInfo2", tag: "BF22"},
198                         {name: "ctxParams1", tag: "A0"}]},
199                     {name: "euiccSignature1", tag: "5F37"},
200                     {name: "euiccCertificate", tag: "30"},
201                     {name: "eumCertificate", tag: "30"}]},
202                 error: {tag: "A1", children: [
203{name: "transactionId", tag: "80"},
204 {name: "authenticateErrorCode", tag: "81"}]}},
205                cma3Run.final ? cma3Run.final.resp : "");
206            var cma3OkBr = cma3Ex.branch === "ok" && cma3Ex.ok && cma3Ex.ok.missing.length === 0 && cma3Ex.ok.fields.euiccSigned1.children.missing.length === 0;
207            bind.checkData("S3-C1 Common Mutual Authentication re-execution ok", "1", cma3OkBr ? "1" : "0");
208            // euiccSignature1([5F37])运行时提取面登记:CMA 响应操作数供后续步(PREP_DOWNLOAD 签名明文)消费——5.2.2.2.1 后续 step5-8 属子过程声明/装配域,非本步发射面。
209        }
210    }
211
212    // 步骤 4:<S_HASHED_CC> = MTD_GENERATE_HASHED_CC(tc_step;non_wire)
213    // test-tool internal preparation (no APDU face): runtime-domain
214    // values per CaseIR unresolved (G Annex B generation rules);
215    // no fabricated bytes emitted here.
216
217    // 步骤 5:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030, RQ31_137, RQ57_033)
218    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_RETRY_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
219    //   transactionId/euiccSignature1=前序 CMA 声明步 step3 运行时提取(§5.7.5 会话一致性同值要求,不新生成);smdpSignature2=EccSignData(DPpb SK, smdpSigned2 TLV‖5F37(euiccSignature1), 33)(S22_prep_dl+G Annex B+vendor GenRequest 三源对账);
220    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
221    var pd5Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
222    var pd5Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
223    var pd5Tid = cma3Tid;
224    var pd5Sel = cma3Sel;
225    var pd5Sig1 = (typeof cma3Ex !== "undefined" && cma3Ex && cma3Ex.ok && cma3Ex.ok.fields.euiccSignature1) ? cma3Ex.ok.fields.euiccSignature1.value : "";
226    var pd5Dps = cma3Dps;
227    var pd5OtpkRef = (typeof pd2Otpk !== "undefined") ? pd2Otpk : "";
228    var pd5CcH = bind.engine.Sha256("4142434445464748494A", 20);
229    var pd5HashCc = bind.engine.Sha256(pd5CcH + pd5Tid, (pd5CcH + pd5Tid).length);
230    if (pd5Sel < 0 || pd5Sig1 === "" || pd5OtpkRef === "") {
231        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
232        bind.checkData("S5-C1 SW", "9000", "pd5_not_executed:cma_operands_absent");
233        bind.checkData("S5-C2 R_PREP_DOWNLOAD response structure", "1", "pd5_not_executed:cma_operands_absent");
234    } else {
235        bind.engine.InitEccDomainParams(pd5Dps[pd5Sel][0], pd5Dps[pd5Sel][1], pd5Dps[pd5Sel][2], pd5Dps[pd5Sel][3], pd5Dps[pd5Sel][4], 1);
236        var pd5S2 = BindEs10xSingleRequest.buildTlv("30",
237            BindEs10xSingleRequest.buildTlv("80", pd5Tid)
238            + BindEs10xSingleRequest.buildTlv("01", "FF")
239            + BindEs10xSingleRequest.buildTlv("5F49", pd5OtpkRef));
240        var pd5Sgn = "";
241        while (pd5Sgn.length != 2 * pd5Sks[pd5Sel].length) {
242            bind.engine.SleepTime(2000);
243            pd5Sgn = bind.engine.EccSignData(pd5Sks[pd5Sel], pd5S2 + BindEs10xSingleRequest.buildTlv("5F37", pd5Sig1), 33);
244        }
245        var pd5Req = BindEs10xSingleRequest.buildTlv("BF21",
246            pd5S2
247            + BindEs10xSingleRequest.buildTlv("5F37", pd5Sgn)
248            + BindEs10xSingleRequest.buildTlv("04", pd5HashCc)
249            + BindEs10xSingleRequest.buildTlv("30", pd5Certs[pd5Sel]));
250        var pd5Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
251            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd5Req,
252             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
253        var pd5Sw = (pd5Run.final && pd5Run.final.sw) ? pd5Run.final.sw : "transport_error";
254        bind.checkData("S5-C1 SW", "9000", pd5Sw);
255        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
256        var pd5Otpk = "";
257        if (pd5Run.final && pd5Run.final.resp) {
258            var pd5L1 = BindEs10xSingleRequest.parseBerTlv(pd5Run.final.resp);
259            for (var pd5I1 = 0; pd5I1 < pd5L1.length && pd5Otpk === ""; pd5I1++) {
260                if (pd5L1[pd5I1].tag !== "BF21") continue;
261                var pd5L2 = BindEs10xSingleRequest.parseBerTlv(pd5L1[pd5I1].value);
262                for (var pd5I2 = 0; pd5I2 < pd5L2.length && pd5Otpk === ""; pd5I2++) {
263                    if (pd5L2[pd5I2].tag !== "A0") continue;
264                    var pd5L3 = BindEs10xSingleRequest.parseBerTlv(pd5L2[pd5I2].value);
265                    for (var pd5I3 = 0; pd5I3 < pd5L3.length && pd5Otpk === ""; pd5I3++) {
266                        if (pd5L3[pd5I3].tag !== "30") continue;
267                        var pd5L4 = BindEs10xSingleRequest.parseBerTlv(pd5L3[pd5I3].value);
268                        for (var pd5I4 = 0; pd5I4 < pd5L4.length; pd5I4++) {
269                            if (pd5L4[pd5I4].tag === "5F49") pd5Otpk = pd5L4[pd5I4].value;
270                        }
271                    }
272                }
273            }
274        }
275    }
276    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
277    var pd5RSR = (pd5Run.final && pd5Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd5Run.final.resp) : [];
278    var pd5RSOuter = pd5RSR.length === 1 ? pd5RSR[0].tag : "absent";
279    var pd5RSBr = pd5RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd5RSR[0].value) : [];
280    var pd5RSA0 = false, pd5RSA1 = false, pd5RSCk = [];
281    for (var pd5RSi = 0; pd5RSi < pd5RSBr.length; pd5RSi++) {
282        if (pd5RSBr[pd5RSi].tag === "A0") { pd5RSA0 = true; pd5RSCk = BindEs10xSingleRequest.parseBerTlv(pd5RSBr[pd5RSi].value); }
283        if (pd5RSBr[pd5RSi].tag === "A1") { pd5RSA1 = true; pd5RSCk = BindEs10xSingleRequest.parseBerTlv(pd5RSBr[pd5RSi].value); }
284    }
285    var pd5RS30 = false, pd5RS5F37 = false, pd5RS80 = false, pd5RS02 = false;
286    for (var pd5RSj = 0; pd5RSj < pd5RSCk.length; pd5RSj++) {
287        if (pd5RSCk[pd5RSj].tag === "30") pd5RS30 = true;
288        if (pd5RSCk[pd5RSj].tag === "5F37") pd5RS5F37 = true;
289        if (pd5RSCk[pd5RSj].tag === "80") pd5RS80 = true;
290        if (pd5RSCk[pd5RSj].tag === "02") pd5RS02 = true;
291    }
292    var pd5RS5F49 = false;
293    if (pd5RS30) {
294        for (var pd5RSk = 0; pd5RSk < pd5RSCk.length; pd5RSk++) {
295            if (pd5RSCk[pd5RSk].tag !== "30") continue;
296            var pd5RSU = BindEs10xSingleRequest.parseBerTlv(pd5RSCk[pd5RSk].value);
297            for (var pd5RSm = 0; pd5RSm < pd5RSU.length; pd5RSm++) {
298                if (pd5RSU[pd5RSm].tag === "5F49") pd5RS5F49 = true;
299                if (pd5RSU[pd5RSm].tag === "80") pd5RS80 = true;
300            }
301        }
302    }
303    bind.checkData("S5-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd5RSOuter);
304    bind.checkData("S5-C2 R_PREP_DOWNLOAD required members present", "1", (pd5RSA0 && pd5RS30 && pd5RS80 && pd5RS5F49 && pd5RS5F37) ? "1" : "0");
305    // S5-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
306    // S5-C4: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
307    // S5-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
308    // S5-C6: binding:prep_download_retry_otpk_reuse(previous-5F49;RQ31_137) (check_attestation)
309
310    // 步骤 6:<S_HASHED_CC> = MTD_GENERATE_HASHED_CC(tc_step;non_wire)
311    // test-tool internal preparation (no APDU face): runtime-domain
312    // values per CaseIR unresolved (G Annex B generation rules);
313    // no fabricated bytes emitted here.
314
315    // 步骤 7:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030)
316    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_WITH_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
317    //   transactionId/euiccSignature1=前序 CMA 声明步 step3 运行时提取(§5.7.5 会话一致性同值要求,不新生成);smdpSignature2=EccSignData(DPpb SK, smdpSigned2 TLV‖5F37(euiccSignature1), 33)(S22_prep_dl+G Annex B+vendor GenRequest 三源对账);
318    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
319    var pd7Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
320    var pd7Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
321    var pd7Tid = cma3Tid;
322    var pd7Sel = cma3Sel;
323    var pd7Sig1 = (typeof cma3Ex !== "undefined" && cma3Ex && cma3Ex.ok && cma3Ex.ok.fields.euiccSignature1) ? cma3Ex.ok.fields.euiccSignature1.value : "";
324    var pd7Dps = cma3Dps;
325    var pd7CcH = bind.engine.Sha256("30313032303330343035", 20);
326    var pd7HashCc = bind.engine.Sha256(pd7CcH + pd7Tid, (pd7CcH + pd7Tid).length);
327    if (pd7Sel < 0 || pd7Sig1 === "") {
328        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
329        bind.checkData("S7-C1 SW", "9000", "pd7_not_executed:cma_operands_absent");
330        bind.checkData("S7-C2 R_PREP_DOWNLOAD response structure", "1", "pd7_not_executed:cma_operands_absent");
331    } else {
332        bind.engine.InitEccDomainParams(pd7Dps[pd7Sel][0], pd7Dps[pd7Sel][1], pd7Dps[pd7Sel][2], pd7Dps[pd7Sel][3], pd7Dps[pd7Sel][4], 1);
333        var pd7S2 = BindEs10xSingleRequest.buildTlv("30",
334            BindEs10xSingleRequest.buildTlv("80", pd7Tid)
335            + BindEs10xSingleRequest.buildTlv("01", "FF"));
336        var pd7Sgn = "";
337        while (pd7Sgn.length != 2 * pd7Sks[pd7Sel].length) {
338            bind.engine.SleepTime(2000);
339            pd7Sgn = bind.engine.EccSignData(pd7Sks[pd7Sel], pd7S2 + BindEs10xSingleRequest.buildTlv("5F37", pd7Sig1), 33);
340        }
341        var pd7Req = BindEs10xSingleRequest.buildTlv("BF21",
342            pd7S2
343            + BindEs10xSingleRequest.buildTlv("5F37", pd7Sgn)
344            + BindEs10xSingleRequest.buildTlv("04", pd7HashCc)
345            + BindEs10xSingleRequest.buildTlv("30", pd7Certs[pd7Sel]));
346        var pd7Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
347            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd7Req,
348             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
349        var pd7Sw = (pd7Run.final && pd7Run.final.sw) ? pd7Run.final.sw : "transport_error";
350        bind.checkData("S7-C1 SW", "9000", pd7Sw);
351        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
352        var pd7Otpk = "";
353        if (pd7Run.final && pd7Run.final.resp) {
354            var pd7L1 = BindEs10xSingleRequest.parseBerTlv(pd7Run.final.resp);
355            for (var pd7I1 = 0; pd7I1 < pd7L1.length && pd7Otpk === ""; pd7I1++) {
356                if (pd7L1[pd7I1].tag !== "BF21") continue;
357                var pd7L2 = BindEs10xSingleRequest.parseBerTlv(pd7L1[pd7I1].value);
358                for (var pd7I2 = 0; pd7I2 < pd7L2.length && pd7Otpk === ""; pd7I2++) {
359                    if (pd7L2[pd7I2].tag !== "A0") continue;
360                    var pd7L3 = BindEs10xSingleRequest.parseBerTlv(pd7L2[pd7I2].value);
361                    for (var pd7I3 = 0; pd7I3 < pd7L3.length && pd7Otpk === ""; pd7I3++) {
362                        if (pd7L3[pd7I3].tag !== "30") continue;
363                        var pd7L4 = BindEs10xSingleRequest.parseBerTlv(pd7L3[pd7I3].value);
364                        for (var pd7I4 = 0; pd7I4 < pd7L4.length; pd7I4++) {
365                            if (pd7L4[pd7I4].tag === "5F49") pd7Otpk = pd7L4[pd7I4].value;
366                        }
367                    }
368                }
369            }
370        }
371    }
372    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
373    var pd7RSR = (pd7Run.final && pd7Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd7Run.final.resp) : [];
374    var pd7RSOuter = pd7RSR.length === 1 ? pd7RSR[0].tag : "absent";
375    var pd7RSBr = pd7RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd7RSR[0].value) : [];
376    var pd7RSA0 = false, pd7RSA1 = false, pd7RSCk = [];
377    for (var pd7RSi = 0; pd7RSi < pd7RSBr.length; pd7RSi++) {
378        if (pd7RSBr[pd7RSi].tag === "A0") { pd7RSA0 = true; pd7RSCk = BindEs10xSingleRequest.parseBerTlv(pd7RSBr[pd7RSi].value); }
379        if (pd7RSBr[pd7RSi].tag === "A1") { pd7RSA1 = true; pd7RSCk = BindEs10xSingleRequest.parseBerTlv(pd7RSBr[pd7RSi].value); }
380    }
381    var pd7RS30 = false, pd7RS5F37 = false, pd7RS80 = false, pd7RS02 = false;
382    for (var pd7RSj = 0; pd7RSj < pd7RSCk.length; pd7RSj++) {
383        if (pd7RSCk[pd7RSj].tag === "30") pd7RS30 = true;
384        if (pd7RSCk[pd7RSj].tag === "5F37") pd7RS5F37 = true;
385        if (pd7RSCk[pd7RSj].tag === "80") pd7RS80 = true;
386        if (pd7RSCk[pd7RSj].tag === "02") pd7RS02 = true;
387    }
388    var pd7RS5F49 = false;
389    if (pd7RS30) {
390        for (var pd7RSk = 0; pd7RSk < pd7RSCk.length; pd7RSk++) {
391            if (pd7RSCk[pd7RSk].tag !== "30") continue;
392            var pd7RSU = BindEs10xSingleRequest.parseBerTlv(pd7RSCk[pd7RSk].value);
393            for (var pd7RSm = 0; pd7RSm < pd7RSU.length; pd7RSm++) {
394                if (pd7RSU[pd7RSm].tag === "5F49") pd7RS5F49 = true;
395                if (pd7RSU[pd7RSm].tag === "80") pd7RS80 = true;
396            }
397        }
398    }
399    bind.checkData("S7-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd7RSOuter);
400    bind.checkData("S7-C2 R_PREP_DOWNLOAD required members present", "1", (pd7RSA0 && pd7RS30 && pd7RS80 && pd7RS5F49 && pd7RS5F37) ? "1" : "0");
401    // S7-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
402    // S7-C4: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
403    // S7-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
404    // S7-C6: binding:prep_download_response_otpk_extract_cross_step(5F49;S22_prep_dl) (check_attestation)
405
406    var cs8Tid = "";
407    for (var cs8Ri = 0; cs8Ri < 16; cs8Ri++) {
408        cs8Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
409    }
410    // cancel_session 运行时绑定(B-7):BF41{80<tid> 81 01 01}——tid 运行时随机 16B;reason S22:9140 枚举
411    var cs8Asm = BindEs10bCancelSession.assembleCancelSession({outer: "BF41", transactionId: "80", reason: "81"}, {transactionId: cs8Tid, reason: "01"});
412    if (cs8Asm.error) {
413        bind.checkData("S8-C1 assemble", "1", "0");
414        bind.checkData("S8-C2 assemble", "1", "0");
415    } else {
416        var s8 = bind.sendApdu(null, "E2", "91", "00", cs8Asm.request_hex, "00", "9000");
417        bind.checkData("S8-C1 SW", "9000", s8.sw);
418        var cs8Ex = BindEs10bCancelSession.extractCancelSession({outer: "BF41", ok: {tag: "A0", children: [{name: "euiccCancelSessionSigned", tag: "30", children: [{name: "transactionId", tag: "80"},{name: "smdpOid", tag: "81"},{name: "reason", tag: "82"}]},{name: "euiccCancelSessionSignature", tag: "5F37"}]},error: {tag: "81"}}, s8.resp);
419        bind.checkData("S8-C2 cancelSessionResponseOk structure", "1", (cs8Ex.branch === "ok" && cs8Ex.ok && cs8Ex.ok.missing.length === 0 && cs8Ex.ok.fields.euiccCancelSessionSigned.children.missing.length === 0) ? "1" : "0");
420    }
421
422    // 步骤 9:Seq#02] Execute the Common Mutual Authentication procedure between the eUICC and the S_SM-DP+ #GET_EUICC_INFO1, #GET_EUICC_CHALLENGE and #AUTHENTICATE_SMDP are sent to the eUICC the same GSMA CI as for the first attempt has been chosen for signing and for verification(tc_step;REQ: RQ57_047)
423    // W3D CMA 过程声明行内联动态绑定(三命令链;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;421324 IC6 dynamic-bound 先例机制面)
424    // CMA 链命令 1/3 GetEuiccInfo1(BF20 空结构,S22_info §5.7.8):
425    var cma9I1 = bind.sendApdu(null, "E2", "91", "00", "BF2000", null, "9000");
426    var cma9Gw1 = BindGecaProc.parseGecaResponse(cma9I1.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
427    // CMA 链命令 2/3 GetEuiccChallenge(BF2E 空结构,S22_challenge §5.7.7;响应 euiccChallenge 成员运行时提取):
428    var cma9C2 = bind.sendApdu(null, "E2", "91", "00", "BF2E00", null, "9000");
429    var cma9Ch = BindGecaProc.parseGecaResponse(cma9C2.resp, {outer: "BF2E", required: ["80"], optional: []});
430    // CMA 链命令 3/3 AuthenticateServer(BF38 引擎组装;槽位值=声明面分级注入):
431    var cma9Tid = "";
432    var cma9Sc = "";
433    for (var cma9Ri = 0; cma9Ri < 16; cma9Ri++) {
434        cma9Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
435        cma9Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
436    }
437    var cma9PkList = BindEs10xSingleRequest.parseBerTlv(cma9Gw1.fields["AA"] || "");
438    var cma9CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
439    var cma9Sks = ["0A7CC1C244E60C52CD5B7807AB8C360C26524601507DCABC5DD598B5A616D5D5", "93FB33D0584F349B07F8B5D2AF93D7C3E354B349A3B913502E6ABC070E4D4929"];
440    var cma9Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
441    var cma9Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
442    var cma9Sel = -1;
443    for (var cma9Pi = 0; cma9Pi < cma9PkList.length && cma9Sel < 0; cma9Pi++) {
444        for (var cma9Mi = 0; cma9Mi < cma9CiIds.length; cma9Mi++) {
445            if (cma9PkList[cma9Pi].value === cma9CiIds[cma9Mi]) { cma9Sel = cma9Mi; break; }
446        }
447    }
448    var cma9Ech = "";
449    for (var cma9Ei = 0; cma9Ei < cma9Ch.children.length; cma9Ei++) {
450        if (cma9Ch.children[cma9Ei].tag === "80") { cma9Ech = cma9Ch.children[cma9Ei].value; }
451    }
452    if (cma9Sel < 0 || cma9Ech === "") {
453        // fail-closed 诚实面:CI PK ID 零命中物料套或 euiccChallenge 缺席 → BF38 不发送,后续过程面如实失败。
454        bind.checkData("S9-C1 cma_ok", "1", "0");
455    } else {
456        bind.engine.InitEccDomainParams(cma9Dps[cma9Sel][0], cma9Dps[cma9Sel][1], cma9Dps[cma9Sel][2], cma9Dps[cma9Sel][3], cma9Dps[cma9Sel][4], 1);
457        var cma9S1 = BindEs10xSingleRequest.buildTlv("30",
458            BindEs10xSingleRequest.buildTlv("80", cma9Tid)
459            + BindEs10xSingleRequest.buildTlv("81", cma9Ech)
460            + BindEs10xSingleRequest.buildTlv("83", "1674657374736D6470706C7573312E6578616D706C652E636F6D")
461            + BindEs10xSingleRequest.buildTlv("84", cma9Sc));
462        var cma9Sgn = "";
463        while (cma9Sgn.length != 2 * cma9Sks[cma9Sel].length) {
464            bind.engine.SleepTime(2000);
465            cma9Sgn = bind.engine.EccSignData(cma9Sks[cma9Sel], cma9S1, 33);
466        }
467        var cma9Asm = BindEs10bAuthServer.assembleAuthenticateServer(
468            {outer: "BF38",
469             signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
470             serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
471            {transactionId: cma9Tid, euiccChallenge: cma9Ech,
472             serverAddress: "1674657374736D6470706C7573312E6578616D706C652E636F6D", serverChallenge: cma9Sc,
473             serverSignature1: cma9Sgn, euiccCiPKIdToBeUsed: cma9CiIds[cma9Sel],
474             serverCertificate: cma9Certs[cma9Sel], ctxParams1: "A10D800400000110A1058003000010"});
475        if (cma9Asm.error) {
476        bind.checkData("S9-C1 cma_ok", "1", "0");
477        } else {
478            var cma9Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
479                {cla: "", ins: "E2", p1: "91", p2: "00", data: cma9Asm.request_hex,
480                 le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
481            var cma9Sw = (cma9Run.final && cma9Run.final.sw) ? cma9Run.final.sw : "transport_error";
482            var cma9Ex = BindEs10bAuthServer.extractAuthenticateServer(
483                {outer: "BF38",
484                 ok: {tag: "A0", children: [
485                     {name: "euiccSigned1", tag: "30", children: [
486                         {name: "transactionId", tag: "80"},
487                         {name: "serverAddress", tag: "83"},
488                         {name: "serverChallenge", tag: "84"},
489                         {name: "euiccInfo2", tag: "BF22"},
490                         {name: "ctxParams1", tag: "A0"}]},
491                     {name: "euiccSignature1", tag: "5F37"},
492                     {name: "euiccCertificate", tag: "30"},
493                     {name: "eumCertificate", tag: "30"}]},
494                 error: {tag: "A1", children: [
495{name: "transactionId", tag: "80"},
496 {name: "authenticateErrorCode", tag: "81"}]}},
497                cma9Run.final ? cma9Run.final.resp : "");
498            var cma9OkBr = cma9Ex.branch === "ok" && cma9Ex.ok && cma9Ex.ok.missing.length === 0 && cma9Ex.ok.fields.euiccSigned1.children.missing.length === 0;
499            bind.checkData("S9-C1 Common Mutual Authentication re-execution ok", "1", cma9OkBr ? "1" : "0");
500            // euiccSignature1([5F37])运行时提取面登记:CMA 响应操作数供后续步(PREP_DOWNLOAD 签名明文)消费——5.2.2.2.1 后续 step5-8 属子过程声明/装配域,非本步发射面。
501        }
502    }
503
504    // 步骤 10:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030, RQ31_137, RQ57_033)
505    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_RETRY_C;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
506    //   transactionId/euiccSignature1=前序 CMA 声明步 step9 运行时提取(§5.7.5 会话一致性同值要求,不新生成);smdpSignature2=EccSignData(DPpb SK, smdpSigned2 TLV‖5F37(euiccSignature1), 33)(S22_prep_dl+G Annex B+vendor GenRequest 三源对账);
507    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
508    var pd10Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
509    var pd10Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
510    var pd10Tid = cma9Tid;
511    var pd10Sel = cma9Sel;
512    var pd10Sig1 = (typeof cma9Ex !== "undefined" && cma9Ex && cma9Ex.ok && cma9Ex.ok.fields.euiccSignature1) ? cma9Ex.ok.fields.euiccSignature1.value : "";
513    var pd10Dps = cma9Dps;
514    var pd10OtpkRef = (typeof pd7Otpk !== "undefined") ? pd7Otpk : "";
515    var pd10CcH = bind.engine.Sha256("30313032303330343035", 20);
516    var pd10HashCc = bind.engine.Sha256(pd10CcH + pd10Tid, (pd10CcH + pd10Tid).length);
517    if (pd10Sel < 0 || pd10Sig1 === "" || pd10OtpkRef === "") {
518        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
519        bind.checkData("S10-C1 SW", "9000", "pd10_not_executed:cma_operands_absent");
520        bind.checkData("S10-C2 R_PREP_DOWNLOAD response structure", "1", "pd10_not_executed:cma_operands_absent");
521    } else {
522        bind.engine.InitEccDomainParams(pd10Dps[pd10Sel][0], pd10Dps[pd10Sel][1], pd10Dps[pd10Sel][2], pd10Dps[pd10Sel][3], pd10Dps[pd10Sel][4], 1);
523        var pd10S2 = BindEs10xSingleRequest.buildTlv("30",
524            BindEs10xSingleRequest.buildTlv("80", pd10Tid)
525            + BindEs10xSingleRequest.buildTlv("01", "FF")
526            + BindEs10xSingleRequest.buildTlv("5F49", pd10OtpkRef));
527        var pd10Sgn = "";
528        while (pd10Sgn.length != 2 * pd10Sks[pd10Sel].length) {
529            bind.engine.SleepTime(2000);
530            pd10Sgn = bind.engine.EccSignData(pd10Sks[pd10Sel], pd10S2 + BindEs10xSingleRequest.buildTlv("5F37", pd10Sig1), 33);
531        }
532        var pd10Req = BindEs10xSingleRequest.buildTlv("BF21",
533            pd10S2
534            + BindEs10xSingleRequest.buildTlv("5F37", pd10Sgn)
535            + BindEs10xSingleRequest.buildTlv("04", pd10HashCc)
536            + BindEs10xSingleRequest.buildTlv("30", pd10Certs[pd10Sel]));
537        var pd10Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
538            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd10Req,
539             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
540        var pd10Sw = (pd10Run.final && pd10Run.final.sw) ? pd10Run.final.sw : "transport_error";
541        bind.checkData("S10-C1 SW", "9000", pd10Sw);
542        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
543        var pd10Otpk = "";
544        if (pd10Run.final && pd10Run.final.resp) {
545            var pd10L1 = BindEs10xSingleRequest.parseBerTlv(pd10Run.final.resp);
546            for (var pd10I1 = 0; pd10I1 < pd10L1.length && pd10Otpk === ""; pd10I1++) {
547                if (pd10L1[pd10I1].tag !== "BF21") continue;
548                var pd10L2 = BindEs10xSingleRequest.parseBerTlv(pd10L1[pd10I1].value);
549                for (var pd10I2 = 0; pd10I2 < pd10L2.length && pd10Otpk === ""; pd10I2++) {
550                    if (pd10L2[pd10I2].tag !== "A0") continue;
551                    var pd10L3 = BindEs10xSingleRequest.parseBerTlv(pd10L2[pd10I2].value);
552                    for (var pd10I3 = 0; pd10I3 < pd10L3.length && pd10Otpk === ""; pd10I3++) {
553                        if (pd10L3[pd10I3].tag !== "30") continue;
554                        var pd10L4 = BindEs10xSingleRequest.parseBerTlv(pd10L3[pd10I3].value);
555                        for (var pd10I4 = 0; pd10I4 < pd10L4.length; pd10I4++) {
556                            if (pd10L4[pd10I4].tag === "5F49") pd10Otpk = pd10L4[pd10I4].value;
557                        }
558                    }
559                }
560            }
561        }
562    }
563    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
564    var pd10RSR = (pd10Run.final && pd10Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd10Run.final.resp) : [];
565    var pd10RSOuter = pd10RSR.length === 1 ? pd10RSR[0].tag : "absent";
566    var pd10RSBr = pd10RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd10RSR[0].value) : [];
567    var pd10RSA0 = false, pd10RSA1 = false, pd10RSCk = [];
568    for (var pd10RSi = 0; pd10RSi < pd10RSBr.length; pd10RSi++) {
569        if (pd10RSBr[pd10RSi].tag === "A0") { pd10RSA0 = true; pd10RSCk = BindEs10xSingleRequest.parseBerTlv(pd10RSBr[pd10RSi].value); }
570        if (pd10RSBr[pd10RSi].tag === "A1") { pd10RSA1 = true; pd10RSCk = BindEs10xSingleRequest.parseBerTlv(pd10RSBr[pd10RSi].value); }
571    }
572    var pd10RS30 = false, pd10RS5F37 = false, pd10RS80 = false, pd10RS02 = false;
573    for (var pd10RSj = 0; pd10RSj < pd10RSCk.length; pd10RSj++) {
574        if (pd10RSCk[pd10RSj].tag === "30") pd10RS30 = true;
575        if (pd10RSCk[pd10RSj].tag === "5F37") pd10RS5F37 = true;
576        if (pd10RSCk[pd10RSj].tag === "80") pd10RS80 = true;
577        if (pd10RSCk[pd10RSj].tag === "02") pd10RS02 = true;
578    }
579    var pd10RS5F49 = false;
580    if (pd10RS30) {
581        for (var pd10RSk = 0; pd10RSk < pd10RSCk.length; pd10RSk++) {
582            if (pd10RSCk[pd10RSk].tag !== "30") continue;
583            var pd10RSU = BindEs10xSingleRequest.parseBerTlv(pd10RSCk[pd10RSk].value);
584            for (var pd10RSm = 0; pd10RSm < pd10RSU.length; pd10RSm++) {
585                if (pd10RSU[pd10RSm].tag === "5F49") pd10RS5F49 = true;
586                if (pd10RSU[pd10RSm].tag === "80") pd10RS80 = true;
587            }
588        }
589    }
590    bind.checkData("S10-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd10RSOuter);
591    bind.checkData("S10-C2 R_PREP_DOWNLOAD required members present", "1", (pd10RSA0 && pd10RS30 && pd10RS80 && pd10RS5F49 && pd10RS5F37) ? "1" : "0");
592    // S10-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
593    // S10-C4: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
594    // S10-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
595    // S10-C6: binding:prep_download_retry_otpk_reuse(previous-5F49;RQ31_137) (check_attestation)
596
597    // 步骤 11:<S_HASHED_CC> = MTD_GENERATE_HASHED_CC(tc_step;non_wire)
598    // test-tool internal preparation (no APDU face): runtime-domain
599    // values per CaseIR unresolved (G Annex B generation rules);
600    // no fabricated bytes emitted here.
601
602    // 步骤 12:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030)
603    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_WITH_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
604    //   transactionId/euiccSignature1=前序 CMA 声明步 step9 运行时提取(§5.7.5 会话一致性同值要求,不新生成);smdpSignature2=EccSignData(DPpb SK, smdpSigned2 TLV‖5F37(euiccSignature1), 33)(S22_prep_dl+G Annex B+vendor GenRequest 三源对账);
605    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
606    var pd12Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
607    var pd12Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
608    var pd12Tid = cma9Tid;
609    var pd12Sel = cma9Sel;
610    var pd12Sig1 = (typeof cma9Ex !== "undefined" && cma9Ex && cma9Ex.ok && cma9Ex.ok.fields.euiccSignature1) ? cma9Ex.ok.fields.euiccSignature1.value : "";
611    var pd12Dps = cma9Dps;
612    var pd12CcH = bind.engine.Sha256("30313032303330343035", 20);
613    var pd12HashCc = bind.engine.Sha256(pd12CcH + pd12Tid, (pd12CcH + pd12Tid).length);
614    if (pd12Sel < 0 || pd12Sig1 === "") {
615        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
616        bind.checkData("S12-C1 SW", "9000", "pd12_not_executed:cma_operands_absent");
617        bind.checkData("S12-C2 R_PREP_DOWNLOAD response structure", "1", "pd12_not_executed:cma_operands_absent");
618    } else {
619        bind.engine.InitEccDomainParams(pd12Dps[pd12Sel][0], pd12Dps[pd12Sel][1], pd12Dps[pd12Sel][2], pd12Dps[pd12Sel][3], pd12Dps[pd12Sel][4], 1);
620        var pd12S2 = BindEs10xSingleRequest.buildTlv("30",
621            BindEs10xSingleRequest.buildTlv("80", pd12Tid)
622            + BindEs10xSingleRequest.buildTlv("01", "FF"));
623        var pd12Sgn = "";
624        while (pd12Sgn.length != 2 * pd12Sks[pd12Sel].length) {
625            bind.engine.SleepTime(2000);
626            pd12Sgn = bind.engine.EccSignData(pd12Sks[pd12Sel], pd12S2 + BindEs10xSingleRequest.buildTlv("5F37", pd12Sig1), 33);
627        }
628        var pd12Req = BindEs10xSingleRequest.buildTlv("BF21",
629            pd12S2
630            + BindEs10xSingleRequest.buildTlv("5F37", pd12Sgn)
631            + BindEs10xSingleRequest.buildTlv("04", pd12HashCc)
632            + BindEs10xSingleRequest.buildTlv("30", pd12Certs[pd12Sel]));
633        var pd12Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
634            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd12Req,
635             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
636        var pd12Sw = (pd12Run.final && pd12Run.final.sw) ? pd12Run.final.sw : "transport_error";
637        bind.checkData("S12-C1 SW", "9000", pd12Sw);
638        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
639        var pd12Otpk = "";
640        if (pd12Run.final && pd12Run.final.resp) {
641            var pd12L1 = BindEs10xSingleRequest.parseBerTlv(pd12Run.final.resp);
642            for (var pd12I1 = 0; pd12I1 < pd12L1.length && pd12Otpk === ""; pd12I1++) {
643                if (pd12L1[pd12I1].tag !== "BF21") continue;
644                var pd12L2 = BindEs10xSingleRequest.parseBerTlv(pd12L1[pd12I1].value);
645                for (var pd12I2 = 0; pd12I2 < pd12L2.length && pd12Otpk === ""; pd12I2++) {
646                    if (pd12L2[pd12I2].tag !== "A0") continue;
647                    var pd12L3 = BindEs10xSingleRequest.parseBerTlv(pd12L2[pd12I2].value);
648                    for (var pd12I3 = 0; pd12I3 < pd12L3.length && pd12Otpk === ""; pd12I3++) {
649                        if (pd12L3[pd12I3].tag !== "30") continue;
650                        var pd12L4 = BindEs10xSingleRequest.parseBerTlv(pd12L3[pd12I3].value);
651                        for (var pd12I4 = 0; pd12I4 < pd12L4.length; pd12I4++) {
652                            if (pd12L4[pd12I4].tag === "5F49") pd12Otpk = pd12L4[pd12I4].value;
653                        }
654                    }
655                }
656            }
657        }
658    }
659    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
660    var pd12RSR = (pd12Run.final && pd12Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd12Run.final.resp) : [];
661    var pd12RSOuter = pd12RSR.length === 1 ? pd12RSR[0].tag : "absent";
662    var pd12RSBr = pd12RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd12RSR[0].value) : [];
663    var pd12RSA0 = false, pd12RSA1 = false, pd12RSCk = [];
664    for (var pd12RSi = 0; pd12RSi < pd12RSBr.length; pd12RSi++) {
665        if (pd12RSBr[pd12RSi].tag === "A0") { pd12RSA0 = true; pd12RSCk = BindEs10xSingleRequest.parseBerTlv(pd12RSBr[pd12RSi].value); }
666        if (pd12RSBr[pd12RSi].tag === "A1") { pd12RSA1 = true; pd12RSCk = BindEs10xSingleRequest.parseBerTlv(pd12RSBr[pd12RSi].value); }
667    }
668    var pd12RS30 = false, pd12RS5F37 = false, pd12RS80 = false, pd12RS02 = false;
669    for (var pd12RSj = 0; pd12RSj < pd12RSCk.length; pd12RSj++) {
670        if (pd12RSCk[pd12RSj].tag === "30") pd12RS30 = true;
671        if (pd12RSCk[pd12RSj].tag === "5F37") pd12RS5F37 = true;
672        if (pd12RSCk[pd12RSj].tag === "80") pd12RS80 = true;
673        if (pd12RSCk[pd12RSj].tag === "02") pd12RS02 = true;
674    }
675    var pd12RS5F49 = false;
676    if (pd12RS30) {
677        for (var pd12RSk = 0; pd12RSk < pd12RSCk.length; pd12RSk++) {
678            if (pd12RSCk[pd12RSk].tag !== "30") continue;
679            var pd12RSU = BindEs10xSingleRequest.parseBerTlv(pd12RSCk[pd12RSk].value);
680            for (var pd12RSm = 0; pd12RSm < pd12RSU.length; pd12RSm++) {
681                if (pd12RSU[pd12RSm].tag === "5F49") pd12RS5F49 = true;
682                if (pd12RSU[pd12RSm].tag === "80") pd12RS80 = true;
683            }
684        }
685    }
686    bind.checkData("S12-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd12RSOuter);
687    bind.checkData("S12-C2 R_PREP_DOWNLOAD required members present", "1", (pd12RSA0 && pd12RS30 && pd12RS80 && pd12RS5F49 && pd12RS5F37) ? "1" : "0");
688    // S12-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
689    // S12-C4: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
690    // S12-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
691    // S12-C6: binding:prep_download_response_otpk_extract_cross_step(5F49;S22_prep_dl) (check_attestation)
692
693    var cs13Tid = "";
694    for (var cs13Ri = 0; cs13Ri < 16; cs13Ri++) {
695        cs13Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
696    }
697    // cancel_session 运行时绑定(B-7):BF41{80<tid> 81 01 02}——tid 运行时随机 16B;reason S22:9140 枚举
698    var cs13Asm = BindEs10bCancelSession.assembleCancelSession({outer: "BF41", transactionId: "80", reason: "81"}, {transactionId: cs13Tid, reason: "02"});
699    if (cs13Asm.error) {
700        bind.checkData("S13-C1 assemble", "1", "0");
701        bind.checkData("S13-C2 assemble", "1", "0");
702    } else {
703        var s13 = bind.sendApdu(null, "E2", "91", "00", cs13Asm.request_hex, "00", "9000");
704        bind.checkData("S13-C1 SW", "9000", s13.sw);
705        var cs13Ex = BindEs10bCancelSession.extractCancelSession({outer: "BF41", ok: {tag: "A0", children: [{name: "euiccCancelSessionSigned", tag: "30", children: [{name: "transactionId", tag: "80"},{name: "smdpOid", tag: "81"},{name: "reason", tag: "82"}]},{name: "euiccCancelSessionSignature", tag: "5F37"}]},error: {tag: "81"}}, s13.resp);
706        bind.checkData("S13-C2 cancelSessionResponseOk structure", "1", (cs13Ex.branch === "ok" && cs13Ex.ok && cs13Ex.ok.missing.length === 0 && cs13Ex.ok.fields.euiccCancelSessionSigned.children.missing.length === 0) ? "1" : "0");
707    }
708
709    // 步骤 14:Seq#03] Execute the Common Mutual Authentication procedure between the eUICC and the S_SM-DP+ #GET_EUICC_INFO1, #GET_EUICC_CHALLENGE and #AUTHENTICATE_SMDP are sent to the eUICC the same GSMA CI as for the first attempt has been chosen for signing and for verification(tc_step;REQ: RQ57_047)
710    // W3D CMA 过程声明行内联动态绑定(三命令链;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;421324 IC6 dynamic-bound 先例机制面)
711    // CMA 链命令 1/3 GetEuiccInfo1(BF20 空结构,S22_info §5.7.8):
712    var cma14I1 = bind.sendApdu(null, "E2", "91", "00", "BF2000", null, "9000");
713    var cma14Gw1 = BindGecaProc.parseGecaResponse(cma14I1.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
714    // CMA 链命令 2/3 GetEuiccChallenge(BF2E 空结构,S22_challenge §5.7.7;响应 euiccChallenge 成员运行时提取):
715    var cma14C2 = bind.sendApdu(null, "E2", "91", "00", "BF2E00", null, "9000");
716    var cma14Ch = BindGecaProc.parseGecaResponse(cma14C2.resp, {outer: "BF2E", required: ["80"], optional: []});
717    // CMA 链命令 3/3 AuthenticateServer(BF38 引擎组装;槽位值=声明面分级注入):
718    var cma14Tid = "";
719    var cma14Sc = "";
720    for (var cma14Ri = 0; cma14Ri < 16; cma14Ri++) {
721        cma14Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
722        cma14Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
723    }
724    var cma14PkList = BindEs10xSingleRequest.parseBerTlv(cma14Gw1.fields["AA"] || "");
725    var cma14CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
726    var cma14Sks = ["0A7CC1C244E60C52CD5B7807AB8C360C26524601507DCABC5DD598B5A616D5D5", "93FB33D0584F349B07F8B5D2AF93D7C3E354B349A3B913502E6ABC070E4D4929"];
727    var cma14Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
728    var cma14Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
729    var cma14Sel = -1;
730    for (var cma14Pi = 0; cma14Pi < cma14PkList.length && cma14Sel < 0; cma14Pi++) {
731        for (var cma14Mi = 0; cma14Mi < cma14CiIds.length; cma14Mi++) {
732            if (cma14PkList[cma14Pi].value === cma14CiIds[cma14Mi]) { cma14Sel = cma14Mi; break; }
733        }
734    }
735    var cma14Ech = "";
736    for (var cma14Ei = 0; cma14Ei < cma14Ch.children.length; cma14Ei++) {
737        if (cma14Ch.children[cma14Ei].tag === "80") { cma14Ech = cma14Ch.children[cma14Ei].value; }
738    }
739    if (cma14Sel < 0 || cma14Ech === "") {
740        // fail-closed 诚实面:CI PK ID 零命中物料套或 euiccChallenge 缺席 → BF38 不发送,后续过程面如实失败。
741        bind.checkData("S14-C1 cma_ok", "1", "0");
742    } else {
743        bind.engine.InitEccDomainParams(cma14Dps[cma14Sel][0], cma14Dps[cma14Sel][1], cma14Dps[cma14Sel][2], cma14Dps[cma14Sel][3], cma14Dps[cma14Sel][4], 1);
744        var cma14S1 = BindEs10xSingleRequest.buildTlv("30",
745            BindEs10xSingleRequest.buildTlv("80", cma14Tid)
746            + BindEs10xSingleRequest.buildTlv("81", cma14Ech)
747            + BindEs10xSingleRequest.buildTlv("83", "1674657374736D6470706C7573312E6578616D706C652E636F6D")
748            + BindEs10xSingleRequest.buildTlv("84", cma14Sc));
749        var cma14Sgn = "";
750        while (cma14Sgn.length != 2 * cma14Sks[cma14Sel].length) {
751            bind.engine.SleepTime(2000);
752            cma14Sgn = bind.engine.EccSignData(cma14Sks[cma14Sel], cma14S1, 33);
753        }
754        var cma14Asm = BindEs10bAuthServer.assembleAuthenticateServer(
755            {outer: "BF38",
756             signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
757             serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
758            {transactionId: cma14Tid, euiccChallenge: cma14Ech,
759             serverAddress: "1674657374736D6470706C7573312E6578616D706C652E636F6D", serverChallenge: cma14Sc,
760             serverSignature1: cma14Sgn, euiccCiPKIdToBeUsed: cma14CiIds[cma14Sel],
761             serverCertificate: cma14Certs[cma14Sel], ctxParams1: "A10D800400000110A1058003000010"});
762        if (cma14Asm.error) {
763        bind.checkData("S14-C1 cma_ok", "1", "0");
764        } else {
765            var cma14Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
766                {cla: "", ins: "E2", p1: "91", p2: "00", data: cma14Asm.request_hex,
767                 le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
768            var cma14Sw = (cma14Run.final && cma14Run.final.sw) ? cma14Run.final.sw : "transport_error";
769            var cma14Ex = BindEs10bAuthServer.extractAuthenticateServer(
770                {outer: "BF38",
771                 ok: {tag: "A0", children: [
772                     {name: "euiccSigned1", tag: "30", children: [
773                         {name: "transactionId", tag: "80"},
774                         {name: "serverAddress", tag: "83"},
775                         {name: "serverChallenge", tag: "84"},
776                         {name: "euiccInfo2", tag: "BF22"},
777                         {name: "ctxParams1", tag: "A0"}]},
778                     {name: "euiccSignature1", tag: "5F37"},
779                     {name: "euiccCertificate", tag: "30"},
780                     {name: "eumCertificate", tag: "30"}]},
781                 error: {tag: "A1", children: [
782{name: "transactionId", tag: "80"},
783 {name: "authenticateErrorCode", tag: "81"}]}},
784                cma14Run.final ? cma14Run.final.resp : "");
785            var cma14OkBr = cma14Ex.branch === "ok" && cma14Ex.ok && cma14Ex.ok.missing.length === 0 && cma14Ex.ok.fields.euiccSigned1.children.missing.length === 0;
786            bind.checkData("S14-C1 Common Mutual Authentication re-execution ok", "1", cma14OkBr ? "1" : "0");
787            // euiccSignature1([5F37])运行时提取面登记:CMA 响应操作数供后续步(PREP_DOWNLOAD 签名明文)消费——5.2.2.2.1 后续 step5-8 属子过程声明/装配域,非本步发射面。
788        }
789    }
790
791    // 步骤 15:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030, RQ31_137, RQ57_033)
792    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_RETRY_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
793    //   transactionId/euiccSignature1=前序 CMA 声明步 step14 运行时提取(§5.7.5 会话一致性同值要求,不新生成);smdpSignature2=EccSignData(DPpb SK, smdpSigned2 TLV‖5F37(euiccSignature1), 33)(S22_prep_dl+G Annex B+vendor GenRequest 三源对账);
794    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
795    var pd15Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
796    var pd15Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
797    var pd15Tid = cma14Tid;
798    var pd15Sel = cma14Sel;
799    var pd15Sig1 = (typeof cma14Ex !== "undefined" && cma14Ex && cma14Ex.ok && cma14Ex.ok.fields.euiccSignature1) ? cma14Ex.ok.fields.euiccSignature1.value : "";
800    var pd15Dps = cma14Dps;
801    var pd15OtpkRef = (typeof pd12Otpk !== "undefined") ? pd12Otpk : "";
802    var pd15CcH = bind.engine.Sha256("30313032303330343035", 20);
803    var pd15HashCc = bind.engine.Sha256(pd15CcH + pd15Tid, (pd15CcH + pd15Tid).length);
804    if (pd15Sel < 0 || pd15Sig1 === "" || pd15OtpkRef === "") {
805        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
806        bind.checkData("S15-C1 SW", "9000", "pd15_not_executed:cma_operands_absent");
807        bind.checkData("S15-C2 R_PREP_DOWNLOAD response structure", "1", "pd15_not_executed:cma_operands_absent");
808    } else {
809        bind.engine.InitEccDomainParams(pd15Dps[pd15Sel][0], pd15Dps[pd15Sel][1], pd15Dps[pd15Sel][2], pd15Dps[pd15Sel][3], pd15Dps[pd15Sel][4], 1);
810        var pd15S2 = BindEs10xSingleRequest.buildTlv("30",
811            BindEs10xSingleRequest.buildTlv("80", pd15Tid)
812            + BindEs10xSingleRequest.buildTlv("01", "FF")
813            + BindEs10xSingleRequest.buildTlv("5F49", pd15OtpkRef));
814        var pd15Sgn = "";
815        while (pd15Sgn.length != 2 * pd15Sks[pd15Sel].length) {
816            bind.engine.SleepTime(2000);
817            pd15Sgn = bind.engine.EccSignData(pd15Sks[pd15Sel], pd15S2 + BindEs10xSingleRequest.buildTlv("5F37", pd15Sig1), 33);
818        }
819        var pd15Req = BindEs10xSingleRequest.buildTlv("BF21",
820            pd15S2
821            + BindEs10xSingleRequest.buildTlv("5F37", pd15Sgn)
822            + BindEs10xSingleRequest.buildTlv("04", pd15HashCc)
823            + BindEs10xSingleRequest.buildTlv("30", pd15Certs[pd15Sel]));
824        var pd15Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
825            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd15Req,
826             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
827        var pd15Sw = (pd15Run.final && pd15Run.final.sw) ? pd15Run.final.sw : "transport_error";
828        bind.checkData("S15-C1 SW", "9000", pd15Sw);
829        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
830        var pd15Otpk = "";
831        if (pd15Run.final && pd15Run.final.resp) {
832            var pd15L1 = BindEs10xSingleRequest.parseBerTlv(pd15Run.final.resp);
833            for (var pd15I1 = 0; pd15I1 < pd15L1.length && pd15Otpk === ""; pd15I1++) {
834                if (pd15L1[pd15I1].tag !== "BF21") continue;
835                var pd15L2 = BindEs10xSingleRequest.parseBerTlv(pd15L1[pd15I1].value);
836                for (var pd15I2 = 0; pd15I2 < pd15L2.length && pd15Otpk === ""; pd15I2++) {
837                    if (pd15L2[pd15I2].tag !== "A0") continue;
838                    var pd15L3 = BindEs10xSingleRequest.parseBerTlv(pd15L2[pd15I2].value);
839                    for (var pd15I3 = 0; pd15I3 < pd15L3.length && pd15Otpk === ""; pd15I3++) {
840                        if (pd15L3[pd15I3].tag !== "30") continue;
841                        var pd15L4 = BindEs10xSingleRequest.parseBerTlv(pd15L3[pd15I3].value);
842                        for (var pd15I4 = 0; pd15I4 < pd15L4.length; pd15I4++) {
843                            if (pd15L4[pd15I4].tag === "5F49") pd15Otpk = pd15L4[pd15I4].value;
844                        }
845                    }
846                }
847            }
848        }
849    }
850    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
851    var pd15RSR = (pd15Run.final && pd15Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd15Run.final.resp) : [];
852    var pd15RSOuter = pd15RSR.length === 1 ? pd15RSR[0].tag : "absent";
853    var pd15RSBr = pd15RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd15RSR[0].value) : [];
854    var pd15RSA0 = false, pd15RSA1 = false, pd15RSCk = [];
855    for (var pd15RSi = 0; pd15RSi < pd15RSBr.length; pd15RSi++) {
856        if (pd15RSBr[pd15RSi].tag === "A0") { pd15RSA0 = true; pd15RSCk = BindEs10xSingleRequest.parseBerTlv(pd15RSBr[pd15RSi].value); }
857        if (pd15RSBr[pd15RSi].tag === "A1") { pd15RSA1 = true; pd15RSCk = BindEs10xSingleRequest.parseBerTlv(pd15RSBr[pd15RSi].value); }
858    }
859    var pd15RS30 = false, pd15RS5F37 = false, pd15RS80 = false, pd15RS02 = false;
860    for (var pd15RSj = 0; pd15RSj < pd15RSCk.length; pd15RSj++) {
861        if (pd15RSCk[pd15RSj].tag === "30") pd15RS30 = true;
862        if (pd15RSCk[pd15RSj].tag === "5F37") pd15RS5F37 = true;
863        if (pd15RSCk[pd15RSj].tag === "80") pd15RS80 = true;
864        if (pd15RSCk[pd15RSj].tag === "02") pd15RS02 = true;
865    }
866    var pd15RS5F49 = false;
867    if (pd15RS30) {
868        for (var pd15RSk = 0; pd15RSk < pd15RSCk.length; pd15RSk++) {
869            if (pd15RSCk[pd15RSk].tag !== "30") continue;
870            var pd15RSU = BindEs10xSingleRequest.parseBerTlv(pd15RSCk[pd15RSk].value);
871            for (var pd15RSm = 0; pd15RSm < pd15RSU.length; pd15RSm++) {
872                if (pd15RSU[pd15RSm].tag === "5F49") pd15RS5F49 = true;
873                if (pd15RSU[pd15RSm].tag === "80") pd15RS80 = true;
874            }
875        }
876    }
877    bind.checkData("S15-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd15RSOuter);
878    bind.checkData("S15-C2 R_PREP_DOWNLOAD required members present", "1", (pd15RSA0 && pd15RS30 && pd15RS80 && pd15RS5F49 && pd15RS5F37) ? "1" : "0");
879    // S15-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
880    // S15-C4: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
881    // S15-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
882    // S15-C6: binding:prep_download_retry_otpk_reuse(previous-5F49;RQ31_137) (check_attestation)
883}
884

完整 unified diff

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

展开 diff(1077 行)
--- -man
+++ -cas
@@ -1,192 +1,884 @@
-// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_PrepareDownload_Retry_ReuseOTKeys_01_Nominal_Confirmation_Code_retry_mechanism_by_reusing_previous_One_Time_key_pair + TC_eUICC_PrepareDownload_Retry_ReuseOTKeys_02_Nominal_Retry_after_a_CancelSession_Reason_Postponed + TC_eUICC_PrepareDownload_Retry_ReuseOTKeys_03_Nominal_Retry_after_a_CancelSession_Reason_Timeout (extracted verbatim)
-
-function TC_eUICC_PrepareDownload_Retry_ReuseOTKeys_01_Nominal_Confirmation_Code_retry_mechanism_by_reusing_previous_One_Time_key_pair()
-{
-	if (!O_E_REUSE_OTPK)
-		return;
-	
-	tracenamestr = "Confirmation Code重发,使用上一个会话中的otpk";
-	curDis.TraceStart(sno++,tracenamestr);
-	
-	curLogicChannel = 0;
-	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
-	Ini_powerOn_eUICC_LPAe_not_activate();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
-	TS_MANAGE_CHANNEL_OPEN();
-	
-	curLogicChannel = 1;
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
-	TS_SELECT("Select ISD",ISD_R_AID,"9000");
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
-	
-	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;");
-	Profile_load_procedure.ES10b_AuthenticateServer();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_WITH_CC;");
-	var chash1 = curStrHandle.RandHexStr(32);
-	Profile_load_procedure.ccRequiredFlag = "FF";
-	Profile_load_procedure.hashcc = chash1;
-	Profile_load_procedure.ES10b_PrepareDownload();
-	
-	var cureuiccOtpk = Profile_load_procedure.euiccOtpk;
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
-	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;");
-	Profile_load_procedure.ES10b_AuthenticateServer();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_RETRY_CC,Confirmation Code重发,使用上一个会话中的otpk;");
-	var chash1 = curStrHandle.RandHexStr(32);
-	Profile_load_procedure.ccRequiredFlag = "FF";
-	Profile_load_procedure.hashcc = chash1;
-	Profile_load_procedure.euiccOtpk = cureuiccOtpk;
-	Profile_load_procedure.ES10b_PrepareDownload();
-	
-	var cureuiccOtpk2 = Profile_load_procedure.euiccOtpk;	
-	curStrHandle.CheckData(cureuiccOtpk, cureuiccOtpk2, "otpk");
-	
-	RecoverCard();
-}
-
-function TC_eUICC_PrepareDownload_Retry_ReuseOTKeys_02_Nominal_Retry_after_a_CancelSession_Reason_Postponed()
-{
-	if (!O_E_REUSE_OTPK)
-		return;
-	
-	tracenamestr = "S_LPAd模拟终端用户推迟下载Profile,检查eUICC可以重复使用在之前的尝试中生成的一次性密钥对";
-	curDis.TraceStart(sno++,tracenamestr);
-	
-	curLogicChannel = 0;
-	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
-	Ini_powerOn_eUICC_LPAe_not_activate();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
-	TS_MANAGE_CHANNEL_OPEN();
-	
-	curLogicChannel = 1;
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
-	TS_SELECT("Select ISD",ISD_R_AID,"9000");
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
-	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;");
-	Profile_load_procedure.ES10b_AuthenticateServer();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_WITH_CC;");
-	var chash1 = curStrHandle.RandHexStr(32);
-	Profile_load_procedure.ccRequiredFlag = "FF";
-	Profile_load_procedure.hashcc = chash1;
-	Profile_load_procedure.ES10b_PrepareDownload();
-	
-	var cureuiccOtpk = Profile_load_procedure.euiccOtpk;
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行CancelSession,Reason “Postponed”;");
-	Profile_load_procedure.ES10b_CancelSession(CancelSessionReason.postponed);
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
-	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;");
-	Profile_load_procedure.ES10b_AuthenticateServer();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_RETRY_CC,延期导致的CancelSession,使用上一个会话中的otpk;");
-	Profile_load_procedure.ccRequiredFlag = "FF";
-	Profile_load_procedure.hashcc = chash1;
-	Profile_load_procedure.euiccOtpk = cureuiccOtpk;
-	Profile_load_procedure.ES10b_PrepareDownload();
-	
-	var cureuiccOtpk2 = Profile_load_procedure.euiccOtpk;
-	curStrHandle.CheckData(cureuiccOtpk, cureuiccOtpk2, "otpk");
-	
-	RecoverCard();
-}
-
-function TC_eUICC_PrepareDownload_Retry_ReuseOTKeys_03_Nominal_Retry_after_a_CancelSession_Reason_Timeout()
-{
-	if (!O_E_REUSE_OTPK)
-		return;
-	
-	tracenamestr = "S_LPAd模拟终端用户在超时间隔内没有确认下载Profile,检查eUICC可以重复使用在之前的尝试中生成的一次性密钥对";
-	curDis.TraceStart(sno++,tracenamestr);
-	
-	curLogicChannel = 0;
-	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
-	Ini_powerOn_eUICC_LPAe_not_activate();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
-	TS_MANAGE_CHANNEL_OPEN();
-	
-	curLogicChannel = 1;
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
-	TS_SELECT("Select ISD",ISD_R_AID,"9000");
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
-	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;");
-	Profile_load_procedure.ES10b_AuthenticateServer();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_WITH_CC;");
-	var chash1 = curStrHandle.RandHexStr(32);
-	Profile_load_procedure.ccRequiredFlag = "FF";
-	Profile_load_procedure.hashcc = chash1;
-	Profile_load_procedure.ES10b_PrepareDownload();
-	
-	var cureuiccOtpk = Profile_load_procedure.euiccOtpk;
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行CancelSession,Reason “Timeout”;");
-	Profile_load_procedure.ES10b_CancelSession(CancelSessionReason.timeout);
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
-	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;");
-	Profile_load_procedure.ES10b_AuthenticateServer();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_RETRY_CC,超时导致的CancelSession,使用上一个会话中的otpk;");
-	Profile_load_procedure.ccRequiredFlag = "FF";
-	Profile_load_procedure.hashcc = chash1;
-	Profile_load_procedure.euiccOtpk = cureuiccOtpk;
-	Profile_load_procedure.ES10b_PrepareDownload();
-	
-	var cureuiccOtpk2 = Profile_load_procedure.euiccOtpk;
-	curStrHandle.CheckData(cureuiccOtpk, cureuiccOtpk2, "otpk");	
-	RecoverCard();
+// Author: 卡思Cas智能体
+// Date: 20261004-022945
+// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_PrepareDownload_Retry_ReuseOTKeys,Test Sequence #01-#03 Nominal(本 TC 全部 3 条 Test Sequence 合并展开:CC 重试复用 OT/Postponed 后重试/Timeout 后重试),适用性 C019。
+// Test points: S2-C1 SW;S2-C2 R_PREP_DOWNLOAD response structure;S2-C2 R_PREP_DOWNLOAD outer tag
+//   S2-C2 R_PREP_DOWNLOAD required members present;S3-C1 cma_ok
+//   S3-C1 Common Mutual Authentication re-execution ok;S5-C1 SW
+//   S5-C2 R_PREP_DOWNLOAD response structure;S5-C2 R_PREP_DOWNLOAD outer tag
+//   S5-C2 R_PREP_DOWNLOAD required members present;S7-C1 SW
+//   S7-C2 R_PREP_DOWNLOAD response structure;S7-C2 R_PREP_DOWNLOAD outer tag
+//   S7-C2 R_PREP_DOWNLOAD required members present;S8-C1 assemble;S8-C2 assemble;S8-C1 SW
+//   S8-C2 cancelSessionResponseOk structure;S9-C1 cma_ok
+//   S9-C1 Common Mutual Authentication re-execution ok;S10-C1 SW
+//   S10-C2 R_PREP_DOWNLOAD response structure;S10-C2 R_PREP_DOWNLOAD outer tag
+//   S10-C2 R_PREP_DOWNLOAD required members present;S12-C1 SW
+//   S12-C2 R_PREP_DOWNLOAD response structure;S12-C2 R_PREP_DOWNLOAD outer tag
+//   S12-C2 R_PREP_DOWNLOAD required members present;S13-C1 assemble;S13-C2 assemble;S13-C1 SW
+//   S13-C2 cancelSessionResponseOk structure;S14-C1 cma_ok
+//   S14-C1 Common Mutual Authentication re-execution ok;S15-C1 SW
+//   S15-C2 R_PREP_DOWNLOAD response structure;S15-C2 R_PREP_DOWNLOAD outer tag
+//   S15-C2 R_PREP_DOWNLOAD required members present
+// 本函数由 CaseIR 5.2.1.2.1 编译生成(experiments/5.2.1.2.1-TC_eUICC_PrepareDownload_Retry_ReuseOTKeys-20261004_022945,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).
+// 适用性 C019:编译期门,运行时由 harness 环境前置承担。
+// PRECONDITION (declared, NOT compiled): initial_conditions 缺语料过程体(Annex C.2 absent from input package, corpus vacuum): IC 序列属测试工具/卡态编排责任,本脚本不虚构初始化步骤;语义影响见 CaseIR open_items。
+// GEN-IC-1 卡态声明(E 段 General Initial Conditions,编排责任):The PROFILE_OPERATIONAL1 is not loaded on the eUICC: declared unexpanded (no fabricated bytes; provenance = expansion_source).
+// GEN-IC-2 卡态声明:通信已初始化且 S_LPAd 已选 ISD-R;Common Mutual Authentication 已成功执行(#GET_EUICC_INFO1、#GET_EUICC_CHALLENGE、#AUTHENTICATE_SMDP 已发送;签名与验证选用同一 GSMA CI): declared unexpanded (no fabricated bytes; provenance = expansion_source).
+function TC_eUICC_PrepareDownload_Retry_ReuseOTKeys_01_03_merged() {
+    var bind = curBind;
+    var profileAidSession = BindEs10xProcProfileDynamic.beginSession(bind, "TC_eUICC_PrepareDownload_Retry_ReuseOTKeys_01_03_merged");
+
+    // 步骤 1:<S_HASHED_CC> = MTD_GENERATE_HASHED_CC(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.
+
+    // 步骤 2:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030)
+    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_WITH_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
+    //   无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
+    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
+    var pd2Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
+    var pd2Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
+    var pd2Tid = "";
+    for (var pd2Ri = 0; pd2Ri < 16; pd2Ri++) {
+        pd2Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+    }
+    var pd2Sel = 0;
+    var pd2Sig1 = "";
+    var pd2Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+    var pd2CcH = bind.engine.Sha256("30313032303330343035", 20);
+    var pd2HashCc = bind.engine.Sha256(pd2CcH + pd2Tid, (pd2CcH + pd2Tid).length);
+    if (pd2Sel < 0 || pd2Sig1 === "") {
+        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
+        bind.checkData("S2-C1 SW", "9000", "pd2_not_executed:cma_operands_absent");
+        bind.checkData("S2-C2 R_PREP_DOWNLOAD response structure", "1", "pd2_not_executed:cma_operands_absent");
+    } else {
+        bind.engine.InitEccDomainParams(pd2Dps[pd2Sel][0], pd2Dps[pd2Sel][1], pd2Dps[pd2Sel][2], pd2Dps[pd2Sel][3], pd2Dps[pd2Sel][4], 1);
+        var pd2S2 = BindEs10xSingleRequest.buildTlv("30",
+            BindEs10xSingleRequest.buildTlv("80", pd2Tid)
+            + BindEs10xSingleRequest.buildTlv("01", "FF"));
+        var pd2Sgn = "";
+        while (pd2Sgn.length != 2 * pd2Sks[pd2Sel].length) {
+            bind.engine.SleepTime(2000);
+            pd2Sgn = bind.engine.EccSignData(pd2Sks[pd2Sel], pd2S2 + BindEs10xSingleRequest.buildTlv("5F37", pd2Sig1), 33);
+        }
+        var pd2Req = BindEs10xSingleRequest.buildTlv("BF21",
+            pd2S2
+            + BindEs10xSingleRequest.buildTlv("5F37", pd2Sgn)
+            + BindEs10xSingleRequest.buildTlv("04", pd2HashCc)
+            + BindEs10xSingleRequest.buildTlv("30", pd2Certs[pd2Sel]));
+        var pd2Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd2Req,
+             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+        var pd2Sw = (pd2Run.final && pd2Run.final.sw) ? pd2Run.final.sw : "transport_error";
+        bind.checkData("S2-C1 SW", "9000", pd2Sw);
+        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
+        var pd2Otpk = "";
+        if (pd2Run.final && pd2Run.final.resp) {
+            var pd2L1 = BindEs10xSingleRequest.parseBerTlv(pd2Run.final.resp);
+            for (var pd2I1 = 0; pd2I1 < pd2L1.length && pd2Otpk === ""; pd2I1++) {
+                if (pd2L1[pd2I1].tag !== "BF21") continue;
+                var pd2L2 = BindEs10xSingleRequest.parseBerTlv(pd2L1[pd2I1].value);
+                for (var pd2I2 = 0; pd2I2 < pd2L2.length && pd2Otpk === ""; pd2I2++) {
+                    if (pd2L2[pd2I2].tag !== "A0") continue;
+                    var pd2L3 = BindEs10xSingleRequest.parseBerTlv(pd2L2[pd2I2].value);
+                    for (var pd2I3 = 0; pd2I3 < pd2L3.length && pd2Otpk === ""; pd2I3++) {
+                        if (pd2L3[pd2I3].tag !== "30") continue;
+                        var pd2L4 = BindEs10xSingleRequest.parseBerTlv(pd2L3[pd2I3].value);
+                        for (var pd2I4 = 0; pd2I4 < pd2L4.length; pd2I4++) {
+                            if (pd2L4[pd2I4].tag === "5F49") pd2Otpk = pd2L4[pd2I4].value;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
+    var pd2RSR = (pd2Run.final && pd2Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd2Run.final.resp) : [];
+    var pd2RSOuter = pd2RSR.length === 1 ? pd2RSR[0].tag : "absent";
+    var pd2RSBr = pd2RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd2RSR[0].value) : [];
+    var pd2RSA0 = false, pd2RSA1 = false, pd2RSCk = [];
+    for (var pd2RSi = 0; pd2RSi < pd2RSBr.length; pd2RSi++) {
+        if (pd2RSBr[pd2RSi].tag === "A0") { pd2RSA0 = true; pd2RSCk = BindEs10xSingleRequest.parseBerTlv(pd2RSBr[pd2RSi].value); }
+        if (pd2RSBr[pd2RSi].tag === "A1") { pd2RSA1 = true; pd2RSCk = BindEs10xSingleRequest.parseBerTlv(pd2RSBr[pd2RSi].value); }
+    }
+    var pd2RS30 = false, pd2RS5F37 = false, pd2RS80 = false, pd2RS02 = false;
+    for (var pd2RSj = 0; pd2RSj < pd2RSCk.length; pd2RSj++) {
+        if (pd2RSCk[pd2RSj].tag === "30") pd2RS30 = true;
+        if (pd2RSCk[pd2RSj].tag === "5F37") pd2RS5F37 = true;
+        if (pd2RSCk[pd2RSj].tag === "80") pd2RS80 = true;
+        if (pd2RSCk[pd2RSj].tag === "02") pd2RS02 = true;
+    }
+    var pd2RS5F49 = false;
+    if (pd2RS30) {
+        for (var pd2RSk = 0; pd2RSk < pd2RSCk.length; pd2RSk++) {
+            if (pd2RSCk[pd2RSk].tag !== "30") continue;
+            var pd2RSU = BindEs10xSingleRequest.parseBerTlv(pd2RSCk[pd2RSk].value);
+            for (var pd2RSm = 0; pd2RSm < pd2RSU.length; pd2RSm++) {
+                if (pd2RSU[pd2RSm].tag === "5F49") pd2RS5F49 = true;
+                if (pd2RSU[pd2RSm].tag === "80") pd2RS80 = true;
+            }
+        }
+    }
+    bind.checkData("S2-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd2RSOuter);
+    bind.checkData("S2-C2 R_PREP_DOWNLOAD required members present", "1", (pd2RSA0 && pd2RS30 && pd2RS80 && pd2RS5F49 && pd2RS5F37) ? "1" : "0");
+    // S2-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
+    // S2-C4: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
+    // S2-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
+    // S2-C6: binding:prep_download_response_otpk_extract_cross_step(5F49;S22_prep_dl) (check_attestation)
+
+    // 步骤 3:Seq#01] Execute the Common Mutual Authentication procedure between the eUICC and the S_SM-DP+ #GET_EUICC_INFO1, #GET_EUICC_CHALLENGE and #AUTHENTICATE_SMDP are sent to the eUICC the same GSMA CI as for the first attempt has been chosen for signing and for verification(tc_step;REQ: RQ57_047)
+    // W3D CMA 过程声明行内联动态绑定(三命令链;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;421324 IC6 dynamic-bound 先例机制面)
+    // CMA 链命令 1/3 GetEuiccInfo1(BF20 空结构,S22_info §5.7.8):
+    var cma3I1 = bind.sendApdu(null, "E2", "91", "00", "BF2000", null, "9000");
+    var cma3Gw1 = BindGecaProc.parseGecaResponse(cma3I1.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
+    // CMA 链命令 2/3 GetEuiccChallenge(BF2E 空结构,S22_challenge §5.7.7;响应 euiccChallenge 成员运行时提取):
+    var cma3C2 = bind.sendApdu(null, "E2", "91", "00", "BF2E00", null, "9000");
+    var cma3Ch = BindGecaProc.parseGecaResponse(cma3C2.resp, {outer: "BF2E", required: ["80"], optional: []});
+    // CMA 链命令 3/3 AuthenticateServer(BF38 引擎组装;槽位值=声明面分级注入):
+    var cma3Tid = "";
+    var cma3Sc = "";
+    for (var cma3Ri = 0; cma3Ri < 16; cma3Ri++) {
+        cma3Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+        cma3Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+    }
+    var cma3PkList = BindEs10xSingleRequest.parseBerTlv(cma3Gw1.fields["AA"] || "");
+    var cma3CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
+    var cma3Sks = ["0A7CC1C244E60C52CD5B7807AB8C360C26524601507DCABC5DD598B5A616D5D5", "93FB33D0584F349B07F8B5D2AF93D7C3E354B349A3B913502E6ABC070E4D4929"];
+    var cma3Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
+    var cma3Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+    var cma3Sel = -1;
+    for (var cma3Pi = 0; cma3Pi < cma3PkList.length && cma3Sel < 0; cma3Pi++) {
+        for (var cma3Mi = 0; cma3Mi < cma3CiIds.length; cma3Mi++) {
+            if (cma3PkList[cma3Pi].value === cma3CiIds[cma3Mi]) { cma3Sel = cma3Mi; break; }
+        }
+    }
+    var cma3Ech = "";
+    for (var cma3Ei = 0; cma3Ei < cma3Ch.children.length; cma3Ei++) {
+        if (cma3Ch.children[cma3Ei].tag === "80") { cma3Ech = cma3Ch.children[cma3Ei].value; }
+    }
+    if (cma3Sel < 0 || cma3Ech === "") {
+        // fail-closed 诚实面:CI PK ID 零命中物料套或 euiccChallenge 缺席 → BF38 不发送,后续过程面如实失败。
+        bind.checkData("S3-C1 cma_ok", "1", "0");
+    } else {
+        bind.engine.InitEccDomainParams(cma3Dps[cma3Sel][0], cma3Dps[cma3Sel][1], cma3Dps[cma3Sel][2], cma3Dps[cma3Sel][3], cma3Dps[cma3Sel][4], 1);
+        var cma3S1 = BindEs10xSingleRequest.buildTlv("30",
+            BindEs10xSingleRequest.buildTlv("80", cma3Tid)
+            + BindEs10xSingleRequest.buildTlv("81", cma3Ech)
+            + BindEs10xSingleRequest.buildTlv("83", "1674657374736D6470706C7573312E6578616D706C652E636F6D")
+            + BindEs10xSingleRequest.buildTlv("84", cma3Sc));
+        var cma3Sgn = "";
+        while (cma3Sgn.length != 2 * cma3Sks[cma3Sel].length) {
+            bind.engine.SleepTime(2000);
+            cma3Sgn = bind.engine.EccSignData(cma3Sks[cma3Sel], cma3S1, 33);
+        }
+        var cma3Asm = BindEs10bAuthServer.assembleAuthenticateServer(
+            {outer: "BF38",
+             signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
+             serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
+            {transactionId: cma3Tid, euiccChallenge: cma3Ech,
+             serverAddress: "1674657374736D6470706C7573312E6578616D706C652E636F6D", serverChallenge: cma3Sc,
+             serverSignature1: cma3Sgn, euiccCiPKIdToBeUsed: cma3CiIds[cma3Sel],
+             serverCertificate: cma3Certs[cma3Sel], ctxParams1: "A10D800400000110A1058003000010"});
+        if (cma3Asm.error) {
+        bind.checkData("S3-C1 cma_ok", "1", "0");
+        } else {
+            var cma3Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+                {cla: "", ins: "E2", p1: "91", p2: "00", data: cma3Asm.request_hex,
+                 le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+            var cma3Sw = (cma3Run.final && cma3Run.final.sw) ? cma3Run.final.sw : "transport_error";
+            var cma3Ex = 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"}]}},
+                cma3Run.final ? cma3Run.final.resp : "");
+            var cma3OkBr = cma3Ex.branch === "ok" && cma3Ex.ok && cma3Ex.ok.missing.length === 0 && cma3Ex.ok.fields.euiccSigned1.children.missing.length === 0;
+            bind.checkData("S3-C1 Common Mutual Authentication re-execution ok", "1", cma3OkBr ? "1" : "0");
+            // euiccSignature1([5F37])运行时提取面登记:CMA 响应操作数供后续步(PREP_DOWNLOAD 签名明文)消费——5.2.2.2.1 后续 step5-8 属子过程声明/装配域,非本步发射面。
+        }
+    }
+
+    // 步骤 4:<S_HASHED_CC> = MTD_GENERATE_HASHED_CC(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.
+
+    // 步骤 5:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030, RQ31_137, RQ57_033)
+    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_RETRY_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
+    //   transactionId/euiccSignature1=前序 CMA 声明步 step3 运行时提取(§5.7.5 会话一致性同值要求,不新生成);smdpSignature2=EccSignData(DPpb SK, smdpSigned2 TLV‖5F37(euiccSignature1), 33)(S22_prep_dl+G Annex B+vendor GenRequest 三源对账);
+    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
+    var pd5Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
+    var pd5Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
+    var pd5Tid = cma3Tid;
+    var pd5Sel = cma3Sel;
+    var pd5Sig1 = (typeof cma3Ex !== "undefined" && cma3Ex && cma3Ex.ok && cma3Ex.ok.fields.euiccSignature1) ? cma3Ex.ok.fields.euiccSignature1.value : "";
+    var pd5Dps = cma3Dps;
+    var pd5OtpkRef = (typeof pd2Otpk !== "undefined") ? pd2Otpk : "";
+    var pd5CcH = bind.engine.Sha256("4142434445464748494A", 20);
+    var pd5HashCc = bind.engine.Sha256(pd5CcH + pd5Tid, (pd5CcH + pd5Tid).length);
+    if (pd5Sel < 0 || pd5Sig1 === "" || pd5OtpkRef === "") {
+        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
+        bind.checkData("S5-C1 SW", "9000", "pd5_not_executed:cma_operands_absent");
+        bind.checkData("S5-C2 R_PREP_DOWNLOAD response structure", "1", "pd5_not_executed:cma_operands_absent");
+    } else {
+        bind.engine.InitEccDomainParams(pd5Dps[pd5Sel][0], pd5Dps[pd5Sel][1], pd5Dps[pd5Sel][2], pd5Dps[pd5Sel][3], pd5Dps[pd5Sel][4], 1);
+        var pd5S2 = BindEs10xSingleRequest.buildTlv("30",
+            BindEs10xSingleRequest.buildTlv("80", pd5Tid)
+            + BindEs10xSingleRequest.buildTlv("01", "FF")
+            + BindEs10xSingleRequest.buildTlv("5F49", pd5OtpkRef));
+        var pd5Sgn = "";
+        while (pd5Sgn.length != 2 * pd5Sks[pd5Sel].length) {
+            bind.engine.SleepTime(2000);
+            pd5Sgn = bind.engine.EccSignData(pd5Sks[pd5Sel], pd5S2 + BindEs10xSingleRequest.buildTlv("5F37", pd5Sig1), 33);
+        }
+        var pd5Req = BindEs10xSingleRequest.buildTlv("BF21",
+            pd5S2
+            + BindEs10xSingleRequest.buildTlv("5F37", pd5Sgn)
+            + BindEs10xSingleRequest.buildTlv("04", pd5HashCc)
+            + BindEs10xSingleRequest.buildTlv("30", pd5Certs[pd5Sel]));
+        var pd5Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd5Req,
+             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+        var pd5Sw = (pd5Run.final && pd5Run.final.sw) ? pd5Run.final.sw : "transport_error";
+        bind.checkData("S5-C1 SW", "9000", pd5Sw);
+        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
+        var pd5Otpk = "";
+        if (pd5Run.final && pd5Run.final.resp) {
+            var pd5L1 = BindEs10xSingleRequest.parseBerTlv(pd5Run.final.resp);
+            for (var pd5I1 = 0; pd5I1 < pd5L1.length && pd5Otpk === ""; pd5I1++) {
+                if (pd5L1[pd5I1].tag !== "BF21") continue;
+                var pd5L2 = BindEs10xSingleRequest.parseBerTlv(pd5L1[pd5I1].value);
+                for (var pd5I2 = 0; pd5I2 < pd5L2.length && pd5Otpk === ""; pd5I2++) {
+                    if (pd5L2[pd5I2].tag !== "A0") continue;
+                    var pd5L3 = BindEs10xSingleRequest.parseBerTlv(pd5L2[pd5I2].value);
+                    for (var pd5I3 = 0; pd5I3 < pd5L3.length && pd5Otpk === ""; pd5I3++) {
+                        if (pd5L3[pd5I3].tag !== "30") continue;
+                        var pd5L4 = BindEs10xSingleRequest.parseBerTlv(pd5L3[pd5I3].value);
+                        for (var pd5I4 = 0; pd5I4 < pd5L4.length; pd5I4++) {
+                            if (pd5L4[pd5I4].tag === "5F49") pd5Otpk = pd5L4[pd5I4].value;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
+    var pd5RSR = (pd5Run.final && pd5Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd5Run.final.resp) : [];
+    var pd5RSOuter = pd5RSR.length === 1 ? pd5RSR[0].tag : "absent";
+    var pd5RSBr = pd5RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd5RSR[0].value) : [];
+    var pd5RSA0 = false, pd5RSA1 = false, pd5RSCk = [];
+    for (var pd5RSi = 0; pd5RSi < pd5RSBr.length; pd5RSi++) {
+        if (pd5RSBr[pd5RSi].tag === "A0") { pd5RSA0 = true; pd5RSCk = BindEs10xSingleRequest.parseBerTlv(pd5RSBr[pd5RSi].value); }
+        if (pd5RSBr[pd5RSi].tag === "A1") { pd5RSA1 = true; pd5RSCk = BindEs10xSingleRequest.parseBerTlv(pd5RSBr[pd5RSi].value); }
+    }
+    var pd5RS30 = false, pd5RS5F37 = false, pd5RS80 = false, pd5RS02 = false;
+    for (var pd5RSj = 0; pd5RSj < pd5RSCk.length; pd5RSj++) {
+        if (pd5RSCk[pd5RSj].tag === "30") pd5RS30 = true;
+        if (pd5RSCk[pd5RSj].tag === "5F37") pd5RS5F37 = true;
+        if (pd5RSCk[pd5RSj].tag === "80") pd5RS80 = true;
+        if (pd5RSCk[pd5RSj].tag === "02") pd5RS02 = true;
+    }
+    var pd5RS5F49 = false;
+    if (pd5RS30) {
+        for (var pd5RSk = 0; pd5RSk < pd5RSCk.length; pd5RSk++) {
+            if (pd5RSCk[pd5RSk].tag !== "30") continue;
+            var pd5RSU = BindEs10xSingleRequest.parseBerTlv(pd5RSCk[pd5RSk].value);
+            for (var pd5RSm = 0; pd5RSm < pd5RSU.length; pd5RSm++) {
+                if (pd5RSU[pd5RSm].tag === "5F49") pd5RS5F49 = true;
+                if (pd5RSU[pd5RSm].tag === "80") pd5RS80 = true;
+            }
+        }
+    }
+    bind.checkData("S5-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd5RSOuter);
+    bind.checkData("S5-C2 R_PREP_DOWNLOAD required members present", "1", (pd5RSA0 && pd5RS30 && pd5RS80 && pd5RS5F49 && pd5RS5F37) ? "1" : "0");
+    // S5-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
+    // S5-C4: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
+    // S5-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
+    // S5-C6: binding:prep_download_retry_otpk_reuse(previous-5F49;RQ31_137) (check_attestation)
+
+    // 步骤 6:<S_HASHED_CC> = MTD_GENERATE_HASHED_CC(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.
+
+    // 步骤 7:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030)
+    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_WITH_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
+    //   transactionId/euiccSignature1=前序 CMA 声明步 step3 运行时提取(§5.7.5 会话一致性同值要求,不新生成);smdpSignature2=EccSignData(DPpb SK, smdpSigned2 TLV‖5F37(euiccSignature1), 33)(S22_prep_dl+G Annex B+vendor GenRequest 三源对账);
+    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
+    var pd7Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
+    var pd7Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
+    var pd7Tid = cma3Tid;
+    var pd7Sel = cma3Sel;
+    var pd7Sig1 = (typeof cma3Ex !== "undefined" && cma3Ex && cma3Ex.ok && cma3Ex.ok.fields.euiccSignature1) ? cma3Ex.ok.fields.euiccSignature1.value : "";
+    var pd7Dps = cma3Dps;
+    var pd7CcH = bind.engine.Sha256("30313032303330343035", 20);
+    var pd7HashCc = bind.engine.Sha256(pd7CcH + pd7Tid, (pd7CcH + pd7Tid).length);
+    if (pd7Sel < 0 || pd7Sig1 === "") {
+        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
+        bind.checkData("S7-C1 SW", "9000", "pd7_not_executed:cma_operands_absent");
+        bind.checkData("S7-C2 R_PREP_DOWNLOAD response structure", "1", "pd7_not_executed:cma_operands_absent");
+    } else {
+        bind.engine.InitEccDomainParams(pd7Dps[pd7Sel][0], pd7Dps[pd7Sel][1], pd7Dps[pd7Sel][2], pd7Dps[pd7Sel][3], pd7Dps[pd7Sel][4], 1);
+        var pd7S2 = BindEs10xSingleRequest.buildTlv("30",
+            BindEs10xSingleRequest.buildTlv("80", pd7Tid)
+            + BindEs10xSingleRequest.buildTlv("01", "FF"));
+        var pd7Sgn = "";
+        while (pd7Sgn.length != 2 * pd7Sks[pd7Sel].length) {
+            bind.engine.SleepTime(2000);
+            pd7Sgn = bind.engine.EccSignData(pd7Sks[pd7Sel], pd7S2 + BindEs10xSingleRequest.buildTlv("5F37", pd7Sig1), 33);
+        }
+        var pd7Req = BindEs10xSingleRequest.buildTlv("BF21",
+            pd7S2
+            + BindEs10xSingleRequest.buildTlv("5F37", pd7Sgn)
+            + BindEs10xSingleRequest.buildTlv("04", pd7HashCc)
+            + BindEs10xSingleRequest.buildTlv("30", pd7Certs[pd7Sel]));
+        var pd7Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd7Req,
+             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+        var pd7Sw = (pd7Run.final && pd7Run.final.sw) ? pd7Run.final.sw : "transport_error";
+        bind.checkData("S7-C1 SW", "9000", pd7Sw);
+        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
+        var pd7Otpk = "";
+        if (pd7Run.final && pd7Run.final.resp) {
+            var pd7L1 = BindEs10xSingleRequest.parseBerTlv(pd7Run.final.resp);
+            for (var pd7I1 = 0; pd7I1 < pd7L1.length && pd7Otpk === ""; pd7I1++) {
+                if (pd7L1[pd7I1].tag !== "BF21") continue;
+                var pd7L2 = BindEs10xSingleRequest.parseBerTlv(pd7L1[pd7I1].value);
+                for (var pd7I2 = 0; pd7I2 < pd7L2.length && pd7Otpk === ""; pd7I2++) {
+                    if (pd7L2[pd7I2].tag !== "A0") continue;
+                    var pd7L3 = BindEs10xSingleRequest.parseBerTlv(pd7L2[pd7I2].value);
+                    for (var pd7I3 = 0; pd7I3 < pd7L3.length && pd7Otpk === ""; pd7I3++) {
+                        if (pd7L3[pd7I3].tag !== "30") continue;
+                        var pd7L4 = BindEs10xSingleRequest.parseBerTlv(pd7L3[pd7I3].value);
+                        for (var pd7I4 = 0; pd7I4 < pd7L4.length; pd7I4++) {
+                            if (pd7L4[pd7I4].tag === "5F49") pd7Otpk = pd7L4[pd7I4].value;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
+    var pd7RSR = (pd7Run.final && pd7Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd7Run.final.resp) : [];
+    var pd7RSOuter = pd7RSR.length === 1 ? pd7RSR[0].tag : "absent";
+    var pd7RSBr = pd7RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd7RSR[0].value) : [];
+    var pd7RSA0 = false, pd7RSA1 = false, pd7RSCk = [];
+    for (var pd7RSi = 0; pd7RSi < pd7RSBr.length; pd7RSi++) {
+        if (pd7RSBr[pd7RSi].tag === "A0") { pd7RSA0 = true; pd7RSCk = BindEs10xSingleRequest.parseBerTlv(pd7RSBr[pd7RSi].value); }
+        if (pd7RSBr[pd7RSi].tag === "A1") { pd7RSA1 = true; pd7RSCk = BindEs10xSingleRequest.parseBerTlv(pd7RSBr[pd7RSi].value); }
+    }
+    var pd7RS30 = false, pd7RS5F37 = false, pd7RS80 = false, pd7RS02 = false;
+    for (var pd7RSj = 0; pd7RSj < pd7RSCk.length; pd7RSj++) {
+        if (pd7RSCk[pd7RSj].tag === "30") pd7RS30 = true;
+        if (pd7RSCk[pd7RSj].tag === "5F37") pd7RS5F37 = true;
+        if (pd7RSCk[pd7RSj].tag === "80") pd7RS80 = true;
+        if (pd7RSCk[pd7RSj].tag === "02") pd7RS02 = true;
+    }
+    var pd7RS5F49 = false;
+    if (pd7RS30) {
+        for (var pd7RSk = 0; pd7RSk < pd7RSCk.length; pd7RSk++) {
+            if (pd7RSCk[pd7RSk].tag !== "30") continue;
+            var pd7RSU = BindEs10xSingleRequest.parseBerTlv(pd7RSCk[pd7RSk].value);
+            for (var pd7RSm = 0; pd7RSm < pd7RSU.length; pd7RSm++) {
+                if (pd7RSU[pd7RSm].tag === "5F49") pd7RS5F49 = true;
+                if (pd7RSU[pd7RSm].tag === "80") pd7RS80 = true;
+            }
+        }
+    }
+    bind.checkData("S7-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd7RSOuter);
+    bind.checkData("S7-C2 R_PREP_DOWNLOAD required members present", "1", (pd7RSA0 && pd7RS30 && pd7RS80 && pd7RS5F49 && pd7RS5F37) ? "1" : "0");
+    // S7-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
+    // S7-C4: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
+    // S7-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
+    // S7-C6: binding:prep_download_response_otpk_extract_cross_step(5F49;S22_prep_dl) (check_attestation)
+
+    var cs8Tid = "";
+    for (var cs8Ri = 0; cs8Ri < 16; cs8Ri++) {
+        cs8Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+    }
+    // cancel_session 运行时绑定(B-7):BF41{80<tid> 81 01 01}——tid 运行时随机 16B;reason S22:9140 枚举
+    var cs8Asm = BindEs10bCancelSession.assembleCancelSession({outer: "BF41", transactionId: "80", reason: "81"}, {transactionId: cs8Tid, reason: "01"});
+    if (cs8Asm.error) {
+        bind.checkData("S8-C1 assemble", "1", "0");
+        bind.checkData("S8-C2 assemble", "1", "0");
+    } else {
+        var s8 = bind.sendApdu(null, "E2", "91", "00", cs8Asm.request_hex, "00", "9000");
+        bind.checkData("S8-C1 SW", "9000", s8.sw);
+        var cs8Ex = BindEs10bCancelSession.extractCancelSession({outer: "BF41", ok: {tag: "A0", children: [{name: "euiccCancelSessionSigned", tag: "30", children: [{name: "transactionId", tag: "80"},{name: "smdpOid", tag: "81"},{name: "reason", tag: "82"}]},{name: "euiccCancelSessionSignature", tag: "5F37"}]},error: {tag: "81"}}, s8.resp);
+        bind.checkData("S8-C2 cancelSessionResponseOk structure", "1", (cs8Ex.branch === "ok" && cs8Ex.ok && cs8Ex.ok.missing.length === 0 && cs8Ex.ok.fields.euiccCancelSessionSigned.children.missing.length === 0) ? "1" : "0");
+    }
+
+    // 步骤 9:Seq#02] Execute the Common Mutual Authentication procedure between the eUICC and the S_SM-DP+ #GET_EUICC_INFO1, #GET_EUICC_CHALLENGE and #AUTHENTICATE_SMDP are sent to the eUICC the same GSMA CI as for the first attempt has been chosen for signing and for verification(tc_step;REQ: RQ57_047)
+    // W3D CMA 过程声明行内联动态绑定(三命令链;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;421324 IC6 dynamic-bound 先例机制面)
+    // CMA 链命令 1/3 GetEuiccInfo1(BF20 空结构,S22_info §5.7.8):
+    var cma9I1 = bind.sendApdu(null, "E2", "91", "00", "BF2000", null, "9000");
+    var cma9Gw1 = BindGecaProc.parseGecaResponse(cma9I1.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
+    // CMA 链命令 2/3 GetEuiccChallenge(BF2E 空结构,S22_challenge §5.7.7;响应 euiccChallenge 成员运行时提取):
+    var cma9C2 = bind.sendApdu(null, "E2", "91", "00", "BF2E00", null, "9000");
+    var cma9Ch = BindGecaProc.parseGecaResponse(cma9C2.resp, {outer: "BF2E", required: ["80"], optional: []});
+    // CMA 链命令 3/3 AuthenticateServer(BF38 引擎组装;槽位值=声明面分级注入):
+    var cma9Tid = "";
+    var cma9Sc = "";
+    for (var cma9Ri = 0; cma9Ri < 16; cma9Ri++) {
+        cma9Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+        cma9Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+    }
+    var cma9PkList = BindEs10xSingleRequest.parseBerTlv(cma9Gw1.fields["AA"] || "");
+    var cma9CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
+    var cma9Sks = ["0A7CC1C244E60C52CD5B7807AB8C360C26524601507DCABC5DD598B5A616D5D5", "93FB33D0584F349B07F8B5D2AF93D7C3E354B349A3B913502E6ABC070E4D4929"];
+    var cma9Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
+    var cma9Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+    var cma9Sel = -1;
+    for (var cma9Pi = 0; cma9Pi < cma9PkList.length && cma9Sel < 0; cma9Pi++) {
+        for (var cma9Mi = 0; cma9Mi < cma9CiIds.length; cma9Mi++) {
+            if (cma9PkList[cma9Pi].value === cma9CiIds[cma9Mi]) { cma9Sel = cma9Mi; break; }
+        }
+    }
+    var cma9Ech = "";
+    for (var cma9Ei = 0; cma9Ei < cma9Ch.children.length; cma9Ei++) {
+        if (cma9Ch.children[cma9Ei].tag === "80") { cma9Ech = cma9Ch.children[cma9Ei].value; }
+    }
+    if (cma9Sel < 0 || cma9Ech === "") {
+        // fail-closed 诚实面:CI PK ID 零命中物料套或 euiccChallenge 缺席 → BF38 不发送,后续过程面如实失败。
+        bind.checkData("S9-C1 cma_ok", "1", "0");
+    } else {
+        bind.engine.InitEccDomainParams(cma9Dps[cma9Sel][0], cma9Dps[cma9Sel][1], cma9Dps[cma9Sel][2], cma9Dps[cma9Sel][3], cma9Dps[cma9Sel][4], 1);
+        var cma9S1 = BindEs10xSingleRequest.buildTlv("30",
+            BindEs10xSingleRequest.buildTlv("80", cma9Tid)
+            + BindEs10xSingleRequest.buildTlv("81", cma9Ech)
+            + BindEs10xSingleRequest.buildTlv("83", "1674657374736D6470706C7573312E6578616D706C652E636F6D")
+            + BindEs10xSingleRequest.buildTlv("84", cma9Sc));
+        var cma9Sgn = "";
+        while (cma9Sgn.length != 2 * cma9Sks[cma9Sel].length) {
+            bind.engine.SleepTime(2000);
+            cma9Sgn = bind.engine.EccSignData(cma9Sks[cma9Sel], cma9S1, 33);
+        }
+        var cma9Asm = BindEs10bAuthServer.assembleAuthenticateServer(
+            {outer: "BF38",
+             signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
+             serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
+            {transactionId: cma9Tid, euiccChallenge: cma9Ech,
+             serverAddress: "1674657374736D6470706C7573312E6578616D706C652E636F6D", serverChallenge: cma9Sc,
+             serverSignature1: cma9Sgn, euiccCiPKIdToBeUsed: cma9CiIds[cma9Sel],
+             serverCertificate: cma9Certs[cma9Sel], ctxParams1: "A10D800400000110A1058003000010"});
+        if (cma9Asm.error) {
+        bind.checkData("S9-C1 cma_ok", "1", "0");
+        } else {
+            var cma9Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+                {cla: "", ins: "E2", p1: "91", p2: "00", data: cma9Asm.request_hex,
+                 le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+            var cma9Sw = (cma9Run.final && cma9Run.final.sw) ? cma9Run.final.sw : "transport_error";
+            var cma9Ex = 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"}]}},
+                cma9Run.final ? cma9Run.final.resp : "");
+            var cma9OkBr = cma9Ex.branch === "ok" && cma9Ex.ok && cma9Ex.ok.missing.length === 0 && cma9Ex.ok.fields.euiccSigned1.children.missing.length === 0;
+            bind.checkData("S9-C1 Common Mutual Authentication re-execution ok", "1", cma9OkBr ? "1" : "0");
+            // euiccSignature1([5F37])运行时提取面登记:CMA 响应操作数供后续步(PREP_DOWNLOAD 签名明文)消费——5.2.2.2.1 后续 step5-8 属子过程声明/装配域,非本步发射面。
+        }
+    }
+
+    // 步骤 10:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030, RQ31_137, RQ57_033)
+    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_RETRY_C;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
+    //   transactionId/euiccSignature1=前序 CMA 声明步 step9 运行时提取(§5.7.5 会话一致性同值要求,不新生成);smdpSignature2=EccSignData(DPpb SK, smdpSigned2 TLV‖5F37(euiccSignature1), 33)(S22_prep_dl+G Annex B+vendor GenRequest 三源对账);
+    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
+    var pd10Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
+    var pd10Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
+    var pd10Tid = cma9Tid;
+    var pd10Sel = cma9Sel;
+    var pd10Sig1 = (typeof cma9Ex !== "undefined" && cma9Ex && cma9Ex.ok && cma9Ex.ok.fields.euiccSignature1) ? cma9Ex.ok.fields.euiccSignature1.value : "";
+    var pd10Dps = cma9Dps;
+    var pd10OtpkRef = (typeof pd7Otpk !== "undefined") ? pd7Otpk : "";
+    var pd10CcH = bind.engine.Sha256("30313032303330343035", 20);
+    var pd10HashCc = bind.engine.Sha256(pd10CcH + pd10Tid, (pd10CcH + pd10Tid).length);
+    if (pd10Sel < 0 || pd10Sig1 === "" || pd10OtpkRef === "") {
+        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
+        bind.checkData("S10-C1 SW", "9000", "pd10_not_executed:cma_operands_absent");
+        bind.checkData("S10-C2 R_PREP_DOWNLOAD response structure", "1", "pd10_not_executed:cma_operands_absent");
+    } else {
+        bind.engine.InitEccDomainParams(pd10Dps[pd10Sel][0], pd10Dps[pd10Sel][1], pd10Dps[pd10Sel][2], pd10Dps[pd10Sel][3], pd10Dps[pd10Sel][4], 1);
+        var pd10S2 = BindEs10xSingleRequest.buildTlv("30",
+            BindEs10xSingleRequest.buildTlv("80", pd10Tid)
+            + BindEs10xSingleRequest.buildTlv("01", "FF")
+            + BindEs10xSingleRequest.buildTlv("5F49", pd10OtpkRef));
+        var pd10Sgn = "";
+        while (pd10Sgn.length != 2 * pd10Sks[pd10Sel].length) {
+            bind.engine.SleepTime(2000);
+            pd10Sgn = bind.engine.EccSignData(pd10Sks[pd10Sel], pd10S2 + BindEs10xSingleRequest.buildTlv("5F37", pd10Sig1), 33);
+        }
+        var pd10Req = BindEs10xSingleRequest.buildTlv("BF21",
+            pd10S2
+            + BindEs10xSingleRequest.buildTlv("5F37", pd10Sgn)
+            + BindEs10xSingleRequest.buildTlv("04", pd10HashCc)
+            + BindEs10xSingleRequest.buildTlv("30", pd10Certs[pd10Sel]));
+        var pd10Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd10Req,
+             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+        var pd10Sw = (pd10Run.final && pd10Run.final.sw) ? pd10Run.final.sw : "transport_error";
+        bind.checkData("S10-C1 SW", "9000", pd10Sw);
+        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
+        var pd10Otpk = "";
+        if (pd10Run.final && pd10Run.final.resp) {
+            var pd10L1 = BindEs10xSingleRequest.parseBerTlv(pd10Run.final.resp);
+            for (var pd10I1 = 0; pd10I1 < pd10L1.length && pd10Otpk === ""; pd10I1++) {
+                if (pd10L1[pd10I1].tag !== "BF21") continue;
+                var pd10L2 = BindEs10xSingleRequest.parseBerTlv(pd10L1[pd10I1].value);
+                for (var pd10I2 = 0; pd10I2 < pd10L2.length && pd10Otpk === ""; pd10I2++) {
+                    if (pd10L2[pd10I2].tag !== "A0") continue;
+                    var pd10L3 = BindEs10xSingleRequest.parseBerTlv(pd10L2[pd10I2].value);
+                    for (var pd10I3 = 0; pd10I3 < pd10L3.length && pd10Otpk === ""; pd10I3++) {
+                        if (pd10L3[pd10I3].tag !== "30") continue;
+                        var pd10L4 = BindEs10xSingleRequest.parseBerTlv(pd10L3[pd10I3].value);
+                        for (var pd10I4 = 0; pd10I4 < pd10L4.length; pd10I4++) {
+                            if (pd10L4[pd10I4].tag === "5F49") pd10Otpk = pd10L4[pd10I4].value;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
+    var pd10RSR = (pd10Run.final && pd10Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd10Run.final.resp) : [];
+    var pd10RSOuter = pd10RSR.length === 1 ? pd10RSR[0].tag : "absent";
+    var pd10RSBr = pd10RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd10RSR[0].value) : [];
+    var pd10RSA0 = false, pd10RSA1 = false, pd10RSCk = [];
+    for (var pd10RSi = 0; pd10RSi < pd10RSBr.length; pd10RSi++) {
+        if (pd10RSBr[pd10RSi].tag === "A0") { pd10RSA0 = true; pd10RSCk = BindEs10xSingleRequest.parseBerTlv(pd10RSBr[pd10RSi].value); }
+        if (pd10RSBr[pd10RSi].tag === "A1") { pd10RSA1 = true; pd10RSCk = BindEs10xSingleRequest.parseBerTlv(pd10RSBr[pd10RSi].value); }
+    }
+    var pd10RS30 = false, pd10RS5F37 = false, pd10RS80 = false, pd10RS02 = false;
+    for (var pd10RSj = 0; pd10RSj < pd10RSCk.length; pd10RSj++) {
+        if (pd10RSCk[pd10RSj].tag === "30") pd10RS30 = true;
+        if (pd10RSCk[pd10RSj].tag === "5F37") pd10RS5F37 = true;
+        if (pd10RSCk[pd10RSj].tag === "80") pd10RS80 = true;
+        if (pd10RSCk[pd10RSj].tag === "02") pd10RS02 = true;
+    }
+    var pd10RS5F49 = false;
+    if (pd10RS30) {
+        for (var pd10RSk = 0; pd10RSk < pd10RSCk.length; pd10RSk++) {
+            if (pd10RSCk[pd10RSk].tag !== "30") continue;
+            var pd10RSU = BindEs10xSingleRequest.parseBerTlv(pd10RSCk[pd10RSk].value);
+            for (var pd10RSm = 0; pd10RSm < pd10RSU.length; pd10RSm++) {
+                if (pd10RSU[pd10RSm].tag === "5F49") pd10RS5F49 = true;
+                if (pd10RSU[pd10RSm].tag === "80") pd10RS80 = true;
+            }
+        }
+    }
+    bind.checkData("S10-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd10RSOuter);
+    bind.checkData("S10-C2 R_PREP_DOWNLOAD required members present", "1", (pd10RSA0 && pd10RS30 && pd10RS80 && pd10RS5F49 && pd10RS5F37) ? "1" : "0");
+    // S10-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
+    // S10-C4: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
+    // S10-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
+    // S10-C6: binding:prep_download_retry_otpk_reuse(previous-5F49;RQ31_137) (check_attestation)
+
+    // 步骤 11:<S_HASHED_CC> = MTD_GENERATE_HASHED_CC(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:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030)
+    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_WITH_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
+    //   transactionId/euiccSignature1=前序 CMA 声明步 step9 运行时提取(§5.7.5 会话一致性同值要求,不新生成);smdpSignature2=EccSignData(DPpb SK, smdpSigned2 TLV‖5F37(euiccSignature1), 33)(S22_prep_dl+G Annex B+vendor GenRequest 三源对账);
+    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
+    var pd12Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
+    var pd12Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
+    var pd12Tid = cma9Tid;
+    var pd12Sel = cma9Sel;
+    var pd12Sig1 = (typeof cma9Ex !== "undefined" && cma9Ex && cma9Ex.ok && cma9Ex.ok.fields.euiccSignature1) ? cma9Ex.ok.fields.euiccSignature1.value : "";
+    var pd12Dps = cma9Dps;
+    var pd12CcH = bind.engine.Sha256("30313032303330343035", 20);
+    var pd12HashCc = bind.engine.Sha256(pd12CcH + pd12Tid, (pd12CcH + pd12Tid).length);
+    if (pd12Sel < 0 || pd12Sig1 === "") {
+        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
+        bind.checkData("S12-C1 SW", "9000", "pd12_not_executed:cma_operands_absent");
+        bind.checkData("S12-C2 R_PREP_DOWNLOAD response structure", "1", "pd12_not_executed:cma_operands_absent");
+    } else {
+        bind.engine.InitEccDomainParams(pd12Dps[pd12Sel][0], pd12Dps[pd12Sel][1], pd12Dps[pd12Sel][2], pd12Dps[pd12Sel][3], pd12Dps[pd12Sel][4], 1);
+        var pd12S2 = BindEs10xSingleRequest.buildTlv("30",
+            BindEs10xSingleRequest.buildTlv("80", pd12Tid)
+            + BindEs10xSingleRequest.buildTlv("01", "FF"));
+        var pd12Sgn = "";
+        while (pd12Sgn.length != 2 * pd12Sks[pd12Sel].length) {
+            bind.engine.SleepTime(2000);
+            pd12Sgn = bind.engine.EccSignData(pd12Sks[pd12Sel], pd12S2 + BindEs10xSingleRequest.buildTlv("5F37", pd12Sig1), 33);
+        }
+        var pd12Req = BindEs10xSingleRequest.buildTlv("BF21",
+            pd12S2
+            + BindEs10xSingleRequest.buildTlv("5F37", pd12Sgn)
+            + BindEs10xSingleRequest.buildTlv("04", pd12HashCc)
+            + BindEs10xSingleRequest.buildTlv("30", pd12Certs[pd12Sel]));
+        var pd12Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd12Req,
+             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+        var pd12Sw = (pd12Run.final && pd12Run.final.sw) ? pd12Run.final.sw : "transport_error";
+        bind.checkData("S12-C1 SW", "9000", pd12Sw);
+        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
+        var pd12Otpk = "";
+        if (pd12Run.final && pd12Run.final.resp) {
+            var pd12L1 = BindEs10xSingleRequest.parseBerTlv(pd12Run.final.resp);
+            for (var pd12I1 = 0; pd12I1 < pd12L1.length && pd12Otpk === ""; pd12I1++) {
+                if (pd12L1[pd12I1].tag !== "BF21") continue;
+                var pd12L2 = BindEs10xSingleRequest.parseBerTlv(pd12L1[pd12I1].value);
+                for (var pd12I2 = 0; pd12I2 < pd12L2.length && pd12Otpk === ""; pd12I2++) {
+                    if (pd12L2[pd12I2].tag !== "A0") continue;
+                    var pd12L3 = BindEs10xSingleRequest.parseBerTlv(pd12L2[pd12I2].value);
+                    for (var pd12I3 = 0; pd12I3 < pd12L3.length && pd12Otpk === ""; pd12I3++) {
+                        if (pd12L3[pd12I3].tag !== "30") continue;
+                        var pd12L4 = BindEs10xSingleRequest.parseBerTlv(pd12L3[pd12I3].value);
+                        for (var pd12I4 = 0; pd12I4 < pd12L4.length; pd12I4++) {
+                            if (pd12L4[pd12I4].tag === "5F49") pd12Otpk = pd12L4[pd12I4].value;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
+    var pd12RSR = (pd12Run.final && pd12Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd12Run.final.resp) : [];
+    var pd12RSOuter = pd12RSR.length === 1 ? pd12RSR[0].tag : "absent";
+    var pd12RSBr = pd12RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd12RSR[0].value) : [];
+    var pd12RSA0 = false, pd12RSA1 = false, pd12RSCk = [];
+    for (var pd12RSi = 0; pd12RSi < pd12RSBr.length; pd12RSi++) {
+        if (pd12RSBr[pd12RSi].tag === "A0") { pd12RSA0 = true; pd12RSCk = BindEs10xSingleRequest.parseBerTlv(pd12RSBr[pd12RSi].value); }
+        if (pd12RSBr[pd12RSi].tag === "A1") { pd12RSA1 = true; pd12RSCk = BindEs10xSingleRequest.parseBerTlv(pd12RSBr[pd12RSi].value); }
+    }
+    var pd12RS30 = false, pd12RS5F37 = false, pd12RS80 = false, pd12RS02 = false;
+    for (var pd12RSj = 0; pd12RSj < pd12RSCk.length; pd12RSj++) {
+        if (pd12RSCk[pd12RSj].tag === "30") pd12RS30 = true;
+        if (pd12RSCk[pd12RSj].tag === "5F37") pd12RS5F37 = true;
+        if (pd12RSCk[pd12RSj].tag === "80") pd12RS80 = true;
+        if (pd12RSCk[pd12RSj].tag === "02") pd12RS02 = true;
+    }
+    var pd12RS5F49 = false;
+    if (pd12RS30) {
+        for (var pd12RSk = 0; pd12RSk < pd12RSCk.length; pd12RSk++) {
+            if (pd12RSCk[pd12RSk].tag !== "30") continue;
+            var pd12RSU = BindEs10xSingleRequest.parseBerTlv(pd12RSCk[pd12RSk].value);
+            for (var pd12RSm = 0; pd12RSm < pd12RSU.length; pd12RSm++) {
+                if (pd12RSU[pd12RSm].tag === "5F49") pd12RS5F49 = true;
+                if (pd12RSU[pd12RSm].tag === "80") pd12RS80 = true;
+            }
+        }
+    }
+    bind.checkData("S12-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd12RSOuter);
+    bind.checkData("S12-C2 R_PREP_DOWNLOAD required members present", "1", (pd12RSA0 && pd12RS30 && pd12RS80 && pd12RS5F49 && pd12RS5F37) ? "1" : "0");
+    // S12-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
+    // S12-C4: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
+    // S12-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
+    // S12-C6: binding:prep_download_response_otpk_extract_cross_step(5F49;S22_prep_dl) (check_attestation)
+
+    var cs13Tid = "";
+    for (var cs13Ri = 0; cs13Ri < 16; cs13Ri++) {
+        cs13Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+    }
+    // cancel_session 运行时绑定(B-7):BF41{80<tid> 81 01 02}——tid 运行时随机 16B;reason S22:9140 枚举
+    var cs13Asm = BindEs10bCancelSession.assembleCancelSession({outer: "BF41", transactionId: "80", reason: "81"}, {transactionId: cs13Tid, reason: "02"});
+    if (cs13Asm.error) {
+        bind.checkData("S13-C1 assemble", "1", "0");
+        bind.checkData("S13-C2 assemble", "1", "0");
+    } else {
+        var s13 = bind.sendApdu(null, "E2", "91", "00", cs13Asm.request_hex, "00", "9000");
+        bind.checkData("S13-C1 SW", "9000", s13.sw);
+        var cs13Ex = BindEs10bCancelSession.extractCancelSession({outer: "BF41", ok: {tag: "A0", children: [{name: "euiccCancelSessionSigned", tag: "30", children: [{name: "transactionId", tag: "80"},{name: "smdpOid", tag: "81"},{name: "reason", tag: "82"}]},{name: "euiccCancelSessionSignature", tag: "5F37"}]},error: {tag: "81"}}, s13.resp);
+        bind.checkData("S13-C2 cancelSessionResponseOk structure", "1", (cs13Ex.branch === "ok" && cs13Ex.ok && cs13Ex.ok.missing.length === 0 && cs13Ex.ok.fields.euiccCancelSessionSigned.children.missing.length === 0) ? "1" : "0");
+    }
+
+    // 步骤 14:Seq#03] Execute the Common Mutual Authentication procedure between the eUICC and the S_SM-DP+ #GET_EUICC_INFO1, #GET_EUICC_CHALLENGE and #AUTHENTICATE_SMDP are sent to the eUICC the same GSMA CI as for the first attempt has been chosen for signing and for verification(tc_step;REQ: RQ57_047)
+    // W3D CMA 过程声明行内联动态绑定(三命令链;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;421324 IC6 dynamic-bound 先例机制面)
+    // CMA 链命令 1/3 GetEuiccInfo1(BF20 空结构,S22_info §5.7.8):
+    var cma14I1 = bind.sendApdu(null, "E2", "91", "00", "BF2000", null, "9000");
+    var cma14Gw1 = BindGecaProc.parseGecaResponse(cma14I1.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
+    // CMA 链命令 2/3 GetEuiccChallenge(BF2E 空结构,S22_challenge §5.7.7;响应 euiccChallenge 成员运行时提取):
+    var cma14C2 = bind.sendApdu(null, "E2", "91", "00", "BF2E00", null, "9000");
+    var cma14Ch = BindGecaProc.parseGecaResponse(cma14C2.resp, {outer: "BF2E", required: ["80"], optional: []});
+    // CMA 链命令 3/3 AuthenticateServer(BF38 引擎组装;槽位值=声明面分级注入):
+    var cma14Tid = "";
+    var cma14Sc = "";
+    for (var cma14Ri = 0; cma14Ri < 16; cma14Ri++) {
+        cma14Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+        cma14Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+    }
+    var cma14PkList = BindEs10xSingleRequest.parseBerTlv(cma14Gw1.fields["AA"] || "");
+    var cma14CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
+    var cma14Sks = ["0A7CC1C244E60C52CD5B7807AB8C360C26524601507DCABC5DD598B5A616D5D5", "93FB33D0584F349B07F8B5D2AF93D7C3E354B349A3B913502E6ABC070E4D4929"];
+    var cma14Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
+    var cma14Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+    var cma14Sel = -1;
+    for (var cma14Pi = 0; cma14Pi < cma14PkList.length && cma14Sel < 0; cma14Pi++) {
+        for (var cma14Mi = 0; cma14Mi < cma14CiIds.length; cma14Mi++) {
+            if (cma14PkList[cma14Pi].value === cma14CiIds[cma14Mi]) { cma14Sel = cma14Mi; break; }
+        }
+    }
+    var cma14Ech = "";
+    for (var cma14Ei = 0; cma14Ei < cma14Ch.children.length; cma14Ei++) {
+        if (cma14Ch.children[cma14Ei].tag === "80") { cma14Ech = cma14Ch.children[cma14Ei].value; }
+    }
+    if (cma14Sel < 0 || cma14Ech === "") {
+        // fail-closed 诚实面:CI PK ID 零命中物料套或 euiccChallenge 缺席 → BF38 不发送,后续过程面如实失败。
+        bind.checkData("S14-C1 cma_ok", "1", "0");
+    } else {
+        bind.engine.InitEccDomainParams(cma14Dps[cma14Sel][0], cma14Dps[cma14Sel][1], cma14Dps[cma14Sel][2], cma14Dps[cma14Sel][3], cma14Dps[cma14Sel][4], 1);
+        var cma14S1 = BindEs10xSingleRequest.buildTlv("30",
+            BindEs10xSingleRequest.buildTlv("80", cma14Tid)
+            + BindEs10xSingleRequest.buildTlv("81", cma14Ech)
+            + BindEs10xSingleRequest.buildTlv("83", "1674657374736D6470706C7573312E6578616D706C652E636F6D")
+            + BindEs10xSingleRequest.buildTlv("84", cma14Sc));
+        var cma14Sgn = "";
+        while (cma14Sgn.length != 2 * cma14Sks[cma14Sel].length) {
+            bind.engine.SleepTime(2000);
+            cma14Sgn = bind.engine.EccSignData(cma14Sks[cma14Sel], cma14S1, 33);
+        }
+        var cma14Asm = BindEs10bAuthServer.assembleAuthenticateServer(
+            {outer: "BF38",
+             signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
+             serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
+            {transactionId: cma14Tid, euiccChallenge: cma14Ech,
+             serverAddress: "1674657374736D6470706C7573312E6578616D706C652E636F6D", serverChallenge: cma14Sc,
+             serverSignature1: cma14Sgn, euiccCiPKIdToBeUsed: cma14CiIds[cma14Sel],
+             serverCertificate: cma14Certs[cma14Sel], ctxParams1: "A10D800400000110A1058003000010"});
+        if (cma14Asm.error) {
+        bind.checkData("S14-C1 cma_ok", "1", "0");
+        } else {
+            var cma14Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+                {cla: "", ins: "E2", p1: "91", p2: "00", data: cma14Asm.request_hex,
+                 le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+            var cma14Sw = (cma14Run.final && cma14Run.final.sw) ? cma14Run.final.sw : "transport_error";
+            var cma14Ex = 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"}]}},
+                cma14Run.final ? cma14Run.final.resp : "");
+            var cma14OkBr = cma14Ex.branch === "ok" && cma14Ex.ok && cma14Ex.ok.missing.length === 0 && cma14Ex.ok.fields.euiccSigned1.children.missing.length === 0;
+            bind.checkData("S14-C1 Common Mutual Authentication re-execution ok", "1", cma14OkBr ? "1" : "0");
+            // euiccSignature1([5F37])运行时提取面登记:CMA 响应操作数供后续步(PREP_DOWNLOAD 签名明文)消费——5.2.2.2.1 后续 step5-8 属子过程声明/装配域,非本步发射面。
+        }
+    }
+
+    // 步骤 15:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030, RQ31_137, RQ57_033)
+    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_RETRY_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
+    //   transactionId/euiccSignature1=前序 CMA 声明步 step14 运行时提取(§5.7.5 会话一致性同值要求,不新生成);smdpSignature2=EccSignData(DPpb SK, smdpSigned2 TLV‖5F37(euiccSignature1), 33)(S22_prep_dl+G Annex B+vendor GenRequest 三源对账);
+    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
+    var pd15Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
+    var pd15Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
+    var pd15Tid = cma14Tid;
+    var pd15Sel = cma14Sel;
+    var pd15Sig1 = (typeof cma14Ex !== "undefined" && cma14Ex && cma14Ex.ok && cma14Ex.ok.fields.euiccSignature1) ? cma14Ex.ok.fields.euiccSignature1.value : "";
+    var pd15Dps = cma14Dps;
+    var pd15OtpkRef = (typeof pd12Otpk !== "undefined") ? pd12Otpk : "";
+    var pd15CcH = bind.engine.Sha256("30313032303330343035", 20);
+    var pd15HashCc = bind.engine.Sha256(pd15CcH + pd15Tid, (pd15CcH + pd15Tid).length);
+    if (pd15Sel < 0 || pd15Sig1 === "" || pd15OtpkRef === "") {
+        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
+        bind.checkData("S15-C1 SW", "9000", "pd15_not_executed:cma_operands_absent");
+        bind.checkData("S15-C2 R_PREP_DOWNLOAD response structure", "1", "pd15_not_executed:cma_operands_absent");
+    } else {
+        bind.engine.InitEccDomainParams(pd15Dps[pd15Sel][0], pd15Dps[pd15Sel][1], pd15Dps[pd15Sel][2], pd15Dps[pd15Sel][3], pd15Dps[pd15Sel][4], 1);
+        var pd15S2 = BindEs10xSingleRequest.buildTlv("30",
+            BindEs10xSingleRequest.buildTlv("80", pd15Tid)
+            + BindEs10xSingleRequest.buildTlv("01", "FF")
+            + BindEs10xSingleRequest.buildTlv("5F49", pd15OtpkRef));
+        var pd15Sgn = "";
+        while (pd15Sgn.length != 2 * pd15Sks[pd15Sel].length) {
+            bind.engine.SleepTime(2000);
+            pd15Sgn = bind.engine.EccSignData(pd15Sks[pd15Sel], pd15S2 + BindEs10xSingleRequest.buildTlv("5F37", pd15Sig1), 33);
+        }
+        var pd15Req = BindEs10xSingleRequest.buildTlv("BF21",
+            pd15S2
+            + BindEs10xSingleRequest.buildTlv("5F37", pd15Sgn)
+            + BindEs10xSingleRequest.buildTlv("04", pd15HashCc)
+            + BindEs10xSingleRequest.buildTlv("30", pd15Certs[pd15Sel]));
+        var pd15Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd15Req,
+             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+        var pd15Sw = (pd15Run.final && pd15Run.final.sw) ? pd15Run.final.sw : "transport_error";
+        bind.checkData("S15-C1 SW", "9000", pd15Sw);
+        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
+        var pd15Otpk = "";
+        if (pd15Run.final && pd15Run.final.resp) {
+            var pd15L1 = BindEs10xSingleRequest.parseBerTlv(pd15Run.final.resp);
+            for (var pd15I1 = 0; pd15I1 < pd15L1.length && pd15Otpk === ""; pd15I1++) {
+                if (pd15L1[pd15I1].tag !== "BF21") continue;
+                var pd15L2 = BindEs10xSingleRequest.parseBerTlv(pd15L1[pd15I1].value);
+                for (var pd15I2 = 0; pd15I2 < pd15L2.length && pd15Otpk === ""; pd15I2++) {
+                    if (pd15L2[pd15I2].tag !== "A0") continue;
+                    var pd15L3 = BindEs10xSingleRequest.parseBerTlv(pd15L2[pd15I2].value);
+                    for (var pd15I3 = 0; pd15I3 < pd15L3.length && pd15Otpk === ""; pd15I3++) {
+                        if (pd15L3[pd15I3].tag !== "30") continue;
+                        var pd15L4 = BindEs10xSingleRequest.parseBerTlv(pd15L3[pd15I3].value);
+                        for (var pd15I4 = 0; pd15I4 < pd15L4.length; pd15I4++) {
+                            if (pd15L4[pd15I4].tag === "5F49") pd15Otpk = pd15L4[pd15I4].value;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
+    var pd15RSR = (pd15Run.final && pd15Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd15Run.final.resp) : [];
+    var pd15RSOuter = pd15RSR.length === 1 ? pd15RSR[0].tag : "absent";
+    var pd15RSBr = pd15RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd15RSR[0].value) : [];
+    var pd15RSA0 = false, pd15RSA1 = false, pd15RSCk = [];
+    for (var pd15RSi = 0; pd15RSi < pd15RSBr.length; pd15RSi++) {
+        if (pd15RSBr[pd15RSi].tag === "A0") { pd15RSA0 = true; pd15RSCk = BindEs10xSingleRequest.parseBerTlv(pd15RSBr[pd15RSi].value); }
+        if (pd15RSBr[pd15RSi].tag === "A1") { pd15RSA1 = true; pd15RSCk = BindEs10xSingleRequest.parseBerTlv(pd15RSBr[pd15RSi].value); }
+    }
+    var pd15RS30 = false, pd15RS5F37 = false, pd15RS80 = false, pd15RS02 = false;
+    for (var pd15RSj = 0; pd15RSj < pd15RSCk.length; pd15RSj++) {
+        if (pd15RSCk[pd15RSj].tag === "30") pd15RS30 = true;
+        if (pd15RSCk[pd15RSj].tag === "5F37") pd15RS5F37 = true;
+        if (pd15RSCk[pd15RSj].tag === "80") pd15RS80 = true;
+        if (pd15RSCk[pd15RSj].tag === "02") pd15RS02 = true;
+    }
+    var pd15RS5F49 = false;
+    if (pd15RS30) {
+        for (var pd15RSk = 0; pd15RSk < pd15RSCk.length; pd15RSk++) {
+            if (pd15RSCk[pd15RSk].tag !== "30") continue;
+            var pd15RSU = BindEs10xSingleRequest.parseBerTlv(pd15RSCk[pd15RSk].value);
+            for (var pd15RSm = 0; pd15RSm < pd15RSU.length; pd15RSm++) {
+                if (pd15RSU[pd15RSm].tag === "5F49") pd15RS5F49 = true;
+                if (pd15RSU[pd15RSm].tag === "80") pd15RS80 = true;
+            }
+        }
+    }
+    bind.checkData("S15-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd15RSOuter);
+    bind.checkData("S15-C2 R_PREP_DOWNLOAD required members present", "1", (pd15RSA0 && pd15RS30 && pd15RS80 && pd15RS5F49 && pd15RS5F37) ? "1" : "0");
+    // S15-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
+    // S15-C4: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
+    // S15-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
+    // S15-C6: binding:prep_download_retry_otpk_reuse(previous-5F49;RQ31_137) (check_attestation)
 }