private void HandleMessage(PublicKeyRequestMessage message)
        {
            if (Session._publicKeyAlgorithms.ContainsKey(message.KeyAlgorithmName))
            {
                var verifed = false;

                var keyAlg = Session._publicKeyAlgorithms[message.KeyAlgorithmName](null);
                keyAlg.LoadKeyAndCertificatesData(message.PublicKey);

                var args = new PKUserAuthArgs(base._session, message.Username, message.KeyAlgorithmName, keyAlg.GetFingerprint(), message.PublicKey);
                UserAuth?.Invoke(this, args);
                verifed = args.Result;

                if (!verifed)
                {
                    _session.SendMessage(new FailureMessage());
                    return;
                }

                if (!message.HasSignature)
                {
                    _session.SendMessage(new PublicKeyOkMessage {
                        KeyAlgorithmName = message.KeyAlgorithmName, PublicKey = message.PublicKey
                    });
                    return;
                }

                var sig = keyAlg.GetSignature(message.Signature);

                using (var worker = new SshDataWorker())
                {
                    worker.WriteBinary(_session.SessionId);
                    worker.Write(message.PayloadWithoutSignature);

                    verifed = keyAlg.VerifyData(worker.ToByteArray(), sig);
                }

                if (verifed && UserAuth != null)
                {
                    UserAuth(this, args);
                    verifed = args.Result;
                }

                if (verifed)
                {
                    _session.RegisterService(message.ServiceName, args);
                    Succeed?.Invoke(this, message.ServiceName);
                    _session.SendMessage(new SuccessMessage());
                    return;
                }
                else
                {
                    _session.SendMessage(new FailureMessage());
                    //throw new SshConnectionException("Authentication fail.", DisconnectReason.NoMoreAuthMethodsAvailable);
                }
            }
        }
        private void HandleMessage(PublicKeyRequestMessage message)
        {
            if (this.Session.AuthenticationMethods == null ||
                !this.Session.AuthenticationMethods.ContainsKey(AuthenticationMethod.PublicKey) ||
                !Session.PublicKeyAlgorithms.ContainsKey(message.KeyAlgorithmName))
            {
                this.Session.SendMessage(new FailureMessage());
                throw new SshConnectionException("Authentication fail.",
                                                 DisconnectReason.NoMoreAuthMethodsAvailable);
            }

            if (!message.HasSignature)
            {
                this.Session.SendMessage(new PublicKeyOkMessage {
                    KeyAlgorithmName = message.KeyAlgorithmName,
                    PublicKey        = message.PublicKey
                });
                return;
            }

            var keyAlg = Session.PublicKeyAlgorithms[message.KeyAlgorithmName](null);

            keyAlg.LoadKeyAndCertificatesData(message.PublicKey);
            var  sig = keyAlg.GetSignature(message.Signature);
            bool verifed;

            using (var worker = new SshDataWorker()) {
                worker.WriteBinary(this.Session.SessionId);
                worker.Write(message.PayloadWithoutSignature);
                verifed = keyAlg.VerifyData(worker.ToByteArray(), sig);
            }

            var args = new UserauthArgs(message.KeyAlgorithmName, keyAlg.GetFingerprint(), message.PublicKey);

            if (verifed && this.Userauth != null)
            {
                this.Userauth(this, args);
                verifed = args.Result;
            }

            if (!verifed)
            {
                this.Session.SendMessage(new FailureMessage());
                throw new SshConnectionException("Authentication fail.",
                                                 DisconnectReason.NoMoreAuthMethodsAvailable);
            }

            if (this.Session.clientKeyRepository != null &&
                this.Session.clientKeyRepository.GetKeyForClient(this.Username) != null)
            {
                var clientKey  = Encoding.ASCII.GetString(this.Session.clientKeyRepository.GetKeyForClient(this.Username));
                var messageKey = System.Convert.ToBase64String(message.PublicKey);
                if (clientKey == messageKey)
                {
                    this.AuthenticationSuccessful(message, args, AuthenticationMethod.PublicKey);
                    return;
                }
            }
            else
            {
                this.AuthenticationSuccessful(message, args, AuthenticationMethod.PublicKey);
                return;
            }

            throw new SshConnectionException("Authentication fail.",
                                             DisconnectReason.NoMoreAuthMethodsAvailable);
        }