源码对照:4.2.18.2.6
ES10b 服务器认证(SM-DS,NIST) / TC_eUICC_ES10b.AuthenticateServer_SM-DS_NIST
左侧为人工切片入口(-man,来自 原料/切片 的最小可执行脚本),右侧为 Cas 盲生成入口(-cas,仅依据规范生成)。文件按原始编码(多为 GBK)解码为 UTF-8 显示,行号自 1 起;字节级原文与 sha256 见两侧脚本包。完整 unified diff 见本页底部折叠区,以及 报告原文 §4。
-man 入口
Import/TestCase_SGP_23.js
130 行 / 5203 字符 / gb18030
-cas 入口
TC_eUICC_ES10b_AuthenticateServer_SM_DS_NIST/Import/TC_eUICC_ES10b_AuthenticateServer_SM_DS_NIST.js
358 行 / 33274 字符 / gb18030
默认折行显示长行;取消勾选可横向滚动查看原始行宽
-man 人工切片Import/TestCase_SGP_23.js130 行 / 5203 字符 / gb18030入口函数 @L3
1// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10b_AuthenticateServer_SM_DS_NIST_01_Nominal_With_EventID_in_CtxParams1 + TC_eUICC_ES10b_AuthenticateServer_SM_DS_NIST_02_Nominal_With_IMEI_and_EventID_in_Device_Capabilities (extracted verbatim)
2
3function TC_eUICC_ES10b_AuthenticateServer_SM_DS_NIST_01_Nominal_With_EventID_in_CtxParams1()
4{
5 if(!Card_Have_ECC_Cert)
6 return;
7
8 //测试入口条件
9 if(!check_Applicability_of_tests_RSP_SGP23_test("C001"))
10 return;
11
12
13 tracenamestr = "测试目的:执行AuthenticateServer指令,CtxParams1中没有EventID";
14 curDis.TraceStart(sno++,tracenamestr);
15
16 curDis.TestStepStart2(stno++,"复位;");
17 ResetCard();
18
19 curDis.TestStepStart2(stno++,"读卡器向卡片发送Terminal Capability命令;");
20 TS_TERMINAL_CAPABILITY_cmd();
21
22 curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
23 TS_MANAGE_CHANNEL_OPEN();
24
25 curLogicChannel = 1;
26
27 curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
28 TS_SELECT("Select ISD",ISD_R_AID,"9000");
29
30 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
31 pkId_CI_ForVerification = pkId_CI_ECDSA_NIST;
32 pkId_CI_ForSigning = pkId_CI_ECDSA_NIST;
33 var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
34 Profile_load_procedure.ICCID = ICCID_OP_PROF1;
35 Profile_load_procedure.ES10b_GetEUICCInfo1();
36
37 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
38 Profile_load_procedure.ES10b_GetEUICCChallenge();
39
40 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
41 var DeviceCapabilities1 = new DeviceCapabilities();
42 DeviceCapabilities1.gsmSupportedRelease = "050000";
43 DeviceCapabilities1.utranSupportedRelease = "080000";
44 DeviceCapabilities1.cdma2000onexSupportedRelease = "010000";
45 DeviceCapabilities1.cdma2000hrpdSupportedRelease = "010000";
46 DeviceCapabilities1.cdma2000ehrpdSupportedRelease = "020000";
47 DeviceCapabilities1.eutranSupportedRelease = "020000";
48 DeviceCapabilities1.contactlessSupportedRelease = "090000";
49 DeviceCapabilities1.rspCrlSupportedVersion = "020100";
50
51 var DeviceInfo1 = new DeviceInfo();
52 DeviceInfo1.tac = "00000000";
53 DeviceInfo1.deviceCapabilities = DeviceCapabilities1.GenHexData();
54
55 var CtxParamsForCommonAuthentication1 =new CtxParamsForCommonAuthentication();
56 CtxParamsForCommonAuthentication1.matchingId = "30373339392D42474837452D5438373739";
57 CtxParamsForCommonAuthentication1.deviceInfo = DeviceInfo1.GenHexData();
58
59 ctxParamsForCommonAuthentication=CtxParamsForCommonAuthentication1.GenHexData();
60
61 Profile_load_procedure.DPauthInforObj.D_key = SK_S_SM_DSauth_ECDSA_NIST;
62 Profile_load_procedure.DPauthInforObj.Cert = CERT_S_SM_DSauth_ECDSA_NIST;
63 Profile_load_procedure.ES10b_AuthenticateServer();
64
65 RecoverCard();
66}
67
68function TC_eUICC_ES10b_AuthenticateServer_SM_DS_NIST_02_Nominal_With_IMEI_and_EventID_in_Device_Capabilities()
69{
70 if(!Card_Have_ECC_Cert)
71 return;
72
73 //测试入口条件
74 if(!check_Applicability_of_tests_RSP_SGP23_test("C001"))
75 return;
76
77
78
79 tracenamestr = "测试目的:执行AuthenticateServer指令,Device Capabilities中带有IMEI和EventID";
80 curDis.TraceStart(sno++,tracenamestr);
81
82 curDis.TestStepStart2(stno++,"复位;");
83 ResetCard();
84
85 curDis.TestStepStart2(stno++,"读卡器向卡片发送Terminal Capability命令;");
86 TS_TERMINAL_CAPABILITY_cmd();
87
88 curDis.TestStepStart2(stno++,"读卡器向卡片发送MANAGE_CHANNEL命令,打开辅助逻辑通道;");
89 TS_MANAGE_CHANNEL_OPEN();
90
91 curLogicChannel = 1;
92
93 curDis.TestStepStart2(stno++,"读卡器向卡片发送SELECT命令,选择ISD-R;");
94 TS_SELECT("Select ISD",ISD_R_AID,"9000");
95
96 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccInfo1Request;");
97 pkId_CI_ForVerification = pkId_CI_ECDSA_NIST;
98 pkId_CI_ForSigning = pkId_CI_ECDSA_NIST;
99 var Profile_load_procedure = new RSP_profile_load_procedure_LPAd(PROFILE_OPERATIONAL1_DATA);
100 Profile_load_procedure.ICCID = ICCID_OP_PROF1;
101 Profile_load_procedure.ES10b_GetEUICCInfo1();
102
103 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行GetEuiccChallengeRequest;");
104 Profile_load_procedure.ES10b_GetEUICCChallenge();
105
106 curDis.TestStepStart2(stno++,"读卡器向卡片发送 StoreData命令,执行AuthenticateServerRequest;");
107 var DeviceCapabilities1 = new DeviceCapabilities();
108 DeviceCapabilities1.gsmSupportedRelease = "050000";
109 DeviceCapabilities1.utranSupportedRelease = "080000";
110 DeviceCapabilities1.cdma2000onexSupportedRelease = "010000";
111 DeviceCapabilities1.eutranSupportedRelease = "020000";
112
113 var DeviceInfo1 = new DeviceInfo();
114 DeviceInfo1.tac = "00000000";
115 DeviceInfo1.deviceCapabilities = DeviceCapabilities1.GenHexData();
116 DeviceInfo1.imei = "0000000011111111";
117
118 var CtxParamsForCommonAuthentication1 =new CtxParamsForCommonAuthentication();
119 CtxParamsForCommonAuthentication1.matchingId = "30373339392D42474837452D5438373739";
120 CtxParamsForCommonAuthentication1.deviceInfo = DeviceInfo1.GenHexData();
121
122 ctxParamsForCommonAuthentication=CtxParamsForCommonAuthentication1.GenHexData();
123
124 Profile_load_procedure.DPauthInforObj.D_key = SK_S_SM_DSauth_ECDSA_NIST;
125 Profile_load_procedure.DPauthInforObj.Cert = CERT_S_SM_DSauth_ECDSA_NIST;
126 Profile_load_procedure.ES10b_AuthenticateServer();
127
128 RecoverCard();
129}
130
-cas 盲生成TC_eUICC_ES10b_AuthenticateServer_SM_DS_NIST/Import/TC_eUICC_ES10b_AuthenticateServer_SM_DS_NIST.js358 行 / 33274 字符 / gb18030
1// Author: 卡思Cas智能体
2// Date: 20261004-022634
3// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10b.AuthenticateServer_SM-DS_NIST,Test Sequence #01-#02 Nominal(本 TC 全部 2 条 Test Sequence 合并展开),适用性 C001。
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 SW;S4-C2 structure_ok
10// S4-C3 transactionId echo;S4-C4 serverChallenge echo;S4-C5 sig_verify;S4-C6 ctxParams1 echo
11// S4-C2 R_AUTHENTICATE_SMDS authenticateResponseOk structure;S4-C5 euiccSignature1 verify
12// S5-C1 SW;S5-C2 R_EUICC_INFO1 outer tag;S5-C2 R_EUICC_INFO1 required members present
13// S5-C3 CI PK lists share at least one key id;S6-C1 SW;S6-C2 R_CHALLENGE outer tag
14// S6-C2 R_CHALLENGE required members present;S6-C2 tagOfeuiccChallenge
15// S6-C2 lengthOfeuiccChallenge;S8-C1 SW;S8-C2 structure_ok;S8-C3 transactionId echo
16// S8-C4 serverChallenge echo;S8-C5 sig_verify;S8-C6 ctxParams1 echo
17// S8-C2 R_AUTH_SMDS_IMEI authenticateResponseOk structure;S8-C5 euiccSignature1 verify
18// 本函数由 CaseIR 4.2.18.2.6 编译生成(4.2.18.2.6-TC_eUICC_ES10b.AuthenticateServer_SM-DS_NIST-20261004_022634,SGP.23 v1.16 × SGP.22 v2.7):字节权威=CaseIR,非誊录黄金脚本。
19// Value-free template: every data byte is injected from CaseIR fields; no scaffold globals (see docs/speconly/compile-symbol-migration.md).
20// 适用性 C001:编译期门,运行时由 harness 环境前置承担。
21function TC_eUICC_ES10b_AuthenticateServer_SM_DS_NIST_01_02_Nominal_TC_2_Test_Sequence() {
22 var bind = curBind;
23
24 // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 1):RESET(K 语料机械展开)
25 var s9 = bind.resetAndAtr();
26 bind.checkData("ICH-IC1-K1-C1 ATR_present", "1", s9.atr_hex !== "" ? "1" : "0");
27
28 // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 2):SELECT_MF(K 语料机械展开)
29 // FCP outer tag not materialized from clause: tag-face asserted only when corpus fixes the tag byte (e.g. TS 102 221 FCP '62').
30 var s10 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
31 bind.checkData("ICH-IC1-K2-C2 FCP_Template", "1", s10.resp.length > 0 ? "1" : "0");
32 bind.checkData("ICH-IC1-K2-C4 SW", "9000", s10.sw);
33
34 // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 3):TERMINAL_CAPABILITY_LPAd(K 语料机械展开)
35 var s11 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
36 bind.checkData("ICH-IC1-K3-C4 SW", "9000", s11.sw);
37
38 // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 4):TERMINAL_PROFILE(K 语料机械展开)
39 var steady12 = bind.runToSteadyState(function () {
40 return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
41 });
42 bind.checkData("ICH-IC1-K4-C4 final SW", "9000", steady12.final.sw);
43
44 // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 1):MANAGE_CHANNEL_OPEN(K 语料机械展开)
45 // CHANNEL_NUMBER extraction and dynamic CLA rebinding are CasBind internal state (chaining rule; no generated-code re-implementation).
46 var s13 = bind.manageChannelOpen("9000");
47 bind.checkData("ICH-IC2-K1-C4 SW", "9000", s13.sw);
48 bind.checkData("ICH-IC2-K1-C3 CHANNEL_NUMBER extracted", "1", s13.chan !== null ? "1" : "0");
49
50 // IC head inline (initial_conditions → PROC_OPEN_LOGICAL_CHANNEL_AND_SELECT_ISDR, K row 2):MTD_SELECT(K 语料机械展开)
51 // CLA = bound channel (cla_rule) and <L> length binding are CasBind internal state (chaining rule; no generated-code re-implementation).
52 var s14 = bind.sendApdu(null, "A4", "04", "00", "A0000005591010FFFFFFFF8900000100", null, "9000");
53 // 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.
54 bind.checkData("ICH-IC2-K2-C4 SW", "9000", s14.sw);
55
56 // 步骤 1:Seq#01] MTD_STORE_DATA(tc_step;REQ: RQ36_017)
57 // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
58 var sdCla1 = s13.chan !== null ? (s13.chan <= 3 ? 128 + s13.chan : 188 + s13.chan).toString(16).toUpperCase() : null;
59 var s1 = bind.sendApdu(sdCla1, "E2", "91", "00", "BF2000", "00", "9000");
60 bind.checkData("S1-C1 SW", "9000", s1.sw);
61 // geca-proc ES10b Info 响应面(R_EUICC_INFO1,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
62 var gw1 = BindGecaProc.parseGecaResponse(s1.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
63 bind.checkData("S1-C2 R_EUICC_INFO1 outer tag", "BF20", gw1.outer_tag === null ? "absent" : gw1.outer_tag);
64 bind.checkData("S1-C2 R_EUICC_INFO1 required members present", "1", gw1.ok ? "1" : "0");
65 var pkV1 = BindEs10xSingleRequest.parseBerTlv(gw1.fields["A9"] || "");
66 var pkS1 = BindEs10xSingleRequest.parseBerTlv(gw1.fields["AA"] || "");
67 var samePk1 = false;
68 for (var pvi1 = 0; pvi1 < pkV1.length; pvi1++) {
69 for (var psi1 = 0; psi1 < pkS1.length; psi1++) {
70 if (pkV1[pvi1].value !== "" && pkV1[pvi1].value === pkS1[psi1].value) { samePk1 = true; }
71 }
72 }
73 bind.checkData("S1-C3 CI PK lists share at least one key id", "1", samePk1 ? "1" : "0");
74
75 // 步骤 2:Seq#01] MTD_STORE_DATA(tc_step;REQ: RQ36_017)
76 // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
77 var sdCla2 = s13.chan !== null ? (s13.chan <= 3 ? 128 + s13.chan : 188 + s13.chan).toString(16).toUpperCase() : null;
78 var s2 = bind.sendApdu(sdCla2, "E2", "91", "00", "BF2E00", "00", "9000");
79 bind.checkData("S2-C1 SW", "9000", s2.sw);
80 // geca-proc ES10b Info 响应面(R_CHALLENGE,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
81 var gw2 = BindGecaProc.parseGecaResponse(s2.resp, {outer: "BF2E", required: ["80"], optional: []});
82 bind.checkData("S2-C2 R_CHALLENGE outer tag", "BF2E", gw2.outer_tag === null ? "absent" : gw2.outer_tag);
83 bind.checkData("S2-C2 R_CHALLENGE required members present", "1", gw2.ok ? "1" : "0");
84 var r2w2 = BindGecaProc.parseGecaResponse(s2.resp, {outer: "BF2E", required: ["80"]});
85 bind.checkData("S2-C2 R_CHALLENGE outer tag", "BF2E", r2w2.outer_tag === null ? "absent" : r2w2.outer_tag);
86 var r2ch2 = null; for (var r2ci2 = 0; r2ci2 < r2w2.children.length; r2ci2++) { if (r2w2.children[r2ci2].tag === "80") { r2ch2 = r2w2.children[r2ci2]; } }
87 var r2chal2 = r2ch2 === null ? "" : r2ch2.value;
88 bind.checkData("S2-C2 tagOfeuiccChallenge", "80", r2ch2 === null ? "absent" : r2ch2.tag);
89 bind.checkData("S2-C2 lengthOfeuiccChallenge", "10", r2ch2 === null ? "absent" : (r2ch2.len < 16 ? ("0" + r2ch2.len.toString(16).toUpperCase()) : r2ch2.len.toString(16).toUpperCase()));
90
91 // 步骤 3:Seq#01] Step4 输入准备(InitiateAuthentication):<S_TRANSACTION_ID>、<EUICC_CHALLENGE>、<S_SMDS_CHALLENGE>、<S_SMDS_SIGNATURE1>;设 <EUICC_CI_PK_ID_TO_BE_USED> 为基于 NIST P-256 的 CI Key ID;选取导向同一 Root CI 的 #CERT_S_SM_DSauth_ECDSA(tc_step;non_wire)
92 // test-tool internal preparation (no APDU face): runtime-domain
93 // values per CaseIR unresolved (G Annex B generation rules);
94 // no fabricated bytes emitted here.
95
96 // 步骤 4:Seq#01] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ24_008, RQ26_005, RQ26_006, RQ26_008, RQ26_012, RQ26_013, RQ26_029, RQ26_034, RQ31_025, RQ31_078, RQ43_002, RQ45_006, RQ45_026, RQ45_026_1, RQ57_094, RQ57_095, RQ57_096, RQ57_097, RQ57_098, RQ57_099, RQ57_101, RQ57_102, RQ57_103, RQ57_104, RQ57_105, RQ57_106, RQ57_107, RQ57_108, RQ31_046, RQ31_047, RQ31_048, RQ31_049, RQ31_050, RQ31_051, RQ31_053, RQ31_054, RQ31_055, RQ36_017)
97 // dynamic-template 多占位运行时绑定(B-5;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;模板 tag 权威 = SGP.22 §5.7.13 + AUTOMATIC TAGS + 黄金切片线缆三源对账)
98 var dt4Tid = "";
99 var dt4Sc = "";
100 for (var dt4Ri = 0; dt4Ri < 16; dt4Ri++) {
101 dt4Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
102 dt4Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
103 }
104 var dt4PkList = BindEs10xSingleRequest.parseBerTlv(gw1.fields["AA"] || "");
105 var dt4CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
106 var dt4Certs = ["308201DEA00302010202027495300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038353034315A170D3330303333303038353034315A3024310D300B060355040A0C0441434D453113301106035504030C0A5445535420534D2D44533059301306072A8648CE3D020106082A8648CE3D0301070342000437FB94E3A2BEFE763E1A774A4854880F106D80F936845BAD2FDD971BC068D8AB61A5481AEE977D5A8168BB9F79004B1D0072C1BA7673B0CB64816E1019B24FD0A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3300E0603551D0F0101FF040403020780301D0603551D0E04160414C1F4064B3B258AFB61388B3FF2EE6A61E2C44D72300E0603551D1104073005880388370F30170603551D200101FF040D300B300906076781120102010730610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020348003045022100C0BE4522932DACA9F8997AD54FA0E59490966BED91D222316880BC371FB3223702204FBDE30C3A167F231C0E397EAF29402A01D8C36B148083FD23A9DD39DDC7BAB2", "308201DFA00302010202027495300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038353034315A170D3330303333303038353034315A3024310D300B060355040A0C0441434D453113301106035504030C0A5445535420534D2D4453305A301406072A8648CE3D020106092B24030302080101070342000481D1D023F39F18433418C28CD23D42157A439FEDD29E59AB1186E130898196C1563A13F48B36D6D4B13B4D085A5760AE613D061FFE6FC7A40C6502E3FF733C31A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8300E0603551D0F0101FF040403020780301D0603551D0E04160414F05F0B54AEE8AE0108F01DEF548ED9859714DD48300E0603551D1104073005880388370F30170603551D200101FF040D300B300906076781120102010730610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402203CC1D42AFDEC627E71B962754245B7DF0BAC0AA5A0AB08CC2FA6B7D557BED93F022050337E43DBE80FD4202024760AB9FAD1AC4647F6D450629C9CD51BF7222E2AA0"];
107 var dt4Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
108 var dt4Sel = -1;
109 for (var dt4Pi = 0; dt4Pi < dt4PkList.length && dt4Sel < 0; dt4Pi++) {
110 for (var dt4Mi = 0; dt4Mi < dt4CiIds.length; dt4Mi++) {
111 if (dt4PkList[dt4Pi].value === dt4CiIds[dt4Mi]) { dt4Sel = dt4Mi; break; }
112 }
113 }
114 var dt4SkiSel = dt4Sel;
115 var dt4Sks = ["03BB1A30D2C8E37A3A8C4D66C20C81CCC2C0BD3681DE3614C8D78A6E6A2BA172", "1C07C347BBC7753E22EA70385D7EB47BABCEEE96C491D629B2104338FB158387"];
116 var dt4Ctx = "801130373339392D42474837452D5438373739A130800400000000A12880030500008103080000820301000083030100008403020000850302000086030900008703020100";
117 if (dt4Sel < 0 || dt4SkiSel < 0) {
118 bind.checkData("S4-C1 SW", "9000", "dt4_not_executed:no_usable_material_set");
119 bind.checkData("S4-C2 structure_ok", "1", "0");
120 bind.checkData("S4-C3 transactionId echo", dt4Tid, "dt4_not_executed:no_usable_material_set");
121 bind.checkData("S4-C4 serverChallenge echo", dt4Sc, "dt4_not_executed:no_usable_material_set");
122 bind.checkData("S4-C5 sig_verify", "1", "0");
123 bind.checkData("S4-C6 ctxParams1 echo", dt4Ctx, "dt4_not_executed:no_usable_material_set");
124 } else {
125 bind.engine.InitEccDomainParams(dt4Dps[dt4Sel][0], dt4Dps[dt4Sel][1], dt4Dps[dt4Sel][2], dt4Dps[dt4Sel][3], dt4Dps[dt4Sel][4], 1);
126 var dt4S1 = BindEs10xSingleRequest.buildTlv("30",
127 BindEs10xSingleRequest.buildTlv("80", dt4Tid)
128 + BindEs10xSingleRequest.buildTlv("81", gw2.fields["80"] || "")
129 + BindEs10xSingleRequest.buildTlv("83", "1674657374726F6F74736D64732E6578616D706C652E636F6D")
130 + BindEs10xSingleRequest.buildTlv("84", dt4Sc));
131 var dt4Sgn = "";
132 while (dt4Sgn.length != 2 * dt4Sks[dt4Sel].length) {
133 bind.engine.SleepTime(2000);
134 dt4Sgn = bind.engine.EccSignData(dt4Sks[dt4Sel], dt4S1, 33);
135 }
136 var dt4Asm = BindEs10bAuthServer.assembleAuthenticateServer(
137 {outer: "BF38",
138 signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
139 serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
140 {transactionId: dt4Tid, euiccChallenge: gw2.fields["80"] || "",
141 serverAddress: "1674657374726F6F74736D64732E6578616D706C652E636F6D", serverChallenge: dt4Sc,
142 serverSignature1: dt4Sgn, euiccCiPKIdToBeUsed: dt4CiIds[dt4SkiSel],
143 serverCertificate: dt4Certs[dt4Sel], ctxParams1: dt4Ctx});
144 if (dt4Asm.error) {
145 bind.checkData("S4-C1 SW", "9000", "dt4_assemble_error");
146 bind.checkData("S4-C2 structure_ok", "1", "0");
147 bind.checkData("S4-C3 transactionId echo", dt4Tid, "dt4_assemble_error");
148 bind.checkData("S4-C4 serverChallenge echo", dt4Sc, "dt4_assemble_error");
149 bind.checkData("S4-C5 sig_verify", "1", "0");
150 bind.checkData("S4-C6 ctxParams1 echo", dt4Ctx, "dt4_assemble_error");
151 } else {
152 var dt4Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
153 {cla: "", ins: "E2", p1: "91", p2: "00", data: dt4Asm.request_hex,
154 le: "00", blockSize: 255, blockSw: "9000", finalSw: "9000"});
155 var dt4Sw = (dt4Run.final && dt4Run.final.sw) ? dt4Run.final.sw : "transport_error";
156 bind.checkData("S4-C1 SW", "9000", dt4Sw);
157 var dt4Ex = BindEs10bAuthServer.extractAuthenticateServer(
158 {outer: "BF38",
159 ok: {tag: "A0", children: [
160 {name: "euiccSigned1", tag: "30", children: [
161 {name: "transactionId", tag: "80"},
162 {name: "serverAddress", tag: "83"},
163 {name: "serverChallenge", tag: "84"},
164 {name: "euiccInfo2", tag: "BF22"},
165 {name: "ctxParams1", tag: "A0"}]},
166 {name: "euiccSignature1", tag: "5F37"},
167 {name: "euiccCertificate", tag: "30"},
168 {name: "eumCertificate", tag: "30"}]},
169 error: {tag: "A1", children: [{name: "transactionId", tag: "80"}, {name: "authenticateErrorCode", tag: "81"}]}},
170 dt4Run.final ? dt4Run.final.resp : "");
171 var dt4OkBr = dt4Ex.branch === "ok" && dt4Ex.ok && dt4Ex.ok.missing.length === 0 && dt4Ex.ok.fields.euiccSigned1.children.missing.length === 0;
172 var dt4ErrBr = dt4Ex.branch === "error" && dt4Ex.error && dt4Ex.error.missing.length === 0;
173 bind.checkData("S4-C2 R_AUTHENTICATE_SMDS authenticateResponseOk structure", "1", dt4OkBr ? "1" : "0");
174 bind.checkData("S4-C3 transactionId echo", dt4Tid,
175 dt4OkBr ? dt4Ex.ok.fields.euiccSigned1.children.fields.transactionId.value
176 : (dt4ErrBr ? dt4Ex.error.fields.transactionId.value : "branch_absent"));
177 bind.checkData("S4-C4 serverChallenge echo", dt4Sc,
178 dt4OkBr ? dt4Ex.ok.fields.euiccSigned1.children.fields.serverChallenge.value : "branch_absent");
179 // S4-C5: euiccSignature1 验签(engine EccVerifySign,vendor CommonArith Ecc_Verify ABI 同机制):PK 自响应 euiccCertificate subjectPublicKey BIT STRING 机械提取(X.509:03 42 00 04 || x||y,SEC1 非压缩点——自 04 前缀起取 65B/130hex,对齐 vendor X_509.js subjectPublicKey.substr(2)),签名明文 = euiccSigned1 完整 TLV(RQ26_035 编码后数据对象)。
180 var dt4Pk = "";
181 if (dt4OkBr) {
182 var dt4CertH = dt4Ex.ok.fields.euiccCertificate.value;
183 var dt4Ki = dt4CertH.indexOf("03420004");
184 if (dt4Ki >= 0 && dt4Ki + 6 + 130 <= dt4CertH.length) {
185 dt4Pk = dt4CertH.substring(dt4Ki + 6, dt4Ki + 6 + 130);
186 }
187 }
188 var dt4ES1 = "";
189 if (dt4OkBr) {
190 var dt4ESc = dt4Ex.ok.fields.euiccSigned1.children.fields;
191 dt4ES1 = BindEs10xSingleRequest.buildTlv("30",
192 BindEs10xSingleRequest.buildTlv("80", dt4ESc.transactionId.value)
193 + BindEs10xSingleRequest.buildTlv("83", dt4ESc.serverAddress.value)
194 + BindEs10xSingleRequest.buildTlv("84", dt4ESc.serverChallenge.value)
195 + BindEs10xSingleRequest.buildTlv("BF22", dt4ESc.euiccInfo2.value)
196 + BindEs10xSingleRequest.buildTlv("A0", dt4ESc.ctxParams1.value));
197 }
198 bind.checkData("S4-C5 euiccSignature1 verify", "1",
199 (dt4OkBr && dt4Pk !== "" && dt4ES1 !== ""
200 && bind.engine.EccVerifySign(dt4Pk, dt4ES1,
201 dt4Ex.ok.fields.euiccSignature1.value, 33) != 0) ? "1" : "0");
202 bind.checkData("S4-C6 ctxParams1 echo", dt4Ctx,
203 dt4OkBr ? dt4Ex.ok.fields.euiccSigned1.children.fields.ctxParams1.value : "branch_absent");
204 }
205 }
206
207 // 步骤 5:Seq#02] MTD_STORE_DATA(tc_step;REQ: RQ36_017)
208 // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
209 var sdCla5 = s13.chan !== null ? (s13.chan <= 3 ? 128 + s13.chan : 188 + s13.chan).toString(16).toUpperCase() : null;
210 var s5 = bind.sendApdu(sdCla5, "E2", "91", "00", "BF2000", "00", "9000");
211 bind.checkData("S5-C1 SW", "9000", s5.sw);
212 // geca-proc ES10b Info 响应面(R_EUICC_INFO1,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
213 var gw5 = BindGecaProc.parseGecaResponse(s5.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
214 bind.checkData("S5-C2 R_EUICC_INFO1 outer tag", "BF20", gw5.outer_tag === null ? "absent" : gw5.outer_tag);
215 bind.checkData("S5-C2 R_EUICC_INFO1 required members present", "1", gw5.ok ? "1" : "0");
216 var pkV5 = BindEs10xSingleRequest.parseBerTlv(gw5.fields["A9"] || "");
217 var pkS5 = BindEs10xSingleRequest.parseBerTlv(gw5.fields["AA"] || "");
218 var samePk5 = false;
219 for (var pvi5 = 0; pvi5 < pkV5.length; pvi5++) {
220 for (var psi5 = 0; psi5 < pkS5.length; psi5++) {
221 if (pkV5[pvi5].value !== "" && pkV5[pvi5].value === pkS5[psi5].value) { samePk5 = true; }
222 }
223 }
224 bind.checkData("S5-C3 CI PK lists share at least one key id", "1", samePk5 ? "1" : "0");
225
226 // 步骤 6:Seq#02] MTD_STORE_DATA(tc_step;REQ: RQ36_017)
227 // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
228 var sdCla6 = s13.chan !== null ? (s13.chan <= 3 ? 128 + s13.chan : 188 + s13.chan).toString(16).toUpperCase() : null;
229 var s6 = bind.sendApdu(sdCla6, "E2", "91", "00", "BF2E00", "00", "9000");
230 bind.checkData("S6-C1 SW", "9000", s6.sw);
231 // geca-proc ES10b Info 响应面(R_CHALLENGE,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
232 var gw6 = BindGecaProc.parseGecaResponse(s6.resp, {outer: "BF2E", required: ["80"], optional: []});
233 bind.checkData("S6-C2 R_CHALLENGE outer tag", "BF2E", gw6.outer_tag === null ? "absent" : gw6.outer_tag);
234 bind.checkData("S6-C2 R_CHALLENGE required members present", "1", gw6.ok ? "1" : "0");
235 var r2w6 = BindGecaProc.parseGecaResponse(s6.resp, {outer: "BF2E", required: ["80"]});
236 bind.checkData("S6-C2 R_CHALLENGE outer tag", "BF2E", r2w6.outer_tag === null ? "absent" : r2w6.outer_tag);
237 var r2ch6 = null; for (var r2ci6 = 0; r2ci6 < r2w6.children.length; r2ci6++) { if (r2w6.children[r2ci6].tag === "80") { r2ch6 = r2w6.children[r2ci6]; } }
238 var r2chal6 = r2ch6 === null ? "" : r2ch6.value;
239 bind.checkData("S6-C2 tagOfeuiccChallenge", "80", r2ch6 === null ? "absent" : r2ch6.tag);
240 bind.checkData("S6-C2 lengthOfeuiccChallenge", "10", r2ch6 === null ? "absent" : (r2ch6.len < 16 ? ("0" + r2ch6.len.toString(16).toUpperCase()) : r2ch6.len.toString(16).toUpperCase()));
241
242 // 步骤 7:Seq#02] Step4 输入准备(InitiateAuthentication):<S_TRANSACTION_ID>、<EUICC_CHALLENGE>、<S_SMDS_CHALLENGE>、<S_SMDS_SIGNATURE1>;设 <EUICC_CI_PK_ID_TO_BE_USED> 为基于 NIST P-256 的 CI Key ID;选取导向同一 Root CI 的 #CERT_S_SM_DSauth_ECDSA(tc_step;non_wire)
243 // test-tool internal preparation (no APDU face): runtime-domain
244 // values per CaseIR unresolved (G Annex B generation rules);
245 // no fabricated bytes emitted here.
246
247 // 步骤 8:Seq#02] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ24_008, RQ26_005, RQ26_006, RQ26_008, RQ26_012, RQ26_013, RQ26_029, RQ26_034, RQ31_025, RQ31_078, RQ43_002, RQ45_006, RQ45_026, RQ45_026_1, RQ57_094, RQ57_095, RQ57_096, RQ57_097, RQ57_098, RQ57_099, RQ57_101, RQ57_102, RQ57_103, RQ57_104, RQ57_105, RQ57_106, RQ57_107, RQ57_108, RQ31_046, RQ31_047, RQ31_048, RQ31_049, RQ31_050, RQ31_051, RQ31_053, RQ31_054, RQ31_055, RQ36_017)
248 // dynamic-template 多占位运行时绑定(B-5;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;模板 tag 权威 = SGP.22 §5.7.13 + AUTOMATIC TAGS + 黄金切片线缆三源对账)
249 var dt8Tid = "";
250 var dt8Sc = "";
251 for (var dt8Ri = 0; dt8Ri < 16; dt8Ri++) {
252 dt8Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
253 dt8Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
254 }
255 var dt8PkList = BindEs10xSingleRequest.parseBerTlv(gw5.fields["AA"] || "");
256 var dt8CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
257 var dt8Certs = ["308201DEA00302010202027495300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038353034315A170D3330303333303038353034315A3024310D300B060355040A0C0441434D453113301106035504030C0A5445535420534D2D44533059301306072A8648CE3D020106082A8648CE3D0301070342000437FB94E3A2BEFE763E1A774A4854880F106D80F936845BAD2FDD971BC068D8AB61A5481AEE977D5A8168BB9F79004B1D0072C1BA7673B0CB64816E1019B24FD0A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3300E0603551D0F0101FF040403020780301D0603551D0E04160414C1F4064B3B258AFB61388B3FF2EE6A61E2C44D72300E0603551D1104073005880388370F30170603551D200101FF040D300B300906076781120102010730610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020348003045022100C0BE4522932DACA9F8997AD54FA0E59490966BED91D222316880BC371FB3223702204FBDE30C3A167F231C0E397EAF29402A01D8C36B148083FD23A9DD39DDC7BAB2", "308201DFA00302010202027495300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038353034315A170D3330303333303038353034315A3024310D300B060355040A0C0441434D453113301106035504030C0A5445535420534D2D4453305A301406072A8648CE3D020106092B24030302080101070342000481D1D023F39F18433418C28CD23D42157A439FEDD29E59AB1186E130898196C1563A13F48B36D6D4B13B4D085A5760AE613D061FFE6FC7A40C6502E3FF733C31A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8300E0603551D0F0101FF040403020780301D0603551D0E04160414F05F0B54AEE8AE0108F01DEF548ED9859714DD48300E0603551D1104073005880388370F30170603551D200101FF040D300B300906076781120102010730610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402203CC1D42AFDEC627E71B962754245B7DF0BAC0AA5A0AB08CC2FA6B7D557BED93F022050337E43DBE80FD4202024760AB9FAD1AC4647F6D450629C9CD51BF7222E2AA0"];
258 var dt8Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
259 var dt8Sel = -1;
260 for (var dt8Pi = 0; dt8Pi < dt8PkList.length && dt8Sel < 0; dt8Pi++) {
261 for (var dt8Mi = 0; dt8Mi < dt8CiIds.length; dt8Mi++) {
262 if (dt8PkList[dt8Pi].value === dt8CiIds[dt8Mi]) { dt8Sel = dt8Mi; break; }
263 }
264 }
265 var dt8SkiSel = dt8Sel;
266 var dt8Sks = ["03BB1A30D2C8E37A3A8C4D66C20C81CCC2C0BD3681DE3614C8D78A6E6A2BA172", "1C07C347BBC7753E22EA70385D7EB47BABCEEE96C491D629B2104338FB158387"];
267 var dt8Ctx = "801130373339392D42474837452D5438373739A13A800400000000A1288003050000810308000082030100008303010000840302000085030200008603090000870302010082080000000011111111";
268 if (dt8Sel < 0 || dt8SkiSel < 0) {
269 bind.checkData("S8-C1 SW", "9000", "dt8_not_executed:no_usable_material_set");
270 bind.checkData("S8-C2 structure_ok", "1", "0");
271 bind.checkData("S8-C3 transactionId echo", dt8Tid, "dt8_not_executed:no_usable_material_set");
272 bind.checkData("S8-C4 serverChallenge echo", dt8Sc, "dt8_not_executed:no_usable_material_set");
273 bind.checkData("S8-C5 sig_verify", "1", "0");
274 bind.checkData("S8-C6 ctxParams1 echo", dt8Ctx, "dt8_not_executed:no_usable_material_set");
275 } else {
276 bind.engine.InitEccDomainParams(dt8Dps[dt8Sel][0], dt8Dps[dt8Sel][1], dt8Dps[dt8Sel][2], dt8Dps[dt8Sel][3], dt8Dps[dt8Sel][4], 1);
277 var dt8S1 = BindEs10xSingleRequest.buildTlv("30",
278 BindEs10xSingleRequest.buildTlv("80", dt8Tid)
279 + BindEs10xSingleRequest.buildTlv("81", gw6.fields["80"] || "")
280 + BindEs10xSingleRequest.buildTlv("83", "1674657374726F6F74736D64732E6578616D706C652E636F6D")
281 + BindEs10xSingleRequest.buildTlv("84", dt8Sc));
282 var dt8Sgn = "";
283 while (dt8Sgn.length != 2 * dt8Sks[dt8Sel].length) {
284 bind.engine.SleepTime(2000);
285 dt8Sgn = bind.engine.EccSignData(dt8Sks[dt8Sel], dt8S1, 33);
286 }
287 var dt8Asm = BindEs10bAuthServer.assembleAuthenticateServer(
288 {outer: "BF38",
289 signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
290 serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
291 {transactionId: dt8Tid, euiccChallenge: gw6.fields["80"] || "",
292 serverAddress: "1674657374726F6F74736D64732E6578616D706C652E636F6D", serverChallenge: dt8Sc,
293 serverSignature1: dt8Sgn, euiccCiPKIdToBeUsed: dt8CiIds[dt8SkiSel],
294 serverCertificate: dt8Certs[dt8Sel], ctxParams1: dt8Ctx});
295 if (dt8Asm.error) {
296 bind.checkData("S8-C1 SW", "9000", "dt8_assemble_error");
297 bind.checkData("S8-C2 structure_ok", "1", "0");
298 bind.checkData("S8-C3 transactionId echo", dt8Tid, "dt8_assemble_error");
299 bind.checkData("S8-C4 serverChallenge echo", dt8Sc, "dt8_assemble_error");
300 bind.checkData("S8-C5 sig_verify", "1", "0");
301 bind.checkData("S8-C6 ctxParams1 echo", dt8Ctx, "dt8_assemble_error");
302 } else {
303 var dt8Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
304 {cla: "", ins: "E2", p1: "91", p2: "00", data: dt8Asm.request_hex,
305 le: "00", blockSize: 255, blockSw: "9000", finalSw: "9000"});
306 var dt8Sw = (dt8Run.final && dt8Run.final.sw) ? dt8Run.final.sw : "transport_error";
307 bind.checkData("S8-C1 SW", "9000", dt8Sw);
308 var dt8Ex = BindEs10bAuthServer.extractAuthenticateServer(
309 {outer: "BF38",
310 ok: {tag: "A0", children: [
311 {name: "euiccSigned1", tag: "30", children: [
312 {name: "transactionId", tag: "80"},
313 {name: "serverAddress", tag: "83"},
314 {name: "serverChallenge", tag: "84"},
315 {name: "euiccInfo2", tag: "BF22"},
316 {name: "ctxParams1", tag: "A0"}]},
317 {name: "euiccSignature1", tag: "5F37"},
318 {name: "euiccCertificate", tag: "30"},
319 {name: "eumCertificate", tag: "30"}]},
320 error: {tag: "A1", children: [{name: "transactionId", tag: "80"}, {name: "authenticateErrorCode", tag: "81"}]}},
321 dt8Run.final ? dt8Run.final.resp : "");
322 var dt8OkBr = dt8Ex.branch === "ok" && dt8Ex.ok && dt8Ex.ok.missing.length === 0 && dt8Ex.ok.fields.euiccSigned1.children.missing.length === 0;
323 var dt8ErrBr = dt8Ex.branch === "error" && dt8Ex.error && dt8Ex.error.missing.length === 0;
324 bind.checkData("S8-C2 R_AUTH_SMDS_IMEI authenticateResponseOk structure", "1", dt8OkBr ? "1" : "0");
325 bind.checkData("S8-C3 transactionId echo", dt8Tid,
326 dt8OkBr ? dt8Ex.ok.fields.euiccSigned1.children.fields.transactionId.value
327 : (dt8ErrBr ? dt8Ex.error.fields.transactionId.value : "branch_absent"));
328 bind.checkData("S8-C4 serverChallenge echo", dt8Sc,
329 dt8OkBr ? dt8Ex.ok.fields.euiccSigned1.children.fields.serverChallenge.value : "branch_absent");
330 // S8-C5: euiccSignature1 验签(engine EccVerifySign,vendor CommonArith Ecc_Verify ABI 同机制):PK 自响应 euiccCertificate subjectPublicKey BIT STRING 机械提取(X.509:03 42 00 04 || x||y,SEC1 非压缩点——自 04 前缀起取 65B/130hex,对齐 vendor X_509.js subjectPublicKey.substr(2)),签名明文 = euiccSigned1 完整 TLV(RQ26_035 编码后数据对象)。
331 var dt8Pk = "";
332 if (dt8OkBr) {
333 var dt8CertH = dt8Ex.ok.fields.euiccCertificate.value;
334 var dt8Ki = dt8CertH.indexOf("03420004");
335 if (dt8Ki >= 0 && dt8Ki + 6 + 130 <= dt8CertH.length) {
336 dt8Pk = dt8CertH.substring(dt8Ki + 6, dt8Ki + 6 + 130);
337 }
338 }
339 var dt8ES1 = "";
340 if (dt8OkBr) {
341 var dt8ESc = dt8Ex.ok.fields.euiccSigned1.children.fields;
342 dt8ES1 = BindEs10xSingleRequest.buildTlv("30",
343 BindEs10xSingleRequest.buildTlv("80", dt8ESc.transactionId.value)
344 + BindEs10xSingleRequest.buildTlv("83", dt8ESc.serverAddress.value)
345 + BindEs10xSingleRequest.buildTlv("84", dt8ESc.serverChallenge.value)
346 + BindEs10xSingleRequest.buildTlv("BF22", dt8ESc.euiccInfo2.value)
347 + BindEs10xSingleRequest.buildTlv("A0", dt8ESc.ctxParams1.value));
348 }
349 bind.checkData("S8-C5 euiccSignature1 verify", "1",
350 (dt8OkBr && dt8Pk !== "" && dt8ES1 !== ""
351 && bind.engine.EccVerifySign(dt8Pk, dt8ES1,
352 dt8Ex.ok.fields.euiccSignature1.value, 33) != 0) ? "1" : "0");
353 bind.checkData("S8-C6 ctxParams1 echo", dt8Ctx,
354 dt8OkBr ? dt8Ex.ok.fields.euiccSigned1.children.fields.ctxParams1.value : "branch_absent");
355 }
356 }
357}
358
完整 unified diff
行级差异:新增 356 行 / 删除 128 行(以 -man 为基准,unified 上下文 3 行)。
展开 diff(489 行)
--- -man
+++ -cas
@@ -1,130 +1,358 @@
-// slice of Import\TestCase_SGP_23.js - cases: TC_eUICC_ES10b_AuthenticateServer_SM_DS_NIST_01_Nominal_With_EventID_in_CtxParams1 + TC_eUICC_ES10b_AuthenticateServer_SM_DS_NIST_02_Nominal_With_IMEI_and_EventID_in_Device_Capabilities (extracted verbatim)
-
-function TC_eUICC_ES10b_AuthenticateServer_SM_DS_NIST_01_Nominal_With_EventID_in_CtxParams1()
-{
- if(!Card_Have_ECC_Cert)
- return;
-
- //测试入口条件
- if(!check_Applicability_of_tests_RSP_SGP23_test("C001"))
- return;
-
-
- tracenamestr = "测试目的:执行AuthenticateServer指令,CtxParams1中没有EventID";
- curDis.TraceStart(sno++,tracenamestr);
-
- curDis.TestStepStart2(stno++,"复位;");
- ResetCard();
-
- curDis.TestStepStart2(stno++,"读卡器向卡片发送Terminal Capability命令;");
- TS_TERMINAL_CAPABILITY_cmd();
-
- 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;");
- pkId_CI_ForVerification = pkId_CI_ECDSA_NIST;
- pkId_CI_ForSigning = pkId_CI_ECDSA_NIST;
- 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;");
- var DeviceCapabilities1 = new DeviceCapabilities();
- DeviceCapabilities1.gsmSupportedRelease = "050000";
- DeviceCapabilities1.utranSupportedRelease = "080000";
- DeviceCapabilities1.cdma2000onexSupportedRelease = "010000";
- DeviceCapabilities1.cdma2000hrpdSupportedRelease = "010000";
- DeviceCapabilities1.cdma2000ehrpdSupportedRelease = "020000";
- DeviceCapabilities1.eutranSupportedRelease = "020000";
- DeviceCapabilities1.contactlessSupportedRelease = "090000";
- DeviceCapabilities1.rspCrlSupportedVersion = "020100";
-
- var DeviceInfo1 = new DeviceInfo();
- DeviceInfo1.tac = "00000000";
- DeviceInfo1.deviceCapabilities = DeviceCapabilities1.GenHexData();
-
- var CtxParamsForCommonAuthentication1 =new CtxParamsForCommonAuthentication();
- CtxParamsForCommonAuthentication1.matchingId = "30373339392D42474837452D5438373739";
- CtxParamsForCommonAuthentication1.deviceInfo = DeviceInfo1.GenHexData();
-
- ctxParamsForCommonAuthentication=CtxParamsForCommonAuthentication1.GenHexData();
-
- Profile_load_procedure.DPauthInforObj.D_key = SK_S_SM_DSauth_ECDSA_NIST;
- Profile_load_procedure.DPauthInforObj.Cert = CERT_S_SM_DSauth_ECDSA_NIST;
- Profile_load_procedure.ES10b_AuthenticateServer();
-
- RecoverCard();
-}
-
-function TC_eUICC_ES10b_AuthenticateServer_SM_DS_NIST_02_Nominal_With_IMEI_and_EventID_in_Device_Capabilities()
-{
- if(!Card_Have_ECC_Cert)
- return;
-
- //测试入口条件
- if(!check_Applicability_of_tests_RSP_SGP23_test("C001"))
- return;
-
-
-
- tracenamestr = "测试目的:执行AuthenticateServer指令,Device Capabilities中带有IMEI和EventID";
- curDis.TraceStart(sno++,tracenamestr);
-
- curDis.TestStepStart2(stno++,"复位;");
- ResetCard();
-
- curDis.TestStepStart2(stno++,"读卡器向卡片发送Terminal Capability命令;");
- TS_TERMINAL_CAPABILITY_cmd();
-
- 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;");
- pkId_CI_ForVerification = pkId_CI_ECDSA_NIST;
- pkId_CI_ForSigning = pkId_CI_ECDSA_NIST;
- 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;");
- var DeviceCapabilities1 = new DeviceCapabilities();
- DeviceCapabilities1.gsmSupportedRelease = "050000";
- DeviceCapabilities1.utranSupportedRelease = "080000";
- DeviceCapabilities1.cdma2000onexSupportedRelease = "010000";
- DeviceCapabilities1.eutranSupportedRelease = "020000";
-
- var DeviceInfo1 = new DeviceInfo();
- DeviceInfo1.tac = "00000000";
- DeviceInfo1.deviceCapabilities = DeviceCapabilities1.GenHexData();
- DeviceInfo1.imei = "0000000011111111";
-
- var CtxParamsForCommonAuthentication1 =new CtxParamsForCommonAuthentication();
- CtxParamsForCommonAuthentication1.matchingId = "30373339392D42474837452D5438373739";
- CtxParamsForCommonAuthentication1.deviceInfo = DeviceInfo1.GenHexData();
-
- ctxParamsForCommonAuthentication=CtxParamsForCommonAuthentication1.GenHexData();
-
- Profile_load_procedure.DPauthInforObj.D_key = SK_S_SM_DSauth_ECDSA_NIST;
- Profile_load_procedure.DPauthInforObj.Cert = CERT_S_SM_DSauth_ECDSA_NIST;
- Profile_load_procedure.ES10b_AuthenticateServer();
-
- RecoverCard();
+// Author: 卡思Cas智能体
+// Date: 20261004-022634
+// Function: (purpose 原文未由 SGP.23 该 TC 提供,corpus vacuum 登记)TC_eUICC_ES10b.AuthenticateServer_SM-DS_NIST,Test Sequence #01-#02 Nominal(本 TC 全部 2 条 Test Sequence 合并展开),适用性 C001。
+// 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 SW;S4-C2 structure_ok
+// S4-C3 transactionId echo;S4-C4 serverChallenge echo;S4-C5 sig_verify;S4-C6 ctxParams1 echo
+// S4-C2 R_AUTHENTICATE_SMDS authenticateResponseOk structure;S4-C5 euiccSignature1 verify
+// S5-C1 SW;S5-C2 R_EUICC_INFO1 outer tag;S5-C2 R_EUICC_INFO1 required members present
+// S5-C3 CI PK lists share at least one key id;S6-C1 SW;S6-C2 R_CHALLENGE outer tag
+// S6-C2 R_CHALLENGE required members present;S6-C2 tagOfeuiccChallenge
+// S6-C2 lengthOfeuiccChallenge;S8-C1 SW;S8-C2 structure_ok;S8-C3 transactionId echo
+// S8-C4 serverChallenge echo;S8-C5 sig_verify;S8-C6 ctxParams1 echo
+// S8-C2 R_AUTH_SMDS_IMEI authenticateResponseOk structure;S8-C5 euiccSignature1 verify
+// 本函数由 CaseIR 4.2.18.2.6 编译生成(4.2.18.2.6-TC_eUICC_ES10b.AuthenticateServer_SM-DS_NIST-20261004_022634,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 环境前置承担。
+function TC_eUICC_ES10b_AuthenticateServer_SM_DS_NIST_01_02_Nominal_TC_2_Test_Sequence() {
+ var bind = curBind;
+
+ // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 1):RESET(K 语料机械展开)
+ var s9 = bind.resetAndAtr();
+ bind.checkData("ICH-IC1-K1-C1 ATR_present", "1", s9.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 s10 = bind.sendApdu("00", "A4", "00", "04", "3F00", "00", "9000");
+ bind.checkData("ICH-IC1-K2-C2 FCP_Template", "1", s10.resp.length > 0 ? "1" : "0");
+ bind.checkData("ICH-IC1-K2-C4 SW", "9000", s10.sw);
+
+ // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 3):TERMINAL_CAPABILITY_LPAd(K 语料机械展开)
+ var s11 = bind.sendApdu("80", "AA", "00", "00", "A9058100830107", null, "9000");
+ bind.checkData("ICH-IC1-K3-C4 SW", "9000", s11.sw);
+
+ // IC head inline (initial_conditions → PROC_EUICC_INITIALIZATION_SEQUENCE, K row 4):TERMINAL_PROFILE(K 语料机械展开)
+ var steady12 = bind.runToSteadyState(function () {
+ return bind.sendTerminalProfile("FFFFFFFF7F9D00DFBF00001FE2000000C7EB0000000168005000000000000200", "9000");
+ });
+ bind.checkData("ICH-IC1-K4-C4 final SW", "9000", steady12.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 s13 = bind.manageChannelOpen("9000");
+ bind.checkData("ICH-IC2-K1-C4 SW", "9000", s13.sw);
+ bind.checkData("ICH-IC2-K1-C3 CHANNEL_NUMBER extracted", "1", s13.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 s14 = 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", s14.sw);
+
+ // 步骤 1:Seq#01] MTD_STORE_DATA(tc_step;REQ: RQ36_017)
+ // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
+ var sdCla1 = s13.chan !== null ? (s13.chan <= 3 ? 128 + s13.chan : 188 + s13.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:Seq#01] MTD_STORE_DATA(tc_step;REQ: RQ36_017)
+ // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
+ var sdCla2 = s13.chan !== null ? (s13.chan <= 3 ? 128 + s13.chan : 188 + s13.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:Seq#01] Step4 输入准备(InitiateAuthentication):<S_TRANSACTION_ID>、<EUICC_CHALLENGE>、<S_SMDS_CHALLENGE>、<S_SMDS_SIGNATURE1>;设 <EUICC_CI_PK_ID_TO_BE_USED> 为基于 NIST P-256 的 CI Key ID;选取导向同一 Root CI 的 #CERT_S_SM_DSauth_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:Seq#01] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ24_008, RQ26_005, RQ26_006, RQ26_008, RQ26_012, RQ26_013, RQ26_029, RQ26_034, RQ31_025, RQ31_078, RQ43_002, RQ45_006, RQ45_026, RQ45_026_1, RQ57_094, RQ57_095, RQ57_096, RQ57_097, RQ57_098, RQ57_099, RQ57_101, RQ57_102, RQ57_103, RQ57_104, RQ57_105, RQ57_106, RQ57_107, RQ57_108, RQ31_046, RQ31_047, RQ31_048, RQ31_049, RQ31_050, RQ31_051, RQ31_053, RQ31_054, RQ31_055, RQ36_017)
+ // dynamic-template 多占位运行时绑定(B-5;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;模板 tag 权威 = SGP.22 §5.7.13 + AUTOMATIC TAGS + 黄金切片线缆三源对账)
+ var dt4Tid = "";
+ var dt4Sc = "";
+ for (var dt4Ri = 0; dt4Ri < 16; dt4Ri++) {
+ dt4Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+ dt4Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+ }
+ var dt4PkList = BindEs10xSingleRequest.parseBerTlv(gw1.fields["AA"] || "");
+ var dt4CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
+ var dt4Certs = ["308201DEA00302010202027495300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038353034315A170D3330303333303038353034315A3024310D300B060355040A0C0441434D453113301106035504030C0A5445535420534D2D44533059301306072A8648CE3D020106082A8648CE3D0301070342000437FB94E3A2BEFE763E1A774A4854880F106D80F936845BAD2FDD971BC068D8AB61A5481AEE977D5A8168BB9F79004B1D0072C1BA7673B0CB64816E1019B24FD0A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3300E0603551D0F0101FF040403020780301D0603551D0E04160414C1F4064B3B258AFB61388B3FF2EE6A61E2C44D72300E0603551D1104073005880388370F30170603551D200101FF040D300B300906076781120102010730610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020348003045022100C0BE4522932DACA9F8997AD54FA0E59490966BED91D222316880BC371FB3223702204FBDE30C3A167F231C0E397EAF29402A01D8C36B148083FD23A9DD39DDC7BAB2", "308201DFA00302010202027495300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038353034315A170D3330303333303038353034315A3024310D300B060355040A0C0441434D453113301106035504030C0A5445535420534D2D4453305A301406072A8648CE3D020106092B24030302080101070342000481D1D023F39F18433418C28CD23D42157A439FEDD29E59AB1186E130898196C1563A13F48B36D6D4B13B4D085A5760AE613D061FFE6FC7A40C6502E3FF733C31A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8300E0603551D0F0101FF040403020780301D0603551D0E04160414F05F0B54AEE8AE0108F01DEF548ED9859714DD48300E0603551D1104073005880388370F30170603551D200101FF040D300B300906076781120102010730610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402203CC1D42AFDEC627E71B962754245B7DF0BAC0AA5A0AB08CC2FA6B7D557BED93F022050337E43DBE80FD4202024760AB9FAD1AC4647F6D450629C9CD51BF7222E2AA0"];
+ var dt4Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+ var dt4Sel = -1;
+ for (var dt4Pi = 0; dt4Pi < dt4PkList.length && dt4Sel < 0; dt4Pi++) {
+ for (var dt4Mi = 0; dt4Mi < dt4CiIds.length; dt4Mi++) {
+ if (dt4PkList[dt4Pi].value === dt4CiIds[dt4Mi]) { dt4Sel = dt4Mi; break; }
+ }
+ }
+ var dt4SkiSel = dt4Sel;
+ var dt4Sks = ["03BB1A30D2C8E37A3A8C4D66C20C81CCC2C0BD3681DE3614C8D78A6E6A2BA172", "1C07C347BBC7753E22EA70385D7EB47BABCEEE96C491D629B2104338FB158387"];
+ var dt4Ctx = "801130373339392D42474837452D5438373739A130800400000000A12880030500008103080000820301000083030100008403020000850302000086030900008703020100";
+ if (dt4Sel < 0 || dt4SkiSel < 0) {
+ bind.checkData("S4-C1 SW", "9000", "dt4_not_executed:no_usable_material_set");
+ bind.checkData("S4-C2 structure_ok", "1", "0");
+ bind.checkData("S4-C3 transactionId echo", dt4Tid, "dt4_not_executed:no_usable_material_set");
+ bind.checkData("S4-C4 serverChallenge echo", dt4Sc, "dt4_not_executed:no_usable_material_set");
+ bind.checkData("S4-C5 sig_verify", "1", "0");
+ bind.checkData("S4-C6 ctxParams1 echo", dt4Ctx, "dt4_not_executed:no_usable_material_set");
+ } else {
+ bind.engine.InitEccDomainParams(dt4Dps[dt4Sel][0], dt4Dps[dt4Sel][1], dt4Dps[dt4Sel][2], dt4Dps[dt4Sel][3], dt4Dps[dt4Sel][4], 1);
+ var dt4S1 = BindEs10xSingleRequest.buildTlv("30",
+ BindEs10xSingleRequest.buildTlv("80", dt4Tid)
+ + BindEs10xSingleRequest.buildTlv("81", gw2.fields["80"] || "")
+ + BindEs10xSingleRequest.buildTlv("83", "1674657374726F6F74736D64732E6578616D706C652E636F6D")
+ + BindEs10xSingleRequest.buildTlv("84", dt4Sc));
+ var dt4Sgn = "";
+ while (dt4Sgn.length != 2 * dt4Sks[dt4Sel].length) {
+ bind.engine.SleepTime(2000);
+ dt4Sgn = bind.engine.EccSignData(dt4Sks[dt4Sel], dt4S1, 33);
+ }
+ var dt4Asm = BindEs10bAuthServer.assembleAuthenticateServer(
+ {outer: "BF38",
+ signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
+ serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
+ {transactionId: dt4Tid, euiccChallenge: gw2.fields["80"] || "",
+ serverAddress: "1674657374726F6F74736D64732E6578616D706C652E636F6D", serverChallenge: dt4Sc,
+ serverSignature1: dt4Sgn, euiccCiPKIdToBeUsed: dt4CiIds[dt4SkiSel],
+ serverCertificate: dt4Certs[dt4Sel], ctxParams1: dt4Ctx});
+ if (dt4Asm.error) {
+ bind.checkData("S4-C1 SW", "9000", "dt4_assemble_error");
+ bind.checkData("S4-C2 structure_ok", "1", "0");
+ bind.checkData("S4-C3 transactionId echo", dt4Tid, "dt4_assemble_error");
+ bind.checkData("S4-C4 serverChallenge echo", dt4Sc, "dt4_assemble_error");
+ bind.checkData("S4-C5 sig_verify", "1", "0");
+ bind.checkData("S4-C6 ctxParams1 echo", dt4Ctx, "dt4_assemble_error");
+ } else {
+ var dt4Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+ {cla: "", ins: "E2", p1: "91", p2: "00", data: dt4Asm.request_hex,
+ le: "00", blockSize: 255, blockSw: "9000", finalSw: "9000"});
+ var dt4Sw = (dt4Run.final && dt4Run.final.sw) ? dt4Run.final.sw : "transport_error";
+ bind.checkData("S4-C1 SW", "9000", dt4Sw);
+ var dt4Ex = BindEs10bAuthServer.extractAuthenticateServer(
+ {outer: "BF38",
+ ok: {tag: "A0", children: [
+ {name: "euiccSigned1", tag: "30", children: [
+ {name: "transactionId", tag: "80"},
+ {name: "serverAddress", tag: "83"},
+ {name: "serverChallenge", tag: "84"},
+ {name: "euiccInfo2", tag: "BF22"},
+ {name: "ctxParams1", tag: "A0"}]},
+ {name: "euiccSignature1", tag: "5F37"},
+ {name: "euiccCertificate", tag: "30"},
+ {name: "eumCertificate", tag: "30"}]},
+ error: {tag: "A1", children: [{name: "transactionId", tag: "80"}, {name: "authenticateErrorCode", tag: "81"}]}},
+ dt4Run.final ? dt4Run.final.resp : "");
+ var dt4OkBr = dt4Ex.branch === "ok" && dt4Ex.ok && dt4Ex.ok.missing.length === 0 && dt4Ex.ok.fields.euiccSigned1.children.missing.length === 0;
+ var dt4ErrBr = dt4Ex.branch === "error" && dt4Ex.error && dt4Ex.error.missing.length === 0;
+ bind.checkData("S4-C2 R_AUTHENTICATE_SMDS authenticateResponseOk structure", "1", dt4OkBr ? "1" : "0");
+ bind.checkData("S4-C3 transactionId echo", dt4Tid,
+ dt4OkBr ? dt4Ex.ok.fields.euiccSigned1.children.fields.transactionId.value
+ : (dt4ErrBr ? dt4Ex.error.fields.transactionId.value : "branch_absent"));
+ bind.checkData("S4-C4 serverChallenge echo", dt4Sc,
+ dt4OkBr ? dt4Ex.ok.fields.euiccSigned1.children.fields.serverChallenge.value : "branch_absent");
+ // S4-C5: euiccSignature1 验签(engine EccVerifySign,vendor CommonArith Ecc_Verify ABI 同机制):PK 自响应 euiccCertificate subjectPublicKey BIT STRING 机械提取(X.509:03 42 00 04 || x||y,SEC1 非压缩点——自 04 前缀起取 65B/130hex,对齐 vendor X_509.js subjectPublicKey.substr(2)),签名明文 = euiccSigned1 完整 TLV(RQ26_035 编码后数据对象)。
+ var dt4Pk = "";
+ if (dt4OkBr) {
+ var dt4CertH = dt4Ex.ok.fields.euiccCertificate.value;
+ var dt4Ki = dt4CertH.indexOf("03420004");
+ if (dt4Ki >= 0 && dt4Ki + 6 + 130 <= dt4CertH.length) {
+ dt4Pk = dt4CertH.substring(dt4Ki + 6, dt4Ki + 6 + 130);
+ }
+ }
+ var dt4ES1 = "";
+ if (dt4OkBr) {
+ var dt4ESc = dt4Ex.ok.fields.euiccSigned1.children.fields;
+ dt4ES1 = BindEs10xSingleRequest.buildTlv("30",
+ BindEs10xSingleRequest.buildTlv("80", dt4ESc.transactionId.value)
+ + BindEs10xSingleRequest.buildTlv("83", dt4ESc.serverAddress.value)
+ + BindEs10xSingleRequest.buildTlv("84", dt4ESc.serverChallenge.value)
+ + BindEs10xSingleRequest.buildTlv("BF22", dt4ESc.euiccInfo2.value)
+ + BindEs10xSingleRequest.buildTlv("A0", dt4ESc.ctxParams1.value));
+ }
+ bind.checkData("S4-C5 euiccSignature1 verify", "1",
+ (dt4OkBr && dt4Pk !== "" && dt4ES1 !== ""
+ && bind.engine.EccVerifySign(dt4Pk, dt4ES1,
+ dt4Ex.ok.fields.euiccSignature1.value, 33) != 0) ? "1" : "0");
+ bind.checkData("S4-C6 ctxParams1 echo", dt4Ctx,
+ dt4OkBr ? dt4Ex.ok.fields.euiccSigned1.children.fields.ctxParams1.value : "branch_absent");
+ }
+ }
+
+ // 步骤 5:Seq#02] MTD_STORE_DATA(tc_step;REQ: RQ36_017)
+ // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
+ var sdCla5 = s13.chan !== null ? (s13.chan <= 3 ? 128 + s13.chan : 188 + s13.chan).toString(16).toUpperCase() : null;
+ var s5 = bind.sendApdu(sdCla5, "E2", "91", "00", "BF2000", "00", "9000");
+ bind.checkData("S5-C1 SW", "9000", s5.sw);
+ // geca-proc ES10b Info 响应面(R_EUICC_INFO1,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
+ var gw5 = BindGecaProc.parseGecaResponse(s5.resp, {outer: "BF20", required: ["82", "A9", "AA"], optional: []});
+ bind.checkData("S5-C2 R_EUICC_INFO1 outer tag", "BF20", gw5.outer_tag === null ? "absent" : gw5.outer_tag);
+ bind.checkData("S5-C2 R_EUICC_INFO1 required members present", "1", gw5.ok ? "1" : "0");
+ var pkV5 = BindEs10xSingleRequest.parseBerTlv(gw5.fields["A9"] || "");
+ var pkS5 = BindEs10xSingleRequest.parseBerTlv(gw5.fields["AA"] || "");
+ var samePk5 = false;
+ for (var pvi5 = 0; pvi5 < pkV5.length; pvi5++) {
+ for (var psi5 = 0; psi5 < pkS5.length; psi5++) {
+ if (pkV5[pvi5].value !== "" && pkV5[pvi5].value === pkS5[psi5].value) { samePk5 = true; }
+ }
+ }
+ bind.checkData("S5-C3 CI PK lists share at least one key id", "1", samePk5 ? "1" : "0");
+
+ // 步骤 6:Seq#02] MTD_STORE_DATA(tc_step;REQ: RQ36_017)
+ // <L> length binding and the conditional 61XX + GET RESPONSE chain (D.4.2) are CasBind internal state (chaining rule).
+ var sdCla6 = s13.chan !== null ? (s13.chan <= 3 ? 128 + s13.chan : 188 + s13.chan).toString(16).toUpperCase() : null;
+ var s6 = bind.sendApdu(sdCla6, "E2", "91", "00", "BF2E00", "00", "9000");
+ bind.checkData("S6-C1 SW", "9000", s6.sw);
+ // geca-proc ES10b Info 响应面(R_CHALLENGE,SGP.22 §5.7.7/§5.7.8 结构机械转录;响应外层 tag = 请求 tag):绑定层结构步行 + 在场性断言。
+ var gw6 = BindGecaProc.parseGecaResponse(s6.resp, {outer: "BF2E", required: ["80"], optional: []});
+ bind.checkData("S6-C2 R_CHALLENGE outer tag", "BF2E", gw6.outer_tag === null ? "absent" : gw6.outer_tag);
+ bind.checkData("S6-C2 R_CHALLENGE required members present", "1", gw6.ok ? "1" : "0");
+ var r2w6 = BindGecaProc.parseGecaResponse(s6.resp, {outer: "BF2E", required: ["80"]});
+ bind.checkData("S6-C2 R_CHALLENGE outer tag", "BF2E", r2w6.outer_tag === null ? "absent" : r2w6.outer_tag);
+ var r2ch6 = null; for (var r2ci6 = 0; r2ci6 < r2w6.children.length; r2ci6++) { if (r2w6.children[r2ci6].tag === "80") { r2ch6 = r2w6.children[r2ci6]; } }
+ var r2chal6 = r2ch6 === null ? "" : r2ch6.value;
+ bind.checkData("S6-C2 tagOfeuiccChallenge", "80", r2ch6 === null ? "absent" : r2ch6.tag);
+ bind.checkData("S6-C2 lengthOfeuiccChallenge", "10", r2ch6 === null ? "absent" : (r2ch6.len < 16 ? ("0" + r2ch6.len.toString(16).toUpperCase()) : r2ch6.len.toString(16).toUpperCase()));
+
+ // 步骤 7:Seq#02] Step4 输入准备(InitiateAuthentication):<S_TRANSACTION_ID>、<EUICC_CHALLENGE>、<S_SMDS_CHALLENGE>、<S_SMDS_SIGNATURE1>;设 <EUICC_CI_PK_ID_TO_BE_USED> 为基于 NIST P-256 的 CI Key ID;选取导向同一 Root CI 的 #CERT_S_SM_DSauth_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.
+
+ // 步骤 8:Seq#02] MTD_STORE_DATA_SCRIPT(tc_step;REQ: RQ24_008, RQ26_005, RQ26_006, RQ26_008, RQ26_012, RQ26_013, RQ26_029, RQ26_034, RQ31_025, RQ31_078, RQ43_002, RQ45_006, RQ45_026, RQ45_026_1, RQ57_094, RQ57_095, RQ57_096, RQ57_097, RQ57_098, RQ57_099, RQ57_101, RQ57_102, RQ57_103, RQ57_104, RQ57_105, RQ57_106, RQ57_107, RQ57_108, RQ31_046, RQ31_047, RQ31_048, RQ31_049, RQ31_050, RQ31_051, RQ31_053, RQ31_054, RQ31_055, RQ36_017)
+ // dynamic-template 多占位运行时绑定(B-5;声明面 = command.dynamic_template + 顶层 dynamic_templates.es10b_authenticate_server;物料 sha256 锚编译期已核;模板 tag 权威 = SGP.22 §5.7.13 + AUTOMATIC TAGS + 黄金切片线缆三源对账)
+ var dt8Tid = "";
+ var dt8Sc = "";
+ for (var dt8Ri = 0; dt8Ri < 16; dt8Ri++) {
+ dt8Tid += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+ dt8Sc += bind.engine.Hex(Math.round(255 * Math.random()), 2);
+ }
+ var dt8PkList = BindEs10xSingleRequest.parseBerTlv(gw5.fields["AA"] || "");
+ var dt8CiIds = ["F54172BDF98A95D65CBEB88A38A1C11D800A85C3", "C0BC70BA36929D43B467FF57570530E57AB8FCD8"];
+ var dt8Certs = ["308201DEA00302010202027495300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038353034315A170D3330303333303038353034315A3024310D300B060355040A0C0441434D453113301106035504030C0A5445535420534D2D44533059301306072A8648CE3D020106082A8648CE3D0301070342000437FB94E3A2BEFE763E1A774A4854880F106D80F936845BAD2FDD971BC068D8AB61A5481AEE977D5A8168BB9F79004B1D0072C1BA7673B0CB64816E1019B24FD0A381DF3081DC301F0603551D23041830168014F54172BDF98A95D65CBEB88A38A1C11D800A85C3300E0603551D0F0101FF040403020780301D0603551D0E04160414C1F4064B3B258AFB61388B3FF2EE6A61E2C44D72300E0603551D1104073005880388370F30170603551D200101FF040D300B300906076781120102010730610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D0403020348003045022100C0BE4522932DACA9F8997AD54FA0E59490966BED91D222316880BC371FB3223702204FBDE30C3A167F231C0E397EAF29402A01D8C36B148083FD23A9DD39DDC7BAB2", "308201DFA00302010202027495300A06082A8648CE3D04030230443110300E06035504030C07546573742043493111300F060355040B0C0854455354434552543110300E060355040A0C0752535054455354310B3009060355040613024954301E170D3230303430313038353034315A170D3330303333303038353034315A3024310D300B060355040A0C0441434D453113301106035504030C0A5445535420534D2D4453305A301406072A8648CE3D020106092B24030302080101070342000481D1D023F39F18433418C28CD23D42157A439FEDD29E59AB1186E130898196C1563A13F48B36D6D4B13B4D085A5760AE613D061FFE6FC7A40C6502E3FF733C31A381DF3081DC301F0603551D23041830168014C0BC70BA36929D43B467FF57570530E57AB8FCD8300E0603551D0F0101FF040403020780301D0603551D0E04160414F05F0B54AEE8AE0108F01DEF548ED9859714DD48300E0603551D1104073005880388370F30170603551D200101FF040D300B300906076781120102010730610603551D1F045A3058302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D412E63726C302AA028A0268624687474703A2F2F63692E746573742E6578616D706C652E636F6D2F43524C2D422E63726C300A06082A8648CE3D040302034700304402203CC1D42AFDEC627E71B962754245B7DF0BAC0AA5A0AB08CC2FA6B7D557BED93F022050337E43DBE80FD4202024760AB9FAD1AC4647F6D450629C9CD51BF7222E2AA0"];
+ var dt8Dps = [["FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"], ["A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", "048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"]];
+ var dt8Sel = -1;
+ for (var dt8Pi = 0; dt8Pi < dt8PkList.length && dt8Sel < 0; dt8Pi++) {
+ for (var dt8Mi = 0; dt8Mi < dt8CiIds.length; dt8Mi++) {
+ if (dt8PkList[dt8Pi].value === dt8CiIds[dt8Mi]) { dt8Sel = dt8Mi; break; }
+ }
+ }
+ var dt8SkiSel = dt8Sel;
+ var dt8Sks = ["03BB1A30D2C8E37A3A8C4D66C20C81CCC2C0BD3681DE3614C8D78A6E6A2BA172", "1C07C347BBC7753E22EA70385D7EB47BABCEEE96C491D629B2104338FB158387"];
+ var dt8Ctx = "801130373339392D42474837452D5438373739A13A800400000000A1288003050000810308000082030100008303010000840302000085030200008603090000870302010082080000000011111111";
+ if (dt8Sel < 0 || dt8SkiSel < 0) {
+ bind.checkData("S8-C1 SW", "9000", "dt8_not_executed:no_usable_material_set");
+ bind.checkData("S8-C2 structure_ok", "1", "0");
+ bind.checkData("S8-C3 transactionId echo", dt8Tid, "dt8_not_executed:no_usable_material_set");
+ bind.checkData("S8-C4 serverChallenge echo", dt8Sc, "dt8_not_executed:no_usable_material_set");
+ bind.checkData("S8-C5 sig_verify", "1", "0");
+ bind.checkData("S8-C6 ctxParams1 echo", dt8Ctx, "dt8_not_executed:no_usable_material_set");
+ } else {
+ bind.engine.InitEccDomainParams(dt8Dps[dt8Sel][0], dt8Dps[dt8Sel][1], dt8Dps[dt8Sel][2], dt8Dps[dt8Sel][3], dt8Dps[dt8Sel][4], 1);
+ var dt8S1 = BindEs10xSingleRequest.buildTlv("30",
+ BindEs10xSingleRequest.buildTlv("80", dt8Tid)
+ + BindEs10xSingleRequest.buildTlv("81", gw6.fields["80"] || "")
+ + BindEs10xSingleRequest.buildTlv("83", "1674657374726F6F74736D64732E6578616D706C652E636F6D")
+ + BindEs10xSingleRequest.buildTlv("84", dt8Sc));
+ var dt8Sgn = "";
+ while (dt8Sgn.length != 2 * dt8Sks[dt8Sel].length) {
+ bind.engine.SleepTime(2000);
+ dt8Sgn = bind.engine.EccSignData(dt8Sks[dt8Sel], dt8S1, 33);
+ }
+ var dt8Asm = BindEs10bAuthServer.assembleAuthenticateServer(
+ {outer: "BF38",
+ signed1: {tag: "30", transactionId: "80", euiccChallenge: "81", serverAddress: "83", serverChallenge: "84"},
+ serverSignature1: "5F37", euiccCiPKIdToBeUsed: "04", serverCertificate: "30", ctxParams1: "A0"},
+ {transactionId: dt8Tid, euiccChallenge: gw6.fields["80"] || "",
+ serverAddress: "1674657374726F6F74736D64732E6578616D706C652E636F6D", serverChallenge: dt8Sc,
+ serverSignature1: dt8Sgn, euiccCiPKIdToBeUsed: dt8CiIds[dt8SkiSel],
+ serverCertificate: dt8Certs[dt8Sel], ctxParams1: dt8Ctx});
+ if (dt8Asm.error) {
+ bind.checkData("S8-C1 SW", "9000", "dt8_assemble_error");
+ bind.checkData("S8-C2 structure_ok", "1", "0");
+ bind.checkData("S8-C3 transactionId echo", dt8Tid, "dt8_assemble_error");
+ bind.checkData("S8-C4 serverChallenge echo", dt8Sc, "dt8_assemble_error");
+ bind.checkData("S8-C5 sig_verify", "1", "0");
+ bind.checkData("S8-C6 ctxParams1 echo", dt8Ctx, "dt8_assemble_error");
+ } else {
+ var dt8Run = BindEs10xSingleRequest.runTransport(bind.sendApdu,
+ {cla: "", ins: "E2", p1: "91", p2: "00", data: dt8Asm.request_hex,
+ le: "00", blockSize: 255, blockSw: "9000", finalSw: "9000"});
+ var dt8Sw = (dt8Run.final && dt8Run.final.sw) ? dt8Run.final.sw : "transport_error";
+ bind.checkData("S8-C1 SW", "9000", dt8Sw);
+ var dt8Ex = BindEs10bAuthServer.extractAuthenticateServer(
+ {outer: "BF38",
+ ok: {tag: "A0", children: [
+ {name: "euiccSigned1", tag: "30", children: [
+ {name: "transactionId", tag: "80"},
+ {name: "serverAddress", tag: "83"},
+ {name: "serverChallenge", tag: "84"},
+ {name: "euiccInfo2", tag: "BF22"},
+ {name: "ctxParams1", tag: "A0"}]},
+ {name: "euiccSignature1", tag: "5F37"},
+ {name: "euiccCertificate", tag: "30"},
+ {name: "eumCertificate", tag: "30"}]},
+ error: {tag: "A1", children: [{name: "transactionId", tag: "80"}, {name: "authenticateErrorCode", tag: "81"}]}},
+ dt8Run.final ? dt8Run.final.resp : "");
+ var dt8OkBr = dt8Ex.branch === "ok" && dt8Ex.ok && dt8Ex.ok.missing.length === 0 && dt8Ex.ok.fields.euiccSigned1.children.missing.length === 0;
+ var dt8ErrBr = dt8Ex.branch === "error" && dt8Ex.error && dt8Ex.error.missing.length === 0;
+ bind.checkData("S8-C2 R_AUTH_SMDS_IMEI authenticateResponseOk structure", "1", dt8OkBr ? "1" : "0");
+ bind.checkData("S8-C3 transactionId echo", dt8Tid,
+ dt8OkBr ? dt8Ex.ok.fields.euiccSigned1.children.fields.transactionId.value
+ : (dt8ErrBr ? dt8Ex.error.fields.transactionId.value : "branch_absent"));
+ bind.checkData("S8-C4 serverChallenge echo", dt8Sc,
+ dt8OkBr ? dt8Ex.ok.fields.euiccSigned1.children.fields.serverChallenge.value : "branch_absent");
+ // S8-C5: euiccSignature1 验签(engine EccVerifySign,vendor CommonArith Ecc_Verify ABI 同机制):PK 自响应 euiccCertificate subjectPublicKey BIT STRING 机械提取(X.509:03 42 00 04 || x||y,SEC1 非压缩点——自 04 前缀起取 65B/130hex,对齐 vendor X_509.js subjectPublicKey.substr(2)),签名明文 = euiccSigned1 完整 TLV(RQ26_035 编码后数据对象)。
+ var dt8Pk = "";
+ if (dt8OkBr) {
+ var dt8CertH = dt8Ex.ok.fields.euiccCertificate.value;
+ var dt8Ki = dt8CertH.indexOf("03420004");
+ if (dt8Ki >= 0 && dt8Ki + 6 + 130 <= dt8CertH.length) {
+ dt8Pk = dt8CertH.substring(dt8Ki + 6, dt8Ki + 6 + 130);
+ }
+ }
+ var dt8ES1 = "";
+ if (dt8OkBr) {
+ var dt8ESc = dt8Ex.ok.fields.euiccSigned1.children.fields;
+ dt8ES1 = BindEs10xSingleRequest.buildTlv("30",
+ BindEs10xSingleRequest.buildTlv("80", dt8ESc.transactionId.value)
+ + BindEs10xSingleRequest.buildTlv("83", dt8ESc.serverAddress.value)
+ + BindEs10xSingleRequest.buildTlv("84", dt8ESc.serverChallenge.value)
+ + BindEs10xSingleRequest.buildTlv("BF22", dt8ESc.euiccInfo2.value)
+ + BindEs10xSingleRequest.buildTlv("A0", dt8ESc.ctxParams1.value));
+ }
+ bind.checkData("S8-C5 euiccSignature1 verify", "1",
+ (dt8OkBr && dt8Pk !== "" && dt8ES1 !== ""
+ && bind.engine.EccVerifySign(dt8Pk, dt8ES1,
+ dt8Ex.ok.fields.euiccSignature1.value, 33) != 0) ? "1" : "0");
+ bind.checkData("S8-C6 ctxParams1 echo", dt8Ctx,
+ dt8OkBr ? dt8Ex.ok.fields.euiccSigned1.children.fields.ctxParams1.value : "branch_absent");
+ }
+ }
}