源码对照:5.2.3.2.1
GetProfilesInfo/GetRAT 的 RSP 会话 / TC_eUICC_GetProfilesInfo_GetRAT_RSPSession
左侧为人工切片入口(-man,来自 原料/切片 的最小可执行脚本),右侧为 Cas 盲生成入口(-cas,仅依据规范生成)。文件按原始编码(多为 GBK)解码为 UTF-8 显示,行号自 1 起;字节级原文与 sha256 见两侧脚本包。完整 unified diff 见本页底部折叠区,以及 报告原文 §4。
-man 入口
Import/TestCase_SGP_23.js
59 行 / 2146 字符 / gb18030
-cas 入口
TC_eUICC_GetProfilesInfo_GetRAT_RSPSession/Import/TC_eUICC_GetProfilesInfo_GetRAT_RSPSession.js
237 行 / 20677 字符 / gb18030
默认折行显示长行;取消勾选可横向滚动查看原始行宽
-man 人工切片Import/TestCase_SGP_23.js59 行 / 2146 字符 / gb18030入口函数 @L3
1// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_GetProfilesInfo_GetRAT_RSPSession_01_Nominal_GetProfilesInfo_and_GetRAT_during_RSP_session (extracted verbatim)
2
3function TC_eUICC_GetProfilesInfo_GetRAT_RSPSession_01_Nominal_GetProfilesInfo_and_GetRAT_during_RSP_session()
4{
5
6 initial_condition_PROFILE_OPERATIONAL1_is_Enabled();
7
8 tracenamestr = "确保在RSP会话期间,可以请求eUICC获取已安装的Profiles的列表和RAT ";
9 curDis.TraceStart(sno++,tracenamestr);
10
11 curLogicChannel = 0;
12 curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
13 Ini_powerOn_eUICC_LPAe_not_activate();
14
15
16 curDis.TestStepStart("读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
17 TS_MANAGE_CHANNEL_OPEN();
18
19 curLogicChannel = 1;
20
21 curDis.TestStepStart("读卡器向卡片发送SELECT命令,选择ISD-R;");
22 TS_SELECT("Select ISD",ISD_R_AID,"9000");
23
24 curDis.TestStepStart("读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
25
26
27 var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
28 Profile_load_procedure.ICCID = ICCID_OP_PROF1;
29 Profile_load_procedure.ES10b_GetEUICCInfo1();
30
31 curDis.TestStepStart("读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
32 Profile_load_procedure.ES10b_GetEUICCChallenge();
33
34 curDis.TestStepStart("读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
35 Profile_load_procedure.ES10b_AuthenticateServer();
36
37 curDis.TestStepStart("读卡器向卡片发送 StoreData命令,执行GetRatRequest;");
38 var respData = LPAd_Transport_data_to_eUICC(GetRatRequestHexStr);
39
40 var getRatResponse = new GetRatResponse();
41 getRatResponse.checkCardResDataFormat(respData);
42
43 curStrHandle.CheckData(R_DEFAULT_RAT, respData, "RAT");
44
45 curDis.TestStepStart("读卡器向卡片发送 StoreData命令,执行ProfileInfoListRequest,获取profile状态;");
46 var proInfoListRequest = new ProfileInfoListRequest();
47 proInfoListRequest.GenHexData();
48 var respData = LPAd_Transport_data_to_eUICC(proInfoListRequest.hexData);
49
50 var proInfoListResponse = new ProfileInfoListResponse();
51 proInfoListResponse.checkCardResDataFormat(respData);
52
53 curDis.TestStepStart("读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest;");
54 Profile_load_procedure.ES10b_PrepareDownload();
55
56
57 RecoverCard();
58}
59
-cas 盲生成TC_eUICC_GetProfilesInfo_GetRAT_RSPSession/Import/TC_eUICC_GetProfilesInfo_GetRAT_RSPSession.js237 行 / 20677 字符 / gb18030入口函数 @L18
1// Author: 卡思Cas智能体
2// Date: 20261004-022947
3// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_GetProfilesInfo_GetRAT_RSPSession,Test Sequence #01 Nominal: GetProfilesInfo and GetRAT during RSP session(本 TC 单条 Test Sequence),适用性 M。
4// Test points: ICH-IC1-K1-C1 ATR_present;ICH-IC1-K2-C2 FCP_Template;ICH-IC1-K2-C4 SW
5// ICH-IC1-K3-C4 SW;ICH-IC1-K4-C4 final SW;ICH-IC2-K1-C4 SW;ICH-IC2-K1-C3 CHANNEL_NUMBER extracted
6// ICH-IC2-K2-C4 SW;S1-C1 SW;S1-C2 R_EUICC_INFO1 outer tag
7// S1-C2 R_EUICC_INFO1 required members present;S1-C3 CI PK lists share at least one key id
8// S2-C1 SW;S2-C2 R_CHALLENGE outer tag;S2-C2 R_CHALLENGE required members present
9// S2-C2 tagOfeuiccChallenge;S2-C2 lengthOfeuiccChallenge;S4-C1 runtime payload
10// S4-C2 runtime payload;S5-C1 SW;S6-C1 SW;S6-C2 contains PROFILE_INFO1;S6-C3 iccid
11// S6-C3 isdpAid present;S6-C3 profileState;S6-C3 serviceProviderName SP Name 1
12// S6-C3 profileName Operational Profile Name 1;S6-C3 iconType;S6-C3 icon present
13// S6-C3 profileClass;S7-C1 SW;S7-C2 R_PREP_DOWNLOAD response structure
14// S7-C2 R_PREP_DOWNLOAD outer tag;S7-C2 R_PREP_DOWNLOAD required members present
15// 本函数由 CaseIR 5.2.3.2.1 编译生成(5.2.3.2.1-TC_eUICC_GetProfilesInfo_GetRAT_RSPSession-20261004_022947,SGP.23 v1.16 × SGP.22 v2.7):字节权威=CaseIR,非誊录黄金脚本。
16// Value-free template: every data byte is injected from CaseIR fields; no scaffold globals (see docs/speconly/compile-symbol-migration.md).
17// 适用性 M:编译期门,运行时由 harness 环境前置承担。
18function TC_eUICC_GetProfilesInfo_GetRAT_RSPSession_01_merged() {
19 var bind = curBind;
20 // SEQ-IC-1 卡态声明(E 段序列级 Initial Conditions,编排责任):The eUICC's RAT is configured as detailed SGP.21 Annex H: one PPAR authorizing PPR1 and PPR2 for all MNOs with End User consent required (i.e. #PPRS_ALLOWED); no additional rules: declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
21 // SEQ-IC-2 卡态声明(E 段序列级 Initial Conditions,编排责任):The PROFILE_OPERATIONAL1 is installed and Enabled on the eUICC: declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
22
23 // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 1):RESET(K 语料机械展开)
24 var s8 = bind.resetAndAtr();
25 bind.checkData("ICH-IC1-K1-C1 ATR_present", "1", s8.atr_hex !== "" ? "1" : "0");
26
27 // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 2):SELECT_MF(K 语料机械展开)
28 // FCP outer tag not materialized from clause: tag-face asserted only when corpus fixes the tag byte (e.g. TS 102 221 FCP '62').
29 var s9 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
30 bind.checkData("ICH-IC1-K2-C2 FCP_Template", "1", s9.resp.length > 0 ? "1" : "0");
31 bind.checkData("ICH-IC1-K2-C4 SW", "9000", s9.sw);
32
33 // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 3):TERMINAL_CAPABILITY_LPAd(K 语料机械展开)
34 var s10 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
35 bind.checkData("ICH-IC1-K3-C4 SW", "9000", s10.sw);
36
37 // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 4):TERMINAL_PROFILE(K 语料机械展开)
38 var steady11 = bind.runToSteadyState(function () {
39 return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
40 });
41 bind.checkData("ICH-IC1-K4-C4 final SW", "9000", steady11.final.sw);
42
43 // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 1):MANAGE_CHANNEL_OPEN(K 语料机械展开)
44 // CHANNEL_NUMBER extraction and dynamic CLA rebinding are CasBind internal state (chaining rule; no generated-code re-implementation).
45 var s12 = bind.manageChannelOpen("9000");
46 bind.checkData("ICH-IC2-K1-C4 SW", "9000", s12.sw);
47 bind.checkData("ICH-IC2-K1-C3 CHANNEL_NUMBER extracted", "1", s12.chan !== null ? "1" : "0");
48
49 // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 2):MTD_SELECT(K 语料机械展开)
50 // CLA = bound channel (cla_rule) and <L> length binding are CasBind internal state (chaining rule; no generated-code re-implementation).
51 var s13 = bind.sendApdu(null, "A4", "04", "00", "A0000005591010FFFFFFFF8900000100", null, "9000");
52 // MTD_SELECT expected face is SW-only (K Annex C.2 open-channel procedure step 2: no FCI content assertion in corpus); no fabricated template parse.
53 bind.checkData("ICH-IC2-K2-C4 SW", "9000", s13.sw);
54
55 // 步骤 1:MTD_STORE_DATA(tc_step)
56 // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
57 var sdCla1 = s12.chan !== null ? (s12.chan <= 3 ? 128 + s12.chan : 188 + s12.chan).toString(16).toUpperCase() : null;
58 var s1 = bind.sendApdu(sdCla1, "E2", "91", "00", "BF2000", "00", "9000");
59 bind.checkData("S1-C1 SW", "9000", s1.sw);
60 // geca-proc ES10b Info 响应面(R_EUICC_INFO1,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
61 var gw1 = BindGecaProc.parseGecaResponse(s1.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
62 bind.checkData("S1-C2 R_EUICC_INFO1 outer tag", "BF20", gw1.outer_tag === null ? "absent" : gw1.outer_tag);
63 bind.checkData("S1-C2 R_EUICC_INFO1 required members present", "1", gw1.ok ? "1" : "0");
64 var pkV1 = BindEs10xSingleRequest.parseBerTlv(gw1.fields["A9"] || "");
65 var pkS1 = BindEs10xSingleRequest.parseBerTlv(gw1.fields["AA"] || "");
66 var samePk1 = false;
67 for (var pvi1 = 0; pvi1 < pkV1.length; pvi1++) {
68 for (var psi1 = 0; psi1 < pkS1.length; psi1++) {
69 if (pkV1[pvi1].value !== "" && pkV1[pvi1].value === pkS1[psi1].value) { samePk1 = true; }
70 }
71 }
72 bind.checkData("S1-C3 CI PK lists share at least one key id", "1", samePk1 ? "1" : "0");
73
74 // 步骤 2:MTD_STORE_DATA(tc_step)
75 // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
76 var sdCla2 = s12.chan !== null ? (s12.chan <= 3 ? 128 + s12.chan : 188 + s12.chan).toString(16).toUpperCase() : null;
77 var s2 = bind.sendApdu(sdCla2, "E2", "91", "00", "BF2E00", "00", "9000");
78 bind.checkData("S2-C1 SW", "9000", s2.sw);
79 // geca-proc ES10b Info 响应面(R_CHALLENGE,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
80 var gw2 = BindGecaProc.parseGecaResponse(s2.resp, {outer: "BF2E", required: ["80"], optional: []});
81 bind.checkData("S2-C2 R_CHALLENGE outer tag", "BF2E", gw2.outer_tag === null ? "absent" : gw2.outer_tag);
82 bind.checkData("S2-C2 R_CHALLENGE required members present", "1", gw2.ok ? "1" : "0");
83 var r2w2 = BindGecaProc.parseGecaResponse(s2.resp, {outer: "BF2E", required: ["80"]});
84 bind.checkData("S2-C2 R_CHALLENGE outer tag", "BF2E", r2w2.outer_tag === null ? "absent" : r2w2.outer_tag);
85 var r2ch2 = null; for (var r2ci2 = 0; r2ci2 < r2w2.children.length; r2ci2++) { if (r2w2.children[r2ci2].tag === "80") { r2ch2 = r2w2.children[r2ci2]; } }
86 var r2chal2 = r2ch2 === null ? "" : r2ch2.value;
87 bind.checkData("S2-C2 tagOfeuiccChallenge", "80", r2ch2 === null ? "absent" : r2ch2.tag);
88 bind.checkData("S2-C2 lengthOfeuiccChallenge", "10", r2ch2 === null ? "absent" : (r2ch2.len < 16 ? ("0" + r2ch2.len.toString(16).toUpperCase()) : r2ch2.len.toString(16).toUpperCase()));
89
90 // 步骤 3:Step IC6 输入准备(InitiateAuthentication):<S_TRANSACTION_ID>、<EUICC_CHALLENGE>、<S_SMDP_CHALLENGE>、<S_SMDP_SIGNATURE1>;设 <EUICC_CI_PK_ID_TO_BE_USED> 为 <EUICC_CI_PK_ID_LIST_FOR_SIGNING> 中最高优先级的 CI Key ID;选取导向同一 Root CI 证书的 #CERT_S_SM_DPauth_ECDSA(tc_step;non_wire)
91 // test-tool internal preparation (no APDU face): runtime-domain
92 // values per CaseIR unresolved (G Annex B generation rules);
93 // no fabricated bytes emitted here.
94
95 // 步骤 4:MTD_STORE_DATA_SCRIPT(tc_step)
96 // multi-placeholder runtime template without dynamic_template declaration:
97 // bytes not closeable offline (B-4 placeholder contract is single-placeholder
98 // only; not relaxed). No APDU fabricated/emitted; honest oracle-absent
99 // assertions per check — see CaseIR unresolved/open_items.
100 bind.checkData("S4-C1 runtime payload", "assembled_expected", "payload_unresolved");
101 bind.checkData("S4-C2 runtime payload", "assembled_expected", "payload_unresolved");
102
103 // 步骤 5:MTD_STORE_DATA(tc_step;REQ: RQ57_179, RQ57_180, RQ57_181, RQ57_182, RQ57_184, RQ31_097)
104 // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
105 var sdCla5 = s12.chan !== null ? (s12.chan <= 3 ? 128 + s12.chan : 188 + s12.chan).toString(16).toUpperCase() : null;
106 var s5 = bind.sendApdu(sdCla5, "E2", "91", "00", "BF4300", "00", "9000");
107 bind.checkData("S5-C1 SW", "9000", s5.sw);
108 // S5-C2: kind 'structure' pattern '' has no static generation face (corpus vacuum; see CaseIR unresolved).
109 // S5-C3: kind 'requirement' pattern '' has no static generation face (corpus vacuum; see CaseIR unresolved).
110 // S5-C2: binding:grat_response_runtime_structure(S22-5.7.22-runtime-domain) (check_attestation)
111 // S5-C3: binding:grat_response_runtime_structure(S22-5.7.22-runtime-domain) (check_attestation)
112
113 // 步骤 6:MTD_STORE_DATA(tc_step;REQ: RQ32_057, RQ57_117, RQ57_118, RQ57_119, RQ57_123, RQ31_098)
114 // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
115 var sdCla6 = s12.chan !== null ? (s12.chan <= 3 ? 128 + s12.chan : 188 + s12.chan).toString(16).toUpperCase() : null;
116 var s6 = bind.sendApdu(sdCla6, "E2", "91", "00", "BF2D00", "00", "9000");
117 bind.checkData("S6-C1 SW", "9000", s6.sw);
118 // Inline ASCII->hex helper (UTF8String expected values; values enter as
119 // ASCII literals traced to CaseIR check text / F_annexA_constants rows).
120 function __asciiHex(text) {
121 var out = "";
122 for (var i = 0; i < text.length; i++) {
123 var c = text.charCodeAt(i).toString(16).toUpperCase();
124 out += (c.length === 1 ? "0" + c : c);
125 }
126 return out;
127 }
128 var r2p6 = BindEs10xProcProfile.walkChoiceList(s6.resp, {respTag: "BF2D", okTag: "A0", errTag: "81"});
129 var r2has6_0 = false;
130 for (var r2i6_0 = 0; r2i6_0 < r2p6.elements.length; r2i6_0++) {
131 var f = r2p6.elements[r2i6_0].fields;
132 if (f["5A"] === "989209012143658709F5" && f["9F70"] === "01") { r2has6_0 = true; break; }
133 }
134 bind.checkData("S6-C2 contains PROFILE_INFO1", "1", (r2p6.branch_tag === "A0" && r2has6_0) ? "1" : "0");
135 var r2e6 = null;
136 for (var r2i6 = 0; r2i6 < r2p6.elements.length; r2i6++) {
137 if (r2p6.elements[r2i6].fields["5A"] === "989209012143658709F5") { r2e6 = r2p6.elements[r2i6].fields; break; }
138 }
139 bind.checkData("S6-C3 iccid", "989209012143658709F5", r2e6 === null ? "absent" : (r2e6["5A"] === undefined ? "absent" : r2e6["5A"]));
140 bind.checkData("S6-C3 isdpAid present", "1", (r2e6 !== null && r2e6["4F"] !== undefined) ? "1" : "0");
141 bind.checkData("S6-C3 profileState", "01", r2e6 === null ? "absent" : (r2e6["9F70"] === undefined ? "absent" : r2e6["9F70"]));
142 var r2a6_91 = __asciiHex("SP Name 1");
143 bind.checkData("S6-C3 serviceProviderName SP Name 1", r2a6_91, r2e6 === null ? "absent" : (r2e6["91"] === undefined ? "absent" : r2e6["91"]));
144 var r2a6_92 = __asciiHex("Operational Profile Name 1");
145 bind.checkData("S6-C3 profileName Operational Profile Name 1", r2a6_92, r2e6 === null ? "absent" : (r2e6["92"] === undefined ? "absent" : r2e6["92"]));
146 bind.checkData("S6-C3 iconType", "01", r2e6 === null ? "absent" : (r2e6["93"] === undefined ? "absent" : r2e6["93"]));
147 bind.checkData("S6-C3 icon present", "1", (r2e6 !== null && r2e6["94"] !== undefined) ? "1" : "0");
148 bind.checkData("S6-C3 profileClass", "02", r2e6 === null ? "absent" : (r2e6["95"] === undefined ? "absent" : r2e6["95"]));
149
150 // 步骤 7:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130)
151 // PREP_DOWNLOAD 运行时绑定(PREP_DOWNLOAD_NO_CC;SGP.22 §5.7.5 PrepareDownloadRequest=BF21 成员序 smdpSigned2(30) → smdpSignature2(5F37) → smdpCertificate(30)):
152 // 无前序 cma_decl 源(GIC CMA):transactionId 运行时随机(G Annex B <S_TRANSACTION_ID>,vendor RandHexStr 机制);euiccSignature1 无源→空串,诚实守卫拦截发送(不硬造签名明文)。
153 // DPpb cert/SK=named_certs/named_sks 声明面(sha256 锚编译期已核;曲线套索引=CI 选择同号——同一 GSMA CI 链)。
154 var pd7Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
155 var pd7Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
156 var pd7Tid = "";
157 for (var pd7Ri = 0; pd7Ri < 16; pd7Ri++) {
158 pd7Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
159 }
160 var pd7Sel = 0;
161 var pd7Sig1 = "";
162 var pd7Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
163 if (pd7Sel < 0 || pd7Sig1 === "") {
164 // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
165 bind.checkData("S7-C1 SW", "9000", "pd7_not_executed:cma_operands_absent");
166 bind.checkData("S7-C2 R_PREP_DOWNLOAD response structure", "1", "pd7_not_executed:cma_operands_absent");
167 } else {
168 bind.engine.InitEccDomainParams(pd7Dps[pd7Sel][0], pd7Dps[pd7Sel][1], pd7Dps[pd7Sel][2], pd7Dps[pd7Sel][3], pd7Dps[pd7Sel][4], 1);
169 var pd7S2 = BindEs10xSingleRequest.buildTlv("30",
170 BindEs10xSingleRequest.buildTlv("80", pd7Tid)
171 + BindEs10xSingleRequest.buildTlv("01", "00"));
172 var pd7Sgn = "";
173 while (pd7Sgn.length != 2 * pd7Sks[pd7Sel].length) {
174 bind.engine.SleepTime(2000);
175 pd7Sgn = bind.engine.EccSignData(pd7Sks[pd7Sel], pd7S2 + BindEs10xSingleRequest.buildTlv("5F37", pd7Sig1), 33);
176 }
177 var pd7Req = BindEs10xSingleRequest.buildTlv("BF21",
178 pd7S2
179 + BindEs10xSingleRequest.buildTlv("5F37", pd7Sgn)
180 + BindEs10xSingleRequest.buildTlv("30", pd7Certs[pd7Sel]));
181 var pd7Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
182 {cla: "", ins: "E2", p1: "91", p2: "00", data: pd7Req,
183 le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
184 var pd7Sw = (pd7Run.final && pd7Run.final.sw) ? pd7Run.final.sw : "transport_error";
185 bind.checkData("S7-C1 SW", "9000", pd7Sw);
186 // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
187 var pd7Otpk = "";
188 if (pd7Run.final && pd7Run.final.resp) {
189 var pd7L1 = BindEs10xSingleRequest.parseBerTlv(pd7Run.final.resp);
190 for (var pd7I1 = 0; pd7I1 < pd7L1.length && pd7Otpk === ""; pd7I1++) {
191 if (pd7L1[pd7I1].tag !== "BF21") continue;
192 var pd7L2 = BindEs10xSingleRequest.parseBerTlv(pd7L1[pd7I1].value);
193 for (var pd7I2 = 0; pd7I2 < pd7L2.length && pd7Otpk === ""; pd7I2++) {
194 if (pd7L2[pd7I2].tag !== "A0") continue;
195 var pd7L3 = BindEs10xSingleRequest.parseBerTlv(pd7L2[pd7I2].value);
196 for (var pd7I3 = 0; pd7I3 < pd7L3.length && pd7Otpk === ""; pd7I3++) {
197 if (pd7L3[pd7I3].tag !== "30") continue;
198 var pd7L4 = BindEs10xSingleRequest.parseBerTlv(pd7L3[pd7I3].value);
199 for (var pd7I4 = 0; pd7I4 < pd7L4.length; pd7I4++) {
200 if (pd7L4[pd7I4].tag === "5F49") pd7Otpk = pd7L4[pd7I4].value;
201 }
202 }
203 }
204 }
205 }
206 }
207 // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
208 var pd7RSR = (pd7Run.final && pd7Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd7Run.final.resp) : [];
209 var pd7RSOuter = pd7RSR.length === 1 ? pd7RSR[0].tag : "absent";
210 var pd7RSBr = pd7RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd7RSR[0].value) : [];
211 var pd7RSA0 = false, pd7RSA1 = false, pd7RSCk = [];
212 for (var pd7RSi = 0; pd7RSi < pd7RSBr.length; pd7RSi++) {
213 if (pd7RSBr[pd7RSi].tag === "A0") { pd7RSA0 = true; pd7RSCk = BindEs10xSingleRequest.parseBerTlv(pd7RSBr[pd7RSi].value); }
214 if (pd7RSBr[pd7RSi].tag === "A1") { pd7RSA1 = true; pd7RSCk = BindEs10xSingleRequest.parseBerTlv(pd7RSBr[pd7RSi].value); }
215 }
216 var pd7RS30 = false, pd7RS5F37 = false, pd7RS80 = false, pd7RS02 = false;
217 for (var pd7RSj = 0; pd7RSj < pd7RSCk.length; pd7RSj++) {
218 if (pd7RSCk[pd7RSj].tag === "30") pd7RS30 = true;
219 if (pd7RSCk[pd7RSj].tag === "5F37") pd7RS5F37 = true;
220 if (pd7RSCk[pd7RSj].tag === "80") pd7RS80 = true;
221 if (pd7RSCk[pd7RSj].tag === "02") pd7RS02 = true;
222 }
223 var pd7RS5F49 = false;
224 if (pd7RS30) {
225 for (var pd7RSk = 0; pd7RSk < pd7RSCk.length; pd7RSk++) {
226 if (pd7RSCk[pd7RSk].tag !== "30") continue;
227 var pd7RSU = BindEs10xSingleRequest.parseBerTlv(pd7RSCk[pd7RSk].value);
228 for (var pd7RSm = 0; pd7RSm < pd7RSU.length; pd7RSm++) {
229 if (pd7RSU[pd7RSm].tag === "5F49") pd7RS5F49 = true;
230 if (pd7RSU[pd7RSm].tag === "80") pd7RS80 = true;
231 }
232 }
233 }
234 bind.checkData("S7-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd7RSOuter);
235 bind.checkData("S7-C2 R_PREP_DOWNLOAD required members present", "1", (pd7RSA0 && pd7RS30 && pd7RS80 && pd7RS5F49 && pd7RS5F37) ? "1" : "0");
236}
237
完整 unified diff
行级差异:新增 235 行 / 删除 57 行(以 -man 为基准,unified 上下文 3 行)。
展开 diff(297 行)
--- -man
+++ -cas
@@ -1,59 +1,237 @@
-// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_GetProfilesInfo_GetRAT_RSPSession_01_Nominal_GetProfilesInfo_and_GetRAT_during_RSP_session (extracted verbatim)
-
-function TC_eUICC_GetProfilesInfo_GetRAT_RSPSession_01_Nominal_GetProfilesInfo_and_GetRAT_during_RSP_session()
-{
-
- initial_condition_PROFILE_OPERATIONAL1_is_Enabled();
-
- tracenamestr = "确保在RSP会话期间,可以请求eUICC获取已安装的Profiles的列表和RAT ";
- curDis.TraceStart(sno++,tracenamestr);
-
- curLogicChannel = 0;
- curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
- Ini_powerOn_eUICC_LPAe_not_activate();
-
-
- curDis.TestStepStart("读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
- TS_MANAGE_CHANNEL_OPEN();
-
- curLogicChannel = 1;
-
- curDis.TestStepStart("读卡器向卡片发送SELECT命令,选择ISD-R;");
- TS_SELECT("Select ISD",ISD_R_AID,"9000");
-
- curDis.TestStepStart("读卡器向卡片发送 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.TestStepStart("读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
- Profile_load_procedure.ES10b_GetEUICCChallenge();
-
- curDis.TestStepStart("读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
- Profile_load_procedure.ES10b_AuthenticateServer();
-
- curDis.TestStepStart("读卡器向卡片发送 StoreData命令,执行GetRatRequest;");
- var respData = LPAd_Transport_data_to_eUICC(GetRatRequestHexStr);
-
- var getRatResponse = new GetRatResponse();
- getRatResponse.checkCardResDataFormat(respData);
-
- curStrHandle.CheckData(R_DEFAULT_RAT, respData, "RAT");
-
- curDis.TestStepStart("读卡器向卡片发送 StoreData命令,执行ProfileInfoListRequest,获取profile状态;");
- var proInfoListRequest = new ProfileInfoListRequest();
- proInfoListRequest.GenHexData();
- var respData = LPAd_Transport_data_to_eUICC(proInfoListRequest.hexData);
-
- var proInfoListResponse = new ProfileInfoListResponse();
- proInfoListResponse.checkCardResDataFormat(respData);
-
- curDis.TestStepStart("读卡器向卡片发送 StoreData命令,执行PrepareDownloadRequest;");
- Profile_load_procedure.ES10b_PrepareDownload();
-
-
- RecoverCard();
+// Author: 卡思Cas智能体
+// Date: 20261004-022947
+// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_GetProfilesInfo_GetRAT_RSPSession,Test Sequence #01 Nominal: GetProfilesInfo and GetRAT during RSP session(本 TC 单条 Test Sequence),适用性 M。
+// Test points: ICH-IC1-K1-C1 ATR_present;ICH-IC1-K2-C2 FCP_Template;ICH-IC1-K2-C4 SW
+// ICH-IC1-K3-C4 SW;ICH-IC1-K4-C4 final SW;ICH-IC2-K1-C4 SW;ICH-IC2-K1-C3 CHANNEL_NUMBER extracted
+// ICH-IC2-K2-C4 SW;S1-C1 SW;S1-C2 R_EUICC_INFO1 outer tag
+// S1-C2 R_EUICC_INFO1 required members present;S1-C3 CI PK lists share at least one key id
+// S2-C1 SW;S2-C2 R_CHALLENGE outer tag;S2-C2 R_CHALLENGE required members present
+// S2-C2 tagOfeuiccChallenge;S2-C2 lengthOfeuiccChallenge;S4-C1 runtime payload
+// S4-C2 runtime payload;S5-C1 SW;S6-C1 SW;S6-C2 contains PROFILE_INFO1;S6-C3 iccid
+// S6-C3 isdpAid present;S6-C3 profileState;S6-C3 serviceProviderName SP Name 1
+// S6-C3 profileName Operational Profile Name 1;S6-C3 iconType;S6-C3 icon present
+// S6-C3 profileClass;S7-C1 SW;S7-C2 R_PREP_DOWNLOAD response structure
+// S7-C2 R_PREP_DOWNLOAD outer tag;S7-C2 R_PREP_DOWNLOAD required members present
+// 本函数由 CaseIR 5.2.3.2.1 编译生成(5.2.3.2.1-TC_eUICC_GetProfilesInfo_GetRAT_RSPSession-20261004_022947,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).
+// 适用性 M:编译期门,运行时由 harness 环境前置承担。
+function TC_eUICC_GetProfilesInfo_GetRAT_RSPSession_01_merged() {
+ var bind = curBind;
+ // SEQ-IC-1 卡态声明(E 段序列级 Initial Conditions,编排责任):The eUICC's RAT is configured as detailed SGP.21 Annex H: one PPAR authorizing PPR1 and PPR2 for all MNOs with End User consent required (i.e. #PPRS_ALLOWED); no additional rules: declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
+ // SEQ-IC-2 卡态声明(E 段序列级 Initial Conditions,编排责任):The PROFILE_OPERATIONAL1 is installed and Enabled on the eUICC: declared unexpanded (non-PROC row or K corpus vacuum; see CaseIR open_items).
+
+ // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 1):RESET(K 语料机械展开)
+ var s8 = bind.resetAndAtr();
+ bind.checkData("ICH-IC1-K1-C1 ATR_present", "1", s8.atr_hex !== "" ? "1" : "0");
+
+ // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 2):SELECT_MF(K 语料机械展开)
+ // FCP outer tag not materialized from clause: tag-face asserted only when corpus fixes the tag byte (e.g. TS 102 221 FCP '62').
+ var s9 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
+ bind.checkData("ICH-IC1-K2-C2 FCP_Template", "1", s9.resp.length > 0 ? "1" : "0");
+ bind.checkData("ICH-IC1-K2-C4 SW", "9000", s9.sw);
+
+ // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 3):TERMINAL_CAPABILITY_LPAd(K 语料机械展开)
+ var s10 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
+ bind.checkData("ICH-IC1-K3-C4 SW", "9000", s10.sw);
+
+ // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 4):TERMINAL_PROFILE(K 语料机械展开)
+ var steady11 = bind.runToSteadyState(function () {
+ return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
+ });
+ bind.checkData("ICH-IC1-K4-C4 final SW", "9000", steady11.final.sw);
+
+ // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 1):MANAGE_CHANNEL_OPEN(K 语料机械展开)
+ // CHANNEL_NUMBER extraction and dynamic CLA rebinding are CasBind internal state (chaining rule; no generated-code re-implementation).
+ var s12 = bind.manageChannelOpen("9000");
+ bind.checkData("ICH-IC2-K1-C4 SW", "9000", s12.sw);
+ bind.checkData("ICH-IC2-K1-C3 CHANNEL_NUMBER extracted", "1", s12.chan !== null ? "1" : "0");
+
+ // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 2):MTD_SELECT(K 语料机械展开)
+ // CLA = bound channel (cla_rule) and <L> length binding are CasBind internal state (chaining rule; no generated-code re-implementation).
+ var s13 = bind.sendApdu(null, "A4", "04", "00", "A0000005591010FFFFFFFF8900000100", null, "9000");
+ // MTD_SELECT expected face is SW-only (K Annex C.2 open-channel procedure step 2: no FCI content assertion in corpus); no fabricated template parse.
+ bind.checkData("ICH-IC2-K2-C4 SW", "9000", s13.sw);
+
+ // 步骤 1:MTD_STORE_DATA(tc_step)
+ // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
+ var sdCla1 = s12.chan !== null ? (s12.chan <= 3 ? 128 + s12.chan : 188 + s12.chan).toString(16).toUpperCase() : null;
+ var s1 = bind.sendApdu(sdCla1, "E2", "91", "00", "BF2000", "00", "9000");
+ bind.checkData("S1-C1 SW", "9000", s1.sw);
+ // geca-proc ES10b Info 响应面(R_EUICC_INFO1,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
+ var gw1 = BindGecaProc.parseGecaResponse(s1.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
+ bind.checkData("S1-C2 R_EUICC_INFO1 outer tag", "BF20", gw1.outer_tag === null ? "absent" : gw1.outer_tag);
+ bind.checkData("S1-C2 R_EUICC_INFO1 required members present", "1", gw1.ok ? "1" : "0");
+ var pkV1 = BindEs10xSingleRequest.parseBerTlv(gw1.fields["A9"] || "");
+ var pkS1 = BindEs10xSingleRequest.parseBerTlv(gw1.fields["AA"] || "");
+ var samePk1 = false;
+ for (var pvi1 = 0; pvi1 < pkV1.length; pvi1++) {
+ for (var psi1 = 0; psi1 < pkS1.length; psi1++) {
+ if (pkV1[pvi1].value !== "" && pkV1[pvi1].value === pkS1[psi1].value) { samePk1 = true; }
+ }
+ }
+ bind.checkData("S1-C3 CI PK lists share at least one key id", "1", samePk1 ? "1" : "0");
+
+ // 步骤 2:MTD_STORE_DATA(tc_step)
+ // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
+ var sdCla2 = s12.chan !== null ? (s12.chan <= 3 ? 128 + s12.chan : 188 + s12.chan).toString(16).toUpperCase() : null;
+ var s2 = bind.sendApdu(sdCla2, "E2", "91", "00", "BF2E00", "00", "9000");
+ bind.checkData("S2-C1 SW", "9000", s2.sw);
+ // geca-proc ES10b Info 响应面(R_CHALLENGE,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
+ var gw2 = BindGecaProc.parseGecaResponse(s2.resp, {outer: "BF2E", required: ["80"], optional: []});
+ bind.checkData("S2-C2 R_CHALLENGE outer tag", "BF2E", gw2.outer_tag === null ? "absent" : gw2.outer_tag);
+ bind.checkData("S2-C2 R_CHALLENGE required members present", "1", gw2.ok ? "1" : "0");
+ var r2w2 = BindGecaProc.parseGecaResponse(s2.resp, {outer: "BF2E", required: ["80"]});
+ bind.checkData("S2-C2 R_CHALLENGE outer tag", "BF2E", r2w2.outer_tag === null ? "absent" : r2w2.outer_tag);
+ var r2ch2 = null; for (var r2ci2 = 0; r2ci2 < r2w2.children.length; r2ci2++) { if (r2w2.children[r2ci2].tag === "80") { r2ch2 = r2w2.children[r2ci2]; } }
+ var r2chal2 = r2ch2 === null ? "" : r2ch2.value;
+ bind.checkData("S2-C2 tagOfeuiccChallenge", "80", r2ch2 === null ? "absent" : r2ch2.tag);
+ bind.checkData("S2-C2 lengthOfeuiccChallenge", "10", r2ch2 === null ? "absent" : (r2ch2.len < 16 ? ("0" + r2ch2.len.toString(16).toUpperCase()) : r2ch2.len.toString(16).toUpperCase()));
+
+ // 步骤 3:Step IC6 输入准备(InitiateAuthentication):<S_TRANSACTION_ID>、<EUICC_CHALLENGE>、<S_SMDP_CHALLENGE>、<S_SMDP_SIGNATURE1>;设 <EUICC_CI_PK_ID_TO_BE_USED> 为 <EUICC_CI_PK_ID_LIST_FOR_SIGNING> 中最高优先级的 CI Key ID;选取导向同一 Root CI 证书的 #CERT_S_SM_DPauth_ECDSA(tc_step;non_wire)
+ // test-tool internal preparation (no APDU face): runtime-domain
+ // values per CaseIR unresolved (G Annex B generation rules);
+ // no fabricated bytes emitted here.
+
+ // 步骤 4:MTD_STORE_DATA_SCRIPT(tc_step)
+ // multi-placeholder runtime template without dynamic_template declaration:
+ // bytes not closeable offline (B-4 placeholder contract is single-placeholder
+ // only; not relaxed). No APDU fabricated/emitted; honest oracle-absent
+ // assertions per check — see CaseIR unresolved/open_items.
+ bind.checkData("S4-C1 runtime payload", "assembled_expected", "payload_unresolved");
+ bind.checkData("S4-C2 runtime payload", "assembled_expected", "payload_unresolved");
+
+ // 步骤 5:MTD_STORE_DATA(tc_step;REQ: RQ57_179, RQ57_180, RQ57_181, RQ57_182, RQ57_184, RQ31_097)
+ // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
+ var sdCla5 = s12.chan !== null ? (s12.chan <= 3 ? 128 + s12.chan : 188 + s12.chan).toString(16).toUpperCase() : null;
+ var s5 = bind.sendApdu(sdCla5, "E2", "91", "00", "BF4300", "00", "9000");
+ bind.checkData("S5-C1 SW", "9000", s5.sw);
+ // S5-C2: kind 'structure' pattern '' has no static generation face (corpus vacuum; see CaseIR unresolved).
+ // S5-C3: kind 'requirement' pattern '' has no static generation face (corpus vacuum; see CaseIR unresolved).
+ // S5-C2: binding:grat_response_runtime_structure(S22-5.7.22-runtime-domain) (check_attestation)
+ // S5-C3: binding:grat_response_runtime_structure(S22-5.7.22-runtime-domain) (check_attestation)
+
+ // 步骤 6:MTD_STORE_DATA(tc_step;REQ: RQ32_057, RQ57_117, RQ57_118, RQ57_119, RQ57_123, RQ31_098)
+ // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
+ var sdCla6 = s12.chan !== null ? (s12.chan <= 3 ? 128 + s12.chan : 188 + s12.chan).toString(16).toUpperCase() : null;
+ var s6 = bind.sendApdu(sdCla6, "E2", "91", "00", "BF2D00", "00", "9000");
+ bind.checkData("S6-C1 SW", "9000", s6.sw);
+ // Inline ASCII->hex helper (UTF8String expected values; values enter as
+ // ASCII literals traced to CaseIR check text / F_annexA_constants rows).
+ function __asciiHex(text) {
+ var out = "";
+ for (var i = 0; i < text.length; i++) {
+ var c = text.charCodeAt(i).toString(16).toUpperCase();
+ out += (c.length === 1 ? "0" + c : c);
+ }
+ return out;
+ }
+ var r2p6 = BindEs10xProcProfile.walkChoiceList(s6.resp, {respTag: "BF2D", okTag: "A0", errTag: "81"});
+ var r2has6_0 = false;
+ for (var r2i6_0 = 0; r2i6_0 < r2p6.elements.length; r2i6_0++) {
+ var f = r2p6.elements[r2i6_0].fields;
+ if (f["5A"] === "989209012143658709F5" && f["9F70"] === "01") { r2has6_0 = true; break; }
+ }
+ bind.checkData("S6-C2 contains PROFILE_INFO1", "1", (r2p6.branch_tag === "A0" && r2has6_0) ? "1" : "0");
+ var r2e6 = null;
+ for (var r2i6 = 0; r2i6 < r2p6.elements.length; r2i6++) {
+ if (r2p6.elements[r2i6].fields["5A"] === "989209012143658709F5") { r2e6 = r2p6.elements[r2i6].fields; break; }
+ }
+ bind.checkData("S6-C3 iccid", "989209012143658709F5", r2e6 === null ? "absent" : (r2e6["5A"] === undefined ? "absent" : r2e6["5A"]));
+ bind.checkData("S6-C3 isdpAid present", "1", (r2e6 !== null && r2e6["4F"] !== undefined) ? "1" : "0");
+ bind.checkData("S6-C3 profileState", "01", r2e6 === null ? "absent" : (r2e6["9F70"] === undefined ? "absent" : r2e6["9F70"]));
+ var r2a6_91 = __asciiHex("SP Name 1");
+ bind.checkData("S6-C3 serviceProviderName SP Name 1", r2a6_91, r2e6 === null ? "absent" : (r2e6["91"] === undefined ? "absent" : r2e6["91"]));
+ var r2a6_92 = __asciiHex("Operational Profile Name 1");
+ bind.checkData("S6-C3 profileName Operational Profile Name 1", r2a6_92, r2e6 === null ? "absent" : (r2e6["92"] === undefined ? "absent" : r2e6["92"]));
+ bind.checkData("S6-C3 iconType", "01", r2e6 === null ? "absent" : (r2e6["93"] === undefined ? "absent" : r2e6["93"]));
+ bind.checkData("S6-C3 icon present", "1", (r2e6 !== null && r2e6["94"] !== undefined) ? "1" : "0");
+ bind.checkData("S6-C3 profileClass", "02", r2e6 === null ? "absent" : (r2e6["95"] === undefined ? "absent" : r2e6["95"]));
+
+ // 步骤 7:MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ31_130)
+ // 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 pd7Certs = ["308201DFA00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434355A170D3330303333303038333434355A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D03010703420004104C2AE3D02DEF9C979261A7C6710076B970721D0955A2644AE05FAE4BC2314E5DC09F6BF0118026165342E212318775E365F3B57325373066B9906E0BD1388DA381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414E6EAF71EE0FB9430ECCD1EBB421F881437C13263300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034800304502203EA51B0129FC11E843C38C8CB104244CCF92D8DDBCD4D5F9DAFD0AEF700A9B1C022100FEF382FF71FEFC58168A3607D5685DB7CB48F6B434261891496385BCD6B5857A", "308201E0A00302010202020101300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333434365A170D3330303333303038333434365A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004893253ECC94C51DF4FEE6E0DB0951CFC65627481B5418E557069F487FAA15466A5CB8E10CC2B38099CF2A929F7F82DAC065126B71D0640961DB7F91A49E95612A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E04160414A8C68DF449EB71EC723EAC132E40E4B6F54644FE300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010530610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D04030203470030440220244ED22119D00D49D9EA4AC5D9A6D925FACFCD1998A96448A870CE47FE5E470E02206C4BC7223C925D548DDDD3D8DDD81118DA202973311F6012BB0A20E6DD2D7B7B"];
+ var pd7Sks = ["DCD694B778957E8E9ADDBDD94433E9EF8F73D11E491C48D425A38A9491BD3BED", "75FF322F416616DAE1A484EF71D4874FB0DF3295FD35C2CBA489FBB2BB9C7BF6"];
+ var pd7Tid = "";
+ for (var pd7Ri = 0; pd7Ri < 16; pd7Ri++) {
+ pd7Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+ }
+ var pd7Sel = 0;
+ var pd7Sig1 = "";
+ var pd7Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+ if (pd7Sel < 0 || pd7Sig1 === "") {
+ // fail-closed 诚实面:CMA 运行时操作数缺席(CMA 失败/未执行)→ BF21 不发送(前序 CMA 步断言面已计错,本步不伪造通过)。
+ bind.checkData("S7-C1 SW", "9000", "pd7_not_executed:cma_operands_absent");
+ bind.checkData("S7-C2 R_PREP_DOWNLOAD response structure", "1", "pd7_not_executed:cma_operands_absent");
+ } else {
+ bind.engine.InitEccDomainParams(pd7Dps[pd7Sel][0], pd7Dps[pd7Sel][1], pd7Dps[pd7Sel][2], pd7Dps[pd7Sel][3], pd7Dps[pd7Sel][4], 1);
+ var pd7S2 = BindEs10xSingleRequest.buildTlv("30",
+ BindEs10xSingleRequest.buildTlv("80", pd7Tid)
+ + BindEs10xSingleRequest.buildTlv("01", "00"));
+ var pd7Sgn = "";
+ while (pd7Sgn.length != 2 * pd7Sks[pd7Sel].length) {
+ bind.engine.SleepTime(2000);
+ pd7Sgn = bind.engine.EccSignData(pd7Sks[pd7Sel], pd7S2 + BindEs10xSingleRequest.buildTlv("5F37", pd7Sig1), 33);
+ }
+ var pd7Req = BindEs10xSingleRequest.buildTlv("BF21",
+ pd7S2
+ + BindEs10xSingleRequest.buildTlv("5F37", pd7Sgn)
+ + BindEs10xSingleRequest.buildTlv("30", pd7Certs[pd7Sel]));
+ var pd7Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+ {cla: "", ins: "E2", p1: "91", p2: "00", data: pd7Req,
+ le: "00", blockSize: 255, blockSw: "9000", final_sw: "9000"});
+ var pd7Sw = (pd7Run.final && pd7Run.final.sw) ? pd7Run.final.sw : "transport_error";
+ bind.checkData("S7-C1 SW", "9000", pd7Sw);
+ // euiccOtpk(5F49)运行时提取面登记:响应 ok 分支 euiccSigned2 成员(BF21 A0 30 5F49 路径),供后续步(RETRY 形 bppEuiccOtpk/BPP 装配)消费。
+ var pd7Otpk = "";
+ if (pd7Run.final && pd7Run.final.resp) {
+ var pd7L1 = BindEs10xSingleRequest.parseBerTlv(pd7Run.final.resp);
+ for (var pd7I1 = 0; pd7I1 < pd7L1.length && pd7Otpk === ""; pd7I1++) {
+ if (pd7L1[pd7I1].tag !== "BF21") continue;
+ var pd7L2 = BindEs10xSingleRequest.parseBerTlv(pd7L1[pd7I1].value);
+ for (var pd7I2 = 0; pd7I2 < pd7L2.length && pd7Otpk === ""; pd7I2++) {
+ if (pd7L2[pd7I2].tag !== "A0") continue;
+ var pd7L3 = BindEs10xSingleRequest.parseBerTlv(pd7L2[pd7I2].value);
+ for (var pd7I3 = 0; pd7I3 < pd7L3.length && pd7Otpk === ""; pd7I3++) {
+ if (pd7L3[pd7I3].tag !== "30") continue;
+ var pd7L4 = BindEs10xSingleRequest.parseBerTlv(pd7L3[pd7I3].value);
+ for (var pd7I4 = 0; pd7I4 < pd7L4.length; pd7I4++) {
+ if (pd7L4[pd7I4].tag === "5F49") pd7Otpk = pd7L4[pd7I4].value;
+ }
+ }
+ }
+ }
+ }
+ }
+ // R_PREP_DOWNLOAD 响应结构(S22_prep_dl §5.7.5 行 77-111:外层 BF21 CHOICE;downloadResponseOk A0{euiccSigned2 30{80,5F49}, euiccSignature2 5F37}):运行时域,仅结构与在场性断言。
+ var pd7RSR = (pd7Run.final && pd7Run.final.resp) ? BindEs10xSingleRequest.parseBerTlv(pd7Run.final.resp) : [];
+ var pd7RSOuter = pd7RSR.length === 1 ? pd7RSR[0].tag : "absent";
+ var pd7RSBr = pd7RSR.length === 1 ? BindEs10xSingleRequest.parseBerTlv(pd7RSR[0].value) : [];
+ var pd7RSA0 = false, pd7RSA1 = false, pd7RSCk = [];
+ for (var pd7RSi = 0; pd7RSi < pd7RSBr.length; pd7RSi++) {
+ if (pd7RSBr[pd7RSi].tag === "A0") { pd7RSA0 = true; pd7RSCk = BindEs10xSingleRequest.parseBerTlv(pd7RSBr[pd7RSi].value); }
+ if (pd7RSBr[pd7RSi].tag === "A1") { pd7RSA1 = true; pd7RSCk = BindEs10xSingleRequest.parseBerTlv(pd7RSBr[pd7RSi].value); }
+ }
+ var pd7RS30 = false, pd7RS5F37 = false, pd7RS80 = false, pd7RS02 = false;
+ for (var pd7RSj = 0; pd7RSj < pd7RSCk.length; pd7RSj++) {
+ if (pd7RSCk[pd7RSj].tag === "30") pd7RS30 = true;
+ if (pd7RSCk[pd7RSj].tag === "5F37") pd7RS5F37 = true;
+ if (pd7RSCk[pd7RSj].tag === "80") pd7RS80 = true;
+ if (pd7RSCk[pd7RSj].tag === "02") pd7RS02 = true;
+ }
+ var pd7RS5F49 = false;
+ if (pd7RS30) {
+ for (var pd7RSk = 0; pd7RSk < pd7RSCk.length; pd7RSk++) {
+ if (pd7RSCk[pd7RSk].tag !== "30") continue;
+ var pd7RSU = BindEs10xSingleRequest.parseBerTlv(pd7RSCk[pd7RSk].value);
+ for (var pd7RSm = 0; pd7RSm < pd7RSU.length; pd7RSm++) {
+ if (pd7RSU[pd7RSm].tag === "5F49") pd7RS5F49 = true;
+ if (pd7RSU[pd7RSm].tag === "80") pd7RS80 = true;
+ }
+ }
+ }
+ bind.checkData("S7-C2 R_PREP_DOWNLOAD outer tag", "BF21", pd7RSOuter);
+ bind.checkData("S7-C2 R_PREP_DOWNLOAD required members present", "1", (pd7RSA0 && pd7RS30 && pd7RS80 && pd7RS5F49 && pd7RS5F37) ? "1" : "0");
}