SmbComNegotiateResponse.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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. {
  41. int start = bufferIndex;
  42. DialectIndex = ReadInt2(buffer, bufferIndex);
  43. bufferIndex += 2;
  44. if (DialectIndex > 10)
  45. {
  46. return bufferIndex - start;
  47. }
  48. Server.SecurityMode = buffer[bufferIndex++] & unchecked(0xFF);
  49. Server.Security = Server.SecurityMode & unchecked(0x01);
  50. Server.EncryptedPasswords = (Server.SecurityMode & unchecked(0x02)) == unchecked(
  51. 0x02);
  52. Server.SignaturesEnabled = (Server.SecurityMode & unchecked(0x04)) == unchecked(
  53. 0x04);
  54. Server.SignaturesRequired = (Server.SecurityMode & unchecked(0x08)) == unchecked(
  55. 0x08);
  56. Server.MaxMpxCount = ReadInt2(buffer, bufferIndex);
  57. bufferIndex += 2;
  58. Server.MaxNumberVcs = ReadInt2(buffer, bufferIndex);
  59. bufferIndex += 2;
  60. Server.MaxBufferSize = ReadInt4(buffer, bufferIndex);
  61. bufferIndex += 4;
  62. Server.MaxRawSize = ReadInt4(buffer, bufferIndex);
  63. bufferIndex += 4;
  64. Server.SessionKey = ReadInt4(buffer, bufferIndex);
  65. bufferIndex += 4;
  66. Server.Capabilities = ReadInt4(buffer, bufferIndex);
  67. bufferIndex += 4;
  68. Server.ServerTime = ReadTime(buffer, bufferIndex);
  69. bufferIndex += 8;
  70. Server.ServerTimeZone = ReadInt2(buffer, bufferIndex);
  71. bufferIndex += 2;
  72. Server.EncryptionKeyLength = buffer[bufferIndex++] & unchecked(0xFF);
  73. return bufferIndex - start;
  74. }
  75. internal override int ReadBytesWireFormat(byte[] buffer, int bufferIndex)
  76. {
  77. int start = bufferIndex;
  78. if ((Server.Capabilities & SmbConstants.CapExtendedSecurity) == 0)
  79. {
  80. Server.EncryptionKey = new byte[Server.EncryptionKeyLength];
  81. Array.Copy(buffer, bufferIndex, Server.EncryptionKey, 0, Server.EncryptionKeyLength
  82. );
  83. bufferIndex += Server.EncryptionKeyLength;
  84. if (ByteCount > Server.EncryptionKeyLength)
  85. {
  86. int len = 0;
  87. // TODO: we can use new string routine here
  88. try
  89. {
  90. if ((Flags2 & SmbConstants.Flags2Unicode) == SmbConstants.Flags2Unicode)
  91. {
  92. while (buffer[bufferIndex + len] != unchecked(unchecked(0x00)) || buffer
  93. [bufferIndex + len + 1] != unchecked(unchecked(0x00)))
  94. {
  95. len += 2;
  96. if (len > 256)
  97. {
  98. throw new RuntimeException("zero termination not found");
  99. }
  100. }
  101. Server.OemDomainName = Runtime.GetStringForBytes(buffer, bufferIndex, len
  102. , SmbConstants.UniEncoding);
  103. }
  104. else
  105. {
  106. while (buffer[bufferIndex + len] != unchecked(unchecked(0x00)))
  107. {
  108. len++;
  109. if (len > 256)
  110. {
  111. throw new RuntimeException("zero termination not found");
  112. }
  113. }
  114. Server.OemDomainName = Runtime.GetStringForBytes(buffer, bufferIndex, len
  115. , SmbConstants.OemEncoding);
  116. }
  117. }
  118. catch (UnsupportedEncodingException uee)
  119. {
  120. if (Log.Level > 1)
  121. {
  122. Runtime.PrintStackTrace(uee, Log);
  123. }
  124. }
  125. bufferIndex += len;
  126. }
  127. else
  128. {
  129. Server.OemDomainName = "";
  130. }
  131. }
  132. else
  133. {
  134. Server.Guid = new byte[16];
  135. Array.Copy(buffer, bufferIndex, Server.Guid, 0, 16);
  136. Server.OemDomainName = "";
  137. }
  138. // ignore SPNEGO token for now ...
  139. return bufferIndex - start;
  140. }
  141. public override string ToString()
  142. {
  143. return "SmbComNegotiateResponse[" + base.ToString() + ",wordCount=" +
  144. WordCount + ",dialectIndex=" + DialectIndex + ",securityMode=0x" + Hexdump.ToHexString
  145. (Server.SecurityMode, 1) + ",security=" + (Server.Security == SmbConstants.SecurityShare ? "share"
  146. : "user") + ",encryptedPasswords=" + Server.EncryptedPasswords + ",maxMpxCount="
  147. + Server.MaxMpxCount + ",maxNumberVcs=" + Server.MaxNumberVcs + ",maxBufferSize="
  148. + Server.MaxBufferSize + ",maxRawSize=" + Server.MaxRawSize + ",sessionKey=0x"
  149. + Hexdump.ToHexString(Server.SessionKey, 8) + ",capabilities=0x" + Hexdump.ToHexString
  150. (Server.Capabilities, 8) + ",serverTime=" + Extensions.CreateDate(Server
  151. .ServerTime) + ",serverTimeZone=" + Server.ServerTimeZone + ",encryptionKeyLength="
  152. + Server.EncryptionKeyLength + ",byteCount=" + ByteCount + ",oemDomainName=" +
  153. Server.OemDomainName + "]";
  154. }
  155. }
  156. }