eSIM RSP 测试用例对比站

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

源码对照:4.2.10.2.1

ES10b 下载准备(NIST 曲线) / TC_eUICC_ES10b.PrepareDownloadNIST

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

完整 unified diff

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

展开 diff(463 行)
--- -man
+++ -cas
@@ -1,165 +1,300 @@
-// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10b_PrepareDownloadNIST_01_Nominal_Without_Confirmation_Code + TC_eUICC_ES10b_PrepareDownloadNIST_02_Nominal_With_Confirmation_Code + TC_eUICC_ES10b_PrepareDownloadNIST_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.PrepareDownloadNIST,Test Sequence #01-#03 Nominal (all 3 sequences),适用性 C001。
+// 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.1 编译生成(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).
+// 适用性 C001:编译期门,运行时由 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 已发送;签名与验证选用同一基于 NIST P-256 的 GSMA CI。: declared unexpanded (no fabricated bytes; provenance = expansion_source).
+// SEQ02-IC1 <S_HASHED_CC> = MTD_GENERATE_HASHED_CC(#CONFIRMATION_CODE1, <S_TRANSACTION_ID>)(测试工具侧计算,H_annexC1_methods 表1228:SHA-256(CC) 拼接 TransactionID 后再 SHA-256): declared unexpanded (no fabricated bytes; provenance = expansion_source).
+// SEQ03-IC1 <S_HASHED_CC> = MTD_GENERATE_HASHED_CC(#CONFIRMATION_CODE1, <S_TRANSACTION_ID>): declared unexpanded (no fabricated bytes; provenance = expansion_source).
+// SEQ03-IC2 S_SM-DP+ generates a random <OTPK_EUICC_ECKA>(随机值,与 eUICC 存储的一次性密钥对不对应): declared unexpanded (no fabricated bytes; provenance = expansion_source).
+function TC_eUICC_ES10b_PrepareDownloadNIST_01_03_Nominal_all_3_sequences() {
+    var bind = curBind;
 
-function TC_eUICC_ES10b_PrepareDownloadNIST_01_Nominal_Without_Confirmation_Code()
-{
-	
-	if(!Card_Have_ECC_Cert)
-		return;
-	
-	//测试入口条件
-	if(!check_Applicability_of_tests_RSP_SGP23_test("C001"))
-		return;
-	
-	pkId_CI_ForVerification = pkId_CI_ECDSA_NIST;
-	pkId_CI_ForSigning = pkId_CI_ECDSA_NIST;
-	
-	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_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
 
-function TC_eUICC_ES10b_PrepareDownloadNIST_02_Nominal_With_Confirmation_Code()
-{
-	if(!Card_Have_ECC_Cert)
-		return;
-	
-	//测试入口条件
-	if(!check_Applicability_of_tests_RSP_SGP23_test("C001"))
-		return;
-	
-	pkId_CI_ForVerification = pkId_CI_ECDSA_NIST;
-	pkId_CI_ForSigning = pkId_CI_ECDSA_NIST;
-	
-	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_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
+    // S2-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
 
-function TC_eUICC_ES10b_PrepareDownloadNIST_03_Nominal_With_an_unknown_otPK_EUICC_ECKA()
-{
-	
-	if(!Card_Have_ECC_Cert)
-		return;
-	
-	//测试入口条件
-	if(!check_Applicability_of_tests_RSP_SGP23_test("C001"))
-		return;
-	
-	pkId_CI_ForVerification = pkId_CI_ECDSA_NIST;
-	pkId_CI_ForSigning = pkId_CI_ECDSA_NIST;
-	
-	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_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
+    // S3-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
+    // S3-C6: binding:prep_download_retry_new_otpk_distinct(previous-5F49;RQ57_033/RQ31_138) (check_attestation)
 }