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