예제 #1
0
        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);
        }
예제 #2
0
        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();
            }
        }
예제 #3
0
        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);
                }
            }
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        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;
                }
            }
        }
예제 #8
0
        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;
                //}
            }
        }
예제 #9
0
        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);
            }
        }