public override void HandleArFrame(Frames.MaslArFrame arFrame) { var expectedDir = MaslFrameDirection.Server2Client; if (arFrame.Direction != expectedDir) { throw new DirectionFlagException(expectedDir); } // 收到AR,关闭握手计时器。 this.Context.StopHandshakeTimer(); // 验证MAC var actualMac = arFrame.MAC; var expectedMac = this.Context.AuMessageMacCalculator.CalcArMAC(arFrame, this.Context.RsspEP.LocalID); if (!ArrayHelper.Equals(expectedMac, actualMac)) { throw new MacInArException(string.Format("Ar消息Mac检验失败,期望值={0},实际值={1}", HelperTools.ConvertToString(expectedMac), HelperTools.ConvertToString(actualMac))); } this.Context.Connected = true; }
public override void HandleAu3Frame(Frames.MaslAu3Frame au3Frame) { var expectedDir = MaslFrameDirection.Client2Server; if (au3Frame.Direction != expectedDir) { throw new DirectionFlagException(expectedDir); } // 收到AU3,关闭握手计时器。 this.Context.StopHandshakeTimer(); // 验证MAC var actualMac = au3Frame.MAC; var expectedMac = this.Context.AuMessageMacCalculator.CalcAu3MAC(au3Frame, this.Context.RsspEP.LocalID); if (!ArrayHelper.Equals(expectedMac, actualMac)) { throw new MacInAu3Exception(string.Format("Au3消息Mac检验失败,期望值={0},实际值={1}", HelperTools.ConvertToString(expectedMac), HelperTools.ConvertToString(actualMac))); } // 发送AR var arPkt = this.Context.AuMessageBuilder.BuildArPacket(); this.Context.AleConnection.SendUserData(arPkt); // 连接建立。 this.Context.Connected = true; }
public override void HandleAu2Frame(MaslAu2Frame au2Frame) { if (au2Frame.EncryAlgorithm != EncryptionAlgorithm.TripleDES) { throw new SafetyFeatureNotSupportedException(); } var expectedDir = MaslFrameDirection.Server2Client; if (au2Frame.Direction != expectedDir) { throw new DirectionFlagException(expectedDir); } var expectedId = this.Context.RsspEP.RemoteID & 0xFFFFFF; if (au2Frame.ServerID != expectedId) { throw new IdentifyInAu2Exception(string.Format("AU2中无效的CTCS ID,期望值={0}(0x{0:X2}),实际值={1}(0x{1:X2})。", expectedId, au2Frame.ServerID)); } // 更新远程设备(被动方)类型。 this.Context.RsspEP.RemoteEquipType = au2Frame.DeviceType; // 更新RandomA this.Context.MacCalculator.RandomA = au2Frame.RandomA; // 初始化Mac计算器。 this.Context.MacCalculator.UpdateSessionKeys(); // 验证MAC。 var actualMac = au2Frame.MAC; var expectedMac = this.Context.AuMessageMacCalculator.CalcAu2MAC(au2Frame, this.Context.RsspEP.LocalID); if (!ArrayHelper.Equals(expectedMac, actualMac)) { throw new MacInAu2Exception(string.Format("Au2消息Mac检验失败,期望值={0},实际值={1}", HelperTools.ConvertToString(expectedMac), HelperTools.ConvertToString(actualMac))); } // 发送AU3。 var au3Pkt = this.Context.AuMessageBuilder.BuildAu3Packet(); this.Context.AleConnection.SendUserData(au3Pkt); // 启动握手计时器,等待AR this.Context.StartHandshakeTimer(); // 设置下一个状态。 this.Context.CurrentState = new MaslWaitingforArState(this.Context); }
public void CheckAu1Packet(byte[] au1Bytes) { var au1Frame = MaslFrame.Parse(au1Bytes, 0, au1Bytes.Length - 1) as MaslAu1Frame; if (au1Frame == null) { throw new Exception("无法将指定的字节流序列化为Au1Frame。"); } if (!ArrayHelper.Equals(au1Frame.RandomB, _macCalc.RandomB)) { throw new Exception(string.Format("Au1消息中的RandomB检验失败,期望值={0},实际值={1}", HelperTools.ConvertToString(_macCalc.RandomB), HelperTools.ConvertToString(au1Frame.RandomB))); } }
public override void HandleDtFrame(Frames.MaslDtFrame dtFrame) { var expectedDir = !this.Context.RsspEP.IsInitiator ? MaslFrameDirection.Client2Server : MaslFrameDirection.Server2Client; if (dtFrame.Direction != expectedDir) { throw new DirectionFlagException(expectedDir); } // 验证MAC var actualMac = dtFrame.MAC; var expectedMac = this.Context.AuMessageMacCalculator.CalcDtMAC(dtFrame, this.Context.RsspEP.LocalID); if (!ArrayHelper.Equals(expectedMac, actualMac)) { throw new MacInDtException(string.Format("Dt消息Mac检验失败,期望值={0},实际值={1}", HelperTools.ConvertToString(expectedMac), HelperTools.ConvertToString(actualMac))); } // 提交到上层。 this.Context.Observer.OnMaslUserDataArrival(dtFrame.UserData); }