static bool GetAES(ref byte[] data, BlindSocket socket, out Cryptography.AES256 aes256) { aes256 = null; uint encryptDate = BitConverter.ToUInt32(data, 4); byte[] realData = new byte[data.Length - 8]; Array.Copy(data, 8, realData, 0, realData.Length); data = realData; Console.WriteLine("Encrypted date : " + encryptDate); socket.CryptoSend(BitConverter.GetBytes(encryptDate), PacketType.Info); byte[] key = socket.CryptoReceiveMsg(); if (key == null) { MessageBox.Show("파일 복호화에 실패했습니다.", "파일 열기"); return(false); } Console.WriteLine("Received key {0} bytes", key.Length); byte[] iv = socket.CryptoReceiveMsg(); if (iv == null) { MessageBox.Show("파일 복호화에 실패했습니다.", "파일 열기"); return(false); } Console.WriteLine("Received iv {0} bytes", iv.Length); aes256 = new Cryptography.AES256(key, iv); return(true); }
public void Run() { connection = new MySqlConnection("Server = " + BlindNetConst.DatabaseIP + "; Port = 3306; Database = document_center; Uid = root; Pwd = kit2020"); mainSocket = new BlindServerScoket(BlindNetConst.ServerIP, BlindNetConst.OPENNERPORT); mainSocket.BindListen(); while (true) { BlindSocket client = mainSocket.AcceptWithECDH(); IPEndPoint iep = (IPEndPoint)(client.socket.RemoteEndPoint); Console.WriteLine("Accepted {0} : {1}", iep.Address, iep.Port); if (client == null) { continue; } byte[] data = BlindNetUtil.ByteTrimEndNull(client.CryptoReceiveMsg()); byte[] tmp = new byte[4]; Array.Copy(data, 0, tmp, 0, data.Length); string ext = GetExt(BitConverter.ToUInt32(tmp, 0)); if (ext == null) { client.CryptoSend(null, PacketType.Disconnect); continue; } client.CryptoSend(Encoding.UTF8.GetBytes(ext), PacketType.Info); data = BlindNetUtil.ByteTrimEndNull(client.CryptoReceiveMsg()); tmp = new byte[4]; Array.Copy(data, 0, tmp, 0, data.Length); int encryptDate = BitConverter.ToInt32(tmp, 0); byte[] key, iv; if (!GetSpecifyKeyPair(out key, out iv, encryptDate)) { client.CryptoSend(null, PacketType.Disconnect); continue; } client.CryptoSend(key, PacketType.Info); client.CryptoSend(iv, PacketType.Info); byte[] latestKey, latestIv; if (!GetLatestKeyPair(out latestKey, out latestIv)) { client.CryptoSend(null, PacketType.Disconnect); continue; } client.CryptoSend(latestKey, PacketType.Info); client.CryptoSend(latestIv, PacketType.Info); client.Close(); } }
public void Run() { this.hDB = new MySqlConnection("Server=" + BlindNetConst.DatabaseIP + ";Database=BlindChat;Uid=root;Pwd=kit2020;"); this.hDB.Open(); recvSock = GetChatRecvSocket(); sendSock = GetChatSendSocket(); IPEndPoint iep = (IPEndPoint)(recvSock.socket.RemoteEndPoint); logger = new Logger(UserID, iep.Address.ToString(), LogService.Chat); SetOnline((int)UserStat.Online); byte[] data; while (true) { data = recvSock.CryptoReceiveMsg(); if (data == null) { recvSock.Close(); sendSock.Close(); SetOnline((int)UserStat.Offline); global.ListBlindChat.Remove(this); logger.Log(LogRank.INFO, "BlindChat Disconnected"); return; } ChatPacket chatPacket = BlindNetUtil.ByteToStruct <ChatPacket>(data); if (chatPacket.Type == ChatType.Time) { ClientUpdateData(chatPacket); logger.Log(LogRank.INFO, "Chat Data Synchronized"); } else if (chatPacket.Type == ChatType.NewRoom) { ExecuteNewRoom(chatPacket); logger.Log(LogRank.INFO, "Created New Chat Room"); } else if (chatPacket.Type == ChatType.Message) { MessageToParticipants(chatPacket); } else if (chatPacket.Type == ChatType.RoomJoined) { ExecuteInvitation(chatPacket); } else if (chatPacket.Type == ChatType.Exit) { ExecuteExit(chatPacket); } } }
static bool GetLatestAES(BlindSocket socket, out Cryptography.AES256 aes256) { aes256 = null; byte[] key = socket.CryptoReceiveMsg(); if (key == null) { MessageBox.Show("파일 복호화에 실패했습니다.", "파일 열기"); return(false); } Console.WriteLine("Received key {0} bytes", key.Length); byte[] iv = socket.CryptoReceiveMsg(); if (iv == null) { MessageBox.Show("파일 복호화에 실패했습니다.", "파일 열기"); return(false); } Console.WriteLine("Received iv {0} bytes", iv.Length); aes256 = new Cryptography.AES256(key, iv); return(true); }
static string GetSpecifyExt(uint id, BlindSocket socket) { socket.CryptoSend(BitConverter.GetBytes(id), PacketType.Info); byte[] bExt = socket.CryptoReceiveMsg(); if (bExt == null) { MessageBox.Show("파일 복호화에 실패했습니다.", "파일 열기"); return(null); } string ext = "." + Encoding.UTF8.GetString(bExt); Console.WriteLine("Ext : " + ext); return(ext); }
static async void AddConnectedUser(BlindSocket socket) { if (socket == null) { return; } IPEndPoint iep = (IPEndPoint)(socket.socket.RemoteEndPoint); //로그인 인증 uint cid; byte[] ClientReceiveMsg = socket.CryptoReceiveMsg(); // 아이디,isinner 받음. (bool형. 디버그했을때 실질적인 값 : true -> "True" | false -> "False") string ClientGenderMsg = Encoding.UTF8.GetString(ClientReceiveMsg); // 바이트 -> 스트링 if (Encoding.UTF8.GetString(ClientReceiveMsg) != "\0") { cid = GetClientID(ClientGenderMsg.Split(',')[0].ToString()); //[0] -> dkdlel } else { cid = 0; } logger = new Logger(cid, iep.Address.ToString(), LogService.Login); if (cid != 0) { logger.Log(LogRank.INFO, "[Login Success] " + "Login ID : \"" + ClientGenderMsg.Split(',')[0].ToString() + "\" " + "VPN Whether: \"" + (ClientGenderMsg.Split(',')[1].ToString() == "True" ? "True" : "False") + "\""); } else { logger.Log(LogRank.WARN, "[Login Fail] " + "Login ID : \"" + ClientGenderMsg.Split(',')[0].ToString() + "\" " + "VPN Whether: \"" + (ClientGenderMsg.Split(',')[1].ToString() == "True" ? "True" : "False") + "\""); } socket.CryptoSend(BitConverter.GetBytes(cid), PacketType.Response);//cid 보냄 if (cid == 0) { socket.Close(); return; } uint[] gids = GetGids(cid); Console.WriteLine("Accepted {0} : {1}" + $"({cid})", iep.Address, iep.Port); //Client 구조체 초기화 및 추가 TaskScheduler scheduler = TaskScheduler.Default; BlindClient client = new BlindClient(); client.socket = socket; client.token = new CancellationTokenSource(); client.documentCenter = new Doc_Center(cid, gids); //기능 객체 생성 client.tDocumentCenter = Task.Factory.StartNew(() => client.documentCenter.Run(), client.token.Token, TaskCreationOptions.LongRunning, scheduler); //기능 객체의 최초 함수 실행 client.chat = new BlindChat(cid); client.tChat = Task.Factory.StartNew(() => client.chat.Run(), client.token.Token, TaskCreationOptions.LongRunning, scheduler); client.blindLock = new BlindLock(cid); client.tBlindLock = Task.Factory.StartNew(() => client.blindLock.Run(), client.token.Token, TaskCreationOptions.LongRunning, scheduler); client.blindWebDevice = new BlindWebDevice(cid); client.tBlindWebDevice = Task.Factory.StartNew(() => client.blindWebDevice.Run(), client.token.Token, TaskCreationOptions.LongRunning, scheduler); Clients.Add(client); }
private void btn_Unlock_Click(object sender, EventArgs e) { if (!isInner)//vpn으로 연결되어 있는 경우 { MessageBox.Show("VPN용 락"); //서버로 정보 전송 LockInfo info = new LockInfo(); info.userName = UserID; info.password = tb_Password.Text; byte[] data = BlindNetUtil.StructToByte(info); LockPacket packet = new LockPacket(); packet.Type = lockType.INFO; packet.data = data; MessageBox.Show("패킷 생성"); byte[] packetData = BlindNetUtil.StructToByte(packet); lockSock.CryptoSend(packetData, PacketType.Info); MessageBox.Show("send msg"); //서버로부터 받은 성공여부로 스크린락 해제 data = lockSock.CryptoReceiveMsg(); MessageBox.Show("received msg"); packet = BlindNetUtil.ByteToStruct <LockPacket>(data); if (packet.Type == lockType.SUCCESS) { tb_Password.Text = ""; ActivateWhenUnlock(); } else { MessageBox.Show("서버로부터의 인증에 실패하셨습니다."); tb_Password.Text = ""; tb_Password.Focus(); return; } } else//로컬에서 인증하는 경우 { int token; bool result; if (tb_Password.Text == "unlock") { result = true; } else { result = LogonUser(Environment.UserName, "Blind2A", tb_Password.Text, 8, 0, out token); } if (result) { tb_Password.Text = ""; ActivateWhenUnlock(); } else { MessageBox.Show("로컬에서 인증을 실패하셨습니다."); return; } } }
public void Run() { socket = _Main.socket_docCenter.AcceptWithECDH(); socket.socket.NoDelay = true; logger = new Logger(uid, ((IPEndPoint)(socket.socket.RemoteEndPoint)).Address.ToString(), LogService.DocumentCenter); logger.Log(LogRank.INFO, "Connected to document center."); isInner = BitConverter.ToBoolean(socket.CryptoReceiveMsg(), 0); connection = new MySqlConnection("Server = " + BlindNetConst.DatabaseIP + "; Port = 3306; Database = document_center; Uid = root; Pwd = kit2020"); try { connection.Open(); } catch (Exception ex) { Console.WriteLine("ERROR : [UID : " + uid + "] " + ex.Message); socket.CryptoSend(null, PacketType.Fail); return; } socket.CryptoSend(null, PacketType.OK); while (true) { //try //{ BlindPacket packet = socket.CryptoReceive(); if (packet.header != PacketType.Disconnect) { packet.data = BlindNetUtil.ByteTrimEndNull(packet.data); } switch (packet.header) { case PacketType.DocRefresh: UpdateRoot(); break; case PacketType.DocDirInfo: { byte[] data = BlindNetUtil.ByteTrimEndNull(packet.data); byte[] tmp = new byte[4]; Array.Copy(data, 0, tmp, 0, data.Length); UpdateDir(BitConverter.ToUInt32(tmp, 0)); break; } case PacketType.DocAddDir: AddDir(BlindNetUtil.ByteToStruct <Directory_Info>(packet.data)); break; case PacketType.DocRemoveDir: { byte[] data = BlindNetUtil.ByteTrimEndNull(packet.data); byte[] tmp = new byte[4]; Array.Copy(data, 0, tmp, 0, data.Length); RemoveDir(BitConverter.ToUInt32(tmp, 0)); break; } case PacketType.DocRemoveFile: { byte[] data = BlindNetUtil.ByteTrimEndNull(packet.data); byte[] tmp = new byte[4]; Array.Copy(data, 0, tmp, 0, data.Length); RemoveFile(BitConverter.ToUInt32(tmp, 0)); break; } case PacketType.DocChngNameDir: ChangeNameDir(BlindNetUtil.ByteToStruct <Directory_Info>(packet.data)); break; case PacketType.DocFileUpload: FileUpload(BlindNetUtil.ByteToStruct <Directory_Info>(packet.data)); break; case PacketType.DocFileDownload: { byte[] data = BlindNetUtil.ByteTrimEndNull(packet.data); byte[] tmp = new byte[4]; Array.Copy(data, 0, tmp, 0, data.Length); FileDownload(BitConverter.ToUInt32(tmp, 0)); break; } case PacketType.DocDirDownload: { byte[] data = BlindNetUtil.ByteTrimEndNull(packet.data); byte[] tmp = new byte[4]; Array.Copy(data, 0, tmp, 0, data.Length); DirDownload(BitConverter.ToUInt32(tmp, 0)); break; } case PacketType.DocGetFileSize: { byte[] data = BlindNetUtil.ByteTrimEndNull(packet.data); byte[] tmp = new byte[4]; Array.Copy(data, 0, tmp, 0, data.Length); GetFileSize(BitConverter.ToUInt32(tmp, 0)); break; } case PacketType.DocGetDirSize: { byte[] data = BlindNetUtil.ByteTrimEndNull(packet.data); byte[] tmp = new byte[4]; Array.Copy(data, 0, tmp, 0, data.Length); GetDirSize(BitConverter.ToUInt32(tmp, 0)); break; } case PacketType.DocRenameFile: { byte[] data = BlindNetUtil.ByteTrimEndNull(packet.data); byte[] tmp = new byte[4]; Array.Copy(data, 0, tmp, 0, data.Length); RenameFile(BitConverter.ToUInt32(tmp, 0)); break; } case PacketType.DocMoveFile: MoveFile(BlindNetUtil.ByteToStruct <SrcDstInfo>(packet.data)); break; case PacketType.DocMoveDir: MoveDir(BlindNetUtil.ByteToStruct <SrcDstInfo>(packet.data)); break; case PacketType.DocCopyFile: CopyFile(BlindNetUtil.ByteToStruct <SrcDstInfo>(packet.data)); break; case PacketType.DocCopyDir: CopyDir(BlindNetUtil.ByteToStruct <SrcDstInfo>(packet.data)); break; case PacketType.Disconnect: logger.Log(LogRank.INFO, "Disconnected from document center"); return; } //} //catch (Exception ex) //{ // Console.WriteLine("ERROR : [UID : " + uid + "] " + ex.Message); // return; //} } }
private void FileUpload(Directory_Info dir) { File_Info file = BlindNetUtil.ByteToStruct <File_Info>(socket.CryptoReceiveMsg()); Debug.WriteLine("Start FileUpload \"{0}\"", file.name); MySqlCommand commander = null; try { string command = "SELECT path FROM files_info WHERE dir_id = " + dir.id + " AND name = '" + file.name + "';"; MySqlDataAdapter adapter = new MySqlDataAdapter(command, connection); DataSet dataset = new DataSet(); adapter.Fill(dataset); string path = null; if (dataset.Tables[0].Rows.Count != 0) { command = "UPDATE files_info SET modified_date = NOW() WHERE dir_id = " + dir.id + " AND name = '" + file.name + "';"; commander = new MySqlCommand(command, connection); if (commander.ExecuteNonQuery() != 1) { throw new Exception(); } path = (string)dataset.Tables[0].Rows[0]["path"]; File.Delete(path); } else { command = "INSERT INTO files_info VALUES (" + 0 + ", " + dir.id + ", '" + file.name + "', DEFAULT, UPPER('" + file.type + "'), " + file.size + ", NULL);"; commander = new MySqlCommand(command, connection); if (commander.ExecuteNonQuery() != 1) { throw new Exception(); } } Debug.WriteLine("[FileUpload] Start leceiving"); byte[] data = socket.CryptoReceiveMsg(); Debug.WriteLine("[FileUpload] End leceiving {0} bytes", data.Length); command = "SELECT MAX(id) FROM files_info;"; commander = new MySqlCommand(command, connection); MySqlDataReader reader = commander.ExecuteReader(); reader.Read(); file.id = (uint)reader["MAX(id)"]; reader.Close(); if (path == null) { command = "SELECT path FROM directorys_info WHERE id = " + dir.id + ";"; adapter = new MySqlDataAdapter(command, connection); adapter.Fill(dataset); if (dataset.Tables[0].Rows.Count != 1) { throw new Exception(); } path = (string)dataset.Tables[0].Rows[0]["path"] + file.id + ".blind"; command = "UPDATE files_info SET path = '" + RemakePath(path, false) + "' WHERE dir_id = " + dir.id + " AND name = '" + file.name + "';"; commander = new MySqlCommand(command, connection); if (commander.ExecuteNonQuery() != 1) { throw new Exception(); } } data = EncryptFile(data); if (data == null) { throw new Exception(); } data = BlindNetUtil.MergeArray(BitConverter.GetBytes(file.id), data); FileInfo fi = new FileInfo(path); FileStream fs = fi.OpenWrite(); fs.Write(data, 0, data.Length); fs.Close(); UpdateModDate(dir.id); socket.CryptoSend(null, PacketType.OK); logger.Log(LogRank.INFO, "Uploaded file(" + file.id + ")"); } catch (Exception ex) { socket.CryptoSend(null, PacketType.Fail); } }