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