源码对照:4.2.13.2.4
ES10b 获取 eUICCInfo2 / TC_eUICC_ES10b.GetEUICCInfo2
左侧为人工切片入口(-man,来自 原料/切片 的最小可执行脚本),右侧为 Cas 盲生成入口(-cas,仅依据规范生成)。文件按原始编码(多为 GBK)解码为 UTF-8 显示,行号自 1 起;字节级原文与 sha256 见两侧脚本包。完整 unified diff 见本页底部折叠区,以及 报告原文 §4。
-man 入口
Import/TestCase_SGP_23.js
43 行 / 1789 字符 / gb18030
-cas 入口
TC_eUICC_ES10b_GetEUICCInfo2/Import/TC_eUICC_ES10b_GetEUICCInfo2.js
208 行 / 18553 字符 / gb18030
默认折行显示长行;取消勾选可横向滚动查看原始行宽
-man 人工切片Import/TestCase_SGP_23.js43 行 / 1789 字符 / gb18030入口函数 @L3
1// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10b_GetEUICCInfo2_02_Nominal_GetEUICCInfo2_call_after_AuthenticateServer (extracted verbatim)
2
3function TC_eUICC_ES10b_GetEUICCInfo2_02_Nominal_GetEUICCInfo2_call_after_AuthenticateServer()
4{
5 tracenamestr = "测试目的:执行AuthenticateServer后获取EUICCInfo2";
6 curDis.TraceStart(sno++,tracenamestr);
7
8 curDis.TestStepStart2(stno++,"eUICC卡片初始化;");
9 Ini_powerOn_eUICC_LPAe_not_activate();
10
11 curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
12 TS_MANAGE_CHANNEL_OPEN();
13
14 curLogicChannel = 1;
15
16 curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
17 TS_SELECT("Select ISD",ISD_R_AID,"9000");
18
19 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
20 var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
21 Profile_load_procedure.ICCID = ICCID_OP_PROF1;
22 Profile_load_procedure.ES10b_GetEUICCInfo1();
23
24
25 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
26 Profile_load_procedure.ES10b_GetEUICCChallenge();
27
28 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
29 Profile_load_procedure.ES10b_AuthenticateServer();
30 var euiccInfo2_hexData_1 = Profile_load_procedure.authServerResponse.authenticateResponseOk.euiccSigned1.euiccInfo2.hexData;
31
32 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo2Request,获取EUICCInfo2;");
33
34 var euiccInfo2 = new EUICCInfo2();
35 var hexData = LPAd_Transport_data_to_eUICC(GetEuiccInfo2RequestHexStr);
36
37 euiccInfo2.checkCardResDataFormat(hexData);
38 curStrHandle.CheckData(euiccInfo2_hexData_1, euiccInfo2.hexData,"检查EUICCInfo2数据应与authServerResponse中返回的数据一致");
39
40 check_EUICCInfo2(euiccInfo2);
41 RecoverCard();
42}
43
-cas 盲生成TC_eUICC_ES10b_GetEUICCInfo2/Import/TC_eUICC_ES10b_GetEUICCInfo2.js208 行 / 18553 字符 / gb18030入口函数 @L22
1// Author: 卡思Cas智能体
2// Date: 20260928-203316
3// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10b.GetEUICCInfo2,Test Sequence #01 Nominal: GetEUICCInfo2 call after AuthenticateServer,适用性 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 euiccChallenge tag;S2-C2 euiccChallenge length
9// IC6-C1 MTD_STORE_DATA_SCRIPT(#AUTHENTICATE_SMDP) SW
10// IC6-C2 #R_AUTHENTICATE_SMDP authenticateResponseOk structure (euiccSigned1);S3-C1 SW
11// S3-C2 R_EUICC_INFO2 outer tag;S3-C2 R_EUICC_INFO2 required members present
12// S3-C3 IC6 euiccInfo2 equality (extCardResource excluded) oracle
13// S3-C4 RQ57_051 function accepted at this sequence position;S3-C5 RQ57_053 command data
14// S3-C6 RQ57_058 ts102241Version presence observed
15// S3-C7 RQ57_059 globalplatformVersion presence observed;S3-C8 RQ57_062 rpmSupport bit is 0
16// S3-C9 svn consistency with step (6) via IC6 equality oracle
17// S3-C10 RQ43_001 eUICC information provided in response
18// S3-C11 RQ43_002 EUICCInfo2 received from eUICC
19// 本函数由 CaseIR 4.2.13.2.4 编译生成(4.2.13.2.4-TC_eUICC_ES10b.GetEUICCInfo2-20260928_043958,SGP.23 v1.16 × SGP.22 v2.7):字节权威=CaseIR,非誊录黄金脚本。
20// Value-free template: every data byte is injected from CaseIR fields; no scaffold globals (see docs/speconly/compile-symbol-migration.md).
21// 适用性 M:编译期门,运行时由 harness 环境前置承担。
22function TC_eUICC_ES10b_GetEUICCInfo2_01_merged() {
23 var bind = curBind;
24
25 // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 1):RESET(K 语料机械展开)
26 var s4 = bind.resetAndAtr();
27 bind.checkData("ICH-IC1-K1-C1 ATR_present", "1", s4.atr_hex !== "" ? "1" : "0");
28
29 // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 2):SELECT_MF(K 语料机械展开)
30 // FCP outer tag not materialized from clause: tag-face asserted only when corpus fixes the tag byte (e.g. TS 102 221 FCP '62').
31 var s5 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
32 bind.checkData("ICH-IC1-K2-C2 FCP_Template", "1", s5.resp.length > 0 ? "1" : "0");
33 bind.checkData("ICH-IC1-K2-C4 SW", "9000", s5.sw);
34
35 // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 3):TERMINAL_CAPABILITY_LPAd(K 语料机械展开)
36 var s6 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
37 bind.checkData("ICH-IC1-K3-C4 SW", "9000", s6.sw);
38
39 // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 4):TERMINAL_PROFILE(K 语料机械展开)
40 var steady7 = bind.runToSteadyState(function () {
41 return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
42 });
43 bind.checkData("ICH-IC1-K4-C4 final SW", "9000", steady7.final.sw);
44
45 // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 1):MANAGE_CHANNEL_OPEN(K 语料机械展开)
46 // CHANNEL_NUMBER extraction and dynamic CLA rebinding are CasBind internal state (chaining rule; no generated-code re-implementation).
47 var s8 = bind.manageChannelOpen("9000");
48 bind.checkData("ICH-IC2-K1-C4 SW", "9000", s8.sw);
49 bind.checkData("ICH-IC2-K1-C3 CHANNEL_NUMBER extracted", "1", s8.chan !== null ? "1" : "0");
50
51 // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 2):MTD_SELECT(K 语料机械展开)
52 // CLA = bound channel (cla_rule) and <L> length binding are CasBind internal state (chaining rule; no generated-code re-implementation).
53 var s9 = bind.sendApdu(null, "A4", "04", "00", "A0000005591010FFFFFFFF8900000100", null, "9000");
54 // 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.
55 bind.checkData("ICH-IC2-K2-C4 SW", "9000", s9.sw);
56
57 // 步骤 1:MTD_STORE_DATA(procedure_expansion)
58 // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
59 var sdCla1 = s8.chan !== null ? (s8.chan <= 3 ? 128 + s8.chan : 188 + s8.chan).toString(16).toUpperCase() : null;
60 var s1 = bind.sendApdu(sdCla1, "E2", "91", "00", "BF2000", "00", "9000");
61 bind.checkData("S1-C1 SW", "9000", s1.sw);
62 // geca-proc ES10b Info 响应面(R_EUICC_INFO1,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
63 var gw1 = BindGecaProc.parseGecaResponse(s1.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
64 bind.checkData("S1-C2 R_EUICC_INFO1 outer tag", "BF20", gw1.outer_tag === null ? "absent" : gw1.outer_tag);
65 bind.checkData("S1-C2 R_EUICC_INFO1 required members present", "1", gw1.ok ? "1" : "0");
66 var pkV1 = BindEs10xSingleRequest.parseBerTlv(gw1.fields["A9"] || "");
67 var pkS1 = BindEs10xSingleRequest.parseBerTlv(gw1.fields["AA"] || "");
68 var samePk1 = false;
69 for (var pvi1 = 0; pvi1 < pkV1.length; pvi1++) {
70 for (var psi1 = 0; psi1 < pkS1.length; psi1++) {
71 if (pkV1[pvi1].value !== "" && pkV1[pvi1].value === pkS1[psi1].value) { samePk1 = true; }
72 }
73 }
74 bind.checkData("S1-C3 CI PK lists share at least one key id", "1", samePk1 ? "1" : "0");
75
76 // 步骤 2:MTD_STORE_DATA(procedure_expansion)
77 // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
78 var sdCla2 = s8.chan !== null ? (s8.chan <= 3 ? 128 + s8.chan : 188 + s8.chan).toString(16).toUpperCase() : null;
79 var s2 = bind.sendApdu(sdCla2, "E2", "91", "00", "BF2E00", "00", "9000");
80 bind.checkData("S2-C1 SW", "9000", s2.sw);
81 // geca-proc ES10b Info 响应面(R_CHALLENGE,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
82 var gw2 = BindGecaProc.parseGecaResponse(s2.resp, {outer: "BF2E", required: ["80"], optional: []});
83 bind.checkData("S2-C2 R_CHALLENGE outer tag", "BF2E", gw2.outer_tag === null ? "absent" : gw2.outer_tag);
84 var gwch2 = null; for (var gwci2 = 0; gwci2 < gw2.children.length; gwci2++) { if (gw2.children[gwci2].tag === "80") { gwch2 = gw2.children[gwci2]; } }
85 bind.checkData("S2-C2 euiccChallenge tag", "80", gwch2 === null ? "absent" : gwch2.tag);
86 bind.checkData("S2-C2 euiccChallenge length", "10", gwch2 === null ? "absent" : (gwch2.len < 16 ? ("0" + gwch2.len.toString(16).toUpperCase()) : gwch2.len.toString(16).toUpperCase()));
87
88 // IC6 MTD_STORE_DATA_SCRIPT(#AUTHENTICATE_SMDP): dynamic-bound 运行时绑定(payload-dynamic-binding lane 落地;声明面 = CaseIR initial_conditions IC6
89 // dynamic_binding;物料 = input/crypto SGP.26 v1.5 valid DPauth 双曲线套(sha256 锚定);binding 链结构照 vendor ABI
90 // RSP_Test_Procedure.js:1915-1950(组装+签名+CI PK ID+证书裁剪)/CommonArith.js:2210-2236(EccSignData(·,·,33)=ECDSA-SHA256 重试环)。
91 // 运行时随机输入(vendor RandHexStr 形态:engine.Hex+Math.random 机制字节,无静态虚构):
92 var ic6Tid = "";
93 var ic6Sc = "";
94 for (var ic6Ri = 0; ic6Ri < 16; ic6Ri++) {
95 ic6Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
96 ic6Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
97 }
98 // 物料套运行时选择(vendor FromPKID_Select_CertInfo 先例;E 表133 IC5:取步1 EUICC_CI_PK_ID_LIST_FOR_SIGNING 最高优先级命中套):
99 var ic6PkList = BindEs10xSingleRequest.parseBerTlv(gw1.fields["AA"] || "");
100 var ic6CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
101 var ic6Sks = ["0A7CC1C244E60C52CD5B7807AB8C360C26524601507DCABC5DD598B5A616D5D5", "93FB33D0584F349B07F8B5D2AF93D7C3E354B349A3B913502E6ABC070E4D4929"];
102 var ic6Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
103 var ic6Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
104 var ic6Sel = -1;
105 for (var ic6Pi = 0; ic6Pi < ic6PkList.length && ic6Sel < 0; ic6Pi++) {
106 for (var ic6Mi = 0; ic6Mi < ic6CiIds.length; ic6Mi++) {
107 if (ic6PkList[ic6Pi].value === ic6CiIds[ic6Mi]) { ic6Sel = ic6Mi; break; }
108 }
109 }
110 var ic6Info2 = "";
111 if (ic6Sel < 0) {
112 // fail-closed 诚实面:CI PK ID 零命中物料套 → 不发送,oracle 操作数缺席如实计错。
113 bind.checkData("IC6-C1 MTD_STORE_DATA_SCRIPT(#AUTHENTICATE_SMDP) SW", "9000", "ic6_not_executed:no_matching_ci_pk_id");
114 bind.checkData("IC6-C2 #R_AUTHENTICATE_SMDP authenticateResponseOk structure (euiccSigned1)", "1", "0");
115 } else {
116 bind.engine.InitEccDomainParams(ic6Dps[ic6Sel][0], ic6Dps[ic6Sel][1], ic6Dps[ic6Sel][2], ic6Dps[ic6Sel][3], ic6Dps[ic6Sel][4], 1);
117 // 签名明文 = serverSigned1 完整 SEQUENCE TLV(vendor 签名面形态);成员 tag 自声明面 member_tags 注入:
118 var ic6S1 = BindEs10xSingleRequest.buildTlv("30",
119 BindEs10xSingleRequest.buildTlv("80", ic6Tid)
120 + BindEs10xSingleRequest.buildTlv("81", gw2.fields["80"] || "")
121 + BindEs10xSingleRequest.buildTlv("83", "736D6470706C75732E746573742E636F6D")
122 + BindEs10xSingleRequest.buildTlv("84", ic6Sc));
123 // 原生签名(vendor Ecc_Sign 同款长度校验重试环;输出 raw R||S 64B 线格式):
124 var ic6Sig = "";
125 while (ic6Sig.length != 2 * ic6Sks[ic6Sel].length) {
126 bind.engine.SleepTime(2000);
127 ic6Sig = bind.engine.EccSignData(ic6Sks[ic6Sel], ic6S1, 33);
128 }
129 var ic6Asm = BindEs10bAuthServer.assembleAuthenticateServer(
130 {outer: "BF38",
131 signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
132 serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
133 {transactionId: ic6Tid, euiccChallenge: gw2.fields["80"] || "",
134 serverAddress: "736D6470706C75732E746573742E636F6D", serverChallenge: ic6Sc,
135 serverSignature1: ic6Sig, euiccCiPKIdToBeUsed: ic6CiIds[ic6Sel],
136 serverCertificate: ic6Certs[ic6Sel], ctxParams1: "A10D800400000110A1058003000010"});
137 if (ic6Asm.error) {
138 bind.checkData("IC6-C1 MTD_STORE_DATA_SCRIPT(#AUTHENTICATE_SMDP) SW", "9000", "ic6_assemble_error:" + ic6Asm.error);
139 bind.checkData("IC6-C2 #R_AUTHENTICATE_SMDP authenticateResponseOk structure (euiccSigned1)", "1", "0");
140 } else {
141 var ic6Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
142 {cla: "", ins: "E2", p1: "91", p2: "00", data: ic6Asm.request_hex,
143 le: "00", blockSize: 255, blockSw: "9000", finalSw: "9000"});
144 var ic6Sw = (ic6Run.final && ic6Run.final.sw) ? ic6Run.final.sw : "transport_error";
145 bind.checkData("IC6-C1 MTD_STORE_DATA_SCRIPT(#AUTHENTICATE_SMDP) SW", "9000", ic6Sw);
146 var ic6Ex = BindEs10bAuthServer.extractAuthenticateServer(
147 {outer: "BF38",
148 ok: {tag: "A0", children: [
149 {name: "euiccSigned1", tag: "30", children: [
150 {name: "transactionId", tag: "80"},
151 {name: "serverAddress", tag: "83"},
152 {name: "serverChallenge", tag: "84"},
153 {name: "euiccInfo2", tag: "BF22"},
154 {name: "ctxParams1", tag: "A0"}]},
155 {name: "euiccSignature1", tag: "5F37"},
156 {name: "euiccCertificate", tag: "30"},
157 {name: "eumCertificate", tag: "30"}]},
158 error: {tag: "A1", children: [{name: "transactionId", tag: "80"}, {name: "authenticateErrorCode", tag: "02"}]}},
159 ic6Run.final ? ic6Run.final.resp : "");
160 var ic6StructOk = ic6Ex.branch === "ok" && ic6Ex.ok && ic6Ex.ok.missing.length === 0 && ic6Ex.ok.fields.euiccSigned1.children.missing.length === 0;
161 bind.checkData("IC6-C2 #R_AUTHENTICATE_SMDP authenticateResponseOk structure (euiccSigned1)", "1", ic6StructOk ? "1" : "0");
162 if (ic6StructOk) {
163 ic6Info2 = ic6Ex.ok.fields.euiccSigned1.children.fields.euiccInfo2.value;
164 }
165 }
166 }
167
168 // 步骤 3:MTD_STORE_DATA(tc_step;REQ: RQ57_051, RQ57_053, RQ57_054, RQ57_058, RQ57_059, RQ57_062, RQ31_060, RQ43_001, RQ43_002)
169 // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
170 var sdCla3 = s8.chan !== null ? (s8.chan <= 3 ? 128 + s8.chan : 188 + s8.chan).toString(16).toUpperCase() : null;
171 var s3 = bind.sendApdu(sdCla3, "E2", "91", "00", "BF2200", "00", "9000");
172 bind.checkData("S3-C1 SW", "9000", s3.sw);
173 // geca-proc ES10b Info 响应面(R_EUICC_INFO2,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
174 var gw3 = BindGecaProc.parseGecaResponse(s3.resp, {outer: "BF22", required: ["81", "82", "83", "84", "85", "88", "A9", "AA", "04", "0C"], optional: ["86", "87"]});
175 // IC6 dynamic-bound oracle 操作数准备(payload-dynamic-binding lane):双侧成员图
176 // (tag→value)剥离 tag 84(声明面 oracle_feed.exclude_tag 注入);IC6 操作数缺席即恒假。
177 var ic6Map3 = {};
178 var ic6Ch3 = BindEs10xSingleRequest.parseBerTlv(ic6Info2);
179 for (var ic6I3 = 0; ic6I3 < ic6Ch3.length; ic6I3++) {
180 if (ic6Ch3[ic6I3].tag !== "84") { ic6Map3[ic6Ch3[ic6I3].tag] = ic6Ch3[ic6I3].value; }
181 }
182 var s3Map = {};
183 for (var s3Ii = 0; s3Ii < gw3.children.length; s3Ii++) {
184 if (gw3.children[s3Ii].tag !== "84") { s3Map[gw3.children[s3Ii].tag] = gw3.children[s3Ii].value; }
185 }
186 var s3Ic6Eq = ic6Info2 !== "";
187 for (var kA3 in ic6Map3) {
188 if (Object.prototype.hasOwnProperty.call(ic6Map3, kA3) && s3Map[kA3] !== ic6Map3[kA3]) { s3Ic6Eq = false; }
189 }
190 for (var kB3 in s3Map) {
191 if (Object.prototype.hasOwnProperty.call(s3Map, kB3) && ic6Map3[kB3] !== s3Map[kB3]) { s3Ic6Eq = false; }
192 }
193 bind.checkData("S3-C2 R_EUICC_INFO2 outer tag", "BF22", gw3.outer_tag === null ? "absent" : gw3.outer_tag);
194 bind.checkData("S3-C2 R_EUICC_INFO2 required members present", "1", gw3.ok ? "1" : "0");
195 // S3-C3: IC6 动态绑定实断言——比对基准 = IC6 运行时响应 euiccSigned1.euiccInfo2;成员级相等(extCardResource 剥离,双侧成员集核对)。
196 bind.checkData("S3-C3 IC6 euiccInfo2 equality (extCardResource excluded) oracle", "1", s3Ic6Eq ? "1" : "0");
197 bind.checkData("S3-C4 RQ57_051 function accepted at this sequence position", "9000", s3.sw);
198 bind.checkData("S3-C5 RQ57_053 command data", "BF2200", s3.cmd.substring(10, 16));
199 bind.checkData("S3-C6 RQ57_058 ts102241Version presence observed", "1", gw3.ok ? "1" : "0");
200 bind.checkData("S3-C7 RQ57_059 globalplatformVersion presence observed", "1", gw3.ok ? "1" : "0");
201 var rspCap3 = gw3.fields["88"] || "";
202 bind.checkData("S3-C8 RQ57_062 rpmSupport bit is 0", "1", (rspCap3.length >= 4 && (parseInt(rspCap3.substring(2, 4), 16) & 32) === 0) ? "1" : "0");
203 // S3-C9: RQ31_060 svn 一致性实断言——期望 = IC6 运行时 euiccSigned1.euiccInfo2 svn 成员值,实际 = 本步响应 svn 成员。
204 bind.checkData("S3-C9 svn consistency with step (6) via IC6 equality oracle", ic6Map3["82"] !== undefined ? ic6Map3["82"] : "ic6_operand_absent", gw3.fields["82"] || "absent");
205 bind.checkData("S3-C10 RQ43_001 eUICC information provided in response", "1", (s3.resp !== "" && gw3.outer_tag === "BF22") ? "1" : "0");
206 bind.checkData("S3-C11 RQ43_002 EUICCInfo2 received from eUICC", "1", (s3.resp !== "" && gw3.outer_tag === "BF22") ? "1" : "0");
207}
208
完整 unified diff
行级差异:新增 206 行 / 删除 41 行(以 -man 为基准,unified 上下文 3 行)。
展开 diff(252 行)
--- -man
+++ -cas
@@ -1,43 +1,208 @@
-// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10b_GetEUICCInfo2_02_Nominal_GetEUICCInfo2_call_after_AuthenticateServer (extracted verbatim)
-
-function TC_eUICC_ES10b_GetEUICCInfo2_02_Nominal_GetEUICCInfo2_call_after_AuthenticateServer()
-{
- tracenamestr = "测试目的:执行AuthenticateServer后获取EUICCInfo2";
- 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 euiccInfo2_hexData_1 = Profile_load_procedure.authServerResponse.authenticateResponseOk.euiccSigned1.euiccInfo2.hexData;
-
- curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo2Request,获取EUICCInfo2;");
-
- var euiccInfo2 = new EUICCInfo2();
- var hexData = LPAd_Transport_data_to_eUICC(GetEuiccInfo2RequestHexStr);
-
- euiccInfo2.checkCardResDataFormat(hexData);
- curStrHandle.CheckData(euiccInfo2_hexData_1, euiccInfo2.hexData,"检查EUICCInfo2数据应与authServerResponse中返回的数据一致");
-
- check_EUICCInfo2(euiccInfo2);
- RecoverCard();
+// Author: 卡思Cas智能体
+// Date: 20260928-203316
+// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10b.GetEUICCInfo2,Test Sequence #01 Nominal: GetEUICCInfo2 call after AuthenticateServer,适用性 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 euiccChallenge tag;S2-C2 euiccChallenge length
+// IC6-C1 MTD_STORE_DATA_SCRIPT(#AUTHENTICATE_SMDP) SW
+// IC6-C2 #R_AUTHENTICATE_SMDP authenticateResponseOk structure (euiccSigned1);S3-C1 SW
+// S3-C2 R_EUICC_INFO2 outer tag;S3-C2 R_EUICC_INFO2 required members present
+// S3-C3 IC6 euiccInfo2 equality (extCardResource excluded) oracle
+// S3-C4 RQ57_051 function accepted at this sequence position;S3-C5 RQ57_053 command data
+// S3-C6 RQ57_058 ts102241Version presence observed
+// S3-C7 RQ57_059 globalplatformVersion presence observed;S3-C8 RQ57_062 rpmSupport bit is 0
+// S3-C9 svn consistency with step (6) via IC6 equality oracle
+// S3-C10 RQ43_001 eUICC information provided in response
+// S3-C11 RQ43_002 EUICCInfo2 received from eUICC
+// 本函数由 CaseIR 4.2.13.2.4 编译生成(4.2.13.2.4-TC_eUICC_ES10b.GetEUICCInfo2-20260928_043958,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_ES10b_GetEUICCInfo2_01_merged() {
+ var bind = curBind;
+
+ // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 1):RESET(K 语料机械展开)
+ var s4 = bind.resetAndAtr();
+ bind.checkData("ICH-IC1-K1-C1 ATR_present", "1", s4.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 s5 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
+ bind.checkData("ICH-IC1-K2-C2 FCP_Template", "1", s5.resp.length > 0 ? "1" : "0");
+ bind.checkData("ICH-IC1-K2-C4 SW", "9000", s5.sw);
+
+ // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 3):TERMINAL_CAPABILITY_LPAd(K 语料机械展开)
+ var s6 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
+ bind.checkData("ICH-IC1-K3-C4 SW", "9000", s6.sw);
+
+ // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 4):TERMINAL_PROFILE(K 语料机械展开)
+ var steady7 = bind.runToSteadyState(function () {
+ return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
+ });
+ bind.checkData("ICH-IC1-K4-C4 final SW", "9000", steady7.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 s8 = bind.manageChannelOpen("9000");
+ bind.checkData("ICH-IC2-K1-C4 SW", "9000", s8.sw);
+ bind.checkData("ICH-IC2-K1-C3 CHANNEL_NUMBER extracted", "1", s8.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 s9 = 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", s9.sw);
+
+ // 步骤 1:MTD_STORE_DATA(procedure_expansion)
+ // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
+ var sdCla1 = s8.chan !== null ? (s8.chan <= 3 ? 128 + s8.chan : 188 + s8.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(procedure_expansion)
+ // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
+ var sdCla2 = s8.chan !== null ? (s8.chan <= 3 ? 128 + s8.chan : 188 + s8.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);
+ var gwch2 = null; for (var gwci2 = 0; gwci2 < gw2.children.length; gwci2++) { if (gw2.children[gwci2].tag === "80") { gwch2 = gw2.children[gwci2]; } }
+ bind.checkData("S2-C2 euiccChallenge tag", "80", gwch2 === null ? "absent" : gwch2.tag);
+ bind.checkData("S2-C2 euiccChallenge length", "10", gwch2 === null ? "absent" : (gwch2.len < 16 ? ("0" + gwch2.len.toString(16).toUpperCase()) : gwch2.len.toString(16).toUpperCase()));
+
+ // IC6 MTD_STORE_DATA_SCRIPT(#AUTHENTICATE_SMDP): dynamic-bound 运行时绑定(payload-dynamic-binding lane 落地;声明面 = CaseIR initial_conditions IC6
+ // dynamic_binding;物料 = input/crypto SGP.26 v1.5 valid DPauth 双曲线套(sha256 锚定);binding 链结构照 vendor ABI
+ // RSP_Test_Procedure.js:1915-1950(组装+签名+CI PK ID+证书裁剪)/CommonArith.js:2210-2236(EccSignData(·,·,33)=ECDSA-SHA256 重试环)。
+ // 运行时随机输入(vendor RandHexStr 形态:engine.Hex+Math.random 机制字节,无静态虚构):
+ var ic6Tid = "";
+ var ic6Sc = "";
+ for (var ic6Ri = 0; ic6Ri < 16; ic6Ri++) {
+ ic6Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+ ic6Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+ }
+ // 物料套运行时选择(vendor FromPKID_Select_CertInfo 先例;E 表133 IC5:取步1 EUICC_CI_PK_ID_LIST_FOR_SIGNING 最高优先级命中套):
+ var ic6PkList = BindEs10xSingleRequest.parseBerTlv(gw1.fields["AA"] || "");
+ var ic6CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
+ var ic6Sks = ["0A7CC1C244E60C52CD5B7807AB8C360C26524601507DCABC5DD598B5A616D5D5", "93FB33D0584F349B07F8B5D2AF93D7C3E354B349A3B913502E6ABC070E4D4929"];
+ var ic6Certs = ["308201DFA00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B3059301306072A8648CE3D020106082A8648CE3D030107034200044DFED4F4694791BF1695CEA0307A35B418019695387BB75B7D2447B6B5209F0445AE4E5E521CD13888D75FE07C8580222AE20DBAAC1D77CD76304993421BD739A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3301D0603551D0E04160414BD5A82CC1A96602118BA7560A1FF83A78B210BE5300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402200823EE7DFA5E3DD07838E930F81BC34AE99F06CBA35927FE9E502C464DC1FEE302200D2D4087DB01A5382D21690AC0488B15067FB2460D336332446CA99F08A8A4EF", "308201E0A00302010202020100300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038333133305A170D3330303333303038333133305A3025310D300B060355040A0C0441434D453114301206035504030C0B5445535420534D2D44502B305A301406072A8648CE3D020106092B240303020801010703420004255D7DAF00EF841D76FA7A63D63EB3FE6C9F70492D381923F8F8BD7B24F3C5AD168EBE3B09DD80F29E7FFD24A4D1BE747F8323E472928396DDE9E0151CEABA18A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8301D0603551D0E0416041479A4BD4D78FF4734BC6045CF9196244A1FB84BEB300E0603551D1104073005880388370A300E0603551D0F0101FF04040302078030170603551D200101FF040D300B300906076781120102010430610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020347003044022003078BD459045184BC50C1397141F8B90398E6B81737EC703403D5CB0DC0DFC302201A38E7FC84D3DB1179FBB17199231F2D635ED7A8AB4049774057B0ACDF726063"];
+ var ic6Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+ var ic6Sel = -1;
+ for (var ic6Pi = 0; ic6Pi < ic6PkList.length && ic6Sel < 0; ic6Pi++) {
+ for (var ic6Mi = 0; ic6Mi < ic6CiIds.length; ic6Mi++) {
+ if (ic6PkList[ic6Pi].value === ic6CiIds[ic6Mi]) { ic6Sel = ic6Mi; break; }
+ }
+ }
+ var ic6Info2 = "";
+ if (ic6Sel < 0) {
+ // fail-closed 诚实面:CI PK ID 零命中物料套 → 不发送,oracle 操作数缺席如实计错。
+ bind.checkData("IC6-C1 MTD_STORE_DATA_SCRIPT(#AUTHENTICATE_SMDP) SW", "9000", "ic6_not_executed:no_matching_ci_pk_id");
+ bind.checkData("IC6-C2 #R_AUTHENTICATE_SMDP authenticateResponseOk structure (euiccSigned1)", "1", "0");
+ } else {
+ bind.engine.InitEccDomainParams(ic6Dps[ic6Sel][0], ic6Dps[ic6Sel][1], ic6Dps[ic6Sel][2], ic6Dps[ic6Sel][3], ic6Dps[ic6Sel][4], 1);
+ // 签名明文 = serverSigned1 完整 SEQUENCE TLV(vendor 签名面形态);成员 tag 自声明面 member_tags 注入:
+ var ic6S1 = BindEs10xSingleRequest.buildTlv("30",
+ BindEs10xSingleRequest.buildTlv("80", ic6Tid)
+ + BindEs10xSingleRequest.buildTlv("81", gw2.fields["80"] || "")
+ + BindEs10xSingleRequest.buildTlv("83", "736D6470706C75732E746573742E636F6D")
+ + BindEs10xSingleRequest.buildTlv("84", ic6Sc));
+ // 原生签名(vendor Ecc_Sign 同款长度校验重试环;输出 raw R||S 64B 线格式):
+ var ic6Sig = "";
+ while (ic6Sig.length != 2 * ic6Sks[ic6Sel].length) {
+ bind.engine.SleepTime(2000);
+ ic6Sig = bind.engine.EccSignData(ic6Sks[ic6Sel], ic6S1, 33);
+ }
+ var ic6Asm = BindEs10bAuthServer.assembleAuthenticateServer(
+ {outer: "BF38",
+ signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
+ serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
+ {transactionId: ic6Tid, euiccChallenge: gw2.fields["80"] || "",
+ serverAddress: "736D6470706C75732E746573742E636F6D", serverChallenge: ic6Sc,
+ serverSignature1: ic6Sig, euiccCiPKIdToBeUsed: ic6CiIds[ic6Sel],
+ serverCertificate: ic6Certs[ic6Sel], ctxParams1: "A10D800400000110A1058003000010"});
+ if (ic6Asm.error) {
+ bind.checkData("IC6-C1 MTD_STORE_DATA_SCRIPT(#AUTHENTICATE_SMDP) SW", "9000", "ic6_assemble_error:" + ic6Asm.error);
+ bind.checkData("IC6-C2 #R_AUTHENTICATE_SMDP authenticateResponseOk structure (euiccSigned1)", "1", "0");
+ } else {
+ var ic6Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+ {cla: "", ins: "E2", p1: "91", p2: "00", data: ic6Asm.request_hex,
+ le: "00", blockSize: 255, blockSw: "9000", finalSw: "9000"});
+ var ic6Sw = (ic6Run.final && ic6Run.final.sw) ? ic6Run.final.sw : "transport_error";
+ bind.checkData("IC6-C1 MTD_STORE_DATA_SCRIPT(#AUTHENTICATE_SMDP) SW", "9000", ic6Sw);
+ var ic6Ex = BindEs10bAuthServer.extractAuthenticateServer(
+ {outer: "BF38",
+ ok: {tag: "A0", children: [
+ {name: "euiccSigned1", tag: "30", children: [
+ {name: "transactionId", tag: "80"},
+ {name: "serverAddress", tag: "83"},
+ {name: "serverChallenge", tag: "84"},
+ {name: "euiccInfo2", tag: "BF22"},
+ {name: "ctxParams1", tag: "A0"}]},
+ {name: "euiccSignature1", tag: "5F37"},
+ {name: "euiccCertificate", tag: "30"},
+ {name: "eumCertificate", tag: "30"}]},
+ error: {tag: "A1", children: [{name: "transactionId", tag: "80"}, {name: "authenticateErrorCode", tag: "02"}]}},
+ ic6Run.final ? ic6Run.final.resp : "");
+ var ic6StructOk = ic6Ex.branch === "ok" && ic6Ex.ok && ic6Ex.ok.missing.length === 0 && ic6Ex.ok.fields.euiccSigned1.children.missing.length === 0;
+ bind.checkData("IC6-C2 #R_AUTHENTICATE_SMDP authenticateResponseOk structure (euiccSigned1)", "1", ic6StructOk ? "1" : "0");
+ if (ic6StructOk) {
+ ic6Info2 = ic6Ex.ok.fields.euiccSigned1.children.fields.euiccInfo2.value;
+ }
+ }
+ }
+
+ // 步骤 3:MTD_STORE_DATA(tc_step;REQ: RQ57_051, RQ57_053, RQ57_054, RQ57_058, RQ57_059, RQ57_062, RQ31_060, RQ43_001, RQ43_002)
+ // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
+ var sdCla3 = s8.chan !== null ? (s8.chan <= 3 ? 128 + s8.chan : 188 + s8.chan).toString(16).toUpperCase() : null;
+ var s3 = bind.sendApdu(sdCla3, "E2", "91", "00", "BF2200", "00", "9000");
+ bind.checkData("S3-C1 SW", "9000", s3.sw);
+ // geca-proc ES10b Info 响应面(R_EUICC_INFO2,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
+ var gw3 = BindGecaProc.parseGecaResponse(s3.resp, {outer: "BF22", required: ["81", "82", "83", "84", "85", "88", "A9", "AA", "04", "0C"], optional: ["86", "87"]});
+ // IC6 dynamic-bound oracle 操作数准备(payload-dynamic-binding lane):双侧成员图
+ // (tag→value)剥离 tag 84(声明面 oracle_feed.exclude_tag 注入);IC6 操作数缺席即恒假。
+ var ic6Map3 = {};
+ var ic6Ch3 = BindEs10xSingleRequest.parseBerTlv(ic6Info2);
+ for (var ic6I3 = 0; ic6I3 < ic6Ch3.length; ic6I3++) {
+ if (ic6Ch3[ic6I3].tag !== "84") { ic6Map3[ic6Ch3[ic6I3].tag] = ic6Ch3[ic6I3].value; }
+ }
+ var s3Map = {};
+ for (var s3Ii = 0; s3Ii < gw3.children.length; s3Ii++) {
+ if (gw3.children[s3Ii].tag !== "84") { s3Map[gw3.children[s3Ii].tag] = gw3.children[s3Ii].value; }
+ }
+ var s3Ic6Eq = ic6Info2 !== "";
+ for (var kA3 in ic6Map3) {
+ if (Object.prototype.hasOwnProperty.call(ic6Map3, kA3) && s3Map[kA3] !== ic6Map3[kA3]) { s3Ic6Eq = false; }
+ }
+ for (var kB3 in s3Map) {
+ if (Object.prototype.hasOwnProperty.call(s3Map, kB3) && ic6Map3[kB3] !== s3Map[kB3]) { s3Ic6Eq = false; }
+ }
+ bind.checkData("S3-C2 R_EUICC_INFO2 outer tag", "BF22", gw3.outer_tag === null ? "absent" : gw3.outer_tag);
+ bind.checkData("S3-C2 R_EUICC_INFO2 required members present", "1", gw3.ok ? "1" : "0");
+ // S3-C3: IC6 动态绑定实断言——比对基准 = IC6 运行时响应 euiccSigned1.euiccInfo2;成员级相等(extCardResource 剥离,双侧成员集核对)。
+ bind.checkData("S3-C3 IC6 euiccInfo2 equality (extCardResource excluded) oracle", "1", s3Ic6Eq ? "1" : "0");
+ bind.checkData("S3-C4 RQ57_051 function accepted at this sequence position", "9000", s3.sw);
+ bind.checkData("S3-C5 RQ57_053 command data", "BF2200", s3.cmd.substring(10, 16));
+ bind.checkData("S3-C6 RQ57_058 ts102241Version presence observed", "1", gw3.ok ? "1" : "0");
+ bind.checkData("S3-C7 RQ57_059 globalplatformVersion presence observed", "1", gw3.ok ? "1" : "0");
+ var rspCap3 = gw3.fields["88"] || "";
+ bind.checkData("S3-C8 RQ57_062 rpmSupport bit is 0", "1", (rspCap3.length >= 4 && (parseInt(rspCap3.substring(2, 4), 16) & 32) === 0) ? "1" : "0");
+ // S3-C9: RQ31_060 svn 一致性实断言——期望 = IC6 运行时 euiccSigned1.euiccInfo2 svn 成员值,实际 = 本步响应 svn 成员。
+ bind.checkData("S3-C9 svn consistency with step (6) via IC6 equality oracle", ic6Map3["82"] !== undefined ? ic6Map3["82"] : "ic6_operand_absent", gw3.fields["82"] || "absent");
+ bind.checkData("S3-C10 RQ43_001 eUICC information provided in response", "1", (s3.resp !== "" && gw3.outer_tag === "BF22") ? "1" : "0");
+ bind.checkData("S3-C11 RQ43_002 EUICCInfo2 received from eUICC", "1", (s3.resp !== "" && gw3.outer_tag === "BF22") ? "1" : "0");
}