源码对照:4.2.10.2.4
ES10b 下载准备异常用例 / TC_eUICC_ES10b.PrepareDownloadErrorCases
左侧为人工切片入口(-man,来自 原料/切片 的最小可执行脚本),右侧为 Cas 盲生成入口(-cas,仅依据规范生成)。文件按原始编码(多为 GBK)解码为 UTF-8 显示,行号自 1 起;字节级原文与 sha256 见两侧脚本包。完整 unified diff 见本页底部折叠区,以及 报告原文 §4。
-man 入口
Import/TestCase_SGP_23.js
325 行 / 13453 字符 / gb18030
-cas 入口
TC_eUICC_ES10b_PrepareDownloadErrorCases/Import/TC_eUICC_ES10b_PrepareDownloadErrorCases.js
762 行 / 76894 字符 / gb18030
默认折行显示长行;取消勾选可横向滚动查看原始行宽
-man 人工切片Import/TestCase_SGP_23.js325 行 / 13453 字符 / gb18030入口函数 @L3
1// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10b_PrepareDownloadErrorCases_01_Error_No_Hashed_Confirmation_Code_but_with_Confirmation_Code_Required_Flag_set_to_TRUE + TC_eUICC_ES10b_PrepareDownloadErrorCases_02_Error_With_incorrect_CERT_DPpb_ECDSA + TC_eUICC_ES10b_PrepareDownloadErrorCases_03_Error_CERT_DPpb_ECDSA_and_CERT_DPauth_ECDSA_not_belonging_to_the_same_entity + TC_eUICC_ES10b_PrepareDownloadErrorCases_04_Error_With_invalid_SM_DP_signature + TC_eUICC_ES10b_PrepareDownloadErrorCases_05_Error_With_invalid_Transaction_ID + TC_eUICC_ES10b_PrepareDownloadErrorCases_06_Error_SM_DP_has_not_been_previously_authenticated + TC_eUICC_ES10b_PrepareDownloadErrorCases_07_Error_Unsupported_curve + TC_eUICC_ES10b_PrepareDownloadErrorCases_08_Error_Invalid_Certificate_Role_OID (extracted verbatim)
2
3function TC_eUICC_ES10b_PrepareDownloadErrorCases_01_Error_No_Hashed_Confirmation_Code_but_with_Confirmation_Code_Required_Flag_set_to_TRUE()
4{
5 tracenamestr = "执行PrepareDownload,不带hashCc,但ccRequiredFlag为TRUE";
6 curDis.TraceStart(sno++,tracenamestr);
7
8 curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
9 Ini_powerOn_eUICC_LPAe_not_activate();
10
11 curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
12 TS_MANAGE_CHANNEL_OPEN();
13
14 curLogicChannel = 1;
15
16 curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
17 TS_SELECT("Select ISD",ISD_R_AID,"9000");
18
19 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
20 var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
21 Profile_load_procedure.ICCID = ICCID_OP_PROF1;
22 Profile_load_procedure.ES10b_GetEUICCInfo1();
23
24
25 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
26 Profile_load_procedure.ES10b_GetEUICCChallenge();
27
28
29 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
30 Profile_load_procedure.ES10b_AuthenticateServer();
31
32 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,确认码标记为true,但不包含Confirmation Code;");
33 Profile_load_procedure.ccRequiredFlag = "FF";
34 Profile_load_procedure.PrepareDownloadisErrorTest = true;
35 Profile_load_procedure.preparedownloadErrorCode = DownloadErrorCode.undefinedError;
36 Profile_load_procedure.ES10b_PrepareDownload();
37
38 RecoverCard();
39}
40
41function TC_eUICC_ES10b_PrepareDownloadErrorCases_02_Error_With_incorrect_CERT_DPpb_ECDSA()
42{
43 tracenamestr = "执行PrepareDownload,使用不正确的CERT.DPpb.ECDSA(即无效签名)";
44 curDis.TraceStart(sno++,tracenamestr);
45
46 curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
47 Ini_powerOn_eUICC_LPAe_not_activate();
48
49 curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
50 TS_MANAGE_CHANNEL_OPEN();
51
52 curLogicChannel = 1;
53
54 curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
55 TS_SELECT("Select ISD",ISD_R_AID,"9000");
56
57 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
58 var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
59 Profile_load_procedure.ICCID = ICCID_OP_PROF1;
60 Profile_load_procedure.ES10b_GetEUICCInfo1();
61
62
63 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
64 Profile_load_procedure.ES10b_GetEUICCChallenge();
65
66
67 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
68 Profile_load_procedure.ES10b_AuthenticateServer();
69
70 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,使用错误的CERT.DPpb.ECDSA(比如签名错);");
71 Profile_load_procedure.DPbpInforObj.Cert = CERT_S_SM_DPpb_INV_SIGN_NIST;
72 Profile_load_procedure.PrepareDownloadisErrorTest = true;
73 Profile_load_procedure.preparedownloadErrorCode = DownloadErrorCode.invalidCertificate;
74 Profile_load_procedure.ES10b_PrepareDownload();
75
76 RecoverCard();
77}
78
79function TC_eUICC_ES10b_PrepareDownloadErrorCases_03_Error_CERT_DPpb_ECDSA_and_CERT_DPauth_ECDSA_not_belonging_to_the_same_entity()
80{
81 tracenamestr = "执行PrepareDownload,CERT.DPpb.ECDSA和CERT.DPauth.ECDSA不属于同一实体";
82 curDis.TraceStart(sno++,tracenamestr);
83
84 curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
85 Ini_powerOn_eUICC_LPAe_not_activate();
86
87 curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
88 TS_MANAGE_CHANNEL_OPEN();
89
90 curLogicChannel = 1;
91
92 curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
93 TS_SELECT("Select ISD",ISD_R_AID,"9000");
94
95 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
96
97 var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
98 Profile_load_procedure.ICCID = ICCID_OP_PROF1;
99 Profile_load_procedure.ES10b_GetEUICCInfo1();
100
101 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
102 Profile_load_procedure.ES10b_GetEUICCChallenge();
103
104 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
105 Profile_load_procedure.ES10b_AuthenticateServer();
106
107 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,使用错误的CERT.DPpb.ECDSA(错误的OID);");
108 Profile_load_procedure.DPbpInforObj.Cert = CERT_S_SM_DP2pb_ECDSA_NIST;
109 Profile_load_procedure.PrepareDownloadisErrorTest = true;
110 Profile_load_procedure.preparedownloadErrorCode = DownloadErrorCode.invalidCertificate;
111 Profile_load_procedure.ES10b_PrepareDownload();
112
113 RecoverCard();
114
115}
116
117function TC_eUICC_ES10b_PrepareDownloadErrorCases_04_Error_With_invalid_SM_DP_signature()
118{
119 tracenamestr = "执行PrepareDownload,SM-DP+签名无效";
120 curDis.TraceStart(sno++,tracenamestr);
121
122 curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
123 Ini_powerOn_eUICC_LPAe_not_activate();
124
125 curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
126 TS_MANAGE_CHANNEL_OPEN();
127
128 curLogicChannel = 1;
129
130 curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
131 TS_SELECT("Select ISD",ISD_R_AID,"9000");
132
133 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
134
135 var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
136 Profile_load_procedure.ICCID = ICCID_OP_PROF1;
137 Profile_load_procedure.ES10b_GetEUICCInfo1();
138
139 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
140 Profile_load_procedure.ES10b_GetEUICCChallenge();
141
142 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
143 Profile_load_procedure.ES10b_AuthenticateServer();
144
145 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,使用无效的SM-DP+签名;");
146 Profile_load_procedure.DPbpInforObj.D_key = curStrHandle.RandHexStr(32);
147 Profile_load_procedure.PrepareDownloadisErrorTest = true;
148 Profile_load_procedure.preparedownloadErrorCode = DownloadErrorCode.invalidSignature;
149 Profile_load_procedure.ES10b_PrepareDownload();
150
151 RecoverCard();
152
153}
154
155function TC_eUICC_ES10b_PrepareDownloadErrorCases_05_Error_With_invalid_Transaction_ID()
156{
157 tracenamestr = "执行PrepareDownload,Transaction ID无效";
158 curDis.TraceStart(sno++,tracenamestr);
159
160 curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
161 Ini_powerOn_eUICC_LPAe_not_activate();
162
163 curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
164 TS_MANAGE_CHANNEL_OPEN();
165
166 curLogicChannel = 1;
167
168 curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
169 TS_SELECT("Select ISD",ISD_R_AID,"9000");
170
171 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
172
173 var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
174 Profile_load_procedure.ICCID = ICCID_OP_PROF1;
175 Profile_load_procedure.ES10b_GetEUICCInfo1();
176
177 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
178 Profile_load_procedure.ES10b_GetEUICCChallenge();
179
180 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
181 Profile_load_procedure.ES10b_AuthenticateServer();
182
183 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,使用无效的Transaction ID;");
184 Profile_load_procedure.transactionId = curStrHandle.RandHexStr(16);
185 Profile_load_procedure.PrepareDownloadisErrorTest = true;
186 Profile_load_procedure.preparedownloadErrorCode = DownloadErrorCode.invalidTransactionId;
187 Profile_load_procedure.ES10b_PrepareDownload();
188
189 RecoverCard();
190}
191
192function TC_eUICC_ES10b_PrepareDownloadErrorCases_06_Error_SM_DP_has_not_been_previously_authenticated()
193{
194 tracenamestr = "执行PrepareDownload,SM-DP+未经过认证";
195 curDis.TraceStart(sno++,tracenamestr);
196
197 curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
198 Ini_powerOn_eUICC_LPAe_not_activate();
199
200 curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
201 TS_MANAGE_CHANNEL_OPEN();
202
203 curLogicChannel = 1;
204
205 curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
206 TS_SELECT("Select ISD",ISD_R_AID,"9000");
207
208 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
209
210 var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
211 Profile_load_procedure.ICCID = ICCID_OP_PROF1;
212 Profile_load_procedure.ES10b_GetEUICCInfo1();
213
214 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
215 Profile_load_procedure.ES10b_GetEUICCChallenge();
216
217 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
218 Profile_load_procedure.ES10b_AuthenticateServer();
219
220 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest;");
221 Profile_load_procedure.ES10b_PrepareDownload();
222
223 curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
224 TS_SELECT("Select ISD",ISD_R_AID,"9000");
225
226 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
227
228 Profile_load_procedure.ICCID = ICCID_OP_PROF1;
229 Profile_load_procedure.ES10b_GetEUICCInfo1();
230
231 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
232 Profile_load_procedure.ES10b_GetEUICCChallenge();
233
234 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,前面没有安全认证;");
235 Profile_load_procedure.transactionId = curStrHandle.RandHexStr(16);
236 Profile_load_procedure.PrepareDownloadisErrorTest = true;
237 Profile_load_procedure.preparedownloadErrorCode = DownloadErrorCode.noSessionContext;
238 Profile_load_procedure.ES10b_PrepareDownload();
239
240 RecoverCard();
241
242}
243
244function TC_eUICC_ES10b_PrepareDownloadErrorCases_07_Error_Unsupported_curve()
245{
246 if(!Card_Have_ECC_Cert)
247 return;
248
249 tracenamestr = "执行PrepareDownload,使用不支持的曲线";
250 curDis.TraceStart(sno++,tracenamestr);
251
252 curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
253 Ini_powerOn_eUICC_LPAe_not_activate();
254
255 curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
256 TS_MANAGE_CHANNEL_OPEN();
257
258 curLogicChannel = 1;
259
260 curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
261 TS_SELECT("Select ISD",ISD_R_AID,"9000");
262
263 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
264
265 var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
266 Profile_load_procedure.ICCID = ICCID_OP_PROF1;
267
268 pkId_CI_ForVerification = pkId_CI_ECDSA_NIST;
269 pkId_CI_ForSigning = pkId_CI_ECDSA_NIST;
270
271 Profile_load_procedure.ES10b_GetEUICCInfo1();
272
273 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
274 Profile_load_procedure.ES10b_GetEUICCChallenge();
275
276 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
277 Profile_load_procedure.ES10b_AuthenticateServer();
278
279 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,证书使用不支持的曲线算法;");
280 Profile_load_procedure.DPbpInforObj.Cert = CERT_S_SM_DPpb_INV_CURVE_NIST192;
281 Profile_load_procedure.PrepareDownloadisErrorTest = true;
282 Profile_load_procedure.preparedownloadErrorCode = DownloadErrorCode.unsupportedCurve;
283 Profile_load_procedure.ES10b_PrepareDownload();
284
285 RecoverCard();
286
287}
288
289function TC_eUICC_ES10b_PrepareDownloadErrorCases_08_Error_Invalid_Certificate_Role_OID()
290{
291 tracenamestr = "执行PrepareDownload,使用无效的证书Role OID";
292 curDis.TraceStart(sno++,tracenamestr);
293
294 curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
295 Ini_powerOn_eUICC_LPAe_not_activate();
296
297 curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
298 TS_MANAGE_CHANNEL_OPEN();
299
300 curLogicChannel = 1;
301
302 curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
303 TS_SELECT("Select ISD",ISD_R_AID,"9000");
304
305 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
306
307 var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
308 Profile_load_procedure.ICCID = ICCID_OP_PROF1;
309 Profile_load_procedure.ES10b_GetEUICCInfo1();
310
311 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
312 Profile_load_procedure.ES10b_GetEUICCChallenge();
313
314 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
315 Profile_load_procedure.ES10b_AuthenticateServer();
316
317 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,证书使用无效的Certificate Role OID;");
318 Profile_load_procedure.DPbpInforObj.Cert = CERT_S_SM_DPauth_ECDSA_NIST;
319 Profile_load_procedure.PrepareDownloadisErrorTest = true;
320 Profile_load_procedure.preparedownloadErrorCode = DownloadErrorCode.invalidCertificate;
321 Profile_load_procedure.ES10b_PrepareDownload();
322
323 RecoverCard();
324}
325
-cas 盲生成TC_eUICC_ES10b_PrepareDownloadErrorCases/Import/TC_eUICC_ES10b_PrepareDownloadErrorCases.js762 行 / 76894 字符 / gb18030入口函数 @L16
1// Author: 卡思Cas智能体
2// Date: 20261005-152741
3// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10b.PrepareDownloadErrorCases,Test Sequence #01-#08 Error (all 8 sequences),适用性 M。
4// Test points: ICH-SEQ06-IC1-K1-C1 ATR_present;ICH-SEQ06-IC1-K2-C2 FCP_Template
5// ICH-SEQ06-IC1-K2-C4 SW;ICH-SEQ06-IC1-K3-C4 SW;ICH-SEQ06-IC1-K4-C4 final SW
6// ICH-SEQ06-IC2-K1-C4 SW;ICH-SEQ06-IC2-K1-C3 CHANNEL_NUMBER extracted;ICH-SEQ06-IC2-K2-C4 SW
7// S1-C2 R_PREP_DOWNLOAD response structure;S2-C1 SW;S2-C2 R_PREP_DOWNLOAD response structure
8// S3-C1 SW;S3-C2 R_PREP_DOWNLOAD response structure;S4-C1 SW
9// S4-C2 R_PREP_DOWNLOAD response structure;S5-C1 SW;S5-C2 R_PREP_DOWNLOAD response structure
10// S6-C1 SW;S6-C2 R_EUICC_INFO1 outer tag;S6-C2 R_EUICC_INFO1 required members present;S7-C1 SW
11// S7-C2 R_PREP_DOWNLOAD response structure;S8-C1 SW;S8-C2 R_PREP_DOWNLOAD response structure
12// S9-C1 SW;S9-C2 R_PREP_DOWNLOAD response structure
13// 本函数由 CaseIR 4.2.10.2.4 编译生成(fullwave-blindgen-live-70-W1-laneA2,SGP.23 v1.16 × SGP.22 v2.7):字节权威=CaseIR,非誊录黄金脚本。
14// Value-free template: every data byte is injected from CaseIR fields; no scaffold globals (see docs/speconly/compile-symbol-migration.md).
15// 适用性 M:编译期门,运行时由 harness 环境前置承担。
16function TC_eUICC_ES10b_PrepareDownloadErrorCases_01_08_Error_all_8_sequences() {
17 var bind = curBind;
18 // TC-GEN-1 eUICC: The PROFILE_OPERATIONAL1 is not loaded on the eUICC.: declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
19 // TC-GEN-2 eUICC: S_Device 与 eUICC 通信已初始化,S_LPAd 已选 ISD-R;eUICC 与 S_SM-DP+ 已成功执行 Common Mutual Authentication;#GET_EUICC_INFO1、#GET_EUICC_CHALLENGE、#AUTHENTICATE_SMDP 已发送;签名与验证选用同一 GSMA CI。: declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
20 // SEQ01-IC1 <S_HASHED_CC> = MTD_GENERATE_HASHED_CC(#CONFIRMATION_CODE1, <S_TRANSACTION_ID>)(测试工具侧计算,H_annexC1_methods 表1228): declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
21 // SEQ06-IC-T1 eUICC: No Common Mutual Authentication procedure has been executed between the eUICC and the S_SM-DP+(覆盖本 TC 最后一条 general initial condition): declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
22
23 // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 1):RESET(K 语料机械展开)
24 var s10 = bind.resetAndAtr();
25 bind.checkData("ICH-SEQ06-IC1-K1-C1 ATR_present", "1", s10.atr_hex !== "" ? "1" : "0");
26
27 // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 2):SELECT_MF(K 语料机械展开)
28 // FCP outer tag not materialized from clause: tag-face asserted only when corpus fixes the tag byte (e.g. TS 102 221 FCP '62').
29 var s11 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
30 bind.checkData("ICH-SEQ06-IC1-K2-C2 FCP_Template", "1", s11.resp.length > 0 ? "1" : "0");
31 bind.checkData("ICH-SEQ06-IC1-K2-C4 SW", "9000", s11.sw);
32
33 // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 3):TERMINAL_CAPABILITY_LPAd(K 语料机械展开)
34 var s12 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
35 bind.checkData("ICH-SEQ06-IC1-K3-C4 SW", "9000", s12.sw);
36
37 // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 4):TERMINAL_PROFILE(K 语料机械展开)
38 var steady13 = bind.runToSteadyState(function () {
39 return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
40 });
41 bind.checkData("ICH-SEQ06-IC1-K4-C4 final SW", "9000", steady13.final.sw);
42
43 // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 1):MANAGE_CHANNEL_OPEN(K 语料机械展开)
44 // CHANNEL_NUMBER extraction and dynamic CLA rebinding are CasBind internal state (chaining rule; no generated-code re-implementation).
45 var s14 = bind.manageChannelOpen("9000");
46 bind.checkData("ICH-SEQ06-IC2-K1-C4 SW", "9000", s14.sw);
47 bind.checkData("ICH-SEQ06-IC2-K1-C3 CHANNEL_NUMBER extracted", "1", s14.chan !== null ? "1" : "0");
48
49 // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 2):MTD_SELECT(K 语料机械展开)
50 // CLA = bound channel (cla_rule) and <L> length binding are CasBind internal state (chaining rule; no generated-code re-implementation).
51 var s15 = bind.sendApdu(null, "A4", "04", "00", "A0000005591010FFFFFFFF8900000100", null, "9000");
52 // MTD_SELECT expected face is SW-only (K Annex C.2 open-channel procedure step 2: no FCI content assertion in corpus); no fabricated template parse.
53 bind.checkData("ICH-SEQ06-IC2-K2-C4 SW", "9000", s15.sw);
54
55 // 步骤 1:SEQ01-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_135, RQ31_136, RQ57_031, RQ57_036, RQ57_037, RQ57_038)
56 // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_INVALID_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
57 // 无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
58 // 错误注入变体(I_annexD3_es10x):cert=SGP.26 v1.5 变体物料声明面(input/PREP_DOWNLOAD_VARIANT_MATERIALS.json,sha256 锚编译期已核);ccRequiredFlag/签名形态按变体闭集定义。
59 var pd1Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
60 var pd1Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
61 var pd1Tid = "";
62 for (var pd1Ri = 0; pd1Ri < 16; pd1Ri++) {
63 pd1Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
64 }
65 var pd1Sel = 0;
66 var pd1Sig1 = "";
67 var pd1Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
68 if (pd1Sel < 0 || pd1Sig1 === "") {
69 // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
70 bind.checkData("S1-C2 R_PREP_DOWNLOAD response structure", "1", "pd1_not_executed:cma_operands_absent");
71 } else {
72 bind.engine.InitEccDomainParams(pd1Dps[pd1Sel][0], pd1Dps[pd1Sel][1], pd1Dps[pd1Sel][2], pd1Dps[pd1Sel][3], pd1Dps[pd1Sel][4], 1);
73 var pd1S2 = BindEs10xSingleRequest.buildTlv("30",
74 BindEs10xSingleRequest.buildTlv("80", pd1Tid)
75 + BindEs10xSingleRequest.buildTlv("01", "FF"));
76 var pd1Sgn = "";
77 while (pd1Sgn.length != 2 * pd1Sks[pd1Sel].length) {
78 bind.engine.SleepTime(2000);
79 pd1Sgn = bind.engine.EccSignData(pd1Sks[pd1Sel], pd1S2 + BindEs10xSingleRequest.buildTlv("5F37", pd1Sig1), 33);
80 }
81 var pd1Req = BindEs10xSingleRequest.buildTlv("BF21",
82 pd1S2
83 + BindEs10xSingleRequest.buildTlv("5F37", pd1Sgn)
84 + BindEs10xSingleRequest.buildTlv("30", pd1Certs[pd1Sel]));
85 var pd1Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
86 {cla: "", ins: "E2", p1: "91", p2: "00", data: pd1Req,
87 le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
88 var pd1Sw = (pd1Run.final && pd1Run.final.sw) ? pd1Run.final.sw : "transport_error";
89 // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
90 var pd1Otpk = "";
91 if (pd1Run.final && pd1Run.final.resp) {
92 var pd1L1 = BindEs10xSingleRequest.parseBerTlv(pd1Run.final.resp);
93 for (var pd1I1 = 0; pd1I1 < pd1L1.length && pd1Otpk === ""; pd1I1++) {
94 if (pd1L1[pd1I1].tag !== "BF21") continue;
95 var pd1L2 = BindEs10xSingleRequest.parseBerTlv(pd1L1[pd1I1].value);
96 for (var pd1I2 = 0; pd1I2 < pd1L2.length && pd1Otpk === ""; pd1I2++) {
97 if (pd1L2[pd1I2].tag !== "A0") continue;
98 var pd1L3 = BindEs10xSingleRequest.parseBerTlv(pd1L2[pd1I2].value);
99 for (var pd1I3 = 0; pd1I3 < pd1L3.length && pd1Otpk === ""; pd1I3++) {
100 if (pd1L3[pd1I3].tag !== "30") continue;
101 var pd1L4 = BindEs10xSingleRequest.parseBerTlv(pd1L3[pd1I3].value);
102 for (var pd1I4 = 0; pd1I4 < pd1L4.length; pd1I4++) {
103 if (pd1L4[pd1I4].tag === "5F49") pd1Otpk = pd1L4[pd1I4].value;
104 }
105 }
106 }
107 }
108 }
109 }
110 // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseError A1{transactionId 80, downloadErrorCode 02}):运行时域,仅结构与在场性断言。
111 var pd1RSR = (pd1Run.final && pd1Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd1Run.final.resp) : [];
112 var pd1RSOuter = pd1RSR.length === 1 ? pd1RSR[0].tag : "absent";
113 var pd1RSBr = pd1RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd1RSR[0].value) : [];
114 var pd1RSA0 = false, pd1RSA1 = false, pd1RSCk = [];
115 for (var pd1RSi = 0; pd1RSi < pd1RSBr.length; pd1RSi++) {
116 if (pd1RSBr[pd1RSi].tag === "A0") { pd1RSA0 = true; pd1RSCk = BindEs10xSingleRequest.parseBerTlv(pd1RSBr[pd1RSi].value); }
117 if (pd1RSBr[pd1RSi].tag === "A1") { pd1RSA1 = true; pd1RSCk = BindEs10xSingleRequest.parseBerTlv(pd1RSBr[pd1RSi].value); }
118 }
119 var pd1RS30 = false, pd1RS5F37 = false, pd1RS80 = false, pd1RS02 = false;
120 for (var pd1RSj = 0; pd1RSj < pd1RSCk.length; pd1RSj++) {
121 if (pd1RSCk[pd1RSj].tag === "30") pd1RS30 = true;
122 if (pd1RSCk[pd1RSj].tag === "5F37") pd1RS5F37 = true;
123 if (pd1RSCk[pd1RSj].tag === "80") pd1RS80 = true;
124 if (pd1RSCk[pd1RSj].tag === "02") pd1RS02 = true;
125 }
126 var pd1RS5F49 = false;
127 if (pd1RS30) {
128 for (var pd1RSk = 0; pd1RSk < pd1RSCk.length; pd1RSk++) {
129 if (pd1RSCk[pd1RSk].tag !== "30") continue;
130 var pd1RSU = BindEs10xSingleRequest.parseBerTlv(pd1RSCk[pd1RSk].value);
131 for (var pd1RSm = 0; pd1RSm < pd1RSU.length; pd1RSm++) {
132 if (pd1RSU[pd1RSm].tag === "5F49") pd1RS5F49 = true;
133 if (pd1RSU[pd1RSm].tag === "80") pd1RS80 = true;
134 }
135 }
136 }
137 bind.checkData("S1-C2 R_PREP_DOWNLOAD response structure" + " (downloadResponseError or no data)", "1", (pd1RSOuter === "absent" || (pd1RSA1 && pd1RS80 && pd1RS02)) ? "1" : "0");
138 // S1-C1: binding:prep_download_variant_error_status_disjunctive(error-swp|downloadResponseError;I_annexD3) (check_attestation)
139 // S1-C3: binding:prep_download_variant_error_no_response(ANY_SW_IN_ERROR;G-annexB) (check_attestation)
140
141 // 步骤 2:SEQ02-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_136, RQ57_027, RQ57_030, RQ57_031, RQ57_036, RQ57_037, RQ57_038, RQ45_006, RQ45_026_1, RQ45_026, RQ45_028)
142 // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_INV_CERT;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
143 // 无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
144 // 错误注入变体(I_annexD3_es10x):cert=SGP.26 v1.5 变体物料声明面(input/PREP_DOWNLOAD_VARIANT_MATERIALS.json,sha256 锚编译期已核);ccRequiredFlag/签名形态按变体闭集定义。
145 var pd2Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF71200A256211089EF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E48108310518721223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
146 var pd2Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
147 var pd2Tid = "";
148 for (var pd2Ri = 0; pd2Ri < 16; pd2Ri++) {
149 pd2Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
150 }
151 var pd2Sel = 0;
152 var pd2Sig1 = "";
153 var pd2Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
154 if (pd2Sel < 0 || pd2Sig1 === "") {
155 // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
156 bind.checkData("S2-C1 SW", "9000", "pd2_not_executed:cma_operands_absent");
157 bind.checkData("S2-C2 R_PREP_DOWNLOAD response structure", "1", "pd2_not_executed:cma_operands_absent");
158 } else {
159 bind.engine.InitEccDomainParams(pd2Dps[pd2Sel][0], pd2Dps[pd2Sel][1], pd2Dps[pd2Sel][2], pd2Dps[pd2Sel][3], pd2Dps[pd2Sel][4], 1);
160 var pd2S2 = BindEs10xSingleRequest.buildTlv("30",
161 BindEs10xSingleRequest.buildTlv("80", pd2Tid)
162 + BindEs10xSingleRequest.buildTlv("01", "00"));
163 var pd2Sgn = "";
164 while (pd2Sgn.length != 2 * pd2Sks[pd2Sel].length) {
165 bind.engine.SleepTime(2000);
166 pd2Sgn = bind.engine.EccSignData(pd2Sks[pd2Sel], pd2S2 + BindEs10xSingleRequest.buildTlv("5F37", pd2Sig1), 33);
167 }
168 var pd2Req = BindEs10xSingleRequest.buildTlv("BF21",
169 pd2S2
170 + BindEs10xSingleRequest.buildTlv("5F37", pd2Sgn)
171 + BindEs10xSingleRequest.buildTlv("30", pd2Certs[pd2Sel]));
172 var pd2Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
173 {cla: "", ins: "E2", p1: "91", p2: "00", data: pd2Req,
174 le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
175 var pd2Sw = (pd2Run.final && pd2Run.final.sw) ? pd2Run.final.sw : "transport_error";
176 bind.checkData("S2-C1 SW", "9000", pd2Sw);
177 // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
178 var pd2Otpk = "";
179 if (pd2Run.final && pd2Run.final.resp) {
180 var pd2L1 = BindEs10xSingleRequest.parseBerTlv(pd2Run.final.resp);
181 for (var pd2I1 = 0; pd2I1 < pd2L1.length && pd2Otpk === ""; pd2I1++) {
182 if (pd2L1[pd2I1].tag !== "BF21") continue;
183 var pd2L2 = BindEs10xSingleRequest.parseBerTlv(pd2L1[pd2I1].value);
184 for (var pd2I2 = 0; pd2I2 < pd2L2.length && pd2Otpk === ""; pd2I2++) {
185 if (pd2L2[pd2I2].tag !== "A0") continue;
186 var pd2L3 = BindEs10xSingleRequest.parseBerTlv(pd2L2[pd2I2].value);
187 for (var pd2I3 = 0; pd2I3 < pd2L3.length && pd2Otpk === ""; pd2I3++) {
188 if (pd2L3[pd2I3].tag !== "30") continue;
189 var pd2L4 = BindEs10xSingleRequest.parseBerTlv(pd2L3[pd2I3].value);
190 for (var pd2I4 = 0; pd2I4 < pd2L4.length; pd2I4++) {
191 if (pd2L4[pd2I4].tag === "5F49") pd2Otpk = pd2L4[pd2I4].value;
192 }
193 }
194 }
195 }
196 }
197 }
198 // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseError A1{transactionId 80, downloadErrorCode 02}):运行时域,仅结构与在场性断言。
199 var pd2RSR = (pd2Run.final && pd2Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd2Run.final.resp) : [];
200 var pd2RSOuter = pd2RSR.length === 1 ? pd2RSR[0].tag : "absent";
201 var pd2RSBr = pd2RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd2RSR[0].value) : [];
202 var pd2RSA0 = false, pd2RSA1 = false, pd2RSCk = [];
203 for (var pd2RSi = 0; pd2RSi < pd2RSBr.length; pd2RSi++) {
204 if (pd2RSBr[pd2RSi].tag === "A0") { pd2RSA0 = true; pd2RSCk = BindEs10xSingleRequest.parseBerTlv(pd2RSBr[pd2RSi].value); }
205 if (pd2RSBr[pd2RSi].tag === "A1") { pd2RSA1 = true; pd2RSCk = BindEs10xSingleRequest.parseBerTlv(pd2RSBr[pd2RSi].value); }
206 }
207 var pd2RS30 = false, pd2RS5F37 = false, pd2RS80 = false, pd2RS02 = false;
208 for (var pd2RSj = 0; pd2RSj < pd2RSCk.length; pd2RSj++) {
209 if (pd2RSCk[pd2RSj].tag === "30") pd2RS30 = true;
210 if (pd2RSCk[pd2RSj].tag === "5F37") pd2RS5F37 = true;
211 if (pd2RSCk[pd2RSj].tag === "80") pd2RS80 = true;
212 if (pd2RSCk[pd2RSj].tag === "02") pd2RS02 = true;
213 }
214 var pd2RS5F49 = false;
215 if (pd2RS30) {
216 for (var pd2RSk = 0; pd2RSk < pd2RSCk.length; pd2RSk++) {
217 if (pd2RSCk[pd2RSk].tag !== "30") continue;
218 var pd2RSU = BindEs10xSingleRequest.parseBerTlv(pd2RSCk[pd2RSk].value);
219 for (var pd2RSm = 0; pd2RSm < pd2RSU.length; pd2RSm++) {
220 if (pd2RSU[pd2RSm].tag === "5F49") pd2RS5F49 = true;
221 if (pd2RSU[pd2RSm].tag === "80") pd2RS80 = true;
222 }
223 }
224 }
225 bind.checkData("S2-C2 R_PREP_DOWNLOAD response structure" + " (downloadResponseError or no data)", "1", (pd2RSOuter === "absent" || (pd2RSA1 && pd2RS80 && pd2RS02)) ? "1" : "0");
226 // S2-C3: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
227
228 // 步骤 3:SEQ03-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_132, RQ31_136, RQ57_029, RQ57_031, RQ57_036, RQ57_037, RQ57_038, RQ45_006, RQ45_026_1, RQ45_026, RQ45_028)
229 // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_CERT_SMDP2;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
230 // 无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
231 // 错误注入变体(I_annexD3_es10x):cert=SGP.26 v1.5 变体物料声明面(input/PREP_DOWNLOAD_VARIANT_MATERIALS.json,sha256 锚编译期已核);ccRequiredFlag/签名形态按变体闭集定义。
232 var pd3Certs = ["308201E0A00302010202020201300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3026310D300B060355040A0C0441434D453115301306035504030C0C5445535420534D2D44502B323059301306072A8648CE3D020106082A8648CE3D030107034200043E2D75A106221216C2AEE8FAD584F779633CF944681B5EC75A96653F5F401C476AE39D546C032D32D0070A7B86E5DCEBAADDF31CA5C2766C196BD79BC21A0180A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E0416041420A3A830E92EE7A468C5EB27BA8DF18459ADFDD7300E0603551D1104073005880388370C300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020349003046022100AD7F267F31F934CEE3E29E09F6582603D296D2F5224B0A1AB988C9870393E3190221008F7E51EEE673DF06D10A5350B94C00B702FF96DC960D317967E61877FF5123DB", "308201E1A00302010202020201300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3026310D300B060355040A0C0441434D453115301306035504030C0C5445535420534D2D44502B32305A301406072A8648CE3D020106092B2403030208010107034200047361855E590264B252C71A6062A021E27B46F760B8138206A7F74420EF8BC55A8B988D1658F9D70D3A2D8480AADF64E62C4D7127DE5A0A2B917A943F4474AADDA381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041431038A55B6BECF6CEA59DE2FDA14F4327FB8B6A9300E0603551D1104073005880388370C300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402203C7BF047D9D62485CFB4C6DB9955C45CFAD4DECECF3B9028A84DEF7A21E63EB002206046EC8B7F016738A6C0977BF226628EB4EBCBC3183AD1ECC9C82C3B35490B4E"];
233 var pd3Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
234 var pd3Tid = "";
235 for (var pd3Ri = 0; pd3Ri < 16; pd3Ri++) {
236 pd3Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
237 }
238 var pd3Sel = 0;
239 var pd3Sig1 = "";
240 var pd3Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
241 if (pd3Sel < 0 || pd3Sig1 === "") {
242 // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
243 bind.checkData("S3-C1 SW", "9000", "pd3_not_executed:cma_operands_absent");
244 bind.checkData("S3-C2 R_PREP_DOWNLOAD response structure", "1", "pd3_not_executed:cma_operands_absent");
245 } else {
246 bind.engine.InitEccDomainParams(pd3Dps[pd3Sel][0], pd3Dps[pd3Sel][1], pd3Dps[pd3Sel][2], pd3Dps[pd3Sel][3], pd3Dps[pd3Sel][4], 1);
247 var pd3S2 = BindEs10xSingleRequest.buildTlv("30",
248 BindEs10xSingleRequest.buildTlv("80", pd3Tid)
249 + BindEs10xSingleRequest.buildTlv("01", "00"));
250 var pd3Sgn = "";
251 while (pd3Sgn.length != 2 * pd3Sks[pd3Sel].length) {
252 bind.engine.SleepTime(2000);
253 pd3Sgn = bind.engine.EccSignData(pd3Sks[pd3Sel], pd3S2 + BindEs10xSingleRequest.buildTlv("5F37", pd3Sig1), 33);
254 }
255 var pd3Req = BindEs10xSingleRequest.buildTlv("BF21",
256 pd3S2
257 + BindEs10xSingleRequest.buildTlv("5F37", pd3Sgn)
258 + BindEs10xSingleRequest.buildTlv("30", pd3Certs[pd3Sel]));
259 var pd3Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
260 {cla: "", ins: "E2", p1: "91", p2: "00", data: pd3Req,
261 le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
262 var pd3Sw = (pd3Run.final && pd3Run.final.sw) ? pd3Run.final.sw : "transport_error";
263 bind.checkData("S3-C1 SW", "9000", pd3Sw);
264 // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
265 var pd3Otpk = "";
266 if (pd3Run.final && pd3Run.final.resp) {
267 var pd3L1 = BindEs10xSingleRequest.parseBerTlv(pd3Run.final.resp);
268 for (var pd3I1 = 0; pd3I1 < pd3L1.length && pd3Otpk === ""; pd3I1++) {
269 if (pd3L1[pd3I1].tag !== "BF21") continue;
270 var pd3L2 = BindEs10xSingleRequest.parseBerTlv(pd3L1[pd3I1].value);
271 for (var pd3I2 = 0; pd3I2 < pd3L2.length && pd3Otpk === ""; pd3I2++) {
272 if (pd3L2[pd3I2].tag !== "A0") continue;
273 var pd3L3 = BindEs10xSingleRequest.parseBerTlv(pd3L2[pd3I2].value);
274 for (var pd3I3 = 0; pd3I3 < pd3L3.length && pd3Otpk === ""; pd3I3++) {
275 if (pd3L3[pd3I3].tag !== "30") continue;
276 var pd3L4 = BindEs10xSingleRequest.parseBerTlv(pd3L3[pd3I3].value);
277 for (var pd3I4 = 0; pd3I4 < pd3L4.length; pd3I4++) {
278 if (pd3L4[pd3I4].tag === "5F49") pd3Otpk = pd3L4[pd3I4].value;
279 }
280 }
281 }
282 }
283 }
284 }
285 // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseError A1{transactionId 80, downloadErrorCode 02}):运行时域,仅结构与在场性断言。
286 var pd3RSR = (pd3Run.final && pd3Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd3Run.final.resp) : [];
287 var pd3RSOuter = pd3RSR.length === 1 ? pd3RSR[0].tag : "absent";
288 var pd3RSBr = pd3RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd3RSR[0].value) : [];
289 var pd3RSA0 = false, pd3RSA1 = false, pd3RSCk = [];
290 for (var pd3RSi = 0; pd3RSi < pd3RSBr.length; pd3RSi++) {
291 if (pd3RSBr[pd3RSi].tag === "A0") { pd3RSA0 = true; pd3RSCk = BindEs10xSingleRequest.parseBerTlv(pd3RSBr[pd3RSi].value); }
292 if (pd3RSBr[pd3RSi].tag === "A1") { pd3RSA1 = true; pd3RSCk = BindEs10xSingleRequest.parseBerTlv(pd3RSBr[pd3RSi].value); }
293 }
294 var pd3RS30 = false, pd3RS5F37 = false, pd3RS80 = false, pd3RS02 = false;
295 for (var pd3RSj = 0; pd3RSj < pd3RSCk.length; pd3RSj++) {
296 if (pd3RSCk[pd3RSj].tag === "30") pd3RS30 = true;
297 if (pd3RSCk[pd3RSj].tag === "5F37") pd3RS5F37 = true;
298 if (pd3RSCk[pd3RSj].tag === "80") pd3RS80 = true;
299 if (pd3RSCk[pd3RSj].tag === "02") pd3RS02 = true;
300 }
301 var pd3RS5F49 = false;
302 if (pd3RS30) {
303 for (var pd3RSk = 0; pd3RSk < pd3RSCk.length; pd3RSk++) {
304 if (pd3RSCk[pd3RSk].tag !== "30") continue;
305 var pd3RSU = BindEs10xSingleRequest.parseBerTlv(pd3RSCk[pd3RSk].value);
306 for (var pd3RSm = 0; pd3RSm < pd3RSU.length; pd3RSm++) {
307 if (pd3RSU[pd3RSm].tag === "5F49") pd3RS5F49 = true;
308 if (pd3RSU[pd3RSm].tag === "80") pd3RS80 = true;
309 }
310 }
311 }
312 bind.checkData("S3-C2 R_PREP_DOWNLOAD response structure" + " (downloadResponseError or no data)", "1", (pd3RSOuter === "absent" || (pd3RSA1 && pd3RS80 && pd3RS02)) ? "1" : "0");
313 // S3-C3: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
314
315 // 步骤 4:SEQ04-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_133, RQ31_136, RQ57_028, RQ57_031, RQ57_036, RQ57_038, RQ45_006, RQ45_026_1, RQ45_026, RQ45_028)
316 // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_INV_SIGN;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
317 // 无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
318 // 错误注入变体(I_annexD3_es10x):cert=SGP.26 v1.5 变体物料声明面(input/PREP_DOWNLOAD_VARIANT_MATERIALS.json,sha256 锚编译期已核);ccRequiredFlag/签名形态按变体闭集定义。
319 var pd4Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
320 var pd4Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
321 var pd4Tid = "";
322 for (var pd4Ri = 0; pd4Ri < 16; pd4Ri++) {
323 pd4Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
324 }
325 var pd4Sel = 0;
326 var pd4Sig1 = "";
327 var pd4Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
328 if (pd4Sel < 0 || pd4Sig1 === "") {
329 // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
330 bind.checkData("S4-C1 SW", "9000", "pd4_not_executed:cma_operands_absent");
331 bind.checkData("S4-C2 R_PREP_DOWNLOAD response structure", "1", "pd4_not_executed:cma_operands_absent");
332 } else {
333 bind.engine.InitEccDomainParams(pd4Dps[pd4Sel][0], pd4Dps[pd4Sel][1], pd4Dps[pd4Sel][2], pd4Dps[pd4Sel][3], pd4Dps[pd4Sel][4], 1);
334 var pd4S2 = BindEs10xSingleRequest.buildTlv("30",
335 BindEs10xSingleRequest.buildTlv("80", pd4Tid)
336 + BindEs10xSingleRequest.buildTlv("01", "00"));
337 var pd4Sgn = "";
338 while (pd4Sgn.length != 2 * pd4Sks[pd4Sel].length) {
339 bind.engine.SleepTime(2000);
340 pd4Sgn = bind.engine.EccSignData(pd4Sks[pd4Sel], pd4S2 + BindEs10xSingleRequest.buildTlv("5F37", pd4Sig1), 33);
341 }
342 var pd4Req = BindEs10xSingleRequest.buildTlv("BF21",
343 pd4S2
344 + BindEs10xSingleRequest.buildTlv("5F37", pd4Sgn)
345 + BindEs10xSingleRequest.buildTlv("30", pd4Certs[pd4Sel]));
346 var pd4Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
347 {cla: "", ins: "E2", p1: "91", p2: "00", data: pd4Req,
348 le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
349 var pd4Sw = (pd4Run.final && pd4Run.final.sw) ? pd4Run.final.sw : "transport_error";
350 bind.checkData("S4-C1 SW", "9000", pd4Sw);
351 // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
352 var pd4Otpk = "";
353 if (pd4Run.final && pd4Run.final.resp) {
354 var pd4L1 = BindEs10xSingleRequest.parseBerTlv(pd4Run.final.resp);
355 for (var pd4I1 = 0; pd4I1 < pd4L1.length && pd4Otpk === ""; pd4I1++) {
356 if (pd4L1[pd4I1].tag !== "BF21") continue;
357 var pd4L2 = BindEs10xSingleRequest.parseBerTlv(pd4L1[pd4I1].value);
358 for (var pd4I2 = 0; pd4I2 < pd4L2.length && pd4Otpk === ""; pd4I2++) {
359 if (pd4L2[pd4I2].tag !== "A0") continue;
360 var pd4L3 = BindEs10xSingleRequest.parseBerTlv(pd4L2[pd4I2].value);
361 for (var pd4I3 = 0; pd4I3 < pd4L3.length && pd4Otpk === ""; pd4I3++) {
362 if (pd4L3[pd4I3].tag !== "30") continue;
363 var pd4L4 = BindEs10xSingleRequest.parseBerTlv(pd4L3[pd4I3].value);
364 for (var pd4I4 = 0; pd4I4 < pd4L4.length; pd4I4++) {
365 if (pd4L4[pd4I4].tag === "5F49") pd4Otpk = pd4L4[pd4I4].value;
366 }
367 }
368 }
369 }
370 }
371 }
372 // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseError A1{transactionId 80, downloadErrorCode 02}):运行时域,仅结构与在场性断言。
373 var pd4RSR = (pd4Run.final && pd4Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd4Run.final.resp) : [];
374 var pd4RSOuter = pd4RSR.length === 1 ? pd4RSR[0].tag : "absent";
375 var pd4RSBr = pd4RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd4RSR[0].value) : [];
376 var pd4RSA0 = false, pd4RSA1 = false, pd4RSCk = [];
377 for (var pd4RSi = 0; pd4RSi < pd4RSBr.length; pd4RSi++) {
378 if (pd4RSBr[pd4RSi].tag === "A0") { pd4RSA0 = true; pd4RSCk = BindEs10xSingleRequest.parseBerTlv(pd4RSBr[pd4RSi].value); }
379 if (pd4RSBr[pd4RSi].tag === "A1") { pd4RSA1 = true; pd4RSCk = BindEs10xSingleRequest.parseBerTlv(pd4RSBr[pd4RSi].value); }
380 }
381 var pd4RS30 = false, pd4RS5F37 = false, pd4RS80 = false, pd4RS02 = false;
382 for (var pd4RSj = 0; pd4RSj < pd4RSCk.length; pd4RSj++) {
383 if (pd4RSCk[pd4RSj].tag === "30") pd4RS30 = true;
384 if (pd4RSCk[pd4RSj].tag === "5F37") pd4RS5F37 = true;
385 if (pd4RSCk[pd4RSj].tag === "80") pd4RS80 = true;
386 if (pd4RSCk[pd4RSj].tag === "02") pd4RS02 = true;
387 }
388 var pd4RS5F49 = false;
389 if (pd4RS30) {
390 for (var pd4RSk = 0; pd4RSk < pd4RSCk.length; pd4RSk++) {
391 if (pd4RSCk[pd4RSk].tag !== "30") continue;
392 var pd4RSU = BindEs10xSingleRequest.parseBerTlv(pd4RSCk[pd4RSk].value);
393 for (var pd4RSm = 0; pd4RSm < pd4RSU.length; pd4RSm++) {
394 if (pd4RSU[pd4RSm].tag === "5F49") pd4RS5F49 = true;
395 if (pd4RSU[pd4RSm].tag === "80") pd4RS80 = true;
396 }
397 }
398 }
399 bind.checkData("S4-C2 R_PREP_DOWNLOAD response structure" + " (downloadResponseError or no data)", "1", (pd4RSOuter === "absent" || (pd4RSA1 && pd4RS80 && pd4RS02)) ? "1" : "0");
400 // S4-C3: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
401
402 // 步骤 5:SEQ05-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_134, RQ31_136, RQ57_025, RQ57_031, RQ57_036, RQ57_037, RQ57_038)
403 // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_INV_TRANS_ID;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
404 // 无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
405 // 错误注入变体(I_annexD3_es10x):cert=SGP.26 v1.5 变体物料声明面(input/PREP_DOWNLOAD_VARIANT_MATERIALS.json,sha256 锚编译期已核);ccRequiredFlag/签名形态按变体闭集定义。
406 var pd5Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
407 var pd5Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
408 var pd5Tid = "";
409 for (var pd5Ri = 0; pd5Ri < 16; pd5Ri++) {
410 pd5Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
411 }
412 var pd5Sel = 0;
413 var pd5Sig1 = "";
414 var pd5Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
415 if (pd5Sel < 0 || pd5Sig1 === "") {
416 // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
417 bind.checkData("S5-C1 SW", "9000", "pd5_not_executed:cma_operands_absent");
418 bind.checkData("S5-C2 R_PREP_DOWNLOAD response structure", "1", "pd5_not_executed:cma_operands_absent");
419 } else {
420 bind.engine.InitEccDomainParams(pd5Dps[pd5Sel][0], pd5Dps[pd5Sel][1], pd5Dps[pd5Sel][2], pd5Dps[pd5Sel][3], pd5Dps[pd5Sel][4], 1);
421 var pd5S2 = BindEs10xSingleRequest.buildTlv("30",
422 BindEs10xSingleRequest.buildTlv("80", pd5Tid)
423 + BindEs10xSingleRequest.buildTlv("01", "00"));
424 var pd5Sgn = "";
425 while (pd5Sgn.length != 2 * pd5Sks[pd5Sel].length) {
426 bind.engine.SleepTime(2000);
427 pd5Sgn = bind.engine.EccSignData(pd5Sks[pd5Sel], pd5S2 + BindEs10xSingleRequest.buildTlv("5F37", pd5Sig1), 33);
428 }
429 var pd5Req = BindEs10xSingleRequest.buildTlv("BF21",
430 pd5S2
431 + BindEs10xSingleRequest.buildTlv("5F37", pd5Sgn)
432 + BindEs10xSingleRequest.buildTlv("30", pd5Certs[pd5Sel]));
433 var pd5Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
434 {cla: "", ins: "E2", p1: "91", p2: "00", data: pd5Req,
435 le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
436 var pd5Sw = (pd5Run.final && pd5Run.final.sw) ? pd5Run.final.sw : "transport_error";
437 bind.checkData("S5-C1 SW", "9000", pd5Sw);
438 // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
439 var pd5Otpk = "";
440 if (pd5Run.final && pd5Run.final.resp) {
441 var pd5L1 = BindEs10xSingleRequest.parseBerTlv(pd5Run.final.resp);
442 for (var pd5I1 = 0; pd5I1 < pd5L1.length && pd5Otpk === ""; pd5I1++) {
443 if (pd5L1[pd5I1].tag !== "BF21") continue;
444 var pd5L2 = BindEs10xSingleRequest.parseBerTlv(pd5L1[pd5I1].value);
445 for (var pd5I2 = 0; pd5I2 < pd5L2.length && pd5Otpk === ""; pd5I2++) {
446 if (pd5L2[pd5I2].tag !== "A0") continue;
447 var pd5L3 = BindEs10xSingleRequest.parseBerTlv(pd5L2[pd5I2].value);
448 for (var pd5I3 = 0; pd5I3 < pd5L3.length && pd5Otpk === ""; pd5I3++) {
449 if (pd5L3[pd5I3].tag !== "30") continue;
450 var pd5L4 = BindEs10xSingleRequest.parseBerTlv(pd5L3[pd5I3].value);
451 for (var pd5I4 = 0; pd5I4 < pd5L4.length; pd5I4++) {
452 if (pd5L4[pd5I4].tag === "5F49") pd5Otpk = pd5L4[pd5I4].value;
453 }
454 }
455 }
456 }
457 }
458 }
459 // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseError A1{transactionId 80, downloadErrorCode 02}):运行时域,仅结构与在场性断言。
460 var pd5RSR = (pd5Run.final && pd5Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd5Run.final.resp) : [];
461 var pd5RSOuter = pd5RSR.length === 1 ? pd5RSR[0].tag : "absent";
462 var pd5RSBr = pd5RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd5RSR[0].value) : [];
463 var pd5RSA0 = false, pd5RSA1 = false, pd5RSCk = [];
464 for (var pd5RSi = 0; pd5RSi < pd5RSBr.length; pd5RSi++) {
465 if (pd5RSBr[pd5RSi].tag === "A0") { pd5RSA0 = true; pd5RSCk = BindEs10xSingleRequest.parseBerTlv(pd5RSBr[pd5RSi].value); }
466 if (pd5RSBr[pd5RSi].tag === "A1") { pd5RSA1 = true; pd5RSCk = BindEs10xSingleRequest.parseBerTlv(pd5RSBr[pd5RSi].value); }
467 }
468 var pd5RS30 = false, pd5RS5F37 = false, pd5RS80 = false, pd5RS02 = false;
469 for (var pd5RSj = 0; pd5RSj < pd5RSCk.length; pd5RSj++) {
470 if (pd5RSCk[pd5RSj].tag === "30") pd5RS30 = true;
471 if (pd5RSCk[pd5RSj].tag === "5F37") pd5RS5F37 = true;
472 if (pd5RSCk[pd5RSj].tag === "80") pd5RS80 = true;
473 if (pd5RSCk[pd5RSj].tag === "02") pd5RS02 = true;
474 }
475 var pd5RS5F49 = false;
476 if (pd5RS30) {
477 for (var pd5RSk = 0; pd5RSk < pd5RSCk.length; pd5RSk++) {
478 if (pd5RSCk[pd5RSk].tag !== "30") continue;
479 var pd5RSU = BindEs10xSingleRequest.parseBerTlv(pd5RSCk[pd5RSk].value);
480 for (var pd5RSm = 0; pd5RSm < pd5RSU.length; pd5RSm++) {
481 if (pd5RSU[pd5RSm].tag === "5F49") pd5RS5F49 = true;
482 if (pd5RSU[pd5RSm].tag === "80") pd5RS80 = true;
483 }
484 }
485 }
486 bind.checkData("S5-C2 R_PREP_DOWNLOAD response structure" + " (downloadResponseError or no data)", "1", (pd5RSOuter === "absent" || (pd5RSA1 && pd5RS80 && pd5RS02)) ? "1" : "0");
487 // S5-C3: binding:prep_download_variant_tid_any_value_accepted(INVALID_TRANSACTION_ID|NO_AUTH;I_annexD3) (check_attestation)
488
489 // 步骤 6:SEQ06-IC3] MTD_STORE_DATA(tc_step)
490 // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
491 var sdCla6 = s14.chan !== null ? (s14.chan <= 3 ? 128 + s14.chan : 188 + s14.chan).toString(16).toUpperCase() : null;
492 var s6 = bind.sendApdu(sdCla6, "E2", "91", "00", "BF2000", "00", "9000");
493 bind.checkData("S6-C1 SW", "9000", s6.sw);
494 // geca-proc ES10b Info 响应面(R_EUICC_INFO1,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
495 var gw6 = BindGecaProc.parseGecaResponse(s6.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
496 bind.checkData("S6-C2 R_EUICC_INFO1 outer tag", "BF20", gw6.outer_tag === null ? "absent" : gw6.outer_tag);
497 bind.checkData("S6-C2 R_EUICC_INFO1 required members present", "1", gw6.ok ? "1" : "0");
498 // S6-C3: kind 'requirement' pattern '' has no static generation face (corpus vacuum; see CaseIR unresolved).
499 // S6-C3: binding:prep_download_ci_cert_selection(highest-priority-CI;SGP.26) (check_attestation)
500
501 // 步骤 7:SEQ06-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_136, RQ57_031, RQ57_026, RQ57_036, RQ57_037, RQ57_038)
502 // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_NO_AUTH;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
503 // 无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
504 // 错误注入变体(I_annexD3_es10x):cert=SGP.26 v1.5 变体物料声明面(input/PREP_DOWNLOAD_VARIANT_MATERIALS.json,sha256 锚编译期已核);ccRequiredFlag/签名形态按变体闭集定义。
505 var pd7Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
506 var pd7Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
507 var pd7Tid = "";
508 for (var pd7Ri = 0; pd7Ri < 16; pd7Ri++) {
509 pd7Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
510 }
511 var pd7Sel = 0;
512 var pd7Sig1 = "";
513 var pd7Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
514 if (pd7Sel < 0 || pd7Sig1 === "") {
515 // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
516 bind.checkData("S7-C1 SW", "9000", "pd7_not_executed:cma_operands_absent");
517 bind.checkData("S7-C2 R_PREP_DOWNLOAD response structure", "1", "pd7_not_executed:cma_operands_absent");
518 } else {
519 bind.engine.InitEccDomainParams(pd7Dps[pd7Sel][0], pd7Dps[pd7Sel][1], pd7Dps[pd7Sel][2], pd7Dps[pd7Sel][3], pd7Dps[pd7Sel][4], 1);
520 var pd7S2 = BindEs10xSingleRequest.buildTlv("30",
521 BindEs10xSingleRequest.buildTlv("80", pd7Tid)
522 + BindEs10xSingleRequest.buildTlv("01", "00"));
523 var pd7Sgn = "";
524 while (pd7Sgn.length != 2 * pd7Sks[pd7Sel].length) {
525 bind.engine.SleepTime(2000);
526 pd7Sgn = bind.engine.EccSignData(pd7Sks[pd7Sel], pd7S2 + BindEs10xSingleRequest.buildTlv("5F37", pd7Sig1), 33);
527 }
528 var pd7Req = BindEs10xSingleRequest.buildTlv("BF21",
529 pd7S2
530 + BindEs10xSingleRequest.buildTlv("5F37", pd7Sgn)
531 + BindEs10xSingleRequest.buildTlv("30", pd7Certs[pd7Sel]));
532 var pd7Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
533 {cla: "", ins: "E2", p1: "91", p2: "00", data: pd7Req,
534 le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
535 var pd7Sw = (pd7Run.final && pd7Run.final.sw) ? pd7Run.final.sw : "transport_error";
536 bind.checkData("S7-C1 SW", "9000", pd7Sw);
537 // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
538 var pd7Otpk = "";
539 if (pd7Run.final && pd7Run.final.resp) {
540 var pd7L1 = BindEs10xSingleRequest.parseBerTlv(pd7Run.final.resp);
541 for (var pd7I1 = 0; pd7I1 < pd7L1.length && pd7Otpk === ""; pd7I1++) {
542 if (pd7L1[pd7I1].tag !== "BF21") continue;
543 var pd7L2 = BindEs10xSingleRequest.parseBerTlv(pd7L1[pd7I1].value);
544 for (var pd7I2 = 0; pd7I2 < pd7L2.length && pd7Otpk === ""; pd7I2++) {
545 if (pd7L2[pd7I2].tag !== "A0") continue;
546 var pd7L3 = BindEs10xSingleRequest.parseBerTlv(pd7L2[pd7I2].value);
547 for (var pd7I3 = 0; pd7I3 < pd7L3.length && pd7Otpk === ""; pd7I3++) {
548 if (pd7L3[pd7I3].tag !== "30") continue;
549 var pd7L4 = BindEs10xSingleRequest.parseBerTlv(pd7L3[pd7I3].value);
550 for (var pd7I4 = 0; pd7I4 < pd7L4.length; pd7I4++) {
551 if (pd7L4[pd7I4].tag === "5F49") pd7Otpk = pd7L4[pd7I4].value;
552 }
553 }
554 }
555 }
556 }
557 }
558 // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseError A1{transactionId 80, downloadErrorCode 02}):运行时域,仅结构与在场性断言。
559 var pd7RSR = (pd7Run.final && pd7Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd7Run.final.resp) : [];
560 var pd7RSOuter = pd7RSR.length === 1 ? pd7RSR[0].tag : "absent";
561 var pd7RSBr = pd7RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd7RSR[0].value) : [];
562 var pd7RSA0 = false, pd7RSA1 = false, pd7RSCk = [];
563 for (var pd7RSi = 0; pd7RSi < pd7RSBr.length; pd7RSi++) {
564 if (pd7RSBr[pd7RSi].tag === "A0") { pd7RSA0 = true; pd7RSCk = BindEs10xSingleRequest.parseBerTlv(pd7RSBr[pd7RSi].value); }
565 if (pd7RSBr[pd7RSi].tag === "A1") { pd7RSA1 = true; pd7RSCk = BindEs10xSingleRequest.parseBerTlv(pd7RSBr[pd7RSi].value); }
566 }
567 var pd7RS30 = false, pd7RS5F37 = false, pd7RS80 = false, pd7RS02 = false;
568 for (var pd7RSj = 0; pd7RSj < pd7RSCk.length; pd7RSj++) {
569 if (pd7RSCk[pd7RSj].tag === "30") pd7RS30 = true;
570 if (pd7RSCk[pd7RSj].tag === "5F37") pd7RS5F37 = true;
571 if (pd7RSCk[pd7RSj].tag === "80") pd7RS80 = true;
572 if (pd7RSCk[pd7RSj].tag === "02") pd7RS02 = true;
573 }
574 var pd7RS5F49 = false;
575 if (pd7RS30) {
576 for (var pd7RSk = 0; pd7RSk < pd7RSCk.length; pd7RSk++) {
577 if (pd7RSCk[pd7RSk].tag !== "30") continue;
578 var pd7RSU = BindEs10xSingleRequest.parseBerTlv(pd7RSCk[pd7RSk].value);
579 for (var pd7RSm = 0; pd7RSm < pd7RSU.length; pd7RSm++) {
580 if (pd7RSU[pd7RSm].tag === "5F49") pd7RS5F49 = true;
581 if (pd7RSU[pd7RSm].tag === "80") pd7RS80 = true;
582 }
583 }
584 }
585 bind.checkData("S7-C2 R_PREP_DOWNLOAD response structure" + " (downloadResponseError or no data)", "1", (pd7RSOuter === "absent" || (pd7RSA1 && pd7RS80 && pd7RS02)) ? "1" : "0");
586 // S7-C3: binding:prep_download_variant_tid_any_value_accepted(INVALID_TRANSACTION_ID|NO_AUTH;I_annexD3) (check_attestation)
587
588 // 步骤 8:SEQ07-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_134, RQ31_136, RQ57_025, RQ57_031, RQ57_036, RQ57_037, RQ57_038, RQ45_006, RQ45_026_1, RQ45_026, RQ45_028)
589 // PREP_DOWNLOAD 运行时绑定(PREP_DOWN_INV_CURVE;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
590 // 无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
591 // 错误注入变体(I_annexD3_es10x):cert=SGP.26 v1.5 变体物料声明面(input/PREP_DOWNLOAD_VARIANT_MATERIALS.json,sha256 锚编译期已核);ccRequiredFlag/签名形态按变体闭集定义。
592 var pd8Certs = ["308201CFA00302010202020901300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430393135323333345A170D3330303430373135323333345A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3049301306072A8648CE3D020106082A8648CE3D03010103320004B833DE8CAA3B8C34F017E2336A1702CC316FDAC57970FB74FD1112F9538358F6311CAC726280875CD0F345ECD44BD0BDA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414B549B2F12BFB70B8BE103EA56ED9D8211E62AB89300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402207DF2501A65D3105451D3CE225FA4FA6B861363A9FEADB2225E1B201872F5DD0702205D68B00BE432A9E8EFBED6F1C1155586EE7DB29FC58F4CB4D9DE60C36705B919", "308201D0A00302010202020901300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430393135323333345A170D3330303430373135323333345A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B304A301406072A8648CE3D020106092B24030302080101030332000462864AE7B8A5376473177E86A09162C2BC6D14D05BF932EF50F92FA0BEBC693A19D21611B76C173AC397CD2B39B1C4AEA381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414E9B402A455F7CEA525A1565D167D94A30CB1A55E300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200D22D098327B7DE35E6AC1BCA12939B48869D0C76C38A5BBCE43397D7194FD4402200E562320249C7D596B850BC585E3D86A00CD7648B8D346D112A8EFED38938A03"];
593 var pd8Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
594 var pd8Tid = "";
595 for (var pd8Ri = 0; pd8Ri < 16; pd8Ri++) {
596 pd8Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
597 }
598 var pd8Sel = 0;
599 var pd8Sig1 = "";
600 var pd8Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
601 if (pd8Sel < 0 || pd8Sig1 === "") {
602 // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
603 bind.checkData("S8-C1 SW", "9000", "pd8_not_executed:cma_operands_absent");
604 bind.checkData("S8-C2 R_PREP_DOWNLOAD response structure", "1", "pd8_not_executed:cma_operands_absent");
605 } else {
606 bind.engine.InitEccDomainParams(pd8Dps[pd8Sel][0], pd8Dps[pd8Sel][1], pd8Dps[pd8Sel][2], pd8Dps[pd8Sel][3], pd8Dps[pd8Sel][4], 1);
607 var pd8S2 = BindEs10xSingleRequest.buildTlv("30",
608 BindEs10xSingleRequest.buildTlv("80", pd8Tid)
609 + BindEs10xSingleRequest.buildTlv("01", "00"));
610 var pd8Sgn = "";
611 while (pd8Sgn.length != 2 * pd8Sks[pd8Sel].length) {
612 bind.engine.SleepTime(2000);
613 pd8Sgn = bind.engine.EccSignData(pd8Sks[pd8Sel], pd8S2 + BindEs10xSingleRequest.buildTlv("5F37", pd8Sig1), 33);
614 }
615 var pd8Req = BindEs10xSingleRequest.buildTlv("BF21",
616 pd8S2
617 + BindEs10xSingleRequest.buildTlv("5F37", pd8Sgn)
618 + BindEs10xSingleRequest.buildTlv("30", pd8Certs[pd8Sel]));
619 var pd8Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
620 {cla: "", ins: "E2", p1: "91", p2: "00", data: pd8Req,
621 le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
622 var pd8Sw = (pd8Run.final && pd8Run.final.sw) ? pd8Run.final.sw : "transport_error";
623 bind.checkData("S8-C1 SW", "9000", pd8Sw);
624 // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
625 var pd8Otpk = "";
626 if (pd8Run.final && pd8Run.final.resp) {
627 var pd8L1 = BindEs10xSingleRequest.parseBerTlv(pd8Run.final.resp);
628 for (var pd8I1 = 0; pd8I1 < pd8L1.length && pd8Otpk === ""; pd8I1++) {
629 if (pd8L1[pd8I1].tag !== "BF21") continue;
630 var pd8L2 = BindEs10xSingleRequest.parseBerTlv(pd8L1[pd8I1].value);
631 for (var pd8I2 = 0; pd8I2 < pd8L2.length && pd8Otpk === ""; pd8I2++) {
632 if (pd8L2[pd8I2].tag !== "A0") continue;
633 var pd8L3 = BindEs10xSingleRequest.parseBerTlv(pd8L2[pd8I2].value);
634 for (var pd8I3 = 0; pd8I3 < pd8L3.length && pd8Otpk === ""; pd8I3++) {
635 if (pd8L3[pd8I3].tag !== "30") continue;
636 var pd8L4 = BindEs10xSingleRequest.parseBerTlv(pd8L3[pd8I3].value);
637 for (var pd8I4 = 0; pd8I4 < pd8L4.length; pd8I4++) {
638 if (pd8L4[pd8I4].tag === "5F49") pd8Otpk = pd8L4[pd8I4].value;
639 }
640 }
641 }
642 }
643 }
644 }
645 // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseError A1{transactionId 80, downloadErrorCode 02}):运行时域,仅结构与在场性断言。
646 var pd8RSR = (pd8Run.final && pd8Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd8Run.final.resp) : [];
647 var pd8RSOuter = pd8RSR.length === 1 ? pd8RSR[0].tag : "absent";
648 var pd8RSBr = pd8RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd8RSR[0].value) : [];
649 var pd8RSA0 = false, pd8RSA1 = false, pd8RSCk = [];
650 for (var pd8RSi = 0; pd8RSi < pd8RSBr.length; pd8RSi++) {
651 if (pd8RSBr[pd8RSi].tag === "A0") { pd8RSA0 = true; pd8RSCk = BindEs10xSingleRequest.parseBerTlv(pd8RSBr[pd8RSi].value); }
652 if (pd8RSBr[pd8RSi].tag === "A1") { pd8RSA1 = true; pd8RSCk = BindEs10xSingleRequest.parseBerTlv(pd8RSBr[pd8RSi].value); }
653 }
654 var pd8RS30 = false, pd8RS5F37 = false, pd8RS80 = false, pd8RS02 = false;
655 for (var pd8RSj = 0; pd8RSj < pd8RSCk.length; pd8RSj++) {
656 if (pd8RSCk[pd8RSj].tag === "30") pd8RS30 = true;
657 if (pd8RSCk[pd8RSj].tag === "5F37") pd8RS5F37 = true;
658 if (pd8RSCk[pd8RSj].tag === "80") pd8RS80 = true;
659 if (pd8RSCk[pd8RSj].tag === "02") pd8RS02 = true;
660 }
661 var pd8RS5F49 = false;
662 if (pd8RS30) {
663 for (var pd8RSk = 0; pd8RSk < pd8RSCk.length; pd8RSk++) {
664 if (pd8RSCk[pd8RSk].tag !== "30") continue;
665 var pd8RSU = BindEs10xSingleRequest.parseBerTlv(pd8RSCk[pd8RSk].value);
666 for (var pd8RSm = 0; pd8RSm < pd8RSU.length; pd8RSm++) {
667 if (pd8RSU[pd8RSm].tag === "5F49") pd8RS5F49 = true;
668 if (pd8RSU[pd8RSm].tag === "80") pd8RS80 = true;
669 }
670 }
671 }
672 bind.checkData("S8-C2 R_PREP_DOWNLOAD response structure" + " (downloadResponseError or no data)", "1", (pd8RSOuter === "absent" || (pd8RSA1 && pd8RS80 && pd8RS02)) ? "1" : "0");
673 // S8-C3: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
674
675 // 步骤 9:SEQ08-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_136, RQ57_027, RQ57_030, RQ57_031, RQ57_036, RQ57_037, RQ57_038, RQ45_006, RQ45_026_1, RQ45_026, RQ45_028, RQ45_030)
676 // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_INV_OID;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
677 // 无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
678 // 错误注入变体(I_annexD3_es10x):cert=SGP.26 v1.5 变体物料声明面(input/PREP_DOWNLOAD_VARIANT_MATERIALS.json,sha256 锚编译期已核);ccRequiredFlag/签名形态按变体闭集定义。
679 var pd9Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
680 var pd9Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
681 var pd9Tid = "";
682 for (var pd9Ri = 0; pd9Ri < 16; pd9Ri++) {
683 pd9Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
684 }
685 var pd9Sel = 0;
686 var pd9Sig1 = "";
687 var pd9Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
688 if (pd9Sel < 0 || pd9Sig1 === "") {
689 // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
690 bind.checkData("S9-C1 SW", "9000", "pd9_not_executed:cma_operands_absent");
691 bind.checkData("S9-C2 R_PREP_DOWNLOAD response structure", "1", "pd9_not_executed:cma_operands_absent");
692 } else {
693 bind.engine.InitEccDomainParams(pd9Dps[pd9Sel][0], pd9Dps[pd9Sel][1], pd9Dps[pd9Sel][2], pd9Dps[pd9Sel][3], pd9Dps[pd9Sel][4], 1);
694 var pd9S2 = BindEs10xSingleRequest.buildTlv("30",
695 BindEs10xSingleRequest.buildTlv("80", pd9Tid)
696 + BindEs10xSingleRequest.buildTlv("01", "00"));
697 var pd9Sgn = "";
698 while (pd9Sgn.length != 2 * pd9Sks[pd9Sel].length) {
699 bind.engine.SleepTime(2000);
700 pd9Sgn = bind.engine.EccSignData(pd9Sks[pd9Sel], pd9S2 + BindEs10xSingleRequest.buildTlv("5F37", pd9Sig1), 33);
701 }
702 var pd9Req = BindEs10xSingleRequest.buildTlv("BF21",
703 pd9S2
704 + BindEs10xSingleRequest.buildTlv("5F37", pd9Sgn)
705 + BindEs10xSingleRequest.buildTlv("30", pd9Certs[pd9Sel]));
706 var pd9Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
707 {cla: "", ins: "E2", p1: "91", p2: "00", data: pd9Req,
708 le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
709 var pd9Sw = (pd9Run.final && pd9Run.final.sw) ? pd9Run.final.sw : "transport_error";
710 bind.checkData("S9-C1 SW", "9000", pd9Sw);
711 // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
712 var pd9Otpk = "";
713 if (pd9Run.final && pd9Run.final.resp) {
714 var pd9L1 = BindEs10xSingleRequest.parseBerTlv(pd9Run.final.resp);
715 for (var pd9I1 = 0; pd9I1 < pd9L1.length && pd9Otpk === ""; pd9I1++) {
716 if (pd9L1[pd9I1].tag !== "BF21") continue;
717 var pd9L2 = BindEs10xSingleRequest.parseBerTlv(pd9L1[pd9I1].value);
718 for (var pd9I2 = 0; pd9I2 < pd9L2.length && pd9Otpk === ""; pd9I2++) {
719 if (pd9L2[pd9I2].tag !== "A0") continue;
720 var pd9L3 = BindEs10xSingleRequest.parseBerTlv(pd9L2[pd9I2].value);
721 for (var pd9I3 = 0; pd9I3 < pd9L3.length && pd9Otpk === ""; pd9I3++) {
722 if (pd9L3[pd9I3].tag !== "30") continue;
723 var pd9L4 = BindEs10xSingleRequest.parseBerTlv(pd9L3[pd9I3].value);
724 for (var pd9I4 = 0; pd9I4 < pd9L4.length; pd9I4++) {
725 if (pd9L4[pd9I4].tag === "5F49") pd9Otpk = pd9L4[pd9I4].value;
726 }
727 }
728 }
729 }
730 }
731 }
732 // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseError A1{transactionId 80, downloadErrorCode 02}):运行时域,仅结构与在场性断言。
733 var pd9RSR = (pd9Run.final && pd9Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd9Run.final.resp) : [];
734 var pd9RSOuter = pd9RSR.length === 1 ? pd9RSR[0].tag : "absent";
735 var pd9RSBr = pd9RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd9RSR[0].value) : [];
736 var pd9RSA0 = false, pd9RSA1 = false, pd9RSCk = [];
737 for (var pd9RSi = 0; pd9RSi < pd9RSBr.length; pd9RSi++) {
738 if (pd9RSBr[pd9RSi].tag === "A0") { pd9RSA0 = true; pd9RSCk = BindEs10xSingleRequest.parseBerTlv(pd9RSBr[pd9RSi].value); }
739 if (pd9RSBr[pd9RSi].tag === "A1") { pd9RSA1 = true; pd9RSCk = BindEs10xSingleRequest.parseBerTlv(pd9RSBr[pd9RSi].value); }
740 }
741 var pd9RS30 = false, pd9RS5F37 = false, pd9RS80 = false, pd9RS02 = false;
742 for (var pd9RSj = 0; pd9RSj < pd9RSCk.length; pd9RSj++) {
743 if (pd9RSCk[pd9RSj].tag === "30") pd9RS30 = true;
744 if (pd9RSCk[pd9RSj].tag === "5F37") pd9RS5F37 = true;
745 if (pd9RSCk[pd9RSj].tag === "80") pd9RS80 = true;
746 if (pd9RSCk[pd9RSj].tag === "02") pd9RS02 = true;
747 }
748 var pd9RS5F49 = false;
749 if (pd9RS30) {
750 for (var pd9RSk = 0; pd9RSk < pd9RSCk.length; pd9RSk++) {
751 if (pd9RSCk[pd9RSk].tag !== "30") continue;
752 var pd9RSU = BindEs10xSingleRequest.parseBerTlv(pd9RSCk[pd9RSk].value);
753 for (var pd9RSm = 0; pd9RSm < pd9RSU.length; pd9RSm++) {
754 if (pd9RSU[pd9RSm].tag === "5F49") pd9RS5F49 = true;
755 if (pd9RSU[pd9RSm].tag === "80") pd9RS80 = true;
756 }
757 }
758 }
759 bind.checkData("S9-C2 R_PREP_DOWNLOAD response structure" + " (downloadResponseError or no data)", "1", (pd9RSOuter === "absent" || (pd9RSA1 && pd9RS80 && pd9RS02)) ? "1" : "0");
760 // S9-C3: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
761}
762
完整 unified diff
行级差异:新增 760 行 / 删除 323 行(以 -man 为基准,unified 上下文 3 行)。
展开 diff(1088 行)
--- -man
+++ -cas
@@ -1,325 +1,762 @@
-// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10b_PrepareDownloadErrorCases_01_Error_No_Hashed_Confirmation_Code_but_with_Confirmation_Code_Required_Flag_set_to_TRUE + TC_eUICC_ES10b_PrepareDownloadErrorCases_02_Error_With_incorrect_CERT_DPpb_ECDSA + TC_eUICC_ES10b_PrepareDownloadErrorCases_03_Error_CERT_DPpb_ECDSA_and_CERT_DPauth_ECDSA_not_belonging_to_the_same_entity + TC_eUICC_ES10b_PrepareDownloadErrorCases_04_Error_With_invalid_SM_DP_signature + TC_eUICC_ES10b_PrepareDownloadErrorCases_05_Error_With_invalid_Transaction_ID + TC_eUICC_ES10b_PrepareDownloadErrorCases_06_Error_SM_DP_has_not_been_previously_authenticated + TC_eUICC_ES10b_PrepareDownloadErrorCases_07_Error_Unsupported_curve + TC_eUICC_ES10b_PrepareDownloadErrorCases_08_Error_Invalid_Certificate_Role_OID (extracted verbatim)
-
-function TC_eUICC_ES10b_PrepareDownloadErrorCases_01_Error_No_Hashed_Confirmation_Code_but_with_Confirmation_Code_Required_Flag_set_to_TRUE()
-{
- tracenamestr = "执行PrepareDownload,不带hashCc,但ccRequiredFlag为TRUE";
- curDis.TraceStart(sno++,tracenamestr);
-
- 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,确认码标记为true,但不包含Confirmation Code;");
- Profile_load_procedure.ccRequiredFlag = "FF";
- Profile_load_procedure.PrepareDownloadisErrorTest = true;
- Profile_load_procedure.preparedownloadErrorCode = DownloadErrorCode.undefinedError;
- Profile_load_procedure.ES10b_PrepareDownload();
-
- RecoverCard();
-}
-
-function TC_eUICC_ES10b_PrepareDownloadErrorCases_02_Error_With_incorrect_CERT_DPpb_ECDSA()
-{
- tracenamestr = "执行PrepareDownload,使用不正确的CERT.DPpb.ECDSA(即无效签名)";
- curDis.TraceStart(sno++,tracenamestr);
-
- 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,使用错误的CERT.DPpb.ECDSA(比如签名错);");
- Profile_load_procedure.DPbpInforObj.Cert = CERT_S_SM_DPpb_INV_SIGN_NIST;
- Profile_load_procedure.PrepareDownloadisErrorTest = true;
- Profile_load_procedure.preparedownloadErrorCode = DownloadErrorCode.invalidCertificate;
- Profile_load_procedure.ES10b_PrepareDownload();
-
- RecoverCard();
-}
-
-function TC_eUICC_ES10b_PrepareDownloadErrorCases_03_Error_CERT_DPpb_ECDSA_and_CERT_DPauth_ECDSA_not_belonging_to_the_same_entity()
-{
- tracenamestr = "执行PrepareDownload,CERT.DPpb.ECDSA和CERT.DPauth.ECDSA不属于同一实体";
- curDis.TraceStart(sno++,tracenamestr);
-
- 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,使用错误的CERT.DPpb.ECDSA(错误的OID);");
- Profile_load_procedure.DPbpInforObj.Cert = CERT_S_SM_DP2pb_ECDSA_NIST;
- Profile_load_procedure.PrepareDownloadisErrorTest = true;
- Profile_load_procedure.preparedownloadErrorCode = DownloadErrorCode.invalidCertificate;
- Profile_load_procedure.ES10b_PrepareDownload();
-
- RecoverCard();
-
-}
-
-function TC_eUICC_ES10b_PrepareDownloadErrorCases_04_Error_With_invalid_SM_DP_signature()
-{
- tracenamestr = "执行PrepareDownload,SM-DP+签名无效";
- curDis.TraceStart(sno++,tracenamestr);
-
- 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,使用无效的SM-DP+签名;");
- Profile_load_procedure.DPbpInforObj.D_key = curStrHandle.RandHexStr(32);
- Profile_load_procedure.PrepareDownloadisErrorTest = true;
- Profile_load_procedure.preparedownloadErrorCode = DownloadErrorCode.invalidSignature;
- Profile_load_procedure.ES10b_PrepareDownload();
-
- RecoverCard();
-
-}
-
-function TC_eUICC_ES10b_PrepareDownloadErrorCases_05_Error_With_invalid_Transaction_ID()
-{
- tracenamestr = "执行PrepareDownload,Transaction ID无效";
- curDis.TraceStart(sno++,tracenamestr);
-
- 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,使用无效的Transaction ID;");
- Profile_load_procedure.transactionId = curStrHandle.RandHexStr(16);
- Profile_load_procedure.PrepareDownloadisErrorTest = true;
- Profile_load_procedure.preparedownloadErrorCode = DownloadErrorCode.invalidTransactionId;
- Profile_load_procedure.ES10b_PrepareDownload();
-
- RecoverCard();
-}
-
-function TC_eUICC_ES10b_PrepareDownloadErrorCases_06_Error_SM_DP_has_not_been_previously_authenticated()
-{
- tracenamestr = "执行PrepareDownload,SM-DP+未经过认证";
- curDis.TraceStart(sno++,tracenamestr);
-
- 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;");
- Profile_load_procedure.ES10b_PrepareDownload();
-
- curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
- TS_SELECT("Select ISD",ISD_R_AID,"9000");
-
- 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命令,执行PrepareDownloadRequest,前面没有安全认证;");
- Profile_load_procedure.transactionId = curStrHandle.RandHexStr(16);
- Profile_load_procedure.PrepareDownloadisErrorTest = true;
- Profile_load_procedure.preparedownloadErrorCode = DownloadErrorCode.noSessionContext;
- Profile_load_procedure.ES10b_PrepareDownload();
-
- RecoverCard();
-
-}
-
-function TC_eUICC_ES10b_PrepareDownloadErrorCases_07_Error_Unsupported_curve()
-{
- if(!Card_Have_ECC_Cert)
- return;
-
- tracenamestr = "执行PrepareDownload,使用不支持的曲线";
- curDis.TraceStart(sno++,tracenamestr);
-
- 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;
-
- pkId_CI_ForVerification = pkId_CI_ECDSA_NIST;
- pkId_CI_ForSigning = pkId_CI_ECDSA_NIST;
-
- 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,证书使用不支持的曲线算法;");
- Profile_load_procedure.DPbpInforObj.Cert = CERT_S_SM_DPpb_INV_CURVE_NIST192;
- Profile_load_procedure.PrepareDownloadisErrorTest = true;
- Profile_load_procedure.preparedownloadErrorCode = DownloadErrorCode.unsupportedCurve;
- Profile_load_procedure.ES10b_PrepareDownload();
-
- RecoverCard();
-
-}
-
-function TC_eUICC_ES10b_PrepareDownloadErrorCases_08_Error_Invalid_Certificate_Role_OID()
-{
- tracenamestr = "执行PrepareDownload,使用无效的证书Role OID";
- curDis.TraceStart(sno++,tracenamestr);
-
- 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,证书使用无效的Certificate Role OID;");
- Profile_load_procedure.DPbpInforObj.Cert = CERT_S_SM_DPauth_ECDSA_NIST;
- Profile_load_procedure.PrepareDownloadisErrorTest = true;
- Profile_load_procedure.preparedownloadErrorCode = DownloadErrorCode.invalidCertificate;
- Profile_load_procedure.ES10b_PrepareDownload();
-
- RecoverCard();
+// Author: 卡思Cas智能体
+// Date: 20261005-152741
+// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10b.PrepareDownloadErrorCases,Test Sequence #01-#08 Error (all 8 sequences),适用性 M。
+// Test points: ICH-SEQ06-IC1-K1-C1 ATR_present;ICH-SEQ06-IC1-K2-C2 FCP_Template
+// ICH-SEQ06-IC1-K2-C4 SW;ICH-SEQ06-IC1-K3-C4 SW;ICH-SEQ06-IC1-K4-C4 final SW
+// ICH-SEQ06-IC2-K1-C4 SW;ICH-SEQ06-IC2-K1-C3 CHANNEL_NUMBER extracted;ICH-SEQ06-IC2-K2-C4 SW
+// S1-C2 R_PREP_DOWNLOAD response structure;S2-C1 SW;S2-C2 R_PREP_DOWNLOAD response structure
+// S3-C1 SW;S3-C2 R_PREP_DOWNLOAD response structure;S4-C1 SW
+// S4-C2 R_PREP_DOWNLOAD response structure;S5-C1 SW;S5-C2 R_PREP_DOWNLOAD response structure
+// S6-C1 SW;S6-C2 R_EUICC_INFO1 outer tag;S6-C2 R_EUICC_INFO1 required members present;S7-C1 SW
+// S7-C2 R_PREP_DOWNLOAD response structure;S8-C1 SW;S8-C2 R_PREP_DOWNLOAD response structure
+// S9-C1 SW;S9-C2 R_PREP_DOWNLOAD response structure
+// 本函数由 CaseIR 4.2.10.2.4 编译生成(fullwave-blindgen-live-70-W1-laneA2,SGP.23 v1.16 × SGP.22 v2.7):字节权威=CaseIR,非誊录黄金脚本。
+// Value-free template: every data byte is injected from CaseIR fields; no scaffold globals (see docs/speconly/compile-symbol-migration.md).
+// 适用性 M:编译期门,运行时由 harness 环境前置承担。
+function TC_eUICC_ES10b_PrepareDownloadErrorCases_01_08_Error_all_8_sequences() {
+ var bind = curBind;
+ // TC-GEN-1 eUICC: The PROFILE_OPERATIONAL1 is not loaded on the eUICC.: declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
+ // TC-GEN-2 eUICC: S_Device 与 eUICC 通信已初始化,S_LPAd 已选 ISD-R;eUICC 与 S_SM-DP+ 已成功执行 Common Mutual Authentication;#GET_EUICC_INFO1、#GET_EUICC_CHALLENGE、#AUTHENTICATE_SMDP 已发送;签名与验证选用同一 GSMA CI。: declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
+ // SEQ01-IC1 <S_HASHED_CC> = MTD_GENERATE_HASHED_CC(#CONFIRMATION_CODE1, <S_TRANSACTION_ID>)(测试工具侧计算,H_annexC1_methods 表1228): declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
+ // SEQ06-IC-T1 eUICC: No Common Mutual Authentication procedure has been executed between the eUICC and the S_SM-DP+(覆盖本 TC 最后一条 general initial condition): declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
+
+ // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 1):RESET(K 语料机械展开)
+ var s10 = bind.resetAndAtr();
+ bind.checkData("ICH-SEQ06-IC1-K1-C1 ATR_present", "1", s10.atr_hex !== "" ? "1" : "0");
+
+ // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 2):SELECT_MF(K 语料机械展开)
+ // FCP outer tag not materialized from clause: tag-face asserted only when corpus fixes the tag byte (e.g. TS 102 221 FCP '62').
+ var s11 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
+ bind.checkData("ICH-SEQ06-IC1-K2-C2 FCP_Template", "1", s11.resp.length > 0 ? "1" : "0");
+ bind.checkData("ICH-SEQ06-IC1-K2-C4 SW", "9000", s11.sw);
+
+ // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 3):TERMINAL_CAPABILITY_LPAd(K 语料机械展开)
+ var s12 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
+ bind.checkData("ICH-SEQ06-IC1-K3-C4 SW", "9000", s12.sw);
+
+ // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 4):TERMINAL_PROFILE(K 语料机械展开)
+ var steady13 = bind.runToSteadyState(function () {
+ return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
+ });
+ bind.checkData("ICH-SEQ06-IC1-K4-C4 final SW", "9000", steady13.final.sw);
+
+ // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 1):MANAGE_CHANNEL_OPEN(K 语料机械展开)
+ // CHANNEL_NUMBER extraction and dynamic CLA rebinding are CasBind internal state (chaining rule; no generated-code re-implementation).
+ var s14 = bind.manageChannelOpen("9000");
+ bind.checkData("ICH-SEQ06-IC2-K1-C4 SW", "9000", s14.sw);
+ bind.checkData("ICH-SEQ06-IC2-K1-C3 CHANNEL_NUMBER extracted", "1", s14.chan !== null ? "1" : "0");
+
+ // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 2):MTD_SELECT(K 语料机械展开)
+ // CLA = bound channel (cla_rule) and <L> length binding are CasBind internal state (chaining rule; no generated-code re-implementation).
+ var s15 = bind.sendApdu(null, "A4", "04", "00", "A0000005591010FFFFFFFF8900000100", null, "9000");
+ // MTD_SELECT expected face is SW-only (K Annex C.2 open-channel procedure step 2: no FCI content assertion in corpus); no fabricated template parse.
+ bind.checkData("ICH-SEQ06-IC2-K2-C4 SW", "9000", s15.sw);
+
+ // 步骤 1:SEQ01-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_135, RQ31_136, RQ57_031, RQ57_036, RQ57_037, RQ57_038)
+ // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_INVALID_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
+ // 无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
+ // 错误注入变体(I_annexD3_es10x):cert=SGP.26 v1.5 变体物料声明面(input/PREP_DOWNLOAD_VARIANT_MATERIALS.json,sha256 锚编译期已核);ccRequiredFlag/签名形态按变体闭集定义。
+ var pd1Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
+ var pd1Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
+ var pd1Tid = "";
+ for (var pd1Ri = 0; pd1Ri < 16; pd1Ri++) {
+ pd1Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+ }
+ var pd1Sel = 0;
+ var pd1Sig1 = "";
+ var pd1Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+ if (pd1Sel < 0 || pd1Sig1 === "") {
+ // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
+ bind.checkData("S1-C2 R_PREP_DOWNLOAD response structure", "1", "pd1_not_executed:cma_operands_absent");
+ } else {
+ bind.engine.InitEccDomainParams(pd1Dps[pd1Sel][0], pd1Dps[pd1Sel][1], pd1Dps[pd1Sel][2], pd1Dps[pd1Sel][3], pd1Dps[pd1Sel][4], 1);
+ var pd1S2 = BindEs10xSingleRequest.buildTlv("30",
+ BindEs10xSingleRequest.buildTlv("80", pd1Tid)
+ + BindEs10xSingleRequest.buildTlv("01", "FF"));
+ var pd1Sgn = "";
+ while (pd1Sgn.length != 2 * pd1Sks[pd1Sel].length) {
+ bind.engine.SleepTime(2000);
+ pd1Sgn = bind.engine.EccSignData(pd1Sks[pd1Sel], pd1S2 + BindEs10xSingleRequest.buildTlv("5F37", pd1Sig1), 33);
+ }
+ var pd1Req = BindEs10xSingleRequest.buildTlv("BF21",
+ pd1S2
+ + BindEs10xSingleRequest.buildTlv("5F37", pd1Sgn)
+ + BindEs10xSingleRequest.buildTlv("30", pd1Certs[pd1Sel]));
+ var pd1Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+ {cla: "", ins: "E2", p1: "91", p2: "00", data: pd1Req,
+ le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+ var pd1Sw = (pd1Run.final && pd1Run.final.sw) ? pd1Run.final.sw : "transport_error";
+ // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
+ var pd1Otpk = "";
+ if (pd1Run.final && pd1Run.final.resp) {
+ var pd1L1 = BindEs10xSingleRequest.parseBerTlv(pd1Run.final.resp);
+ for (var pd1I1 = 0; pd1I1 < pd1L1.length && pd1Otpk === ""; pd1I1++) {
+ if (pd1L1[pd1I1].tag !== "BF21") continue;
+ var pd1L2 = BindEs10xSingleRequest.parseBerTlv(pd1L1[pd1I1].value);
+ for (var pd1I2 = 0; pd1I2 < pd1L2.length && pd1Otpk === ""; pd1I2++) {
+ if (pd1L2[pd1I2].tag !== "A0") continue;
+ var pd1L3 = BindEs10xSingleRequest.parseBerTlv(pd1L2[pd1I2].value);
+ for (var pd1I3 = 0; pd1I3 < pd1L3.length && pd1Otpk === ""; pd1I3++) {
+ if (pd1L3[pd1I3].tag !== "30") continue;
+ var pd1L4 = BindEs10xSingleRequest.parseBerTlv(pd1L3[pd1I3].value);
+ for (var pd1I4 = 0; pd1I4 < pd1L4.length; pd1I4++) {
+ if (pd1L4[pd1I4].tag === "5F49") pd1Otpk = pd1L4[pd1I4].value;
+ }
+ }
+ }
+ }
+ }
+ }
+ // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseError A1{transactionId 80, downloadErrorCode 02}):运行时域,仅结构与在场性断言。
+ var pd1RSR = (pd1Run.final && pd1Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd1Run.final.resp) : [];
+ var pd1RSOuter = pd1RSR.length === 1 ? pd1RSR[0].tag : "absent";
+ var pd1RSBr = pd1RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd1RSR[0].value) : [];
+ var pd1RSA0 = false, pd1RSA1 = false, pd1RSCk = [];
+ for (var pd1RSi = 0; pd1RSi < pd1RSBr.length; pd1RSi++) {
+ if (pd1RSBr[pd1RSi].tag === "A0") { pd1RSA0 = true; pd1RSCk = BindEs10xSingleRequest.parseBerTlv(pd1RSBr[pd1RSi].value); }
+ if (pd1RSBr[pd1RSi].tag === "A1") { pd1RSA1 = true; pd1RSCk = BindEs10xSingleRequest.parseBerTlv(pd1RSBr[pd1RSi].value); }
+ }
+ var pd1RS30 = false, pd1RS5F37 = false, pd1RS80 = false, pd1RS02 = false;
+ for (var pd1RSj = 0; pd1RSj < pd1RSCk.length; pd1RSj++) {
+ if (pd1RSCk[pd1RSj].tag === "30") pd1RS30 = true;
+ if (pd1RSCk[pd1RSj].tag === "5F37") pd1RS5F37 = true;
+ if (pd1RSCk[pd1RSj].tag === "80") pd1RS80 = true;
+ if (pd1RSCk[pd1RSj].tag === "02") pd1RS02 = true;
+ }
+ var pd1RS5F49 = false;
+ if (pd1RS30) {
+ for (var pd1RSk = 0; pd1RSk < pd1RSCk.length; pd1RSk++) {
+ if (pd1RSCk[pd1RSk].tag !== "30") continue;
+ var pd1RSU = BindEs10xSingleRequest.parseBerTlv(pd1RSCk[pd1RSk].value);
+ for (var pd1RSm = 0; pd1RSm < pd1RSU.length; pd1RSm++) {
+ if (pd1RSU[pd1RSm].tag === "5F49") pd1RS5F49 = true;
+ if (pd1RSU[pd1RSm].tag === "80") pd1RS80 = true;
+ }
+ }
+ }
+ bind.checkData("S1-C2 R_PREP_DOWNLOAD response structure" + " (downloadResponseError or no data)", "1", (pd1RSOuter === "absent" || (pd1RSA1 && pd1RS80 && pd1RS02)) ? "1" : "0");
+ // S1-C1: binding:prep_download_variant_error_status_disjunctive(error-swp|downloadResponseError;I_annexD3) (check_attestation)
+ // S1-C3: binding:prep_download_variant_error_no_response(ANY_SW_IN_ERROR;G-annexB) (check_attestation)
+
+ // 步骤 2:SEQ02-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_136, RQ57_027, RQ57_030, RQ57_031, RQ57_036, RQ57_037, RQ57_038, RQ45_006, RQ45_026_1, RQ45_026, RQ45_028)
+ // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_INV_CERT;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
+ // 无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
+ // 错误注入变体(I_annexD3_es10x):cert=SGP.26 v1.5 变体物料声明面(input/PREP_DOWNLOAD_VARIANT_MATERIALS.json,sha256 锚编译期已核);ccRequiredFlag/签名形态按变体闭集定义。
+ var pd2Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF71200A256211089EF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E48108310518721223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
+ 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"]];
+ 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", "00"));
+ 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("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;downloadResponseError A1{transactionId 80, downloadErrorCode 02}):运行时域,仅结构与在场性断言。
+ 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 response structure" + " (downloadResponseError or no data)", "1", (pd2RSOuter === "absent" || (pd2RSA1 && pd2RS80 && pd2RS02)) ? "1" : "0");
+ // S2-C3: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
+
+ // 步骤 3:SEQ03-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_132, RQ31_136, RQ57_029, RQ57_031, RQ57_036, RQ57_037, RQ57_038, RQ45_006, RQ45_026_1, RQ45_026, RQ45_028)
+ // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_CERT_SMDP2;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
+ // 无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
+ // 错误注入变体(I_annexD3_es10x):cert=SGP.26 v1.5 变体物料声明面(input/PREP_DOWNLOAD_VARIANT_MATERIALS.json,sha256 锚编译期已核);ccRequiredFlag/签名形态按变体闭集定义。
+ var pd3Certs = ["308201E0A00302010202020201300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3026310D300B060355040A0C0441434D453115301306035504030C0C5445535420534D2D44502B323059301306072A8648CE3D020106082A8648CE3D030107034200043E2D75A106221216C2AEE8FAD584F779633CF944681B5EC75A96653F5F401C476AE39D546C032D32D0070A7B86E5DCEBAADDF31CA5C2766C196BD79BC21A0180A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E0416041420A3A830E92EE7A468C5EB27BA8DF18459ADFDD7300E0603551D1104073005880388370C300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020349003046022100AD7F267F31F934CEE3E29E09F6582603D296D2F5224B0A1AB988C9870393E3190221008F7E51EEE673DF06D10A5350B94C00B702FF96DC960D317967E61877FF5123DB", "308201E1A00302010202020201300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3026310D300B060355040A0C0441434D453115301306035504030C0C5445535420534D2D44502B32305A301406072A8648CE3D020106092B2403030208010107034200047361855E590264B252C71A6062A021E27B46F760B8138206A7F74420EF8BC55A8B988D1658F9D70D3A2D8480AADF64E62C4D7127DE5A0A2B917A943F4474AADDA381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041431038A55B6BECF6CEA59DE2FDA14F4327FB8B6A9300E0603551D1104073005880388370C300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402203C7BF047D9D62485CFB4C6DB9955C45CFAD4DECECF3B9028A84DEF7A21E63EB002206046EC8B7F016738A6C0977BF226628EB4EBCBC3183AD1ECC9C82C3B35490B4E"];
+ var pd3Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
+ var pd3Tid = "";
+ for (var pd3Ri = 0; pd3Ri < 16; pd3Ri++) {
+ pd3Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+ }
+ var pd3Sel = 0;
+ var pd3Sig1 = "";
+ var pd3Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+ if (pd3Sel < 0 || pd3Sig1 === "") {
+ // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
+ bind.checkData("S3-C1 SW", "9000", "pd3_not_executed:cma_operands_absent");
+ bind.checkData("S3-C2 R_PREP_DOWNLOAD response structure", "1", "pd3_not_executed:cma_operands_absent");
+ } else {
+ bind.engine.InitEccDomainParams(pd3Dps[pd3Sel][0], pd3Dps[pd3Sel][1], pd3Dps[pd3Sel][2], pd3Dps[pd3Sel][3], pd3Dps[pd3Sel][4], 1);
+ var pd3S2 = BindEs10xSingleRequest.buildTlv("30",
+ BindEs10xSingleRequest.buildTlv("80", pd3Tid)
+ + BindEs10xSingleRequest.buildTlv("01", "00"));
+ var pd3Sgn = "";
+ while (pd3Sgn.length != 2 * pd3Sks[pd3Sel].length) {
+ bind.engine.SleepTime(2000);
+ pd3Sgn = bind.engine.EccSignData(pd3Sks[pd3Sel], pd3S2 + BindEs10xSingleRequest.buildTlv("5F37", pd3Sig1), 33);
+ }
+ var pd3Req = BindEs10xSingleRequest.buildTlv("BF21",
+ pd3S2
+ + BindEs10xSingleRequest.buildTlv("5F37", pd3Sgn)
+ + BindEs10xSingleRequest.buildTlv("30", pd3Certs[pd3Sel]));
+ var pd3Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+ {cla: "", ins: "E2", p1: "91", p2: "00", data: pd3Req,
+ le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+ var pd3Sw = (pd3Run.final && pd3Run.final.sw) ? pd3Run.final.sw : "transport_error";
+ bind.checkData("S3-C1 SW", "9000", pd3Sw);
+ // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
+ var pd3Otpk = "";
+ if (pd3Run.final && pd3Run.final.resp) {
+ var pd3L1 = BindEs10xSingleRequest.parseBerTlv(pd3Run.final.resp);
+ for (var pd3I1 = 0; pd3I1 < pd3L1.length && pd3Otpk === ""; pd3I1++) {
+ if (pd3L1[pd3I1].tag !== "BF21") continue;
+ var pd3L2 = BindEs10xSingleRequest.parseBerTlv(pd3L1[pd3I1].value);
+ for (var pd3I2 = 0; pd3I2 < pd3L2.length && pd3Otpk === ""; pd3I2++) {
+ if (pd3L2[pd3I2].tag !== "A0") continue;
+ var pd3L3 = BindEs10xSingleRequest.parseBerTlv(pd3L2[pd3I2].value);
+ for (var pd3I3 = 0; pd3I3 < pd3L3.length && pd3Otpk === ""; pd3I3++) {
+ if (pd3L3[pd3I3].tag !== "30") continue;
+ var pd3L4 = BindEs10xSingleRequest.parseBerTlv(pd3L3[pd3I3].value);
+ for (var pd3I4 = 0; pd3I4 < pd3L4.length; pd3I4++) {
+ if (pd3L4[pd3I4].tag === "5F49") pd3Otpk = pd3L4[pd3I4].value;
+ }
+ }
+ }
+ }
+ }
+ }
+ // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseError A1{transactionId 80, downloadErrorCode 02}):运行时域,仅结构与在场性断言。
+ var pd3RSR = (pd3Run.final && pd3Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd3Run.final.resp) : [];
+ var pd3RSOuter = pd3RSR.length === 1 ? pd3RSR[0].tag : "absent";
+ var pd3RSBr = pd3RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd3RSR[0].value) : [];
+ var pd3RSA0 = false, pd3RSA1 = false, pd3RSCk = [];
+ for (var pd3RSi = 0; pd3RSi < pd3RSBr.length; pd3RSi++) {
+ if (pd3RSBr[pd3RSi].tag === "A0") { pd3RSA0 = true; pd3RSCk = BindEs10xSingleRequest.parseBerTlv(pd3RSBr[pd3RSi].value); }
+ if (pd3RSBr[pd3RSi].tag === "A1") { pd3RSA1 = true; pd3RSCk = BindEs10xSingleRequest.parseBerTlv(pd3RSBr[pd3RSi].value); }
+ }
+ var pd3RS30 = false, pd3RS5F37 = false, pd3RS80 = false, pd3RS02 = false;
+ for (var pd3RSj = 0; pd3RSj < pd3RSCk.length; pd3RSj++) {
+ if (pd3RSCk[pd3RSj].tag === "30") pd3RS30 = true;
+ if (pd3RSCk[pd3RSj].tag === "5F37") pd3RS5F37 = true;
+ if (pd3RSCk[pd3RSj].tag === "80") pd3RS80 = true;
+ if (pd3RSCk[pd3RSj].tag === "02") pd3RS02 = true;
+ }
+ var pd3RS5F49 = false;
+ if (pd3RS30) {
+ for (var pd3RSk = 0; pd3RSk < pd3RSCk.length; pd3RSk++) {
+ if (pd3RSCk[pd3RSk].tag !== "30") continue;
+ var pd3RSU = BindEs10xSingleRequest.parseBerTlv(pd3RSCk[pd3RSk].value);
+ for (var pd3RSm = 0; pd3RSm < pd3RSU.length; pd3RSm++) {
+ if (pd3RSU[pd3RSm].tag === "5F49") pd3RS5F49 = true;
+ if (pd3RSU[pd3RSm].tag === "80") pd3RS80 = true;
+ }
+ }
+ }
+ bind.checkData("S3-C2 R_PREP_DOWNLOAD response structure" + " (downloadResponseError or no data)", "1", (pd3RSOuter === "absent" || (pd3RSA1 && pd3RS80 && pd3RS02)) ? "1" : "0");
+ // S3-C3: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
+
+ // 步骤 4:SEQ04-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_133, RQ31_136, RQ57_028, RQ57_031, RQ57_036, RQ57_038, RQ45_006, RQ45_026_1, RQ45_026, RQ45_028)
+ // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_INV_SIGN;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
+ // 无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
+ // 错误注入变体(I_annexD3_es10x):cert=SGP.26 v1.5 变体物料声明面(input/PREP_DOWNLOAD_VARIANT_MATERIALS.json,sha256 锚编译期已核);ccRequiredFlag/签名形态按变体闭集定义。
+ var pd4Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
+ var pd4Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
+ var pd4Tid = "";
+ for (var pd4Ri = 0; pd4Ri < 16; pd4Ri++) {
+ pd4Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+ }
+ var pd4Sel = 0;
+ var pd4Sig1 = "";
+ var pd4Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+ if (pd4Sel < 0 || pd4Sig1 === "") {
+ // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
+ bind.checkData("S4-C1 SW", "9000", "pd4_not_executed:cma_operands_absent");
+ bind.checkData("S4-C2 R_PREP_DOWNLOAD response structure", "1", "pd4_not_executed:cma_operands_absent");
+ } else {
+ bind.engine.InitEccDomainParams(pd4Dps[pd4Sel][0], pd4Dps[pd4Sel][1], pd4Dps[pd4Sel][2], pd4Dps[pd4Sel][3], pd4Dps[pd4Sel][4], 1);
+ var pd4S2 = BindEs10xSingleRequest.buildTlv("30",
+ BindEs10xSingleRequest.buildTlv("80", pd4Tid)
+ + BindEs10xSingleRequest.buildTlv("01", "00"));
+ var pd4Sgn = "";
+ while (pd4Sgn.length != 2 * pd4Sks[pd4Sel].length) {
+ bind.engine.SleepTime(2000);
+ pd4Sgn = bind.engine.EccSignData(pd4Sks[pd4Sel], pd4S2 + BindEs10xSingleRequest.buildTlv("5F37", pd4Sig1), 33);
+ }
+ var pd4Req = BindEs10xSingleRequest.buildTlv("BF21",
+ pd4S2
+ + BindEs10xSingleRequest.buildTlv("5F37", pd4Sgn)
+ + BindEs10xSingleRequest.buildTlv("30", pd4Certs[pd4Sel]));
+ var pd4Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+ {cla: "", ins: "E2", p1: "91", p2: "00", data: pd4Req,
+ le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+ var pd4Sw = (pd4Run.final && pd4Run.final.sw) ? pd4Run.final.sw : "transport_error";
+ bind.checkData("S4-C1 SW", "9000", pd4Sw);
+ // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
+ var pd4Otpk = "";
+ if (pd4Run.final && pd4Run.final.resp) {
+ var pd4L1 = BindEs10xSingleRequest.parseBerTlv(pd4Run.final.resp);
+ for (var pd4I1 = 0; pd4I1 < pd4L1.length && pd4Otpk === ""; pd4I1++) {
+ if (pd4L1[pd4I1].tag !== "BF21") continue;
+ var pd4L2 = BindEs10xSingleRequest.parseBerTlv(pd4L1[pd4I1].value);
+ for (var pd4I2 = 0; pd4I2 < pd4L2.length && pd4Otpk === ""; pd4I2++) {
+ if (pd4L2[pd4I2].tag !== "A0") continue;
+ var pd4L3 = BindEs10xSingleRequest.parseBerTlv(pd4L2[pd4I2].value);
+ for (var pd4I3 = 0; pd4I3 < pd4L3.length && pd4Otpk === ""; pd4I3++) {
+ if (pd4L3[pd4I3].tag !== "30") continue;
+ var pd4L4 = BindEs10xSingleRequest.parseBerTlv(pd4L3[pd4I3].value);
+ for (var pd4I4 = 0; pd4I4 < pd4L4.length; pd4I4++) {
+ if (pd4L4[pd4I4].tag === "5F49") pd4Otpk = pd4L4[pd4I4].value;
+ }
+ }
+ }
+ }
+ }
+ }
+ // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseError A1{transactionId 80, downloadErrorCode 02}):运行时域,仅结构与在场性断言。
+ var pd4RSR = (pd4Run.final && pd4Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd4Run.final.resp) : [];
+ var pd4RSOuter = pd4RSR.length === 1 ? pd4RSR[0].tag : "absent";
+ var pd4RSBr = pd4RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd4RSR[0].value) : [];
+ var pd4RSA0 = false, pd4RSA1 = false, pd4RSCk = [];
+ for (var pd4RSi = 0; pd4RSi < pd4RSBr.length; pd4RSi++) {
+ if (pd4RSBr[pd4RSi].tag === "A0") { pd4RSA0 = true; pd4RSCk = BindEs10xSingleRequest.parseBerTlv(pd4RSBr[pd4RSi].value); }
+ if (pd4RSBr[pd4RSi].tag === "A1") { pd4RSA1 = true; pd4RSCk = BindEs10xSingleRequest.parseBerTlv(pd4RSBr[pd4RSi].value); }
+ }
+ var pd4RS30 = false, pd4RS5F37 = false, pd4RS80 = false, pd4RS02 = false;
+ for (var pd4RSj = 0; pd4RSj < pd4RSCk.length; pd4RSj++) {
+ if (pd4RSCk[pd4RSj].tag === "30") pd4RS30 = true;
+ if (pd4RSCk[pd4RSj].tag === "5F37") pd4RS5F37 = true;
+ if (pd4RSCk[pd4RSj].tag === "80") pd4RS80 = true;
+ if (pd4RSCk[pd4RSj].tag === "02") pd4RS02 = true;
+ }
+ var pd4RS5F49 = false;
+ if (pd4RS30) {
+ for (var pd4RSk = 0; pd4RSk < pd4RSCk.length; pd4RSk++) {
+ if (pd4RSCk[pd4RSk].tag !== "30") continue;
+ var pd4RSU = BindEs10xSingleRequest.parseBerTlv(pd4RSCk[pd4RSk].value);
+ for (var pd4RSm = 0; pd4RSm < pd4RSU.length; pd4RSm++) {
+ if (pd4RSU[pd4RSm].tag === "5F49") pd4RS5F49 = true;
+ if (pd4RSU[pd4RSm].tag === "80") pd4RS80 = true;
+ }
+ }
+ }
+ bind.checkData("S4-C2 R_PREP_DOWNLOAD response structure" + " (downloadResponseError or no data)", "1", (pd4RSOuter === "absent" || (pd4RSA1 && pd4RS80 && pd4RS02)) ? "1" : "0");
+ // S4-C3: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
+
+ // 步骤 5:SEQ05-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_134, RQ31_136, RQ57_025, RQ57_031, RQ57_036, RQ57_037, RQ57_038)
+ // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_INV_TRANS_ID;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
+ // 无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
+ // 错误注入变体(I_annexD3_es10x):cert=SGP.26 v1.5 变体物料声明面(input/PREP_DOWNLOAD_VARIANT_MATERIALS.json,sha256 锚编译期已核);ccRequiredFlag/签名形态按变体闭集定义。
+ var pd5Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
+ var pd5Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
+ var pd5Tid = "";
+ for (var pd5Ri = 0; pd5Ri < 16; pd5Ri++) {
+ pd5Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+ }
+ var pd5Sel = 0;
+ var pd5Sig1 = "";
+ var pd5Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+ if (pd5Sel < 0 || pd5Sig1 === "") {
+ // 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", "00"));
+ 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("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;downloadResponseError A1{transactionId 80, downloadErrorCode 02}):运行时域,仅结构与在场性断言。
+ 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 response structure" + " (downloadResponseError or no data)", "1", (pd5RSOuter === "absent" || (pd5RSA1 && pd5RS80 && pd5RS02)) ? "1" : "0");
+ // S5-C3: binding:prep_download_variant_tid_any_value_accepted(INVALID_TRANSACTION_ID|NO_AUTH;I_annexD3) (check_attestation)
+
+ // 步骤 6:SEQ06-IC3] MTD_STORE_DATA(tc_step)
+ // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
+ var sdCla6 = s14.chan !== null ? (s14.chan <= 3 ? 128 + s14.chan : 188 + s14.chan).toString(16).toUpperCase() : null;
+ var s6 = bind.sendApdu(sdCla6, "E2", "91", "00", "BF2000", "00", "9000");
+ bind.checkData("S6-C1 SW", "9000", s6.sw);
+ // geca-proc ES10b Info 响应面(R_EUICC_INFO1,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
+ var gw6 = BindGecaProc.parseGecaResponse(s6.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
+ bind.checkData("S6-C2 R_EUICC_INFO1 outer tag", "BF20", gw6.outer_tag === null ? "absent" : gw6.outer_tag);
+ bind.checkData("S6-C2 R_EUICC_INFO1 required members present", "1", gw6.ok ? "1" : "0");
+ // S6-C3: kind 'requirement' pattern '' has no static generation face (corpus vacuum; see CaseIR unresolved).
+ // S6-C3: binding:prep_download_ci_cert_selection(highest-priority-CI;SGP.26) (check_attestation)
+
+ // 步骤 7:SEQ06-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_136, RQ57_031, RQ57_026, RQ57_036, RQ57_037, RQ57_038)
+ // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_NO_AUTH;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
+ // 无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
+ // 错误注入变体(I_annexD3_es10x):cert=SGP.26 v1.5 变体物料声明面(input/PREP_DOWNLOAD_VARIANT_MATERIALS.json,sha256 锚编译期已核);ccRequiredFlag/签名形态按变体闭集定义。
+ var pd7Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
+ var pd7Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
+ var pd7Tid = "";
+ for (var pd7Ri = 0; pd7Ri < 16; pd7Ri++) {
+ pd7Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+ }
+ var pd7Sel = 0;
+ var pd7Sig1 = "";
+ var pd7Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+ 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", "00"));
+ 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("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;downloadResponseError A1{transactionId 80, downloadErrorCode 02}):运行时域,仅结构与在场性断言。
+ 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 response structure" + " (downloadResponseError or no data)", "1", (pd7RSOuter === "absent" || (pd7RSA1 && pd7RS80 && pd7RS02)) ? "1" : "0");
+ // S7-C3: binding:prep_download_variant_tid_any_value_accepted(INVALID_TRANSACTION_ID|NO_AUTH;I_annexD3) (check_attestation)
+
+ // 步骤 8:SEQ07-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_134, RQ31_136, RQ57_025, RQ57_031, RQ57_036, RQ57_037, RQ57_038, RQ45_006, RQ45_026_1, RQ45_026, RQ45_028)
+ // PREP_DOWNLOAD 运行时绑定(PREP_DOWN_INV_CURVE;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
+ // 无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
+ // 错误注入变体(I_annexD3_es10x):cert=SGP.26 v1.5 变体物料声明面(input/PREP_DOWNLOAD_VARIANT_MATERIALS.json,sha256 锚编译期已核);ccRequiredFlag/签名形态按变体闭集定义。
+ var pd8Certs = ["308201CFA00302010202020901300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430393135323333345A170D3330303430373135323333345A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3049301306072A8648CE3D020106082A8648CE3D03010103320004B833DE8CAA3B8C34F017E2336A1702CC316FDAC57970FB74FD1112F9538358F6311CAC726280875CD0F345ECD44BD0BDA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414B549B2F12BFB70B8BE103EA56ED9D8211E62AB89300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402207DF2501A65D3105451D3CE225FA4FA6B861363A9FEADB2225E1B201872F5DD0702205D68B00BE432A9E8EFBED6F1C1155586EE7DB29FC58F4CB4D9DE60C36705B919", "308201D0A00302010202020901300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430393135323333345A170D3330303430373135323333345A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B304A301406072A8648CE3D020106092B24030302080101030332000462864AE7B8A5376473177E86A09162C2BC6D14D05BF932EF50F92FA0BEBC693A19D21611B76C173AC397CD2B39B1C4AEA381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414E9B402A455F7CEA525A1565D167D94A30CB1A55E300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200D22D098327B7DE35E6AC1BCA12939B48869D0C76C38A5BBCE43397D7194FD4402200E562320249C7D596B850BC585E3D86A00CD7648B8D346D112A8EFED38938A03"];
+ var pd8Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
+ var pd8Tid = "";
+ for (var pd8Ri = 0; pd8Ri < 16; pd8Ri++) {
+ pd8Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+ }
+ var pd8Sel = 0;
+ var pd8Sig1 = "";
+ var pd8Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+ if (pd8Sel < 0 || pd8Sig1 === "") {
+ // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
+ bind.checkData("S8-C1 SW", "9000", "pd8_not_executed:cma_operands_absent");
+ bind.checkData("S8-C2 R_PREP_DOWNLOAD response structure", "1", "pd8_not_executed:cma_operands_absent");
+ } else {
+ bind.engine.InitEccDomainParams(pd8Dps[pd8Sel][0], pd8Dps[pd8Sel][1], pd8Dps[pd8Sel][2], pd8Dps[pd8Sel][3], pd8Dps[pd8Sel][4], 1);
+ var pd8S2 = BindEs10xSingleRequest.buildTlv("30",
+ BindEs10xSingleRequest.buildTlv("80", pd8Tid)
+ + BindEs10xSingleRequest.buildTlv("01", "00"));
+ var pd8Sgn = "";
+ while (pd8Sgn.length != 2 * pd8Sks[pd8Sel].length) {
+ bind.engine.SleepTime(2000);
+ pd8Sgn = bind.engine.EccSignData(pd8Sks[pd8Sel], pd8S2 + BindEs10xSingleRequest.buildTlv("5F37", pd8Sig1), 33);
+ }
+ var pd8Req = BindEs10xSingleRequest.buildTlv("BF21",
+ pd8S2
+ + BindEs10xSingleRequest.buildTlv("5F37", pd8Sgn)
+ + BindEs10xSingleRequest.buildTlv("30", pd8Certs[pd8Sel]));
+ var pd8Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+ {cla: "", ins: "E2", p1: "91", p2: "00", data: pd8Req,
+ le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+ var pd8Sw = (pd8Run.final && pd8Run.final.sw) ? pd8Run.final.sw : "transport_error";
+ bind.checkData("S8-C1 SW", "9000", pd8Sw);
+ // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
+ var pd8Otpk = "";
+ if (pd8Run.final && pd8Run.final.resp) {
+ var pd8L1 = BindEs10xSingleRequest.parseBerTlv(pd8Run.final.resp);
+ for (var pd8I1 = 0; pd8I1 < pd8L1.length && pd8Otpk === ""; pd8I1++) {
+ if (pd8L1[pd8I1].tag !== "BF21") continue;
+ var pd8L2 = BindEs10xSingleRequest.parseBerTlv(pd8L1[pd8I1].value);
+ for (var pd8I2 = 0; pd8I2 < pd8L2.length && pd8Otpk === ""; pd8I2++) {
+ if (pd8L2[pd8I2].tag !== "A0") continue;
+ var pd8L3 = BindEs10xSingleRequest.parseBerTlv(pd8L2[pd8I2].value);
+ for (var pd8I3 = 0; pd8I3 < pd8L3.length && pd8Otpk === ""; pd8I3++) {
+ if (pd8L3[pd8I3].tag !== "30") continue;
+ var pd8L4 = BindEs10xSingleRequest.parseBerTlv(pd8L3[pd8I3].value);
+ for (var pd8I4 = 0; pd8I4 < pd8L4.length; pd8I4++) {
+ if (pd8L4[pd8I4].tag === "5F49") pd8Otpk = pd8L4[pd8I4].value;
+ }
+ }
+ }
+ }
+ }
+ }
+ // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseError A1{transactionId 80, downloadErrorCode 02}):运行时域,仅结构与在场性断言。
+ var pd8RSR = (pd8Run.final && pd8Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd8Run.final.resp) : [];
+ var pd8RSOuter = pd8RSR.length === 1 ? pd8RSR[0].tag : "absent";
+ var pd8RSBr = pd8RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd8RSR[0].value) : [];
+ var pd8RSA0 = false, pd8RSA1 = false, pd8RSCk = [];
+ for (var pd8RSi = 0; pd8RSi < pd8RSBr.length; pd8RSi++) {
+ if (pd8RSBr[pd8RSi].tag === "A0") { pd8RSA0 = true; pd8RSCk = BindEs10xSingleRequest.parseBerTlv(pd8RSBr[pd8RSi].value); }
+ if (pd8RSBr[pd8RSi].tag === "A1") { pd8RSA1 = true; pd8RSCk = BindEs10xSingleRequest.parseBerTlv(pd8RSBr[pd8RSi].value); }
+ }
+ var pd8RS30 = false, pd8RS5F37 = false, pd8RS80 = false, pd8RS02 = false;
+ for (var pd8RSj = 0; pd8RSj < pd8RSCk.length; pd8RSj++) {
+ if (pd8RSCk[pd8RSj].tag === "30") pd8RS30 = true;
+ if (pd8RSCk[pd8RSj].tag === "5F37") pd8RS5F37 = true;
+ if (pd8RSCk[pd8RSj].tag === "80") pd8RS80 = true;
+ if (pd8RSCk[pd8RSj].tag === "02") pd8RS02 = true;
+ }
+ var pd8RS5F49 = false;
+ if (pd8RS30) {
+ for (var pd8RSk = 0; pd8RSk < pd8RSCk.length; pd8RSk++) {
+ if (pd8RSCk[pd8RSk].tag !== "30") continue;
+ var pd8RSU = BindEs10xSingleRequest.parseBerTlv(pd8RSCk[pd8RSk].value);
+ for (var pd8RSm = 0; pd8RSm < pd8RSU.length; pd8RSm++) {
+ if (pd8RSU[pd8RSm].tag === "5F49") pd8RS5F49 = true;
+ if (pd8RSU[pd8RSm].tag === "80") pd8RS80 = true;
+ }
+ }
+ }
+ bind.checkData("S8-C2 R_PREP_DOWNLOAD response structure" + " (downloadResponseError or no data)", "1", (pd8RSOuter === "absent" || (pd8RSA1 && pd8RS80 && pd8RS02)) ? "1" : "0");
+ // S8-C3: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
+
+ // 步骤 9:SEQ08-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_136, RQ57_027, RQ57_030, RQ57_031, RQ57_036, RQ57_037, RQ57_038, RQ45_006, RQ45_026_1, RQ45_026, RQ45_028, RQ45_030)
+ // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_INV_OID;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
+ // 无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
+ // 错误注入变体(I_annexD3_es10x):cert=SGP.26 v1.5 变体物料声明面(input/PREP_DOWNLOAD_VARIANT_MATERIALS.json,sha256 锚编译期已核);ccRequiredFlag/签名形态按变体闭集定义。
+ var pd9Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
+ var pd9Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
+ var pd9Tid = "";
+ for (var pd9Ri = 0; pd9Ri < 16; pd9Ri++) {
+ pd9Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+ }
+ var pd9Sel = 0;
+ var pd9Sig1 = "";
+ var pd9Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+ if (pd9Sel < 0 || pd9Sig1 === "") {
+ // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
+ bind.checkData("S9-C1 SW", "9000", "pd9_not_executed:cma_operands_absent");
+ bind.checkData("S9-C2 R_PREP_DOWNLOAD response structure", "1", "pd9_not_executed:cma_operands_absent");
+ } else {
+ bind.engine.InitEccDomainParams(pd9Dps[pd9Sel][0], pd9Dps[pd9Sel][1], pd9Dps[pd9Sel][2], pd9Dps[pd9Sel][3], pd9Dps[pd9Sel][4], 1);
+ var pd9S2 = BindEs10xSingleRequest.buildTlv("30",
+ BindEs10xSingleRequest.buildTlv("80", pd9Tid)
+ + BindEs10xSingleRequest.buildTlv("01", "00"));
+ var pd9Sgn = "";
+ while (pd9Sgn.length != 2 * pd9Sks[pd9Sel].length) {
+ bind.engine.SleepTime(2000);
+ pd9Sgn = bind.engine.EccSignData(pd9Sks[pd9Sel], pd9S2 + BindEs10xSingleRequest.buildTlv("5F37", pd9Sig1), 33);
+ }
+ var pd9Req = BindEs10xSingleRequest.buildTlv("BF21",
+ pd9S2
+ + BindEs10xSingleRequest.buildTlv("5F37", pd9Sgn)
+ + BindEs10xSingleRequest.buildTlv("30", pd9Certs[pd9Sel]));
+ var pd9Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+ {cla: "", ins: "E2", p1: "91", p2: "00", data: pd9Req,
+ le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+ var pd9Sw = (pd9Run.final && pd9Run.final.sw) ? pd9Run.final.sw : "transport_error";
+ bind.checkData("S9-C1 SW", "9000", pd9Sw);
+ // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
+ var pd9Otpk = "";
+ if (pd9Run.final && pd9Run.final.resp) {
+ var pd9L1 = BindEs10xSingleRequest.parseBerTlv(pd9Run.final.resp);
+ for (var pd9I1 = 0; pd9I1 < pd9L1.length && pd9Otpk === ""; pd9I1++) {
+ if (pd9L1[pd9I1].tag !== "BF21") continue;
+ var pd9L2 = BindEs10xSingleRequest.parseBerTlv(pd9L1[pd9I1].value);
+ for (var pd9I2 = 0; pd9I2 < pd9L2.length && pd9Otpk === ""; pd9I2++) {
+ if (pd9L2[pd9I2].tag !== "A0") continue;
+ var pd9L3 = BindEs10xSingleRequest.parseBerTlv(pd9L2[pd9I2].value);
+ for (var pd9I3 = 0; pd9I3 < pd9L3.length && pd9Otpk === ""; pd9I3++) {
+ if (pd9L3[pd9I3].tag !== "30") continue;
+ var pd9L4 = BindEs10xSingleRequest.parseBerTlv(pd9L3[pd9I3].value);
+ for (var pd9I4 = 0; pd9I4 < pd9L4.length; pd9I4++) {
+ if (pd9L4[pd9I4].tag === "5F49") pd9Otpk = pd9L4[pd9I4].value;
+ }
+ }
+ }
+ }
+ }
+ }
+ // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseError A1{transactionId 80, downloadErrorCode 02}):运行时域,仅结构与在场性断言。
+ var pd9RSR = (pd9Run.final && pd9Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd9Run.final.resp) : [];
+ var pd9RSOuter = pd9RSR.length === 1 ? pd9RSR[0].tag : "absent";
+ var pd9RSBr = pd9RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd9RSR[0].value) : [];
+ var pd9RSA0 = false, pd9RSA1 = false, pd9RSCk = [];
+ for (var pd9RSi = 0; pd9RSi < pd9RSBr.length; pd9RSi++) {
+ if (pd9RSBr[pd9RSi].tag === "A0") { pd9RSA0 = true; pd9RSCk = BindEs10xSingleRequest.parseBerTlv(pd9RSBr[pd9RSi].value); }
+ if (pd9RSBr[pd9RSi].tag === "A1") { pd9RSA1 = true; pd9RSCk = BindEs10xSingleRequest.parseBerTlv(pd9RSBr[pd9RSi].value); }
+ }
+ var pd9RS30 = false, pd9RS5F37 = false, pd9RS80 = false, pd9RS02 = false;
+ for (var pd9RSj = 0; pd9RSj < pd9RSCk.length; pd9RSj++) {
+ if (pd9RSCk[pd9RSj].tag === "30") pd9RS30 = true;
+ if (pd9RSCk[pd9RSj].tag === "5F37") pd9RS5F37 = true;
+ if (pd9RSCk[pd9RSj].tag === "80") pd9RS80 = true;
+ if (pd9RSCk[pd9RSj].tag === "02") pd9RS02 = true;
+ }
+ var pd9RS5F49 = false;
+ if (pd9RS30) {
+ for (var pd9RSk = 0; pd9RSk < pd9RSCk.length; pd9RSk++) {
+ if (pd9RSCk[pd9RSk].tag !== "30") continue;
+ var pd9RSU = BindEs10xSingleRequest.parseBerTlv(pd9RSCk[pd9RSk].value);
+ for (var pd9RSm = 0; pd9RSm < pd9RSU.length; pd9RSm++) {
+ if (pd9RSU[pd9RSm].tag === "5F49") pd9RS5F49 = true;
+ if (pd9RSU[pd9RSm].tag === "80") pd9RS80 = true;
+ }
+ }
+ }
+ bind.checkData("S9-C2 R_PREP_DOWNLOAD response structure" + " (downloadResponseError or no data)", "1", (pd9RSOuter === "absent" || (pd9RSA1 && pd9RS80 && pd9RS02)) ? "1" : "0");
+ // S9-C3: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
}