浏览代码

Issue #1918: Connection dropped by server due to invalid DSA signature
Pad each part of signature with zero's until its 20 bytes. Signature should be exactly 40 bytes.

Gert Driesen 11 年之前
父节点
当前提交
83e2067751
共有 1 个文件被更改,包括 12 次插入3 次删除
  1. 12 3
      Renci.SshClient/Renci.SshNet/Security/Cryptography/DsaDigitalSignature.cs

+ 12 - 3
Renci.SshClient/Renci.SshNet/Security/Cryptography/DsaDigitalSignature.cs

@@ -136,9 +136,19 @@ namespace Renci.SshNet.Security.Cryptography
             } while (s.IsZero);
 
             //  The signature is (r, s)
-            return r.ToByteArray().Reverse().TrimLeadingZero().Concat(s.ToByteArray().Reverse().TrimLeadingZero()).ToArray();
+            var signature = new byte[40];
+
+            // issue #1918: pad part with zero's on the left if length is less than 20
+            var rBytes = r.ToByteArray().Reverse().TrimLeadingZero().ToArray();
+            Array.Copy(rBytes, 0, signature, 20 - rBytes.Length, rBytes.Length);
+
+            // issue #1918: pad part with zero's on the left if length is less than 20
+            var sBytes = s.ToByteArray().Reverse().TrimLeadingZero().ToArray();
+            Array.Copy(sBytes, 0, signature, 40 - sBytes.Length, sBytes.Length);
+
+            return signature;
         }
-        
+
         #region IDisposable Members
 
         private bool _isDisposed;
@@ -192,6 +202,5 @@ namespace Renci.SshNet.Security.Cryptography
         }
 
         #endregion
-
     }
 }