jdk/src/java.base/share/classes/com/sun/security/ntlm/Client.java
author martin
Tue, 15 Sep 2015 21:56:04 -0700
changeset 32649 2ee9017c7597
parent 25859 3317bb8137f4
permissions -rw-r--r--
8136583: Core libraries should use blessed modifier order Summary: Run blessed-modifier-order script (see bug) Reviewed-by: psandoz, chegar, alanb, plevart
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
     1
/*
23010
6dadb192ad81 8029235: Update copyright year to match last edit in jdk8 jdk repository for 2013
lana
parents: 15650
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
     4
 *
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    10
 *
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    15
 * accompanied this code).
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    16
 *
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    20
 *
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    23
 * questions.
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    24
 */
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    25
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    26
package com.sun.security.ntlm;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    27
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    28
import java.math.BigInteger;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    29
import java.util.Arrays;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    30
import java.util.Date;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    31
import java.util.Locale;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    32
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    33
/**
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    34
 * The NTLM client. Not multi-thread enabled.<p>
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    35
 * Example:
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    36
 * <pre>
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    37
 * Client client = new Client(null, "host", "dummy",
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    38
 *       "REALM", "t0pSeCr3t".toCharArray());
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    39
 * byte[] type1 = client.type1();
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    40
 * // Send type1 to server and receive response as type2
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    41
 * byte[] type3 = client.type3(type2, nonce);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    42
 * // Send type3 to server
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    43
 * </pre>
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    44
 */
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    45
public final class Client extends NTLM {
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 25859
diff changeset
    46
    private final String hostname;
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 25859
diff changeset
    47
    private final String username;
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    48
25396
5e73c95f95db 7150092: NTLM authentication fail if user specified a different realm
weijun
parents: 23010
diff changeset
    49
    private String domain;
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    50
    private byte[] pw1, pw2;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    51
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    52
    /**
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    53
     * Creates an NTLM Client instance.
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    54
     * @param version the NTLM version to use, which can be:
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    55
     * <ul>
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    56
     * <li>LM/NTLM: Original NTLM v1
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    57
     * <li>LM: Original NTLM v1, LM only
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    58
     * <li>NTLM: Original NTLM v1, NTLM only
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    59
     * <li>NTLM2: NTLM v1 with Client Challenge
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    60
     * <li>LMv2/NTLMv2: NTLM v2
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    61
     * <li>LMv2: NTLM v2, LM only
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    62
     * <li>NTLMv2: NTLM v2, NTLM only
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    63
     * </ul>
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    64
     * If null, "LMv2/NTLMv2" will be used.
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    65
     * @param hostname hostname of the client, can be null
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    66
     * @param username username to be authenticated, must not be null
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    67
     * @param domain domain of {@code username}, can be null
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    68
     * @param password password for {@code username}, must not be not null.
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    69
     * This method does not make any modification to this parameter, it neither
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    70
     * needs to access the content of this parameter after this method call,
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    71
     * so you are free to modify or nullify this parameter after this call.
10348
7d1a82029332 7043847: NTML impl of SaslServer throws UnsupportedOperationException from (un)wrap method
weijun
parents: 6517
diff changeset
    72
     * @throws NTLMException if {@code username} or {@code password} is null,
7d1a82029332 7043847: NTML impl of SaslServer throws UnsupportedOperationException from (un)wrap method
weijun
parents: 6517
diff changeset
    73
     * or {@code version} is illegal.
7d1a82029332 7043847: NTML impl of SaslServer throws UnsupportedOperationException from (un)wrap method
weijun
parents: 6517
diff changeset
    74
     *
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    75
     */
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    76
    public Client(String version, String hostname, String username,
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    77
            String domain, char[] password) throws NTLMException {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    78
        super(version);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    79
        if ((username == null || password == null)) {
10348
7d1a82029332 7043847: NTML impl of SaslServer throws UnsupportedOperationException from (un)wrap method
weijun
parents: 6517
diff changeset
    80
            throw new NTLMException(NTLMException.PROTOCOL,
7d1a82029332 7043847: NTML impl of SaslServer throws UnsupportedOperationException from (un)wrap method
weijun
parents: 6517
diff changeset
    81
                    "username/password cannot be null");
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    82
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    83
        this.hostname = hostname;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    84
        this.username = username;
25396
5e73c95f95db 7150092: NTLM authentication fail if user specified a different realm
weijun
parents: 23010
diff changeset
    85
        this.domain = domain == null ? "" : domain;
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    86
        this.pw1 = getP1(password);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    87
        this.pw2 = getP2(password);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    88
        debug("NTLM Client: (h,u,t,version(v)) = (%s,%s,%s,%s(%s))\n",
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    89
                    hostname, username, domain, version, v.toString());
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    90
    }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    91
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    92
    /**
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    93
     * Generates the Type 1 message
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    94
     * @return the message generated
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    95
     */
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    96
    public byte[] type1() {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    97
        Writer p = new Writer(1, 32);
25396
5e73c95f95db 7150092: NTLM authentication fail if user specified a different realm
weijun
parents: 23010
diff changeset
    98
        // Negotiate always sign, Negotiate NTLM,
5e73c95f95db 7150092: NTLM authentication fail if user specified a different realm
weijun
parents: 23010
diff changeset
    99
        // Request Target, Negotiate OEM, Negotiate unicode
5e73c95f95db 7150092: NTLM authentication fail if user specified a different realm
weijun
parents: 23010
diff changeset
   100
        int flags = 0x8207;
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   101
        if (v != Version.NTLM) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   102
            flags |= 0x80000;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   103
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   104
        p.writeInt(12, flags);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   105
        debug("NTLM Client: Type 1 created\n");
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   106
        debug(p.getBytes());
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   107
        return p.getBytes();
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   108
    }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   109
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   110
    /**
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   111
     * Generates the Type 3 message
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   112
     * @param type2 the responding Type 2 message from server, must not be null
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   113
     * @param nonce random 8-byte array to be used in message generation,
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   114
     * must not be null except for original NTLM v1
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   115
     * @return the message generated
10348
7d1a82029332 7043847: NTML impl of SaslServer throws UnsupportedOperationException from (un)wrap method
weijun
parents: 6517
diff changeset
   116
     * @throws NTLMException if the incoming message is invalid, or
7d1a82029332 7043847: NTML impl of SaslServer throws UnsupportedOperationException from (un)wrap method
weijun
parents: 6517
diff changeset
   117
     * {@code nonce} is null for NTLM v1.
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   118
     */
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   119
    public byte[] type3(byte[] type2, byte[] nonce) throws NTLMException {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   120
        if (type2 == null || (v != Version.NTLM && nonce == null)) {
10348
7d1a82029332 7043847: NTML impl of SaslServer throws UnsupportedOperationException from (un)wrap method
weijun
parents: 6517
diff changeset
   121
            throw new NTLMException(NTLMException.PROTOCOL,
7d1a82029332 7043847: NTML impl of SaslServer throws UnsupportedOperationException from (un)wrap method
weijun
parents: 6517
diff changeset
   122
                    "type2 and nonce cannot be null");
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   123
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   124
        debug("NTLM Client: Type 2 received\n");
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   125
        debug(type2);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   126
        Reader r = new Reader(type2);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   127
        byte[] challenge = r.readBytes(24, 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   128
        int inputFlags = r.readInt(20);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   129
        boolean unicode = (inputFlags & 1) == 1;
25396
5e73c95f95db 7150092: NTLM authentication fail if user specified a different realm
weijun
parents: 23010
diff changeset
   130
5e73c95f95db 7150092: NTLM authentication fail if user specified a different realm
weijun
parents: 23010
diff changeset
   131
        // IE uses domainFromServer to generate an alist if server has not
5e73c95f95db 7150092: NTLM authentication fail if user specified a different realm
weijun
parents: 23010
diff changeset
   132
        // provided one. Firefox/WebKit do not. Neither do we.
5e73c95f95db 7150092: NTLM authentication fail if user specified a different realm
weijun
parents: 23010
diff changeset
   133
        //String domainFromServer = r.readSecurityBuffer(12, unicode);
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   134
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   135
        int flags = 0x88200 | (inputFlags & 3);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   136
        Writer p = new Writer(3, 64);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   137
        byte[] lm = null, ntlm = null;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   138
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   139
        p.writeSecurityBuffer(28, domain, unicode);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   140
        p.writeSecurityBuffer(36, username, unicode);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   141
        p.writeSecurityBuffer(44, hostname, unicode);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   142
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   143
        if (v == Version.NTLM) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   144
            byte[] lmhash = calcLMHash(pw1);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   145
            byte[] nthash = calcNTHash(pw2);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   146
            if (writeLM) lm = calcResponse (lmhash, challenge);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   147
            if (writeNTLM) ntlm = calcResponse (nthash, challenge);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   148
        } else if (v == Version.NTLM2) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   149
            byte[] nthash = calcNTHash(pw2);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   150
            lm = ntlm2LM(nonce);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   151
            ntlm = ntlm2NTLM(nthash, nonce, challenge);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   152
        } else {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   153
            byte[] nthash = calcNTHash(pw2);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   154
            if (writeLM) lm = calcV2(nthash,
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   155
                    username.toUpperCase(Locale.US)+domain, nonce, challenge);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   156
            if (writeNTLM) {
25396
5e73c95f95db 7150092: NTLM authentication fail if user specified a different realm
weijun
parents: 23010
diff changeset
   157
                // Some client create a alist even if server does not send
5e73c95f95db 7150092: NTLM authentication fail if user specified a different realm
weijun
parents: 23010
diff changeset
   158
                // one: (i16)2 (i16)len target_in_unicode (i16)0 (i16) 0
5e73c95f95db 7150092: NTLM authentication fail if user specified a different realm
weijun
parents: 23010
diff changeset
   159
                byte[] alist = ((inputFlags & 0x800000) != 0) ?
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   160
                    r.readSecurityBuffer(40) : new byte[0];
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   161
                byte[] blob = new byte[32+alist.length];
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   162
                System.arraycopy(new byte[]{1,1,0,0,0,0,0,0}, 0, blob, 0, 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   163
                // TS
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   164
                byte[] time = BigInteger.valueOf(new Date().getTime())
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   165
                        .add(new BigInteger("11644473600000"))
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   166
                        .multiply(BigInteger.valueOf(10000))
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   167
                        .toByteArray();
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   168
                for (int i=0; i<time.length; i++) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   169
                    blob[8+time.length-i-1] = time[i];
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   170
                }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   171
                System.arraycopy(nonce, 0, blob, 16, 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   172
                System.arraycopy(new byte[]{0,0,0,0}, 0, blob, 24, 4);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   173
                System.arraycopy(alist, 0, blob, 28, alist.length);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   174
                System.arraycopy(new byte[]{0,0,0,0}, 0,
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   175
                        blob, 28+alist.length, 4);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   176
                ntlm = calcV2(nthash, username.toUpperCase(Locale.US)+domain,
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   177
                        blob, challenge);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   178
            }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   179
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   180
        p.writeSecurityBuffer(12, lm);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   181
        p.writeSecurityBuffer(20, ntlm);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   182
        p.writeSecurityBuffer(52, new byte[0]);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   183
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   184
        p.writeInt(60, flags);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   185
        debug("NTLM Client: Type 3 created\n");
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   186
        debug(p.getBytes());
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   187
        return p.getBytes();
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   188
    }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   189
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   190
    /**
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   191
     * Returns the domain value provided by server after the authentication
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   192
     * is complete, or the domain value provided by the client before it.
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   193
     * @return the domain
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   194
     */
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   195
    public String getDomain() {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   196
        return domain;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   197
    }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   198
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   199
    /**
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   200
     * Disposes any password-derived information.
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   201
     */
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   202
    public void dispose() {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   203
        Arrays.fill(pw1, (byte)0);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   204
        Arrays.fill(pw2, (byte)0);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   205
    }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   206
}