src/java.base/share/classes/com/sun/security/ntlm/NTLM.java
author weijun
Tue, 14 Aug 2018 22:39:34 +0800
changeset 51398 3c389a284345
parent 47216 71c04702a3d5
permissions -rw-r--r--
8209416: Refactoring GetPropertyAction calls in security libs Reviewed-by: xuelei, rriggs
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
/*
51398
3c389a284345 8209416: Refactoring GetPropertyAction calls in security libs
weijun
parents: 47216
diff changeset
     2
 * Copyright (c) 2010, 2018, 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
51398
3c389a284345 8209416: Refactoring GetPropertyAction calls in security libs
weijun
parents: 47216
diff changeset
    28
import sun.security.action.GetBooleanAction;
3c389a284345 8209416: Refactoring GetPropertyAction calls in security libs
weijun
parents: 47216
diff changeset
    29
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    30
import static com.sun.security.ntlm.Version.*;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    31
import java.io.IOException;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    32
import java.io.UnsupportedEncodingException;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    33
import java.security.InvalidKeyException;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    34
import java.security.MessageDigest;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    35
import java.security.NoSuchAlgorithmException;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    36
import java.security.spec.InvalidKeySpecException;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    37
import java.util.Arrays;
10369
e9d2e59e53f0 7059542: JNDI name operations should be locale independent
xuelei
parents: 6517
diff changeset
    38
import java.util.Locale;
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    39
import javax.crypto.BadPaddingException;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    40
import javax.crypto.Cipher;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    41
import javax.crypto.IllegalBlockSizeException;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    42
import javax.crypto.Mac;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    43
import javax.crypto.NoSuchPaddingException;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    44
import javax.crypto.SecretKey;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    45
import javax.crypto.SecretKeyFactory;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    46
import javax.crypto.spec.DESKeySpec;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    47
import javax.crypto.spec.SecretKeySpec;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    48
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    49
/**
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    50
 * NTLM authentication implemented according to MS-NLMP, version 12.1
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    51
 * @since 1.7
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
class NTLM {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    54
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    55
    private final SecretKeyFactory fac;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    56
    private final Cipher cipher;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    57
    private final MessageDigest md4;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    58
    private final Mac hmac;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    59
    private final MessageDigest md5;
51398
3c389a284345 8209416: Refactoring GetPropertyAction calls in security libs
weijun
parents: 47216
diff changeset
    60
    private static final boolean DEBUG
3c389a284345 8209416: Refactoring GetPropertyAction calls in security libs
weijun
parents: 47216
diff changeset
    61
            = GetBooleanAction.privilegedGetProperty("ntlm.debug");
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    62
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    63
    final Version v;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    64
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    65
    final boolean writeLM;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    66
    final boolean writeNTLM;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    67
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    68
    protected NTLM(String version) throws NTLMException {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    69
        if (version == null) version = "LMv2/NTLMv2";
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    70
        switch (version) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    71
            case "LM": v = NTLM; writeLM = true; writeNTLM = false; break;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    72
            case "NTLM": v = NTLM; writeLM = false; writeNTLM = true; break;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    73
            case "LM/NTLM": v = NTLM; writeLM = writeNTLM = true; break;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    74
            case "NTLM2": v = NTLM2; writeLM = writeNTLM = true; break;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    75
            case "LMv2": v = NTLMv2; writeLM = true; writeNTLM = false; break;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    76
            case "NTLMv2": v = NTLMv2; writeLM = false; writeNTLM = true; break;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    77
            case "LMv2/NTLMv2": v = NTLMv2; writeLM = writeNTLM = true; break;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    78
            default: throw new NTLMException(NTLMException.BAD_VERSION,
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    79
                    "Unknown version " + version);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    80
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    81
        try {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    82
            fac = SecretKeyFactory.getInstance ("DES");
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    83
            cipher = Cipher.getInstance ("DES/ECB/NoPadding");
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    84
            md4 = sun.security.provider.MD4.getInstance();
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    85
            hmac = Mac.getInstance("HmacMD5");
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    86
            md5 = MessageDigest.getInstance("MD5");
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    87
        } catch (NoSuchPaddingException e) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    88
            throw new AssertionError();
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    89
        } catch (NoSuchAlgorithmException e) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    90
            throw new AssertionError();
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
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    94
    /**
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    95
     * Prints out a formatted string, called in various places inside then NTLM
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    96
     * implementation for debugging/logging purposes. When the system property
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    97
     * "ntlm.debug" is set, <code>System.out.printf(format, args)</code> is
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    98
     * called. This method is designed to be overridden by child classes to
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
    99
     * match their own debugging/logging mechanisms.
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   100
     * @param format a format string
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   101
     * @param args the arguments referenced by <code>format</code>
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   102
     * @see java.io.PrintStream#printf(java.lang.String, java.lang.Object[])
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
    public void debug(String format, Object... args) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   105
        if (DEBUG) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   106
            System.out.printf(format, args);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   107
        }
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
     * Prints out the content of a byte array, called in various places inside
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   112
     * the NTLM implementation for debugging/logging purposes. When the system
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   113
     * property "ntlm.debug" is set, the hexdump of the array is printed into
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   114
     * System.out. This method is designed to be overridden by child classes to
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   115
     * match their own debugging/logging mechanisms.
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   116
     * @param bytes the byte array to print out
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   117
     */
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   118
    public void debug(byte[] bytes) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   119
        if (DEBUG) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   120
            try {
34687
d302ed125dc9 8144995: Move sun.misc.HexDumpEncoder to sun.security.util
chegar
parents: 32842
diff changeset
   121
                new sun.security.util.HexDumpEncoder().encodeBuffer(bytes, System.out);
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   122
            } catch (IOException ioe) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   123
                // Impossible
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   124
            }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   125
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   126
    }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   127
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   128
    /**
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   129
     * Reading an NTLM packet
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   130
     */
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   131
    static class Reader {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   132
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   133
        private final byte[] internal;
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
        Reader(byte[] data) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   136
            internal = data;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   137
        }
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
        int readInt(int offset) throws NTLMException {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   140
            try {
15650
04ebec48c104 8007761: NTLM coding errors
weijun
parents: 14342
diff changeset
   141
                return (internal[offset] & 0xff) +
04ebec48c104 8007761: NTLM coding errors
weijun
parents: 14342
diff changeset
   142
                        ((internal[offset+1] & 0xff) << 8) +
04ebec48c104 8007761: NTLM coding errors
weijun
parents: 14342
diff changeset
   143
                        ((internal[offset+2] & 0xff) << 16) +
04ebec48c104 8007761: NTLM coding errors
weijun
parents: 14342
diff changeset
   144
                        ((internal[offset+3] & 0xff) << 24);
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   145
            } catch (ArrayIndexOutOfBoundsException ex) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   146
                throw new NTLMException(NTLMException.PACKET_READ_ERROR,
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   147
                        "Input message incorrect size");
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   148
            }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   149
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   150
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   151
        int readShort(int offset) throws NTLMException {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   152
            try {
15650
04ebec48c104 8007761: NTLM coding errors
weijun
parents: 14342
diff changeset
   153
                return (internal[offset] & 0xff) +
04ebec48c104 8007761: NTLM coding errors
weijun
parents: 14342
diff changeset
   154
                        ((internal[offset+1] & 0xff << 8));
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   155
            } catch (ArrayIndexOutOfBoundsException ex) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   156
                throw new NTLMException(NTLMException.PACKET_READ_ERROR,
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   157
                        "Input message incorrect size");
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   158
            }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   159
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   160
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   161
        byte[] readBytes(int offset, int len) throws NTLMException {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   162
            try {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   163
                return Arrays.copyOfRange(internal, offset, offset + len);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   164
            } catch (ArrayIndexOutOfBoundsException ex) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   165
                throw new NTLMException(NTLMException.PACKET_READ_ERROR,
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   166
                        "Input message incorrect size");
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   167
            }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   168
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   169
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   170
        byte[] readSecurityBuffer(int offset) throws NTLMException {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   171
            int pos = readInt(offset+4);
39653
e924cc953cdc 8151788: NullPointerException from ntlm.Client.type3
vtewari
parents: 34687
diff changeset
   172
            if (pos == 0) return new byte[0];
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   173
            try {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   174
                return Arrays.copyOfRange(
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   175
                        internal, pos, pos + readShort(offset));
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   176
            } catch (ArrayIndexOutOfBoundsException ex) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   177
                throw new NTLMException(NTLMException.PACKET_READ_ERROR,
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   178
                        "Input message incorrect size");
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
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   181
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   182
        String readSecurityBuffer(int offset, boolean unicode)
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   183
                throws NTLMException {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   184
            byte[] raw = readSecurityBuffer(offset);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   185
            try {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   186
                return raw == null ? null : new String(
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   187
                        raw, unicode ? "UnicodeLittleUnmarked" : "ISO8859_1");
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   188
            } catch (UnsupportedEncodingException ex) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   189
                throw new NTLMException(NTLMException.PACKET_READ_ERROR,
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   190
                        "Invalid input encoding");
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   191
            }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   192
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   193
    }
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
    /**
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   196
     * Writing an NTLM packet
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
    static class Writer {
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
        private byte[] internal;    // buffer
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   201
        private int current;        // current written content interface buffer
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   202
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   203
        /**
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   204
         * Starts writing a NTLM packet
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   205
         * @param type NEGOTIATE || CHALLENGE || AUTHENTICATE
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   206
         * @param len the base length, without security buffers
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   207
         */
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   208
        Writer(int type, int len) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   209
            assert len < 256;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   210
            internal = new byte[256];
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   211
            current = len;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   212
            System.arraycopy (
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   213
                    new byte[] {'N','T','L','M','S','S','P',0,(byte)type},
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   214
                    0, internal, 0, 9);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   215
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   216
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   217
        void writeShort(int offset, int number) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   218
            internal[offset] = (byte)(number);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   219
            internal[offset+1] = (byte)(number >> 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   220
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   221
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   222
        void writeInt(int offset, int number) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   223
            internal[offset] = (byte)(number);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   224
            internal[offset+1] = (byte)(number >> 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   225
            internal[offset+2] = (byte)(number >> 16);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   226
            internal[offset+3] = (byte)(number >> 24);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   227
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   228
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   229
        void writeBytes(int offset, byte[] data) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   230
            System.arraycopy(data, 0, internal, offset, data.length);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   231
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   232
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   233
        void writeSecurityBuffer(int offset, byte[] data) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   234
            if (data == null) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   235
                writeShort(offset+4, current);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   236
            } else {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   237
                int len = data.length;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   238
                if (current + len > internal.length) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   239
                    internal = Arrays.copyOf(internal, current + len + 256);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   240
                }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   241
                writeShort(offset, len);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   242
                writeShort(offset+2, len);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   243
                writeShort(offset+4, current);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   244
                System.arraycopy(data, 0, internal, current, len);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   245
                current += len;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   246
            }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   247
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   248
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   249
        void writeSecurityBuffer(int offset, String str, boolean unicode) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   250
            try {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   251
                writeSecurityBuffer(offset, str == null ? null : str.getBytes(
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   252
                        unicode ? "UnicodeLittleUnmarked" : "ISO8859_1"));
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   253
            } catch (UnsupportedEncodingException ex) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   254
                assert false;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   255
            }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   256
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   257
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   258
        byte[] getBytes() {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   259
            return Arrays.copyOf(internal, current);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   260
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   261
    }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   262
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   263
    // LM/NTLM
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   264
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   265
    /* Convert a 7 byte array to an 8 byte array (for a des key with parity)
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   266
     * input starts at offset off
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   267
     */
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   268
    byte[] makeDesKey (byte[] input, int off) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   269
        int[] in = new int [input.length];
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   270
        for (int i=0; i<in.length; i++ ) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   271
            in[i] = input[i]<0 ? input[i]+256: input[i];
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   272
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   273
        byte[] out = new byte[8];
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   274
        out[0] = (byte)in[off+0];
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   275
        out[1] = (byte)(((in[off+0] << 7) & 0xFF) | (in[off+1] >> 1));
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   276
        out[2] = (byte)(((in[off+1] << 6) & 0xFF) | (in[off+2] >> 2));
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   277
        out[3] = (byte)(((in[off+2] << 5) & 0xFF) | (in[off+3] >> 3));
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   278
        out[4] = (byte)(((in[off+3] << 4) & 0xFF) | (in[off+4] >> 4));
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   279
        out[5] = (byte)(((in[off+4] << 3) & 0xFF) | (in[off+5] >> 5));
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   280
        out[6] = (byte)(((in[off+5] << 2) & 0xFF) | (in[off+6] >> 6));
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   281
        out[7] = (byte)((in[off+6] << 1) & 0xFF);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   282
        return out;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   283
    }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   284
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   285
    byte[] calcLMHash (byte[] pwb) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   286
        byte[] magic = {0x4b, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25};
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   287
        byte[] pwb1 = new byte [14];
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   288
        int len = pwb.length;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   289
        if (len > 14)
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   290
            len = 14;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   291
        System.arraycopy (pwb, 0, pwb1, 0, len); /* Zero padded */
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   292
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   293
        try {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   294
            DESKeySpec dks1 = new DESKeySpec (makeDesKey (pwb1, 0));
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   295
            DESKeySpec dks2 = new DESKeySpec (makeDesKey (pwb1, 7));
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   296
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   297
            SecretKey key1 = fac.generateSecret (dks1);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   298
            SecretKey key2 = fac.generateSecret (dks2);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   299
            cipher.init (Cipher.ENCRYPT_MODE, key1);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   300
            byte[] out1 = cipher.doFinal (magic, 0, 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   301
            cipher.init (Cipher.ENCRYPT_MODE, key2);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   302
            byte[] out2 = cipher.doFinal (magic, 0, 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   303
            byte[] result = new byte [21];
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   304
            System.arraycopy (out1, 0, result, 0, 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   305
            System.arraycopy (out2, 0, result, 8, 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   306
            return result;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   307
        } catch (InvalidKeyException ive) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   308
            // Will not happen, all key material are 8 bytes
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   309
            assert false;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   310
        } catch (InvalidKeySpecException ikse) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   311
            // Will not happen, we only feed DESKeySpec to DES factory
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   312
            assert false;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   313
        } catch (IllegalBlockSizeException ibse) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   314
            // Will not happen, we encrypt 8 bytes
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   315
            assert false;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   316
        } catch (BadPaddingException bpe) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   317
            // Will not happen, this is encryption
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   318
            assert false;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   319
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   320
        return null;    // will not happen, we returned already
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   321
    }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   322
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   323
    byte[] calcNTHash (byte[] pw) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   324
        byte[] out = md4.digest (pw);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   325
        byte[] result = new byte [21];
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   326
        System.arraycopy (out, 0, result, 0, 16);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   327
        return result;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   328
    }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   329
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   330
    /* key is a 21 byte array. Split it into 3 7 byte chunks,
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   331
     * Convert each to 8 byte DES keys, encrypt the text arg with
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   332
     * each key and return the three results in a sequential []
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   333
     */
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   334
    byte[] calcResponse (byte[] key, byte[] text) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   335
        try {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   336
            assert key.length == 21;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   337
            DESKeySpec dks1 = new DESKeySpec(makeDesKey(key, 0));
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   338
            DESKeySpec dks2 = new DESKeySpec(makeDesKey(key, 7));
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   339
            DESKeySpec dks3 = new DESKeySpec(makeDesKey(key, 14));
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   340
            SecretKey key1 = fac.generateSecret(dks1);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   341
            SecretKey key2 = fac.generateSecret(dks2);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   342
            SecretKey key3 = fac.generateSecret(dks3);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   343
            cipher.init(Cipher.ENCRYPT_MODE, key1);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   344
            byte[] out1 = cipher.doFinal(text, 0, 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   345
            cipher.init(Cipher.ENCRYPT_MODE, key2);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   346
            byte[] out2 = cipher.doFinal(text, 0, 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   347
            cipher.init(Cipher.ENCRYPT_MODE, key3);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   348
            byte[] out3 = cipher.doFinal(text, 0, 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   349
            byte[] result = new byte[24];
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   350
            System.arraycopy(out1, 0, result, 0, 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   351
            System.arraycopy(out2, 0, result, 8, 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   352
            System.arraycopy(out3, 0, result, 16, 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   353
            return result;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   354
        } catch (IllegalBlockSizeException ex) {    // None will happen
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   355
            assert false;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   356
        } catch (BadPaddingException ex) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   357
            assert false;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   358
        } catch (InvalidKeySpecException ex) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   359
            assert false;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   360
        } catch (InvalidKeyException ex) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   361
            assert false;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   362
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   363
        return null;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   364
    }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   365
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   366
    // LMv2/NTLMv2
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   367
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   368
    byte[] hmacMD5(byte[] key, byte[] text) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   369
        try {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   370
            SecretKeySpec skey =
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   371
                    new SecretKeySpec(Arrays.copyOf(key, 16), "HmacMD5");
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   372
            hmac.init(skey);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   373
            return hmac.doFinal(text);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   374
        } catch (InvalidKeyException ex) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   375
            assert false;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   376
        } catch (RuntimeException e) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   377
            assert false;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   378
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   379
        return null;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   380
    }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   381
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   382
    byte[] calcV2(byte[] nthash, String text, byte[] blob, byte[] challenge) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   383
        try {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   384
            byte[] ntlmv2hash = hmacMD5(nthash,
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   385
                    text.getBytes("UnicodeLittleUnmarked"));
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   386
            byte[] cn = new byte[blob.length+8];
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   387
            System.arraycopy(challenge, 0, cn, 0, 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   388
            System.arraycopy(blob, 0, cn, 8, blob.length);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   389
            byte[] result = new byte[16+blob.length];
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   390
            System.arraycopy(hmacMD5(ntlmv2hash, cn), 0, result, 0, 16);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   391
            System.arraycopy(blob, 0, result, 16, blob.length);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   392
            return result;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   393
        } catch (UnsupportedEncodingException ex) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   394
            assert false;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   395
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   396
        return null;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   397
    }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   398
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   399
    // NTLM2 LM/NTLM
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   400
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   401
    static byte[] ntlm2LM(byte[] nonce) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   402
        return Arrays.copyOf(nonce, 24);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   403
    }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   404
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   405
    byte[] ntlm2NTLM(byte[] ntlmHash, byte[] nonce, byte[] challenge) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   406
        byte[] b = Arrays.copyOf(challenge, 16);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   407
        System.arraycopy(nonce, 0, b, 8, 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   408
        byte[] sesshash = Arrays.copyOf(md5.digest(b), 8);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   409
        return calcResponse(ntlmHash, sesshash);
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   410
    }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   411
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   412
    // Password in ASCII and UNICODE
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   413
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   414
    static byte[] getP1(char[] password) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   415
        try {
10369
e9d2e59e53f0 7059542: JNDI name operations should be locale independent
xuelei
parents: 6517
diff changeset
   416
            return new String(password).toUpperCase(
e9d2e59e53f0 7059542: JNDI name operations should be locale independent
xuelei
parents: 6517
diff changeset
   417
                                    Locale.ENGLISH).getBytes("ISO8859_1");
6517
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   418
        } catch (UnsupportedEncodingException ex) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   419
            return null;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   420
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   421
    }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   422
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   423
    static byte[] getP2(char[] password) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   424
        try {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   425
            return new String(password).getBytes("UnicodeLittleUnmarked");
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   426
        } catch (UnsupportedEncodingException ex) {
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   427
            return null;
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   428
        }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   429
    }
151856936fd8 6911951: NTLM should be a supported Java SASL mechanism
weijun
parents:
diff changeset
   430
}