1 17 package org.alfresco.filesys.server.auth.ntlm; 18 19 import org.alfresco.filesys.util.HexDump; 20 21 26 public class Type3NTLMMessage extends NTLMMessage 27 { 28 30 public static final int MinimalMessageLength = 52; 31 32 34 public static final int OffsetLMResponse = 12; 35 public static final int OffsetNTLMResponse = 20; 36 public static final int OffsetDomain = 28; 37 public static final int OffsetUserName = 36; 38 public static final int OffsetWorkstationName = 44; 39 public static final int OffsetDataMinimum = 52; 40 public static final int OffsetSessionKey = 52; public static final int OffsetFlags = 60; public static final int OffsetData = 64; 43 44 46 private boolean m_unicode; 47 48 50 private int m_dataOffset = -1; 51 52 55 public Type3NTLMMessage() 56 { 57 super(); 58 } 59 60 65 public Type3NTLMMessage(byte[] buf) 66 { 67 super(buf, 0, buf.length); 68 } 69 70 78 public Type3NTLMMessage(byte[] buf, int offset, int len, boolean unicode) 79 { 80 super(buf, offset, len); 81 82 m_unicode = unicode; 83 } 84 85 90 public int getFlags() 91 { 92 return getIntValue(OffsetFlags); 93 } 94 95 100 public final byte[] getLMHash() 101 { 102 return getByteValue(OffsetLMResponse); 103 } 104 105 110 public final byte[] getNTLMHash() 111 { 112 return getByteValue(OffsetNTLMResponse); 113 } 114 115 120 public final String getDomain() 121 { 122 return getStringValue(OffsetDomain, hasFlag(NTLM.FlagNegotiateUnicode)); 123 } 124 125 130 public final String getUserName() 131 { 132 return getStringValue(OffsetUserName, hasFlag(NTLM.FlagNegotiateUnicode)); 133 } 134 135 140 public final String getWorkstation() 141 { 142 return getStringValue(OffsetWorkstationName, hasFlag(NTLM.FlagNegotiateUnicode)); 143 } 144 145 150 public final boolean hasSessionKey() 151 { 152 return getShortValue(OffsetSessionKey) > 0; 153 } 154 155 160 public final byte[] getSessionKey() 161 { 162 if ( hasSessionKey() == false) 163 return null; 164 165 167 return getByteValue(OffsetSessionKey); 168 } 169 170 181 public final void buildType3(byte[] lmHash, byte[] ntlmHash, String domain, String username, String wksname, 182 byte[] sessKey, int flags) 183 { 184 initializeHeader(NTLM.Type3, 0); 185 186 188 int dataOff = OffsetData; 189 190 192 dataOff = setStringValue(OffsetDomain, domain, dataOff, m_unicode); 193 dataOff = setStringValue(OffsetUserName, username, dataOff, m_unicode); 194 dataOff = setStringValue(OffsetWorkstationName, wksname, dataOff, m_unicode); 195 196 198 dataOff = setByteValue(OffsetLMResponse, lmHash, dataOff); 199 dataOff = setByteValue(OffsetNTLMResponse, ntlmHash, dataOff); 200 201 203 dataOff = setByteValue(OffsetSessionKey, sessKey, dataOff); 204 205 207 int typ3flags = NTLM.FlagNegotiateNTLM + NTLM.FlagRequestTarget; 208 if ( m_unicode) 209 flags += NTLM.FlagNegotiateUnicode; 210 211 213 setIntValue(OffsetFlags, typ3flags); 214 215 217 setLength(dataOff); 218 } 219 220 225 protected void setFlags(int flags) 226 { 227 setIntValue(OffsetFlags, flags); 228 } 229 230 235 private final int findDataBlockOffset() 236 { 237 241 int offset = getByteOffset(OffsetLMResponse); 242 243 if ( m_dataOffset == -1 || offset < m_dataOffset) 244 m_dataOffset = offset; 245 246 248 offset = getByteOffset(OffsetNTLMResponse); 249 if ( offset < m_dataOffset) 250 m_dataOffset = offset; 251 252 254 offset = getStringOffset(OffsetDomain); 255 if ( offset < m_dataOffset) 256 m_dataOffset = offset; 257 258 260 offset = getStringOffset(OffsetUserName); 261 if ( offset < m_dataOffset) 262 m_dataOffset = offset; 263 264 266 offset = getStringOffset(OffsetWorkstationName); 267 if ( offset < m_dataOffset) 268 m_dataOffset = offset; 269 270 272 return m_dataOffset; 273 } 274 275 276 281 public String toString() 282 { 283 StringBuilder str = new StringBuilder (); 284 285 str.append("[Type3:"); 286 287 str.append(",LM:"); 288 if ( getLMHash() != null) 289 str.append(HexDump.hexString(getLMHash())); 290 else 291 str.append("<Null>"); 292 293 str.append(",NTLM:"); 294 if ( getNTLMHash() != null) 295 str.append(HexDump.hexString(getNTLMHash())); 296 else 297 str.append("<Null>"); 298 299 str.append(",Dom:"); 300 str.append(getDomain()); 301 str.append(",User:"); 302 str.append(getUserName()); 303 str.append(",Wks:"); 304 str.append(getWorkstation()); 305 306 if ( hasSessionKey()) 307 { 308 str.append(",SessKey:"); 309 str.append(HexDump.hexString(getSessionKey())); 310 str.append(",Flags:0x"); 311 str.append(Integer.toHexString(getFlags())); 312 } 313 str.append("]"); 314 315 return str.toString(); 316 } 317 } 318 | Popular Tags |