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);
        }
Example #4
0
        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)));
            }
        }
Example #5
0
        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);
        }