1 /* jcifs smb client library in Java
2  * Copyright (C) 2000  "Michael B. Allen" <jcifs at samba dot org>
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  */
18 
19 package jcifs.smb;
20 
21 import java.util.Date;
22 import java.io.UnsupportedEncodingException;
23 import jcifs.util.Hexdump;
24 
25 class SmbComNegotiateResponse extends ServerMessageBlock {
26 
27     int dialectIndex;
28     SmbTransport.ServerData server;
29 
SmbComNegotiateResponse( SmbTransport.ServerData server )30     SmbComNegotiateResponse( SmbTransport.ServerData server ) {
31         this.server = server;
32     }
33 
writeParameterWordsWireFormat( byte[] dst, int dstIndex )34     int writeParameterWordsWireFormat( byte[] dst, int dstIndex ) {
35         return 0;
36     }
writeBytesWireFormat( byte[] dst, int dstIndex )37     int writeBytesWireFormat( byte[] dst, int dstIndex ) {
38         return 0;
39     }
readParameterWordsWireFormat( byte[] buffer, int bufferIndex )40     int readParameterWordsWireFormat( byte[] buffer,
41                                     int bufferIndex ) {
42         int start = bufferIndex;
43 
44         dialectIndex         = readInt2( buffer, bufferIndex ); bufferIndex += 2;
45         if( dialectIndex > 10 ) {
46             return bufferIndex - start;
47         }
48         server.securityMode  = buffer[bufferIndex++] & 0xFF;
49         server.security      = server.securityMode & 0x01;
50         server.encryptedPasswords = ( server.securityMode & 0x02 ) == 0x02;
51         server.signaturesEnabled  = ( server.securityMode & 0x04 ) == 0x04;
52         server.signaturesRequired = ( server.securityMode & 0x08 ) == 0x08;
53         server.maxMpxCount   = readInt2( buffer, bufferIndex ); bufferIndex += 2;
54         server.maxNumberVcs  = readInt2( buffer, bufferIndex ); bufferIndex += 2;
55         server.maxBufferSize = readInt4( buffer, bufferIndex ); bufferIndex += 4;
56         server.maxRawSize    = readInt4( buffer, bufferIndex ); bufferIndex += 4;
57         server.sessionKey    = readInt4( buffer, bufferIndex ); bufferIndex += 4;
58         server.capabilities  = readInt4( buffer, bufferIndex ); bufferIndex += 4;
59         server.serverTime    = readTime( buffer, bufferIndex ); bufferIndex += 8;
60         server.serverTimeZone = readInt2( buffer, bufferIndex ); bufferIndex += 2;
61         server.encryptionKeyLength = buffer[bufferIndex++] & 0xFF;
62 
63         return bufferIndex - start;
64     }
readBytesWireFormat( byte[] buffer, int bufferIndex )65     int readBytesWireFormat( byte[] buffer,
66                                     int bufferIndex ) {
67         int start = bufferIndex;
68 
69         if ((server.capabilities & CAP_EXTENDED_SECURITY) == 0) {
70             server.encryptionKey = new byte[server.encryptionKeyLength];
71             System.arraycopy( buffer, bufferIndex,
72                     server.encryptionKey, 0, server.encryptionKeyLength );
73             bufferIndex += server.encryptionKeyLength;
74             if( byteCount > server.encryptionKeyLength ) {
75                 int len = 0;
76 // TODO: we can use new string routine here
77                 try {
78                     if(( flags2 & FLAGS2_UNICODE ) == FLAGS2_UNICODE ) {
79                         while( buffer[bufferIndex + len] != (byte)0x00 ||
80                                         buffer[bufferIndex + len + 1] != (byte)0x00 ) {
81                             len += 2;
82                             if( len > 256 ) {
83                                 throw new RuntimeException( "zero termination not found" );
84                             }
85                         }
86                         server.oemDomainName = new String( buffer, bufferIndex,
87                                 len, UNI_ENCODING );
88                     } else {
89                         while( buffer[bufferIndex + len] != (byte)0x00 ) {
90                             len++;
91                             if( len > 256 ) {
92                                 throw new RuntimeException( "zero termination not found" );
93                             }
94                         }
95                         server.oemDomainName = new String( buffer, bufferIndex,
96                                 len, ServerMessageBlock.OEM_ENCODING );
97                     }
98                 } catch( UnsupportedEncodingException uee ) {
99                     if( log.level > 1 )
100                         uee.printStackTrace( log );
101                 }
102                 bufferIndex += len;
103             } else {
104                 server.oemDomainName = new String();
105             }
106         } else {
107             server.guid = new byte[16];
108             System.arraycopy(buffer, bufferIndex, server.guid, 0, 16);
109             server.oemDomainName = new String();
110             // ignore SPNEGO token for now ...
111         }
112 
113         return bufferIndex - start;
114     }
toString()115     public String toString() {
116         return new String( "SmbComNegotiateResponse[" +
117             super.toString() +
118             ",wordCount="           + wordCount +
119             ",dialectIndex="        + dialectIndex +
120             ",securityMode=0x"      + Hexdump.toHexString( server.securityMode, 1 ) +
121             ",security="            + ( server.security == SECURITY_SHARE ? "share" : "user" ) +
122             ",encryptedPasswords="  + server.encryptedPasswords +
123             ",maxMpxCount="         + server.maxMpxCount +
124             ",maxNumberVcs="        + server.maxNumberVcs +
125             ",maxBufferSize="       + server.maxBufferSize +
126             ",maxRawSize="          + server.maxRawSize +
127             ",sessionKey=0x"        + Hexdump.toHexString( server.sessionKey, 8 ) +
128             ",capabilities=0x"      + Hexdump.toHexString( server.capabilities, 8 ) +
129             ",serverTime="          + new Date( server.serverTime ) +
130             ",serverTimeZone="      + server.serverTimeZone +
131             ",encryptionKeyLength=" + server.encryptionKeyLength +
132             ",byteCount="           + byteCount +
133             ",oemDomainName="       + server.oemDomainName + "]" );
134     }
135 }
136 
137