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