jdk/test/com/sun/security/sasl/digest/Unbound.java
author weijun
Fri, 02 Nov 2012 10:48:04 +0800
changeset 14340 e150cbaf584e
permissions -rw-r--r--
7110803: SASL service for multiple hostnames Reviewed-by: mullan
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14340
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
     1
/*
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
     2
 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
     4
 *
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
     7
 * published by the Free Software Foundation.
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
     8
 *
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    13
 * accompanied this code).
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    14
 *
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    18
 *
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    21
 * questions.
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    22
 */
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    23
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    24
/*
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    25
 * @test
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    26
 * @bug 7110803
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    27
 * @summary SASL service for multiple hostnames
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    28
 * @run main Unbound jmx
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    29
 * @run main/fail Unbound j
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    30
 */
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    31
import javax.security.sasl.*;
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    32
import javax.security.auth.callback.*;
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    33
import java.util.*;
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    34
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    35
public class Unbound {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    36
    private static final String MECH = "DIGEST-MD5";
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    37
    private static final String SERVER_FQDN = "machineX.imc.org";
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    38
    private static final String PROTOCOL = "jmx";
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    39
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    40
    private static final byte[] EMPTY = new byte[0];
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    41
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    42
    private static String pwfile, namesfile, proxyfile;
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    43
    private static boolean auto;
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    44
    private static boolean verbose = false;
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    45
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    46
    private static void init(String[] args) throws Exception {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    47
        if (args.length == 1) {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    48
            pwfile = "pw.properties";
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    49
            namesfile = "names.properties";
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    50
            auto = true;
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    51
        } else {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    52
            int i = 1;
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    53
            if (args[i].equals("-m")) {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    54
                i++;
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    55
                auto = false;
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    56
            }
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    57
            if (args.length > i) {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    58
                pwfile = args[i++];
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    59
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    60
                if (args.length > i) {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    61
                    namesfile = args[i++];
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    62
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    63
                    if (args.length > i) {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    64
                        proxyfile = args[i];
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    65
                    }
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    66
                }
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    67
            } else {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    68
                pwfile = "pw.properties";
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    69
                namesfile = "names.properties";
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    70
            }
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    71
        }
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    72
    }
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    73
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    74
    public static void main(String[] args) throws Exception {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    75
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    76
        init(args);
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    77
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    78
        CallbackHandler clntCbh = new ClientCallbackHandler(auto);
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    79
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    80
        CallbackHandler srvCbh =
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    81
            new PropertiesFileCallbackHandler(pwfile, namesfile, proxyfile);
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    82
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    83
        SaslClient clnt = Sasl.createSaslClient(
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    84
            new String[]{MECH}, null, PROTOCOL, SERVER_FQDN, null, clntCbh);
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    85
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    86
        Map props = System.getProperties();
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    87
        props.put("com.sun.security.sasl.digest.realm", SERVER_FQDN);
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    88
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    89
        SaslServer srv = Sasl.createSaslServer(MECH, args[0], null, props,
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    90
            srvCbh);
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    91
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    92
        if (clnt == null) {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    93
            throw new IllegalStateException(
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    94
                "Unable to find client impl for " + MECH);
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    95
        }
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    96
        if (srv == null) {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    97
            throw new IllegalStateException(
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    98
                "Unable to find server impl for " + MECH);
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
    99
        }
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   100
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   101
        byte[] response = (clnt.hasInitialResponse()?
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   102
            clnt.evaluateChallenge(EMPTY) : EMPTY);
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   103
        byte[] challenge;
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   104
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   105
        while (!clnt.isComplete() || !srv.isComplete()) {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   106
            challenge = srv.evaluateResponse(response);
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   107
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   108
            if (challenge != null) {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   109
                response = clnt.evaluateChallenge(challenge);
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   110
            }
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   111
        }
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   112
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   113
        if (clnt.isComplete() && srv.isComplete()) {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   114
            if (verbose) {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   115
                System.out.println("SUCCESS");
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   116
                System.out.println("authzid is " + srv.getAuthorizationID());
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   117
            }
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   118
        } else {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   119
            throw new IllegalStateException(
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   120
                "FAILURE: mismatched state:" +
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   121
                    " client complete? " + clnt.isComplete() +
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   122
                    " server complete? " + srv.isComplete());
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   123
        }
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   124
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   125
        if (!SERVER_FQDN.equalsIgnoreCase((String)
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   126
                srv.getNegotiatedProperty(Sasl.BOUND_SERVER_NAME))) {
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   127
            throw new Exception("Server side gets wrong requested server name");
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   128
        }
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   129
        clnt.dispose();
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   130
        srv.dispose();
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   131
    }
e150cbaf584e 7110803: SASL service for multiple hostnames
weijun
parents:
diff changeset
   132
}