SmbComNegotiateResponse.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. // This code is derived from jcifs smb client library <jcifs at samba dot org>
  2. // Ported by J. Arturo <webmaster at komodosoft dot net>
  3. //
  4. // This library is free software; you can redistribute it and/or
  5. // modify it under the terms of the GNU Lesser General Public
  6. // License as published by the Free Software Foundation; either
  7. // version 2.1 of the License, or (at your option) any later version.
  8. //
  9. // This library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. // Lesser General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU Lesser General Public
  15. // License along with this library; if not, write to the Free Software
  16. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  17. using System;
  18. using SharpCifs.Util;
  19. using SharpCifs.Util.Sharpen;
  20. namespace SharpCifs.Smb
  21. {
  22. internal class SmbComNegotiateResponse : ServerMessageBlock
  23. {
  24. internal int DialectIndex;
  25. internal SmbTransport.ServerData Server;
  26. internal SmbComNegotiateResponse(SmbTransport.ServerData server)
  27. {
  28. this.Server = server;
  29. }
  30. internal override int WriteParameterWordsWireFormat(byte[] dst, int dstIndex)
  31. {
  32. return 0;
  33. }
  34. internal override int WriteBytesWireFormat(byte[] dst, int dstIndex)
  35. {
  36. return 0;
  37. }
  38. internal override int ReadParameterWordsWireFormat(byte[] buffer, int bufferIndex)
  39. {
  40. int start = bufferIndex;
  41. DialectIndex = ReadInt2(buffer, bufferIndex);
  42. bufferIndex += 2;
  43. if (DialectIndex > 10)
  44. {
  45. return bufferIndex - start;
  46. }
  47. Server.SecurityMode = buffer[bufferIndex++] & unchecked(0xFF);
  48. Server.Security = Server.SecurityMode & unchecked(0x01);
  49. Server.EncryptedPasswords
  50. = (Server.SecurityMode & unchecked(0x02)) == unchecked(0x02);
  51. Server.SignaturesEnabled
  52. = (Server.SecurityMode & unchecked(0x04)) == unchecked(0x04);
  53. Server.SignaturesRequired
  54. = (Server.SecurityMode & unchecked(0x08)) == unchecked(0x08);
  55. Server.MaxMpxCount = ReadInt2(buffer, bufferIndex);
  56. bufferIndex += 2;
  57. Server.MaxNumberVcs = ReadInt2(buffer, bufferIndex);
  58. bufferIndex += 2;
  59. Server.MaxBufferSize = ReadInt4(buffer, bufferIndex);
  60. bufferIndex += 4;
  61. Server.MaxRawSize = ReadInt4(buffer, bufferIndex);
  62. bufferIndex += 4;
  63. Server.SessionKey = ReadInt4(buffer, bufferIndex);
  64. bufferIndex += 4;
  65. Server.Capabilities = ReadInt4(buffer, bufferIndex);
  66. bufferIndex += 4;
  67. Server.ServerTime = ReadTime(buffer, bufferIndex);
  68. bufferIndex += 8;
  69. Server.ServerTimeZone = ReadInt2(buffer, bufferIndex);
  70. bufferIndex += 2;
  71. Server.EncryptionKeyLength = buffer[bufferIndex++] & unchecked(0xFF);
  72. return bufferIndex - start;
  73. }
  74. internal override int ReadBytesWireFormat(byte[] buffer, int bufferIndex)
  75. {
  76. int start = bufferIndex;
  77. if ((Server.Capabilities & SmbConstants.CapExtendedSecurity) == 0)
  78. {
  79. Server.EncryptionKey = new byte[Server.EncryptionKeyLength];
  80. Array.Copy(buffer,
  81. bufferIndex,
  82. Server.EncryptionKey,
  83. 0,
  84. Server.EncryptionKeyLength);
  85. bufferIndex += Server.EncryptionKeyLength;
  86. if (ByteCount > Server.EncryptionKeyLength)
  87. {
  88. int len = 0;
  89. // TODO: we can use new string routine here
  90. try
  91. {
  92. if ((Flags2 & SmbConstants.Flags2Unicode) == SmbConstants.Flags2Unicode)
  93. {
  94. while (buffer[bufferIndex + len] != unchecked(unchecked(0x00))
  95. || buffer[bufferIndex + len + 1] != unchecked(unchecked(0x00)))
  96. {
  97. len += 2;
  98. if (len > 256)
  99. {
  100. throw new RuntimeException("zero termination not found");
  101. }
  102. }
  103. Server.OemDomainName = Runtime.GetStringForBytes(buffer,
  104. bufferIndex,
  105. len,
  106. SmbConstants.UniEncoding);
  107. }
  108. else
  109. {
  110. while (buffer[bufferIndex + len] != unchecked(unchecked(0x00)))
  111. {
  112. len++;
  113. if (len > 256)
  114. {
  115. throw new RuntimeException("zero termination not found");
  116. }
  117. }
  118. Server.OemDomainName = Runtime.GetStringForBytes(buffer,
  119. bufferIndex,
  120. len,
  121. SmbConstants.OemEncoding);
  122. }
  123. }
  124. catch (UnsupportedEncodingException uee)
  125. {
  126. if (Log.Level > 1)
  127. {
  128. Runtime.PrintStackTrace(uee, Log);
  129. }
  130. }
  131. bufferIndex += len;
  132. }
  133. else
  134. {
  135. Server.OemDomainName = "";
  136. }
  137. }
  138. else
  139. {
  140. Server.Guid = new byte[16];
  141. Array.Copy(buffer, bufferIndex, Server.Guid, 0, 16);
  142. Server.OemDomainName = "";
  143. }
  144. // ignore SPNEGO token for now ...
  145. return bufferIndex - start;
  146. }
  147. public override string ToString()
  148. {
  149. return "SmbComNegotiateResponse["
  150. + base.ToString()
  151. + ",wordCount=" + WordCount
  152. + ",dialectIndex=" + DialectIndex
  153. + ",securityMode=0x" + Hexdump.ToHexString(Server.SecurityMode, 1)
  154. + ",security=" + (Server.Security == SmbConstants.SecurityShare
  155. ? "share"
  156. : "user")
  157. + ",encryptedPasswords=" + Server.EncryptedPasswords
  158. + ",maxMpxCount=" + Server.MaxMpxCount
  159. + ",maxNumberVcs=" + Server.MaxNumberVcs
  160. + ",maxBufferSize=" + Server.MaxBufferSize
  161. + ",maxRawSize=" + Server.MaxRawSize
  162. + ",sessionKey=0x" + Hexdump.ToHexString(Server.SessionKey, 8)
  163. + ",capabilities=0x" + Hexdump.ToHexString(Server.Capabilities, 8)
  164. + ",serverTime=" + Extensions.CreateDate(Server.ServerTime)
  165. + ",serverTimeZone=" + Server.ServerTimeZone
  166. + ",encryptionKeyLength=" + Server.EncryptionKeyLength
  167. + ",byteCount=" + ByteCount
  168. + ",oemDomainName=" + Server.OemDomainName + "]";
  169. }
  170. }
  171. }