public bool Handle(IPacket header, IIBLVMSocket socket)
        {
            if (header.Type == PacketType.ServerKeyResponse)
            {
                Utils.PacketValidation(socket.Status, (int)ClientSocketStatus.Handshaking, header.GetPayloadSize(), false);

                CryptoProvider    cryptoProvider = socket.CryptoProvider;
                IPayload <byte[]> packet         = socket.PacketFactory.CreateServerKeyResponse(null);
                packet.ParsePayload(header.GetPayloadSize(), socket.SocketStream);

                cryptoProvider.SharedKey    = cryptoProvider.ECDiffieHellman.DeriveKeyMaterial(CngKey.Import(packet.Payload, CngKeyBlobFormat.EccPublicBlob));
                cryptoProvider.CryptoStream = new CryptoMemoryStream(cryptoProvider.SharedKey);
                byte[] nonce = new byte[cryptoProvider.CryptoStream.IV.Length];
                Array.Copy(cryptoProvider.SharedKey, nonce, nonce.Length);
                cryptoProvider.CryptoStream.IV = nonce;

                IPacket responsePacket = socket.PacketFactory.CreateClientKeyResponse(cryptoProvider.ECDiffieHellman.PublicKey.ToByteArray());
                Utils.SendPacket(socket.SocketStream, responsePacket);

                socket.Status = (int)ClientSocketStatus.Connected;
                return(true);
            }

            return(false);
        }
Exemple #2
0
        public bool Handle(IPacket header, IIBLVMSocket socket)
        {
            if (header.Type == PacketType.ServerBitLockerLockRequest)
            {
                Utils.PacketValidation(socket.Status, (int)ClientSocketStatus.LoggedIn, header.GetPayloadSize(), false);

                IPayload <DriveInformation> packet = socket.PacketFactory.CreateServerBitLockerLockRequest(null);
                packet.ParsePayload(header.GetPayloadSize(), socket.SocketStream);

                BitLocker bitLocker = BitLocker.GetVolume(packet.Payload.Name);
                bool      isSuccess = true;
                try {
                    bitLocker.Lock(true);
                }
                catch (Exception)
                {
                    isSuccess = false;
                }

                IPayload <bool> result = socket.PacketFactory.CreateClientBitLockerCommandResponse(isSuccess);
                Utils.SendPacket(socket.SocketStream, result);

                return(true);
            }

            return(false);
        }
Exemple #3
0
        public bool Handle(IPacket header, IIBLVMSocket socket)
        {
            if (header.Type == PacketType.ClientLoginRequest)
            {
                Utils.PacketValidation(socket.Status, (int)SocketStatus.Connected, header.GetPayloadSize(), false);

                IPayload <IAuthInfo> packet = socket.PacketFactory.CreateClientLoginRequest(null, null, 0, socket.CryptoProvider.CryptoStream);
                packet.ParsePayload(header.GetPayloadSize(), socket.SocketStream);

                bool    isSuccess = session.Auth(new Account(packet.Payload.Account.Id, packet.Payload.Account.Password));
                IPacket response  = socket.PacketFactory.CreateServerLoginResponse(isSuccess);

                if (isSuccess)
                {
                    OnClientLoggedIn(packet.Payload);
                }

                Utils.SendPacket(socket.SocketStream, response);

                socket.Status = (int)SocketStatus.LoggedIn;
                return(true);
            }

            return(false);
        }
Exemple #4
0
 public SocketHandlerChain(IIBLVMSocket socket)
 {
     chain = new PacketHandlerChain(socket);
     chain.AddHandler(new ServerKeyResponseHandler());
     chain.AddHandler(new ServerLoginResponseHandler());
     chain.AddHandler(new IVChangeRequestHandler());
     chain.AddHandler(new IVChangeResponseHandler());
     chain.AddHandler(new ServerBitLockerLockRequestHandler());
     chain.AddHandler(new ServerBitLockerUnlockRequestHandler());
     chain.AddHandler(new ServerDrivesRequestHandler());
 }
Exemple #5
0
        public bool Handle(IPacket header, IIBLVMSocket socket)
        {
            if (header.Type == PacketType.ServerDrivesRequest)
            {
                Utils.PacketValidation(socket.Status, (int)ClientSocketStatus.LoggedIn, header.GetPayloadSize(), true);
                IPayload <DriveInformation[]> packet = socket.PacketFactory.CreateClientDrivesResponse(DriveInfo.GetDrives());

                Utils.SendPacket(socket.SocketStream, packet);
                return(true);
            }

            return(false);
        }
        public bool Handle(IPacket header, IIBLVMSocket socket)
        {
            if (header.Type == PacketType.ManagerDevicesRequest)
            {
                Utils.PacketValidation(socket.Status, (int)SocketStatus.LoggedIn, header.GetPayloadSize(), true);
                IPayload <IDevice[]> packet = socket.PacketFactory.CreateServerDevicesResponse(deviceController.GetUserDevices(session.Account.Id));

                Utils.SendPacket(socket.SocketStream, packet);
                return(true);
            }

            return(false);
        }
Exemple #7
0
        public bool Handle(IPacket header, IIBLVMSocket socket)
        {
            if (header.Type == PacketType.ClientDrivesResponse)
            {
                Utils.PacketValidation(socket.Status, (int)ClientSocketStatus.LoggedIn);
                IPayload <DriveInformation[]> packet = socket.PacketFactory.CreateClientDrivesResponse(null);
                packet.ParsePayload(header.GetPayloadSize(), socket.SocketStream);

                messageQueue.Enqueue(header.Type, packet.Payload);
                return(true);
            }

            return(false);
        }
Exemple #8
0
        public bool Handle(IPacket header, IIBLVMSocket socket)
        {
            if (header.Type == PacketType.ServerBitLockerCommandResponse)
            {
                Utils.PacketValidation(socket.Status, (int)ClientSocketStatus.LoggedIn, header.GetPayloadSize(), false);
                IPayload <bool> packet = socket.PacketFactory.CreateServerBitLockerCommandResponse(false);
                packet.ParsePayload(header.GetPayloadSize(), socket.SocketStream);

                OnBitLockerCommandResponseReceived(packet.Payload);
                return(true);
            }

            return(false);
        }
        public bool Handle(IPacket header, IIBLVMSocket socket)
        {
            if (header.Type == PacketType.ClientBitLockerCommandResponse)
            {
                Utils.PacketValidation(socket.Status, (int)SocketStatus.LoggedIn, header.GetPayloadSize(), false);
                IPayload <bool> packet = socket.PacketFactory.CreateClientBitLockerCommandResponse(false);
                packet.ParsePayload(header.GetPayloadSize(), socket.SocketStream);

                messageQueue.Enqueue(packet.Type, packet.Payload);
                return(true);
            }

            return(false);
        }
Exemple #10
0
        public bool Handle(IPacket header, IIBLVMSocket socket)
        {
            if (header.Type == PacketType.ManagerDrivesRequest)
            {
                Utils.PacketValidation(socket.Status, (int)ClientSocketStatus.LoggedIn, header.GetPayloadSize(), false);
                IPayload <IDevice> packet = socket.PacketFactory.CreateManagerDrivesRequest(null);
                packet.ParsePayload(header.GetPayloadSize(), socket.SocketStream);

                Utils.SendPacket(socket.SocketStream, socket.PacketFactory.CreateServerDrivesResponse(broadcaster.RequestDrives(packet.Payload)));

                return(true);
            }

            return(false);
        }
Exemple #11
0
        public ManagerHandlerChain(IIBLVMSocket socket)
        {
            chain = new PacketHandlerChain(socket);
            chain.AddHandler(new IVChangeRequestHandler());
            chain.AddHandler(new IVChangeResponseHandler());
            chain.AddHandler(new ServerKeyResponseHandler());
            chain.AddHandler(new ServerLoginResponseHandler());
            devicesResponseHandler = new ServerDevicesResponseHandler();
            chain.AddHandler(devicesResponseHandler);

            drivesResponseHandler = new ServerDrivesResponseHandler();
            chain.AddHandler(drivesResponseHandler);

            bitLockerCommandResponseHandler = new ServerBitLockerCommandResponseHandler();
            chain.AddHandler(bitLockerCommandResponseHandler);
        }
Exemple #12
0
        public bool Handle(IPacket header, IIBLVMSocket socket)
        {
            if (header.Type == PacketType.ClientHello)
            {
                Utils.PacketValidation(socket.Status, (int)SocketStatus.Uninitialized, header.GetPayloadSize(), true);

                socket.CryptoProvider.ECDiffieHellman = new ECDiffieHellmanCng();
                IPacket packet = socket.PacketFactory.CreateServerKeyResponse(socket.CryptoProvider.ECDiffieHellman.PublicKey.ToByteArray());
                Utils.SendPacket(socket.SocketStream, packet);

                socket.Status = (int)SocketStatus.ServerKeyResponsed;
                return(true);
            }

            return(false);
        }
Exemple #13
0
        public ServerHandlerChain(IIBLVMSocket socket, MessageQueue messageQueue, IServer server, IBroadcaster broadcaster)
        {
            chain = new PacketHandlerChain(socket);
            chain.AddHandler(new ClientHelloHandler());
            chain.AddHandler(new ClientKeyResponseHandler());

            clientLoginHandler = new ClientLoginHandler(server.Session);
            chain.AddHandler(clientLoginHandler);

            chain.AddHandler(new IVChangeRequestHandler());
            chain.AddHandler(new IVChangeResponseHandler());
            chain.AddHandler(new BitLockerCommandResponseHandler(messageQueue));
            chain.AddHandler(new ClientDrivesResponseHandler(messageQueue));
            chain.AddHandler(new ManagerDevicesRequestHandler(server.DeviceController, server.Session));
            chain.AddHandler(new ManagerDrivesRequestHandler(broadcaster));
            chain.AddHandler(new ManagerBitLockerLockHandler(server.DeviceController, server.Session, broadcaster));
            chain.AddHandler(new ManagerBitLockerUnlockHandler(broadcaster, server.DeviceController, server.Session, socket.CryptoProvider));
        }
Exemple #14
0
        public bool Handle(IPacket header, IIBLVMSocket socket)
        {
            if (header.Type == PacketType.ServerLoginResponse)
            {
                Utils.PacketValidation(socket.Status, (int)ClientSocketStatus.Connected, header.GetPayloadSize(), false);

                IPayload <bool> packet = socket.PacketFactory.CreateServerLoginResponse(false);
                packet.ParsePayload(header.GetPayloadSize(), socket.SocketStream);

                if (!packet.Payload)
                {
                    throw new InvalidAuthorizationDataException();
                }

                socket.Status = (int)ClientSocketStatus.LoggedIn;
                return(true);
            }

            return(false);
        }
Exemple #15
0
        public bool Handle(IPacket header, IIBLVMSocket socket)
        {
            if (header.Type == PacketType.IVChangeReqeust)
            {
                IPayload <byte[]> packet = socket.PacketFactory.CreateIVChangeRequest(null, socket.CryptoProvider.CryptoStream);
                packet.ParsePayload(header.GetPayloadSize(), socket.SocketStream);

                IVExchangeAcceptEventArgs accept = new IVExchangeAcceptEventArgs();
                IVExchangeAccpetEvent(accept);

                if (accept.Accpet)
                {
                    socket.CryptoProvider.CryptoStream.IV = packet.Payload;
                }

                Utils.SendPacket(socket.SocketStream, socket.PacketFactory.CreateIVChangeResposne(accept.Accpet));
                return(true);
            }

            return(false);
        }
        public bool Handle(IPacket header, IIBLVMSocket socket)
        {
            if (header.Type == PacketType.ManagerBitLockerLock)
            {
                Utils.PacketValidation(socket.Status, (int)ClientSocketStatus.LoggedIn, header.GetPayloadSize(), false);
                IPayload <ClientDrive> packet = socket.PacketFactory.CreateManagerBitLockerLockRequest(null);
                packet.ParsePayload(header.GetPayloadSize(), socket.SocketStream);

                IDevice receiver = (from device in deviceController.GetUserDevices(session.Account.Id) where device.DeviceIP.Equals(packet.Payload.IP) select device).FirstOrDefault();
                if (receiver != null)
                {
                    Utils.SendPacket(socket.SocketStream, socket.PacketFactory.CreateServerBitLockerCommandResponse(broadcaster.RequestBitLockerLock(receiver, packet.Payload.Drive)));
                }
                else
                {
                    Utils.SendPacket(socket.SocketStream, socket.PacketFactory.CreateServerBitLockerCommandResponse(false));
                }

                return(true);
            }

            return(false);
        }
Exemple #17
0
        public bool Handle(IPacket header, IIBLVMSocket socket)
        {
            if (header.Type == PacketType.IVChangeResponse)
            {
                IPayload <bool> result = socket.PacketFactory.CreateIVChangeResposne(false);
                result.ParsePayload(header.GetPayloadSize(), socket.SocketStream);

                if (!result.Payload)
                {
                    throw new InvalidOperationException("IV Change request isn't accepted.");
                }

                byte[] nextIV = socket.CryptoProvider.NextIV;
                if (nextIV != null)
                {
                    socket.CryptoProvider.CryptoStream.IV = nextIV;
                }

                socket.CryptoProvider.NextIV = null;
                return(true);
            }

            return(false);
        }
Exemple #18
0
 /// <summary>
 /// IBLVMSocket 인스턴스로 PacketHandlerChain 클래스 인스턴스를 초기화합니다.
 /// </summary>
 /// <param name="socket">책임 연쇄에 사용될 IIBVLMSocket 인스턴스입니다.</param>
 public PacketHandlerChain(IIBLVMSocket socket) => this.socket = socket;
Exemple #19
0
 public static void ExchangeIV(IIBLVMSocket socket, byte[] nextIV)
 {
     socket.CryptoProvider.NextIV = nextIV;
     SendPacket(socket.SocketStream, socket.PacketFactory.CreateIVChangeRequest(nextIV, socket.CryptoProvider.CryptoStream));
 }