Esempio n. 1
0
        /// <summary>
        /// Database server
        /// </summary>
        public Server()
        {
            TcpListener listener     = null;
            bool        errorOccured = false;

            try
            {
                listener = new TcpListener(IPAddress.Parse(listenerAddress), 3351);
                listener.Start();
                CustomAPI.logging("Listening to " + listenerAddress + ":3351");
                Console.WriteLine("Waiting for connection...");
                while (true)
                {
                    TcpClient client = listener.AcceptTcpClient();
                    CustomAPI.logging("Webserver connected");
                    Thread t = new Thread(ProcessClientConnection);
                    t.Start(client);
                }
            }
            catch (SocketException e)
            {
                CustomAPI.logging("Socket Exception, " + e);
                errorOccured = true;
            }
            catch (Exception e)
            {
                CustomAPI.logging("Unknown Exception, " + e);
                errorOccured = true;
            }
            finally
            {
                CustomAPI.logging("Server down");
                if (listener != null)
                {
                    listener.Stop();
                }

                if (errorOccured)
                {
                    Console.WriteLine("[Restarting server]");
                    new Server();
                }
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Calculate the amount payable for user after discount.
        /// </summary>
        /// <returns>Calculated final price after discount</returns>
        ///

        public double calculatePrice()
        {
            int    totalNoOfDays  = (int)(Booking.CheckOutDate - Booking.CheckInDate).TotalDays;
            double pricePerPerson = 0;
            double BasePrice      = House.OriginalPrice / House.MaxNoOfPeople;
            double FinalPrice;

            int    totalNoOfPeopleDay = NoOfPeopleBooked + NoOfGuest;
            double newDiscount        = 0;
            double discountedAmount   = 0;
            double dayPrice           = 0;

            if (totalNoOfPeopleDay > 1)
            {
                for (int i = 1; i < totalNoOfPeopleDay; i++)
                {
                    if (i == 1)
                    {
                        newDiscount = START_DISCOUNT;
                    }
                    else
                    {
                        if (newDiscount > 1)
                        {
                            try
                            {
                                newDiscount = newDiscount / 2;
                            }
                            catch (ArithmeticException e)
                            {
                                CustomAPI.logging(e.Message);
                            }
                        }
                    }
                    if (discountedAmount < 50)
                    {
                        discountedAmount += newDiscount;
                    }
                }
            }
            FinalPrice = (BasePrice * NoOfGuest * totalNoOfDays) * ((100 - discountedAmount) / 100);
            return(FinalPrice);
        }
Esempio n. 3
0
        /// <summary>
        /// Initiate new client to connect
        /// </summary>
        /// <param name="args"></param>
        private async void ProcessClientConnection(object args)
        {
            TcpClient    client = (TcpClient)args;
            StreamReader sr;
            StreamWriter sw;

            try
            {
                sr           = new StreamReader(client.GetStream(), Encoding.UTF8, true, BUFFER_SIZE);
                sw           = new StreamWriter(client.GetStream(), Encoding.UTF8, BUFFER_SIZE);
                sw.AutoFlush = true;

                while (true)
                {
                    bool testDecrypted = false;


                    Console.Write("Enter AES encryption key: ");
                    string tempKey = "/gUFEqNJ17CV52nJTs1ruB8BsZ8kNBpyDVMJH26AGIE=";
                    //string tempKey = Console.ReadLine();
                    Console.Write("Enter AES IV: ");
                    string tempIV = "UaTwfDMLvZb2uh96KTKmvQ==";
                    //string tempIV = Console.ReadLine();
                    Console.Write("Enter Password: "******"doyouknowdawae";
                    //string password = Console.ReadLine();
                    //Load key and IV into constructor
                    EncryptionAES.password = tempKey;
                    EncryptionAES.iv       = tempIV;
                    //Create(password);
                    //Response r = Login(password);
                    //while (r.Success == false)
                    //{
                    //    Console.Write("Enter AES encryption key: ");
                    //    tempKey = Console.ReadLine();
                    //    Console.Write("Enter AES IV: ");
                    //    tempIV = Console.ReadLine();
                    //    Console.Write("Enter Password: "******"true"); //Sending database public key to webserver in plain

                        await sw.FlushAsync();

                        break;
                    }
                    else
                    {
                        CustomAPI.logging("Incorrect encryption key or IV entered");
                    }
                }

                if (!auth_bypass)
                {
                    bool wsPublicKeyRetrieved = false;

                    string password = "******";

                    int    rsaKeySize   = 1024;
                    string dbPublicKey  = null;
                    string dbPrivateKey = null;
                    string wsPublicKey  = null;

                    //bool proceed = true;

                    //if (!proceed)
                    //{
                    //    return;
                    //}

                    while (true)
                    {
                        //TODO: Authentication between servers

                        if (!wsPublicKeyRetrieved)
                        {
                            try
                            {
                                Console.WriteLine("Generating a {0} size key ...", rsaKeySize);
                                EncryptionRSA.GenerateKeys(rsaKeySize, out dbPublicKey, out dbPrivateKey);
                                await sw.WriteLineAsync(dbPublicKey); //Sending database public key to webserver in plain

                                await sw.FlushAsync();

                                wsPublicKey = sr.ReadLine();
                                Console.WriteLine("Webserver public key received");
                                wsPublicKeyRetrieved = true;
                            }
                            catch (Exception e)
                            {
                                CustomAPI.logging(e.Message);
                                wsPublicKeyRetrieved = false;
                            }
                        }
                        else if (!keyExchanged)
                        {
                            using (ECDiffieHellmanCng ecd = new ECDiffieHellmanCng())
                            {
                                ecd.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;

                                ecd.KeySize       = 256;
                                ecd.HashAlgorithm = CngAlgorithm.Sha256;

                                tempKey = ecd.PublicKey.ToByteArray();   //Generate shared secret key
                                string encryptTempKey = EncryptionRSA.Encrypt(Convert.ToBase64String(tempKey), rsaKeySize, wsPublicKey);
                                await sw.WriteLineAsync(encryptTempKey); //Sending database temp key to webserver server

                                await sw.FlushAsync();

                                string encryptedWsTempKey = sr.ReadLine(); //Retrieve webserver temp key
                                byte[] wsTempKey          = Convert.FromBase64String(EncryptionRSA.Decrypt(encryptedWsTempKey, rsaKeySize, dbPrivateKey));

                                masterKey = ecd.DeriveKeyMaterial(CngKey.Import(wsTempKey, CngKeyBlobFormat.EccPublicBlob));
                                CustomAPI.readContent(masterKey);
                                Console.Write("Master Key Generated");

                                iv           = Convert.FromBase64String(sr.ReadLine()); //IV Generated from webserver set to here
                                keyExchanged = true;
                            }
                        }
                        else
                        {
                            break; //Configuration between servers have been completed
                        }
                    }
                }
                if (keyExchanged)
                {
                    ListeningToClient(sr, sw);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                if (client != null)
                {
                    client.Close();
                }
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Webserver attempts to connect to the database
        /// </summary>
        public static void RegisterDataAccess()
        {
            //TODO: Key exchange between database server and webserver
            try
            {
                client       = new TcpClient("127.0.0.1", 3351);
                sr           = new StreamReader(client.GetStream(), Encoding.UTF8, true, BUFFER_SIZE);
                sw           = new StreamWriter(client.GetStream(), Encoding.UTF8, BUFFER_SIZE);
                sw.AutoFlush = true;

                Debug.WriteLine("Waiting for database server");
                bool proceed = false;
                while (!proceed)
                {
                    proceed = Convert.ToBoolean(sr.ReadLine());
                    Debug.WriteLine("WAITING");
                }


                if (!auth_bypass)
                {
                    bool dbPublicKeyRetrieved = false;
                    bool keyExchanged         = false;

                    string password = "******"; //Key in from user

                    int    rsaKeySize   = 1024;
                    string wsPublicKey  = null;
                    string wsPrivateKey = null;
                    string dbPublicKey  = null;


                    while (true)
                    {
                        //TODO: Authentication between servers
                        if (!dbPublicKeyRetrieved)
                        {
                            Debug.WriteLine("Generating a {0} size key", rsaKeySize);
                            EncryptionRSA.GenerateKeys(rsaKeySize, out wsPublicKey, out wsPrivateKey);
                            sw.WriteLine(wsPublicKey); //Sending database public key to webserver in plain
                            sw.Flush();
                            dbPublicKey          = sr.ReadLine();
                            dbPublicKeyRetrieved = true;
                        }
                        else if (!keyExchanged)
                        {
                            using (ECDiffieHellmanCng ecd = new ECDiffieHellmanCng())
                            {
                                ecd.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;

                                ecd.KeySize       = 256;
                                ecd.HashAlgorithm = CngAlgorithm.Sha256;

                                tempKey = ecd.PublicKey.ToByteArray(); //Generate shared secret key
                                string encryptTempKey = EncryptionRSA.Encrypt(Convert.ToBase64String(tempKey), rsaKeySize, dbPublicKey);
                                sw.WriteLine(encryptTempKey);          //Sending database temp key to webserver server
                                sw.Flush();

                                string encryptDbTempKey = sr.ReadLine(); //Retrieve webserver temp key
                                byte[] dbTempKey        = Convert.FromBase64String(EncryptionRSA.Decrypt(encryptDbTempKey, rsaKeySize, wsPrivateKey));

                                masterKey = ecd.DeriveKeyMaterial(CngKey.Import(dbTempKey, CngKeyBlobFormat.EccPublicBlob));
                                CustomAPI.readContent(masterKey);
                                Debug.WriteLine("Master Key Generated");

                                //Generate an new IV
                                using (Aes aes = new AesCryptoServiceProvider())
                                {
                                    iv = aes.IV;
                                }

                                sw.WriteLine(Convert.ToBase64String(iv));
                                sw.Flush();
                                keyExchanged = true;
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                sw.AutoFlush = false;
            }
            catch (Exception e)
            {
                CustomAPI.logging(e.Message);
            }
        }