UserauthService.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. using FxSsh.Messages;
  2. using FxSsh.Messages.Userauth;
  3. using System;
  4. using System.Diagnostics.Contracts;
  5. namespace FxSsh.Services
  6. {
  7. public class UserauthService : SshService, IDynamicInvoker
  8. {
  9. public UserauthService(Session session)
  10. : base(session)
  11. {
  12. }
  13. public event EventHandler<UserauthArgs> Userauth;
  14. public event EventHandler<string> Succeed;
  15. protected internal override void CloseService()
  16. {
  17. }
  18. internal void HandleMessageCore(UserauthServiceMessage message)
  19. {
  20. Contract.Requires(message != null);
  21. this.InvokeHandleMessage(message);
  22. }
  23. private void HandleMessage(RequestMessage message)
  24. {
  25. switch (message.MethodName)
  26. {
  27. case "publickey":
  28. var keyMsg = Message.LoadFrom<PublicKeyRequestMessage>(message);
  29. HandleMessage(keyMsg);
  30. break;
  31. case "password":
  32. var pswdMsg = Message.LoadFrom<PasswordRequestMessage>(message);
  33. HandleMessage(pswdMsg);
  34. break;
  35. case "hostbased":
  36. case "none":
  37. default:
  38. _session.SendMessage(new FailureMessage());
  39. break;
  40. }
  41. }
  42. private void HandleMessage(PasswordRequestMessage message)
  43. {
  44. var verifed = false;
  45. var args = new UserauthArgs(_session, message.Username, message.Password);
  46. if (Userauth != null)
  47. {
  48. Userauth(this, args);
  49. verifed = args.Result;
  50. }
  51. if (verifed)
  52. {
  53. _session.RegisterService(message.ServiceName, args);
  54. Succeed?.Invoke(this, message.ServiceName);
  55. _session.SendMessage(new SuccessMessage());
  56. return;
  57. }
  58. else
  59. {
  60. _session.SendMessage(new FailureMessage());
  61. }
  62. }
  63. private void HandleMessage(PublicKeyRequestMessage message)
  64. {
  65. if (Session._publicKeyAlgorithms.ContainsKey(message.KeyAlgorithmName))
  66. {
  67. var verifed = false;
  68. var keyAlg = Session._publicKeyAlgorithms[message.KeyAlgorithmName](null);
  69. keyAlg.LoadKeyAndCertificatesData(message.PublicKey);
  70. var args = new UserauthArgs(base._session, message.Username, message.KeyAlgorithmName, keyAlg.GetFingerprint(), message.PublicKey);
  71. Userauth?.Invoke(this, args);
  72. verifed = args.Result;
  73. if (!verifed)
  74. {
  75. _session.SendMessage(new FailureMessage());
  76. return;
  77. }
  78. if (!message.HasSignature)
  79. {
  80. _session.SendMessage(new PublicKeyOkMessage { KeyAlgorithmName = message.KeyAlgorithmName, PublicKey = message.PublicKey });
  81. return;
  82. }
  83. var sig = keyAlg.GetSignature(message.Signature);
  84. using (var worker = new SshDataWorker())
  85. {
  86. worker.WriteBinary(_session.SessionId);
  87. worker.Write(message.PayloadWithoutSignature);
  88. verifed = keyAlg.VerifyData(worker.ToByteArray(), sig);
  89. }
  90. if (!verifed)
  91. {
  92. _session.SendMessage(new FailureMessage());
  93. return;
  94. }
  95. _session.RegisterService(message.ServiceName, args);
  96. Succeed?.Invoke(this, message.ServiceName);
  97. _session.SendMessage(new SuccessMessage());
  98. }
  99. }
  100. }
  101. }