eSIM SGP.22 LPA程序开发 - 实现功能
eSIM SGP.22 LPA程序开发 - 实现功能
eSIM SGP.22 LPA程序开发 - 协议解析
硬件设备: eSIM读卡器 + eUICC卡
开发语言: Net8.0
交互协议: APDU
交互通道: PCSC.Iso7816(智能卡)

插入设备后自动识别智能卡

修改 pcsc-sharp\PCSC.Iso7816\IsoReader.cs源码





核心代码 SCardUtil.cs
using LPA.IPAd.SGP22.Model; using LPA.IPAd.SGP22.Parser; using Newtonsoft.Json; using PCSC; using PCSC.Iso7816; using System.Data; using System.Text; namespace LPA.IPAd.SGP22 { public class SCardUtil { static ISCardContext ctx; static ICardReader reader; static IsoReader isoReader; static List<ProfileInfo> lstProfileInfo; public static string[] List() { ctx = ContextFactory.Instance.Establish(SCardScope.System); var readerNames = ctx.GetReaders(); return readerNames; } public static void Connect(string readerName) { reader = ctx.ConnectReader(readerName, SCardShareMode.Shared, SCardProtocol.Any); isoReader = new IsoReader(ctx, readerName, SCardShareMode.Shared, SCardProtocol.Any, false); isoReader.RetransmitWaitTime = 5; var status = reader.GetStatus(); Logger.Info($"Reader:{status.GetReaderNames().FirstOrDefault()} protocol:{status.Protocol} state:{status.State}"); Logger.Info($"Card ATR: {BitConverter.ToString(status.GetAtr())}"); InitApdu(); Refresh(); } public static void DisConnect() { reader.Disconnect(SCardReaderDisposition.Unpower); } static byte[] EchoApdu(CommandApdu apdu, bool hasAck = true) { Logger.Info($"[APDU] [TX] CLA: {apdu.CLA:X2}, INS: {apdu.INS:X2}, P1: {apdu.P1:X2}, P2: {apdu.P2:X2}, Lc: {apdu.Lc:X2}, Data: {DataUtil.ToHexString(apdu.Data)}"); byte[] content = null; var response = isoReader.Transmit(apdu); Logger.Info($"[APDU] [RX] SW1: {response.SW1:X2} SW2: {response.SW2:X2} Data: {DataUtil.ToHexString(response.GetData())}"); if (hasAck) { if (response.SW2 != 0) { // 获取指定长度的数据 apdu = new CommandApdu(IsoCase.Case2Short, SCardProtocol.Any) { CLA = 0x81, Instruction = (InstructionCode)0xC0, P1 = 0x00, P2 = 0x00, Le = response.SW2 }; Logger.Info($"[APDU] [TX] CLA: {apdu.CLA:X2}, INS: {apdu.INS:X2}, P1: {apdu.P1:X2}, P2: {apdu.P2:X2}, Lc: {apdu.Le:X2}, Data: {DataUtil.ToHexString(apdu.Data)}"); response = isoReader.Transmit(apdu); content = response.GetData(); Logger.Info($"[APDU] [RX] SW1: {response.SW1:X2} SW2: {response.SW2:X2} Data: {DataUtil.ToHexString(content)}"); } else { if (response.SW1 != 0x90) { // 分包获取 var lstContent = new List<byte[]>(); while (true) { apdu = new CommandApdu(IsoCase.Case2Short, SCardProtocol.Any) { CLA = 0x81, Instruction = (InstructionCode)0xC0, P1 = 0x00, P2 = 0x00 }; Logger.Info($"[APDU] [TX] CLA: {apdu.CLA:X2}, INS: {apdu.INS:X2}, P1: {apdu.P1:X2}, P2: {apdu.P2:X2}, Lc: {apdu.Le:X2}, Data: {DataUtil.ToHexString(apdu.Data)}"); response = isoReader.Transmit(apdu); content = response.GetData(); Logger.Info($"[APDU] [RX] SW1: {response.SW1:X2} SW2: {response.SW2:X2} Data: {DataUtil.ToHexString(content)}"); if (null != content && content.Length > 0) { lstContent.Add(content);// 涉及分包,在接受完后解析 if (response.SW1 == 0x90 && response.SW2 == 0x00) { break; } } } content = lstContent.SelectMany(arr => arr).ToArray(); Logger.Info($"[APDU] [TX] CLA: {apdu.CLA:X2}, INS: {apdu.INS:X2}, P1: {apdu.P1:X2}, P2: {apdu.P2:X2}, Lc: {apdu.Lc:X2}, Data: {DataUtil.ToHexString(apdu.Data)}"); Logger.Info($"[APDU] [RX] SW1: {response.SW1:X2} SW2: {response.SW2:X2} Data: {DataUtil.ToHexString(content)}"); } } } return content; } public static void Test() { // 获取profile数据 ProfileParser.Test(); // 获取chip数据 ChipParser.Test(); // 获取notification数据 NotificationParser.Test(); } public static void Refresh() { lstProfileInfo = ProfileList(); ChipInfo(); var lst = NotificationList();// 消息列表 foreach (var item in lst) { NotificationProcess(item.SeqNumber, item.NotificationAddress);// 消息通知 } } static void InitApdu() { // 80aa00000aa9088100820101830107 // 9000 // 0070000001 // 019000 // 01a4040010a0000005591010ffffffff8900000100 // 6121 Logger.Info("=== InitApdu Begin ==="); // 启动加载 var apdu = new CommandApdu(IsoCase.Case3Short, SCardProtocol.Any) { CLA = 0x80, Instruction = (InstructionCode)0xAA, P1 = 0x00, P2 = 0x00, Data = [0xA9, 0x08, 0x81, 0x00, 0x82, 0x01, 0x01, 0x83, 0x01, 0x07] }; EchoApdu(apdu, false); apdu = new CommandApdu(IsoCase.Case2Short, SCardProtocol.Any) { CLA = 0x00, Instruction = (InstructionCode)0x70, P1 = 0x00, P2 = 0x00, Le = 1 }; EchoApdu(apdu, false); apdu = new CommandApdu(IsoCase.Case3Short, SCardProtocol.Any) { CLA = 0x01, Instruction = (InstructionCode)0xA4, P1 = 0x04, P2 = 0x00, Data = [0xA0, 0x00, 0x00, 0x05, 0x59, 0x10, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x89, 0x00, 0x00, 0x01, 0x00] }; EchoApdu(apdu, false); } public static List<ProfileInfo> ProfileList() { //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 00, Lc: 03, Data: BF 2D 00 //[DEBUG][APDU][RX] SW1: 61, SW2: 05, Data: //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 05, Data: //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: BF 2D 02 A0 00 Logger.Info("=== GetProfiles Begin ==="); var apdu = new CommandApdu(IsoCase.Case3Short, SCardProtocol.Any) { CLA = 0x81, Instruction = (InstructionCode)0xE2, P1 = 0x91, P2 = 0x00, Data = [0xBF, 0x2D, 0x00] }; var content = EchoApdu(apdu); if (null == content || content.Length == 0) { return null; } return ProfileParser.GetProfiles(content); } public static ChipInfo ChipInfo() { // 获取EID //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 00, Lc: 06, Data: BF 3E 03 5C 01 5A //[DEBUG][APDU][RX] SW1: 61, SW2: 15, Data: //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 15, Data: //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: BF 3E 12 5A 10 89 04 40 45 21 67 27 49 48 00 00 00 00 80 82 48 // 获取配置地址 //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 00, Lc: 03, Data: BF 3C 00 //[DEBUG][APDU][RX] SW1: 61, SW2: 35, Data: //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 35, Data: //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: BF 3C 32 80 1F 73 6D 64 70 2D 70 6C 75 73 2D 30 2E 65 75 2E 63 64 2E 72 73 70 2E 6B 69 67 65 6E 2E 63 6F 6D 81 0F 6C 70 61 2E 64 73 2E 67 73 6D 61 2E 63 6F 6D // 规则授权表 //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 00, Lc: 03, Data: BF 43 00 //[DEBUG][APDU][RX] SW1: 61, SW2: 1B, Data: //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 1B, Data: //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: BF 43 18 A0 16 30 14 80 02 05 60 A1 0B 30 09 80 03 EE EE EE 81 00 82 00 82 01 00 // EUICC Info2 //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 00, Lc: 03, Data: BF 22 00 //[DEBUG][APDU][RX] SW1: 61, SW2: 7E, Data: //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 7E, Data: //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: BF 22 7B 81 03 02 03 01 82 03 02 03 00 83 03 24 11 04 84 0D 81 01 08 82 04 00 16 62 C0 83 02 7E 76 85 05 06 7F 36 F7 C0 86 03 0F 01 00 87 03 02 03 00 88 02 03 98 A9 16 04 14 81 37 0F 51 25 D0 B1 D4 08 D4 C3 B2 32 E6 D2 5E 79 5B EB FB AA 16 04 14 81 37 0F 51 25 D0 B1 D4 08 D4 C3 B2 32 E6 D2 5E 79 5B EB FB 99 02 06 40 04 03 01 00 00 0C 0D 4B 4E 2D 44 4E 2D 55 50 2D 30 39 32 34 Logger.Info("=== GetChipInfo Begin ==="); ChipInfo info = new ChipInfo(); // 获取EID var apdu = new CommandApdu(IsoCase.Case3Short, SCardProtocol.Any) { CLA = 0x81, Instruction = (InstructionCode)0xE2, P1 = 0x91, P2 = 0x00, Data = [0xBF, 0x3E, 0x03, 0x5C, 0x01, 0x5A] }; var content = EchoApdu(apdu);// BF 3E 12 5A 10 89 04 40 45 21 67 27 49 48 00 00 00 00 80 82 48 if (null != content && content.Length > 0) { info.Eid = BaseParser.GetStringNodeLeve2("Eid", 0x3E, 0x5A, content); } // 获取配置地址 apdu = new CommandApdu(IsoCase.Case3Short, SCardProtocol.Any) { CLA = 0x81, Instruction = (InstructionCode)0xE2, P1 = 0x91, P2 = 0x00, Data = [0xBF, 0x3C, 0x00] }; content = EchoApdu(apdu);// BF 3C 32 80 1F 73 6D 64 70 2D 70 6C 75 73 2D 30 2E 65 75 2E 63 64 2E 72 73 70 2E 6B 69 67 65 6E 2E 63 6F 6D 81 0F 6C 70 61 2E 64 73 2E 67 73 6D 61 2E 63 6F 6D if (null != content && content.Length > 0) { var configuerd = ChipParser.EuiccConfiguredAddresses(content); info.EuiccConfiguredAddresses.DefaultDpAddress = configuerd.Item1; info.EuiccConfiguredAddresses.RootDsAddress = configuerd.Item2; } // 规则授权表 // EUICC Info2 apdu = new CommandApdu(IsoCase.Case3Short, SCardProtocol.Any) { CLA = 0x81, Instruction = (InstructionCode)0xE2, P1 = 0x91, P2 = 0x00, Data = [0xBF, 0x22, 0x00] }; content = EchoApdu(apdu);// BF 22 7B 81 03 02 03 01 82 03 02 03 00 83 03 24 11 04 84 0D 81 01 0B 82 04 00 16 67 C0 83 02 7F E3 85 05 06 7F 36 F7 C0 86 03 0F 01 00 87 03 02 03 00 88 02 03 98 A9 16 04 14 81 37 0F 51 25 D0 B1 D4 08 D4 C3 B2 32 E6 D2 5E 79 5B EB FB AA 16 04 14 81 37 0F 51 25 D0 B1 D4 08 D4 C3 B2 32 E6 D2 5E 79 5B EB FB 99 02 06 40 04 03 01 00 00 0C 0D 4B 4E 2D 44 4E 2D 55 50 2D 30 39 32 34 if (null != content && content.Length > 0) { info.EuiccInfo2 = ChipParser.EUICCInfo2(content); } JsonConsolePrinter.PrintAsJson(info, "GetChipInfo End"); return info; } public static List<NotificationInfo> NotificationList() { //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 00, Lc: 03, Data: BF 28 00 //[DEBUG][APDU][RX] SW1: 61, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 00, Data: //[DEBUG][APDU][RX] SW1: 61, SW2: 00, Data: BF 28 82 03 6E A0 82 03 6A BF 2F 2B 80 01 4C 81 02 07 80 0C 16 52 53 50 2E 42 49 4C 4C 49 4F 4E 43 4F 4E 4E 45 43 54 2E 43 4F 4D 5A 0A 98 18 02 30 19 19 91 53 83 93 BF 2F 2B 80 01 51 81 02 07 80 0C 16 52 53 50 2E 42 49 4C 4C 49 4F 4E 43 4F 4E 4E 45 43 54 2E 43 4F 4D 5A 0A 98 18 02 30 19 19 91 53 83 93 BF 2F 2B 80 01 54 81 02 07 80 0C 16 52 53 50 2E 42 49 4C 4C 49 4F 4E 43 4F 4E 4E 45 43 54 2E 43 4F 4D 5A 0A 98 18 02 30 19 19 91 53 83 93 BF 2F 2B 80 01 59 81 02 07 80 0C 16 52 53 50 2E 42 49 4C 4C 49 4F 4E 43 4F 4E 4E 45 43 54 2E 43 4F 4D 5A 0A 98 18 02 30 19 19 91 53 83 93 BF 2F 2B 80 01 48 81 02 07 80 0C 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 5A 0A 98 18 02 30 19 19 91 53 83 93 BF 2F 2B 80 01 49 81 02 06 40 0C 16 72 73 70 2E 62 //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 00, Data: //[DEBUG][APDU][RX] SW1: 61, SW2: 00, Data: 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 5A 0A 98 18 02 30 19 19 91 53 83 93 BF 2F 2B 80 01 4A 81 02 05 20 0C 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 5A 0A 98 18 02 30 19 19 91 53 83 93 BF 2F 2B 80 01 4B 81 02 04 10 0C 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 5A 0A 98 18 02 30 19 19 91 53 83 93 BF 2F 2B 80 01 4D 81 02 07 80 0C 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 5A 0A 98 18 02 30 19 19 91 53 83 93 BF 2F 2B 80 01 4E 81 02 06 40 0C 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 5A 0A 98 18 02 30 19 19 91 53 83 93 BF 2F 2B 80 01 4F 81 02 05 20 0C 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 5A 0A 98 18 02 30 19 19 91 //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 00, Data: //[DEBUG][APDU][RX] SW1: 61, SW2: 73, Data: 53 83 93 BF 2F 2B 80 01 50 81 02 04 10 0C 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 5A 0A 98 18 02 30 19 19 91 53 83 93 BF 2F 2B 80 01 52 81 02 07 80 0C 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 5A 0A 98 18 02 30 19 19 91 53 83 93 BF 2F 2B 80 01 53 81 02 04 10 0C 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 5A 0A 98 18 02 30 19 19 91 53 83 93 BF 2F 2B 80 01 55 81 02 07 80 0C 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 5A 0A 98 18 02 30 19 19 91 53 83 93 BF 2F 2B 80 01 56 81 02 06 40 0C 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 5A 0A 98 18 02 30 19 19 91 53 83 93 BF 2F 2B 80 01 57 81 02 05 20 0C 16 72 73 70 2E 62 69 6C 6C 69 6F 6E //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 73, Data: //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: 63 6F 6E 6E 65 63 74 2E 63 6F 6D 5A 0A 98 18 02 30 19 19 91 53 83 93 BF 2F 2B 80 01 58 81 02 04 10 0C 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 5A 0A 98 18 02 30 19 19 91 53 83 93 BF 2F 2B 80 01 5F 81 02 07 80 0C 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 5A 0A 98 18 02 30 19 19 12 43 38 96 Logger.Info("=== GetNotifications Begin ==="); var ret = new List<NotificationInfo>(); var apdu = new CommandApdu(IsoCase.Case3Short, SCardProtocol.Any) { CLA = 0x81, Instruction = (InstructionCode)0xE2, P1 = 0x91, P2 = 0x00, Data = [0xBF, 0x28, 0x00] }; var content = EchoApdu(apdu); ret.AddRange(NotificationParser.GetNotifications(content)); ret = ret.OrderBy(n => n.SeqNumber).ToList(); JsonConsolePrinter.PrintAsJson(ret, "GetNotifications End"); return ret; } //通知处理流程: //本地检索:从 eSIM 获取待处理通知(ES10b是eUICC(嵌入式SIM卡)与本地配置文件助手(LPA)之间的通信协) //远程处理:将通知转发给 SM-DP+ 服务器 //本地清理:从 eSIM 中移除已处理的通知 public static void NotificationProcess(int id, string notificationAddress) { // { "type":"progress","payload":{ "code":0,"message":"es10b_retrieve_notifications_list","data":"101"} } // [DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 00, Lc: 08, Data: BF 2B 05 A0 03 80 01 65 // [DEBUG][APDU][RX] SW1: 61, SW2: 00, Data: // [DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 00, Data: // [DEBUG][APDU][RX] SW1: 61, SW2: 00, Data: BF 2B 82 05 4E A0 82 05 4A 30 82 05 46 BF 2F 2B 80 01 65 81 02 05 20 0C 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 5A 0A 98 18 02 30 19 19 12 43 38 96 5F 37 40 E6 F3 1D C6 92 59 07 31 85 3C 66 A0 FC B4 55 9A CE 83 ED D9 0A 79 97 01 0A A0 04 72 99 65 FC D4 52 63 12 AC 3E ED BA F9 D1 0E 68 6B 09 81 23 82 DC 66 BD 33 08 E2 5C 78 66 E7 0E 46 87 28 1B 62 30 82 02 07 30 82 01 AC A0 03 02 01 02 02 0E 04 63 E4 D3 DD D7 AC 06 1F CC 1B E5 55 38 30 0A 06 08 2A 86 48 CE 3D 04 03 02 30 62 31 0B 30 09 06 03 55 04 06 13 02 55 4B 31 12 30 10 06 03 55 04 07 0C 09 43 61 6D 62 72 69 64 67 65 31 0E 30 0C 06 03 55 04 0A 0C 05 4B 69 67 65 6E 31 14 30 12 06 03 55 04 0B 0C 0B 45 6E 67 69 6E 65 65 72 69 6E 67 31 19 30 17 06 03 55 04 03 0C 10 45 55 4D 43 6F // [DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 00, Data: // [DEBUG][APDU][RX] SW1: 61, SW2: 00, Data: 6E 73 75 6D 65 72 44 47 44 75 62 30 20 17 0D 32 34 31 31 31 32 30 38 33 31 33 39 5A 18 0F 32 31 32 34 31 31 31 32 30 38 33 31 33 39 5A 30 3B 31 0E 30 0C 06 03 55 04 0A 0C 05 4B 69 67 65 6E 31 29 30 27 06 03 55 04 05 13 20 38 39 30 34 34 30 34 35 32 31 36 37 32 37 34 39 34 38 30 30 30 30 30 30 30 30 38 30 38 32 34 38 30 59 30 13 06 07 2A 86 48 CE 3D 02 01 06 08 2A 86 48 CE 3D 03 01 07 03 42 00 04 39 D6 FB 55 9F 57 12 2B 2E 63 48 05 A7 28 A1 82 E5 B8 80 F9 5E 1C 95 F8 88 68 A5 2F 94 4F AE DF 5E 69 08 61 2B FB 5A A0 60 3E 3B A8 B5 FD 8A D2 7C 0D 98 54 85 E4 33 46 73 33 70 85 CF D2 C5 E5 A3 6B 30 69 30 1D 06 03 55 1D 0E 04 16 04 14 DE A3 AC DF E1 39 18 09 D0 64 FE 99 39 8A FA FB 36 5F A9 3D 30 1F 06 03 55 1D 23 04 18 30 16 80 14 18 9A 08 53 AF D4 94 F6 B0 79 9A // [DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 00, Data: // [DEBUG][APDU][RX] SW1: 61, SW2: 00, Data: 0B 67 F0 F5 D0 C1 29 E3 F6 30 0E 06 03 55 1D 0F 01 01 FF 04 04 03 02 07 80 30 17 06 03 55 1D 20 01 01 FF 04 0D 30 0B 30 09 06 07 67 81 12 01 02 01 01 30 0A 06 08 2A 86 48 CE 3D 04 03 02 03 49 00 30 46 02 21 00 DD 95 4E B3 16 57 57 E6 BC 78 35 96 28 93 64 0C 99 E6 BC CF E8 12 A5 CC 5F 3D 0F C8 EC BD 2D F8 02 21 00 D1 E8 AD 7B 1D 4E 0F 58 5D 1C 8E 99 51 50 4F 49 BC 64 6A 97 B5 89 0C 4C 90 84 CC B7 21 11 EC 30 30 82 02 C6 30 82 02 6D A0 03 02 01 02 02 10 5A CE 8F 98 DC 86 49 40 4A BD AD 65 7E 20 50 93 30 0A 06 08 2A 86 48 CE 3D 04 03 02 30 44 31 18 30 16 06 03 55 04 0A 13 0F 47 53 4D 20 41 73 73 6F 63 69 61 74 69 6F 6E 31 28 30 26 06 03 55 04 03 13 1F 47 53 4D 20 41 73 73 6F 63 69 61 74 69 6F 6E 20 2D 20 52 53 50 32 20 52 6F 6F 74 20 43 49 31 30 1E 17 0D 32 32 // [DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 00, Data: // [DEBUG][APDU][RX] SW1: 61, SW2: 00, Data: 31 30 30 35 30 30 30 30 30 30 5A 17 0D 34 39 31 32 33 31 32 33 35 39 35 39 5A 30 62 31 0B 30 09 06 03 55 04 06 13 02 55 4B 31 12 30 10 06 03 55 04 07 0C 09 43 61 6D 62 72 69 64 67 65 31 0E 30 0C 06 03 55 04 0A 0C 05 4B 69 67 65 6E 31 14 30 12 06 03 55 04 0B 0C 0B 45 6E 67 69 6E 65 65 72 69 6E 67 31 19 30 17 06 03 55 04 03 0C 10 45 55 4D 43 6F 6E 73 75 6D 65 72 44 47 44 75 62 30 59 30 13 06 07 2A 86 48 CE 3D 02 01 06 08 2A 86 48 CE 3D 03 01 07 03 42 00 04 C6 F9 7E EA 2F 76 8A D1 7B A8 62 9A B0 04 EC F7 90 FF 43 57 F2 08 1B E1 5C 23 19 F7 2E C9 66 F9 A2 60 BB B5 C7 35 16 06 97 77 7B 82 9B 59 C9 F6 5F BC 9A 3D 78 54 10 D8 98 6F C2 4E F8 A4 3B 5B A3 82 01 21 30 82 01 1D 30 12 06 03 55 1D 13 01 01 FF 04 08 30 06 01 01 FF 02 01 00 30 17 06 03 55 1D 20 01 01 FF 04 // [DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 00, Data: // [DEBUG][APDU][RX] SW1: 61, SW2: 53, Data: 0D 30 0B 30 09 06 07 67 81 12 01 02 01 02 30 4D 06 03 55 1D 1F 04 46 30 44 30 42 A0 40 A0 3E 86 3C 68 74 74 70 3A 2F 2F 67 73 6D 61 2D 63 72 6C 2E 73 79 6D 61 75 74 68 2E 63 6F 6D 2F 6F 66 66 6C 69 6E 65 63 61 2F 67 73 6D 61 2D 72 73 70 32 2D 72 6F 6F 74 2D 63 69 31 2E 63 72 6C 30 0E 06 03 55 1D 0F 01 01 FF 04 04 03{ "type":"progress","payload":{ "code":0,"message":"es9p_handle_notification","data":"101"} } // { "type":"progress","payload":{ "code":0,"message":"es10b_remove_notification_from_list","data":"101"} } // { "type":"lpa","payload":{ "code":0,"message":"success","data":null} } // 02 01 06 30 37 06 03 55 1D 1E 01 01 FF 04 2D 30 2B A0 29 30 27 A4 25 30 23 31 0E 30 0C 06 03 55 04 0A 13 05 4B 69 67 65 6E 31 11 30 0F 06 03 55 04 05 13 08 38 39 30 34 34 30 34 35 30 16 06 03 55 1D 11 04 0F 30 0D 88 0B 2B 06 01 04 01 83 BB 13 01 02 02 30 1D 06 03 55 1D 0E 04 16 04 14 18 9A 08 53 AF D4 94 F6 B0 79 9A 0B 67 F0 F5 D0 C1 29 E3 F6 30 1F 06 03 55 1D 23 04 18 30 16 80 14 81 37 0F 51 25 D0 B1 D4 08 D4 C3 B2 32 E6 D2 5E 79 5B EB FB 30 0A // [DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 53, Data: // [DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: 06 08 2A 86 48 CE 3D 04 03 02 03 47 00 30 44 02 20 10 66 18 AA 8F BD A5 F4 29 92 81 F4 E3 71 22 04 E6 E9 F3 B0 95 F1 9B 8E 52 ED A6 1F 7E 4A 4D B1 02 20 35 F8 2D 0E 34 6E 2E 83 6C 7F 18 44 39 2A 39 2E 43 DB DE FA 44 E0 BF 22 15 25 E8 94 E5 93 83 D1 // [DEBUG][HTTP][TX] url: https://rsp.billionconnect.com/gsma/rsp2/es9plus/handleNotification, data: {"pendingNotification":"MIIFRr8vK4ABZYECBSAMFnJzcC5iaWxsaW9uY29ubmVjdC5jb21aCpgYAjAZGRJDOJZfN0Dm8x3GklkHMYU8ZqD8tFWazoPt2Qp5lwEKoARymWX81FJjEqw+7br50Q5oawmBI4LcZr0zCOJceGbnDkaHKBtiMIICBzCCAaygAwIBAgIOBGPk093XrAYfzBvlVTgwCgYIKoZIzj0EAwIwYjELMAkGA1UEBhMCVUsxEjAQBgNVBAcMCUNhbWJyaWRnZTEOMAwGA1UECgwFS2lnZW4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRkwFwYDVQQDDBBFVU1Db25zdW1lckRHRHViMCAXDTI0MTExMjA4MzEzOVoYDzIxMjQxMTEyMDgzMTM5WjA7MQ4wDAYDVQQKDAVLaWdlbjEpMCcGA1UEBRMgODkwNDQwNDUyMTY3Mjc0OTQ4MDAwMDAwMDA4MDgyNDgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQ51vtVn1cSKy5jSAWnKKGC5biA+V4clfiIaKUvlE+u315pCGEr+1qgYD47qLX9itJ8DZhUheQzRnMzcIXP0sXlo2swaTAdBgNVHQ4EFgQU3qOs3+E5GAnQZP6ZOYr6+zZfqT0wHwYDVR0jBBgwFoAUGJoIU6/UlPaweZoLZ/D10MEp4/YwDgYDVR0PAQH/BAQDAgeAMBcGA1UdIAEB/wQNMAswCQYHZ4ESAQIBATAKBggqhkjOPQQDAgNJADBGAiEA3ZVOsxZXV+a8eDWWKJNkDJnmvM/oEqXMXz0PyOy9LfgCIQDR6K17HU4PWF0cjplRUE9JvGRql7WJDEyQhMy3IRHsMDCCAsYwggJtoAMCAQICEFrOj5jchklASr2tZX4gUJMwCgYIKoZIzj0EAwIwRDEYMBYGA1UEChMPR1NNIEFzc29jaWF0aW9uMSgwJgYDVQQDEx9HU00gQXNzb2NpYXRpb24gLSBSU1AyIFJvb3QgQ0kxMB4XDTIyMTAwNTAwMDAwMFoXDTQ5MTIzMTIzNTk1OVowYjELMAkGA1UEBhMCVUsxEjAQBgNVBAcMCUNhbWJyaWRnZTEOMAwGA1UECgwFS2lnZW4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRkwFwYDVQQDDBBFVU1Db25zdW1lckRHRHViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExvl+6i92itF7qGKasATs95D/Q1fyCBvhXCMZ9y7JZvmiYLu1xzUWBpd3e4KbWcn2X7yaPXhUENiYb8JO+KQ7W6OCASEwggEdMBIGA1UdEwEB/wQIMAYBAf8CAQAwFwYDVR0gAQH/BA0wCzAJBgdngRIBAgECME0GA1UdHwRGMEQwQqBAoD6GPGh0dHA6Ly9nc21hLWNybC5zeW1hdXRoLmNvbS9vZmZsaW5lY2EvZ3NtYS1yc3AyLXJvb3QtY2kxLmNybDAOBgNVHQ8BAf8EBAMCAQYwNwYDVR0eAQH/BC0wK6ApMCekJTAjMQ4wDAYDVQQKEwVLaWdlbjERMA8GA1UEBRMIODkwNDQwNDUwFgYDVR0RBA8wDYgLKwYBBAGDuxMBAgIwHQYDVR0OBBYEFBiaCFOv1JT2sHmaC2fw9dDBKeP2MB8GA1UdIwQYMBaAFIE3D1El0LHUCNTDsjLm0l55W+v7MAoGCCqGSM49BAMCA0cAMEQCIBBmGKqPvaX0KZKB9ONxIgTm6fOwlfGbjlLtph9+Sk2xAiA1+C0ONG4ug2x/GEQ5KjkuQ9ve+kTgvyIVJeiU5ZOD0Q=="} // [DEBUG][HTTP][RX] rcode: 204, data: (null) // [DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 00, Lc: 06, Data: BF 30 03 80 01 65 // [DEBUG][APDU][RX] SW1: 61, SW2: 06, Data: // [DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 06, Data: // [DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: BF 30 03 80 01 00 Logger.Info($"=== NotificationProcess,id:{id} ==="); byte[] idBytes = null; if (id <= 127) { idBytes = new byte[] { (byte)(id) }; } else { // 十进制128 > 127,所以需要两个字节 idBytes = DataUtil.IntTo2BytesUShort(id); } var tlv = new List<byte> { 0xBF, 0x2B, (byte)(idBytes.Length + 4), 0xA0, (byte)(idBytes.Length + 2), 0x80, (byte)idBytes.Length }; tlv.AddRange(idBytes); // Value var apdu = new CommandApdu(IsoCase.Case3Short, SCardProtocol.Any) { CLA = 0x81, Instruction = (InstructionCode)0xE2, P1 = 0x91, P2 = 0x00, Data = tlv.ToArray() }; var content = EchoApdu(apdu); //var base64 = "MIIFRr8vK4ABZYECBSAMFnJzcC5iaWxsaW9uY29ubmVjdC5jb21aCpgYAjAZGRJDOJZfN0Dm8x3GklkHMYU8ZqD8tFWazoPt2Qp5lwEKoARymWX81FJjEqw+7br50Q5oawmBI4LcZr0zCOJceGbnDkaHKBtiMIICBzCCAaygAwIBAgIOBGPk093XrAYfzBvlVTgwCgYIKoZIzj0EAwIwYjELMAkGA1UEBhMCVUsxEjAQBgNVBAcMCUNhbWJyaWRnZTEOMAwGA1UECgwFS2lnZW4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRkwFwYDVQQDDBBFVU1Db25zdW1lckRHRHViMCAXDTI0MTExMjA4MzEzOVoYDzIxMjQxMTEyMDgzMTM5WjA7MQ4wDAYDVQQKDAVLaWdlbjEpMCcGA1UEBRMgODkwNDQwNDUyMTY3Mjc0OTQ4MDAwMDAwMDA4MDgyNDgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQ51vtVn1cSKy5jSAWnKKGC5biA+V4clfiIaKUvlE+u315pCGEr+1qgYD47qLX9itJ8DZhUheQzRnMzcIXP0sXlo2swaTAdBgNVHQ4EFgQU3qOs3+E5GAnQZP6ZOYr6+zZfqT0wHwYDVR0jBBgwFoAUGJoIU6/UlPaweZoLZ/D10MEp4/YwDgYDVR0PAQH/BAQDAgeAMBcGA1UdIAEB/wQNMAswCQYHZ4ESAQIBATAKBggqhkjOPQQDAgNJADBGAiEA3ZVOsxZXV+a8eDWWKJNkDJnmvM/oEqXMXz0PyOy9LfgCIQDR6K17HU4PWF0cjplRUE9JvGRql7WJDEyQhMy3IRHsMDCCAsYwggJtoAMCAQICEFrOj5jchklASr2tZX4gUJMwCgYIKoZIzj0EAwIwRDEYMBYGA1UEChMPR1NNIEFzc29jaWF0aW9uMSgwJgYDVQQDEx9HU00gQXNzb2NpYXRpb24gLSBSU1AyIFJvb3QgQ0kxMB4XDTIyMTAwNTAwMDAwMFoXDTQ5MTIzMTIzNTk1OVowYjELMAkGA1UEBhMCVUsxEjAQBgNVBAcMCUNhbWJyaWRnZTEOMAwGA1UECgwFS2lnZW4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRkwFwYDVQQDDBBFVU1Db25zdW1lckRHRHViMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExvl+6i92itF7qGKasATs95D/Q1fyCBvhXCMZ9y7JZvmiYLu1xzUWBpd3e4KbWcn2X7yaPXhUENiYb8JO+KQ7W6OCASEwggEdMBIGA1UdEwEB/wQIMAYBAf8CAQAwFwYDVR0gAQH/BA0wCzAJBgdngRIBAgECME0GA1UdHwRGMEQwQqBAoD6GPGh0dHA6Ly9nc21hLWNybC5zeW1hdXRoLmNvbS9vZmZsaW5lY2EvZ3NtYS1yc3AyLXJvb3QtY2kxLmNybDAOBgNVHQ8BAf8EBAMCAQYwNwYDVR0eAQH/BC0wK6ApMCekJTAjMQ4wDAYDVQQKEwVLaWdlbjERMA8GA1UEBRMIODkwNDQwNDUwFgYDVR0RBA8wDYgLKwYBBAGDuxMBAgIwHQYDVR0OBBYEFBiaCFOv1JT2sHmaC2fw9dDBKeP2MB8GA1UdIwQYMBaAFIE3D1El0LHUCNTDsjLm0l55W+v7MAoGCCqGSM49BAMCA0cAMEQCIBBmGKqPvaX0KZKB9ONxIgTm6fOwlfGbjlLtph9+Sk2xAiA1+C0ONG4ug2x/GEQ5KjkuQ9ve+kTgvyIVJeiU5ZOD0Q=="; var base64 = NotificationParser.PendingNotificationBase64(content); // 步骤3:向SM-DP+推送通知(ES9+接口) Logger.Info($"[Progress] es9p_handle_notification - ID:{id}"); var requestBody = new { pendingNotification = base64 }; PushToSmdpPlus($"https://{notificationAddress}/gsma/rsp2/es9plus/handleNotification", requestBody, false); // 删除本地通知 tlv = new List<byte> { 0xBF, 0x30, (byte) (idBytes.Length + 2), 0x80, (byte)idBytes.Length }; tlv.AddRange(idBytes); // Value apdu = new CommandApdu(IsoCase.Case3Short, SCardProtocol.Any) { CLA = 0x81, Instruction = (InstructionCode)0xE2, P1 = 0x91, P2 = 0x00, Data = tlv.ToArray() }; EchoApdu(apdu); Logger.Info($"NotificationProcess,id:{id},Success"); } public static bool Enable(string iccid) { DisableAll(); //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 00, Lc: 14, Data: BF 31 11 A0 0C 5A 0A 98 18 02 30 19 19 12 43 38 96 81 01 00 //[DEBUG][APDU][RX] SW1: 61, SW2: 06, Data: //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 06, Data: //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: BF 31 03 80 01 00 Logger.Info($"=== Enable,ICCID:{iccid} ==="); bool ret = false; byte[] fixedPrefix = { 0xBF, 0x31, 0x11, 0xA0, 0x0C, 0x5A, 0x0A }; byte[] iccidBytes = DataUtil.NumberStringToBytes(iccid); byte[] fixedSuffix = { 0x81, 0x01, 0x00 }; byte[] apduData = fixedPrefix.Concat(iccidBytes).Concat(fixedSuffix).ToArray(); var apdu = new CommandApdu(IsoCase.Case3Short, SCardProtocol.Any) { CLA = 0x81, Instruction = (InstructionCode)0xE2, P1 = 0x91, P2 = 0x00, Data = apduData }; var content = EchoApdu(apdu);// BF 31 03 80 01 00 if (null != content && content.Length > 0) { ret = BaseParser.GetBoolNode("Enable", 0x31, 0x80, content); } Refresh(); return ret; } public static bool Disable(string iccid) { //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 00, Lc: 14, Data: BF 32 11 A0 0C 5A 0A 98 18 02 30 19 19 91 43 06 47 81 01 00 //[DEBUG][APDU][RX] SW1: 61, SW2: 06, Data: //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 06, Data: //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: BF 32 03 80 01 00 Logger.Info($"=== Disable,ICCID:{iccid} ==="); bool ret = false; byte[] fixedPrefix = { 0xBF, 0x32, 0x11, 0xA0, 0x0C, 0x5A, 0x0A }; byte[] iccidBytes = DataUtil.NumberStringToBytes(iccid); byte[] fixedSuffix = { 0x81, 0x01, 0x00 }; byte[] apduData = fixedPrefix.Concat(iccidBytes).Concat(fixedSuffix).ToArray(); var apdu = new CommandApdu(IsoCase.Case3Short, SCardProtocol.Any) { CLA = 0x81, Instruction = (InstructionCode)0xE2, P1 = 0x91, P2 = 0x00, Data = apduData }; var content = EchoApdu(apdu);// BF 32 03 80 01 00 if (null != content && content.Length > 0) { ret = BaseParser.GetBoolNode("Disable", 0x32, 0x80, content); } Refresh(); return ret; } static void DisableAll() { foreach (var item in lstProfileInfo) { Disable(item.Iccid); } } public static bool Delete(string iccid) { Disable(iccid);// 删除之前必须先disable //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 00, Lc: 0F, Data: BF 33 0C 5A 0A 98 18 02 30 19 19 91 43 06 47 //[DEBUG][APDU][RX] SW1: 61, SW2: 06, Data: //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 06, Data: //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: BF 33 03 80 01 00 Logger.Info($"=== Delete,ICCID:{iccid} ==="); bool ret = false; byte[] fixedPrefix = { 0xBF, 0x33, 0x0C, 0x5A, 0x0A }; byte[] iccidBytes = DataUtil.NumberStringToBytes(iccid); byte[] apduData = fixedPrefix.Concat(iccidBytes).ToArray(); var apdu = new CommandApdu(IsoCase.Case3Short, SCardProtocol.Any) { CLA = 0x81, Instruction = (InstructionCode)0xE2, P1 = 0x91, P2 = 0x00, Data = apduData }; var content = EchoApdu(apdu);// BF 33 03 80 01 00 if (null != content && content.Length > 0) { ret = BaseParser.GetBoolNode("Delete", 0x33, 0x80, content); } Refresh(); return ret; } // Profile下载 // es10b_get_euicc_challenge_and_info 获取 EUICC 挑战值 + EUICC 信息 POST // InitiateAuthentication 将值打包成json post // AuthenticateClient 将json串通过APDU写入读卡器,再读APDU返回值,将值打包成json post // GetBoundProfilePackage 将json串通过APDU写入读卡器,再读APDU返回值,将值打包成json post // public static void DownLoad(string smdpAddress, string activationCode) { var resHttp = InitiateAuthentication(smdpAddress); if (resHttp.Item1) { AuthenticateClient(smdpAddress, activationCode, resHttp.Item2); } Refresh(); } public static Tuple<bool, string> InitiateAuthentication(string smdpAddress) { // InitiateAuthentication Logger.Info("es10b_get_euicc_challenge_and_info"); //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 00, Lc: 03, Data: BF 2E 00 //[DEBUG][APDU][RX] SW1: 61, SW2: 15, Data: //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 15, Data: //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: BF 2E 12 80 10 78 03 18 6D 18 46 FE 5E 72 2A 48 36 29 19 B0 D3 //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 00, Lc: 03, Data: BF 20 00 //[DEBUG][APDU][RX] SW1: 61, SW2: 38, Data: //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 38, Data: //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: BF 20 35 82 03 02 03 00 A9 16 04 14 81 37 0F 51 25 D0 B1 D4 08 D4 C3 B2 32 E6 D2 5E 79 5B EB FB AA 16 04 14 81 37 0F 51 25 D0 B1 D4 08 D4 C3 B2 32 E6 D2 5E 79 5B EB FB string euiccChallenge = string.Empty; // EUICC挑战值(Base64编码) var apdu = new CommandApdu(IsoCase.Case3Short, SCardProtocol.Any) { CLA = 0x81, Instruction = (InstructionCode)0xE2, P1 = 0x91, P2 = 0x00, Data = [0xBF, 0x2E, 0x00] }; var content = EchoApdu(apdu);// BF 2E 12 80 10 78 03 18 6D 18 46 FE 5E 72 2A 48 36 29 19 B0 D3 if (null != content && content.Length > 0) { euiccChallenge = BaseParser.GetStringNodeLeve2("EuiccChallenge", 0x2E, 0x80, content, true); } string euiccInfo1 = string.Empty;// EUICC信息1(Base64编码) apdu = new CommandApdu(IsoCase.Case3Short, SCardProtocol.Any) { CLA = 0x81, Instruction = (InstructionCode)0xE2, P1 = 0x91, P2 = 0x00, Data = [0xBF, 0x20, 0x00] }; content = EchoApdu(apdu);// BF 20 35 82 03 02 03 00 A9 16 04 14 81 37 0F 51 25 D0 B1 D4 08 D4 C3 B2 32 E6 D2 5E 79 5B EB FB AA 16 04 14 81 37 0F 51 25 D0 B1 D4 08 D4 C3 B2 32 E6 D2 5E 79 5B EB FB if (null != content && content.Length > 0) { euiccInfo1 = Convert.ToBase64String(content); // 整包编码 } Logger.Info("es9p_initiate_authentication"); var requestBody = new { smdpAddress, euiccChallenge, euiccInfo1 }; return PushToSmdpPlus($"https://{smdpAddress}/gsma/rsp2/es9plus/initiateAuthentication", requestBody); } static void AuthenticateClient(string smdpAddress, string activationCode, string jsonStr) { //[DEBUG][HTTP][TX] url: https://rsp.billionconnect.com/gsma/rsp2/es9plus/initiateAuthentication, data: {"smdpAddress":"rsp.billionconnect.com","euiccChallenge":"zdGqXFx4NAoHrE1Bo+ZSLw==","euiccInfo1":"vyA1ggMCAwCpFgQUgTcPUSXQsdQI1MOyMubSXnlb6/uqFgQUgTcPUSXQsdQI1MOyMubSXnlb6/s="} //[DEBUG][HTTP][RX] rcode: 200, data: //{ // "euiccCiPKIdToBeUsed": "BBSBNw9RJdCx1AjUw7Iy5tJeeVvr+w==", // "header": { // "functionExecutionStatus": { // "status": "Executed-Success" // } // }, // "serverCertificate": "MIICujCCAmCgAwIBAgIQdxXV5wRL8VcYT6VmllqzHzAKBggqhkjOPQQDAjBEMRgwFgYDVQQKEw9HU00gQXNzb2NpYXRpb24xKDAmBgNVBAMTH0dTTSBBc3NvY2lhdGlvbiAtIFJTUDIgUm9vdCBDSTEwHhcNMjMwMjI4MDAwMDAwWhcNMjYwMjI3MjM1OTU5WjCBpTELMAkGA1UEBhMCQ04xEjAQBgNVBAgMCUdVQU5HRE9ORzEPMA0GA1UEBwwGWkhVSEFJMSowKAYDVQQLDCFFYXN0Y29tcGVhY2UgVGVjaG5vbG9neSBDby4sIEx0ZC4xKjAoBgNVBAoMIUVhc3Rjb21wZWFjZSBUZWNobm9sb2d5IENvLiwgTHRkLjEZMBcGA1UEAwwQRWFzdGNvbXBlYWNlIFJTUDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABEoa/+IRDZLouNezyF65HAhf5TevQ1N72RctyHSllNO/9jrZPZYD0RLfxYTzIxe4XhsEZocQI65IrZRlDYFouLWjgdEwgc4wFwYDVR0gAQH/BA0wCzAJBgdngRIBAgEEME0GA1UdHwRGMEQwQqBAoD6GPGh0dHA6Ly9nc21hLWNybC5zeW1hdXRoLmNvbS9vZmZsaW5lY2EvZ3NtYS1yc3AyLXJvb3QtY2kxLmNybDAOBgNVHQ8BAf8EBAMCB4AwFAYDVR0RBA0wC4gJKwYBBAGDih0BMB0GA1UdDgQWBBRWyAbjo0OcRn4pDEPb/sL2Crh+7TAfBgNVHSMEGDAWgBSBNw9RJdCx1AjUw7Iy5tJeeVvr+zAKBggqhkjOPQQDAgNIADBFAiEA9xuMSQ3tdzVf9D8RiBPlFo3gQ5m4cO9wVc/Dm875y1ACIEkwAHC6/muSn8q9fhzVNAJFk0nJelm10YRv5Li7iR9D", // "serverSignature1": "XzdA86WstmBdFpH5gu9/1o/HX7RWdtC8M3byCtseK6yf9Pc5IM5yfKL2TpgAkLOsVhcZPhsGNz7ytePS3oWs6zj/CA==", // "serverSigned1": "ME6AEN9SNntSzFEVUGyJ78KZWR6BEM3RqlxceDQKB6xNQaPmUi+DFnJzcC5iaWxsaW9uY29ubmVjdC5jb22EENPiLmoNqfyopU/tiGIS+dY=", // "transactionId": "df52367b52cc5115506c89efc299591e" //} // 写入 //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 00, Lc: 78, Data: BF 38 82 03 95 //# serverSigned1 服务器挑战值(含transactionId) //30 4E 80 10 DF 52 36 7B 52 CC 51 15 50 6C 89 EF C2 99 59 1E 81 10 CD D1 AA 5C 5C 78 34 0A 07 AC 4D 41 A3 E6 52 2F 83 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 84 10 D3 E2 2E 6A 0D A9 FC A8 A5 4F ED 88 62 12 F9 D6 //# serverSignature1 服务器签名 //5F 37 40 F3 A5 AC B6 60 5D 16 91 F9 82 EF 7F D6 8F C7 5F B4 56 76 D0 BC 33 76 F2 0A DB 1E 2B AC 9F F4 F7 //[DEBUG] [APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 01, Lc: 78, Data: 39 20 CE 72 7C A2 F6 4E 98 00 90 B3 AC 56 17 19 3E 1B 06 37 3E F2 B5 E3 D2 DE 85 AC EB 38 FF 08 //# euiccCiPKIdToBeUsed CI(Credential Issuer)公钥 ID //04 14 81 37 0F 51 25 D0 B1 D4 08 D4 C3 B2 32 E6 D2 5E 79 5B EB FB //# serverCertificate 服务器的 X.509 证书 //30 82 02 BA 30 82 02 60 A0 03 02 01 02 02 10 77 15 D5 E7 04 4B F1 57 18 4F A5 66 96 5A B3 1F 30 0A 06 08 2A 86 48 CE 3D 04 03 02 30 44 31 18 30 16 06 03 55 04 0A 13 0F 47 53 4D 20 41 73 73 6F 63 69 //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 02, Lc: 78, Data: 61 74 69 6F 6E 31 28 30 26 06 03 55 04 03 13 1F 47 53 4D 20 41 73 73 6F 63 69 61 74 69 6F 6E 20 2D 20 52 53 50 32 20 52 6F 6F 74 20 43 49 31 30 1E 17 0D 32 33 30 32 32 38 30 30 30 30 30 30 5A 17 0D 32 36 30 32 32 37 32 33 35 39 35 39 5A 30 81 A5 31 0B 30 09 06 03 55 04 06 13 02 43 4E 31 12 30 10 06 03 55 04 08 0C 09 47 55 41 4E 47 44 4F 4E 47 31 0F 30 0D 06 //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 03, Lc: 78, Data: 03 55 04 07 0C 06 5A 48 55 48 41 49 31 2A 30 28 06 03 55 04 0B 0C 21 45 61 73 74 63 6F 6D 70 65 61 63 65 20 54 65 63 68 6E 6F 6C 6F 67 79 20 43 6F 2E 2C 20 4C 74 64 2E 31 2A 30 28 06 03 55 04 0A 0C 21 45 61 73 74 63 6F 6D 70 65 61 63 65 20 54 65 63 68 6E 6F 6C 6F 67 79 20 43 6F 2E 2C 20 4C 74 64 2E 31 19 30 17 06 03 55 04 03 0C 10 45 61 73 74 63 6F 6D 70 65 //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 04, Lc: 78, Data: 61 63 65 20 52 53 50 30 59 30 13 06 07 2A 86 48 CE 3D 02 01 06 08 2A 86 48 CE 3D 03 01 07 03 42 00 04 4A 1A FF E2 11 0D 92 E8 B8 D7 B3 C8 5E B9 1C 08 5F E5 37 AF 43 53 7B D9 17 2D C8 74 A5 94 D3 BF F6 3A D9 3D 96 03 D1 12 DF C5 84 F3 23 17 B8 5E 1B 04 66 87 10 23 AE 48 AD 94 65 0D 81 68 B8 B5 A3 81 D1 30 81 CE 30 17 06 03 55 1D 20 01 01 FF 04 0D 30 0B 30 09 //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 05, Lc: 78, Data: 06 07 67 81 12 01 02 01 04 30 4D 06 03 55 1D 1F 04 46 30 44 30 42 A0 40 A0 3E 86 3C 68 74 74 70 3A 2F 2F 67 73 6D 61 2D 63 72 6C 2E 73 79 6D 61 75 74 68 2E 63 6F 6D 2F 6F 66 66 6C 69 6E 65 63 61 2F 67 73 6D 61 2D 72 73 70 32 2D 72 6F 6F 74 2D 63 69 31 2E 63 72 6C 30 0E 06 03 55 1D 0F 01 01 FF 04 04 03 02 07 80 30 14 06 03 55 1D 11 04 0D 30 0B 88 09 2B 06 01 //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 06, Lc: 78, Data: 04 01 83 8A 1D 01 30 1D 06 03 55 1D 0E 04 16 04 14 56 C8 06 E3 A3 43 9C 46 7E 29 0C 43 DB FE C2 F6 0A B8 7E ED 30 1F 06 03 55 1D 23 04 18 30 16 80 14 81 37 0F 51 25 D0 B1 D4 08 D4 C3 B2 32 E6 D2 5E 79 5B EB FB 30 0A 06 08 2A 86 48 CE 3D 04 03 02 03 48 00 30 45 02 21 00 F7 1B 8C 49 0D ED 77 35 5F F4 3F 11 88 13 E5 16 8D E0 43 99 B8 70 EF 70 55 CF C3 9B CE F9 //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: -- 成功 //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 07, Lc: 52, Data: CB 50 02 20 49 30 00 70 BA FE 6B 92 9F CA BD 7E 1C D5 34 02 45 93 49 C9 7A 59 B5 D1 84 6F E4 B8 BB 89 1F 43 //A0 2C //#激活码 //80 20 //37 42 30 39 41 30 38 31 43 31 30 31 34 45 30 41 41 38 42 44 39 34 31 41 34 43 33 36 36 37 45 33 //A1 08 80 04 35 29 06 11 A1 00 //[DEBUG][APDU][RX] SW1: 61, SW2: 00, Data: -- 需要获取响应数据 // 读取 //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 00, Data: //[DEBUG][APDU][RX] SW1: 61, SW2: 00, Data: BF 38 82 06 07 A0 82 06 03 30 81 E8 80 10 DF 52 36 7B 52 CC 51 15 50 6C 89 EF C2 99 59 1E 83 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 84 10 D3 E2 2E 6A 0D A9 FC A8 A5 4F ED 88 62 12 F9 D6 BF 22 7B 81 03 02 03 01 82 03 02 03 00 83 03 24 11 04 84 0D 81 01 08 82 04 00 15 7A C0 83 02 7E 76 85 05 06 7F 36 F7 C0 86 03 0F 01 00 87 03 02 03 00 88 02 03 98 A9 16 04 14 81 37 0F 51 25 D0 B1 D4 08 D4 C3 B2 32 E6 D2 5E 79 5B EB FB AA 16 04 14 81 37 0F 51 25 D0 B1 D4 08 D4 C3 B2 32 E6 D2 5E 79 5B EB FB 99 02 06 40 04 03 01 00 00 0C 0D 4B 4E 2D 44 4E 2D 55 50 2D 30 39 32 34 A0 2C 80 20 37 42 30 39 41 30 38 31 43 31 30 31 34 45 30 41 41 38 42 44 39 34 31 41 34 43 33 36 36 37 45 33 A1 08 80 04 35 29 06 11 A1 00 5F 37 40 05 8F AE 8F 17 C8 EB 97 07 //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 00, Data: //[DEBUG][APDU][RX] SW1: 61, SW2: 00, Data: 27 34 D9 D7 FC 1F 7D A8 AB 99 F8 20 29 2A AF 02 4B 89 90 D0 25 FB B4 45 90 9C 75 CA 23 C8 9F 84 4D 2F 0F F1 03 0A 6C 3B 86 04 97 4A F6 FA D2 85 B8 57 FA 64 7C 6C 13 30 82 02 07 30 82 01 AC A0 03 02 01 02 02 0E 04 63 E4 D3 DD D7 AC 06 1F CC 1B E5 55 38 30 0A 06 08 2A 86 48 CE 3D 04 03 02 30 62 31 0B 30 09 06 03 55 04 06 13 02 55 4B 31 12 30 10 06 03 55 04 07 0C 09 43 61 6D 62 72 69 64 67 65 31 0E 30 0C 06 03 55 04 0A 0C 05 4B 69 67 65 6E 31 14 30 12 06 03 55 04 0B 0C 0B 45 6E 67 69 6E 65 65 72 69 6E 67 31 19 30 17 06 03 55 04 03 0C 10 45 55 4D 43 6F 6E 73 75 6D 65 72 44 47 44 75 62 30 20 17 0D 32 34 31 31 31 32 30 38 33 31 33 39 5A 18 0F 32 31 32 34 31 31 31 32 30 38 33 31 33 39 5A 30 3B 31 0E 30 0C 06 03 55 04 0A 0C 05 4B 69 67 65 6E 31 29 30 27 06 03 55 04 //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 00, Data: //[DEBUG][APDU][RX] SW1: 61, SW2: 00, Data: 05 13 20 38 39 30 34 34 30 34 35 32 31 36 37 32 37 34 39 34 38 30 30 30 30 30 30 30 30 38 30 38 32 34 38 30 59 30 13 06 07 2A 86 48 CE 3D 02 01 06 08 2A 86 48 CE 3D 03 01 07 03 42 00 04 39 D6 FB 55 9F 57 12 2B 2E 63 48 05 A7 28 A1 82 E5 B8 80 F9 5E 1C 95 F8 88 68 A5 2F 94 4F AE DF 5E 69 08 61 2B FB 5A A0 60 3E 3B A8 B5 FD 8A D2 7C 0D 98 54 85 E4 33 46 73 33 70 85 CF D2 C5 E5 A3 6B 30 69 30 1D 06 03 55 1D 0E 04 16 04 14 DE A3 AC DF E1 39 18 09 D0 64 FE 99 39 8A FA FB 36 5F A9 3D 30 1F 06 03 55 1D 23 04 18 30 16 80 14 18 9A 08 53 AF D4 94 F6 B0 79 9A 0B 67 F0 F5 D0 C1 29 E3 F6 30 0E 06 03 55 1D 0F 01 01 FF 04 04 03 02 07 80 30 17 06 03 55 1D 20 01 01 FF 04 0D 30 0B 30 09 06 07 67 81 12 01 02 01 01 30 0A 06 08 2A 86 48 CE 3D 04 03 02 03 49 00 30 46 02 21 00 DD //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 00, Data: //[DEBUG][APDU][RX] SW1: 61, SW2: 00, Data: 95 4E B3 16 57 57 E6 BC 78 35 96 28 93 64 0C 99 E6 BC CF E8 12 A5 CC 5F 3D 0F C8 EC BD 2D F8 02 21 00 D1 E8 AD 7B 1D 4E 0F 58 5D 1C 8E 99 51 50 4F 49 BC 64 6A 97 B5 89 0C 4C 90 84 CC B7 21 11 EC 30 30 82 02 C6 30 82 02 6D A0 03 02 01 02 02 10 5A CE 8F 98 DC 86 49 40 4A BD AD 65 7E 20 50 93 30 0A 06 08 2A 86 48 CE 3D 04 03 02 30 44 31 18 30 16 06 03 55 04 0A 13 0F 47 53 4D 20 41 73 73 6F 63 69 61 74 69 6F 6E 31 28 30 26 06 03 55 04 03 13 1F 47 53 4D 20 41 73 73 6F 63 69 61 74 69 6F 6E 20 2D 20 52 53 50 32 20 52 6F 6F 74 20 43 49 31 30 1E 17 0D 32 32 31 30 30 35 30 30 30 30 30 30 5A 17 0D 34 39 31 32 33 31 32 33 35 39 35 39 5A 30 62 31 0B 30 09 06 03 55 04 06 13 02 55 4B 31 12 30 10 06 03 55 04 07 0C 09 43 61 6D 62 72 69 64 67 65 31 0E 30 0C 06 03 55 04 0A 0C //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 00, Data: //[DEBUG][APDU][RX] SW1: 61, SW2: 00, Data: 05 4B 69 67 65 6E 31 14 30 12 06 03 55 04 0B 0C 0B 45 6E 67 69 6E 65 65 72 69 6E 67 31 19 30 17 06 03 55 04 03 0C 10 45 55 4D 43 6F 6E 73 75 6D 65 72 44 47 44 75 62 30 59 30 13 06 07 2A 86 48 CE 3D 02 01 06 08 2A 86 48 CE 3D 03 01 07 03 42 00 04 C6 F9 7E EA 2F 76 8A D1 7B A8 62 9A B0 04 EC F7 90 FF 43 57 F2 08 1B E1 5C 23 19 F7 2E C9 66 F9 A2 60 BB B5 C7 35 16 06 97 77 7B 82 9B 59 C9 F6 5F BC 9A 3D 78 54 10 D8 98 6F C2 4E F8 A4 3B 5B A3 82 01 21 30 82 01 1D 30 12 06 03 55 1D 13 01 01 FF 04 08 30 06 01 01 FF 02 01 00 30 17 06 03 55 1D 20 01 01 FF 04 0D 30 0B 30 09 06 07 67 81 12 01 02 01 02 30 4D 06 03 55 1D 1F 04 46 30 44 30 42 A0 40 A0 3E 86 3C 68 74 74 70 3A 2F 2F 67 73 6D 61 2D 63 72 6C 2E 73 79 6D 61 75 74 68 2E 63 6F 6D 2F 6F 66 66 6C 69 6E 65 63 61 2F //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 00, Data: //[DEBUG][APDU][RX] SW1: 61, SW2: 0C, Data: 67 73 6D 61 2D 72 73 70 32 2D 72 6F 6F 74 2D 63 69 31 2E 63 72 6C 30 0E 06 03 55 1D 0F 01 01 FF 04 04 03 02 01 06 30 37 06 03 55 1D 1E 01 01 FF 04 2D 30 2B A0 29 30 27 A4 25 30 23 31 0E 30 0C 06 03 55 04 0A 13 05 4B 69 67 65 6E 31 11 30 0F 06 03 55 04 05 13 08 38 39 30 34 34 30 34 35 30 16 06 03 55 1D 11 04 0F 30 0D 88 0B 2B 06 01 04 01 83 BB 13 01 02 02 30 1D 06 03 55 1D 0E 04 16 04 14 18 9A 08 53 AF D4 94 F6 B0 79 9A 0B 67 F0 F5 D0 C1 29 E3 F6 30 1F 06 03 55 1D 23 04 18 30 16 80 14 81 37 0F 51 25 D0 B1 D4 08 D4 C3 B2 32 E6 D2 5E 79 5B EB FB 30 0A 06 08 2A 86 48 CE 3D 04 03 02 03 47 00 30 44 02 20 10 66 18 AA 8F BD A5 F4 29 92 81 F4 E3 71 22 04 E6 E9 F3 B0 95 F1 9B 8E 52 ED A6 1F 7E 4A 4D B1 02 20 35 F8 2D 0E 34 6E 2E 83 6C 7F 18 44 39 2A 39 2E 43 DB DE FA //[DEBUG][APDU][TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: 0C, Data: //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: 44 E0 BF 22 15 25 E8 94 E5 93 83 D1 //[DEBUG][HTTP][TX] url: https://rsp.billionconnect.com/gsma/rsp2/es9plus/authenticateClient, data: {"transactionId":"df52367b52cc5115506c89efc299591e","authenticateServerResponse":"vziCBgegggYDMIHogBDfUjZ7UsxRFVBsie/CmVkegxZyc3AuYmlsbGlvbmNvbm5lY3QuY29thBDT4i5qDan8qKVP7YhiEvnWvyJ7gQMCAwGCAwIDAIMDJBEEhA2BAQiCBAAVesCDAn52hQUGfzb3wIYDDwEAhwMCAwCIAgOYqRYEFIE3D1El0LHUCNTDsjLm0l55W+v7qhYEFIE3D1El0LHUCNTDsjLm0l55W+v7mQIGQAQDAQAADA1LTi1ETi1VUC0wOTI0oCyAIDdCMDlBMDgxQzEwMTRFMEFBOEJEOTQxQTRDMzY2N0UzoQiABDUpBhGhAF83QAWPro8XyOuXByc02df8H32oq5n4ICkqrwJLiZDQJfu0RZCcdcojyJ+ETS8P8QMKbDuGBJdK9vrShbhX+mR8bBMwggIHMIIBrKADAgECAg4EY+TT3desBh/MG+VVODAKBggqhkjOPQQDAjBiMQswCQYDVQQGEwJVSzESMBAGA1UEBwwJQ2FtYnJpZGdlMQ4wDAYDVQQKDAVLaWdlbjEUMBIGA1UECwwLRW5naW5lZXJpbmcxGTAXBgNVBAMMEEVVT{"type":"progress","payload":{"code":0,"message":"es10b_cancel_session","data":"rsp.billionconnect.com"}} // test //jsonStr = @" //{ // ""euiccCiPKIdToBeUsed"":""BBSBNw9RJdCx1AjUw7Iy5tJeeVvr+w=="", // ""header"":{ // ""functionExecutionStatus"":{ // ""status"":""Executed-Success"" // } // }, // ""serverCertificate"":""MIICujCCAmCgAwIBAgIQdxXV5wRL8VcYT6VmllqzHzAKBggqhkjOPQQDAjBEMRgwFgYDVQQKEw9HU00gQXNzb2NpYXRpb24xKDAmBgNVBAMTH0dTTSBBc3NvY2lhdGlvbiAtIFJTUDIgUm9vdCBDSTEwHhcNMjMwMjI4MDAwMDAwWhcNMjYwMjI3MjM1OTU5WjCBpTELMAkGA1UEBhMCQ04xEjAQBgNVBAgMCUdVQU5HRE9ORzEPMA0GA1UEBwwGWkhVSEFJMSowKAYDVQQLDCFFYXN0Y29tcGVhY2UgVGVjaG5vbG9neSBDby4sIEx0ZC4xKjAoBgNVBAoMIUVhc3Rjb21wZWFjZSBUZWNobm9sb2d5IENvLiwgTHRkLjEZMBcGA1UEAwwQRWFzdGNvbXBlYWNlIFJTUDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABEoa/+IRDZLouNezyF65HAhf5TevQ1N72RctyHSllNO/9jrZPZYD0RLfxYTzIxe4XhsEZocQI65IrZRlDYFouLWjgdEwgc4wFwYDVR0gAQH/BA0wCzAJBgdngRIBAgEEME0GA1UdHwRGMEQwQqBAoD6GPGh0dHA6Ly9nc21hLWNybC5zeW1hdXRoLmNvbS9vZmZsaW5lY2EvZ3NtYS1yc3AyLXJvb3QtY2kxLmNybDAOBgNVHQ8BAf8EBAMCB4AwFAYDVR0RBA0wC4gJKwYBBAGDih0BMB0GA1UdDgQWBBRWyAbjo0OcRn4pDEPb/sL2Crh+7TAfBgNVHSMEGDAWgBSBNw9RJdCx1AjUw7Iy5tJeeVvr+zAKBggqhkjOPQQDAgNIADBFAiEA9xuMSQ3tdzVf9D8RiBPlFo3gQ5m4cO9wVc/Dm875y1ACIEkwAHC6/muSn8q9fhzVNAJFk0nJelm10YRv5Li7iR9D"", // ""serverSignature1"":""XzdA93IDlWvdARSvCAg5c1Z7MSHQG/T8JC59VLVRP3DYvecdhbzmL1ENnQITerArYmLtrAKKQjgEJXAcL1dJbYugVg=="", // ""serverSigned1"":""ME6AEG2bL55FsdH9oxd0MlYBduOBEHgDGG0YRv5ecipINikZsNODFlJTUC5CSUxMSU9OQ09OTkVDVC5DT02EEHpr0hKLQ2fhmdmtraQzUx4="", // ""transactionId"":""6d9b2f9e45b1d1fda3177432560176e3"" //}"; var model = JsonConvert.DeserializeObject<InitiateAuthenticationOK>(jsonStr); byte[] apduData = BuildAuthentication(model, activationCode); Logger.Info("es10b_authenticate_server"); // APDU分片发送服务器信息(每片 120 字节) var content = SendFragmentedData(apduData);// 分包接收 if (null != content) { Logger.Info("es9p_authenticate_client"); var requestBody = new { model.transactionId, authenticateServerResponse = Convert.ToBase64String(content) }; var resHttp = PushToSmdpPlus($"https://{smdpAddress}/gsma/rsp2/es9plus/authenticateClient", requestBody); // if (!resHttp.Item1) { // {"header":{"functionExecutionStatus":{"status":"Failed","statusCodeData":{"message":"RSP did not receive a delete notification,profile does not allow repeated downloads,PRP=2/4.","reasonCode":"1.2","subjectCode":"8.2"}}}} CancelSession(smdpAddress, model.transactionId); } else { // {"header":{"functionExecutionStatus":{"status":"Executed-Success"} },"profileMetadata":"vyWBxFoKmBgCMBkZEkM4lpEOQmlsbGlvbkNvbm5lY3SSDkJpbGxpb25Db25uZWN0lQECtngwHIACB4CBFnJzcC5iaWxsaW9uY29ubmVjdC5jb20wHIACBkCBFnJzcC5iaWxsaW9uY29ubmVjdC5jb20wHIACBSCBFnJzcC5iaWxsaW9uY29ubmVjdC5jb20wHIACBBCBFnJzcC5iaWxsaW9uY29ubmVjdC5jb223GYADMvIBgQj//////////4II//////////8=","smdpCertificate":"MIICuTCCAmCgAwIBAgIQTS7AdqI+JE2wgIwfACVtEDAKBggqhkjOPQQDAjBEMRgwFgYDVQQKEw9HU00gQXNzb2NpYXRpb24xKDAmBgNVBAMTH0dTTSBBc3NvY2lhdGlvbiAtIFJTUDIgUm9vdCBDSTEwHhcNMjMwMjI4MDAwMDAwWhcNMjYwMjI3MjM1OTU5WjCBpTELMAkGA1UEBhMCQ04xEjAQBgNVBAgMCUdVQU5HRE9ORzEPMA0GA1UEBwwGWkhVSEFJMSowKAYDVQQLDCFFYXN0Y29tcGVhY2UgVGVjaG5vbG9neSBDby4sIEx0ZC4xKjAoBgNVBAoMIUVhc3Rjb21wZWFjZSBUZWNobm9sb2d5IENvLiwgTHRkLjEZMBcGA1UEAwwQRWFzdGNvbXBlYWNlIFJTUDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGyju1iO716t/jRSn08x4V1fCDTf1F+Ofg1UM1Xtmk5ZG1sYMKHrGTxHzRFFIu0l8fhK/siO3h+525pBc/nALIejgdEwgc4wTQYDVR0fBEYwRDBCoECgPoY8aHR0cDovL2dzbWEtY3JsLnN5bWF1dGguY29tL29mZmxpbmVjYS9nc21hLXJzcDItcm9vdC1jaTEuY3JsMA4GA1UdDwEB/wQEAwIHgDAUBgNVHREEDTALiAkrBgEEAYOKHQEwFwYDVR0gAQH/BA0wCzAJBgdngRIBAgEFMB0GA1UdDgQWBBTQW1MBXeXvZ1vnIrRKOgtW6uPXfzAfBgNVHSMEGDAWgBSBNw9RJdCx1AjUw7Iy5tJeeVvr+zAKBggqhkjOPQQDAgNHADBEAiBW/sZJp4fZdD0S3NFFPwlsYrqTRfvd4VmgvnvDHqadygIgU2JUai17PpJUsSNeDWaO+0ANbZ4SfaRAdKv1yhZsiGU=","smdpSignature2":"XzdAh5c6FDv+O3r9UAUl9dOV0qBoQlwhKW/F3TlyPtBm+82j4hJy1WGcPSUeDufeVy99wpQvhSLzulmR+N8TK3hvDQ==","smdpSigned2":"MBWAEJ31u9+n2TGtCoRyhOdHBlcBAQA=","transactionId":"9df5bbdfa7d931ad0a847284e7470657"} GetBoundProfilePackage(smdpAddress, resHttp.Item2); } //GetBoundProfilePackage(smdpAddress, resHttp.Item2); } } static void GetBoundProfilePackage(string smdpAddress, string jsonStr) { //[DEBUG][HTTP][TX] url: https://RSP.BILLIONCONNECT.COM/gsma/rsp2/es9plus/authenticateClient, data: {"transactionId":"6d9b2f9e45b1d1fda3177432560176e3","authenticateServerResponse":"vziCBgOgggX/MIHkgBBtmy+eRbHR/aMXdDJWAXbjgxZSU1AuQklMTElPTkNPTk5FQ1QuQ09NhBB6a9ISi0Nn4ZnZra2kM1MevyJ3gQMCAwGCAwIDAIMDJBEEhA2BAQuCBAAXT0CDAn/jhQUGfzb3wIYDDwEAhwMCAwCIAgOYqRYEFIE3D1El0LHUCNTDsjLm0l55W+v7qhYEFIE3D1El0LHUCNTDsjLm0l55W+v7BAMBAAAMDUtOLUROLVVQLTA5MjSgLIAgOTY4NDVCMUQ3QzBENDc4NkJDODU3MDFEOTYwMzdGNDOhCIAENSkGEaEAXzdAen6kn5QNKE+rJw0Lim5Ot01fbJdqb4EmU/vD3tcYmzt0vGacJKTcofGpP1g8wAGyEkqmBnFshQOTOO38IRqopjCCAgcwggGsoAMCAQICDgRj5NPd16wGH8wb5VU4MAoGCCqGSM49BAMCMGIxCzAJBgNVBAYTAlVLMRIwEAYDVQQHDAlDYW1icmlkZ2UxDjAMBgNVBAoMBUtpZ2VuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEZMBcGA1UEAwwQRVVNQ29uc3VtZXJER0R1Y{"type":"progress","payload":{"code":0,"message":"es8p_meatadata_parse","data":{"iccid":"89812003919119346074","serviceProviderName":"BillionConnect","profileName":"BillionConnect","iconType":null,"icon":null,"profileClass":"operational"}}} //[DEBUG] [HTTP] [RX] rcode: 200, data: //{ // "header": { // "functionExecutionStatus": { // "status": "Executed-Success" // } // }, // "profileMetadata": "vyWBxFoKmBgCMBkZkUMGR5EOQmlsbGlvbkNvbm5lY3SSDkJpbGxpb25Db25uZWN0lQECtngwHIACB4CBFnJzcC5iaWxsaW9uY29ubmVjdC5jb20wHIACBkCBFnJzcC5iaWxsaW9uY29ubmVjdC5jb20wHIACBSCBFnJzcC5iaWxsaW9uY29ubmVjdC5jb20wHIACBBCBFnJzcC5iaWxsaW9uY29ubmVjdC5jb223GYADMvIBgQj//////////4II//////////8=", // "smdpCertificate": "MIICuTCCAmCgAwIBAgIQTS7AdqI+JE2wgIwfACVtEDAKBggqhkjOPQQDAjBEMRgwFgYDVQQKEw9HU00gQXNzb2NpYXRpb24xKDAmBgNVBAMTH0dTTSBBc3NvY2lhdGlvbiAtIFJTUDIgUm9vdCBDSTEwHhcNMjMwMjI4MDAwMDAwWhcNMjYwMjI3MjM1OTU5WjCBpTELMAkGA1UEBhMCQ04xEjAQBgNVBAgMCUdVQU5HRE9ORzEPMA0GA1UEBwwGWkhVSEFJMSowKAYDVQQLDCFFYXN0Y29tcGVhY2UgVGVjaG5vbG9neSBDby4sIEx0ZC4xKjAoBgNVBAoMIUVhc3Rjb21wZWFjZSBUZWNobm9sb2d5IENvLiwgTHRkLjEZMBcGA1UEAwwQRWFzdGNvbXBlYWNlIFJTUDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGyju1iO716t/jRSn08x4V1fCDTf1F+Ofg1UM1Xtmk5ZG1sYMKHrGTxHzRFFIu0l8fhK/siO3h+525pBc/nALIejgdEwgc4wTQYDVR0fBEYwRDBCoECgPoY8aHR0cDovL2dzbWEtY3JsLnN5bWF1dGguY29tL29mZmxpbmVjYS9nc21hLXJzcDItcm9vdC1jaTEuY3JsMA4GA1UdDwEB/wQEAwIHgDAUBgNVHREEDTALiAkrBgEEAYOKHQEwFwYDVR0gAQH/BA0wCzAJBgdngRIBAgEFMB0GA1UdDgQWBBTQW1MBXeXvZ1vnIrRKOgtW6uPXfzAfBgNVHSMEGDAWgBSBNw9RJdCx1AjUw7Iy5tJeeVvr+zAKBggqhkjOPQQDAgNHADBEAiBW/sZJp4fZdD0S3NFFPwlsYrqTRfvd4VmgvnvDHqadygIgU2JUai17PpJUsSNeDWaO+0ANbZ4SfaRAdKv1yhZsiGU=", // "smdpSignature2": "XzdA/xIhruhUTugpH0bbBsQTm/s8fCDDV++Vdco1dG20hUCS7soJlaH2sK9Z4r4gNqvWf+HoO4l0fJrJNoVqCO1qbA==", // "smdpSigned2": "MBWAEG2bL55FsdH9oxd0MlYBduMBAQA=", // "transactionId": "6d9b2f9e45b1d1fda3177432560176e3" //} //[DEBUG] [APDU] [TX] CLA: 81, INS: E2, P1: 11, P2: 00, Lc: 78, Data: BF 21 82 03 17 //# smdpSigned2 //30 15 80 10 6D 9B 2F 9E 45 B1 D1 FD A3 17 74 32 56 01 76 E3 01 01 00 //# smdpSignature2 //5F 37 40 FF 12 21 AE E8 54 4E E8 29 1F 46 DB 06 C4 13 9B FB 3C 7C 20 C3 57 EF 95 75 CA 35 74 6D B4 85 40 92 EE CA 09 95 A1 F6 B0 AF 59 E2 BE 20 36 AB D6 7F E1 E8 3B 89 74 7C 9A C9 36 85 6A 08 ED 6A 6C //# smdpCertificate //30 82 02 B9 30 82 02 60 A0 03 02 01 02 02 10 4D 2E C0 76 A2 3E 24 4D B0 80 //[DEBUG] [APDU] [RX] SW1: 90, SW2: 00, Data: //[DEBUG] [APDU] [TX] CLA: 81, INS: E2, P1: 11, P2: 01, Lc: 78, Data: 8C 1F 00 25 6D 10 30 0A 06 08 2A 86 48 CE 3D 04 03 02 30 44 31 18 30 16 06 03 55 04 0A 13 0F 47 53 4D 20 41 73 73 6F 63 69 61 74 69 6F 6E 31 28 30 26 06 03 55 04 03 13 1F 47 53 4D 20 41 73 73 6F 63 69 61 74 69 6F 6E 20 2D 20 52 53 50 32 20 52 6F 6F 74 20 43 49 31 30 1E 17 0D 32 33 30 32 32 38 30 30 30 30 30 30 5A 17 0D 32 36 30 32 32 37 32 33 35 39 35 39 5A //[DEBUG] [APDU] [RX] SW1: 90, SW2: 00, Data: //[DEBUG] [APDU] [TX] CLA: 81, INS: E2, P1: 11, P2: 02, Lc: 78, Data: 30 81 A5 31 0B 30 09 06 03 55 04 06 13 02 43 4E 3{"type":"progress","payload":{"code":0,"message":"es9p_get_bound_profile_package","data":"RSP.BILLIONCONNECT.COM"}} //1 12 30 10 06 03 55 04 08 0C 09 47 55 41 4E 47 44 4F 4E 47 31 0F 30 0D 06 03 55 04 07 0C 06 5A 48 55 48 41 49 31 2A 30 28 06 03 55 04 0B 0C 21 45 61 73 74 63 6F 6D 70 65 61 63 65 20 54 65 63 68 6E 6F 6C 6F 67 79 20 43 6F 2E 2C 20 4C 74 64 2E 31 2A 30 28 06 03 55 04 0A 0C 21 45 61 73 74 63 6F 6D 70 65 61 63 65 //[DEBUG] [APDU] [RX] SW1: 90, SW2: 00, Data: //[DEBUG] [APDU] [TX] CLA: 81, INS: E2, P1: 11, P2: 03, Lc: 78, Data: 20 54 65 63 68 6E 6F 6C 6F 67 79 20 43 6F 2E 2C 20 4C 74 64 2E 31 19 30 17 06 03 55 04 03 0C 10 45 61 73 74 63 6F 6D 70 65 61 63 65 20 52 53 50 30 59 30 13 06 07 2A 86 48 CE 3D 02 01 06 08 2A 86 48 CE 3D 03 01 07 03 42 00 04 6C A3 BB 58 8E EF 5E AD FE 34 52 9F 4F 31 E1 5D 5F 08 34 DF D4 5F 8E 7E 0D 54 33 55 ED 9A 4E 59 1B 5B 18 30 A1 EB 19 3C 47 CD 11 45 22 //[DEBUG] [APDU] [RX] SW1: 90, SW2: 00, Data: //[DEBUG] [APDU] [TX] CLA: 81, INS: E2, P1: 11, P2: 04, Lc: 78, Data: ED 25 F1 F8 4A FE C8 8E DE 1F B9 DB 9A 41 73 F9 C0 2C 87 A3 81 D1 30 81 CE 30 4D 06 03 55 1D 1F 04 46 30 44 30 42 A0 40 A0 3E 86 3C 68 74 74 70 3A 2F 2F 67 73 6D 61 2D 63 72 6C 2E 73 79 6D 61 75 74 68 2E 63 6F 6D 2F 6F 66 66 6C 69 6E 65 63 61 2F 67 73 6D 61 2D 72 73 70 32 2D 72 6F 6F 74 2D 63 69 31 2E 63 72 6C 30 0E 06 03 55 1D 0F 01 01 FF 04 04 03 02 07 80 //[DEBUG] [APDU] [RX] SW1: 90, SW2: 00, Data: //[DEBUG] [APDU] [TX] CLA: 81, INS: E2, P1: 11, P2: 05, Lc: 78, Data: 30 14 06 03 55 1D 11 04 0D 30 0B 88 09 2B 06 01 04 01 83 8A 1D 01 30 17 06 03 55 1D 20 01 01 FF 04 0D 30 0B 30 09 06 07 67 81 12 01 02 01 05 30 1D 06 03 55 1D 0E 04 16 04 14 D0 5B 53 01 5D E5 EF 67 5B E7 22 B4 4A 3A 0B 56 EA E3 D7 7F 30 1F 06 03 55 1D 23 04 18 30 16 80 14 81 37 0F 51 25 D0 B1 D4 08 D4 C3 B2 32 E6 D2 5E 79 5B EB FB 30 0A 06 08 2A 86 48 CE 3D //[DEBUG] [APDU] [RX] SW1: 90, SW2: 00, Data: //[DEBUG] [APDU] [TX] CLA: 81, INS: E2, P1: 91, P2: 06, Lc: 4C, Data: 04 03 02 03 47 00 30 44 02 20 56 FE C6 49 A7 87 D9 74 3D 12 DC D1 45 3F 09 6C 62 BA 93 45 FB DD E1 59 A0 BE 7B C3 1E A6 9D CA 02 20 53 62 54 6A 2D 7B 3E 92 54 B1 23 5E 0D 66 8E FB 40 0D 6D 9E 12 7D A4 40 74 AB F5 CA 16 6C 88 65 //[DEBUG] [APDU] [RX] SW1: 61, SW2: A2, Data: //[DEBUG] [APDU] [TX] CLA: 81, INS: C0, P1: 00, P2: 00, Lc: A2, Data: //[DEBUG] [APDU] [RX] SW1: 90, SW2: 00, Data: BF 21 81 9E A0 81 9B 30 56 80 10 6D 9B 2F 9E 45 B1 D1 FD A3 17 74 32 56 01 76 E3 5F 49 41 04 B3 00 1B E3 C7 05 FD CF 9D 81 01 94 76 20 D1 01 7C 27 7F 62 F8 A5 EF 84 47 6F B8 7D 38 AA 77 3E A8 F6 26 34 81 9D 32 F7 64 CD E1 CA AB 2B 52 16 11 2F 0D 92 8A 04 2C 29 7D EE 89 41 33 8C 79 E9 5F 37 40 02 5A 70 A1 B3 68 10 DE 04 4C C4 76 EF C6 1D C3 C0 C9 D5 96 26 04 7D 8A 65 22 15 43 C0 74 F4 75 7B 77 07 66 B3 CF 84 B5 69 C9 AB 06 28 96 7B 4A CB DC 86 B5 D6 49 33 FA A1 88 43 7D 63 77 11 5B //[DEBUG] [HTTP] [TX] url: https://RSP.BILLIONCONNECT.COM/gsma/rsp2/es9plus/getBoundProfilePackage, data: {"transactionId":"6d9b2f9e45b1d1fda3177432560176e3","prepareDownloadResponse":"vyGBnqCBmzBWgBBtmy+eRbHR/aMXdDJWAXbjX0lBBLMAG+PHBf3PnYEBlHYg0QF8J39i+KXvhEdvuH04qnc+qPYmNIGdMvdkzeHKqytSFhEvDZKKBCwpfe6JQTOMeelfN0ACWnChs2gQ3gRMxHbvxh3DwMnVliYEfYplIhVDwHT0dXt3B2azz4S1acmrBiiWe0rL3Ia11kkz+qGIQ31jdxFb"} // test //jsonStr = @" //{ // ""header"":{ // ""functionExecutionStatus"":{ // ""status"":""Executed-Success"" // } // }, // ""profileMetadata"":""vyWBxFoKmBgCMBkZEkM4lpEOQmlsbGlvbkNvbm5lY3SSDkJpbGxpb25Db25uZWN0lQECtngwHIACB4CBFnJzcC5iaWxsaW9uY29ubmVjdC5jb20wHIACBkCBFnJzcC5iaWxsaW9uY29ubmVjdC5jb20wHIACBSCBFnJzcC5iaWxsaW9uY29ubmVjdC5jb20wHIACBBCBFnJzcC5iaWxsaW9uY29ubmVjdC5jb223GYADMvIBgQj//////////4II//////////8="", // ""smdpCertificate"":""MIICuTCCAmCgAwIBAgIQTS7AdqI+JE2wgIwfACVtEDAKBggqhkjOPQQDAjBEMRgwFgYDVQQKEw9HU00gQXNzb2NpYXRpb24xKDAmBgNVBAMTH0dTTSBBc3NvY2lhdGlvbiAtIFJTUDIgUm9vdCBDSTEwHhcNMjMwMjI4MDAwMDAwWhcNMjYwMjI3MjM1OTU5WjCBpTELMAkGA1UEBhMCQ04xEjAQBgNVBAgMCUdVQU5HRE9ORzEPMA0GA1UEBwwGWkhVSEFJMSowKAYDVQQLDCFFYXN0Y29tcGVhY2UgVGVjaG5vbG9neSBDby4sIEx0ZC4xKjAoBgNVBAoMIUVhc3Rjb21wZWFjZSBUZWNobm9sb2d5IENvLiwgTHRkLjEZMBcGA1UEAwwQRWFzdGNvbXBlYWNlIFJTUDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGyju1iO716t/jRSn08x4V1fCDTf1F+Ofg1UM1Xtmk5ZG1sYMKHrGTxHzRFFIu0l8fhK/siO3h+525pBc/nALIejgdEwgc4wTQYDVR0fBEYwRDBCoECgPoY8aHR0cDovL2dzbWEtY3JsLnN5bWF1dGguY29tL29mZmxpbmVjYS9nc21hLXJzcDItcm9vdC1jaTEuY3JsMA4GA1UdDwEB/wQEAwIHgDAUBgNVHREEDTALiAkrBgEEAYOKHQEwFwYDVR0gAQH/BA0wCzAJBgdngRIBAgEFMB0GA1UdDgQWBBTQW1MBXeXvZ1vnIrRKOgtW6uPXfzAfBgNVHSMEGDAWgBSBNw9RJdCx1AjUw7Iy5tJeeVvr+zAKBggqhkjOPQQDAgNHADBEAiBW/sZJp4fZdD0S3NFFPwlsYrqTRfvd4VmgvnvDHqadygIgU2JUai17PpJUsSNeDWaO+0ANbZ4SfaRAdKv1yhZsiGU="", // ""smdpSignature2"":""XzdAh5c6FDv+O3r9UAUl9dOV0qBoQlwhKW/F3TlyPtBm+82j4hJy1WGcPSUeDufeVy99wpQvhSLzulmR+N8TK3hvDQ=="", // ""smdpSigned2"":""MBWAEJ31u9+n2TGtCoRyhOdHBlcBAQA="", // ""transactionId"":""9df5bbdfa7d931ad0a847284e7470657"" //}"; Logger.Info("es10b_prepare_download"); var model = JsonConvert.DeserializeObject<AuthenticateClientOK>(jsonStr); byte[] apduData = BuildGetBoundProfilePackage(model); // APDU分片发送服务器信息(每片 120 字节) var content = SendFragmentedData(apduData);// 分包接收 if (null != content) { Logger.Info("es9p_get_bound_profile_package"); var requestBody = new { model.transactionId, prepareDownloadResponse = Convert.ToBase64String(content) }; var resHttp = PushToSmdpPlus($"https://{smdpAddress}/gsma/rsp2/es9plus/getBoundProfilePackage", requestBody); // if (!resHttp.Item1) { // {"header":{"functionExecutionStatus":{"status":"Failed","statusCodeData":{"message":"RSP did not receive a delete notification,profile does not allow repeated downloads,PRP=2/4.","reasonCode":"1.2","subjectCode":"8.2"}}}} CancelSession(smdpAddress, model.transactionId); } else { WriteProfile(resHttp.Item2); } } } public static void WriteProfile(string jsonStr) { // test //jsonStr = @" //{ // ""header"":{ // ""functionExecutionStatus"":{ // ""status"":""Executed-Success"" // } // }, // ""boundProfilePackage"":""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"", // ""transactionId"":""6bf6082392364a04c76df1dcd6cc7565"" //}"; //jsonStr = @" //{ // ""header"":{ // ""functionExecutionStatus"":{ // ""status"":""Executed-Success"" // } // }, // ""boundProfilePackage"":""vzaCjBC/I4G2ggEBgBBtmy+eRbHR/aMXdDJWAXbjphiAAYiBARCEEFVVVVVVVVVVVVVVVVVVVVVfSUEEyVm4wzS495cbtAkyvpF/KvUhN14XvhxRPTufw+SSf4Vdqd4gCANuaEeTNOWEp5iw+6dftYSJaQOKpPi1tBpqYF83QP6T+oM1yHgHtLXYVJjvcY/KzrL0jRlVO5Ic33KBgAz8e7N/4UXc+WkTkU6TqDfQ1Wew5Yp9vaHRnLXKXYp8S7SgKocoHXRDmvet/nsyBpRlz2hxtrSbiuIUmynKdFbgQfNLRfzhv6qkNVxGf6GB04iB0L8lgcRaCpgYAjAZGZFDBkeRDkJpbGxpb25Db25uZWN0kg5CaWxsaW9uQ29ubmVjdJUBArZ4MByAAgeAgRZyc3AuYmlsbGlvbmNvbm5lY3QuY29tMByAAgZAgRZyc3AuYmlsbGlvbmNvbm5lY3QuY29tMByAAgUggRZyc3AuYmlsbGlvbmNvbm5lY3QuY29tMByAAgQQgRZyc3AuYmlsbGlvbmNvbm5lY3QuY29ttxmAAzLyAYEI//////////+CCP//////////lb2HfOi2xcaiSodI4o9Jnvapf6VmKhe6C5026GZkuo7vvpqgGWswQu32MavtAR/5yj/RrALAB8rcKAgcqynRWyri7EMzKZxnojQaiv8KADetTt9Vo4KKBIaCA/gViLsb/nAn2TFZnonyRNdUBeXAQzI6qMnZE6eVLNU/WHuNpetwpyKAwQyJ7rKIwehpP+fBm7BH7Y5RVpIPO/dN9jLoS4WixwPrgNa2HS7M0D5HDAOrT6mck3WO3AOyFcKm6VGnuKOmpiA11vH71fKcVb1cPkAhc5HBz+2J1geluQ9u7j9EbP17TIi+3QM8b1yg1g6OwPWK++AGZCctrW6lNSzJRas7HyRKdahng4RznCQLtupCBdqRKd1RK1kWFO3OyDRIXDAfWQDzhfOn/a0n5FajrVl3YeIvdGByTD7BZzjMitrMTJvvg2PyMe+VxU5JlWNHys3a9Hen4ozZ+DV920wwMCoCd9gaJl6xRhYmyHjj+0hzzOqGJM1ljEAnmmhpv2krFBgC28cU4b2fSFQWXvyjS+PgRxxDSlekdQLW0G0qQSZDBtebmTKyZHxYD39rVq5wFujvnnbMeUSM6A5OnmeiN2OAzuCfRSbmNZdL6d7ZS9NirxfTS107TQw7vUBOXoyHE+75oU/a7JB1wHxwcitNr3SqT7PWOTdZNSZr/Ynnyl1ewAnHkE1aJw6yaqNM0b1oWkAzid+yzsYhvUP6g2reyXjLQ0KFFxR2wI9NMk0H5CqtbFqjGWUwOeNXPmZsj1hPOXJYQ70vDIxrNcz2G3NZRcRUekQuF0azopO4drqwEgr6bB0gwKC+msMVWu/phxtDMtUYAGj2lv8ARmoaEakAnkSvK0oMwRd1waPCVj+tQCmPmtw7xtVArYGXOdLE1P4Tz2YH4vmoIuSTX8FKjbEVgTG8/+5HYBM9YQVxU1FMzdPN7zSuLR1Vhn/whHpc8bIa9dysks4M6DhleKF0GoVkBIRgU/uEDubOeVQsDiVYSePbIBmiAFM6eNBoR6FdWj4f6jvi1bnGEbycKp9ZOvQcwYpVQrvmIR5NXFRje/YX8sYUqXs0QmQXvhT+xbipBA=="", // ""transactionId"":""9df5bbdfa7d931ad0a847284e7470657"" //}"; //Bound Profile Package(BPP) 是一个ASN.1 DER编码的结构,包含配置文件的完整信息: //标签(Tag) 节点名称 功能 //0xBF36 BoundProfilePackage BPP顶层结构 //0xBF23 InitialiseSecureChannel 初始化安全通道 //0xA0 ConfigureISDP 配置ISDP(Integrated Service Data Provider) //0xA1 StoreMetadata 存储配置文件元数据 //0xA2 StoreMetadata2 存储额外元数据(可选) //0xA3 LoadProfileElements 加载配置文件元素 //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 00, Lc: 78, Data: BF 36 82 8C E0 BF 23 81 B6 82 01 01 80 10 9D F5 BB DF A7 D9 31 AD 0A 84 72 84 E7 47 06 57 A6 18 80 01 88 81 01 10 84 10 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 5F 49 41 04 5D C1 64 4B 58 BD 33 65 C3 D4 77 04 A4 C2 DD B1 02 C6 29 24 A7 A9 3B 8F BC 91 E5 45 B8 8C 7C 6B 7F 67 F6 19 31 C4 DC AD 0F CE A7 5E EF FC EB 9F 39 AE D6 A1 28 C9 2C 7A D7 18 0C 97 //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 01, Lc: 47, Data: 01 74 EC C2 5F 37 40 62 24 AD 60 6D 1A 17 2C 3D 47 3E 8C A6 7D EC C6 2C FD 8C 53 B6 6D 4F F5 18 61 3E 89 25 E7 9A 77 35 8E 2E 43 40 5D E6 49 6C 79 DD A1 2D 9B 13 EE 7B 7B F7 8D 65 DD F3 72 1D 73 54 60 68 87 72 ED //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 00, Lc: 2C, Data: A0 2A 87 28 9E 9F A1 86 F1 AE A4 85 27 C7 E3 66 21 FD E6 1D 79 C7 92 15 5C 23 28 2A C1 F0 55 E7 16 45 86 E0 A6 77 CE BD 9D DA 33 BC //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 00, Lc: 03, Data: A1 81 D3 //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 00, Lc: 78, Data: 88 81 D0 BF 25 81 C4 5A 0A 98 18 02 30 19 19 12 43 38 96 91 0E 42 69 6C 6C 69 6F 6E 43 6F 6E 6E 65 63 74 92 0E 42 69 6C 6C 69 6F 6E 43 6F 6E 6E 65 63 74 95 01 02 B6 78 30 1C 80 02 07 80 81 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 30 1C 80 02 06 40 81 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 30 1C 80 02 //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 01, Lc: 5B, Data: 05 20 81 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D 30 1C 80 02 04 10 81 16 72 73 70 2E 62 69 6C 6C 69 6F 6E 63 6F 6E 6E 65 63 74 2E 63 6F 6D B7 19 80 03 32 F2 01 81 08 FF FF FF FF FF FF FF FF 82 08 FF FF FF FF FF FF FF FF B0 D9 C3 E3 9F EB 3B 55 //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 00, Lc: 4C, Data: A2 4A 87 48 49 69 4B 24 D9 FE 09 5A 9D AD 1D FB 37 39 84 27 F7 BD E8 DD D4 A9 EB 22 9F 64 BB 8C 30 DE 6C 0F 18 59 9D 4C 0B 22 DD F6 6A 79 85 26 4B 2E 04 37 A5 94 76 B8 6B 87 A6 16 F0 FA 35 84 4F 10 AB DD 56 76 96 66 38 B5 B9 F2 //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 00, Lc: 04, Data: A3 82 8A D4 //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 00, Lc: 78, Data: 86 82 03 F8 B7 33 B0 FF 30 CC B1 92 92 37 FE 66 C7 AB DB 76 CA 05 6B 5A FB 25 F1 BC 1D 7A 33 F6 BB CA A3 57 63 CD 08 7D 11 46 44 3D A3 F3 BF 44 35 99 72 5D 37 34 3E 32 B4 9D DC 48 35 39 64 95 51 E2 A5 72 67 24 FC 7B 5E B6 5B 1E 61 BD E3 C3 C5 03 05 52 DA 9D 6E D2 58 C8 AE 4F 30 DB A8 EA 13 F6 BE 9A BD 37 40 7B 21 E8 46 9C B9 3B 0A 24 1D 85 75 70 F7 46 C7 C5 //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 01, Lc: 78, Data: B5 A2 7C DD 5C F7 C2 15 80 8C 79 30 60 86 0A 6D 51 B5 A6 EE E7 5C 42 B8 26 31 BA B3 B0 2D 3E 91 1A 96 DB EA 45 50 2E D8 91 2A B5 05 1C 23 1F D6 E0 62 3B 42 1D 22 8C 99 8F CF FC B6 76 22 CD 2F CB 38 7B F2 A6 72 FD D1 D3 E5 15 8E 25 EF F0 93 2A 98 5D CD DD D4 D1 C5 E1 12 F7 65 B9 1E 88 77 9E E3 41 91 86 EA F3 B4 02 FA 90 41 78 A0 5A 95 60 B2 BA 8E 1D 89 5D 8A //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 02, Lc: 78, Data: DF 38 F3 1F FC 67 6C DD CD 81 4E F1 E6 51 36 C1 96 A3 5C C7 FA 0A 1C 0A BF 3B 47 9E BE F8 34 B9 D2 7D E1 EB 1C 52 3A E0 3A FB 62 F7 66 8C DC 39 B2 C9 1A BD 10 39 DE A6 B3 82 62 F1 49 B8 48 75 F8 85 7F 7B 79 1C 95 CC 25 6B 3B 91 1D 54 AB 56 5E F8 48 4D D7 B0 9A 71 38 45 EC 58 F9 5B 9B 88 3D 7C 1B FF 18 75 83 9C EC 15 E2 14 37 A6 D5 E2 C4 A9 6F EA 57 73 D6 2D //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 03, Lc: 78, Data: EF CF C8 D2 70 23 3A 4A FC 8F FC 5E 26 A8 18 12 B8 DE A4 60 97 5D 51 50 F1 96 26 22 BF 48 27 DF A1 FE 34 4A E1 48 85 2D F9 1B 26 98 C8 11 5C 41 43 6F 8A 99 17 6D AE 9D 90 1F 9B 1A 63 B7 43 D2 5F 86 5B 13 75 13 E1 68 9C 81 1C 5D E2 CA 17 0B 2E 3D D4 75 BE 6A 41 47 94 DD FF 0D B8 A5 F6 0F CB 0B 1A 7A E2 CA 90 EE 26 A0 BA 75 E1 B5 E5 C5 42 6F 64 66 2D CD CD 1D //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 04, Lc: 78, Data: 65 1A FA 3C A4 D3 7A 83 89 B4 64 DC F3 CB B6 0B 0A B8 5E FD 1F E0 68 ED BC 69 5E 10 80 42 B5 91 21 C9 F3 8A 28 BC B4 1D 24 DD F0 4F FD B2 67 B6 55 FD 4C 15 DB B5 C4 CF 75 32 4B 75 42 3E 16 95 CA 35 60 8D 3D 86 9E 26 6C 45 31 4B 38 25 3F E0 0D DC 79 7B C1 BD 8C 57 4F B3 1B 87 FE 0E 41 14 6F 72 1F 89 6B CC 11 56 5B 64 59 85 9B 51 36 71 CC 1F 45 72 3A BF C1 81 //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 05, Lc: 78, Data: 6D 52 49 11 BB 20 1D F3 06 40 14 D5 41 76 E3 6C BE 4D 77 1E 17 17 B3 04 C6 E5 45 3E B0 28 9B 1C 0B 98 F2 E7 1E 0A 82 CB 09 9F 99 FE 54 B3 41 B3 C9 8C 52 B3 FE 97 D8 07 3F 97 7D 70 7C C1 62 07 B0 2E 3E FD FA 68 33 B9 63 1A A9 5F 5A 90 90 D4 97 D6 26 E2 EE F2 D8 07 51 CD F7 3F 82 7F D2 3A C7 16 01 C8 1B 26 49 B0 F6 05 00 64 A5 2E 0C DD 0B 78 B2 B5 48 CD B7 4E //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 06, Lc: 78, Data: 14 41 68 E8 0C 6C 6F 78 1F 34 19 21 1A 89 74 4C 3C 3D 5B 63 D1 6A A5 55 7E 11 67 63 BB 5A F3 BB 8F 08 F4 B2 8B 5C 7C 67 4F 93 9C 36 DF 7B C2 CF 1E A3 0F 76 00 8A 6A 2A 14 BC 09 E7 03 31 59 B5 38 9C 85 69 E5 13 3E 41 88 47 B0 07 D3 77 29 3F 46 A3 17 E4 B7 93 33 87 E6 DF DA 5E 93 9E EA 1B BE 98 E2 41 B7 E0 52 BF A5 14 AF 24 12 E9 DA F0 80 64 16 B8 B3 21 F8 1E //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 07, Lc: 78, Data: FA E7 5F EC 3A AF B0 D4 32 FB DA C5 F9 64 A5 5C 56 BC 8C F0 A2 B5 38 0F 5C 60 BF 2C 88 F5 57 48 32 6B AA C3 38 1A 81 16 87 82 A4 8B D1 EC 48 45 D9 0B 53 4B 31 22 B5 BF 12 F3 BF E5 90 1D BB 3D E4 48 55 9D 4A 65 61 7B 3C 61 F5 40 EF 61 52 D0 0E B4 1B AB 13 3F CD 07 48 A5 35 76 46 9F FE 7C CE D2 08 1C C7 20 45 B0 FD 87 EB 17 B0 9B 37 5D 3C C0 E3 11 B6 D8 DC 95 //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 91, P2: 08, Lc: 3C, Data: 37 80 D3 32 C3 A3 33 31 72 3B 09 38 95 6E 8C 41 0B E4 1C FC CB 96 30 43 80 34 1D 2F 45 00 1A 46 71 35 76 6C A5 AB 04 EB 30 76 44 8A BB C8 D4 FC 4C 09 27 9B DB 46 FC B1 24 DD 91 21 //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 00, Lc: 78, Data: 86 82 03 F8 DB 0A B6 72 B1 5D 3E C4 82 20 4B 31 B1 EF BA 39 BB E2 B2 22 32 50 3F FD 30 25 1E 31 6C FB 8C C8 4F B0 5B 03 4F 0C FA 98 87 77 B0 F1 27 A2 5F 8E E7 60 FA 1A 5D 66 0E 83 C7 6D 91 89 78 29 FF 1F 88 AF B8 4B 64 AD 6D F8 8D 7C 1C 56 08 09 62 1B 29 C1 7B 2F F9 75 76 B3 C1 DB 09 0E 33 90 B9 79 10 8F EC A8 06 6F 8D 1E 0C 0A 5F 49 32 77 24 61 10 11 2F 0B //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: //[DEBUG][APDU][TX] CLA: 81, INS: E2, P1: 11, P2: 01, Lc: 78, Data: 2E 8A 79 7C 50 BA 7C F5 57 5F 47 A8 8A 93 69 B0 E1 58 85 A7 A3 CD 28 30 09 8A 59 21 26 10 B8 96 26 E8 24 B7 6F CE 04 D4 F0 AE F4 F0 21 FB 89 42 76 58 18 82 73 17 03 45 7B 51 42 49 CE 79 B1 71 D9 7A 41 10 B5 32 AF 58 AA CE 36 FA 90 16 AE 02 D2 F1 41 FB 5D AA C6 DC D8 9D 3F 9D 1C 40 05 38 FA CF 46 EA B1 C9 EA 58 A4 1C 00 A2 3E F7 A1 53 4F BC 0A 1F 23 6C E5 3C //[DEBUG][APDU][RX] SW1: 90, SW2: 00, Data: Logger.Info("es10b_load_bound_profile_package"); // 按标签解析boundProfilePackage,并分包 var model = JsonConvert.DeserializeObject<GetBoundProfilePackageOk>(jsonStr); byte[] boundProfilePackageBytes = Convert.FromBase64String(model.boundProfilePackage); // 分包发送 var lstTag = new List<byte[]>(); int start = 0;int len = 0; int index = 0; int end = 0; var tmpBuffer = new ByteBuffer(boundProfilePackageBytes.Length); tmpBuffer.Put(boundProfilePackageBytes); len = 0x78 + 0x47; lstTag.Add(tmpBuffer.SubBytes(start, len)); start = start + len;// BF 36 82 8C E0 BF 23 len = 0x2C; lstTag.Add(tmpBuffer.SubBytes(start, len)); start = start + len;// A0 2A 87 28 len = 0x03; lstTag.Add(tmpBuffer.SubBytes(start, len)); start = start + len;// A1 81 D3 len = 0x78 + 0x5B; lstTag.Add(tmpBuffer.SubBytes(start, len)); start = start + len; len = 0x4C; lstTag.Add(tmpBuffer.SubBytes(start, len)); start = start + len;// A2 4A 87 len = 0x04; lstTag.Add(tmpBuffer.SubBytes(start, len)); start = start + len;// A3 82 8A D4 lstTag.Add(tmpBuffer.SubBytes(start, tmpBuffer.RecvLength - start));// other foreach (var tag in lstTag) { SendFragmentedData(tag); } } // 构建完整的认证响应数据 static byte[] BuildAuthentication(InitiateAuthenticationOK model, string activationCode) { // 解码Base64数据 byte[] serverSigned1Bytes = Convert.FromBase64String(model.serverSigned1); byte[] serverSignature1Bytes = Convert.FromBase64String(model.serverSignature1); byte[] euiccCiPKIdToBeUsedBytes = Convert.FromBase64String(model.euiccCiPKIdToBeUsed); byte[] serverCertificateBytes = Convert.FromBase64String(model.serverCertificate); byte[] activationCodeBytes = DataUtil.AsciiStringToBytes(activationCode);// 激活码 //# serverSigned1 服务器挑战值(含transactionId) //# serverSignature1 服务器签名 //# euiccCiPKIdToBeUsed CI(Credential Issuer)公钥 ID //# serverCertificate 服务器的 X.509 证书 //A0 2C //#激活码 //80 20 //A1 08 80 04 35 29 06 11 A1 00 // 结尾数据 var bppData = new List<byte>(); // 添加BPP数据包 (A02C标签) bppData.Add(0xA0); bppData.Add(0x2C); // 添加激活码 (80标签) bppData.Add(0x80); bppData.Add((byte)activationCodeBytes.Length); bppData.AddRange(activationCodeBytes); // 添加配置文件策略规则 (A1标签,可选) bppData.Add(0xA1); bppData.Add(0x08); bppData.Add(0x80); bppData.Add(0x04); bppData.Add(0x35); bppData.Add(0x29); bppData.Add(0x06); bppData.Add(0x11); // bppData.Add(0xA1); bppData.Add(0x00); int len = serverSigned1Bytes.Length + serverSignature1Bytes.Length + euiccCiPKIdToBeUsedBytes.Length + serverCertificateBytes.Length + bppData.Count; var data = new List<byte>(); // 添加BF38复合标签 data.Add(0xBF); data.Add(0x38); data.Add(0x82); // 82标签 data.AddRange(DataUtil.IntTo2BytesUShort(len));// 长度(2字节) data.AddRange(serverSigned1Bytes); data.AddRange(serverSignature1Bytes); data.AddRange(euiccCiPKIdToBeUsedBytes); data.AddRange(serverCertificateBytes); data.AddRange(bppData); return data.ToArray(); } static byte[] BuildGetBoundProfilePackage(AuthenticateClientOK model) { // 解码Base64数据 byte[] smdpSigned2Bytes = Convert.FromBase64String(model.smdpSigned2); byte[] smdpSignature2Bytes = Convert.FromBase64String(model.smdpSignature2); byte[] smdpCertificateBytes = Convert.FromBase64String(model.smdpCertificate); //# smdpSigned2 //# smdpSignature2 //# smdpCertificate int len = smdpSigned2Bytes.Length + smdpSignature2Bytes.Length + smdpCertificateBytes.Length; var data = new List<byte>(); data.Add(0xBF); data.Add(0x21); data.Add(0x82); // 82标签 data.AddRange(DataUtil.IntTo2BytesUShort(len));// 长度(2字节) data.AddRange(smdpSigned2Bytes); data.AddRange(smdpSignature2Bytes); data.AddRange(smdpCertificateBytes); return data.ToArray(); } // 分片发送数据 static byte[] SendFragmentedData(byte[] data) { byte[] content = null; const int MAX_CHUNK_SIZE = 120; // 最大分片大小 int offset = 0; byte fragmentNum = 0; while (offset < data.Length) { // 8个1包 int size = MAX_CHUNK_SIZE; if (fragmentNum == 8) { size = 0x3C; } int remaining = data.Length - offset; int chunkSize = Math.Min(size, remaining); byte[] chunk = new byte[chunkSize]; Array.Copy(data, offset, chunk, 0, chunkSize); bool end = false; if (offset + chunkSize >= data.Length) { end = true; } // 8个1包,循环发送 if (fragmentNum == 8) { end = true; } var apdu = new CommandApdu(IsoCase.Case3Short, SCardProtocol.Any) { CLA = 0x81, Instruction = (InstructionCode)0xE2, P1 = (!end ? (byte)0x11 : (byte)0x91), P2 = fragmentNum, Data = chunk }; content = EchoApdu(apdu); // 设置是否读取 offset += chunkSize; fragmentNum++; // 8个1包 if (fragmentNum == 9) { fragmentNum = 0; } } return content; } static void CancelSession(string smdpAddress, string transactionId) { byte[] fixedPrefix = { 0xBF, 0x41, 0x15, 0x80, 0x10 }; byte[] transactionIdBytes = DataUtil.HexToByte(transactionId); byte[] fixedSuffix = { 0x81, 0x01, 0x00 }; byte[] apduData = fixedPrefix.Concat(transactionIdBytes).Concat(fixedSuffix).ToArray(); var apdu = new CommandApdu(IsoCase.Case3Short, SCardProtocol.Any) { CLA = 0x81, Instruction = (InstructionCode)0xE2, P1 = 0x91, P2 = 0x00, Data = apduData }; var content = EchoApdu(apdu); var requestBody = new { transactionId, cancelSessionResponse = Convert.ToBase64String(content) }; PushToSmdpPlus($"https://{smdpAddress}/gsma/rsp2/es9plus/cancelSession", requestBody); } static Tuple<bool,string> PushToSmdpPlus(string url, object requestBody, bool hasContent = true) { bool status = false; string content = string.Empty; // 配置 HttpClientHandler 处理 SSL var handler = new HttpClientHandler(); // 对于测试环境,可以接受所有证书 handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { // 生产环境应该严格验证证书 #if DEBUG return true; #else return sslPolicyErrors == System.Net.Security.SslPolicyErrors.None; #endif }; using (var httpClient = new HttpClient(handler)) { httpClient.DefaultRequestHeaders.ConnectionClose = true; // 构造请求体(符合RSP2规范) var json = JsonConvert.SerializeObject(requestBody); var input = new StringContent(json, Encoding.UTF8, "application/json"); var response = httpClient.PostAsync(url, input).Result;// 发送POST请求(ES9+接口要求返回204表示成功) content = response.Content.ReadAsStringAsync().Result; // 读取响应内容 Logger.Info($"[HTTP] PushToSmdpPlus {url} "); Logger.Info($"[HTTP] [RX] {json}"); Logger.Info($"[HTTP] [TX] statuscode:{response.StatusCode} {content} "); if (!hasContent) { status = response.StatusCode == System.Net.HttpStatusCode.NoContent; // 204 } else { status = response.StatusCode == System.Net.HttpStatusCode.OK; var model = JsonConvert.DeserializeObject<BaseResponse>(content); if ("Executed-Success" != model.header.functionExecutionStatus.status) { status = false; } } } return Tuple.Create(status, content); } } }
下载流程
es10b_get_euicc_challenge_and_info
es9p_initiate_authentication
es10b_authenticate_server
es9p_authenticate_client
es10b_prepare_download
es9p_get_bound_profile_package
es10b_load_bound_profile_package
qq:505645074

浙公网安备 33010602011771号