eSIM RSP 测试用例对比站

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

源码对照:5.2.1.2.2

下载准备重试(更换 OT 密钥) / TC_eUICC_PrepareDownload_Retry_NewOTKeys

左侧为人工切片入口(-man,来自 原料/切片 的最小可执行脚本),右侧为 Cas 盲生成入口(-cas,仅依据规范生成)。文件按原始编码(多为 GBK)解码为 UTF-8 显示,行号自 1 起;字节级原文与 sha256 见两侧脚本包。完整 unified diff 见本页底部折叠区,以及 报告原文 §4。
-man 入口
Import/TestCase_SGP_23.js
137 行 / 5713 字符 / gb18030
-cas 入口
TC_eUICC_PrepareDownload_Retry_NewOTKeys/Import/TC_eUICC_PrepareDownload_Retry_NewOTKeys.js
298 行 / 29435 字符 / gb18030
默认折行显示长行;取消勾选可横向滚动查看原始行宽
-man 人工切片Import/TestCase_SGP_23.js137 行 / 5713 字符 / gb18030入口函数 @L3
1// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_PrepareDownload_Retry_NewOTKeys_01_Nominal_Confirmation_Code_retry_mechanism_by_not_reusing_previous_One_Time_key_pair (extracted verbatim)
2
3function TC_eUICC_PrepareDownload_Retry_NewOTKeys_01_Nominal_Confirmation_Code_retry_mechanism_by_not_reusing_previous_One_Time_key_pair()
4{
5	if (O_E_REUSE_OTPK)
6		return;
7	tracenamestr = "Confirmation Code重发,使用上一个会话中不同的otpk";
8	curDis.TraceStart(sno++,tracenamestr);
9	
10	curLogicChannel = 0;
11	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
12	Ini_powerOn_eUICC_LPAe_not_activate();
13	
14	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
15	TS_MANAGE_CHANNEL_OPEN();
16	
17	curLogicChannel = 1;
18	
19	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
20	TS_SELECT("Select ISD",ISD_R_AID,"9000");
21	
22	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
23	
24	var ProfileObj = TS_ProfilePackagePROFILE_OPERATIONAL1();
25	
26	var PROFILE_OPERATIONAL1_DATA = ProfileObj.GenHexData();
27	
28	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
29	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
30	Profile_load_procedure.ES10b_GetEUICCInfo1();
31
32	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
33	Profile_load_procedure.ES10b_GetEUICCChallenge();
34
35	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
36	Profile_load_procedure.ES10b_AuthenticateServer();
37	
38	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_WITH_CC;");
39	var chash1 = curStrHandle.RandHexStr(32);
40	Profile_load_procedure.ccRequiredFlag = "FF";
41	Profile_load_procedure.hashcc = chash1;
42	Profile_load_procedure.ES10b_PrepareDownload();
43	
44	var cureuiccOtpk = Profile_load_procedure.euiccOtpk;
45	
46	curLogicChannel = 0;
47	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
48	Ini_powerOn_eUICC_LPAe_not_activate();
49	
50	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
51	TS_MANAGE_CHANNEL_OPEN();
52	
53	curLogicChannel = 1;
54	
55	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
56	TS_SELECT("Select ISD",ISD_R_AID,"9000");
57	
58	
59	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
60	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
61	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
62	Profile_load_procedure.ES10b_GetEUICCInfo1();
63
64	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
65	Profile_load_procedure.ES10b_GetEUICCChallenge();
66
67	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
68	Profile_load_procedure.ES10b_AuthenticateServer();
69	
70	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_RETRY_CC,Confirmation Code重发,使用上一个会话中的otpk;");
71	var chash1 = curStrHandle.RandHexStr(32);
72	Profile_load_procedure.ccRequiredFlag = "FF";
73	Profile_load_procedure.hashcc = chash1;
74	Profile_load_procedure.euiccOtpk = cureuiccOtpk;
75	Profile_load_procedure.ES10b_PrepareDownload();	
76	var cureuiccOtpk2 = Profile_load_procedure.euiccOtpk;
77	curStrHandle.CheckData(cureuiccOtpk, cureuiccOtpk2, "otpk",1);
78	
79	
80	curLogicChannel = 0;
81	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
82	Ini_powerOn_eUICC_LPAe_not_activate();
83	
84	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
85	TS_MANAGE_CHANNEL_OPEN();
86	
87	curLogicChannel = 1;
88	
89	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
90	TS_SELECT("Select ISD",ISD_R_AID,"9000");
91	
92	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
93	
94	var ProfileObj = TS_ProfilePackagePROFILE_OPERATIONAL1();
95	
96	var PROFILE_OPERATIONAL1_DATA = ProfileObj.GenHexData();
97	
98	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
99	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
100	Profile_load_procedure.ES10b_GetEUICCInfo1();
101	
102	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
103	Profile_load_procedure.ES10b_GetEUICCChallenge();
104
105	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
106	Profile_load_procedure.ES10b_AuthenticateServer();
107	
108	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_WITH_CC;");
109	var chash1 = curStrHandle.RandHexStr(32);
110	Profile_load_procedure.ccRequiredFlag = "FF";
111	Profile_load_procedure.hashcc = chash1;
112	Profile_load_procedure.ES10b_PrepareDownload();	
113	var cureuiccOtpk = Profile_load_procedure.euiccOtpk;
114	
115	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");	
116	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
117	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
118	Profile_load_procedure.ES10b_GetEUICCInfo1();
119	
120	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
121	Profile_load_procedure.ES10b_GetEUICCChallenge();
122
123	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
124	Profile_load_procedure.ES10b_AuthenticateServer();
125	
126	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_RETRY_CC,Confirmation Code重发,使用上一个会话中的otpk;");
127	var chash1 = curStrHandle.RandHexStr(32);
128	Profile_load_procedure.ccRequiredFlag = "FF";
129	Profile_load_procedure.hashcc = chash1;
130	Profile_load_procedure.euiccOtpk = cureuiccOtpk;
131	Profile_load_procedure.ES10b_PrepareDownload();	
132	var cureuiccOtpk2 = Profile_load_procedure.euiccOtpk;
133	curStrHandle.CheckData(cureuiccOtpk, cureuiccOtpk2, "otpk",1);
134	
135	RecoverCard();
136}
137
-cas 盲生成TC_eUICC_PrepareDownload_Retry_NewOTKeys/Import/TC_eUICC_PrepareDownload_Retry_NewOTKeys.js298 行 / 29435 字符 / gb18030入口函数 @L15
1// Author: 卡思Cas智能体
2// Date: 20261004-022946
3// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_PrepareDownload_Retry_NewOTKeys,Test Sequence #01 Nominal: Confirmation Code retry mechanism by not reusing previous One-Time key pair(本 TC 单条 Test Sequence),适用性 C020。
4// Test points: S2-C1 SW;S2-C2 R_PREP_DOWNLOAD response structure;S2-C2 R_PREP_DOWNLOAD outer tag
5//   S2-C2 R_PREP_DOWNLOAD required members present;S3-C1 cma_ok
6//   S3-C1 Common Mutual Authentication re-execution ok;S5-C1 SW
7//   S5-C2 R_PREP_DOWNLOAD response structure;S5-C2 R_PREP_DOWNLOAD outer tag
8//   S5-C2 R_PREP_DOWNLOAD required members present
9// 本函数由 CaseIR 5.2.1.2.2 编译生成(experiments/5.2.1.2.2-TC_eUICC_PrepareDownload_Retry_NewOTKeys-20261004_022946,SGP.23 v1.16 × SGP.22 v2.7):字节权威=CaseIR,非誊录黄金脚本。
10// Value-free template: every data byte is injected from CaseIR fields; no scaffold globals (see docs/speconly/compile-symbol-migration.md).
11// 适用性 C020:编译期门,运行时由 harness 环境前置承担。
12// PRECONDITION (declared, NOT compiled): initial_conditions 缺语料过程体(Annex C.2 absent from input package, corpus vacuum): IC 序列属测试工具/卡态编排责任,本脚本不虚构初始化步骤;语义影响见 CaseIR open_items。
13// GEN-IC-1 卡态声明:The PROFILE_OPERATIONAL1 is not loaded on the eUICC: declared unexpanded (no fabricated bytes; provenance = expansion_source).
14// GEN-IC-2 卡态声明:通信已初始化且 ISD-R 已选;Common Mutual Authentication 已成功执行(同 GSMA CI): declared unexpanded (no fabricated bytes; provenance = expansion_source).
15function TC_eUICC_PrepareDownload_Retry_NewOTKeys_01_merged() {
16    var bind = curBind;
17    var profileAidSession = BindEs10xProcProfileDynamic.beginSession(bind, "TC_eUICC_PrepareDownload_Retry_NewOTKeys_01_merged");
18
19    // 步骤 1:<S_HASHED_CC> = MTD_GENERATE_HASHED_CC(tc_step;non_wire)
20    // test-tool internal preparation (no APDU face): runtime-domain
21    // values per CaseIR unresolved (G Annex B generation rules);
22    // no fabricated bytes emitted here.
23
24    // 步骤 2:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030)
25    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_WITH_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
26    //   无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
27    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
28    var pd2Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
29    var pd2Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
30    var pd2Tid = "";
31    for (var pd2Ri = 0; pd2Ri < 16; pd2Ri++) {
32        pd2Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
33    }
34    var pd2Sel = 0;
35    var pd2Sig1 = "";
36    var pd2Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
37    var pd2CcH = bind.engine.Sha256("30313032303330343035", 20);
38    var pd2HashCc = bind.engine.Sha256(pd2CcH + pd2Tid, (pd2CcH + pd2Tid).length);
39    if (pd2Sel < 0 || pd2Sig1 === "") {
40        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
41        bind.checkData("S2-C1 SW", "9000", "pd2_not_executed:cma_operands_absent");
42        bind.checkData("S2-C2 R_PREP_DOWNLOAD response structure", "1", "pd2_not_executed:cma_operands_absent");
43    } else {
44        bind.engine.InitEccDomainParams(pd2Dps[pd2Sel][0], pd2Dps[pd2Sel][1], pd2Dps[pd2Sel][2], pd2Dps[pd2Sel][3], pd2Dps[pd2Sel][4], 1);
45        var pd2S2 = BindEs10xSingleRequest.buildTlv("30",
46            BindEs10xSingleRequest.buildTlv("80", pd2Tid)
47            + BindEs10xSingleRequest.buildTlv("01", "FF"));
48        var pd2Sgn = "";
49        while (pd2Sgn.length != 2 * pd2Sks[pd2Sel].length) {
50            bind.engine.SleepTime(2000);
51            pd2Sgn = bind.engine.EccSignData(pd2Sks[pd2Sel], pd2S2 + BindEs10xSingleRequest.buildTlv("5F37", pd2Sig1), 33);
52        }
53        var pd2Req = BindEs10xSingleRequest.buildTlv("BF21",
54            pd2S2
55            + BindEs10xSingleRequest.buildTlv("5F37", pd2Sgn)
56            + BindEs10xSingleRequest.buildTlv("04", pd2HashCc)
57            + BindEs10xSingleRequest.buildTlv("30", pd2Certs[pd2Sel]));
58        var pd2Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
59            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd2Req,
60             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
61        var pd2Sw = (pd2Run.final && pd2Run.final.sw) ? pd2Run.final.sw : "transport_error";
62        bind.checkData("S2-C1 SW", "9000", pd2Sw);
63        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
64        var pd2Otpk = "";
65        if (pd2Run.final && pd2Run.final.resp) {
66            var pd2L1 = BindEs10xSingleRequest.parseBerTlv(pd2Run.final.resp);
67            for (var pd2I1 = 0; pd2I1 < pd2L1.length && pd2Otpk === ""; pd2I1++) {
68                if (pd2L1[pd2I1].tag !== "BF21") continue;
69                var pd2L2 = BindEs10xSingleRequest.parseBerTlv(pd2L1[pd2I1].value);
70                for (var pd2I2 = 0; pd2I2 < pd2L2.length && pd2Otpk === ""; pd2I2++) {
71                    if (pd2L2[pd2I2].tag !== "A0") continue;
72                    var pd2L3 = BindEs10xSingleRequest.parseBerTlv(pd2L2[pd2I2].value);
73                    for (var pd2I3 = 0; pd2I3 < pd2L3.length && pd2Otpk === ""; pd2I3++) {
74                        if (pd2L3[pd2I3].tag !== "30") continue;
75                        var pd2L4 = BindEs10xSingleRequest.parseBerTlv(pd2L3[pd2I3].value);
76                        for (var pd2I4 = 0; pd2I4 < pd2L4.length; pd2I4++) {
77                            if (pd2L4[pd2I4].tag === "5F49") pd2Otpk = pd2L4[pd2I4].value;
78                        }
79                    }
80                }
81            }
82        }
83    }
84    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
85    var pd2RSR = (pd2Run.final && pd2Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd2Run.final.resp) : [];
86    var pd2RSOuter = pd2RSR.length === 1 ? pd2RSR[0].tag : "absent";
87    var pd2RSBr = pd2RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd2RSR[0].value) : [];
88    var pd2RSA0 = false, pd2RSA1 = false, pd2RSCk = [];
89    for (var pd2RSi = 0; pd2RSi < pd2RSBr.length; pd2RSi++) {
90        if (pd2RSBr[pd2RSi].tag === "A0") { pd2RSA0 = true; pd2RSCk = BindEs10xSingleRequest.parseBerTlv(pd2RSBr[pd2RSi].value); }
91        if (pd2RSBr[pd2RSi].tag === "A1") { pd2RSA1 = true; pd2RSCk = BindEs10xSingleRequest.parseBerTlv(pd2RSBr[pd2RSi].value); }
92    }
93    var pd2RS30 = false, pd2RS5F37 = false, pd2RS80 = false, pd2RS02 = false;
94    for (var pd2RSj = 0; pd2RSj < pd2RSCk.length; pd2RSj++) {
95        if (pd2RSCk[pd2RSj].tag === "30") pd2RS30 = true;
96        if (pd2RSCk[pd2RSj].tag === "5F37") pd2RS5F37 = true;
97        if (pd2RSCk[pd2RSj].tag === "80") pd2RS80 = true;
98        if (pd2RSCk[pd2RSj].tag === "02") pd2RS02 = true;
99    }
100    var pd2RS5F49 = false;
101    if (pd2RS30) {
102        for (var pd2RSk = 0; pd2RSk < pd2RSCk.length; pd2RSk++) {
103            if (pd2RSCk[pd2RSk].tag !== "30") continue;
104            var pd2RSU = BindEs10xSingleRequest.parseBerTlv(pd2RSCk[pd2RSk].value);
105            for (var pd2RSm = 0; pd2RSm < pd2RSU.length; pd2RSm++) {
106                if (pd2RSU[pd2RSm].tag === "5F49") pd2RS5F49 = true;
107                if (pd2RSU[pd2RSm].tag === "80") pd2RS80 = true;
108            }
109        }
110    }
111    bind.checkData("S2-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd2RSOuter);
112    bind.checkData("S2-C2 R_PREP_DOWNLOAD required members present", "1", (pd2RSA0 && pd2RS30 && pd2RS80 && pd2RS5F49 && pd2RS5F37) ? "1" : "0");
113    // S2-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
114    // S2-C4: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
115    // S2-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
116    // S2-C6: binding:prep_download_response_otpk_extract_cross_step(5F49;S22_prep_dl) (check_attestation)
117
118    // 步骤 3:Seq#01] Execute the Common Mutual Authentication procedure between the eUICC and the S_SM-DP+ #GET_EUICC_INFO1, #GET_EUICC_CHALLENGE and #AUTHENTICATE_SMDP are sent to the eUICC the same GSMA CI as for the first attempt has been chosen for signing and for verification(tc_step;REQ: RQ57_047)
119    // W3D CMA 过程声明行内联动态绑定(三命令链;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;421324 IC6 dynamic-bound 先例机制面)
120    // CMA 链命令 1/3 GetEuiccInfo1(BF20 空结构,S22_info §5.7.8):
121    var cma3I1 = bind.sendApdu(null, "E2", "91", "00", "BF2000", null, "9000");
122    var cma3Gw1 = BindGecaProc.parseGecaResponse(cma3I1.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
123    // CMA 链命令 2/3 GetEuiccChallenge(BF2E 空结构,S22_challenge §5.7.7;响应 euiccChallenge 成员运行时提取):
124    var cma3C2 = bind.sendApdu(null, "E2", "91", "00", "BF2E00", null, "9000");
125    var cma3Ch = BindGecaProc.parseGecaResponse(cma3C2.resp, {outer: "BF2E", required: ["80"], optional: []});
126    // CMA 链命令 3/3 AuthenticateServer(BF38 引擎组装;槽位值=声明面分级注入):
127    var cma3Tid = "";
128    var cma3Sc = "";
129    for (var cma3Ri = 0; cma3Ri < 16; cma3Ri++) {
130        cma3Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
131        cma3Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
132    }
133    var cma3PkList = BindEs10xSingleRequest.parseBerTlv(cma3Gw1.fields["AA"] || "");
134    var cma3CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
135    var cma3Sks = ["0A7CC1C244E60C52CD5B7807AB8C360C26524601507DCABC5DD598B5A616D5D5", "93FB33D0584F349B07F8B5D2AF93D7C3E354B349A3B913502E6ABC070E4D4929"];
136    var cma3Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
137    var cma3Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
138    var cma3Sel = -1;
139    for (var cma3Pi = 0; cma3Pi < cma3PkList.length && cma3Sel < 0; cma3Pi++) {
140        for (var cma3Mi = 0; cma3Mi < cma3CiIds.length; cma3Mi++) {
141            if (cma3PkList[cma3Pi].value === cma3CiIds[cma3Mi]) { cma3Sel = cma3Mi; break; }
142        }
143    }
144    var cma3Ech = "";
145    for (var cma3Ei = 0; cma3Ei < cma3Ch.children.length; cma3Ei++) {
146        if (cma3Ch.children[cma3Ei].tag === "80") { cma3Ech = cma3Ch.children[cma3Ei].value; }
147    }
148    if (cma3Sel < 0 || cma3Ech === "") {
149        // fail-closed 诚实面:CI PK ID 零命中物料套或 euiccChallenge 缺席 → BF38 不发送,后续过程面如实失败。
150        bind.checkData("S3-C1 cma_ok", "1", "0");
151    } else {
152        bind.engine.InitEccDomainParams(cma3Dps[cma3Sel][0], cma3Dps[cma3Sel][1], cma3Dps[cma3Sel][2], cma3Dps[cma3Sel][3], cma3Dps[cma3Sel][4], 1);
153        var cma3S1 = BindEs10xSingleRequest.buildTlv("30",
154            BindEs10xSingleRequest.buildTlv("80", cma3Tid)
155            + BindEs10xSingleRequest.buildTlv("81", cma3Ech)
156            + BindEs10xSingleRequest.buildTlv("83", "1674657374736D6470706C7573312E6578616D706C652E636F6D")
157            + BindEs10xSingleRequest.buildTlv("84", cma3Sc));
158        var cma3Sgn = "";
159        while (cma3Sgn.length != 2 * cma3Sks[cma3Sel].length) {
160            bind.engine.SleepTime(2000);
161            cma3Sgn = bind.engine.EccSignData(cma3Sks[cma3Sel], cma3S1, 33);
162        }
163        var cma3Asm = BindEs10bAuthServer.assembleAuthenticateServer(
164            {outer: "BF38",
165             signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
166             serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
167            {transactionId: cma3Tid, euiccChallenge: cma3Ech,
168             serverAddress: "1674657374736D6470706C7573312E6578616D706C652E636F6D", serverChallenge: cma3Sc,
169             serverSignature1: cma3Sgn, euiccCiPKIdToBeUsed: cma3CiIds[cma3Sel],
170             serverCertificate: cma3Certs[cma3Sel], ctxParams1: "A10D800400000110A1058003000010"});
171        if (cma3Asm.error) {
172        bind.checkData("S3-C1 cma_ok", "1", "0");
173        } else {
174            var cma3Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
175                {cla: "", ins: "E2", p1: "91", p2: "00", data: cma3Asm.request_hex,
176                 le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
177            var cma3Sw = (cma3Run.final && cma3Run.final.sw) ? cma3Run.final.sw : "transport_error";
178            var cma3Ex = BindEs10bAuthServer.extractAuthenticateServer(
179                {outer: "BF38",
180                 ok: {tag: "A0", children: [
181                     {name: "euiccSigned1", tag: "30", children: [
182                         {name: "transactionId", tag: "80"},
183                         {name: "serverAddress", tag: "83"},
184                         {name: "serverChallenge", tag: "84"},
185                         {name: "euiccInfo2", tag: "BF22"},
186                         {name: "ctxParams1", tag: "A0"}]},
187                     {name: "euiccSignature1", tag: "5F37"},
188                     {name: "euiccCertificate", tag: "30"},
189                     {name: "eumCertificate", tag: "30"}]},
190                 error: {tag: "A1", children: [
191{name: "transactionId", tag: "80"},
192 {name: "authenticateErrorCode", tag: "81"}]}},
193                cma3Run.final ? cma3Run.final.resp : "");
194            var cma3OkBr = cma3Ex.branch === "ok" && cma3Ex.ok && cma3Ex.ok.missing.length === 0 && cma3Ex.ok.fields.euiccSigned1.children.missing.length === 0;
195            bind.checkData("S3-C1 Common Mutual Authentication re-execution ok", "1", cma3OkBr ? "1" : "0");
196            // euiccSignature1([5F37])运行时提取面登记:CMA 响应操作数供后续步(PREP_DOWNLOAD 签名明文)消费——5.2.2.2.1 后续 step5-8 属子过程声明/装配域,非本步发射面。
197        }
198    }
199
200    // 步骤 4:<S_HASHED_CC> = MTD_GENERATE_HASHED_CC(tc_step;non_wire)
201    // test-tool internal preparation (no APDU face): runtime-domain
202    // values per CaseIR unresolved (G Annex B generation rules);
203    // no fabricated bytes emitted here.
204
205    // 步骤 5:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030, RQ31_137, RQ57_033)
206    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_RETRY_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
207    //   transactionId/euiccSignature1=前序 CMA 声明步 step3 运行时提取(§5.7.5 会话一致性同值要求,不新生成);smdpSignature2=EccSignData(DPpb SK, smdpSigned2 TLV‖5F37(euiccSignature1), 33)(S22_prep_dl+G Annex B+vendor GenRequest 三源对账);
208    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
209    var pd5Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
210    var pd5Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
211    var pd5Tid = cma3Tid;
212    var pd5Sel = cma3Sel;
213    var pd5Sig1 = (typeof cma3Ex !== "undefined" && cma3Ex && cma3Ex.ok && cma3Ex.ok.fields.euiccSignature1) ? cma3Ex.ok.fields.euiccSignature1.value : "";
214    var pd5Dps = cma3Dps;
215    var pd5OtpkRef = (typeof pd2Otpk !== "undefined") ? pd2Otpk : "";
216    var pd5CcH = bind.engine.Sha256("4142434445464748494A", 20);
217    var pd5HashCc = bind.engine.Sha256(pd5CcH + pd5Tid, (pd5CcH + pd5Tid).length);
218    if (pd5Sel < 0 || pd5Sig1 === "" || pd5OtpkRef === "") {
219        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
220        bind.checkData("S5-C1 SW", "9000", "pd5_not_executed:cma_operands_absent");
221        bind.checkData("S5-C2 R_PREP_DOWNLOAD response structure", "1", "pd5_not_executed:cma_operands_absent");
222    } else {
223        bind.engine.InitEccDomainParams(pd5Dps[pd5Sel][0], pd5Dps[pd5Sel][1], pd5Dps[pd5Sel][2], pd5Dps[pd5Sel][3], pd5Dps[pd5Sel][4], 1);
224        var pd5S2 = BindEs10xSingleRequest.buildTlv("30",
225            BindEs10xSingleRequest.buildTlv("80", pd5Tid)
226            + BindEs10xSingleRequest.buildTlv("01", "FF")
227            + BindEs10xSingleRequest.buildTlv("5F49", pd5OtpkRef));
228        var pd5Sgn = "";
229        while (pd5Sgn.length != 2 * pd5Sks[pd5Sel].length) {
230            bind.engine.SleepTime(2000);
231            pd5Sgn = bind.engine.EccSignData(pd5Sks[pd5Sel], pd5S2 + BindEs10xSingleRequest.buildTlv("5F37", pd5Sig1), 33);
232        }
233        var pd5Req = BindEs10xSingleRequest.buildTlv("BF21",
234            pd5S2
235            + BindEs10xSingleRequest.buildTlv("5F37", pd5Sgn)
236            + BindEs10xSingleRequest.buildTlv("04", pd5HashCc)
237            + BindEs10xSingleRequest.buildTlv("30", pd5Certs[pd5Sel]));
238        var pd5Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
239            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd5Req,
240             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
241        var pd5Sw = (pd5Run.final && pd5Run.final.sw) ? pd5Run.final.sw : "transport_error";
242        bind.checkData("S5-C1 SW", "9000", pd5Sw);
243        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
244        var pd5Otpk = "";
245        if (pd5Run.final && pd5Run.final.resp) {
246            var pd5L1 = BindEs10xSingleRequest.parseBerTlv(pd5Run.final.resp);
247            for (var pd5I1 = 0; pd5I1 < pd5L1.length && pd5Otpk === ""; pd5I1++) {
248                if (pd5L1[pd5I1].tag !== "BF21") continue;
249                var pd5L2 = BindEs10xSingleRequest.parseBerTlv(pd5L1[pd5I1].value);
250                for (var pd5I2 = 0; pd5I2 < pd5L2.length && pd5Otpk === ""; pd5I2++) {
251                    if (pd5L2[pd5I2].tag !== "A0") continue;
252                    var pd5L3 = BindEs10xSingleRequest.parseBerTlv(pd5L2[pd5I2].value);
253                    for (var pd5I3 = 0; pd5I3 < pd5L3.length && pd5Otpk === ""; pd5I3++) {
254                        if (pd5L3[pd5I3].tag !== "30") continue;
255                        var pd5L4 = BindEs10xSingleRequest.parseBerTlv(pd5L3[pd5I3].value);
256                        for (var pd5I4 = 0; pd5I4 < pd5L4.length; pd5I4++) {
257                            if (pd5L4[pd5I4].tag === "5F49") pd5Otpk = pd5L4[pd5I4].value;
258                        }
259                    }
260                }
261            }
262        }
263    }
264    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
265    var pd5RSR = (pd5Run.final && pd5Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd5Run.final.resp) : [];
266    var pd5RSOuter = pd5RSR.length === 1 ? pd5RSR[0].tag : "absent";
267    var pd5RSBr = pd5RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd5RSR[0].value) : [];
268    var pd5RSA0 = false, pd5RSA1 = false, pd5RSCk = [];
269    for (var pd5RSi = 0; pd5RSi < pd5RSBr.length; pd5RSi++) {
270        if (pd5RSBr[pd5RSi].tag === "A0") { pd5RSA0 = true; pd5RSCk = BindEs10xSingleRequest.parseBerTlv(pd5RSBr[pd5RSi].value); }
271        if (pd5RSBr[pd5RSi].tag === "A1") { pd5RSA1 = true; pd5RSCk = BindEs10xSingleRequest.parseBerTlv(pd5RSBr[pd5RSi].value); }
272    }
273    var pd5RS30 = false, pd5RS5F37 = false, pd5RS80 = false, pd5RS02 = false;
274    for (var pd5RSj = 0; pd5RSj < pd5RSCk.length; pd5RSj++) {
275        if (pd5RSCk[pd5RSj].tag === "30") pd5RS30 = true;
276        if (pd5RSCk[pd5RSj].tag === "5F37") pd5RS5F37 = true;
277        if (pd5RSCk[pd5RSj].tag === "80") pd5RS80 = true;
278        if (pd5RSCk[pd5RSj].tag === "02") pd5RS02 = true;
279    }
280    var pd5RS5F49 = false;
281    if (pd5RS30) {
282        for (var pd5RSk = 0; pd5RSk < pd5RSCk.length; pd5RSk++) {
283            if (pd5RSCk[pd5RSk].tag !== "30") continue;
284            var pd5RSU = BindEs10xSingleRequest.parseBerTlv(pd5RSCk[pd5RSk].value);
285            for (var pd5RSm = 0; pd5RSm < pd5RSU.length; pd5RSm++) {
286                if (pd5RSU[pd5RSm].tag === "5F49") pd5RS5F49 = true;
287                if (pd5RSU[pd5RSm].tag === "80") pd5RS80 = true;
288            }
289        }
290    }
291    bind.checkData("S5-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd5RSOuter);
292    bind.checkData("S5-C2 R_PREP_DOWNLOAD required members present", "1", (pd5RSA0 && pd5RS30 && pd5RS80 && pd5RS5F49 && pd5RS5F37) ? "1" : "0");
293    // S5-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
294    // S5-C4: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
295    // S5-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
296    // S5-C6: binding:prep_download_retry_new_otpk_distinct(previous-5F49;RQ57_033/RQ31_138) (check_attestation)
297}
298

完整 unified diff

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

展开 diff(436 行)
--- -man
+++ -cas
@@ -1,137 +1,298 @@
-// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_PrepareDownload_Retry_NewOTKeys_01_Nominal_Confirmation_Code_retry_mechanism_by_not_reusing_previous_One_Time_key_pair (extracted verbatim)
-
-function TC_eUICC_PrepareDownload_Retry_NewOTKeys_01_Nominal_Confirmation_Code_retry_mechanism_by_not_reusing_previous_One_Time_key_pair()
-{
-	if (O_E_REUSE_OTPK)
-		return;
-	tracenamestr = "Confirmation Code重发,使用上一个会话中不同的otpk";
-	curDis.TraceStart(sno++,tracenamestr);
-	
-	curLogicChannel = 0;
-	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
-	Ini_powerOn_eUICC_LPAe_not_activate();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
-	TS_MANAGE_CHANNEL_OPEN();
-	
-	curLogicChannel = 1;
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
-	TS_SELECT("Select ISD",ISD_R_AID,"9000");
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
-	
-	var ProfileObj = TS_ProfilePackagePROFILE_OPERATIONAL1();
-	
-	var PROFILE_OPERATIONAL1_DATA = ProfileObj.GenHexData();
-	
-	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
-	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
-	Profile_load_procedure.ES10b_GetEUICCInfo1();
-
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
-	Profile_load_procedure.ES10b_GetEUICCChallenge();
-
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
-	Profile_load_procedure.ES10b_AuthenticateServer();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_WITH_CC;");
-	var chash1 = curStrHandle.RandHexStr(32);
-	Profile_load_procedure.ccRequiredFlag = "FF";
-	Profile_load_procedure.hashcc = chash1;
-	Profile_load_procedure.ES10b_PrepareDownload();
-	
-	var cureuiccOtpk = Profile_load_procedure.euiccOtpk;
-	
-	curLogicChannel = 0;
-	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
-	Ini_powerOn_eUICC_LPAe_not_activate();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
-	TS_MANAGE_CHANNEL_OPEN();
-	
-	curLogicChannel = 1;
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
-	TS_SELECT("Select ISD",ISD_R_AID,"9000");
-	
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
-	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
-	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
-	Profile_load_procedure.ES10b_GetEUICCInfo1();
-
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
-	Profile_load_procedure.ES10b_GetEUICCChallenge();
-
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
-	Profile_load_procedure.ES10b_AuthenticateServer();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_RETRY_CC,Confirmation Code重发,使用上一个会话中的otpk;");
-	var chash1 = curStrHandle.RandHexStr(32);
-	Profile_load_procedure.ccRequiredFlag = "FF";
-	Profile_load_procedure.hashcc = chash1;
-	Profile_load_procedure.euiccOtpk = cureuiccOtpk;
-	Profile_load_procedure.ES10b_PrepareDownload();	
-	var cureuiccOtpk2 = Profile_load_procedure.euiccOtpk;
-	curStrHandle.CheckData(cureuiccOtpk, cureuiccOtpk2, "otpk",1);
-	
-	
-	curLogicChannel = 0;
-	curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
-	Ini_powerOn_eUICC_LPAe_not_activate();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
-	TS_MANAGE_CHANNEL_OPEN();
-	
-	curLogicChannel = 1;
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
-	TS_SELECT("Select ISD",ISD_R_AID,"9000");
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
-	
-	var ProfileObj = TS_ProfilePackagePROFILE_OPERATIONAL1();
-	
-	var PROFILE_OPERATIONAL1_DATA = ProfileObj.GenHexData();
-	
-	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
-	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
-	Profile_load_procedure.ES10b_GetEUICCInfo1();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
-	Profile_load_procedure.ES10b_GetEUICCChallenge();
-
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
-	Profile_load_procedure.ES10b_AuthenticateServer();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_WITH_CC;");
-	var chash1 = curStrHandle.RandHexStr(32);
-	Profile_load_procedure.ccRequiredFlag = "FF";
-	Profile_load_procedure.hashcc = chash1;
-	Profile_load_procedure.ES10b_PrepareDownload();	
-	var cureuiccOtpk = Profile_load_procedure.euiccOtpk;
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");	
-	var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
-	Profile_load_procedure.ICCID = ICCID_OP_PROF1;
-	Profile_load_procedure.ES10b_GetEUICCInfo1();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
-	Profile_load_procedure.ES10b_GetEUICCChallenge();
-
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
-	Profile_load_procedure.ES10b_AuthenticateServer();
-	
-	curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest,PREP_DOWNLOAD_RETRY_CC,Confirmation Code重发,使用上一个会话中的otpk;");
-	var chash1 = curStrHandle.RandHexStr(32);
-	Profile_load_procedure.ccRequiredFlag = "FF";
-	Profile_load_procedure.hashcc = chash1;
-	Profile_load_procedure.euiccOtpk = cureuiccOtpk;
-	Profile_load_procedure.ES10b_PrepareDownload();	
-	var cureuiccOtpk2 = Profile_load_procedure.euiccOtpk;
-	curStrHandle.CheckData(cureuiccOtpk, cureuiccOtpk2, "otpk",1);
-	
-	RecoverCard();
+// Author: 卡思Cas智能体
+// Date: 20261004-022946
+// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_PrepareDownload_Retry_NewOTKeys,Test Sequence #01 Nominal: Confirmation Code retry mechanism by not reusing previous One-Time key pair(本 TC 单条 Test Sequence),适用性 C020。
+// Test points: S2-C1 SW;S2-C2 R_PREP_DOWNLOAD response structure;S2-C2 R_PREP_DOWNLOAD outer tag
+//   S2-C2 R_PREP_DOWNLOAD required members present;S3-C1 cma_ok
+//   S3-C1 Common Mutual Authentication re-execution ok;S5-C1 SW
+//   S5-C2 R_PREP_DOWNLOAD response structure;S5-C2 R_PREP_DOWNLOAD outer tag
+//   S5-C2 R_PREP_DOWNLOAD required members present
+// 本函数由 CaseIR 5.2.1.2.2 编译生成(experiments/5.2.1.2.2-TC_eUICC_PrepareDownload_Retry_NewOTKeys-20261004_022946,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).
+// 适用性 C020:编译期门,运行时由 harness 环境前置承担。
+// PRECONDITION (declared, NOT compiled): initial_conditions 缺语料过程体(Annex C.2 absent from input package, corpus vacuum): IC 序列属测试工具/卡态编排责任,本脚本不虚构初始化步骤;语义影响见 CaseIR open_items。
+// GEN-IC-1 卡态声明:The PROFILE_OPERATIONAL1 is not loaded on the eUICC: declared unexpanded (no fabricated bytes; provenance = expansion_source).
+// GEN-IC-2 卡态声明:通信已初始化且 ISD-R 已选;Common Mutual Authentication 已成功执行(同 GSMA CI): declared unexpanded (no fabricated bytes; provenance = expansion_source).
+function TC_eUICC_PrepareDownload_Retry_NewOTKeys_01_merged() {
+    var bind = curBind;
+    var profileAidSession = BindEs10xProcProfileDynamic.beginSession(bind, "TC_eUICC_PrepareDownload_Retry_NewOTKeys_01_merged");
+
+    // 步骤 1:<S_HASHED_CC> = MTD_GENERATE_HASHED_CC(tc_step;non_wire)
+    // test-tool internal preparation (no APDU face): runtime-domain
+    // values per CaseIR unresolved (G Annex B generation rules);
+    // no fabricated bytes emitted here.
+
+    // 步骤 2:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030)
+    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_WITH_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
+    //   无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
+    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
+    var pd2Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
+    var pd2Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
+    var pd2Tid = "";
+    for (var pd2Ri = 0; pd2Ri < 16; pd2Ri++) {
+        pd2Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+    }
+    var pd2Sel = 0;
+    var pd2Sig1 = "";
+    var pd2Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+    var pd2CcH = bind.engine.Sha256("30313032303330343035", 20);
+    var pd2HashCc = bind.engine.Sha256(pd2CcH + pd2Tid, (pd2CcH + pd2Tid).length);
+    if (pd2Sel < 0 || pd2Sig1 === "") {
+        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
+        bind.checkData("S2-C1 SW", "9000", "pd2_not_executed:cma_operands_absent");
+        bind.checkData("S2-C2 R_PREP_DOWNLOAD response structure", "1", "pd2_not_executed:cma_operands_absent");
+    } else {
+        bind.engine.InitEccDomainParams(pd2Dps[pd2Sel][0], pd2Dps[pd2Sel][1], pd2Dps[pd2Sel][2], pd2Dps[pd2Sel][3], pd2Dps[pd2Sel][4], 1);
+        var pd2S2 = BindEs10xSingleRequest.buildTlv("30",
+            BindEs10xSingleRequest.buildTlv("80", pd2Tid)
+            + BindEs10xSingleRequest.buildTlv("01", "FF"));
+        var pd2Sgn = "";
+        while (pd2Sgn.length != 2 * pd2Sks[pd2Sel].length) {
+            bind.engine.SleepTime(2000);
+            pd2Sgn = bind.engine.EccSignData(pd2Sks[pd2Sel], pd2S2 + BindEs10xSingleRequest.buildTlv("5F37", pd2Sig1), 33);
+        }
+        var pd2Req = BindEs10xSingleRequest.buildTlv("BF21",
+            pd2S2
+            + BindEs10xSingleRequest.buildTlv("5F37", pd2Sgn)
+            + BindEs10xSingleRequest.buildTlv("04", pd2HashCc)
+            + BindEs10xSingleRequest.buildTlv("30", pd2Certs[pd2Sel]));
+        var pd2Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd2Req,
+             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+        var pd2Sw = (pd2Run.final && pd2Run.final.sw) ? pd2Run.final.sw : "transport_error";
+        bind.checkData("S2-C1 SW", "9000", pd2Sw);
+        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
+        var pd2Otpk = "";
+        if (pd2Run.final && pd2Run.final.resp) {
+            var pd2L1 = BindEs10xSingleRequest.parseBerTlv(pd2Run.final.resp);
+            for (var pd2I1 = 0; pd2I1 < pd2L1.length && pd2Otpk === ""; pd2I1++) {
+                if (pd2L1[pd2I1].tag !== "BF21") continue;
+                var pd2L2 = BindEs10xSingleRequest.parseBerTlv(pd2L1[pd2I1].value);
+                for (var pd2I2 = 0; pd2I2 < pd2L2.length && pd2Otpk === ""; pd2I2++) {
+                    if (pd2L2[pd2I2].tag !== "A0") continue;
+                    var pd2L3 = BindEs10xSingleRequest.parseBerTlv(pd2L2[pd2I2].value);
+                    for (var pd2I3 = 0; pd2I3 < pd2L3.length && pd2Otpk === ""; pd2I3++) {
+                        if (pd2L3[pd2I3].tag !== "30") continue;
+                        var pd2L4 = BindEs10xSingleRequest.parseBerTlv(pd2L3[pd2I3].value);
+                        for (var pd2I4 = 0; pd2I4 < pd2L4.length; pd2I4++) {
+                            if (pd2L4[pd2I4].tag === "5F49") pd2Otpk = pd2L4[pd2I4].value;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
+    var pd2RSR = (pd2Run.final && pd2Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd2Run.final.resp) : [];
+    var pd2RSOuter = pd2RSR.length === 1 ? pd2RSR[0].tag : "absent";
+    var pd2RSBr = pd2RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd2RSR[0].value) : [];
+    var pd2RSA0 = false, pd2RSA1 = false, pd2RSCk = [];
+    for (var pd2RSi = 0; pd2RSi < pd2RSBr.length; pd2RSi++) {
+        if (pd2RSBr[pd2RSi].tag === "A0") { pd2RSA0 = true; pd2RSCk = BindEs10xSingleRequest.parseBerTlv(pd2RSBr[pd2RSi].value); }
+        if (pd2RSBr[pd2RSi].tag === "A1") { pd2RSA1 = true; pd2RSCk = BindEs10xSingleRequest.parseBerTlv(pd2RSBr[pd2RSi].value); }
+    }
+    var pd2RS30 = false, pd2RS5F37 = false, pd2RS80 = false, pd2RS02 = false;
+    for (var pd2RSj = 0; pd2RSj < pd2RSCk.length; pd2RSj++) {
+        if (pd2RSCk[pd2RSj].tag === "30") pd2RS30 = true;
+        if (pd2RSCk[pd2RSj].tag === "5F37") pd2RS5F37 = true;
+        if (pd2RSCk[pd2RSj].tag === "80") pd2RS80 = true;
+        if (pd2RSCk[pd2RSj].tag === "02") pd2RS02 = true;
+    }
+    var pd2RS5F49 = false;
+    if (pd2RS30) {
+        for (var pd2RSk = 0; pd2RSk < pd2RSCk.length; pd2RSk++) {
+            if (pd2RSCk[pd2RSk].tag !== "30") continue;
+            var pd2RSU = BindEs10xSingleRequest.parseBerTlv(pd2RSCk[pd2RSk].value);
+            for (var pd2RSm = 0; pd2RSm < pd2RSU.length; pd2RSm++) {
+                if (pd2RSU[pd2RSm].tag === "5F49") pd2RS5F49 = true;
+                if (pd2RSU[pd2RSm].tag === "80") pd2RS80 = true;
+            }
+        }
+    }
+    bind.checkData("S2-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd2RSOuter);
+    bind.checkData("S2-C2 R_PREP_DOWNLOAD required members present", "1", (pd2RSA0 && pd2RS30 && pd2RS80 && pd2RS5F49 && pd2RS5F37) ? "1" : "0");
+    // S2-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
+    // S2-C4: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
+    // S2-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
+    // S2-C6: binding:prep_download_response_otpk_extract_cross_step(5F49;S22_prep_dl) (check_attestation)
+
+    // 步骤 3:Seq#01] Execute the Common Mutual Authentication procedure between the eUICC and the S_SM-DP+ #GET_EUICC_INFO1, #GET_EUICC_CHALLENGE and #AUTHENTICATE_SMDP are sent to the eUICC the same GSMA CI as for the first attempt has been chosen for signing and for verification(tc_step;REQ: RQ57_047)
+    // W3D CMA 过程声明行内联动态绑定(三命令链;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;421324 IC6 dynamic-bound 先例机制面)
+    // CMA 链命令 1/3 GetEuiccInfo1(BF20 空结构,S22_info §5.7.8):
+    var cma3I1 = bind.sendApdu(null, "E2", "91", "00", "BF2000", null, "9000");
+    var cma3Gw1 = BindGecaProc.parseGecaResponse(cma3I1.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
+    // CMA 链命令 2/3 GetEuiccChallenge(BF2E 空结构,S22_challenge §5.7.7;响应 euiccChallenge 成员运行时提取):
+    var cma3C2 = bind.sendApdu(null, "E2", "91", "00", "BF2E00", null, "9000");
+    var cma3Ch = BindGecaProc.parseGecaResponse(cma3C2.resp, {outer: "BF2E", required: ["80"], optional: []});
+    // CMA 链命令 3/3 AuthenticateServer(BF38 引擎组装;槽位值=声明面分级注入):
+    var cma3Tid = "";
+    var cma3Sc = "";
+    for (var cma3Ri = 0; cma3Ri < 16; cma3Ri++) {
+        cma3Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+        cma3Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+    }
+    var cma3PkList = BindEs10xSingleRequest.parseBerTlv(cma3Gw1.fields["AA"] || "");
+    var cma3CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
+    var cma3Sks = ["0A7CC1C244E60C52CD5B7807AB8C360C26524601507DCABC5DD598B5A616D5D5", "93FB33D0584F349B07F8B5D2AF93D7C3E354B349A3B913502E6ABC070E4D4929"];
+    var cma3Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
+    var cma3Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+    var cma3Sel = -1;
+    for (var cma3Pi = 0; cma3Pi < cma3PkList.length && cma3Sel < 0; cma3Pi++) {
+        for (var cma3Mi = 0; cma3Mi < cma3CiIds.length; cma3Mi++) {
+            if (cma3PkList[cma3Pi].value === cma3CiIds[cma3Mi]) { cma3Sel = cma3Mi; break; }
+        }
+    }
+    var cma3Ech = "";
+    for (var cma3Ei = 0; cma3Ei < cma3Ch.children.length; cma3Ei++) {
+        if (cma3Ch.children[cma3Ei].tag === "80") { cma3Ech = cma3Ch.children[cma3Ei].value; }
+    }
+    if (cma3Sel < 0 || cma3Ech === "") {
+        // fail-closed 诚实面:CI PK ID 零命中物料套或 euiccChallenge 缺席 → BF38 不发送,后续过程面如实失败。
+        bind.checkData("S3-C1 cma_ok", "1", "0");
+    } else {
+        bind.engine.InitEccDomainParams(cma3Dps[cma3Sel][0], cma3Dps[cma3Sel][1], cma3Dps[cma3Sel][2], cma3Dps[cma3Sel][3], cma3Dps[cma3Sel][4], 1);
+        var cma3S1 = BindEs10xSingleRequest.buildTlv("30",
+            BindEs10xSingleRequest.buildTlv("80", cma3Tid)
+            + BindEs10xSingleRequest.buildTlv("81", cma3Ech)
+            + BindEs10xSingleRequest.buildTlv("83", "1674657374736D6470706C7573312E6578616D706C652E636F6D")
+            + BindEs10xSingleRequest.buildTlv("84", cma3Sc));
+        var cma3Sgn = "";
+        while (cma3Sgn.length != 2 * cma3Sks[cma3Sel].length) {
+            bind.engine.SleepTime(2000);
+            cma3Sgn = bind.engine.EccSignData(cma3Sks[cma3Sel], cma3S1, 33);
+        }
+        var cma3Asm = BindEs10bAuthServer.assembleAuthenticateServer(
+            {outer: "BF38",
+             signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
+             serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
+            {transactionId: cma3Tid, euiccChallenge: cma3Ech,
+             serverAddress: "1674657374736D6470706C7573312E6578616D706C652E636F6D", serverChallenge: cma3Sc,
+             serverSignature1: cma3Sgn, euiccCiPKIdToBeUsed: cma3CiIds[cma3Sel],
+             serverCertificate: cma3Certs[cma3Sel], ctxParams1: "A10D800400000110A1058003000010"});
+        if (cma3Asm.error) {
+        bind.checkData("S3-C1 cma_ok", "1", "0");
+        } else {
+            var cma3Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+                {cla: "", ins: "E2", p1: "91", p2: "00", data: cma3Asm.request_hex,
+                 le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+            var cma3Sw = (cma3Run.final && cma3Run.final.sw) ? cma3Run.final.sw : "transport_error";
+            var cma3Ex = BindEs10bAuthServer.extractAuthenticateServer(
+                {outer: "BF38",
+                 ok: {tag: "A0", children: [
+                     {name: "euiccSigned1", tag: "30", children: [
+                         {name: "transactionId", tag: "80"},
+                         {name: "serverAddress", tag: "83"},
+                         {name: "serverChallenge", tag: "84"},
+                         {name: "euiccInfo2", tag: "BF22"},
+                         {name: "ctxParams1", tag: "A0"}]},
+                     {name: "euiccSignature1", tag: "5F37"},
+                     {name: "euiccCertificate", tag: "30"},
+                     {name: "eumCertificate", tag: "30"}]},
+                 error: {tag: "A1", children: [
+{name: "transactionId", tag: "80"},
+ {name: "authenticateErrorCode", tag: "81"}]}},
+                cma3Run.final ? cma3Run.final.resp : "");
+            var cma3OkBr = cma3Ex.branch === "ok" && cma3Ex.ok && cma3Ex.ok.missing.length === 0 && cma3Ex.ok.fields.euiccSigned1.children.missing.length === 0;
+            bind.checkData("S3-C1 Common Mutual Authentication re-execution ok", "1", cma3OkBr ? "1" : "0");
+            // euiccSignature1([5F37])运行时提取面登记:CMA 响应操作数供后续步(PREP_DOWNLOAD 签名明文)消费——5.2.2.2.1 后续 step5-8 属子过程声明/装配域,非本步发射面。
+        }
+    }
+
+    // 步骤 4:<S_HASHED_CC> = MTD_GENERATE_HASHED_CC(tc_step;non_wire)
+    // test-tool internal preparation (no APDU face): runtime-domain
+    // values per CaseIR unresolved (G Annex B generation rules);
+    // no fabricated bytes emitted here.
+
+    // 步骤 5:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130, RQ31_131, RQ31_132, RQ31_133, RQ31_134, RQ31_135, RQ31_139, RQ31_140, RQ31_141, RQ57_025, RQ57_026, RQ57_027, RQ57_028, RQ57_029, RQ57_030, RQ57_034, RQ57_035, RQ57_036, RQ57_037, RQ57_038, RQ57_039, RQ26_029, RQ26_030, RQ31_137, RQ57_033)
+    // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_RETRY_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37), hashCc 04 → smdpCertificate(30)):
+    //   transactionId/euiccSignature1=前序 CMA 声明步 step3 运行时提取(§5.7.5 会话一致性同值要求,不新生成);smdpSignature2=EccSignData(DPpb SK, smdpSigned2 TLV‖5F37(euiccSignature1), 33)(S22_prep_dl+G Annex B+vendor GenRequest 三源对账);
+    //   DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
+    var pd5Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
+    var pd5Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
+    var pd5Tid = cma3Tid;
+    var pd5Sel = cma3Sel;
+    var pd5Sig1 = (typeof cma3Ex !== "undefined" && cma3Ex && cma3Ex.ok && cma3Ex.ok.fields.euiccSignature1) ? cma3Ex.ok.fields.euiccSignature1.value : "";
+    var pd5Dps = cma3Dps;
+    var pd5OtpkRef = (typeof pd2Otpk !== "undefined") ? pd2Otpk : "";
+    var pd5CcH = bind.engine.Sha256("4142434445464748494A", 20);
+    var pd5HashCc = bind.engine.Sha256(pd5CcH + pd5Tid, (pd5CcH + pd5Tid).length);
+    if (pd5Sel < 0 || pd5Sig1 === "" || pd5OtpkRef === "") {
+        // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
+        bind.checkData("S5-C1 SW", "9000", "pd5_not_executed:cma_operands_absent");
+        bind.checkData("S5-C2 R_PREP_DOWNLOAD response structure", "1", "pd5_not_executed:cma_operands_absent");
+    } else {
+        bind.engine.InitEccDomainParams(pd5Dps[pd5Sel][0], pd5Dps[pd5Sel][1], pd5Dps[pd5Sel][2], pd5Dps[pd5Sel][3], pd5Dps[pd5Sel][4], 1);
+        var pd5S2 = BindEs10xSingleRequest.buildTlv("30",
+            BindEs10xSingleRequest.buildTlv("80", pd5Tid)
+            + BindEs10xSingleRequest.buildTlv("01", "FF")
+            + BindEs10xSingleRequest.buildTlv("5F49", pd5OtpkRef));
+        var pd5Sgn = "";
+        while (pd5Sgn.length != 2 * pd5Sks[pd5Sel].length) {
+            bind.engine.SleepTime(2000);
+            pd5Sgn = bind.engine.EccSignData(pd5Sks[pd5Sel], pd5S2 + BindEs10xSingleRequest.buildTlv("5F37", pd5Sig1), 33);
+        }
+        var pd5Req = BindEs10xSingleRequest.buildTlv("BF21",
+            pd5S2
+            + BindEs10xSingleRequest.buildTlv("5F37", pd5Sgn)
+            + BindEs10xSingleRequest.buildTlv("04", pd5HashCc)
+            + BindEs10xSingleRequest.buildTlv("30", pd5Certs[pd5Sel]));
+        var pd5Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+            {cla: "", ins: "E2", p1: "91", p2: "00", data: pd5Req,
+             le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+        var pd5Sw = (pd5Run.final && pd5Run.final.sw) ? pd5Run.final.sw : "transport_error";
+        bind.checkData("S5-C1 SW", "9000", pd5Sw);
+        // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
+        var pd5Otpk = "";
+        if (pd5Run.final && pd5Run.final.resp) {
+            var pd5L1 = BindEs10xSingleRequest.parseBerTlv(pd5Run.final.resp);
+            for (var pd5I1 = 0; pd5I1 < pd5L1.length && pd5Otpk === ""; pd5I1++) {
+                if (pd5L1[pd5I1].tag !== "BF21") continue;
+                var pd5L2 = BindEs10xSingleRequest.parseBerTlv(pd5L1[pd5I1].value);
+                for (var pd5I2 = 0; pd5I2 < pd5L2.length && pd5Otpk === ""; pd5I2++) {
+                    if (pd5L2[pd5I2].tag !== "A0") continue;
+                    var pd5L3 = BindEs10xSingleRequest.parseBerTlv(pd5L2[pd5I2].value);
+                    for (var pd5I3 = 0; pd5I3 < pd5L3.length && pd5Otpk === ""; pd5I3++) {
+                        if (pd5L3[pd5I3].tag !== "30") continue;
+                        var pd5L4 = BindEs10xSingleRequest.parseBerTlv(pd5L3[pd5I3].value);
+                        for (var pd5I4 = 0; pd5I4 < pd5L4.length; pd5I4++) {
+                            if (pd5L4[pd5I4].tag === "5F49") pd5Otpk = pd5L4[pd5I4].value;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
+    var pd5RSR = (pd5Run.final && pd5Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd5Run.final.resp) : [];
+    var pd5RSOuter = pd5RSR.length === 1 ? pd5RSR[0].tag : "absent";
+    var pd5RSBr = pd5RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd5RSR[0].value) : [];
+    var pd5RSA0 = false, pd5RSA1 = false, pd5RSCk = [];
+    for (var pd5RSi = 0; pd5RSi < pd5RSBr.length; pd5RSi++) {
+        if (pd5RSBr[pd5RSi].tag === "A0") { pd5RSA0 = true; pd5RSCk = BindEs10xSingleRequest.parseBerTlv(pd5RSBr[pd5RSi].value); }
+        if (pd5RSBr[pd5RSi].tag === "A1") { pd5RSA1 = true; pd5RSCk = BindEs10xSingleRequest.parseBerTlv(pd5RSBr[pd5RSi].value); }
+    }
+    var pd5RS30 = false, pd5RS5F37 = false, pd5RS80 = false, pd5RS02 = false;
+    for (var pd5RSj = 0; pd5RSj < pd5RSCk.length; pd5RSj++) {
+        if (pd5RSCk[pd5RSj].tag === "30") pd5RS30 = true;
+        if (pd5RSCk[pd5RSj].tag === "5F37") pd5RS5F37 = true;
+        if (pd5RSCk[pd5RSj].tag === "80") pd5RS80 = true;
+        if (pd5RSCk[pd5RSj].tag === "02") pd5RS02 = true;
+    }
+    var pd5RS5F49 = false;
+    if (pd5RS30) {
+        for (var pd5RSk = 0; pd5RSk < pd5RSCk.length; pd5RSk++) {
+            if (pd5RSCk[pd5RSk].tag !== "30") continue;
+            var pd5RSU = BindEs10xSingleRequest.parseBerTlv(pd5RSCk[pd5RSk].value);
+            for (var pd5RSm = 0; pd5RSm < pd5RSU.length; pd5RSm++) {
+                if (pd5RSU[pd5RSm].tag === "5F49") pd5RS5F49 = true;
+                if (pd5RSU[pd5RSm].tag === "80") pd5RS80 = true;
+            }
+        }
+    }
+    bind.checkData("S5-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd5RSOuter);
+    bind.checkData("S5-C2 R_PREP_DOWNLOAD required members present", "1", (pd5RSA0 && pd5RS30 && pd5RS80 && pd5RS5F49 && pd5RS5F37) ? "1" : "0");
+    // S5-C3: binding:euicc_signature2_runtime_verify(PK_EUICC_ECDSA;S22_prep_dl) (check_attestation)
+    // S5-C4: binding:prep_download_response_tid_echo(request-S_TRANSACTION_ID;S22_prep_dl) (check_attestation)
+    // S5-C5: binding:prep_download_response_hashcc_echo(request-S_HASHED_CC;S22_prep_dl) (check_attestation)
+    // S5-C6: binding:prep_download_retry_new_otpk_distinct(previous-5F49;RQ57_033/RQ31_138) (check_attestation)
 }