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); }