eSIM RSP 测试用例对比站

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

源码对照:4.2.10.2.2

ES10b 下载准备(Brainpool 曲线) / TC_eUICC_ES10b.PrepareDownloadBRP

左侧为人工切片入口(-man,来自 原料/切片 的最小可执行脚本),右侧为 Cas 盲生成入口(-cas,仅依据规范生成)。文件按原始编码(多为 GBK)解码为 UTF-8 显示,行号自 1 起;字节级原文与 sha256 见两侧脚本包。完整 unified diff 见本页底部折叠区,以及 报告原文 §4。
-man 入口
Import/TestCase_SGP_23.js
163 行 / 5927 字符 / gb18030
-cas 入口
TC_eUICC_ES10b_PrepareDownloadBRP/Import/TC_eUICC_ES10b_PrepareDownloadBRP.js
303 行 / 31022 字符 / gb18030
默认折行显示长行;取消勾选可横向滚动查看原始行宽
-man 人工切片Import/TestCase_SGP_23.js163 行 / 5927 字符 / gb18030入口函数 @L3
1// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10b_PrepareDownloadBRP_01_Nominal_Without_Confirmation_Code + TC_eUICC_ES10b_PrepareDownloadBRP_02_Nominal_With_Confirmation_Code + TC_eUICC_ES10b_PrepareDownloadBRP_03_Nominal_With_an_unknown_otPK_EUICC_ECKA + TC_eUICC_ES10b_PrepareDownload_01_Nominal_Without_Confirmation_Code + TC_eUICC_ES10b_PrepareDownload_02_Nominal_With_Confirmation_Code + TC_eUICC_ES10b_PrepareDownload_03_Nominal_With_an_unknown_otPK_EUICC_ECKA (extracted verbatim)
2
3function TC_eUICC_ES10b_PrepareDownloadBRP_01_Nominal_Without_Confirmation_Code()
4{
5	if(!Card_Have_ECC_Cert)
6		return;
7	
8	//测试入口条件
9	if(!check_Applicability_of_tests_RSP_SGP23_test("C002"))
10		return;
11	
12	pkId_CI_ForVerification = pkId_CI_ECDSA_BRP;
13	pkId_CI_ForSigning = pkId_CI_ECDSA_BRP;
14	
15	TC_eUICC_ES10b_PrepareDownload_01_Nominal_Without_Confirmation_Code();
16}
17
18function TC_eUICC_ES10b_PrepareDownloadBRP_02_Nominal_With_Confirmation_Code()
19{
20	if(!Card_Have_ECC_Cert)
21		return;
22	
23	//测试入口条件
24	if(!check_Applicability_of_tests_RSP_SGP23_test("C002"))
25		return;
26	
27	pkId_CI_ForVerification = pkId_CI_ECDSA_BRP;
28	pkId_CI_ForSigning = pkId_CI_ECDSA_BRP;
29	
30	TC_eUICC_ES10b_PrepareDownload_02_Nominal_With_Confirmation_Code();
31}
32
33function TC_eUICC_ES10b_PrepareDownloadBRP_03_Nominal_With_an_unknown_otPK_EUICC_ECKA()
34{
35	if(!Card_Have_ECC_Cert)
36		return;
37	
38	//测试入口条件
39	if(!check_Applicability_of_tests_RSP_SGP23_test("C002"))
40		return;
41	
42	pkId_CI_ForVerification = pkId_CI_ECDSA_BRP;
43	pkId_CI_ForSigning = pkId_CI_ECDSA_BRP;
44	
45	TC_eUICC_ES10b_PrepareDownload_03_Nominal_With_an_unknown_otPK_EUICC_ECKA();
46}
47
48function TC_eUICC_ES10b_PrepareDownload_01_Nominal_Without_Confirmation_Code()
49{
50	tracenamestr = "测试目的:PrepareDownload数据中不包含Confirmation Code";
51	curDis.TraceStart(sno++,tracenamestr);
52
53	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
54	Ini_powerOn_eUICC_LPAe_not_activate();
55	
56	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
57	TS_MANAGE_CHANNEL_OPEN();
58	
59	curLogicChannel = 1;
60	
61	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
62	TS_SELECT("Select ISD",ISD_R_AID,"9000");
63	
64	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
65	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
66	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
67	Profile_load_procedure.ES10b_GetEUICCInfo1();
68	
69	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
70	Profile_load_procedure.ES10b_GetEUICCChallenge();
71	
72	
73	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
74	Profile_load_procedure.ES10b_AuthenticateServer();
75	
76	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,不包含Confirmation Code;");
77	Profile_load_procedure.ES10b_PrepareDownload();
78	
79	RecoverCard();
80	
81}
82
83function TC_eUICC_ES10b_PrepareDownload_02_Nominal_With_Confirmation_Code()
84{
85	tracenamestr = "测试目的:PrepareDownload数据中包含Confirmation Code";
86	curDis.TraceStart(sno++,tracenamestr);
87
88	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
89	Ini_powerOn_eUICC_LPAe_not_activate();
90	
91	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
92	TS_MANAGE_CHANNEL_OPEN();
93	
94	curLogicChannel = 1;
95	
96	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
97	TS_SELECT("Select ISD",ISD_R_AID,"9000");
98	
99	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
100	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
101	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
102	Profile_load_procedure.ES10b_GetEUICCInfo1();
103	
104	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
105	Profile_load_procedure.ES10b_GetEUICCChallenge();
106
107	
108	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
109	Profile_load_procedure.ES10b_AuthenticateServer();
110	
111	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,包含Confirmation Code;");
112	Profile_load_procedure.ccRequiredFlag = "FF";
113	Profile_load_procedure.hashcc = curStrHandle.RandHexStr(32);
114	Profile_load_procedure.ES10b_PrepareDownload();
115	
116	RecoverCard();
117	
118}
119
120function TC_eUICC_ES10b_PrepareDownload_03_Nominal_With_an_unknown_otPK_EUICC_ECKA()
121{
122	tracenamestr = "测试目的:使用未定义的otPK.EUICC.ECKA,eUICC重新生成一组新的otPK.EUICC.ECKA密钥";
123	curDis.TraceStart(sno++,tracenamestr);
124
125	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
126	Ini_powerOn_eUICC_LPAe_not_activate();
127	
128	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
129	TS_MANAGE_CHANNEL_OPEN();
130	
131	curLogicChannel = 1;
132	
133	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
134	TS_SELECT("Select ISD",ISD_R_AID,"9000");
135	
136	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
137	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
138	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
139	Profile_load_procedure.ES10b_GetEUICCInfo1();
140	
141
142	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
143	Profile_load_procedure.ES10b_GetEUICCChallenge();
144	
145	
146	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
147	Profile_load_procedure.ES10b_AuthenticateServer();
148	
149	var chash1 = curStrHandle.RandHexStr(32);
150	var cureuiccOtpk = "04" + curStrHandle.RandHexStr(64);
151	
152	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,包含Confirmation Code,bppEuiccOtpk为使用随机的的EuiccOtpk;");
153	Profile_load_procedure.ccRequiredFlag = "FF";
154	Profile_load_procedure.hashcc = chash1;
155	Profile_load_procedure.euiccOtpk = cureuiccOtpk;
156	Profile_load_procedure.ES10b_PrepareDownload();
157	
158	if (cureuiccOtpk == Profile_load_procedure.euiccOtpk)
159		obj.SubLevelError("期望eUICC重新生成一组新的otPK.EUICC.ECKA密钥");
160	
161	RecoverCard();
162}
163
-cas 盲生成TC_eUICC_ES10b_PrepareDownloadBRP/Import/TC_eUICC_ES10b_PrepareDownloadBRP.js303 行 / 31022 字符 / gb18030入口函数 @L19
1// Author: 卡思Cas智能体
2// Date: 20261005-152741
3// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10b.PrepareDownloadBRP,Test Sequence #01-#03 Nominal (all 3 sequences, inherited from 4.2.10.2.1 with BrainpoolP256r1 substitution),适用性 C002。
4// Test points: S1-C1 SW;S1-C2 R_PREP_DOWNLOAD response structure;S1-C2 R_PREP_DOWNLOAD outer tag
5//   S1-C2 R_PREP_DOWNLOAD required members present;S2-C1 SW
6//   S2-C2 R_PREP_DOWNLOAD response structure;S2-C2 R_PREP_DOWNLOAD outer tag
7//   S2-C2 R_PREP_DOWNLOAD required members present;S3-C1 SW
8//   S3-C2 R_PREP_DOWNLOAD response structure;S3-C2 R_PREP_DOWNLOAD outer tag
9//   S3-C2 R_PREP_DOWNLOAD required members present
10// 本函数由 CaseIR 4.2.10.2.2 编译生成(fullwave-blindgen-live-70-W1-laneA2,SGP.23 v1.16 × SGP.22 v2.7):字节权威=CaseIR,非誊录黄金脚本。
11// Value-free template: every data byte is injected from CaseIR fields; no scaffold globals (see docs/speconly/compile-symbol-migration.md).
12// 适用性 C002:编译期门,运行时由 harness 环境前置承担。
13// PRECONDITION (declared, NOT compiled): initial_conditions 缺语料过程体(Annex C.2 absent from input package, corpus vacuum): IC 序列属测试工具/卡态编排责任,本脚本不虚构初始化步骤;语义影响见 CaseIR open_items。
14// TC-GEN-1 eUICC: The PROFILE_OPERATIONAL1 is not loaded on the eUICC.: declared unexpanded (no fabricated bytes; provenance = expansion_source).
15// 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 已发送;签名与验证选用同一基于 BrainpoolP256r1 的 GSMA CI。: declared unexpanded (no fabricated bytes; provenance = expansion_source).
16// SEQ02-IC1 <S_HASHED_CC> = MTD_GENERATE_HASHED_CC(#CONFIRMATION_CODE1, <S_TRANSACTION_ID>)(继承 4.2.10.2.1 SEQ02-IC1;测试工具侧计算,H_annexC1_methods 表1228): declared unexpanded (no fabricated bytes; provenance = expansion_source).
17// SEQ03-IC1 <S_HASHED_CC> = MTD_GENERATE_HASHED_CC(#CONFIRMATION_CODE1, <S_TRANSACTION_ID>)(继承 4.2.10.2.1 SEQ03-IC1): declared unexpanded (no fabricated bytes; provenance = expansion_source).
18// SEQ03-IC2 S_SM-DP+ generates a random <OTPK_EUICC_ECKA>(继承 4.2.10.2.1 SEQ03-IC2;与 eUICC 存储的一次性密钥对不对应): declared unexpanded (no fabricated bytes; provenance = expansion_source).
19function TC_eUICC_ES10b_PrepareDownloadBRP_01_03_merged() {
20    var bind = curBind;
21
22    // 步骤 1:SEQ01-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030, RQ26_011, RQ26_034, RQ26_035, RQ31_062)
23    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_NO_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
24    //   无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
25    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
26    var pd1Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
27    var pd1Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
28    var pd1Tid = "";
29    for (var pd1Ri = 0; pd1Ri < 16; pd1Ri++) {
30        pd1Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
31    }
32    var pd1Sel = 0;
33    var pd1Sig1 = "";
34    var pd1Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
35    if (pd1Sel < 0 || pd1Sig1 === "") {
36        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
37        bind.checkData("S1-C1 SW", "9000", "pd1_not_executed:cma_operands_absent");
38        bind.checkData("S1-C2 R_PREP_DOWNLOAD response structure", "1", "pd1_not_executed:cma_operands_absent");
39    } else {
40        bind.engine.InitEccDomainParams(pd1Dps[pd1Sel][0], pd1Dps[pd1Sel][1], pd1Dps[pd1Sel][2], pd1Dps[pd1Sel][3], pd1Dps[pd1Sel][4], 1);
41        var pd1S2 = BindEs10xSingleRequest.buildTlv("30",
42            BindEs10xSingleRequest.buildTlv("80", pd1Tid)
43            + BindEs10xSingleRequest.buildTlv("01", "00"));
44        var pd1Sgn = "";
45        while (pd1Sgn.length != 2 * pd1Sks[pd1Sel].length) {
46            bind.engine.SleepTime(2000);
47            pd1Sgn = bind.engine.EccSignData(pd1Sks[pd1Sel], pd1S2 + BindEs10xSingleRequest.buildTlv("5F37", pd1Sig1), 33);
48        }
49        var pd1Req = BindEs10xSingleRequest.buildTlv("BF21",
50            pd1S2
51            + BindEs10xSingleRequest.buildTlv("5F37", pd1Sgn)
52            + BindEs10xSingleRequest.buildTlv("30", pd1Certs[pd1Sel]));
53        var pd1Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
54            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd1Req,
55             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
56        var pd1Sw = (pd1Run.final && pd1Run.final.sw) ? pd1Run.final.sw : "transport_error";
57        bind.checkData("S1-C1 SW", "9000", pd1Sw);
58        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
59        var pd1Otpk = "";
60        if (pd1Run.final && pd1Run.final.resp) {
61            var pd1L1 = BindEs10xSingleRequest.parseBerTlv(pd1Run.final.resp);
62            for (var pd1I1 = 0; pd1I1 < pd1L1.length && pd1Otpk === ""; pd1I1++) {
63                if (pd1L1[pd1I1].tag !== "BF21") continue;
64                var pd1L2 = BindEs10xSingleRequest.parseBerTlv(pd1L1[pd1I1].value);
65                for (var pd1I2 = 0; pd1I2 < pd1L2.length && pd1Otpk === ""; pd1I2++) {
66                    if (pd1L2[pd1I2].tag !== "A0") continue;
67                    var pd1L3 = BindEs10xSingleRequest.parseBerTlv(pd1L2[pd1I2].value);
68                    for (var pd1I3 = 0; pd1I3 < pd1L3.length && pd1Otpk === ""; pd1I3++) {
69                        if (pd1L3[pd1I3].tag !== "30") continue;
70                        var pd1L4 = BindEs10xSingleRequest.parseBerTlv(pd1L3[pd1I3].value);
71                        for (var pd1I4 = 0; pd1I4 < pd1L4.length; pd1I4++) {
72                            if (pd1L4[pd1I4].tag === "5F49") pd1Otpk = pd1L4[pd1I4].value;
73                        }
74                    }
75                }
76            }
77        }
78    }
79    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
80    var pd1RSR = (pd1Run.final && pd1Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd1Run.final.resp) : [];
81    var pd1RSOuter = pd1RSR.length === 1 ? pd1RSR[0].tag : "absent";
82    var pd1RSBr = pd1RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd1RSR[0].value) : [];
83    var pd1RSA0 = false, pd1RSA1 = false, pd1RSCk = [];
84    for (var pd1RSi = 0; pd1RSi < pd1RSBr.length; pd1RSi++) {
85        if (pd1RSBr[pd1RSi].tag === "A0") { pd1RSA0 = true; pd1RSCk = BindEs10xSingleRequest.parseBerTlv(pd1RSBr[pd1RSi].value); }
86        if (pd1RSBr[pd1RSi].tag === "A1") { pd1RSA1 = true; pd1RSCk = BindEs10xSingleRequest.parseBerTlv(pd1RSBr[pd1RSi].value); }
87    }
88    var pd1RS30 = false, pd1RS5F37 = false, pd1RS80 = false, pd1RS02 = false;
89    for (var pd1RSj = 0; pd1RSj < pd1RSCk.length; pd1RSj++) {
90        if (pd1RSCk[pd1RSj].tag === "30") pd1RS30 = true;
91        if (pd1RSCk[pd1RSj].tag === "5F37") pd1RS5F37 = true;
92        if (pd1RSCk[pd1RSj].tag === "80") pd1RS80 = true;
93        if (pd1RSCk[pd1RSj].tag === "02") pd1RS02 = true;
94    }
95    var pd1RS5F49 = false;
96    if (pd1RS30) {
97        for (var pd1RSk = 0; pd1RSk < pd1RSCk.length; pd1RSk++) {
98            if (pd1RSCk[pd1RSk].tag !== "30") continue;
99            var pd1RSU = BindEs10xSingleRequest.parseBerTlv(pd1RSCk[pd1RSk].value);
100            for (var pd1RSm = 0; pd1RSm < pd1RSU.length; pd1RSm++) {
101                if (pd1RSU[pd1RSm].tag === "5F49") pd1RS5F49 = true;
102                if (pd1RSU[pd1RSm].tag === "80") pd1RS80 = true;
103            }
104        }
105    }
106    bind.checkData("S1-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd1RSOuter);
107    bind.checkData("S1-C2 R_PREP_DOWNLOAD required members present", "1", (pd1RSA0 && pd1RS30 && pd1RS80 && pd1RS5F49 && pd1RS5F37) ? "1" : "0");
108    // S1-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
109    // S1-C4: binding:prep_download_material_curve_family(BrainpoolP256r1;valid_sets) (check_attestation)
110    // S1-C5: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
111
112    // 步骤 2:SEQ02-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030, RQ26_011, RQ26_034, RQ26_035, RQ31_062)
113    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_WITH_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
114    //   无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
115    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
116    var pd2Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
117    var pd2Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
118    var pd2Tid = "";
119    for (var pd2Ri = 0; pd2Ri < 16; pd2Ri++) {
120        pd2Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
121    }
122    var pd2Sel = 0;
123    var pd2Sig1 = "";
124    var pd2Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
125    var pd2CcH = bind.engine.Sha256("30313032303330343035", 20);
126    var pd2HashCc = bind.engine.Sha256(pd2CcH + pd2Tid, (pd2CcH + pd2Tid).length);
127    if (pd2Sel < 0 || pd2Sig1 === "") {
128        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
129        bind.checkData("S2-C1 SW", "9000", "pd2_not_executed:cma_operands_absent");
130        bind.checkData("S2-C2 R_PREP_DOWNLOAD response structure", "1", "pd2_not_executed:cma_operands_absent");
131    } else {
132        bind.engine.InitEccDomainParams(pd2Dps[pd2Sel][0], pd2Dps[pd2Sel][1], pd2Dps[pd2Sel][2], pd2Dps[pd2Sel][3], pd2Dps[pd2Sel][4], 1);
133        var pd2S2 = BindEs10xSingleRequest.buildTlv("30",
134            BindEs10xSingleRequest.buildTlv("80", pd2Tid)
135            + BindEs10xSingleRequest.buildTlv("01", "FF"));
136        var pd2Sgn = "";
137        while (pd2Sgn.length != 2 * pd2Sks[pd2Sel].length) {
138            bind.engine.SleepTime(2000);
139            pd2Sgn = bind.engine.EccSignData(pd2Sks[pd2Sel], pd2S2 + BindEs10xSingleRequest.buildTlv("5F37", pd2Sig1), 33);
140        }
141        var pd2Req = BindEs10xSingleRequest.buildTlv("BF21",
142            pd2S2
143            + BindEs10xSingleRequest.buildTlv("5F37", pd2Sgn)
144            + BindEs10xSingleRequest.buildTlv("04", pd2HashCc)
145            + BindEs10xSingleRequest.buildTlv("30", pd2Certs[pd2Sel]));
146        var pd2Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
147            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd2Req,
148             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
149        var pd2Sw = (pd2Run.final && pd2Run.final.sw) ? pd2Run.final.sw : "transport_error";
150        bind.checkData("S2-C1 SW", "9000", pd2Sw);
151        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
152        var pd2Otpk = "";
153        if (pd2Run.final && pd2Run.final.resp) {
154            var pd2L1 = BindEs10xSingleRequest.parseBerTlv(pd2Run.final.resp);
155            for (var pd2I1 = 0; pd2I1 < pd2L1.length && pd2Otpk === ""; pd2I1++) {
156                if (pd2L1[pd2I1].tag !== "BF21") continue;
157                var pd2L2 = BindEs10xSingleRequest.parseBerTlv(pd2L1[pd2I1].value);
158                for (var pd2I2 = 0; pd2I2 < pd2L2.length && pd2Otpk === ""; pd2I2++) {
159                    if (pd2L2[pd2I2].tag !== "A0") continue;
160                    var pd2L3 = BindEs10xSingleRequest.parseBerTlv(pd2L2[pd2I2].value);
161                    for (var pd2I3 = 0; pd2I3 < pd2L3.length && pd2Otpk === ""; pd2I3++) {
162                        if (pd2L3[pd2I3].tag !== "30") continue;
163                        var pd2L4 = BindEs10xSingleRequest.parseBerTlv(pd2L3[pd2I3].value);
164                        for (var pd2I4 = 0; pd2I4 < pd2L4.length; pd2I4++) {
165                            if (pd2L4[pd2I4].tag === "5F49") pd2Otpk = pd2L4[pd2I4].value;
166                        }
167                    }
168                }
169            }
170        }
171    }
172    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
173    var pd2RSR = (pd2Run.final && pd2Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd2Run.final.resp) : [];
174    var pd2RSOuter = pd2RSR.length === 1 ? pd2RSR[0].tag : "absent";
175    var pd2RSBr = pd2RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd2RSR[0].value) : [];
176    var pd2RSA0 = false, pd2RSA1 = false, pd2RSCk = [];
177    for (var pd2RSi = 0; pd2RSi < pd2RSBr.length; pd2RSi++) {
178        if (pd2RSBr[pd2RSi].tag === "A0") { pd2RSA0 = true; pd2RSCk = BindEs10xSingleRequest.parseBerTlv(pd2RSBr[pd2RSi].value); }
179        if (pd2RSBr[pd2RSi].tag === "A1") { pd2RSA1 = true; pd2RSCk = BindEs10xSingleRequest.parseBerTlv(pd2RSBr[pd2RSi].value); }
180    }
181    var pd2RS30 = false, pd2RS5F37 = false, pd2RS80 = false, pd2RS02 = false;
182    for (var pd2RSj = 0; pd2RSj < pd2RSCk.length; pd2RSj++) {
183        if (pd2RSCk[pd2RSj].tag === "30") pd2RS30 = true;
184        if (pd2RSCk[pd2RSj].tag === "5F37") pd2RS5F37 = true;
185        if (pd2RSCk[pd2RSj].tag === "80") pd2RS80 = true;
186        if (pd2RSCk[pd2RSj].tag === "02") pd2RS02 = true;
187    }
188    var pd2RS5F49 = false;
189    if (pd2RS30) {
190        for (var pd2RSk = 0; pd2RSk < pd2RSCk.length; pd2RSk++) {
191            if (pd2RSCk[pd2RSk].tag !== "30") continue;
192            var pd2RSU = BindEs10xSingleRequest.parseBerTlv(pd2RSCk[pd2RSk].value);
193            for (var pd2RSm = 0; pd2RSm < pd2RSU.length; pd2RSm++) {
194                if (pd2RSU[pd2RSm].tag === "5F49") pd2RS5F49 = true;
195                if (pd2RSU[pd2RSm].tag === "80") pd2RS80 = true;
196            }
197        }
198    }
199    bind.checkData("S2-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd2RSOuter);
200    bind.checkData("S2-C2 R_PREP_DOWNLOAD required members present", "1", (pd2RSA0 && pd2RS30 && pd2RS80 && pd2RS5F49 && pd2RS5F37) ? "1" : "0");
201    // S2-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
202    // S2-C4: binding:prep_download_material_curve_family(BrainpoolP256r1;valid_sets) (check_attestation)
203    // S2-C5: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
204    // S2-C6: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
205
206    // 步骤 3:SEQ03-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ31_138, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ57_033, RQ26_029, RQ26_030, RQ26_011, RQ26_034, RQ26_035)
207    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_RETRY_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
208    //   无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
209    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
210    var pd3Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
211    var pd3Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
212    var pd3Tid = "";
213    for (var pd3Ri = 0; pd3Ri < 16; pd3Ri++) {
214        pd3Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
215    }
216    var pd3Sel = 0;
217    var pd3Sig1 = "";
218    var pd3Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
219    var pd3OtpkRef = (typeof pd2Otpk !== "undefined") ? pd2Otpk : "";
220    var pd3CcH = bind.engine.Sha256("30313032303330343035", 20);
221    var pd3HashCc = bind.engine.Sha256(pd3CcH + pd3Tid, (pd3CcH + pd3Tid).length);
222    if (pd3Sel < 0 || pd3Sig1 === "" || pd3OtpkRef === "") {
223        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
224        bind.checkData("S3-C1 SW", "9000", "pd3_not_executed:cma_operands_absent");
225        bind.checkData("S3-C2 R_PREP_DOWNLOAD response structure", "1", "pd3_not_executed:cma_operands_absent");
226    } else {
227        bind.engine.InitEccDomainParams(pd3Dps[pd3Sel][0], pd3Dps[pd3Sel][1], pd3Dps[pd3Sel][2], pd3Dps[pd3Sel][3], pd3Dps[pd3Sel][4], 1);
228        var pd3S2 = BindEs10xSingleRequest.buildTlv("30",
229            BindEs10xSingleRequest.buildTlv("80", pd3Tid)
230            + BindEs10xSingleRequest.buildTlv("01", "FF")
231            + BindEs10xSingleRequest.buildTlv("5F49", pd3OtpkRef));
232        var pd3Sgn = "";
233        while (pd3Sgn.length != 2 * pd3Sks[pd3Sel].length) {
234            bind.engine.SleepTime(2000);
235            pd3Sgn = bind.engine.EccSignData(pd3Sks[pd3Sel], pd3S2 + BindEs10xSingleRequest.buildTlv("5F37", pd3Sig1), 33);
236        }
237        var pd3Req = BindEs10xSingleRequest.buildTlv("BF21",
238            pd3S2
239            + BindEs10xSingleRequest.buildTlv("5F37", pd3Sgn)
240            + BindEs10xSingleRequest.buildTlv("04", pd3HashCc)
241            + BindEs10xSingleRequest.buildTlv("30", pd3Certs[pd3Sel]));
242        var pd3Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
243            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd3Req,
244             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
245        var pd3Sw = (pd3Run.final && pd3Run.final.sw) ? pd3Run.final.sw : "transport_error";
246        bind.checkData("S3-C1 SW", "9000", pd3Sw);
247        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
248        var pd3Otpk = "";
249        if (pd3Run.final && pd3Run.final.resp) {
250            var pd3L1 = BindEs10xSingleRequest.parseBerTlv(pd3Run.final.resp);
251            for (var pd3I1 = 0; pd3I1 < pd3L1.length && pd3Otpk === ""; pd3I1++) {
252                if (pd3L1[pd3I1].tag !== "BF21") continue;
253                var pd3L2 = BindEs10xSingleRequest.parseBerTlv(pd3L1[pd3I1].value);
254                for (var pd3I2 = 0; pd3I2 < pd3L2.length && pd3Otpk === ""; pd3I2++) {
255                    if (pd3L2[pd3I2].tag !== "A0") continue;
256                    var pd3L3 = BindEs10xSingleRequest.parseBerTlv(pd3L2[pd3I2].value);
257                    for (var pd3I3 = 0; pd3I3 < pd3L3.length && pd3Otpk === ""; pd3I3++) {
258                        if (pd3L3[pd3I3].tag !== "30") continue;
259                        var pd3L4 = BindEs10xSingleRequest.parseBerTlv(pd3L3[pd3I3].value);
260                        for (var pd3I4 = 0; pd3I4 < pd3L4.length; pd3I4++) {
261                            if (pd3L4[pd3I4].tag === "5F49") pd3Otpk = pd3L4[pd3I4].value;
262                        }
263                    }
264                }
265            }
266        }
267    }
268    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
269    var pd3RSR = (pd3Run.final && pd3Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd3Run.final.resp) : [];
270    var pd3RSOuter = pd3RSR.length === 1 ? pd3RSR[0].tag : "absent";
271    var pd3RSBr = pd3RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd3RSR[0].value) : [];
272    var pd3RSA0 = false, pd3RSA1 = false, pd3RSCk = [];
273    for (var pd3RSi = 0; pd3RSi < pd3RSBr.length; pd3RSi++) {
274        if (pd3RSBr[pd3RSi].tag === "A0") { pd3RSA0 = true; pd3RSCk = BindEs10xSingleRequest.parseBerTlv(pd3RSBr[pd3RSi].value); }
275        if (pd3RSBr[pd3RSi].tag === "A1") { pd3RSA1 = true; pd3RSCk = BindEs10xSingleRequest.parseBerTlv(pd3RSBr[pd3RSi].value); }
276    }
277    var pd3RS30 = false, pd3RS5F37 = false, pd3RS80 = false, pd3RS02 = false;
278    for (var pd3RSj = 0; pd3RSj < pd3RSCk.length; pd3RSj++) {
279        if (pd3RSCk[pd3RSj].tag === "30") pd3RS30 = true;
280        if (pd3RSCk[pd3RSj].tag === "5F37") pd3RS5F37 = true;
281        if (pd3RSCk[pd3RSj].tag === "80") pd3RS80 = true;
282        if (pd3RSCk[pd3RSj].tag === "02") pd3RS02 = true;
283    }
284    var pd3RS5F49 = false;
285    if (pd3RS30) {
286        for (var pd3RSk = 0; pd3RSk < pd3RSCk.length; pd3RSk++) {
287            if (pd3RSCk[pd3RSk].tag !== "30") continue;
288            var pd3RSU = BindEs10xSingleRequest.parseBerTlv(pd3RSCk[pd3RSk].value);
289            for (var pd3RSm = 0; pd3RSm < pd3RSU.length; pd3RSm++) {
290                if (pd3RSU[pd3RSm].tag === "5F49") pd3RS5F49 = true;
291                if (pd3RSU[pd3RSm].tag === "80") pd3RS80 = true;
292            }
293        }
294    }
295    bind.checkData("S3-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd3RSOuter);
296    bind.checkData("S3-C2 R_PREP_DOWNLOAD required members present", "1", (pd3RSA0 && pd3RS30 && pd3RS80 && pd3RS5F49 && pd3RS5F37) ? "1" : "0");
297    // S3-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
298    // S3-C4: binding:prep_download_material_curve_family(BrainpoolP256r1;valid_sets) (check_attestation)
299    // S3-C5: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
300    // S3-C6: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
301    // S3-C7: binding:prep_download_retry_new_otpk_distinct(previous-5F49;RQ57_033/RQ31_138) (check_attestation)
302}
303

完整 unified diff

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

展开 diff(464 行)
--- -man
+++ -cas
@@ -1,163 +1,303 @@
-// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10b_PrepareDownloadBRP_01_Nominal_Without_Confirmation_Code + TC_eUICC_ES10b_PrepareDownloadBRP_02_Nominal_With_Confirmation_Code + TC_eUICC_ES10b_PrepareDownloadBRP_03_Nominal_With_an_unknown_otPK_EUICC_ECKA + TC_eUICC_ES10b_PrepareDownload_01_Nominal_Without_Confirmation_Code + TC_eUICC_ES10b_PrepareDownload_02_Nominal_With_Confirmation_Code + TC_eUICC_ES10b_PrepareDownload_03_Nominal_With_an_unknown_otPK_EUICC_ECKA (extracted verbatim)
+// Author: 卡思Cas智能体
+// Date: 20261005-152741
+// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10b.PrepareDownloadBRP,Test Sequence #01-#03 Nominal (all 3 sequences, inherited from 4.2.10.2.1 with BrainpoolP256r1 substitution),适用性 C002。
+// Test points: S1-C1 SW;S1-C2 R_PREP_DOWNLOAD response structure;S1-C2 R_PREP_DOWNLOAD outer tag
+//   S1-C2 R_PREP_DOWNLOAD required members present;S2-C1 SW
+//   S2-C2 R_PREP_DOWNLOAD response structure;S2-C2 R_PREP_DOWNLOAD outer tag
+//   S2-C2 R_PREP_DOWNLOAD required members present;S3-C1 SW
+//   S3-C2 R_PREP_DOWNLOAD response structure;S3-C2 R_PREP_DOWNLOAD outer tag
+//   S3-C2 R_PREP_DOWNLOAD required members present
+// 本函数由 CaseIR 4.2.10.2.2 编译生成(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).
+// 适用性 C002:编译期门,运行时由 harness 环境前置承担。
+// PRECONDITION (declared, NOT compiled): initial_conditions 缺语料过程体(Annex C.2 absent from input package, corpus vacuum): IC 序列属测试工具/卡态编排责任,本脚本不虚构初始化步骤;语义影响见 CaseIR open_items。
+// TC-GEN-1 eUICC: The PROFILE_OPERATIONAL1 is not loaded on the eUICC.: declared unexpanded (no fabricated bytes; provenance = expansion_source).
+// 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 已发送;签名与验证选用同一基于 BrainpoolP256r1 的 GSMA CI。: declared unexpanded (no fabricated bytes; provenance = expansion_source).
+// SEQ02-IC1 <S_HASHED_CC> = MTD_GENERATE_HASHED_CC(#CONFIRMATION_CODE1, <S_TRANSACTION_ID>)(继承 4.2.10.2.1 SEQ02-IC1;测试工具侧计算,H_annexC1_methods 表1228): declared unexpanded (no fabricated bytes; provenance = expansion_source).
+// SEQ03-IC1 <S_HASHED_CC> = MTD_GENERATE_HASHED_CC(#CONFIRMATION_CODE1, <S_TRANSACTION_ID>)(继承 4.2.10.2.1 SEQ03-IC1): declared unexpanded (no fabricated bytes; provenance = expansion_source).
+// SEQ03-IC2 S_SM-DP+ generates a random <OTPK_EUICC_ECKA>(继承 4.2.10.2.1 SEQ03-IC2;与 eUICC 存储的一次性密钥对不对应): declared unexpanded (no fabricated bytes; provenance = expansion_source).
+function TC_eUICC_ES10b_PrepareDownloadBRP_01_03_merged() {
+    var bind = curBind;
 
-function TC_eUICC_ES10b_PrepareDownloadBRP_01_Nominal_Without_Confirmation_Code()
-{
-	if(!Card_Have_ECC_Cert)
-		return;
-	
-	//测试入口条件
-	if(!check_Applicability_of_tests_RSP_SGP23_test("C002"))
-		return;
-	
-	pkId_CI_ForVerification = pkId_CI_ECDSA_BRP;
-	pkId_CI_ForSigning = pkId_CI_ECDSA_BRP;
-	
-	TC_eUICC_ES10b_PrepareDownload_01_Nominal_Without_Confirmation_Code();
-}
+    // 步骤 1:SEQ01-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030, RQ26_011, RQ26_034, RQ26_035, RQ31_062)
+    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_NO_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 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
+    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
+    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-C1 SW", "9000", "pd1_not_executed:cma_operands_absent");
+        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", "00"));
+        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";
+        bind.checkData("S1-C1 SW", "9000", pd1Sw);
+        // 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;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
+    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 outer tag", "BF21", pd1RSOuter);
+    bind.checkData("S1-C2 R_PREP_DOWNLOAD required members present", "1", (pd1RSA0 && pd1RS30 && pd1RS80 && pd1RS5F49 && pd1RS5F37) ? "1" : "0");
+    // S1-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
+    // S1-C4: binding:prep_download_material_curve_family(BrainpoolP256r1;valid_sets) (check_attestation)
+    // S1-C5: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
 
-function TC_eUICC_ES10b_PrepareDownloadBRP_02_Nominal_With_Confirmation_Code()
-{
-	if(!Card_Have_ECC_Cert)
-		return;
-	
-	//测试入口条件
-	if(!check_Applicability_of_tests_RSP_SGP23_test("C002"))
-		return;
-	
-	pkId_CI_ForVerification = pkId_CI_ECDSA_BRP;
-	pkId_CI_ForSigning = pkId_CI_ECDSA_BRP;
-	
-	TC_eUICC_ES10b_PrepareDownload_02_Nominal_With_Confirmation_Code();
-}
+    // 步骤 2:SEQ02-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030, RQ26_011, RQ26_034, RQ26_035, RQ31_062)
+    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_WITH_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
+    //   无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
+    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
+    var pd2Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
+    var pd2Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
+    var pd2Tid = "";
+    for (var pd2Ri = 0; pd2Ri < 16; pd2Ri++) {
+        pd2Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+    }
+    var pd2Sel = 0;
+    var pd2Sig1 = "";
+    var pd2Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+    var pd2CcH = bind.engine.Sha256("30313032303330343035", 20);
+    var pd2HashCc = bind.engine.Sha256(pd2CcH + pd2Tid, (pd2CcH + pd2Tid).length);
+    if (pd2Sel < 0 || pd2Sig1 === "") {
+        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
+        bind.checkData("S2-C1 SW", "9000", "pd2_not_executed:cma_operands_absent");
+        bind.checkData("S2-C2 R_PREP_DOWNLOAD response structure", "1", "pd2_not_executed:cma_operands_absent");
+    } else {
+        bind.engine.InitEccDomainParams(pd2Dps[pd2Sel][0], pd2Dps[pd2Sel][1], pd2Dps[pd2Sel][2], pd2Dps[pd2Sel][3], pd2Dps[pd2Sel][4], 1);
+        var pd2S2 = BindEs10xSingleRequest.buildTlv("30",
+            BindEs10xSingleRequest.buildTlv("80", pd2Tid)
+            + BindEs10xSingleRequest.buildTlv("01", "FF"));
+        var pd2Sgn = "";
+        while (pd2Sgn.length != 2 * pd2Sks[pd2Sel].length) {
+            bind.engine.SleepTime(2000);
+            pd2Sgn = bind.engine.EccSignData(pd2Sks[pd2Sel], pd2S2 + BindEs10xSingleRequest.buildTlv("5F37", pd2Sig1), 33);
+        }
+        var pd2Req = BindEs10xSingleRequest.buildTlv("BF21",
+            pd2S2
+            + BindEs10xSingleRequest.buildTlv("5F37", pd2Sgn)
+            + BindEs10xSingleRequest.buildTlv("04", pd2HashCc)
+            + BindEs10xSingleRequest.buildTlv("30", pd2Certs[pd2Sel]));
+        var pd2Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd2Req,
+             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+        var pd2Sw = (pd2Run.final && pd2Run.final.sw) ? pd2Run.final.sw : "transport_error";
+        bind.checkData("S2-C1 SW", "9000", pd2Sw);
+        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
+        var pd2Otpk = "";
+        if (pd2Run.final && pd2Run.final.resp) {
+            var pd2L1 = BindEs10xSingleRequest.parseBerTlv(pd2Run.final.resp);
+            for (var pd2I1 = 0; pd2I1 < pd2L1.length && pd2Otpk === ""; pd2I1++) {
+                if (pd2L1[pd2I1].tag !== "BF21") continue;
+                var pd2L2 = BindEs10xSingleRequest.parseBerTlv(pd2L1[pd2I1].value);
+                for (var pd2I2 = 0; pd2I2 < pd2L2.length && pd2Otpk === ""; pd2I2++) {
+                    if (pd2L2[pd2I2].tag !== "A0") continue;
+                    var pd2L3 = BindEs10xSingleRequest.parseBerTlv(pd2L2[pd2I2].value);
+                    for (var pd2I3 = 0; pd2I3 < pd2L3.length && pd2Otpk === ""; pd2I3++) {
+                        if (pd2L3[pd2I3].tag !== "30") continue;
+                        var pd2L4 = BindEs10xSingleRequest.parseBerTlv(pd2L3[pd2I3].value);
+                        for (var pd2I4 = 0; pd2I4 < pd2L4.length; pd2I4++) {
+                            if (pd2L4[pd2I4].tag === "5F49") pd2Otpk = pd2L4[pd2I4].value;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
+    var pd2RSR = (pd2Run.final && pd2Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd2Run.final.resp) : [];
+    var pd2RSOuter = pd2RSR.length === 1 ? pd2RSR[0].tag : "absent";
+    var pd2RSBr = pd2RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd2RSR[0].value) : [];
+    var pd2RSA0 = false, pd2RSA1 = false, pd2RSCk = [];
+    for (var pd2RSi = 0; pd2RSi < pd2RSBr.length; pd2RSi++) {
+        if (pd2RSBr[pd2RSi].tag === "A0") { pd2RSA0 = true; pd2RSCk = BindEs10xSingleRequest.parseBerTlv(pd2RSBr[pd2RSi].value); }
+        if (pd2RSBr[pd2RSi].tag === "A1") { pd2RSA1 = true; pd2RSCk = BindEs10xSingleRequest.parseBerTlv(pd2RSBr[pd2RSi].value); }
+    }
+    var pd2RS30 = false, pd2RS5F37 = false, pd2RS80 = false, pd2RS02 = false;
+    for (var pd2RSj = 0; pd2RSj < pd2RSCk.length; pd2RSj++) {
+        if (pd2RSCk[pd2RSj].tag === "30") pd2RS30 = true;
+        if (pd2RSCk[pd2RSj].tag === "5F37") pd2RS5F37 = true;
+        if (pd2RSCk[pd2RSj].tag === "80") pd2RS80 = true;
+        if (pd2RSCk[pd2RSj].tag === "02") pd2RS02 = true;
+    }
+    var pd2RS5F49 = false;
+    if (pd2RS30) {
+        for (var pd2RSk = 0; pd2RSk < pd2RSCk.length; pd2RSk++) {
+            if (pd2RSCk[pd2RSk].tag !== "30") continue;
+            var pd2RSU = BindEs10xSingleRequest.parseBerTlv(pd2RSCk[pd2RSk].value);
+            for (var pd2RSm = 0; pd2RSm < pd2RSU.length; pd2RSm++) {
+                if (pd2RSU[pd2RSm].tag === "5F49") pd2RS5F49 = true;
+                if (pd2RSU[pd2RSm].tag === "80") pd2RS80 = true;
+            }
+        }
+    }
+    bind.checkData("S2-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd2RSOuter);
+    bind.checkData("S2-C2 R_PREP_DOWNLOAD required members present", "1", (pd2RSA0 && pd2RS30 && pd2RS80 && pd2RS5F49 && pd2RS5F37) ? "1" : "0");
+    // S2-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
+    // S2-C4: binding:prep_download_material_curve_family(BrainpoolP256r1;valid_sets) (check_attestation)
+    // S2-C5: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
+    // S2-C6: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
 
-function TC_eUICC_ES10b_PrepareDownloadBRP_03_Nominal_With_an_unknown_otPK_EUICC_ECKA()
-{
-	if(!Card_Have_ECC_Cert)
-		return;
-	
-	//测试入口条件
-	if(!check_Applicability_of_tests_RSP_SGP23_test("C002"))
-		return;
-	
-	pkId_CI_ForVerification = pkId_CI_ECDSA_BRP;
-	pkId_CI_ForSigning = pkId_CI_ECDSA_BRP;
-	
-	TC_eUICC_ES10b_PrepareDownload_03_Nominal_With_an_unknown_otPK_EUICC_ECKA();
-}
-
-function TC_eUICC_ES10b_PrepareDownload_01_Nominal_Without_Confirmation_Code()
-{
-	tracenamestr = "测试目的:PrepareDownload数据中不包含Confirmation Code";
-	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,不包含Confirmation Code;");
-	Profile_load_procedure.ES10b_PrepareDownload();
-	
-	RecoverCard();
-	
-}
-
-function TC_eUICC_ES10b_PrepareDownload_02_Nominal_With_Confirmation_Code()
-{
-	tracenamestr = "测试目的:PrepareDownload数据中包含Confirmation Code";
-	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,包含Confirmation Code;");
-	Profile_load_procedure.ccRequiredFlag = "FF";
-	Profile_load_procedure.hashcc = curStrHandle.RandHexStr(32);
-	Profile_load_procedure.ES10b_PrepareDownload();
-	
-	RecoverCard();
-	
-}
-
-function TC_eUICC_ES10b_PrepareDownload_03_Nominal_With_an_unknown_otPK_EUICC_ECKA()
-{
-	tracenamestr = "测试目的:使用未定义的otPK.EUICC.ECKA,eUICC重新生成一组新的otPK.EUICC.ECKA密钥";
-	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();
-	
-	var chash1 = curStrHandle.RandHexStr(32);
-	var cureuiccOtpk = "04" + curStrHandle.RandHexStr(64);
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,包含Confirmation Code,bppEuiccOtpk为使用随机的的EuiccOtpk;");
-	Profile_load_procedure.ccRequiredFlag = "FF";
-	Profile_load_procedure.hashcc = chash1;
-	Profile_load_procedure.euiccOtpk = cureuiccOtpk;
-	Profile_load_procedure.ES10b_PrepareDownload();
-	
-	if (cureuiccOtpk == Profile_load_procedure.euiccOtpk)
-		obj.SubLevelError("期望eUICC重新生成一组新的otPK.EUICC.ECKA密钥");
-	
-	RecoverCard();
+    // 步骤 3:SEQ03-1] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ31_138, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ57_033, RQ26_029, RQ26_030, RQ26_011, RQ26_034, RQ26_035)
+    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_RETRY_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
+    //   无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
+    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
+    var pd3Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
+    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"]];
+    var pd3OtpkRef = (typeof pd2Otpk !== "undefined") ? pd2Otpk : "";
+    var pd3CcH = bind.engine.Sha256("30313032303330343035", 20);
+    var pd3HashCc = bind.engine.Sha256(pd3CcH + pd3Tid, (pd3CcH + pd3Tid).length);
+    if (pd3Sel < 0 || pd3Sig1 === "" || pd3OtpkRef === "") {
+        // 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", "FF")
+            + BindEs10xSingleRequest.buildTlv("5F49", pd3OtpkRef));
+        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("04", pd3HashCc)
+            + 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;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
+    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 outer tag", "BF21", pd3RSOuter);
+    bind.checkData("S3-C2 R_PREP_DOWNLOAD required members present", "1", (pd3RSA0 && pd3RS30 && pd3RS80 && pd3RS5F49 && pd3RS5F37) ? "1" : "0");
+    // S3-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
+    // S3-C4: binding:prep_download_material_curve_family(BrainpoolP256r1;valid_sets) (check_attestation)
+    // S3-C5: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
+    // S3-C6: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
+    // S3-C7: binding:prep_download_retry_new_otpk_distinct(previous-5F49;RQ57_033/RQ31_138) (check_attestation)
 }