Esempio n. 1
0
        private async Task AuthenticateUserCommandAsync(Stream stream)
        {
            try
            {
                var form   = SerializerF.Deserialize <IAuthenticationForm>(stream, false);
                var result = new ResultOfOperation();
                OfflineMessagesConcurent mess;
                var formAuthed = await Core.AuthenticateUserAsync(form, CryptoFactoryF, ChoosenCrypto, result).ConfigureAwait(false);

                var resultCust = new CurrentResult <OfflineMessagesConcurentSur>(result)
                {
                    Result = (OfflineMessagesConcurentSur)formAuthed.Item2
                };
                if (result.OperationWasFinishedSuccessful)
                {
                    Form       = formAuthed.Item1;
                    UserIsAuth = true;
                }
                await ReturnResultToClientAsync(resultCust, true).ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                var result = new ResultOfOperation()
                {
                    ErrorMessage = "Во время выполнения команды, по аутентификации," +
                                   " произошла непредвиденная ошибка."
                };
                await ReturnResultToClientAsync(result, UserIsAuth).ConfigureAwait(false);
            }
        }
Esempio n. 2
0
        private async Task FinedUserCommandAsync(Stream stream)
        {
            try
            {
                if (UserIsAuth)
                {
                    var strName = SerializerF.Deserialize <string>(stream, false);
                    var forms   = await Core.FinedUserAsync(strName, Form.Login).ConfigureAwait(false);

                    var result = new CurrentResult <ICollection <UserFormSurrogate> >()
                    {
                        OperationWasFinishedSuccessful = true,
                        Result = forms
                    };
                    await ReturnResultToClientAsync(result, true).ConfigureAwait(false);
                }
                else
                {
                    await SendResultWithError(1, 1, false).ConfigureAwait(false);
                }
            }
            catch (Exception ex)
            {
                var result = new ResultOfOperation()
                {
                    ErrorMessage = "Во время выполнения команды, по нахождению пользователя по логину," +
                                   " произошла непредвиденная ошибка."
                };
                await ReturnResultToClientAsync(result, UserIsAuth).ConfigureAwait(false);
            }
        }
Esempio n. 3
0
        private async Task GetPublicKeyCommandAsync()
        {
            try
            {
                var encAss          = CryptoFactoryF.CreateAsymmetricAlgoritm(ChoosenCrypto.Provider, ChoosenCrypto.Asymmetric);
                var keyPublic       = encAss.Export(false);
                var resultForClient = new CurrentResult <byte[]>()
                {
                    OperationWasFinishedSuccessful = true,
                    Result = keyPublic
                };
                await ReturnResultToClientAsync(resultForClient, false).ConfigureAwait(false);

                AsymmetricDecrypterF = encAss;
            }
            catch (Exception ex)
            {
                var result = new ResultOfOperation()
                {
                    ErrorMessage =
                        "Во время выполнения операции получения открытого ключа, возникла непредвиденная ошибка."
                };
                await ReturnResultToClientAsync(result, false).ConfigureAwait(false);
            }
        }
Esempio n. 4
0
        private async Task GetSessionKey(Stream stream)
        {
            try
            {
                Tuple <ICryptoTransform, ICryptoTransform, KeyDataForSymmetricAlgorithm> encSym =
                    CryptoFactoryF.CreateSymmetricAlgoritm(ChoosenCrypto.Provider, ChoosenCrypto.Symmetric);
                var resultForClient = new CurrentResult <KeyDataForSymmetricAlgorithm>()
                {
                    OperationWasFinishedSuccessful = true,
                    Result = encSym.Item3
                };
                await ReturnResultToClientAsync(resultForClient, true).ConfigureAwait(false);

                EncrypterF = encSym.Item1;
                DecryptorF = encSym.Item2;
            }
            catch (Exception ex)
            {
                var result = new ResultOfOperation()
                {
                    ErrorMessage =
                        "Во время выполнения операции получения сессионного ключа, возникла непредвиденная ошибка."
                };
                await ReturnResultToClientAsync(result, true).ConfigureAwait(false);
            }
        }
Esempio n. 5
0
        public override Task TextMessageRecieved(string login, string message, ResultOfOperation result,
                                                 ContactForm form = null,
                                                 bool userIsAuth  = true)
        {
            try
            {
                if (!userIsAuth)
                {
                    result.OperationWasFinishedSuccessful = false;
                    result.ErrorMessage = "Аутентификация не была проведена.";
                    return(Task.CompletedTask);
                }
                if (form == null)
                {
                    form = ContactsF.First(userForm => userForm.Login.Equals(login));
                }

                var args = new TextMessageRecievedEventArgs()
                {
                    Message = message, Contact = form
                };
                result.OperationWasFinishedSuccessful = true;
                return(OnTextMessageRecieved(args));
            }
            catch (InvalidOperationException ex)
            {
                result.OperationWasFinishedSuccessful = false;
                result.ErrorMessage = "Пользователь не зарегистрирован.";
                return(Task.CompletedTask);
            }
        }
Esempio n. 6
0
        public override Tuple <bool, ContactForm> AuthenticateContacnt(ClientToClientAuthForm authForm, CryptoFactoryBase factory, IPEndPoint endPoint,
                                                                       IEnumerable <ContactForm> publicForms,
                                                                       ResultOfOperation resultOfOperation)
        {
            var neededUsers = publicForms.Where(form => form.Login.Equals(authForm.Login)).ToArray();

            if (neededUsers.Length != 1)
            {
                resultOfOperation.ErrorMessage = "Пользователь с таким именем не зарегистрирован.";
                resultOfOperation.OperationWasFinishedSuccessful = true;
                return(new Tuple <bool, ContactForm>(resultOfOperation.OperationWasFinishedSuccessful, null));
            }

            var neededUser = neededUsers[0];

            if (!endPoint.Address.Equals(neededUser.Ip))
            {
                resultOfOperation.ErrorMessage = "Аутентификация не удалась.";
                resultOfOperation.OperationWasFinishedSuccessful = false;
                return(new Tuple <bool, ContactForm>(resultOfOperation.OperationWasFinishedSuccessful, null));
            }

            if (!authForm.ValidateSign(factory, neededUser.PublicKey))
            {
                resultOfOperation.ErrorMessage = "Аутентификация не удалась. Не удалось подтвердить подлинность подписи.";
                resultOfOperation.OperationWasFinishedSuccessful = false;
                return(new Tuple <bool, ContactForm>(resultOfOperation.OperationWasFinishedSuccessful, null));
            }

            resultOfOperation.OperationWasFinishedSuccessful = true;
            return(new Tuple <bool, ContactForm>(resultOfOperation.OperationWasFinishedSuccessful, neededUser));
        }
Esempio n. 7
0
        //public override async Task<Tuple<bool, ContactForm>> RegisterNewContactAsync(string login, IPEndPoint endPoint,
        //    IEnumerable<ContactForm> formsPublic,
        //    ResultOfOperation resultOfOperation)
        //{
        //    try
        //    {
        //        var forms = formsPublic as ContactForm[] ?? formsPublic.ToArray();
        //        Tuple<bool, ContactForm> authResult = AuthenticateContacnt(login, endPoint, forms, resultOfOperation);
        //        if (authResult.Item1)
        //        {
        //            var form = forms.First(userForm => userForm.Login.Equals(login));
        //            var args = new RegisterNewContactEventArgs {Ip = endPoint.Address, Login = login};
        //            await OnRegisterNewContact(args).ConfigureAwait(false);
        //            if (args.IsAllow)
        //                ContactsF.Add(form);
        //            resultOfOperation.OperationWasFinishedSuccessful = true;
        //        }
        //        return authResult;
        //    }
        //    catch (InvalidOperationException ex)
        //    {
        //        resultOfOperation.OperationWasFinishedSuccessful = false;
        //        resultOfOperation.ErrorMessage = "Пользователь не зарегистрирован на внешнем сервере.";
        //        return new Tuple<bool, ContactForm>(false, null);
        //    }

        //}
        public override async Task <bool> RegisterNewContactAsync(ContactForm form, IPEndPoint endPoint,
                                                                  ResultOfOperation resultOfOperation)
        {
            try
            {
                var args = new RegisterNewContactEventArgs {
                    Ip = endPoint.Address, Login = form.Login
                };
                await OnRegisterNewContact(args).ConfigureAwait(false);

                if (args.IsAllow)
                {
                    ContactsF.Add(form);
                    resultOfOperation.OperationWasFinishedSuccessful = true;
                }
                else
                {
                    resultOfOperation.OperationWasFinishedSuccessful = false;
                    resultOfOperation.ErrorMessage = "Пользователь отверг запрос на авторизацию.";
                }
                return(resultOfOperation.OperationWasFinishedSuccessful);
            }
            catch (Exception ex)
            {
                throw;
            }
        }
Esempio n. 8
0
 private Task SendOfflineMessageCommandAsync(Stream stream)
 {
     try
     {
         if (UserIsAuth)
         {
             var offlineMessage = SerializerF.Deserialize <OfflineMessageForm>(stream, false);
             var result         = new ResultOfOperation();
             Core.SendOfflineMessage(offlineMessage, Form, result);
             return(ReturnResultToClientAsync(result, true));
         }
         else
         {
             return(SendResultWithError(1, 1, false));
         }
     }
     catch (SerializationException ex)
     {
         return(SendResultWithError(1, 0, true));
     }
     catch (Exception)
     {
         return(SendResultWithError(1, 2, true));
     }
 }
Esempio n. 9
0
 private Task UpdateUserDataCommandAsync(Stream stream)
 {
     try
     {
         if (UserIsAuth)
         {
             var formNew = SerializerF.Deserialize <UserForm>(stream, false);
             var result  = new ResultOfOperation();
             Core.UpdateUserData(ref formNew, result);
             Form = formNew;
             return(ReturnResultToClientAsync(result, true));
         }
         else
         {
             return(SendResultWithError(1, 1, false));
         }
     }
     catch (Exception)
     {
         var result = new ResultOfOperation()
         {
             ErrorMessage = "Во время выполнения команды, об отправке offline сообщения," +
                            " произошла непредвиденная ошибка."
         };
         return(ReturnResultToClientAsync(result, UserIsAuth));
     }
 }
        public ResultOfOperation UpdateInDataBase(ClassUsers user)
        {
            var result = new ResultOfOperation(false);

            try
            {
                using (var db = new Entities())
                {
                    var DBRow = db.PaidByUsTransaction.FirstOrDefault(x => x.Id == this.Id);
                    if (DBRow == null) //create new
                    {
                        DBRow = new Entity_Framework.PaidByUsTransaction();
                        db.PaidByUsTransaction.Add(DBRow);

                        DBRow.CreatedBy       = user.WorkerClockId;
                        DBRow.CreatedDateTime = DateTime.Now;
                        var log = PaidByUsCreditCardTransactionLog.First();
                        db.PaidByUsCreditCardTransactionLog.Add(log);
                        log.PaidByUsTransaction   = DBRow;
                        DBRow.OriginalAmount      = this.OriginalAmount;
                        DBRow.CustomerName        = this.CustomerName;
                        DBRow.BackOfficeCompany   = this.BackOfficeCompany;
                        DBRow.BillingAmount       = this.BillingAmount;
                        DBRow.BillingCurrencyCode = this.BillingCurrencyCode;
                        DBRow.Id                   = this.Id;
                        DBRow.Item                 = this.Item;
                        DBRow.ModifiedBy           = this.ModifiedBy;
                        DBRow.ModifiedDateTime     = this.ModifiedDateTime;
                        DBRow.OriginalCurrencyCode = this.OriginalCurrencyCode;
                        DBRow.Status               = this.Status;
                        DBRow.SupplierAccountNum   = this.SupplierAccountNum;
                        DBRow.SupplierName         = this.SupplierName;
                        DBRow.TripNumber           = this.TripNumber;
                    }
                    else //update
                    {
                        DBRow.ModifiedBy       = user.WorkerClockId;
                        DBRow.ModifiedDateTime = DateTime.Now;
                        foreach (var log in PaidByUsCreditCardTransactionLog)
                        {
                            var logDBRow = db.PaidByUsCreditCardTransactionLog.FirstOrDefault(x => x.id == log.id);
                            if (logDBRow != null)
                            {
                                logDBRow.Active = log.Active;
                            }
                        }
                    }
                    DBRow.Status = this.Status;
                    db.SaveChanges();
                    this.Id        = DBRow.Id;
                    result.Success = true;
                }
            }
            catch (Exception ex)
            {
                result.Message = ex.Message;
            }
            return(result);
        }
        private ResultOfOperation CreateResultWithError(uint numb, ResultOfOperation result, params object[] objs)
        {
            result.OperationWasFinishedSuccessful = false;
            var strBuilder = new StringBuilder();
            var innerNumb  = 0;

            switch (numb)
            {
            case 0:
                #region RegisterNewUserAsync(UserForm form, string ip, ResultOfOperation resultOfOperation)
                innerNumb = (int)objs[0];
                switch (innerNumb)
                {
                case 0:
                    strBuilder.Append($"Пользователь с именем {objs[1]} уже существует.");
                    break;

                case 1:
                    strBuilder.Append("Информация для осуществления симметричного шифрования не была задана.");
                    break;

                case 2:
                    strBuilder.Append(
                        "Информация для осуществления симметричного шифрования задана не полностью.");
                    break;

                case 3:
                    strBuilder.Append(
                        "Не удалось осуществить запись в базу дынных. Возможно стоит повторить запрос.");
                    break;

                case 4:
                    strBuilder.Append(
                        "Не удалось осуществить запись в базу дынных. Ошибка ввода/вывода.");
                    break;

                case 5:
                    strBuilder.Append(
                        "Не удалось осуществить запись в базу дынных. Ошибка сериализации.");
                    break;

                case 6:
                    strBuilder.Append(
                        "Во время регистрации клиента возникла непредвиденная ошибка.");
                    break;
                }
                #endregion
                break;
            }
            result.ErrorMessage = strBuilder.ToString();
            return(result);
        }
Esempio n. 12
0
        public ResultOfOperation ReplaceCard(PaidByUsTransactionDTO transaction, ClassUsers user, int cause)
        {
            var      creditcard        = new CreditCard();
            var      transactionLog    = new PaidByUsCreditCardTransactionLog();
            var      resultOfOperation = new ResultOfOperation();
            Entities dblog             = new Entities();

            var activeLog = dblog.PaidByUsCreditCardTransactionLog.FirstOrDefault(x => x.PaidByUsTransactionId == transaction.Id && x.Active.Value == true);

            if (activeLog == null)
            {
                resultOfOperation.Message = "Active Log Not found";
            }
            else
            {
                activeLog.ReplacementCause = cause;
                dblog.SaveChanges();
                try
                {
                    using (Entities db = new Entities())
                    {
                        var lasttransactionLog = db.PaidByUsCreditCardTransactionLog.FirstOrDefault(x => x.id == activeLog.id);
                        if (lasttransactionLog == null)
                        {
                            resultOfOperation.Message = "Active Log Not found in DB: " + activeLog.id;
                        }
                        else
                        {
                            lasttransactionLog.Active           = false;
                            lasttransactionLog.ReplacementCause = cause;
                            creditcard = ApllyGetCardAlgorithm(user.WorkerClockId, transaction);
                            //transactionLog.ImageName = creditcard.ComputeHashForImage();
                            transactionLog.Active = true;
                            transactionLog.PaidByUsTransactionId = transaction.Id;
                            transactionLog.CreditCardRecId       = creditcard.RecId;
                            //DB Operations
                            db.PaidByUsCreditCardTransactionLog.Add(transactionLog);
                            db.SaveChanges();
                            transaction.UpdateInDataBase(user);
                            resultOfOperation.Additional = transaction.Id.ToString();
                            resultOfOperation.Success    = true;
                        }
                    }
                }
                catch (Exception e)
                {
                    resultOfOperation.Success = false;
                    resultOfOperation.Message = e.Message;
                }
            }
            return(resultOfOperation);
        }
Esempio n. 13
0
        public override async Task <bool> RecieveOfFileTransferRequest(FileRecieveRequest request, IPEndPoint endPoint, ContactForm contact,
                                                                       ResultOfOperation result)
        {
            var args = new RecieveOfFileTransferRequestEventArgs()
            {
                FileName = request.Name,
                Login    = contact.Login,
                Ip       = endPoint.Address,
                Length   = request.Length
            };

            await OnFileReciveBegining(args).ConfigureAwait(false);

            var remoteFile = args.RemoteFileStream;

            if (args.IsAllow)
            {
                if (remoteFile == null)
                {
                    var dirFull = DirForFileSaving + @"\" + request.Name;
                    var stream  = new FileStream(dirFull, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
                    await Task.Run(() => stream.SetLength(request.Length)).ConfigureAwait(false);

                    MoleClientSender sender;
                    if (!Senders.TryGetValue(contact.Login, out sender))
                    {
                        sender = new MoleClientSender(contact, PossibleAlgs, this, true);
                        Senders.TryAdd(contact.Login, sender);
                    }
                    await sender.Inicialize(endPoint).ConfigureAwait(false);

                    await sender.GetSessionKey().ConfigureAwait(false);

                    await sender.AuthenticateAsync().ConfigureAwait(false);

                    remoteFile = new RemoteFileStreamMole(sender, stream, request.Name);
                    await remoteFile.InitializeAsync().ConfigureAwait(false);
                }

                await
                OnFileRecievingPrepared(new FileRecievingPreparedEventArgs(request.Name, request.Length, remoteFile))
                .ConfigureAwait(false);

                result.OperationWasFinishedSuccessful = true;
                return(true);
            }
            result.ErrorMessage = "Пользователь отказался принять файл.";
            result.OperationWasFinishedSuccessful = false;
            return(false);
        }
 protected virtual bool ValidateUserFormForRegistration(UserForm form, ResultOfOperation resultOfOperation)
 {
     if (string.IsNullOrEmpty(form.Login))
     {
         resultOfOperation.ErrorMessage = "Поле Login является пустой строкой или равно null.";
         resultOfOperation.OperationWasFinishedSuccessful = false;
         return(false);
     }
     if (form.KeyParametrsBlob == null || form.KeyParametrsBlob.Key.Length == 0)
     {
         resultOfOperation.ErrorMessage = "Поле KeyParametrsBlob является пустым массивом байтов или равно null.";
         resultOfOperation.OperationWasFinishedSuccessful = false;
         return(false);
     }
     if (string.IsNullOrEmpty(form.Password))
     {
         resultOfOperation.ErrorMessage = "Поле Password является пустой строкой или равно null.";
         resultOfOperation.OperationWasFinishedSuccessful = false;
         return(false);
     }
     if (form.PortClientToClient1 < 50)
     {
         resultOfOperation.ErrorMessage = "Значение поля PortClientToClient1 является недопустимым.";
         resultOfOperation.OperationWasFinishedSuccessful = false;
         return(false);
     }
     if (form.PortClientToClient2 < 50)
     {
         resultOfOperation.ErrorMessage = "Значение поля PortClientToClient2 является недопустимым.";
         resultOfOperation.OperationWasFinishedSuccessful = false;
         return(false);
     }
     if (form.PortClientToClient3 < 50)
     {
         resultOfOperation.ErrorMessage = "Значение поля PortClientToClient3 является недопустимым.";
         resultOfOperation.OperationWasFinishedSuccessful = false;
         return(false);
     }
     if (form.PortServerToClient < 50)
     {
         resultOfOperation.ErrorMessage = "Значение поля PortServerToClient является недопустимым.";
         resultOfOperation.OperationWasFinishedSuccessful = false;
         return(false);
     }
     return(true);
 }
        /// <exception cref="ArgumentNullException">form == null. -или- resultOfOperation == null.</exception>
        public override bool UpdateUserData(ref UserForm form, ResultOfOperation resultOfOperation)
        {
            if (form == null)
            {
                throw new ArgumentNullException(nameof(form))
                      {
                          Source = GetType().AssemblyQualifiedName
                      }
            }
            ;
            if (resultOfOperation == null)
            {
                throw new ArgumentNullException(nameof(resultOfOperation))
                      {
                          Source = GetType().AssemblyQualifiedName
                      }
            }
            ;

            if (!ValidateUserFormForRegistration(form, resultOfOperation))
            {
                return(false);
            }

            try
            {
                var form1   = form;
                var oldForm = UsersF.Users.First(registrationForm => registrationForm.Login.Equals(form1.Login));
                oldForm.Update(form1);
                UsersF.SaveChanges();
                form = form1;
                resultOfOperation.OperationWasFinishedSuccessful = true;
                return(true);
            }
            catch (InvalidOperationException)
            {
                resultOfOperation.ErrorMessage = "Пользователь с таким именем не найден.";
                resultOfOperation.OperationWasFinishedSuccessful = false;
                return(false);
            }
        }
Esempio n. 16
0
        private ResultOfOperation CheckCryptoInfo(CryptoInfo cryptoInfo)
        {
            var CryptoPossible = Core.PossibleCryptoInfo;
            var messError      = "";

            if (!CryptoPossible.Asymmetric.Contains(cryptoInfo.Asymmetric))
            {
                messError = $"Не был найден ассиметричный алгоритм с таким названием {cryptoInfo.Asymmetric}.";
            }
            if (!CryptoPossible.Hash.Contains(cryptoInfo.Hash))
            {
                messError = $"Не был найден алгоритм хеширования с таким названием {cryptoInfo.Hash}.";
            }
            if (!CryptoPossible.Providers.Contains(cryptoInfo.Provider))
            {
                messError = $"Не был найден крипто провайдер с таким названием {cryptoInfo.Provider}.";
            }
            if (!CryptoPossible.Sign.Contains(cryptoInfo.Sign))
            {
                messError = $"Не был найден алгоритм цифровой подписи с таким названием {cryptoInfo.Sign}.";
            }
            if (!CryptoPossible.Symmetric.Contains(cryptoInfo.Symmetric))
            {
                messError = $"Не был найден симметричный алгоритм с таким названием {cryptoInfo.Symmetric}.";
            }

            var result = new ResultOfOperation();

            if (messError != "")
            {
                result.ErrorMessage = messError;
            }
            else
            {
                result.OperationWasFinishedSuccessful = true;
            }
            return(result);
        }
Esempio n. 17
0
 private async Task RegisterNewUserCommandAsync(Stream stream)
 {
     try
     {
         var form = SerializerF.Deserialize <UserForm>(stream, false);
         form.Ip = ((IPEndPoint)ClientF.Client.RemoteEndPoint).Address;
         var result = new ResultOfOperation();
         if (await Core.RegisterNewUserAsync(form, RemoteEndPoint.Address, result).ConfigureAwait(false))
         {
             Form       = form;
             UserIsAuth = true;
         }
         await ReturnResultToClientAsync(result, true).ConfigureAwait(false);
     }
     catch (Exception ex)
     {
         var result = new ResultOfOperation()
         {
             ErrorMessage =
                 "Во время выполнения команды, регистрации нового пользователя, возникла непредвиденная ошибка."
         };
         await ReturnResultToClientAsync(result, false).ConfigureAwait(false);
     }
 }
Esempio n. 18
0
        public ResultOfOperation CreateNewTransaction(PaidByUsTransactionDTO transaction, ClassUsers user)
        {
            var creditcard        = new CreditCard();
            var resultOfOperation = new ResultOfOperation();

            try
            {
                transaction.Status = (int)Amsalem.Types.Status.Pending;
                //Credit Card Operations
                creditcard = ApllyGetCardAlgorithm(user.WorkerClockId, transaction);

                //TransactionLog Initial
                var transactionLog = new PaidByUsCreditCardTransactionLog();
                transactionLog.Active = true;
                //transactionLog.PaidByUsTransactionId = transaction.Id;
                transactionLog.CreditCardRecId = creditcard.RecId;

                transaction.PaidByUsCreditCardTransactionLog = new List <PaidByUsCreditCardTransactionLog>();

                transaction.PaidByUsCreditCardTransactionLog.Add(transactionLog);

                //DB Operations
                transaction.UpdateInDataBase(user);

                resultOfOperation.Additional = transaction.Id.ToString();
                resultOfOperation.Success    = true;
            }

            catch (Exception e)
            {
                resultOfOperation.Success     = false;
                resultOfOperation.Additional4 = e.Message;
            }

            return(resultOfOperation);
        }
        //public override UserForm GetPublicKey()
        //{
        //    var formNew = new UserForm();
        //    if (CryptoProvider == CryptoProvider.CngMicrosoft)
        //    {
        //        if (AsymmetricAlgorithm is RSACng)
        //        {
        //            var rsa = (RSACng) AsymmetricAlgorithm;
        //            //var cngKeyBlob = rsa.Key.Export(CngKeyBlobFormat.GenericPublicBlob);
        //            var key = rsa.ExportParameters(false);
        //            var cngKeyBlob = Serializer.Serialize(key, false);
        //            formNew = new UserForm()
        //            {
        //                CryptoProvider = CryptoProvider.CngMicrosoft,
        //                PublicKeyParamsBlob = cngKeyBlob
        //            };
        //        }
        //    }
        //    return formNew;

        //}
        ///// <exception cref="ArgumentNullException">form == null. -или- resultOfOperation == null.</exception>
        //public override UserForm AuthenticateUser(UserForm form, out IEnumerable<byte[]> messages,
        //    ResultOfOperation resultOfOperation)
        //{
        //    if (form == null)
        //        throw new ArgumentNullException(nameof(form)) { Source = GetType().AssemblyQualifiedName };
        //    if (resultOfOperation == null)
        //        throw new ArgumentNullException(nameof(resultOfOperation)) { Source = GetType().AssemblyQualifiedName };

        //    messages = new byte[0][];
        //    var formWasFinded = UsersF.FirstOrDefault((registrationForm => registrationForm.Login.Equals(form.Login)));
        //    var KeyBlob = formWasFinded.SignPublicKeyBlob;
        //    if (KeyBlob == null)
        //    {
        //        resultOfOperation.ErrorMessage = "Пользователь не зарегистрирован.";
        //        resultOfOperation.OperationWasFinishedSuccessful = false;
        //        return null;
        //    }
        //    form.SignPublicKeyBlob = KeyBlob;

        //    if (!form.ValidateSign(false, resultOfOperation))
        //        return null;

        //    if (OfflineMessagesF.ContainsKey(form.Login))
        //        messages = OfflineMessagesF[form.Login].MessagesAsBytes.ToArray();

        //    return form;
        //}
        /// <exception cref="ArgumentNullException">form == null. -или- resultOfOperation == null.</exception>
        public override async Task <Tuple <UserFormSurrogate, OfflineMessagesConcurent> > AuthenticateUserAsync(IAuthenticationForm formAuth,
                                                                                                                CryptoFactoryBase cryptoFactory, CryptoInfo choosenCrypto, ResultOfOperation resultOfOperation)
        {
            if (formAuth == null)
            {
                throw new ArgumentNullException(nameof(formAuth))
                      {
                          Source = GetType().AssemblyQualifiedName
                      }
            }
            ;
            if (resultOfOperation == null)
            {
                throw new ArgumentNullException(nameof(resultOfOperation))
                      {
                          Source = GetType().AssemblyQualifiedName
                      }
            }
            ;

            //messages = null;
            try
            {
                //var formWasFinded = UsersF.First(registrationForm => registrationForm.Login.Equals(formAuth.Login));
                var formWasFinded =
                    await
                    UsersF.Users.FirstAsync(registrationForm => registrationForm.Login == formAuth.Login)
                    .ConfigureAwait(false);

                switch (formAuth.AuthenticationMethod)
                {
                case AuthenticationMethod.Classic:
                    var formClassicAuth = formAuth as IAuthenticationFormClassic;
                    if (formClassicAuth == null)
                    {
                        throw new InvalidCastException("Преобразование из типа IAuthenticationForm в тип " +
                                                       "IAuthenticationFormClassic завершилось с ошибкой.")
                              {
                                  Source = GetType().AssemblyQualifiedName
                              }
                    }
                    ;
                    var hashAlg        = cryptoFactory.CreateHashAlgorithm(choosenCrypto.Provider, formClassicAuth.HashAlgotitm);
                    var hashOfTruePass = hashAlg.ComputeHash(Encoding.UTF8.GetBytes(formWasFinded.Password));
                    if (hashOfTruePass.SequenceEqual(formClassicAuth.HashOfPassword))
                    {
                        resultOfOperation.OperationWasFinishedSuccessful = true;
                    }
                    else
                    {
                        resultOfOperation.ErrorMessage = "Правильность пароля под сомнением?";
                        resultOfOperation.OperationWasFinishedSuccessful = false;
                    }
                    break;

                case AuthenticationMethod.Sign:
                    var formSignAuth = formAuth as IAuthenticationFormSign;
                    if (formSignAuth == null)
                    {
                        throw new InvalidCastException("Преобразование из типа IAuthenticationForm в тип " +
                                                       "IAuthenticationFormSign завершилось с ошибкой.")
                              {
                                  Source = GetType().AssemblyQualifiedName
                              }
                    }
                    ;
                    var signAlg = cryptoFactory.CreateSignAlgoritm(formSignAuth.CryptoProvider, formSignAuth.SignantureAlgoritmName);
                    //var signAlg = cryptoFactory.CreateSignAlgoritm(choosenCrypto.Provider, formSignAuth.SignantureAlgoritmName);
                    signAlg.Import(formWasFinded.KeyParametrsBlob.Key);
                    if (signAlg.VerifySign(formSignAuth.Hash, formSignAuth.Sign))
                    {
                        resultOfOperation.OperationWasFinishedSuccessful = true;
                    }
                    else
                    {
                        resultOfOperation.ErrorMessage = "Достоверность цифровой подписи под сомнением?";
                        resultOfOperation.OperationWasFinishedSuccessful = false;
                    }
                    break;
                }
                OfflineMessagesConcurent messages;
                OfflineMessagesF.TryRemove(formWasFinded.Login, out messages);
                if (messages == null)
                {
                    messages = new OfflineMessagesConcurent(formWasFinded.Login);
                }
                return(new Tuple <UserFormSurrogate, OfflineMessagesConcurent>(formWasFinded, messages));
            }
            catch (InvalidOperationException ex)
            {
                CreateResultWithError(3, resultOfOperation, formAuth.Login);
                return(null);
            }
        }
 /// <exception cref="ArgumentNullException">formOfSender == null. -или- OfflineMessageForm == null. -или-
 /// resultOfOperation == null.</exception>
 public abstract bool SendOfflineMessage(OfflineMessageForm offlineMessage, UserForm formOfSender,
                                         ResultOfOperation resultOfOperation);
        /// <exception cref="ArgumentNullException">formOfSender == null. -или- OfflineMessageForm == null. -или-
        /// resultOfOperation == null.</exception>
        public override bool SendOfflineMessage(OfflineMessageForm offlineMessage, UserForm formOfSender,
                                                ResultOfOperation resultOfOperation)
        {
            if (formOfSender == null)
            {
                throw new ArgumentNullException(nameof(formOfSender))
                      {
                          Source = GetType().AssemblyQualifiedName
                      }
            }
            ;
            if (offlineMessage == null)
            {
                throw new ArgumentNullException(nameof(offlineMessage))
                      {
                          Source = GetType().AssemblyQualifiedName
                      }
            }
            ;
            if (resultOfOperation == null)
            {
                throw new ArgumentNullException(nameof(resultOfOperation))
                      {
                          Source = GetType().AssemblyQualifiedName
                      }
            }
            ;

            try
            {
                var receiver = (UserForm)UsersF.Users.First((form => form.Login == offlineMessage.LoginOfReciever));
                while (true)
                {
                    OfflineMessagesConcurent messages;
                    if (!receiver.ValidateIpAdressesAndPorts(1, false, resultOfOperation))
                    {
                        //OfflineMessagesConcurent messagesConcurentOffline;
                        if (OfflineMessagesF.TryGetValue(receiver.Login, out messages))
                        {
                            if (messages.Count > 50)
                            {
                                resultOfOperation.ErrorMessage = "Кол-во сообщений для офлайн пользователей не может превышать 50.";
                                resultOfOperation.OperationWasFinishedSuccessful = false;
                                return(false);
                            }
                            //messagesConcurentOffline =
                            //    messages.Where(
                            //            offlineMessages => offlineMessages.FormOfSender.Login.Equals(formOfSender.Login))
                            //        .ToArray()[0];

                            //if (messagesConcurentOffline == null)
                            //{
                            //    messagesConcurentOffline = new OfflineMessagesConcurent(formOfSender);
                            //    messages.Add(messagesConcurentOffline);
                            //}
                            messages.Add(formOfSender.Login, offlineMessage.Message);

                            //messagesConcurentOffline.Messages.Add(offlineMessage.Message);
                            resultOfOperation.OperationWasFinishedSuccessful = true;
                            return(true);
                        }
                        else
                        {
                            while (true)
                            {
                                messages = new OfflineMessagesConcurent(offlineMessage.LoginOfReciever);
                                if (OfflineMessagesF.TryAdd(offlineMessage.LoginOfReciever, messages))
                                {
                                    messages.Add(formOfSender.Login, offlineMessage.Message);
                                    break;
                                }
                                else
                                {
                                    if (OfflineMessagesF.TryGetValue(receiver.Login, out messages))
                                    {
                                        messages.Add(formOfSender.Login, offlineMessage.Message);
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        resultOfOperation.ErrorMessage = "Пользователь находится в сети.";
                        resultOfOperation.OperationWasFinishedSuccessful = false;
                        return(false);
                    }
                }
            }
            catch (InvalidOperationException)
            {
                resultOfOperation.ErrorMessage = "Пользователь получатель не зарегистрирован.";
                resultOfOperation.OperationWasFinishedSuccessful = false;
                return(false);
            }
        }
Esempio n. 22
0
        private Task SendResultWithError(int numb, int innerNumb, bool useEnc, params object[] objs)
        {
            ResultOfOperation result = null;
            var str = new StringBuilder();

            switch (numb)
            {
            case 0:
                #region ReadCryptoDataAsync(byte[] bytesEnc, bool useAsymmetricCrypt)
                switch (innerNumb)
                {
                case 0:
                    result = new ResultOfOperation()
                    {
                        ErrorMessage = "Заранее не были определены криптографические алгоритмы."
                    };
                    break;

                case 1:
                    //SendResultWithError(0, 1, 0useAsymmetricCrypt)
                    str.AppendLine("Во время расшифровки сообщения возникла криптографическая ошибка.");
                    str.Append($"Ассиметричное шифрование включено {objs[0]}.");
                    result = new ResultOfOperation()
                    {
                        ErrorMessage = str.ToString()
                    };
                    break;

                case 2:
                    result = new ResultOfOperation()
                    {
                        ErrorMessage =
                            "Были определены криптографические алгоритмы, но не были запрошены ключи."
                    };
                    break;
                }
                #endregion
                break;

            case 1:
                #region SendOfflineMessageCommandAsync(Stream stream)
                switch (innerNumb)
                {
                case 0:
                    result = new ResultOfOperation()
                    {
                        ErrorMessage = "Произошла ошибка во время десеарелизации. Ожидался тип OfflineMessageForm."
                    };
                    break;

                case 1:
                    result = new ResultOfOperation()
                    {
                        ErrorMessage = "Авторизация не была проведена."
                    };
                    break;

                case 2:
                    result = new ResultOfOperation()
                    {
                        ErrorMessage =
                            "При обработке команды на отправку offline сообщения возникла непредвиденная ошибка."
                    };
                    break;
                }
                #endregion
                break;

            case 2:
                #region SetPublicKey(Stream stream)
                switch (innerNumb)
                {
                case 0:
                    result = new ResultOfOperation()
                    {
                        ErrorMessage = "Длина массива байт, представляющая открытый ключ, равна 0."
                    };
                    break;

                case 1:
                    result = new ResultOfOperation()
                    {
                        ErrorMessage = "Не удалось импортировать открытый ключ."
                    };
                    break;
                }
                #endregion
                break;
            }
            if (result == null)
            {
                result = new ResultOfOperation()
                {
                    ErrorMessage = "Не нашлось нормального описания ошибки."
                }
            }
            ;

            return(ReturnResultToClientAsync(result, useEnc));
        }
    }
Esempio n. 23
0
 /// <exception cref="SerializationException"></exception>
 private async Task ReturnResultToClientAsync(ResultOfOperation result, bool useEncryption)
 {
     try
     {
         var    contentForEnc = SerializerF.Serialize(result, false);
         byte[] contentEnc;
         var    useEnc = false;
         if (useEncryption)
         {
             if (EncrypterF == null)
             {
                 if (AsymmetricEncrypterF == null)
                 {
                     contentEnc = contentForEnc;
                 }
                 else
                 {
                     useEnc     = true;
                     contentEnc = await AsymmetricEncrypterF.EncryptAsync(contentForEnc).ConfigureAwait(false);
                 }
             }
             else
             {
                 useEnc     = true;
                 contentEnc = EncrypterF.TransformFinalBlock(contentForEnc, 0, contentForEnc.Length);
             }
         }
         else
         {
             contentEnc = contentForEnc;
         }
         var writer = new BinaryWriter(NetStreamF);
         writer.Write(useEnc);
         writer.Write(contentEnc.Length);
         await NetStreamF.WriteAsync(contentEnc, 0, contentEnc.Length).ConfigureAwait(false);
     }
     catch (SerializationException ex)
     {
         ex.Source = GetType().AssemblyQualifiedName;
         throw;
     }
     catch (CryptographicException ex)
     {
         var result2 = new ResultOfOperation()
         {
             ErrorMessage = "При подготовке к отправке сообщения возникла криптографическая ошибка."
         };
         await ReturnResultToClientAsync(result2, false).ConfigureAwait(false);
     }
     catch (SocketException ex)
     {
     }
     catch (Exception ex)
     {
         var result2 = new ResultOfOperation()
         {
             ErrorMessage = "При подготовке к отправке сообщения возникла непредвиденная ошибка."
         };
         await ReturnResultToClientAsync(result2, false).ConfigureAwait(false);
     }
 }
Esempio n. 24
0
        private Task ReadCommandAndMapAsync(Stream stream)
        {
            Task resultTask = Task.CompletedTask;

            if (stream.Length >= 2) //UInt16 - 2 byte
            {
                //var stream = new MemoryStream(bytesFromSocket);
                using (stream)
                {
                    var readerBin = new BinaryReader(stream);
                    var command   = readerBin.ReadUInt16();
                    switch (command)
                    {
                    case 0:
                        resultTask = GetPublicKeyCommandAsync();
                        break;

                    case 1:
                        resultTask = RegisterNewUserCommandAsync(stream);
                        break;

                    case 2:
                        resultTask = AuthenticateUserCommandAsync(stream);
                        break;

                    case 3:
                        resultTask = SetCryptoAlgs(stream);
                        break;

                    case 4:
                        resultTask = FinedUserCommandAsync(stream);
                        break;

                    case 5:
                        resultTask = UpdateUserDataCommandAsync(stream);
                        break;

                    case 6:
                        resultTask = SendOfflineMessageCommandAsync(stream);
                        break;

                    case 7:
                        resultTask = GetSessionKey(stream);
                        break;

                    case 8:
                        resultTask = GetPossibleCryptoAlgs();
                        break;

                    case 9:
                        resultTask = SetPublicKey(stream);
                        break;

                    default:
                        var result = new ResultOfOperation()
                        {
                            ErrorMessage = "Команды с таким номером не существует."
                        };
                        resultTask = ReturnResultToClientAsync(result, false);
                        //var resultAsBytes = SerializerF.Serialize(result);
                        //resultTask = NetStreamF.WriteAsync(resultAsBytes, 0, resultAsBytes.Length);
                        break;
                    }
                }
            }
            else
            {
                var result = new ResultOfOperation()
                {
                    ErrorMessage = "Команда для сервера не задана."
                };
                resultTask = ReturnResultToClientAsync(result, false);
                //var resultAsBytes = SerializerF.Serialize(result);
                //resultTask = NetStreamF.WriteAsync(resultAsBytes, 0, resultAsBytes.Length);
            }
            return(resultTask);
        }
 /// <exception cref="ArgumentNullException">form == null. -или- resultOfOperation == null.</exception>
 public abstract bool UpdateUserData(ref UserForm form, ResultOfOperation resultOfOperation);
 public bool VerifyPassword(string password, ResultOfOperation resultOfOperation)
 {
     throw new NotImplementedException();
 }
 ///// <exception cref="ArgumentNullException">form == null. -или- ip == null. -или- resultOfOperation == null.</exception>
 ///// <exception cref="ArgumentOutOfRangeException">Строка не является ip адресом.</exception>
 //public abstract bool RegisterNewUser(UserForm form, IPAddress ip, ResultOfOperation resultOfOperation);
 /// <exception cref="ArgumentNullException">form == null. -или- ip == null. -или- resultOfOperation == null.</exception>
 /// <exception cref="ArgumentOutOfRangeException">Строка не является ip адресом.</exception>
 public abstract Task <bool> RegisterNewUserAsync(UserForm form, IPAddress ip,
                                                  ResultOfOperation resultOfOperation);
        ///// <exception cref="ArgumentNullException">form == null. -или- ip == null. -или- resultOfOperation == null.</exception>
        ///// <exception cref="ArgumentOutOfRangeException">Строка не является ip адресом.</exception>
        //public override bool RegisterNewUser(UserForm form, IPAddress ip, ResultOfOperation resultOfOperation)
        //{
        //    if (form == null)
        //        throw new ArgumentNullException(nameof(form)) {Source = GetType().AssemblyQualifiedName};
        //    if (form.Login == null)
        //        throw new ArgumentNullException(nameof(form.Login));
        //    if (ip == null)
        //        throw new ArgumentNullException(nameof(ip)) {Source = GetType().AssemblyQualifiedName};
        //    if (resultOfOperation == null)
        //        throw new ArgumentNullException(nameof(resultOfOperation)) { Source = GetType().AssemblyQualifiedName };
        //    //IPAddress address;
        //    //if (!IPAddress.TryParse(ip, out address))
        //    //    throw new ArgumentOutOfRangeException(nameof(ip), "Строка не является ip адресом.")
        //    //{
        //    //    Source = GetType().AssemblyQualifiedName
        //    //};

        //    if (UsersF.Where((info => info.Login == form.Login)).Any())
        //        return CreateResultWithError(0, resultOfOperation, form.Login).OperationWasFinishedSuccessful;

        //    form.Ip = ip;
        //    //if (!form.ValidateBlobFormat(resultOfOperation, false, false))
        //    //    return false;
        //    if (! await Task.Run(() => form.ValidateIpAdressesAndPorts(3, false, resultOfOperation)).ConfigureAwait(false))
        //        return false;
        //    //if (form.DataForSymmetricAlgorithm == null)
        //    //    return CreateResultWithError(1, resultOfOperation).OperationWasFinishedSuccessful;
        //    //else
        //    //{
        //    //    if (form.DataForSymmetricAlgorithm.SymmetricIvBlob == null ||
        //    //        form.DataForSymmetricAlgorithm.SymmetricIvBlob.Length == 0 ||
        //    //        form.DataForSymmetricAlgorithm.SymmetricKeyBlob == null ||
        //    //        form.DataForSymmetricAlgorithm.SymmetricKeyBlob.Length == 0)
        //    //        return CreateResultWithError(2, resultOfOperation).OperationWasFinishedSuccessful;
        //    //}


        //    resultOfOperation.OperationWasFinishedSuccessful = true;
        //    UsersF.TryAdd(form);

        //    return true;
        //}
        /// <exception cref="ArgumentNullException">form == null. -или- ip == null. -или- resultOfOperation == null.</exception>
        /// <exception cref="ArgumentOutOfRangeException">Строка не является ip адресом.</exception>
        public override async Task <bool> RegisterNewUserAsync(UserForm form, IPAddress ip,
                                                               ResultOfOperation resultOfOperation)
        {
            var validateTask = Task.Run(() =>
            {
                if (form == null)
                {
                    throw new ArgumentNullException(nameof(form))
                    {
                        Source = GetType().AssemblyQualifiedName
                    }
                }
                ;
                if (ip == null)
                {
                    throw new ArgumentNullException(nameof(ip))
                    {
                        Source = GetType().AssemblyQualifiedName
                    }
                }
                ;
                if (resultOfOperation == null)
                {
                    throw new ArgumentNullException(nameof(resultOfOperation))
                    {
                        Source = GetType().AssemblyQualifiedName
                    }
                }
                ;

                var isExist = UsersF.Users.Any(surrogate => surrogate.Login == form.Login);
                if (isExist)
                {
                    return(CreateResultWithError(0, resultOfOperation, 0, form.Login).OperationWasFinishedSuccessful);
                }
                if (!ValidateUserFormForRegistration(form, resultOfOperation))
                {
                    return(false);
                }
                if (!form.ValidateIpAdressesAndPorts(3, false, resultOfOperation))
                {
                    return(false);
                }
                return(true);
            });

            if (!await validateTask.ConfigureAwait(false))
            {
                return(false);
            }
            try
            {
                await UsersF.Users.AddAsync(form).ConfigureAwait(false);

                await UsersF.SaveChangesAsync().ConfigureAwait(false);

                resultOfOperation.OperationWasFinishedSuccessful = true;
                return(resultOfOperation.OperationWasFinishedSuccessful);

                //seria
            }
            //catch (SerializationException ex)
            //    when (Type.GetType(ex.Source).GetTypeInfo().GetInterface("IFileEngine<UserForm>") != null)
            //{
            //    return CreateResultWithError(0, resultOfOperation, 5).OperationWasFinishedSuccessful;
            //}
            catch (SerializationException ex)
                when(
                    Type.GetType(ex.Source)
                    .GetTypeInfo()
                    .ImplementedInterfaces.FirstOrDefault(type => type.FullName.Contains("IFileEngine<UserForm>")) !=
                    null)
                {
                    return(CreateResultWithError(0, resultOfOperation, 5).OperationWasFinishedSuccessful);
                }
            //catch (IOException ex)
            //    when (Type.GetType(ex.Source).GetTypeInfo().GetInterface("IFileEngine<UserForm>") != null)
            //{
            //    return CreateResultWithError(0, resultOfOperation, 4).OperationWasFinishedSuccessful;
            //}
            catch (IOException ex)
                when(Type.GetType(ex.Source)
                     .GetTypeInfo()
                     .ImplementedInterfaces.FirstOrDefault(type => type.FullName.Contains("IFileEngine<UserForm>")) !=
                     null)
                {
                    return(CreateResultWithError(0, resultOfOperation, 4).OperationWasFinishedSuccessful);
                }
            catch (Exception ex)
            {
                return(CreateResultWithError(0, resultOfOperation, 6).OperationWasFinishedSuccessful);
            }
        }
Esempio n. 29
0
        ///// <summary>
        ///// Возвращает форму с скопированными данными, а именно: Ip, CryptoProvider, SignPublicKeyBlob, PublicKeyParamsBlob,
        ///// Login, PortClientToClient1, PortClientToClient2, PortClientToClient3, PortServerToClient. Если тип ссылочный,
        ///// то будет скопирована ссылка.
        ///// </summary>
        //public ContactForm GetUserPublicData()
        //{
        //    var clone = new ContactForm()
        //    {
        //        Ip = Ip,
        //        CryptoProvider = CryptoProvider,
        //        SignPublicKeyBlob = SignPublicKeyBlob,
        //        PublicKeyParamsBlob = PublicKeyParamsBlob,
        //        Login = Login,
        //        PortClientToClient1 = PortClientToClient1,
        //        PortClientToClient2 = PortClientToClient2,
        //        PortClientToClient3 = PortClientToClient3,
        //        PortServerToClient = PortServerToClient
        //    };
        //    return clone;
        //}
        /// <exception cref="PlatformNotSupportedException">Классы криптографии следующего поколения (CNG) не поддерживаются данной системой.</exception>
        /// <exception cref="CryptographicException">Все остальные ошибки.</exception>
        /// <exception cref="InvalidOperationException">Свойство <see cref="SignPublicKeyBlob"/> не задано.</exception>
        public bool ValidateIpAdressesAndPorts(ushort numbOfPortsForValidation, bool throwExc,
                                               ResultOfOperation resultOfOperation)
        {
            if (numbOfPortsForValidation > 3)
            {
                throw new ArgumentOutOfRangeException(nameof(numbOfPortsForValidation),
                                                      "Значение не попадает в диапазон от 1 до 3.")
                      {
                          Source = GetType().AssemblyQualifiedName
                      }
            }
            ;
            if (resultOfOperation == null)
            {
                throw new ArgumentNullException(nameof(resultOfOperation))
                      {
                          Source = GetType().AssemblyQualifiedName
                      }
            }
            ;

            if (Ip == null)
            {
                if (throwExc)
                {
                    throw new ArgumentNullException(nameof(Ip))
                          {
                              Source = GetType().AssemblyQualifiedName
                          }
                }
                ;

                resultOfOperation.ErrorMessage = "Не задан ip адрес.";
                resultOfOperation.OperationWasFinishedSuccessful = false;
                return(false);
            }

            var ports = new int[0];

            switch (numbOfPortsForValidation)
            {
            case 1:
                ports = new[] { PortClientToClient1 };
                break;

            case 2:
                ports = new[] { PortClientToClient1, PortClientToClient2 };
                break;

            case 3:
                ports = new[] { PortClientToClient1, PortClientToClient2, PortClientToClient3 };
                break;
            }

            ushort i = 0;

            try
            {
                for (i = 0; i < numbOfPortsForValidation; i++)
                {
                    if (ports[i] == 0)
                    {
                        if (throwExc)
                        {
                            throw new ArgumentException("Не задан какой-либо из портов.")
                                  {
                                      Source = GetType().AssemblyQualifiedName
                                  }
                        }
                        ;

                        resultOfOperation.ErrorMessage = "Не задан какой-либо из портов.";
                        resultOfOperation.OperationWasFinishedSuccessful = false;
                        return(false);
                    }
                    var endPoint = new IPEndPoint(Ip, ports[i]);
                    using (var client = new TcpClient())
                    {
                        var connectTask = client.ConnectAsync(Ip, ports[i]);
                        connectTask.Wait();
                    }
                }

                return(true);
            }
            catch (AggregateException ex) when(ex.InnerException is SocketException)
            {
                if (throwExc)
                {
                    throw CreateException(0, i, ex);
                }

                resultOfOperation.ErrorMessage = $"Порт {i} не отвечает.";
                resultOfOperation.OperationWasFinishedSuccessful = false;
                return(false);
            }
            catch (SocketException ex)
            {
                if (throwExc)
                {
                    throw CreateException(0, i, ex);
                }

                resultOfOperation.ErrorMessage = $"Порт {i} не отвечает.";
                resultOfOperation.OperationWasFinishedSuccessful = false;
                return(false);
            }
        }
 //public abstract UserForm GetPublicKey();
 /// <exception cref="ArgumentNullException">form == null. -или- resultOfOperation == null.</exception>
 public abstract Task <Tuple <UserFormSurrogate, OfflineMessagesConcurent> > AuthenticateUserAsync(
     IAuthenticationForm formAuth,
     CryptoFactoryBase cryptoFactory, CryptoInfo choosenCrypto, ResultOfOperation resultOfOperation);