2
0

SignatureRsa.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Security.Cryptography;
  5. namespace Renci.SshClient.Security
  6. {
  7. internal class SignatureRsa : Signature
  8. {
  9. public override string Name
  10. {
  11. get { return "ssh-rsa"; }
  12. }
  13. public SignatureRsa(IEnumerable<byte> data)
  14. : base(data)
  15. {
  16. }
  17. public override bool ValidateSignature(IEnumerable<byte> hash, IEnumerable<byte> signature)
  18. {
  19. var exponentLength = BitConverter.ToUInt32(this.Data.Take(4).Reverse().ToArray(), 0);
  20. var exponentData = this.Data.Skip(4).Take((int)exponentLength).ToArray();
  21. var modulusLength = BitConverter.ToUInt32(this.Data.Skip(4 + (int)exponentLength).Take(4).Reverse().ToArray(), 0);
  22. var modulusData = this.Data.Skip(4 + (int)exponentLength + 4).Take((int)modulusLength).ToArray();
  23. using (var sha1 = new SHA1CryptoServiceProvider())
  24. {
  25. using (var cs = new CryptoStream(System.IO.Stream.Null, sha1, CryptoStreamMode.Write))
  26. {
  27. var data = hash.ToArray();
  28. cs.Write(data, 0, data.Length);
  29. cs.Close();
  30. }
  31. using (var rsa = new RSACryptoServiceProvider())
  32. {
  33. rsa.ImportParameters(new RSAParameters
  34. {
  35. Exponent = exponentData,
  36. Modulus = modulusData.TrimLeadinZero().ToArray(),
  37. });
  38. var rsaDeformatter = new RSAPKCS1SignatureDeformatter(rsa);
  39. rsaDeformatter.SetHashAlgorithm("SHA1");
  40. long i = 0;
  41. long j = 0;
  42. byte[] tmp;
  43. var sig = signature.ToArray();
  44. if (sig[0] == 0 && sig[1] == 0 && sig[2] == 0)
  45. {
  46. long i1 = (sig[i++] << 24) & 0xff000000;
  47. long i2 = (sig[i++] << 16) & 0x00ff0000;
  48. long i3 = (sig[i++] << 8) & 0x0000ff00;
  49. long i4 = (sig[i++]) & 0x000000ff;
  50. j = i1 | i2 | i3 | i4;
  51. i += j;
  52. i1 = (sig[i++] << 24) & 0xff000000;
  53. i2 = (sig[i++] << 16) & 0x00ff0000;
  54. i3 = (sig[i++] << 8) & 0x0000ff00;
  55. i4 = (sig[i++]) & 0x000000ff;
  56. j = i1 | i2 | i3 | i4;
  57. tmp = new byte[j];
  58. Array.Copy(sig, i, tmp, 0, j);
  59. sig = tmp;
  60. }
  61. return rsaDeformatter.VerifySignature(sha1, sig);
  62. }
  63. }
  64. }
  65. }
  66. }