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