StringBuffer log = new StringBuffer(); String message = new String(myResponse, 0, myPosition); log.append("NTLM auth message: " + message); log.append('\n'); log.append("Length: " + message.length()); log.append('\n'); log.append(sublog); SVNDebugLog.logInfo(log.toString());
    public String authenticate() throws SVNException {        if (myState != TYPE1 && myState != TYPE3) {            SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.RA_DAV_REQUEST_FAILED, "Unsupported message type in HTTP NTLM authentication");            SVNErrorManager.error(err);        }                String login = getUserName();        String domain = null;        String username = null;        int slashInd = login != null ? login.indexOf('\\') : -1;         if (slashInd != -1) {            domain = login.substring(0, slashInd);            int lastInd = slashInd + 1;            while (lastInd < login.length() && login.charAt(lastInd) == '\\') {                lastInd++;            }            username = login.substring(lastInd);        } else {            domain = "";            username = login;        }        String hostName = null;        try {            InetAddress localhost = InetAddress.getLocalHost();            hostName = localhost.getHostName();        } catch (UnknownHostException uhe) {            hostName = "";        }                domain = domain.toUpperCase();        hostName = hostName.toUpperCase();                byte[] protocol = HTTPAuthentication.getBytes(PROTOCOL_NAME, DEFAULT_CHARSET);        byte[] domainBytes = HTTPAuthentication.getBytes(domain, DEFAULT_CHARSET);        byte[] hostNameBytes = HTTPAuthentication.getBytes(hostName, DEFAULT_CHARSET);        byte[] domLen = convertToShortValue(domainBytes.length);        byte[] hostLen = convertToShortValue(hostNameBytes.length);        if (myState == TYPE1) {            int responseLength = 32 + domainBytes.length + hostNameBytes.length;                        initResponse(responseLength);            //NTLMSSP\0 signature (8 bytes long)            addBytes(protocol);            addByte((byte) 0);            // Type1 - Negotiate (4 bytes long)            addByte((byte) 1);            addByte((byte) 0);            addByte((byte) 0);            addByte((byte) 0);            // Flags (4 bytes long): 'Negotiate OEM', 'Request Target',             // 'Negotiate NTLM', 'Negotiate Always Sign'            addByte((byte) 6);            addByte((byte) 82);            addByte((byte) 0);            addByte((byte) 0);            // Domain name length (2 bytes short)            addBytes(domLen);            // Allocated space for the domain name (2 bytes short)            addBytes(domLen);            // Domain name offset (4 bytes long)            byte[] domainOffset = convertToShortValue(hostNameBytes.length + 32);            addBytes(domainOffset);            addByte((byte) 0);            addByte((byte) 0);            // Host name length (2 bytes short).            addBytes(hostLen);            // Allocated space for the host name (2 bytes short)            addBytes(hostLen);            // Host name offset (always 32, 4 bytes long).            byte[] hostOffset = convertToShortValue(32);            addBytes(hostOffset);            addByte((byte) 0);            addByte((byte) 0);            // Host name             addBytes(hostNameBytes);            // Domain name            addBytes(domainBytes);        } else if (myState == TYPE3) {            byte[] userBytes = username.getBytes();                        if (!myIsNegotiateLocalCall) {                int responseLength = 64 + LM_RESPONSE_LENGTH + domainBytes.length + hostNameBytes.length + userBytes.length;                                initResponse(responseLength);                    addBytes(protocol);                addByte((byte) 0);                    //Type3                addByte((byte) 3);                addByte((byte) 0);                addByte((byte) 0);                addByte((byte) 0);                    byte[] lmResponseLength = convertToShortValue(24);                 // LM Response Length                 addBytes(lmResponseLength);                // LM Response allocated space                addBytes(lmResponseLength);                    // LM Response Offset                addBytes(convertToShortValue(responseLength - 24));                addByte((byte) 0);                addByte((byte) 0);                    byte[] ntlmResponseLength = convertToShortValue(0);                 // NTLM Response Length                 addBytes(ntlmResponseLength);                // NTLM Response allocated space                addBytes(ntlmResponseLength);                    byte[] responseLengthShortBytes = convertToShortValue(responseLength);                 // NTLM Response Offset                addBytes(responseLengthShortBytes);                addByte((byte) 0);                addByte((byte) 0);                    // Domain length                addBytes(domLen);                // Domain allocated space                addBytes(domLen);                                // Domain Offset                addBytes(convertToShortValue(64));                addByte((byte) 0);                addByte((byte) 0);                    byte[] usernameLength = convertToShortValue(userBytes.length);                 // Username Length                 addBytes(usernameLength);                // Username allocated space                addBytes(usernameLength);                    // User offset                addBytes(convertToShortValue(64 + domainBytes.length));                addByte((byte) 0);                addByte((byte) 0);                    // Host name length                addBytes(hostLen);                // Host name allocated space                addBytes(hostLen);                    // Host offset                addBytes(convertToShortValue(64 + domainBytes.length + userBytes.length));                    for (int i = 0; i < 6; i++) {                    addByte((byte) 0);                }                    // Message length                addBytes(responseLengthShortBytes);                addByte((byte) 0);                addByte((byte) 0);                    // Flags                addByte((byte) 6);                addByte((byte) 82);                addByte((byte) 0);                addByte((byte) 0);                    addBytes(domainBytes);                addBytes(userBytes);                addBytes(hostNameBytes);                                String password = getPassword();                addBytes(hashPassword(password != null ? password : ""));            } else {                int responseLength = 64;                byte[] responseLengthShortBytes = convertToShortValue(responseLength);                 initResponse(responseLength);                addBytes(protocol);                addByte((byte) 0);                //Type3                addByte((byte) 3);                addByte((byte) 0);                addByte((byte) 0);                addByte((byte) 0);                // LM Response Length                 addByte((byte)0);                addByte((byte)0);                // LM Response allocated space                addByte((byte)0);                addByte((byte)0);                // LM Response Offset                addBytes(responseLengthShortBytes);                addByte((byte) 0);                addByte((byte) 0);                // NTLM Response Length                 addByte((byte)0);                addByte((byte)0);                // NTLM Response allocated space                addByte((byte)0);                addByte((byte)0);                // NTLM Response Offset                addBytes(responseLengthShortBytes);                addByte((byte) 0);                addByte((byte) 0);                // Domain length                addByte((byte)0);                addByte((byte)0);                // Domain allocated space                addByte((byte)0);                addByte((byte)0);                // Domain Offset                addBytes(responseLengthShortBytes);                addByte((byte) 0);                addByte((byte) 0);                // Username Length                 addByte((byte)0);                addByte((byte)0);                // Username allocated space                addByte((byte)0);                addByte((byte)0);                // User offset                addBytes(responseLengthShortBytes);                addByte((byte) 0);                addByte((byte) 0);                // Host name length                addByte((byte)0);                addByte((byte)0);                // Host name allocated space                addByte((byte)0);                addByte((byte)0);                // Host offset                addBytes(responseLengthShortBytes);                for (int i = 0; i < 6; i++) {                    addByte((byte) 0);                }                // Message length                addBytes(responseLengthShortBytes);                addByte((byte) 0);                addByte((byte) 0);                // Flags                addByte((byte) 6);                addByte((byte) 82);                addByte((byte) 0);                addByte((byte) 0);            }            setType1State();        }                return "NTLM " + getResponse();    }